commit 78bb969274494e1920d713c8e474ea582521835e Author: mh Date: Thu Nov 2 13:43:59 2023 +0800 初始化项目 diff --git a/common/pom.xml b/common/pom.xml new file mode 100644 index 0000000..1c5fe7e --- /dev/null +++ b/common/pom.xml @@ -0,0 +1,70 @@ + + + + com.mh + chws + 1.0-SNAPSHOT + + 4.0.0 + + com.mh + common + 0.0.1-SNAPSHOT + jar + + + UTF-8 + UTF-8 + 1.8 + 1.8 + 1.8 + + + + + + com.alibaba.fastjson2 + fastjson2 + 2.0.41 + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.4.7 + + + + org.springframework.boot + spring-boot-starter-web + + + + commons-beanutils + commons-beanutils + 1.9.4 + + + commons-collections + commons-collections + + + + + + org.apache.commons + commons-collections4 + 4.4 + + + + + org.apache.poi + poi-ooxml + 5.2.4 + + + diff --git a/common/src/main/java/com/mh/common/annotation/SysLogger.java b/common/src/main/java/com/mh/common/annotation/SysLogger.java new file mode 100644 index 0000000..5e0bc23 --- /dev/null +++ b/common/src/main/java/com/mh/common/annotation/SysLogger.java @@ -0,0 +1,13 @@ +package com.mh.common.annotation; + +import java.lang.annotation.*; + +/** + * Created by fangzhipeng on 2017/7/12. + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface SysLogger { + String value() default ""; +} diff --git a/common/src/main/java/com/mh/common/dto/RespDTO.java b/common/src/main/java/com/mh/common/dto/RespDTO.java new file mode 100644 index 0000000..06cb8d6 --- /dev/null +++ b/common/src/main/java/com/mh/common/dto/RespDTO.java @@ -0,0 +1,26 @@ +package com.mh.common.dto; + +import java.io.Serializable; + +public class RespDTO implements Serializable{ + + + public int code = 0; + public String error = ""; + public T data; + + public static RespDTO onSuc(Object data) { + RespDTO resp = new RespDTO(); + resp.data = data; + return resp; + } + + @Override + public String toString() { + return "RespDTO{" + + "code=" + code + + ", error='" + error + '\'' + + ", data=" + data + + '}'; + } +} diff --git a/common/src/main/java/com/mh/common/http/HttpResult.java b/common/src/main/java/com/mh/common/http/HttpResult.java new file mode 100644 index 0000000..c320830 --- /dev/null +++ b/common/src/main/java/com/mh/common/http/HttpResult.java @@ -0,0 +1,96 @@ +package com.mh.common.http; + +/** + * HTTP结果封装 + * @author Louis + * @date Jan 12, 2019 + */ +public class HttpResult { + + private int code = 200; // 为成功 + private String msg; // 消息 + private Object data; // 数据对象 + private int count; // 记录数 + + public static HttpResult error() { + + return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员"); + } + + public static HttpResult error(String msg) + { + return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg); + } + + public static HttpResult error(int code, String msg) { + HttpResult r = new HttpResult(); + r.setCode(code); + r.setMsg(msg); + return r; + } + + public static HttpResult ok(String msg) { + HttpResult r = new HttpResult(); + r.setMsg(msg); + return r; + } + + public static HttpResult ok(Object data) { + HttpResult r = new HttpResult(); + r.setData(data); + return r; + } + + public static HttpResult ok(String msg, Object data) { + HttpResult r = new HttpResult(); + r.setMsg(msg); + r.setData(data); + return r; + } + + public static HttpResult ok(int count, Object data) { + HttpResult r = new HttpResult(); + r.setCount(count); + r.setData(data); + return r; + } + + public static HttpResult ok() { + HttpResult r = new HttpResult(); + r.setMsg("success"); + r.setCode(200); + return r; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } +} diff --git a/common/src/main/java/com/mh/common/http/HttpStatus.java b/common/src/main/java/com/mh/common/http/HttpStatus.java new file mode 100644 index 0000000..1c73e17 --- /dev/null +++ b/common/src/main/java/com/mh/common/http/HttpStatus.java @@ -0,0 +1,149 @@ +package com.mh.common.http; + +/** + * Constants enumerating the HTTP status codes. + * All status codes defined in RFC1945 (HTTP/1.0), RFC2616 (HTTP/1.1), and + * RFC2518 (WebDAV) are listed. + * + * + * + * @since 4.0 + */ +public interface HttpStatus { + + // --- 1xx Informational --- + + /** {@code 100 Continue} (HTTP/1.1 - RFC 2616) */ + public static final int SC_CONTINUE = 100; + /** {@code 101 Switching Protocols} (HTTP/1.1 - RFC 2616)*/ + public static final int SC_SWITCHING_PROTOCOLS = 101; + /** {@code 102 Processing} (WebDAV - RFC 2518) */ + public static final int SC_PROCESSING = 102; + + // --- 2xx Success --- + + /** {@code 200 OK} (HTTP/1.0 - RFC 1945) */ + public static final int SC_OK = 200; + /** {@code 201 Created} (HTTP/1.0 - RFC 1945) */ + public static final int SC_CREATED = 201; + /** {@code 202 Accepted} (HTTP/1.0 - RFC 1945) */ + public static final int SC_ACCEPTED = 202; + /** {@code 203 Non Authoritative Information} (HTTP/1.1 - RFC 2616) */ + public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203; + /** {@code 204 No Content} (HTTP/1.0 - RFC 1945) */ + public static final int SC_NO_CONTENT = 204; + /** {@code 205 Reset Content} (HTTP/1.1 - RFC 2616) */ + public static final int SC_RESET_CONTENT = 205; + /** {@code 206 Partial Content} (HTTP/1.1 - RFC 2616) */ + public static final int SC_PARTIAL_CONTENT = 206; + /** + * {@code 207 Multi-Status} (WebDAV - RFC 2518) + * or + * {@code 207 Partial Update OK} (HTTP/1.1 - draft-ietf-http-v11-spec-rev-01?) + */ + public static final int SC_MULTI_STATUS = 207; + + // --- 3xx Redirection --- + + /** {@code 300 Mutliple Choices} (HTTP/1.1 - RFC 2616) */ + public static final int SC_MULTIPLE_CHOICES = 300; + /** {@code 301 Moved Permanently} (HTTP/1.0 - RFC 1945) */ + public static final int SC_MOVED_PERMANENTLY = 301; + /** {@code 302 Moved Temporarily} (Sometimes {@code Found}) (HTTP/1.0 - RFC 1945) */ + public static final int SC_MOVED_TEMPORARILY = 302; + /** {@code 303 See Other} (HTTP/1.1 - RFC 2616) */ + public static final int SC_SEE_OTHER = 303; + /** {@code 304 Not Modified} (HTTP/1.0 - RFC 1945) */ + public static final int SC_NOT_MODIFIED = 304; + /** {@code 305 Use Proxy} (HTTP/1.1 - RFC 2616) */ + public static final int SC_USE_PROXY = 305; + /** {@code 307 Temporary Redirect} (HTTP/1.1 - RFC 2616) */ + public static final int SC_TEMPORARY_REDIRECT = 307; + + // --- 4xx Client Error --- + + /** {@code 400 Bad Request} (HTTP/1.1 - RFC 2616) */ + public static final int SC_BAD_REQUEST = 400; + /** {@code 401 Unauthorized} (HTTP/1.0 - RFC 1945) */ + public static final int SC_UNAUTHORIZED = 401; + /** {@code 402 Payment Required} (HTTP/1.1 - RFC 2616) */ + public static final int SC_PAYMENT_REQUIRED = 402; + /** {@code 403 Forbidden} (HTTP/1.0 - RFC 1945) */ + public static final int SC_FORBIDDEN = 403; + /** {@code 404 Not Found} (HTTP/1.0 - RFC 1945) */ + public static final int SC_NOT_FOUND = 404; + /** {@code 405 Method Not Allowed} (HTTP/1.1 - RFC 2616) */ + public static final int SC_METHOD_NOT_ALLOWED = 405; + /** {@code 406 Not Acceptable} (HTTP/1.1 - RFC 2616) */ + public static final int SC_NOT_ACCEPTABLE = 406; + /** {@code 407 Proxy Authentication Required} (HTTP/1.1 - RFC 2616)*/ + public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407; + /** {@code 408 Request Timeout} (HTTP/1.1 - RFC 2616) */ + public static final int SC_REQUEST_TIMEOUT = 408; + /** {@code 409 Conflict} (HTTP/1.1 - RFC 2616) */ + public static final int SC_CONFLICT = 409; + /** {@code 410 Gone} (HTTP/1.1 - RFC 2616) */ + public static final int SC_GONE = 410; + /** {@code 411 Length Required} (HTTP/1.1 - RFC 2616) */ + public static final int SC_LENGTH_REQUIRED = 411; + /** {@code 412 Precondition Failed} (HTTP/1.1 - RFC 2616) */ + public static final int SC_PRECONDITION_FAILED = 412; + /** {@code 413 Request Entity Too Large} (HTTP/1.1 - RFC 2616) */ + public static final int SC_REQUEST_TOO_LONG = 413; + /** {@code 414 Request-URI Too Long} (HTTP/1.1 - RFC 2616) */ + public static final int SC_REQUEST_URI_TOO_LONG = 414; + /** {@code 415 Unsupported Media Type} (HTTP/1.1 - RFC 2616) */ + public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415; + /** {@code 416 Requested Range Not Satisfiable} (HTTP/1.1 - RFC 2616) */ + public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416; + /** {@code 417 Expectation Failed} (HTTP/1.1 - RFC 2616) */ + public static final int SC_EXPECTATION_FAILED = 417; + + /** + * Static constant for a 418 error. + * {@code 418 Unprocessable Entity} (WebDAV drafts?) + * or {@code 418 Reauthentication Required} (HTTP/1.1 drafts?) + */ + // not used + // public static final int SC_UNPROCESSABLE_ENTITY = 418; + + /** + * Static constant for a 419 error. + * {@code 419 Insufficient Space on Resource} + * (WebDAV - draft-ietf-webdav-protocol-05?) + * or {@code 419 Proxy Reauthentication Required} + * (HTTP/1.1 drafts?) + */ + public static final int SC_INSUFFICIENT_SPACE_ON_RESOURCE = 419; + /** + * Static constant for a 420 error. + * {@code 420 Method Failure} + * (WebDAV - draft-ietf-webdav-protocol-05?) + */ + public static final int SC_METHOD_FAILURE = 420; + /** {@code 422 Unprocessable Entity} (WebDAV - RFC 2518) */ + public static final int SC_UNPROCESSABLE_ENTITY = 422; + /** {@code 423 Locked} (WebDAV - RFC 2518) */ + public static final int SC_LOCKED = 423; + /** {@code 424 Failed Dependency} (WebDAV - RFC 2518) */ + public static final int SC_FAILED_DEPENDENCY = 424; + + // --- 5xx Server Error --- + + /** {@code 500 Server Error} (HTTP/1.0 - RFC 1945) */ + public static final int SC_INTERNAL_SERVER_ERROR = 500; + /** {@code 501 Not Implemented} (HTTP/1.0 - RFC 1945) */ + public static final int SC_NOT_IMPLEMENTED = 501; + /** {@code 502 Bad Gateway} (HTTP/1.0 - RFC 1945) */ + public static final int SC_BAD_GATEWAY = 502; + /** {@code 503 Service Unavailable} (HTTP/1.0 - RFC 1945) */ + public static final int SC_SERVICE_UNAVAILABLE = 503; + /** {@code 504 Gateway Timeout} (HTTP/1.1 - RFC 2616) */ + public static final int SC_GATEWAY_TIMEOUT = 504; + /** {@code 505 HTTP Version Not Supported} (HTTP/1.1 - RFC 2616) */ + public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505; + + /** {@code 507 Insufficient Storage} (WebDAV - RFC 2518) */ + public static final int SC_INSUFFICIENT_STORAGE = 507; + +} diff --git a/common/src/main/java/com/mh/common/page/ColumnFilter.java b/common/src/main/java/com/mh/common/page/ColumnFilter.java new file mode 100644 index 0000000..9a1a5ac --- /dev/null +++ b/common/src/main/java/com/mh/common/page/ColumnFilter.java @@ -0,0 +1,32 @@ +package com.mh.common.page; + +/** + * 分页查询列过滤器 + * @author Louis + * @date Aug 19, 2018 + */ +public class ColumnFilter { + + /** + * 过滤列名 + */ + private String name; + /** + * 查询的值 + */ + private String value; + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/common/src/main/java/com/mh/common/page/MybatisPageHelper.java b/common/src/main/java/com/mh/common/page/MybatisPageHelper.java new file mode 100644 index 0000000..7e6d4b1 --- /dev/null +++ b/common/src/main/java/com/mh/common/page/MybatisPageHelper.java @@ -0,0 +1,63 @@ +package com.mh.common.page; + +import java.util.List; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.mh.common.utils.ReflectionUtils; + +/** + * MyBatis 分页查询助手 + * @author Louis + * @date Jan 12, 2019 + */ +public class MybatisPageHelper { + + public static final String findPage = "findPage"; + + /** + * 分页查询, 约定查询方法名为 “findPage” + * @param pageRequest 分页请求 + * @param mapper Dao对象,MyBatis的 Mapper + * @param + * @return + */ + public static PageResult findPage(PageRequest pageRequest, Object mapper) { + return findPage(pageRequest, mapper, findPage); + } + + /** + * 调用分页插件进行分页查询 + * @param pageRequest 分页请求 + * @param mapper Dao对象,MyBatis的 Mapper + * @param queryMethodName 要分页的查询方法名 + * @param args 方法参数 + * @return + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static PageResult findPage(PageRequest pageRequest, Object mapper, String queryMethodName, Object... args) { + // 设置分页参数 + int pageNum = pageRequest.getPageNum(); + int pageSize = pageRequest.getPageSize(); + PageHelper.startPage(pageNum, pageSize); + // 利用反射调用查询方法 + Object result = ReflectionUtils.invoke(mapper, queryMethodName, args); + return getPageResult(pageRequest, new PageInfo((List) result)); + } + + /** + * 将分页信息封装到统一的接口 + * @param pageRequest + * @return + */ + private static PageResult getPageResult(PageRequest pageRequest, PageInfo pageInfo) { + PageResult pageResult = new PageResult(); + pageResult.setPageNum(pageInfo.getPageNum()); + pageResult.setPageSize(pageInfo.getPageSize()); + pageResult.setTotalSize(pageInfo.getTotal()); + pageResult.setTotalPages(pageInfo.getPages()); + pageResult.setContent(pageInfo.getList()); + return pageResult; + } + +} diff --git a/common/src/main/java/com/mh/common/page/PageRequest.java b/common/src/main/java/com/mh/common/page/PageRequest.java new file mode 100644 index 0000000..97ed3dd --- /dev/null +++ b/common/src/main/java/com/mh/common/page/PageRequest.java @@ -0,0 +1,46 @@ +package com.mh.common.page; + +import java.util.HashMap; +import java.util.Map; + +/** + * 分页请求 + * @author Louis + * @date Aug 19, 2018 + */ +public class PageRequest { + /** + * 当前页码 + */ + private int pageNum = 1; + /** + * 每页数量 + */ + private int pageSize = 10; + /** + * 每页数量 + */ + private Map columnFilters = new HashMap(); + + public int getPageNum() { + return pageNum; + } + public void setPageNum(int pageNum) { + this.pageNum = pageNum; + } + public int getPageSize() { + return pageSize; + } + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + public Map getColumnFilters() { + return columnFilters; + } + public void setColumnFilters(Map columnFilters) { + this.columnFilters = columnFilters; + } + public ColumnFilter getColumnFilter(String name) { + return columnFilters.get(name); + } +} diff --git a/common/src/main/java/com/mh/common/page/PageResult.java b/common/src/main/java/com/mh/common/page/PageResult.java new file mode 100644 index 0000000..2c9ad52 --- /dev/null +++ b/common/src/main/java/com/mh/common/page/PageResult.java @@ -0,0 +1,61 @@ +package com.mh.common.page; + +import java.util.List; + +/** + * 分页返回结果 + * @author Louis + * @date Jan 12, 2019 + */ +public class PageResult { + /** + * 当前页码 + */ + private int pageNum; + /** + * 每页数量 + */ + private int pageSize; + /** + * 记录总数 + */ + private long totalSize; + /** + * 页码总数 + */ + private int totalPages; + /** + * 分页数据 + */ + private List content; + public int getPageNum() { + return pageNum; + } + public void setPageNum(int pageNum) { + this.pageNum = pageNum; + } + public int getPageSize() { + return pageSize; + } + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + public long getTotalSize() { + return totalSize; + } + public void setTotalSize(long totalSize) { + this.totalSize = totalSize; + } + public int getTotalPages() { + return totalPages; + } + public void setTotalPages(int totalPages) { + this.totalPages = totalPages; + } + public List getContent() { + return content; + } + public void setContent(List content) { + this.content = content; + } +} diff --git a/common/src/main/java/com/mh/common/service/CurdService.java b/common/src/main/java/com/mh/common/service/CurdService.java new file mode 100644 index 0000000..a76e871 --- /dev/null +++ b/common/src/main/java/com/mh/common/service/CurdService.java @@ -0,0 +1,50 @@ +package com.mh.common.service; + +import com.mh.common.page.PageRequest; +import com.mh.common.page.PageResult; + +import java.util.List; + +/** + * 通用CURD接口 + */ +public interface CurdService { + + /** + * 保存操作 + * @param record + * @return + */ + int save(T record); + + /** + * 删除操作 + * @param record + * @return + */ + int delete(T record); + + /** + * 批量删除操作 + * @param records + */ + int delete(List records); + + /** + * 根据ID查询 + * @param id + * @return + */ + T findById(Long id); + + /** + * 分页查询 + * 这里统一封装了分页请求和结果,避免直接引入具体框架的分页对象, 如MyBatis或JPA的分页对象 + * 从而避免因为替换ORM框架而导致服务层、控制层的分页接口也需要变动的情况,替换ORM框架也不会 + * 影响服务层以上的分页接口,起到了解耦的作用 + * @param pageRequest 自定义,统一分页查询请求 + * @return PageResult 自定义,统一分页查询结果 + */ + PageResult findPage(PageRequest pageRequest); + +} \ No newline at end of file diff --git a/common/src/main/java/com/mh/common/utils/DateTimeUtils.java b/common/src/main/java/com/mh/common/utils/DateTimeUtils.java new file mode 100644 index 0000000..ae7d735 --- /dev/null +++ b/common/src/main/java/com/mh/common/utils/DateTimeUtils.java @@ -0,0 +1,32 @@ +package com.mh.common.utils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 日期时间相关工具 + * @author Louis + * @date Jan 14, 2019 + */ +public class DateTimeUtils { + + public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; + + /** + * 获取当前标准格式化日期时间 + * @param date + * @return + */ + public static String getDateTime() { + return getDateTime(new Date()); + } + + /** + * 标准格式化日期时间 + * @param date + * @return + */ + public static String getDateTime(Date date) { + return (new SimpleDateFormat(DATE_FORMAT)).format(date); + } +} diff --git a/common/src/main/java/com/mh/common/utils/FileUtils.java b/common/src/main/java/com/mh/common/utils/FileUtils.java new file mode 100644 index 0000000..addd5af --- /dev/null +++ b/common/src/main/java/com/mh/common/utils/FileUtils.java @@ -0,0 +1,42 @@ +package com.mh.common.utils; + +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; + +/** + * 文件相关操作 + * @author Louis + * @date Jan 14, 2019 + */ +public class FileUtils { + + /** + * 下载文件 + * @param response + * @param file + * @param newFileName + */ + public static void downloadFile(HttpServletResponse response, File file, String newFileName) { + try { + response.setHeader("Content-Disposition", "attachment; filename=" + new String(newFileName.getBytes("ISO-8859-1"), "UTF-8")); + BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); + InputStream is = new FileInputStream(file.getAbsolutePath()); + BufferedInputStream bis = new BufferedInputStream(is); + int length = 0; + byte[] temp = new byte[1 * 1024 * 10]; + while ((length = bis.read(temp)) != -1) { + bos.write(temp, 0, length); + } + bos.flush(); + bis.close(); + bos.close(); + is.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/common/src/main/java/com/mh/common/utils/IOUtils.java b/common/src/main/java/com/mh/common/utils/IOUtils.java new file mode 100644 index 0000000..1c0c9b0 --- /dev/null +++ b/common/src/main/java/com/mh/common/utils/IOUtils.java @@ -0,0 +1,26 @@ +package com.mh.common.utils; + +import java.io.Closeable; +import java.io.IOException; + +/** + * IO相关工具类 + * @author Louis + * @date Oct 29, 2018 + */ +public class IOUtils { + + /** + * 关闭对象,连接 + * @param closeable + */ + public static void closeQuietly(final Closeable closeable) { + try { + if (closeable != null) { + closeable.close(); + } + } catch (final IOException ioe) { + // ignore + } + } +} diff --git a/common/src/main/java/com/mh/common/utils/PoiUtils.java b/common/src/main/java/com/mh/common/utils/PoiUtils.java new file mode 100644 index 0000000..29badd6 --- /dev/null +++ b/common/src/main/java/com/mh/common/utils/PoiUtils.java @@ -0,0 +1,41 @@ +//package com.mh.common.utils; +// +//import java.io.File; +//import java.io.FileNotFoundException; +//import java.io.FileOutputStream; +//import java.io.IOException; +//import java.io.OutputStream; +// +//import org.apache.poi.ss.usermodel.Workbook; +// +///** +// * POI相关操作 +// * @author Louis +// * @date Jan 14, 2019 +// */ +//public class PoiUtils { +// +// /** +// * 生成Excel文件 +// * @param workbook +// * @param fileName +// * @return +// */ +// public static File createExcelFile(Workbook workbook, String fileName) { +// OutputStream stream = null; +// File file = null; +// try { +// file = File.createTempFile(fileName, ".xlsx"); +// stream = new FileOutputStream(file.getAbsoluteFile()); +// workbook.write(stream); +// } catch (FileNotFoundException e) { +// e.printStackTrace(); +// } catch (IOException e) { +// e.printStackTrace(); +// } finally { +// IOUtils.closeQuietly(workbook); +// IOUtils.closeQuietly(stream); +// } +// return file; +// } +//} diff --git a/common/src/main/java/com/mh/common/utils/ReflectionUtils.java b/common/src/main/java/com/mh/common/utils/ReflectionUtils.java new file mode 100644 index 0000000..57c1a38 --- /dev/null +++ b/common/src/main/java/com/mh/common/utils/ReflectionUtils.java @@ -0,0 +1,78 @@ +package com.mh.common.utils; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * 反射相关辅助方法 + * @author Louis + * @date Aug 19, 2018 + */ +public class ReflectionUtils { + + + /** + * 根据方法名调用指定对象的方法 + * @param object 要调用方法的对象 + * @param method 要调用的方法名 + * @param args 参数对象数组 + * @return + */ + public static Object invoke(Object object, String method, Object... args) { + Object result = null; + Class clazz = object.getClass(); + Method queryMethod = getMethod(clazz, method, args); + if(queryMethod != null) { + try { + result = queryMethod.invoke(object, args); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } else { + try { + throw new NoSuchMethodException(clazz.getName() + " 类中没有找到 " + method + " 方法。"); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + } + return result; + } + + /** + * 根据方法名和参数对象查找方法 + * @param clazz + * @param name + * @param args 参数实例数据 + * @return + */ + public static Method getMethod(Class clazz, String name, Object[] args) { + Method queryMethod = null; + Method[] methods = clazz.getMethods(); + for(Method method:methods) { + if(method.getName().equals(name)) { + Class[] parameterTypes = method.getParameterTypes(); + if(parameterTypes.length == args.length) { + boolean isSameMethod = true; + for(int i=0; i + + 4.0.0 + + com.mh + chws + 1.0-SNAPSHOT + pom + + common + user-service + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.5.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + Hoxton.SR3 + 2.9.2 + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.jolokia + jolokia-core + + + io.springfox + springfox-swagger2 + ${swagger.version} + + + io.springfox + springfox-swagger-ui + ${swagger.version} + + + + + + + + + + org.springframework.boot + spring-boot-starter-aop + 2.2.5.RELEASE + + + org.rxtx + rxtx + 2.1.7 + + + + com.github.purejavacomm + purejavacomm + 1.0.1.RELEASE + + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + diff --git a/user-service/lib/RXTXcomm.jar b/user-service/lib/RXTXcomm.jar new file mode 100644 index 0000000..e1e7503 Binary files /dev/null and b/user-service/lib/RXTXcomm.jar differ diff --git a/user-service/pom.xml b/user-service/pom.xml new file mode 100644 index 0000000..2becfa0 --- /dev/null +++ b/user-service/pom.xml @@ -0,0 +1,186 @@ + + + 4.0.0 + + com.mh + chws + 1.0-SNAPSHOT + + com.mh + user-service + 0.0.1-SNAPSHOT + user-service + jar + Demo project for Spring Boot + + + 1.8 + Hoxton.SR3 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + import + + + + + org.springframework.boot + spring-boot-starter-quartz + + + + org.springframework.cloud + spring-cloud-starter-config + 2.2.2.RELEASE + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.3.0 + + + + + + + + + com.alibaba + druid-spring-boot-starter + 1.1.18 + + + com.microsoft.sqlserver + mssql-jdbc + runtime + + + io.netty + netty-all + 5.0.0.Alpha2 + + + + com.github.penggle + kaptcha + 2.3.2 + + + + + org.springframework.boot + spring-boot-starter-security + + + + + + io.jsonwebtoken + jjwt + 0.9.1 + + + com.mh + common + 0.0.1-SNAPSHOT + + + + + + + + + + + de.codecentric + spring-boot-admin-starter-client + 2.2.2 + + + + org.projectlombok + lombok + true + + + + tk.mybatis + mapper + 3.3.9 + + + + org.apache.commons + commons-pool2 + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + + src/main/java + + **/sqlmapper/*.xml + + false + + + src/main/resources + + **/*.* + + true + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.7.2 + + + + + + + + + + + + + diff --git a/user-service/src/main/java/com/mh/user/UserServiceApplication.java b/user-service/src/main/java/com/mh/user/UserServiceApplication.java new file mode 100644 index 0000000..711235b --- /dev/null +++ b/user-service/src/main/java/com/mh/user/UserServiceApplication.java @@ -0,0 +1,37 @@ +package com.mh.user; + +import com.mh.user.job.CollectionLoopRunner; +import com.mh.user.serialport.SerialPortListener; +import com.mh.user.serialport.SerialPortUtil; +import com.mh.user.utils.TimedTask2; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.scheduling.annotation.EnableScheduling; + +import javax.annotation.PreDestroy; + +@SpringBootApplication(scanBasePackages = "com.mh.user") +@EnableScheduling +public class UserServiceApplication extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + return builder.sources(UserServiceApplication.class); + } + + public static void main(String[] args) { + + SpringApplication.run(UserServiceApplication.class, args); + } + + @PreDestroy + public void destory() { + //关闭应用前 关闭端口 + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + serialPortUtil.removeListener(CollectionLoopRunner.serialPort, new SerialPortListener()); + serialPortUtil.closePort(CollectionLoopRunner.serialPort); + } + +} diff --git a/user-service/src/main/java/com/mh/user/annotation/BusinessType.java b/user-service/src/main/java/com/mh/user/annotation/BusinessType.java new file mode 100644 index 0000000..ae781a3 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/annotation/BusinessType.java @@ -0,0 +1,30 @@ +package com.mh.user.annotation; + +public enum BusinessType { + + OTHER("其它"), + SELECT("查找"), + INSERT("新增"), + UPDATE("修改"), + DELETE("删除"); + + private String label; + + BusinessType(String label) { + this.label = label; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + @Override + public String toString() { + return label; + } + +} diff --git a/user-service/src/main/java/com/mh/user/annotation/SysLogger.java b/user-service/src/main/java/com/mh/user/annotation/SysLogger.java new file mode 100644 index 0000000..eac6552 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/annotation/SysLogger.java @@ -0,0 +1,15 @@ +package com.mh.user.annotation; + +import java.lang.annotation.*; + +/** + * Created by nxr on 2023/8/18. + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface SysLogger { + + String title() default ""; // 自定义操作模块 + String optDesc() default ""; // 业务操作描述 +} diff --git a/user-service/src/main/java/com/mh/user/aspect/DaoAspect.java b/user-service/src/main/java/com/mh/user/aspect/DaoAspect.java new file mode 100644 index 0000000..cb54017 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/aspect/DaoAspect.java @@ -0,0 +1,91 @@ +package com.mh.user.aspect; + +import java.util.Date; + +import javax.servlet.http.HttpServletRequest; + +import com.mh.common.utils.StringUtils; +import com.mh.user.utils.SecurityUtils; +import org.apache.commons.beanutils.BeanUtils; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +/** + * DAO切面,插入创建人,创建时间,修改人,修改时间 + * @author Louis + * @date Oct 29, 2018 + */ +@Aspect +@Component +@Configuration +public class DaoAspect { + private static final String createBy = "createBy"; + private static final String createTime = "createTime"; + private static final String lastUpdateBy = "lastUpdateBy"; + private static final String lastUpdateTime = "lastUpdateTime"; + + @Pointcut("execution(* com.mh.*.mapper.*.update*(..))") + public void daoUpdate() { + } + + @Pointcut("execution(* com.mh.*.mapper.*.insert*(..))") + public void daoCreate() { + } + + @Around("daoUpdate()") + public Object doAroundUpdate(ProceedingJoinPoint pjp) throws Throwable { + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (attributes == null) { + return pjp.proceed(); + } + HttpServletRequest request = attributes.getRequest(); + String token = request.getHeader("token"); + String username = getUserName(); + if (token != null && username != null) { + Object[] objects = pjp.getArgs(); + if (objects != null && objects.length > 0) { + for (Object arg : objects) { + BeanUtils.setProperty(arg, lastUpdateBy, username); + BeanUtils.setProperty(arg, lastUpdateTime, new Date()); + } + } + } + Object object = pjp.proceed(); + return object; + + } + + @Around("daoCreate()") + public Object doAroundCreate(ProceedingJoinPoint pjp) throws Throwable { + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (attributes == null) { + return pjp.proceed(); + } + Object[] objects = pjp.getArgs(); + if (objects != null && objects.length > 0) { + for (Object arg : objects) { + String username = getUserName(); + if (username != null) { + if (StringUtils.isBlank(BeanUtils.getProperty(arg, createBy))) { + BeanUtils.setProperty(arg, createBy, username); + } + if (StringUtils.isBlank(BeanUtils.getProperty(arg, createTime))) { + BeanUtils.setProperty(arg, createTime, new Date()); + } + } + } + } + Object object = pjp.proceed(); + return object; + } + + private String getUserName() { + return SecurityUtils.getUsername(); + } +} diff --git a/user-service/src/main/java/com/mh/user/aspect/SysLogAspect.java b/user-service/src/main/java/com/mh/user/aspect/SysLogAspect.java new file mode 100644 index 0000000..6154753 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/aspect/SysLogAspect.java @@ -0,0 +1,126 @@ +package com.mh.user.aspect; + +import javax.servlet.http.HttpServletRequest; + +import com.alibaba.fastjson2.JSONObject; +import com.mh.user.annotation.SysLogger; +import com.mh.user.model.SysLog; +import com.mh.user.service.SysLogService; +import com.mh.user.utils.HttpUtils; +import com.mh.user.utils.IPUtils; +import com.mh.user.utils.SecurityUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.Date; + + +/** + * 系统日志,切面处理类,记录日志 + */ +@Aspect +@Component +public class SysLogAspect { + + @Autowired + private SysLogService sysLogService; + +// @Pointcut("execution(* com.mh.*.service.*.*(..))") + @Pointcut("@annotation(com.mh.user.annotation.SysLogger)") + public void logPointCut() { + + } + + @Around("logPointCut()") + public Object around(ProceedingJoinPoint point) throws Throwable { + long beginTime = System.currentTimeMillis(); + // 执行方法 + Object result = point.proceed(); + // 执行时长(毫秒) + long time = System.currentTimeMillis() - beginTime; + // 保存日志 + saveSysLog(point, time); + return result; + + } + + private void saveSysLog(ProceedingJoinPoint joinPoint, long time) { + SysLog sysLog = new SysLog(); + String methodName = joinPoint.getSignature().getName(); + Method method = currentMethod(joinPoint,methodName); + SysLogger sysLogger = method.getAnnotation(SysLogger.class); + String module = sysLogger.title(); //操作模块 + String optDesc=sysLogger.optDesc();//业务操作描述 + sysLog.setOptDesc(optDesc); + sysLog.setOperation(module); + String userName = SecurityUtils.getUsername(); //用户名称 + + if(joinPoint.getTarget() instanceof SysLogService) { + return ; + } + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + + // 请求的方法名 + String className = joinPoint.getTarget().getClass().getName(); + String methodName1 = signature.getName(); + sysLog.setMethod(className + "." + methodName1 + "()"); + + // 请求的参数 + Object[] args = joinPoint.getArgs(); + try{ + String params = JSONObject.toJSONString(args[0]); + if(params.length() > 200) { + params = params.substring(0, 200) + "..."; + } + sysLog.setParams(params); + } catch (Exception e){ + } + // 获取request + HttpServletRequest request = HttpUtils.getHttpServletRequest(); + // 设置IP地址 + sysLog.setIp(IPUtils.getIpAddr(request)); + String ip=IPUtils.getRemoteIp(); + // 用户名 + sysLog.setUserName(userName); + Date date1 = SecurityUtils.getLoginTime(); + // 登录时间 + sysLog.setCreateTime(date1); + Date date=new Date(); + // 最后操作时间 + sysLog.setLastUpdateTime(date); + // 执行时长(毫秒) + sysLog.setTime(time); + // 保存系统日志 + sysLogService.save(sysLog); + } + + /** + * 获取当前执行的方法 + * + * @param joinPoint 连接点 + * @param methodName 方法名称 + * @return 方法 + */ + private Method currentMethod(JoinPoint joinPoint, String methodName) { + /** + * 获取目标类的所有方法,找到当前要执行的方法 + */ + Method[] methods = joinPoint.getTarget().getClass().getMethods(); + Method resultMethod = null; + for (Method method : methods) { + if (method.getName().equals(methodName)) { + resultMethod = method; + break; + } + } + return resultMethod; + } + +} diff --git a/user-service/src/main/java/com/mh/user/config/CorsConfig.java b/user-service/src/main/java/com/mh/user/config/CorsConfig.java new file mode 100644 index 0000000..d288e08 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/CorsConfig.java @@ -0,0 +1,40 @@ +package com.mh.user.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * 跨域配置 + * @author Louis + * @date Oct 29, 2018 + */ +@Configuration +public class CorsConfig implements WebMvcConfigurer { + + + @Autowired(required = false) + private PrimessionInterceptor primessionInterceptor; + + /** + * 注册拦截器 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(primessionInterceptor); + } + + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") // 允许跨域访问的路径 + .allowedOrigins("*") // 允许跨域访问的源 + .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") // 允许请求方法 + .maxAge(168000) // 预检间隔时间 + .allowedHeaders("*") // 允许头部设置 + .allowCredentials(true); // 是否发送cookie + } + +} diff --git a/user-service/src/main/java/com/mh/user/config/DruidConfig.java b/user-service/src/main/java/com/mh/user/config/DruidConfig.java new file mode 100644 index 0000000..3823b5d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/DruidConfig.java @@ -0,0 +1,117 @@ +package com.mh.user.config; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.Filter; +import javax.servlet.Servlet; +import javax.sql.DataSource; + +import com.alibaba.druid.wall.WallConfig; +import com.alibaba.druid.wall.WallFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.support.http.StatViewServlet; +import com.alibaba.druid.support.http.WebStatFilter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-03-13 + * @throws : + */ +@Configuration +@EnableConfigurationProperties({DruidDataSourceProperties.class}) +public class DruidConfig { + @Autowired + private DruidDataSourceProperties properties; + + @Bean + @ConditionalOnMissingBean + public DataSource druidDataSource() { + DruidDataSource druidDataSource = new DruidDataSource(); + druidDataSource.setDriverClassName(properties.getDriverClassName()); + druidDataSource.setUrl(properties.getUrl()); + druidDataSource.setUsername(properties.getUsername()); + druidDataSource.setPassword(properties.getPassword()); + druidDataSource.setInitialSize(properties.getInitialSize()); + druidDataSource.setMinIdle(properties.getMinIdle()); + druidDataSource.setMaxActive(properties.getMaxActive()); + druidDataSource.setMaxWait(properties.getMaxWait()); + druidDataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis()); + druidDataSource.setMinEvictableIdleTimeMillis(properties.getMinEvictableIdleTimeMillis()); + druidDataSource.setValidationQuery(properties.getValidationQuery()); + druidDataSource.setTestWhileIdle(properties.isTestWhileIdle()); + druidDataSource.setTestOnBorrow(properties.isTestOnBorrow()); + druidDataSource.setTestOnReturn(properties.isTestOnReturn()); + druidDataSource.setPoolPreparedStatements(properties.isPoolPreparedStatements()); + druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(properties.getMaxPoolPreparedStatementPerConnectionSize()); + + List list=new ArrayList<>(); + WallFilter wallFilter=new WallFilter(); + WallConfig config = new WallConfig(); + //允许一次执行多条语句 + config.setMultiStatementAllow(true); + //允许非基本语句的其他语句 + //config.setNoneBaseStatementAllow(true); + wallFilter.setConfig(config); + list.add(wallFilter); + druidDataSource.setProxyFilters(list); + + try { + druidDataSource.setFilters(properties.getFilters()); + druidDataSource.init(); + } catch (SQLException e) { + e.printStackTrace(); + } + + return druidDataSource; + } + + /** + * 注册Servlet信息, 配置监控视图 + * + * @return + */ + @Bean + @ConditionalOnMissingBean + public ServletRegistrationBean druidServlet() { + ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*"); + + //白名单: +// servletRegistrationBean.addInitParameter("allow","127.0.0.1,139.196.87.48"); + //IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page. + servletRegistrationBean.addInitParameter("deny","192.168.1.222"); + //登录查看信息的账号密码, 用于登录Druid监控后台 + servletRegistrationBean.addInitParameter("loginUsername", "admin"); + servletRegistrationBean.addInitParameter("loginPassword", "admin"); + //是否能够重置数据. + servletRegistrationBean.addInitParameter("resetEnable", "true"); + return servletRegistrationBean; + + } + + /** + * 注册Filter信息, 监控拦截器 + * + * @return + */ + @Bean + @ConditionalOnMissingBean + public FilterRegistrationBean filterRegistrationBean() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); + filterRegistrationBean.setFilter(new WebStatFilter()); + filterRegistrationBean.addUrlPatterns("/*"); + filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); + return filterRegistrationBean; + } +} diff --git a/user-service/src/main/java/com/mh/user/config/DruidDataSourceProperties.java b/user-service/src/main/java/com/mh/user/config/DruidDataSourceProperties.java new file mode 100644 index 0000000..69c5d14 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/DruidDataSourceProperties.java @@ -0,0 +1,172 @@ +package com.mh.user.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-03-13 + * @throws : + */ +@ConfigurationProperties(prefix = "spring.datasource.druid") +public class DruidDataSourceProperties { + + // jdbc + private String driverClassName; + private String url; + private String username; + private String password; + // jdbc connection pool + private int initialSize; + private int minIdle; + private int maxActive = 100; + private long maxWait; + private long timeBetweenEvictionRunsMillis; + private long minEvictableIdleTimeMillis; + private String validationQuery; + private boolean testWhileIdle; + private boolean testOnBorrow; + private boolean testOnReturn; + private boolean poolPreparedStatements; + private int maxPoolPreparedStatementPerConnectionSize; + // filter + private String filters; + + public int getInitialSize() { + return initialSize; + } + + public void setInitialSize(int initialSize) { + this.initialSize = initialSize; + } + + public int getMinIdle() { + return minIdle; + } + + public void setMinIdle(int minIdle) { + this.minIdle = minIdle; + } + + public int getMaxActive() { + return maxActive; + } + + public void setMaxActive(int maxActive) { + this.maxActive = maxActive; + } + + public long getMaxWait() { + return maxWait; + } + + public void setMaxWait(long maxWait) { + this.maxWait = maxWait; + } + + public long getTimeBetweenEvictionRunsMillis() { + return timeBetweenEvictionRunsMillis; + } + + public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) { + this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; + } + + public long getMinEvictableIdleTimeMillis() { + return minEvictableIdleTimeMillis; + } + + public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) { + this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; + } + + public String getValidationQuery() { + return validationQuery; + } + + public void setValidationQuery(String validationQuery) { + this.validationQuery = validationQuery; + } + + public boolean isTestWhileIdle() { + return testWhileIdle; + } + + public void setTestWhileIdle(boolean testWhileIdle) { + this.testWhileIdle = testWhileIdle; + } + + public boolean isTestOnBorrow() { + return testOnBorrow; + } + + public void setTestOnBorrow(boolean testOnBorrow) { + this.testOnBorrow = testOnBorrow; + } + + public boolean isTestOnReturn() { + return testOnReturn; + } + + public void setTestOnReturn(boolean testOnReturn) { + this.testOnReturn = testOnReturn; + } + + public boolean isPoolPreparedStatements() { + return poolPreparedStatements; + } + + public void setPoolPreparedStatements(boolean poolPreparedStatements) { + this.poolPreparedStatements = poolPreparedStatements; + } + + public int getMaxPoolPreparedStatementPerConnectionSize() { + return maxPoolPreparedStatementPerConnectionSize; + } + + public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) { + this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize; + } + + public String getFilters() { + return filters; + } + + public void setFilters(String filters) { + this.filters = filters; + } + + public String getDriverClassName() { + return driverClassName; + } + + public void setDriverClassName(String driverClassName) { + this.driverClassName = driverClassName; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + +} diff --git a/user-service/src/main/java/com/mh/user/config/DruidStatViewServlet.java b/user-service/src/main/java/com/mh/user/config/DruidStatViewServlet.java new file mode 100644 index 0000000..bfee224 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/DruidStatViewServlet.java @@ -0,0 +1,17 @@ +package com.mh.user.config; + +import com.alibaba.druid.support.http.StatViewServlet; + +/** + * druid监控视图配置 + */ +//@WebServlet(urlPatterns = "/druid/*", initParams={ +// @WebInitParam(name="allow",value="192.168.6.195"), // IP白名单 (没有配置或者为空,则允许所有访问) +// @WebInitParam(name="deny",value="192.168.6.73"), // IP黑名单 (存在共同时,deny优先于allow) +// @WebInitParam(name="loginUsername",value="admin"), // 用户名 +// @WebInitParam(name="loginPassword",value="admin"), // 密码 +// @WebInitParam(name="resetEnable",value="true") // 禁用HTML页面上的“Reset All”功能 +//}) +//public class DruidStatViewServlet extends StatViewServlet { +// private static final long serialVersionUID = 7359758657306626394L; +//} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/config/KaptchaConfig.java b/user-service/src/main/java/com/mh/user/config/KaptchaConfig.java new file mode 100644 index 0000000..434994f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/KaptchaConfig.java @@ -0,0 +1,56 @@ +package com.mh.user.config; + +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Properties; + +/** + * author:ljf + * update:2020-03-13 + * description:登陆验证码 + */ +@Configuration +public class KaptchaConfig { + + @Bean + public DefaultKaptcha getDefaultKaptcha(){ + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 图片边框,合法值:yes[默认] , no + properties.setProperty("kaptcha.border", "no"); + // 边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue.默认black + properties.setProperty("kaptcha.border.color", "105,179,90"); + // 边框厚度,合法值:>0,默认1 +// properties.setProperty("kaptcha.border.thickness", "1"); + // 图片宽,默认200 + properties.setProperty("kaptcha.image.width", "110"); + // 图片高,默认50 + properties.setProperty("kaptcha.image.height", "40"); + // 字体大小,默认40px + properties.setProperty("kaptcha.textproducer.font.size", "35"); + // 字体,默认Arial, Courier + properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑"); + // 字体颜色,合法值: r,g,b 或者 white,black,blue.默认black + properties.setProperty("kaptcha.textproducer.font.color", "blue"); + // session key,默认KAPTCHA_SESSION_KEY + properties.setProperty("kaptcha.session.key", "code"); + // session date,默认KAPTCHA_SESSION_DATE +// properties.setProperty("kaptcha.session.date", "KAPTCHA_SESSION_DATE"); + // 验证码长度,默认5 + properties.setProperty("kaptcha.textproducer.char.length", "4"); + // 文字间隔,默认2 + properties.setProperty("kaptcha.textproducer.char.space", "5"); + // 干扰 颜色,合法值: r,g,b 或者 white,black,blue.默认black +// properties.setProperty("kaptcha.noise.color", "black"); + // 更多可参考:https://blog.csdn.net/elephantboy/article/details/52795309 + + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + + return defaultKaptcha; + } + +} diff --git a/user-service/src/main/java/com/mh/user/config/PrimessionInterceptor.java b/user-service/src/main/java/com/mh/user/config/PrimessionInterceptor.java new file mode 100644 index 0000000..7a8bf55 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/PrimessionInterceptor.java @@ -0,0 +1,68 @@ +package com.mh.user.config; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.mh.user.dynamic.datasource.DataSourceContextHolder; +import com.mh.user.dynamic.datasource.DataSourceObject; +import com.mh.user.entity.DBEntity; +import com.mh.user.service.SysUserService; +import com.mh.user.utils.JwtTokenUtils; +import com.mh.user.utils.AESUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author chison + * @date 2020-09-03 08:44 + * @Description 请求拦截器 + */ +@Component +public class PrimessionInterceptor implements HandlerInterceptor { + + + @Autowired + private SysUserService sysUserService; + + /** + * 根据token获取用户项目信息,对数据源进行切换 + * @param request + * @param response + * @param handler + * @return + * @throws Exception + */ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + String token = request.getHeader("token"); + if (token != null && token.contains("token")) { + JSONObject jsonObject = (JSONObject) JSON.parse(token); + System.out.println("header---->" + jsonObject.get("token")); + if (jsonObject.get("token") !=null ) { + token = jsonObject.get("token").toString(); + } + System.out.println(" token==> " + token); + } + String uri = request.getRequestURI(); + System.out.println(uri); + DataSourceContextHolder.setDBType("default"); + // 除了中间库业务的请求都使用多数据源切换 +// if(!(uri.contains("/sysUser") || uri.contains("/sysRole") || uri.contains("/sysMenu") )){ +// if(token != null){ +// String userName = JwtTokenUtils.getUsernameFromToken(token); +// System.out.println(userName); +// DBEntity dbEntity = sysUserService.queryDBInfo(userName); +// dbEntity.setDB_Pwd(AESUtil.AESdecrypt(dbEntity.getDB_Pwd())); +// // 切换数据源 +// DataSourceObject dataSourceObject = new DataSourceObject(); +// String SourceName = "sqlServer-"+dbEntity.getDB_Names(); +// dataSourceObject.SwitchSQLServerDataSource(dbEntity,SourceName); +// DataSourceContextHolder.setDBType(SourceName); +// } +// } + return true; + } +} diff --git a/user-service/src/main/java/com/mh/user/config/QuartzConfig.java b/user-service/src/main/java/com/mh/user/config/QuartzConfig.java new file mode 100644 index 0000000..81e381f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/QuartzConfig.java @@ -0,0 +1,60 @@ +package com.mh.user.config; + +import com.mh.user.job.JobFactory; +import com.mh.user.utils.TimedTask2; +import lombok.extern.slf4j.Slf4j; +import org.quartz.Scheduler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +/** + * @author ljf + * @title : Quartz配置 + * @description : + * @updateTime 2020-04-03 + * @throws : + */ +@Slf4j +@Configuration +public class QuartzConfig { + + private JobFactory jobFactory; + + /** + * @author jinhaoxun + * @description 构造器 + * @param jobFactory + */ + public QuartzConfig(JobFactory jobFactory){ + this.jobFactory = jobFactory; + } + + /** + * @author jinhaoxun + * @description 配置SchedulerFactoryBean,将一个方法产生为Bean并交给Spring容器管理 + * @return SchedulerFactoryBean + */ + @Bean + public SchedulerFactoryBean schedulerFactoryBean() { +// log.info("开始注入定时任务调度器工厂..."); + System.out.println("开始注入定时任务调度器工厂..."); + SchedulerFactoryBean factory = new SchedulerFactoryBean();// Spring提供SchedulerFactoryBean为Scheduler提供配置信息,并被Spring容器管理其生命周期 + factory.setJobFactory(jobFactory);// 设置自定义Job Factory,用于Spring管理Job bean + factory.setOverwriteExistingJobs(true);// 覆盖存在的定时任务 + factory.setStartupDelay(30); //延时30秒启动定时任务,避免系统未完全启动却开始执行定时任务的情况 +// log.info("注入定时任务调度器工厂成功!"); + System.out.println("注入定时任务调度器工厂成功!"); +// TimedTask2 timedTask2=new TimedTask2(); +// timedTask2.cronJob(); +// System.out.println("定点启动任务!"); + return factory; + } + + @Bean(name = "scheduler") + public Scheduler scheduler() { + System.out.println("进来了---------------!"); + return schedulerFactoryBean().getScheduler(); + + } +} diff --git a/user-service/src/main/java/com/mh/user/config/RestTemplateConfig.java b/user-service/src/main/java/com/mh/user/config/RestTemplateConfig.java new file mode 100644 index 0000000..f6074d8 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/RestTemplateConfig.java @@ -0,0 +1,14 @@ +package com.mh.user.config; + +import org.springframework.context.annotation.Configuration; + +/** + * @author ljf + * @title : + * @description : redis配置 + * @updateTime 2020-08-20 + * @throws : + */ +@Configuration +public class RestTemplateConfig { +} diff --git a/user-service/src/main/java/com/mh/user/config/SwaggerConfig.java b/user-service/src/main/java/com/mh/user/config/SwaggerConfig.java new file mode 100644 index 0000000..13f82d6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/SwaggerConfig.java @@ -0,0 +1,50 @@ +package com.mh.user.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.ParameterBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.schema.ModelRef; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Parameter; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-03-13 + * @throws : + */ +@Configuration +@EnableSwagger2 +public class SwaggerConfig { + + @Bean + public Docket createRestApi(){ + // 添加请求参数,我们这里把token作为请求头部参数传入后端 + ParameterBuilder parameterBuilder = new ParameterBuilder(); + List parameters = new ArrayList(); + parameterBuilder.name("token").description("令牌") + .modelRef(new ModelRef("string")).parameterType("header").required(false).build(); + parameters.add(parameterBuilder.build()); + return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select() + .apis(RequestHandlerSelectors.any()).paths(PathSelectors.any()) + .build().globalOperationParameters(parameters); +// return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select() +// .apis(RequestHandlerSelectors.any()).paths(PathSelectors.any()).build(); + } + + private ApiInfo apiInfo(){ + return new ApiInfoBuilder().build(); + } + + +} diff --git a/user-service/src/main/java/com/mh/user/config/WebSecurityConfig.java b/user-service/src/main/java/com/mh/user/config/WebSecurityConfig.java new file mode 100644 index 0000000..8fa6a2c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/WebSecurityConfig.java @@ -0,0 +1,81 @@ +package com.mh.user.config; + +import com.mh.user.security.JwtAuthenticationFilter; +import com.mh.user.security.JwtAuthenticationProvider; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.authentication.logout.HttpStatusReturningLogoutSuccessHandler; +import org.springframework.web.cors.CorsUtils; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; + +/** + * Spring Security配置 + * @author Louis + * @date Jan 14, 2019 + */ +@Configuration +@EnableWebSecurity // 开启Spring Security +//@EnableGlobalMethodSecurity(prePostEnabled = true) // 开启权限注解,如:@PreAuthorize注解 +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Qualifier("userDetailsServiceImpl") + @Autowired + private UserDetailsService userDetailsService; + + @Override + public void configure(AuthenticationManagerBuilder auth) throws Exception { + // 使用自定义身份验证组件 + auth.authenticationProvider(new JwtAuthenticationProvider(userDetailsService)); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + // 禁用 csrf, 由于使用的是JWT,我们这里不需要csrf +// http.cors().and().csrf().disable() +// .authorizeRequests() +// // 跨域预检请求 +// .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() +// // web jars +// .antMatchers("/webjars/**").permitAll() +// // 查看SQL监控(druid) +// .antMatchers("/druid/**").permitAll() +// // 首页和登录页面 +// .antMatchers("/").permitAll() +// .antMatchers("/login").permitAll() +// // swagger +// .antMatchers("/swagger-ui.html").permitAll() +// .antMatchers("/swagger-resources/**").permitAll() +// .antMatchers("/v2/api-docs").permitAll() +// .antMatchers("/webjars/springfox-swagger-ui/**").permitAll() +// // 验证码 +// .antMatchers("/captcha.jpg**").permitAll() +// // 服务监控 +// .antMatchers("/actuator/**").permitAll() +// // 其他所有请求需要身份认证 +// .anyRequest().authenticated(); +// // 退出登录处理器 +// http.logout().logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler()); +// // token验证过滤器 +// http.addFilterBefore(new JwtAuthenticationFilter(authenticationManager()), UsernamePasswordAuthenticationFilter.class); + // 禁用token验证 + http.csrf().disable().authorizeRequests().anyRequest().permitAll().and().logout().permitAll(); + } + + @Bean + @Override + public AuthenticationManager authenticationManager() throws Exception { + return super.authenticationManager(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/constants/Constant.java b/user-service/src/main/java/com/mh/user/constants/Constant.java new file mode 100644 index 0000000..7fa833a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/constants/Constant.java @@ -0,0 +1,17 @@ +package com.mh.user.constants; + +/** + * @author ljf + * @title : + * @description : 存放一些公共全局参数 + * @updateTime 2020-05-29 + * @throws : + */ +public class Constant { + + public static boolean CONTROL_WEB_FLAG = false; + public static boolean SEND_STATUS = false; // 指令发送状态 + public static boolean FLAG = false; + public static boolean WEB_FLAG = false; // 判断是否有前端指令下发 + +} diff --git a/user-service/src/main/java/com/mh/user/constants/SocketMessage.java b/user-service/src/main/java/com/mh/user/constants/SocketMessage.java new file mode 100644 index 0000000..cc3c616 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/constants/SocketMessage.java @@ -0,0 +1,33 @@ +package com.mh.user.constants; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-06-09 + * @throws : + */ +@PropertySource("classpath:socket.yml") +@ConfigurationProperties(prefix = "socket") +@Setter +@Getter +@Component +public class SocketMessage { + + @Value("${IP}") + private String IP; + + @Value("${port}") + private int port; + + @Value("${overtime}") + private int overTime; + +} diff --git a/user-service/src/main/java/com/mh/user/constants/SysConstants.java b/user-service/src/main/java/com/mh/user/constants/SysConstants.java new file mode 100644 index 0000000..0e93a31 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/constants/SysConstants.java @@ -0,0 +1,11 @@ +package com.mh.user.constants; + +/** + * author: ljf + * desc: 系统常量值 + */ +public interface SysConstants { + + // 系统管理员用户名 + String ADMIN = "admin"; +} diff --git a/user-service/src/main/java/com/mh/user/controller/AlarmInfoController.java b/user-service/src/main/java/com/mh/user/controller/AlarmInfoController.java new file mode 100644 index 0000000..405e9be --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/AlarmInfoController.java @@ -0,0 +1,172 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.BusinessType; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.AlarmInfoEntity; +import com.mh.user.entity.AlarmValueSetEntity; +import com.mh.user.entity.EnergyEntity; +import com.mh.user.model.BuildingModel; +import com.mh.user.service.AlarmInfoService; +import com.mh.user.service.BuildingService; +import com.mh.user.service.DealDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@RestController +@RequestMapping("alarm") +public class AlarmInfoController { + + @Autowired + AlarmInfoService alarmInfoService; + + @Autowired + BuildingService buildingService; + + @Autowired + DealDataService dealDataService; + + @SysLogger(title="报警信息",optDesc ="保存报修信息") + @PostMapping("/save") + public HttpResult saveAlarmInfo(@RequestBody AlarmInfoEntity alarmInfoEntity){ + try{ + alarmInfoService.saveAlarmInfo(alarmInfoEntity); + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error(500,"保存出错!"); + } + + } + + @SysLogger(title="报警信息",optDesc = "修改报警信息") + @PostMapping("/update") + public HttpResult updateAlarmInfo(@RequestBody AlarmInfoEntity alarmInfoEntity){ + try{ + alarmInfoService.updateAlarmInfo(alarmInfoEntity); + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error(500,"修改出错!"); + } + + } + + @SysLogger(title="报警信息",optDesc = "删除报警信息") + @PostMapping("/delete") + public HttpResult deleteAlarmInfo(@RequestParam(value = "id") String id){ + try{ + alarmInfoService.deleteAlarmInfo(id); + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error("删除出错!"); + } + } + + @SysLogger(title="报警信息",optDesc = "查询报警信息") + @PostMapping("/query") + public HttpResult queryAlarmInfo(@RequestParam(value = "alarmTime",required = false) String alarmTime, + @RequestParam(value = "alarmType",required = false) String alarmType, + @RequestParam(value = "buildingId",required = false) String buildingId, + @RequestParam(value = "dealState",required = false) String dealState, + @RequestParam(value = "page",required = true) int page, + @RequestParam(value = "limit",required = true) int limit){ + try{ + List list; + list=alarmInfoService.queryAlarmInfo(alarmTime,alarmType,buildingId,dealState,page,limit); + int count=alarmInfoService.getAlarmInfoCount(alarmTime,alarmType,buildingId,dealState,page,limit); + return HttpResult.ok(count,list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + } + + @SysLogger(title="报警设置",optDesc = "保存报警设置信息") + @PostMapping("/set") + public HttpResult saveAlarmValueSet(@RequestBody AlarmValueSetEntity alarmValueSetEntity){ + try{ + String type=alarmValueSetEntity.getType(); + String itemType=alarmValueSetEntity.getItemType(); + if (type==null || type.equals("") || type.equals("0")){ + String buildingId=alarmValueSetEntity.getBuildingId(); + alarmInfoService.delAlarmValueSet2(buildingId,itemType); //删除旧的记录 + alarmInfoService.saveAlarmValueSet(alarmValueSetEntity); + }else{ + List list=buildingService.selectBuildingName(); + for ( BuildingModel build:list){ + alarmInfoService.delAlarmValueSet2(String.valueOf(build.getBuildingId()),itemType); + alarmValueSetEntity.setBuildingId(String.valueOf(build.getBuildingId())); + alarmInfoService.saveAlarmValueSet(alarmValueSetEntity); + } + } + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error(500,"保存出错!"); + } + } + + //修改处理状态 + @SysLogger(title="报警信息",optDesc = "修改处理状态") + @PostMapping("/dealState") + public HttpResult updateDealState(@RequestParam(value = "id",required = false) String id, + @RequestParam(value = "dealState",required = false) String dealState){ + try{ + alarmInfoService.updateDealState(id,dealState); + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); + Date dt=new Date(); + String curDate=sdf1.format(dt); + dealDataService.proAlarmInfoSum(curDate); //汇总相关警报数 + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error(500,"修改出错!"); + } + } + + @SysLogger(title="报警设置",optDesc = "查询报警设置信息") + @PostMapping("/querySet") + public HttpResult queryAlarmValueSet(@RequestParam(value = "buildingId",required = false) String buildingId, + @RequestParam(value = "itemType",required = false) String itemType, + @RequestParam(value = "page",required = true) int page, + @RequestParam(value = "limit",required = true) int limit){ + try{ + List list; + list=alarmInfoService.queryAlarmValueSet(buildingId,itemType,page,limit); + int count=alarmInfoService.getAlarmValueSetCount(buildingId,itemType); + return HttpResult.ok(count,list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + } + + //删除设置记录 + @SysLogger(title="报警设置",optDesc = "删除报警设置信息") + @PostMapping("/delSet") + public HttpResult delAlarmValueSet(@RequestParam(value = "id",required = false) String id){ + try{ + alarmInfoService.delAlarmValueSet(id); + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error(500,"删除出错!"); + } + + } + + //按楼栋编号删除设置记录 + @SysLogger(title="报警设置",optDesc = "删除报警设置信息") + @PostMapping("/del") + public HttpResult delAlarmValueSet2(@RequestParam(value = "buildingId",required = false) String buildingId, + @RequestParam(value = "itemType",required = false) String itemType){ + try{ + alarmInfoService.delAlarmValueSet2(buildingId,itemType); + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error(500,"删除出错!"); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/AnalysisController.java b/user-service/src/main/java/com/mh/user/controller/AnalysisController.java new file mode 100644 index 0000000..855fbf5 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/AnalysisController.java @@ -0,0 +1,55 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.entity.AnalysisMonthEntity; +import com.mh.user.entity.AnalysisYearEntity; +import com.mh.user.service.AnalysisService; +import com.mh.user.service.BuildingService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("analysis") +public class AnalysisController { + + @Autowired + AnalysisService analysisService; + + @Autowired + BuildingService buildingService; + + @PostMapping("/queryYear") //type=1(水),2(电),3(能耗),4(维保) + public HttpResult queryAnalysisYear(@RequestParam(value = "curDate",required = true) String curDate, + @RequestParam(value = "buildingId",required = true) String buildingId, + @RequestParam(value = "type",defaultValue = "3") int type) { + try{ + List list; + list=analysisService.queryAnalysisYear(curDate,buildingId,type); + return HttpResult.ok(list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + + } + + @PostMapping("/queryMonth") //type=1(水),2(电),3(能耗) + public HttpResult queryAnalysisMonth(@RequestParam(value = "curDate",required = true) String curDate, + @RequestParam(value = "buildingId",required = true) String buildingId, + @RequestParam(value = "type",defaultValue = "3") int type) { + try{ + List list; + list=analysisService.queryAnalysisMonth(curDate,buildingId,type); + return HttpResult.ok(list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/AreaController.java b/user-service/src/main/java/com/mh/user/controller/AreaController.java new file mode 100644 index 0000000..4b7c1fd --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/AreaController.java @@ -0,0 +1,38 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.entity.AreaEntity; +import com.mh.user.entity.ExceptionTableData; +import com.mh.user.service.AreaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author nxr + * @title : 校区接口 + * @description : + * @updateTime 2022-06-09 + * @throws : + */ +@RestController +@RequestMapping("area") +public class AreaController { + + @Autowired + private AreaService areaService; + + @PreAuthorize("hasAuthority('sys:area:view')") + @PostMapping(value = "/findArea") + public HttpResult findArea() { + List list=areaService.findAll(); +// System.out.println("test"); + return HttpResult.ok("500",list); + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/BuildingController.java b/user-service/src/main/java/com/mh/user/controller/BuildingController.java new file mode 100644 index 0000000..924e692 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/BuildingController.java @@ -0,0 +1,227 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.BuildingEntity; +import com.mh.user.model.BuildingModel; +import com.mh.user.service.BuildingService; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.CellType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("building") +public class BuildingController { + + @Autowired + private BuildingService buildingService; + + //保存 + @SysLogger(title="楼栋信息",optDesc = "保存楼栋信息") + @PostMapping(value="/save") + public HttpResult saveBuilding(@RequestBody BuildingEntity buildingEntity) { + try{ + return HttpResult.ok(buildingService.saveBuilding(buildingEntity)); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } + + //修改 + @SysLogger(title="楼栋信息",optDesc = "修改楼栋信息") + @PostMapping(value="/update") + public HttpResult updateBuilding(@RequestBody BuildingEntity buildingEntity) { + return HttpResult.ok("success",buildingService.updateBuilding(buildingEntity)); + } + + //查询所有 + @SysLogger(title="楼栋信息",optDesc = "查询楼栋信息") + @PostMapping(value = "/query") + public HttpResult queryBuilding(@RequestParam(value = "buildingId", required = false)String buildingId, + @RequestParam(value= "page", required=true)Integer page, + @RequestParam(value= "limit", required=true)Integer limit) { + try{ + int count=buildingService.getCount(buildingId, page,limit); + List records=buildingService.queryBuilding(buildingId, page,limit); + return HttpResult.ok(count,records); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } + + //查询楼栋名称 + @PostMapping(value="/name") + public HttpResult selectBuildingName() { + try{ + List list=buildingService.selectBuildingName(); + return HttpResult.ok(list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + + } + + // 删除多 + @PostMapping(value="/deletes") + public HttpResult delete(@RequestBody List records) { + return HttpResult.ok(buildingService.deleteBuilding(records)); + } + + // 删除单个 + @SysLogger(title="楼栋信息",optDesc = "删除楼栋信息") + @PostMapping(value="/delete") + public HttpResult delete(@RequestParam String id ) { + return HttpResult.ok(buildingService.deleteBuilding(id)); + } + + // 查询编号 + @PostMapping(value="/selectBuildingId") + public HttpResult selectBuildingId(@RequestParam String buildingName ) { + String id=buildingService.selectBuildingId(buildingName); + return HttpResult.ok(id); + } + + // 资料批量上传 + @SysLogger(title="楼栋信息",optDesc = "批量导入楼栋信息") + @PostMapping("/import_building") + public HttpResult importExcel(@RequestParam(value = "file") MultipartFile file, HttpServletRequest req) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + HttpResult httpResult=new HttpResult(); + try { + int is=0; //判断是否有重复 + String msg=""; + List a = new ArrayList(); + InputStream inputStream = file.getInputStream(); + //创建工作簿 + //如果是xls,使用HSSFWorkbook;如果是xlsx,使用XSSFWorkbook + HSSFWorkbook hssfWorkbook = new HSSFWorkbook(inputStream); + System.out.println("xssfWorkbook对象:" + hssfWorkbook); + //读取第一个工作表 + HSSFSheet sheet = hssfWorkbook.getSheetAt(0); + System.out.println("sheet对象:" + sheet); + //获取最后一行的num,即总行数。此处从0开始计数 + int maxRow = sheet.getLastRowNum(); + System.out.println("总行数为:" + maxRow); + if (maxRow >= 500){ + msg = "总行数不能超出500行"; + httpResult.setMsg(msg); + httpResult.setCode(500); + return httpResult; + } + if (maxRow == 0){ + msg = "请先录入数据到excel文件"; + httpResult.setMsg(msg); + httpResult.setCode(500); + return httpResult; + } + + // 创建数组集合 + List uploadEntityList = new ArrayList<>(); + List deviceList = new ArrayList<>(); + for (int row = 1; row <= maxRow; row++) { + //获取最后单元格num,即总单元格数 ***注意:此处从1开始计数*** + int maxRol = sheet.getRow(row).getLastCellNum(); + System.out.println("总列数为:" + maxRol); + System.out.println("--------第" + row + "行的数据如下--------"); + for (int rol = 0; rol < maxRol; rol++){ + String sCell; + if (sheet.getRow(row).getCell(rol) == null){ + sCell=""; + }else{ + HSSFCell cell = sheet.getRow(row).getCell(rol); + cell.setCellType(CellType.STRING); + sCell = cell.getStringCellValue(); + } + sCell = sCell.trim(); //去首尾空格 + sCell = sCell.replaceAll(" ", ""); //去掉所有空格,包括首尾、中间 + sCell = sCell.replaceAll("\\s*", ""); //可以替换大部分空白字符, 不限于空格,\s 可以匹配空格、制表符、换页符等空白字符的其中任意一个 + System.out.print(sCell + " "); + deviceList.add(sCell); + String rolName = ""; + switch (rol){ + case 1 : + rolName = "楼栋名称"; + break; + case 2 : + rolName = "楼层数"; + break; + case 3 : + rolName = "起始楼层"; + break; + case 4 : + rolName = "每层宿舍数"; + break; + case 5 : + rolName = "床位数"; + break; + case 6 : + rolName = "实际入住数"; + break; + } + if ((rol >= 1)&&(rol <= 4)&&(sCell.equals(""))){ + msg = rolName + "不能为空" ; + httpResult.setMsg(msg); + httpResult.setCode(500); + return httpResult; + } + } + + // 创建实体类 + BuildingEntity uploadEntity = new BuildingEntity(); + uploadEntity.setBuildingName(deviceList.get(0));//楼栋名称 + uploadEntity.setLevelsCount(Integer.parseInt(deviceList.get(1))); //楼层数 + uploadEntity.setBeginLevel(Integer.parseInt(deviceList.get(2))); //起始楼层 + uploadEntity.setHouseCount(Integer.parseInt(deviceList.get(3))); //每层宿舍数 + uploadEntity.setBedCount(Integer.parseInt(deviceList.get(4))); //床位数 + uploadEntity.setCheckInCount(Integer.parseInt(deviceList.get(5))); //实际入住数 + + deviceList.clear(); + + uploadEntityList.add(uploadEntity); + is=buildingService.selectCount(uploadEntity.getBuildingName()); + if (is>0){ + httpResult.setMsg("楼栋名称有重复!"); + httpResult.setCode(500); +// return httpResult; + } + } + + if (is==0){ + for (BuildingEntity buildingEntity:uploadEntityList){ + buildingService.saveBuilding(buildingEntity); + } + httpResult.setMsg("success"); + httpResult.setCode(200); + return httpResult; + } + + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return httpResult; + } + + // 查询楼栋热泵数目 + @PostMapping(value="/pumpCount") + public HttpResult selectPumpCount(@RequestParam String buildingId ) { + int count=buildingService.selectPumpCount(buildingId); + return HttpResult.ok("success",count); + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/CodeTableController.java b/user-service/src/main/java/com/mh/user/controller/CodeTableController.java new file mode 100644 index 0000000..2e4b60b --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/CodeTableController.java @@ -0,0 +1,32 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.model.DeviceTypeModel; +import com.mh.user.service.CodeTableService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; + +@RestController +public class CodeTableController { + + @Autowired + CodeTableService codeTableService; + + @PostMapping("/deviceType") + public HttpResult queryDeviceType(){ + List list; + list=codeTableService.queryDeviceType(); + return HttpResult.ok(list); + } + + @PostMapping("/brand") + public HttpResult queryBrand(){ + List list; + list=codeTableService.queryBrand(); + return HttpResult.ok(list); + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/ControlSetController.java b/user-service/src/main/java/com/mh/user/controller/ControlSetController.java new file mode 100644 index 0000000..fae8cdc --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/ControlSetController.java @@ -0,0 +1,60 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.ControlSetEntity; +import com.mh.user.entity.PumpSetEntity; +import com.mh.user.service.ControlSetService; +import com.mh.user.service.PumpSetService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("controller") +public class ControlSetController { + + @Autowired + ControlSetService controlSetService; + + @Autowired + PumpSetService pumpSetService; + + //保存控制设置值 + @SysLogger(title="控制设置",optDesc = "保存控制设置值") + @PostMapping(value="/save") + public HttpResult saveControlSet(@RequestBody ControlSetEntity controlSetEntity) { + try{ + controlSetService.saveControlSet(controlSetEntity); + return HttpResult.ok("保存成功!"); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } + + //保存热泵设置值 + @SysLogger(title="控制设置",optDesc = "保存热泵设置值") + @PostMapping(value="/pumpSave") + public HttpResult saveControlSet(@RequestBody PumpSetEntity pumpSetEntity) { + try{ + pumpSetService.savePumpSet(pumpSetEntity); + return HttpResult.ok("保存成功!"); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } + + //查询设置表 + @SysLogger(title="控制设置",optDesc = "查询设置值") + @PostMapping(value="/query") + public HttpResult queryControlSet(@RequestParam("buildingId") String buildingId) { + try{ + ControlSetEntity control=controlSetService.queryControlSet(buildingId); + return HttpResult.ok(control); + }catch (Exception e){ +// e.printStackTrace(); + return HttpResult.error(); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/DataResultController.java b/user-service/src/main/java/com/mh/user/controller/DataResultController.java new file mode 100644 index 0000000..3985dce --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/DataResultController.java @@ -0,0 +1,46 @@ +package com.mh.user.controller; + + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.BuildingEntity; +import com.mh.user.entity.DataResultEntity; +import com.mh.user.service.BuildingService; +import com.mh.user.service.DataResultService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("dataResult") +public class DataResultController { + + @Autowired + DataResultService dataResultService; + + @Autowired + BuildingService buildingService; + + @SysLogger(title="用能查询",optDesc = "查询抄表读数") + @PostMapping(value="/query") + public HttpResult queryDataResult(@RequestParam(value = "buildingId", required = false) String buildingId, + @RequestParam(value= "startDate", required=false)String startDate, + @RequestParam(value= "endDate", required=false)String endDate, + @RequestParam(value= "deviceType", required=false)String deviceType, + @RequestParam(value= "page", required=true)Integer page, + @RequestParam(value= "limit", required=true)Integer limit) { + + try{ + + int count=dataResultService.getDataResultCount(buildingId,startDate,endDate,deviceType,page,limit); + List records=dataResultService.queryDataResult(buildingId,startDate,endDate,deviceType,page,limit); + return HttpResult.ok(count,records); + }catch (Exception e){ +// e.printStackTrace(); + return HttpResult.error(); + } + + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/DeviceFloorController.java b/user-service/src/main/java/com/mh/user/controller/DeviceFloorController.java new file mode 100644 index 0000000..e6307c7 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/DeviceFloorController.java @@ -0,0 +1,218 @@ +package com.mh.user.controller; + + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.*; +import com.mh.user.model.DeviceModel; +import com.mh.user.service.BuildingService; +import com.mh.user.service.DeviceFloorService; +import com.mh.user.service.DeviceInstallService; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.CellType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.io.InputStream; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("floor") +public class DeviceFloorController { + + @Autowired + private DeviceFloorService deviceFloorService; + + @Autowired + BuildingService buildingService; + + //保存 + @SysLogger(title="楼面设备",optDesc = "保存楼面设备信息") + @PostMapping(value="/save") + public HttpResult saveDevice(@RequestBody DeviceFloorEntity deviceFloorEntity) { + return HttpResult.ok(deviceFloorService.saveDevice(deviceFloorEntity)); + } + + //修改 + @SysLogger(title="楼面设备",optDesc = "修改楼面设备信息") + @PostMapping(value="/update") + public HttpResult updateDevice(@RequestBody DeviceFloorEntity deviceFloorEntity) { + return HttpResult.ok(deviceFloorService.updateDevice(deviceFloorEntity)); + } + + //查询所有 + @PostMapping(value = "/query") + @SysLogger(title="楼面设备",optDesc = "查询楼面设备信息") + public HttpResult queryDeviceFloor(@RequestParam(value = "buildingId", required = false)String buildingId, + @RequestParam(value = "deviceType", required = false)String deviceType, + @RequestParam(value= "page", required=true)Integer page, + @RequestParam(value= "limit", required=true)Integer limit) { + try{ + int count=deviceFloorService.getCount(buildingId,deviceType, page,limit); + List records=deviceFloorService.queryDeviceFloor(buildingId,deviceType, page,limit); + return HttpResult.ok(count,records); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } + + @PostMapping(value="/name") + public HttpResult selectDeviceName(@RequestParam(value = "buildingId", required = false)String buildingId, + @RequestParam(value = "deviceType", required = false)String deviceType) { + try{ + List list=deviceFloorService.selectDeviceName(buildingId,deviceType); + return HttpResult.ok(list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + + } + + // 删除多 + @PostMapping(value="/deletes") + public HttpResult delete(@RequestBody List records) { + return HttpResult.ok(deviceFloorService.deleteDevice(records)); + } + + // 删除单个 + @SysLogger(title="楼面设备",optDesc = "删除楼面设备信息") + @PostMapping(value="/delete") + public HttpResult delete(@RequestParam String id ) { + return HttpResult.ok(deviceFloorService.deleteDevice(id)); + } + + // 资料批量上传 + @SysLogger(title="楼面设备",optDesc = "批量导入楼面设备信息") + @PostMapping("/import_devices") + public HttpResult importExcel(@RequestParam(value = "file") MultipartFile file, HttpServletRequest req) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + HttpResult httpResult=new HttpResult(); + try { + int is=0; //判断是否有重复表号 + String msg=""; + List a = new ArrayList(); + InputStream inputStream = file.getInputStream(); + //创建工作簿 + HSSFWorkbook hssfWorkbook = new HSSFWorkbook(inputStream); + System.out.println("xssfWorkbook对象:" + hssfWorkbook); + //读取第一个工作表 + HSSFSheet sheet = hssfWorkbook.getSheetAt(0); + System.out.println("sheet对象:" + sheet); + //获取最后一行的num,即总行数。此处从0开始计数 + int maxRow = sheet.getLastRowNum(); + System.out.println("总行数为:" + maxRow); + if (maxRow >= 500){ + msg = "总行数不能超出500行"; + httpResult.setMsg(msg); + httpResult.setCode(500); + return httpResult; + } + if (maxRow == 0){ + msg = "请先录入数据到excel文件"; + httpResult.setMsg(msg); + httpResult.setCode(500); + return httpResult; + } + + // 创建数组集合 + List uploadEntityList = new ArrayList<>(); + List deviceList = new ArrayList<>(); + for (int row = 1; row <= maxRow; row++) { + //获取最后单元格num,即总单元格数 ***注意:此处从1开始计数*** + int maxRol = sheet.getRow(row).getLastCellNum(); + System.out.println("总列数为:" + maxRol); + System.out.println("--------第" + row + "行的数据如下--------"); + for (int rol = 0; rol < maxRol; rol++){ + String sCell; + if (sheet.getRow(row).getCell(rol) == null){ + sCell=""; + }else{ + HSSFCell cell = sheet.getRow(row).getCell(rol); + cell.setCellType(CellType.STRING); + sCell = cell.getStringCellValue(); + } + sCell = sCell.trim(); //去首尾空格 + sCell = sCell.replaceAll(" ", ""); //去掉所有空格,包括首尾、中间 + sCell = sCell.replaceAll("\\s*", ""); //可以替换大部分空白字符, 不限于空格,\s 可以匹配空格、制表符、换页符等空白字符的其中任意一个 + System.out.print(sCell + " "); + deviceList.add(sCell); + String rolName = ""; + switch (rol){ + case 1 : + rolName = "设备名称"; + break; + case 2 : + rolName = "设备类型"; + break; + case 3 : + rolName = "品牌"; + break; + case 4 : + rolName = "规格"; + break; + case 5 : + rolName = "型号"; + break; + case 6 : + rolName = "安装人员"; + break; + case 7 : + rolName = "所属楼栋"; + break; + } + if ((rol >= 1)&&(rol <= 4)&&(sCell.equals(""))){ + msg = rolName + "不能为空" ; + httpResult.setMsg(msg); + httpResult.setCode(500); + return httpResult; + } + } + + // 创建实体类 + DeviceFloorEntity uploadEntity = new DeviceFloorEntity(); + uploadEntity.setDeviceName(deviceList.get(0));//设备名称 + uploadEntity.setDeviceType(deviceList.get(1));//设备类型 + uploadEntity.setBrand(deviceList.get(2));//品牌 + uploadEntity.setSpecs(deviceList.get(3));//规格 + uploadEntity.setModel(deviceList.get(4));//型号 + uploadEntity.setInstaller(deviceList.get(5));//安装人员 + uploadEntity.setBuildingId(deviceList.get(6));//所属楼栋 + deviceList.clear(); + uploadEntityList.add(uploadEntity); + is=deviceFloorService.selectDeviceCount(uploadEntity.getBuildingId(),uploadEntity.getDeviceType(),uploadEntity.getDeviceName()); + if (is>0){ + httpResult.setMsg("设备名称不能重复!"); + httpResult.setCode(500); +// return httpResult; + } +// deviceFloorService.saveDevice(uploadEntity); + } + + if (is==0){ + for (DeviceFloorEntity deviceFloorEntity:uploadEntityList){ + deviceFloorService.saveDevice(deviceFloorEntity); + } + httpResult.setMsg("success"); + httpResult.setCode(200); + return httpResult; + } + } catch (IOException e) { // IOException | ParseException e + // TODO Auto-generated catch block + e.printStackTrace(); + } + return httpResult; + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/DeviceInstallController.java b/user-service/src/main/java/com/mh/user/controller/DeviceInstallController.java new file mode 100644 index 0000000..30576a4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/DeviceInstallController.java @@ -0,0 +1,350 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.BusinessType; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.BuildingEntity; +import com.mh.user.entity.DeviceInstallEntity; +import com.mh.user.model.DeviceModel; +import com.mh.user.service.BuildingService; +import com.mh.user.service.DealDataService; +import com.mh.user.service.DeviceInstallService; +import com.mh.user.service.SummaryService; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.CellType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.*; + +@RestController +@RequestMapping("device") +public class DeviceInstallController { + + @Autowired + private DeviceInstallService deviceInstallService; + + @Autowired + BuildingService buildingService; + + private final DealDataService dealDataService; + + public DeviceInstallController(DealDataService dealDataService) + { + this.dealDataService = dealDataService; + } + + //保存 + @SysLogger(title="基表信息",optDesc = "保存基表信息") + @PostMapping(value="/save") + public HttpResult saveDevice(@RequestBody DeviceInstallEntity deviceInstallEntity) { + return HttpResult.ok(deviceInstallService.saveDevice(deviceInstallEntity)); + } + + //修改 + @SysLogger(title="基表信息",optDesc = "修改基表信息") + @PostMapping(value="/update") + public HttpResult updateDevice(@RequestBody DeviceInstallEntity deviceInstallEntity) { + deviceInstallService.updateDevice(deviceInstallEntity); + String isUse=""; + if (deviceInstallEntity.isUse()==true){ + isUse="1"; + }else{ + isUse="0"; + } + String deviceAddr=deviceInstallEntity.getDeviceAddr(); + String deviceType=deviceInstallEntity.getDeviceType(); + String buildingId=deviceInstallEntity.getBuildingId(); + deviceInstallService.updateIsUse(isUse,deviceAddr,deviceType,buildingId); + deviceInstallService.updateIsUse2(isUse,deviceAddr,deviceType,buildingId); + deviceInstallService.updateIsUse3(isUse,deviceAddr,deviceType,buildingId); + + return HttpResult.ok(); + } + + //查询所有 + @SysLogger(title="基表信息",optDesc = "查询基表信息") + @PostMapping(value = "/getAll") + public HttpResult getAllDevice(@RequestParam int page, @RequestParam int limit) { + Map map=new HashMap<>(); + map.put("count",deviceInstallService.getAllCount()); //记录数 + map.put("data",deviceInstallService.getAllDevice(page,limit)); //数据集 + return HttpResult.ok(map); + } + + // 删除多 + @PostMapping(value="/deletes") + public HttpResult delete(@RequestBody List records) { + return HttpResult.ok(deviceInstallService.deleteDevice(records)); + } + + // 删除单个 + @SysLogger(title="基表信息",optDesc = "删除基表信息") + @PostMapping(value="/delete") + public HttpResult delete(@RequestParam String id ) { + return HttpResult.ok(deviceInstallService.deleteDevice(id)); + } + + // 按条件查询 + @SysLogger(title="基表信息",optDesc = "按条件查询基表信息") + @PostMapping(value="/query") + public HttpResult queryDevice( @RequestParam(value = "buildingId", required = false)String buildingId, + @RequestParam(value = "deviceType", required = false)String deviceType, + @RequestParam(value = "startDate", required = false)String startDate, + @RequestParam(value = "endDate", required = false)String endDate, + @RequestParam(value = "isOnline", required=false)String isOnline, + @RequestParam(value = "isUse", required=false)String isUse, + @RequestParam(value = "isFault", required=false)String isFault, + @RequestParam(value = "page", required=true)Integer page, + @RequestParam(value = "limit", required=true)Integer limit) { + try{ + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String curDate=sdf1.format(date); + dealDataService.proDeviceState(curDate); //刷新统计设备状态数据 + + int count=deviceInstallService.getCount(buildingId,deviceType, startDate, endDate,isOnline,isUse,isFault, page,limit); + List records=deviceInstallService.queryDevice(buildingId,deviceType, startDate, endDate,isOnline,isUse,isFault, page,limit); + return HttpResult.ok(count,records); + }catch (Exception e){ + //e.printStackTrace(); + return HttpResult.error(); + } + } + + //查询设备在线情况 + @PostMapping(value="/getIsOnline") + public HttpResult getIsOnlineCount(){ + try { + Map map = new HashMap<>(); + int electCount = deviceInstallService.getIsOnlineCount("在线", "电表"); + int wtCount = deviceInstallService.getIsOnlineCount("在线", "水表"); + int pumpCount = deviceInstallService.getIsOnlineCount("在线", "热泵"); + int pressCount = deviceInstallService.getIsOnlineCount("在线", "压变"); + int deviceCount = deviceInstallService.getAllCount(); + + map.put("electCount", electCount); + map.put("wtCount", wtCount); + map.put("pumpCount", pumpCount); + map.put("pressCount", pressCount); + map.put("deviceCount", deviceCount); + + return HttpResult.ok(map); + } catch(Exception e){ + return HttpResult.error(); + } + } + + // 资料批量上传 + @PostMapping("/import_devices") + public HttpResult importExcel(@RequestParam(value = "file") MultipartFile file, HttpServletRequest req) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + HttpResult httpResult=new HttpResult(); + String token = req.getHeader("token"); + try { + int is=0; //判断是否有重复表号 + String msg=""; + List a = new ArrayList(); + InputStream inputStream = file.getInputStream(); + //创建工作簿 + HSSFWorkbook hssfWorkbook = new HSSFWorkbook(inputStream); + System.out.println("xssfWorkbook对象:" + hssfWorkbook); + //读取第一个工作表 + HSSFSheet sheet = hssfWorkbook.getSheetAt(0); + System.out.println("sheet对象:" + sheet); + //获取最后一行的num,即总行数。此处从0开始计数 + int maxRow = sheet.getLastRowNum(); + System.out.println("总行数为:" + maxRow); + if (maxRow >= 500){ + msg = "总行数不能超出500行"; + httpResult.setMsg(msg); + httpResult.setCode(500); + return httpResult; + } + if (maxRow == 0){ + msg = "请先录入数据到excel文件"; + httpResult.setMsg(msg); + httpResult.setCode(500); + return httpResult; + } + //先清临时表 +// deviceInstallService.deleteDevice_install_temp(); + // 创建数组集合 + List uploadEntityList = new ArrayList<>(); + List deviceList = new ArrayList<>(); + for (int row = 1; row <= maxRow; row++) { + //获取最后单元格num,即总单元格数 ***注意:此处从1开始计数*** + int maxRol = sheet.getRow(row).getLastCellNum(); + System.out.println("总列数为:" + maxRol); + System.out.println("--------第" + row + "行的数据如下--------"); + for (int rol = 0; rol < maxRol; rol++){ + String sCell; + if (sheet.getRow(row).getCell(rol) == null){ + sCell=""; + }else{ + HSSFCell cell = sheet.getRow(row).getCell(rol); + cell.setCellType(CellType.STRING); + sCell = cell.getStringCellValue(); + } + sCell = sCell.trim(); //去首尾空格 + sCell = sCell.replaceAll(" ", ""); //去掉所有空格,包括首尾、中间 + sCell = sCell.replaceAll("\\s*", ""); //可以替换大部分空白字符, 不限于空格,\s 可以匹配空格、制表符、换页符等空白字符的其中任意一个 + System.out.print(sCell + " "); + deviceList.add(sCell); + String rolName = ""; + switch (rol){ + case 1 : + rolName = "通讯编号"; + break; + case 2 : + rolName = "设备名称"; + break; + case 3 : + rolName = "设备类型"; + break; + case 4 : + rolName = "通讯端口"; + break; + case 5 : + rolName = "波特率"; + break; + case 6 : + rolName = "倍率"; + break; + case 7 : + rolName = "品牌"; + break; + case 8 : + rolName = "型号"; + break; + case 9 : + rolName = "安装人员"; + break; + case 10 : + rolName = "所属楼栋"; + break; + } + if ((rol >= 1)&&(rol <= 4)&&(sCell.equals(""))){ + msg = rolName + "不能为空" ; + httpResult.setMsg(msg); + httpResult.setCode(500); + return httpResult; + } + } + // 创建实体类 + DeviceInstallEntity uploadEntity=new DeviceInstallEntity(); + uploadEntity.setDeviceAddr(deviceList.get(0));//通讯编号 + uploadEntity.setDeviceName(deviceList.get(1));//设备名称 + uploadEntity.setDeviceType(deviceList.get(2));//设备类型 + uploadEntity.setDataCom(deviceList.get(3));//通讯端口 + uploadEntity.setBaudRate(Integer.parseInt(deviceList.get(4)));//波特率 + uploadEntity.setRatio(Double.parseDouble(deviceList.get(5)));//倍率 + uploadEntity.setBrand(deviceList.get(6));//品牌 + uploadEntity.setModel(deviceList.get(7));//型号 + uploadEntity.setInstaller(deviceList.get(8));//安装人员 + uploadEntity.setBuildingId(deviceList.get(9));//所属楼栋 + deviceList.clear(); + + uploadEntityList.add(uploadEntity); + is=deviceInstallService.selectDeviceCount(uploadEntity.getDeviceAddr(),uploadEntity.getDeviceType()); + if (is>0){ + httpResult.setMsg("通讯编号有重复!"); + httpResult.setCode(500); +// return httpResult; + } + } + + if (is==0){ + for (DeviceInstallEntity deviceInstallEntity:uploadEntityList){ + deviceInstallService.saveDevice(deviceInstallEntity); + } + httpResult.setMsg("success"); + httpResult.setCode(200); + return httpResult; + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return httpResult; + } + + // 修改使用状态 + @PostMapping(value="/isUse") + public HttpResult updateDeviceIsUse(@RequestParam(value = "isUse") String isUse, + @RequestParam(value = "deviceAddr") String deviceAddr) { + deviceInstallService.updateDeviceIsUse(isUse,deviceAddr); + return HttpResult.ok(); + } + + @PostMapping(value="/name") + public HttpResult selectDevices(@RequestParam(value = "buildingId", required = false)String buildingId, + @RequestParam(value = "deviceType", required = false)String deviceType) { + try{ + List list; + if(deviceType.equals("热泵")){ + list=deviceInstallService.selectDevices(buildingId,deviceType); + if (list.size()==0){ + String addr; + String name; + for(int i=1;i<8;i++){ + DeviceModel d1=new DeviceModel(); + addr=String.valueOf(i); + name="热泵"+addr; + d1.setDeviceAddr(addr); + d1.setDeviceName(name); + list.add(d1); + } + //System.out.println(list); +// DeviceModel d2=new DeviceModel(); +// d2.setDeviceAddr("2"); +// d2.setDeviceName("热泵2"); +// list.add(d2); +// +// DeviceModel d3=new DeviceModel(); +// d3.setDeviceAddr("3"); +// d3.setDeviceName("热泵3"); +// list.add(d3); +// +// DeviceModel d4=new DeviceModel(); +// d4.setDeviceAddr("4"); +// d4.setDeviceName("热泵4"); +// list.add(d4); +// +// DeviceModel d5=new DeviceModel(); +// d5.setDeviceAddr("5"); +// d5.setDeviceName("热泵5"); +// list.add(d5); + } + }else{ + list=deviceInstallService.selectDevices(buildingId,deviceType); + } + + return HttpResult.ok(list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } + + // 查询品牌 + @PostMapping(value="/brand") + public HttpResult selectBrand(@RequestParam(value = "buildingId") String buildingId, + @RequestParam(value = "deviceAddr") String deviceAddr) { + return HttpResult.ok(deviceInstallService.selectBrand(buildingId,deviceAddr)); + } + + //判断楼栋是否有热泵设备 + @PostMapping(value="/pump") + public HttpResult judgePump(@RequestParam(value = "buildingId") String buildingId) { + int data=deviceInstallService.judgePump(buildingId); + return HttpResult.ok("success",data); + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/EnergyController.java b/user-service/src/main/java/com/mh/user/controller/EnergyController.java new file mode 100644 index 0000000..28ea980 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/EnergyController.java @@ -0,0 +1,215 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.EnergyEntity; +import com.mh.user.model.SumModel; +import com.mh.user.service.BuildingService; +import com.mh.user.service.EnergyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("energy") +public class EnergyController { + + @Autowired + EnergyService energyService; + + @Autowired + BuildingService buildingService; + + @SysLogger(title="用能分析",optDesc = "保存能耗信息") + @PostMapping("/save") + public HttpResult saveEnergy(@RequestBody EnergyEntity energyEntity, @RequestParam(value = "type") int type){ + try{ + energyService.saveEnergy(energyEntity,type); + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error("保存出错!"); + } + + } + + @SysLogger(title="用能分析",optDesc = "修改能耗信息") + @PostMapping("/update") + public HttpResult updateEnergy(@RequestBody EnergyEntity energyEntity, @RequestParam(value = "type") int type){ + try{ + energyService.updateEnergy(energyEntity,type); + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error("修改出错!"); + } + + } + + @PostMapping("/delete") + @SysLogger(title="用能分析",optDesc = "删除能耗信息") + public HttpResult deleteEnergy(@RequestParam(value = "curDate") String curDate, + @RequestParam(value = "buildingId") String buildingId, + @RequestParam(value = "type") int type){ + try{ + + energyService.deleteEnergy(curDate,buildingId,type); + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error("删除出错!"); + } + + } + + @SysLogger(title="用能分析",optDesc = "查询能耗信息") + @PostMapping("/query") + public HttpResult queryEnergy(@RequestParam(value = "buildingId",required = false) String buildingId, + @RequestParam(value = "startDate",required = false) String startDate, + @RequestParam(value = "endDate",required = false) String endDate, + @RequestParam(value = "page") int page, + @RequestParam(value = "limit") int limit, + @RequestParam(value = "type") int type){ + try{ + String areaId=""; + if (buildingId!=null && buildingId.length()>0){ + if (!buildingId.equals("所有")){ + areaId=buildingService.queryAreaId(Integer.parseInt(buildingId)); + } + } + List list=new ArrayList<>(); + int count=0; + if (areaId!=null && areaId.length()>0){ + list=energyService.queryEnergy(areaId,startDate,endDate,page,limit,type); + count=energyService.getEnergyCount(areaId,startDate,endDate,page,limit,type); + }else{ + list=energyService.queryEnergy(buildingId,startDate,endDate,page,limit,type); + count=energyService.getEnergyCount(buildingId,startDate,endDate,page,limit,type); + } +// System.out.println("返回前端数据:"+list); + return HttpResult.ok(count,list); + }catch (Exception e){ +// e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + + } + + //主界面水、电、单耗查询 + @SysLogger(title="项目概况",optDesc = "查询能耗信息") + @PostMapping("/queryGroup") + public HttpResult queryEnergyGroup(@RequestParam(value = "curDate",required = true) String curDate, + @RequestParam(value = "type",required = true,defaultValue = "1") int type){ + try{ + List list=new ArrayList(); + list=energyService.queryEnergyGroup(curDate,type); + return HttpResult.ok(list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + + } + + //查询每天的用量 + @SysLogger(title="用能分析",optDesc = "查询每天的用量") + @PostMapping("/queryDay") + public HttpResult queryDayEnergy(@RequestParam(value = "buildingId",required = false) String buildingId, + @RequestParam(value = "startDate",required = false) String startDate, + @RequestParam(value = "endDate",required = false) String endDate, + @RequestParam(value = "page") int page, + @RequestParam(value = "limit") int limit){ + try{ + String areaId=""; + if (buildingId!=null && buildingId.length()>0){ + if (!buildingId.equals("所有")){ + areaId=buildingService.queryAreaId(Integer.parseInt(buildingId)); + } + } + List list; + int count=0; + if (areaId!=null && areaId.length()>0){ + list=energyService.queryDayEnergy(areaId,startDate,endDate,page,limit); + count=energyService.getDayEnergyCount(areaId,startDate,endDate,page,limit); + }else{ + list=energyService.queryDayEnergy(buildingId,startDate,endDate,page,limit); + count=energyService.getDayEnergyCount(buildingId,startDate,endDate,page,limit); + } + + return HttpResult.ok(count,list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + + } + + //查询小时的用量 + @SysLogger(title="用能分析",optDesc = "查询小时的用量") + @PostMapping("/queryHour") + public HttpResult queryHourEnergy(@RequestParam(value = "buildingId",required = false) String buildingId, + @RequestParam(value = "curDate",required = false) String curDate, + @RequestParam(value = "page") int page, + @RequestParam(value = "limit") int limit){ + try{ + String areaId=""; + if (buildingId!=null && buildingId.length()>0){ + if (!buildingId.equals("所有")){ + areaId=buildingService.queryAreaId(Integer.parseInt(buildingId)); + } + } + List list; + int count=0; + if (areaId!=null && areaId.length()>0){ + list=energyService.queryHourEnergy(areaId,curDate,page,limit); + count=energyService.getHourEnergyCount(areaId,curDate); + }else{ + list=energyService.queryHourEnergy(buildingId,curDate,page,limit); + count=energyService.getHourEnergyCount(buildingId,curDate); + } + + return HttpResult.ok(count,list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + + } + + //查询楼栋时段用量对比 + @SysLogger(title="用能分析",optDesc = "查询楼栋时段用量对比") + @PostMapping("/queryBuild") + public HttpResult queryEnergyBuilding(@RequestParam(value = "curDate",required = false) String curDate, + @RequestParam(value = "endDate",required = false) String endDate, + @RequestParam(value = "type",required = false) int type, + @RequestParam(value = "page") int page, + @RequestParam(value = "limit") int limit){ + try{ + energyService.proEnergyBuilding(curDate,endDate,type); + List list=energyService.queryEnergyBuilding(page,limit); + SumModel list2=energyService.queryEnergySum(); + Map map=new HashMap<>(); + map.put("a",list); + map.put("b",list2); + int count=energyService.getEnergyBuildingCount(); + return HttpResult.ok(count,map); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + } + + //查询合计 + @SysLogger(title="用能分析",optDesc = "查询合计") + @PostMapping("/querySum") + public HttpResult queryEnergySum(){ + try{ + SumModel list=energyService.queryEnergySum(); + return HttpResult.ok(list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/GatewayManageController.java b/user-service/src/main/java/com/mh/user/controller/GatewayManageController.java new file mode 100644 index 0000000..99176aa --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/GatewayManageController.java @@ -0,0 +1,62 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.entity.GatewayManageEntity; +import com.mh.user.service.impl.DeviceDisplayServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("gateway") +public class GatewayManageController { + + @Autowired + private DeviceDisplayServiceImpl.GatewayManageService gatewayManageService; + + //保存 + @PostMapping(value="/save") + public HttpResult addOrUpdateGateWayInfo(@RequestBody GatewayManageEntity gatewayManageEntity) { +// try{ +// gatewayManageService.addOrUpdateGateWayInfo(gatewayManageEntity); +// return HttpResult.ok(); +// }catch (Exception e){ +// return HttpResult.error(); +// } + + gatewayManageService.addOrUpdateGateWayInfo(gatewayManageEntity); + return HttpResult.ok(); + } + + // 按条件查询 + @PostMapping(value="/query") + public HttpResult queryAll( @RequestParam(value = "gatewayID", required = false)String gatewayID, + @RequestParam(value = "operator", required = false)String operator, + @RequestParam(value = "grade", required = false)String grade, + @RequestParam(value= "page", required=true)Integer page, + @RequestParam(value= "limit", required=true)Integer limit) { + try{ + int count=gatewayManageService.queryCount(gatewayID,operator,grade); + List records=gatewayManageService.queryAll(gatewayID,operator, grade,page,limit); + return HttpResult.ok(count,records); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + + } + + // 删除 + @PostMapping(value="/delete") + public HttpResult deleteGatewayManageByID( @RequestParam(value = "gatewayID")String gatewayID){ + try{ + gatewayManageService.deleteGatewayManageByID(Integer.parseInt(gatewayID)); + return HttpResult.ok(); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/MaintainInfoController.java b/user-service/src/main/java/com/mh/user/controller/MaintainInfoController.java new file mode 100644 index 0000000..77ffbc5 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/MaintainInfoController.java @@ -0,0 +1,75 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.EnergyEntity; +import com.mh.user.entity.MaintainInfoEntity; +import com.mh.user.service.BuildingService; +import com.mh.user.service.MaintainInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("maintain") +public class MaintainInfoController { + + @Autowired + MaintainInfoService maintainInfoService; + + @Autowired + BuildingService buildingService; + + @SysLogger(title="维修保养",optDesc = "保存维修保养记录") + @PostMapping("/save") + public HttpResult saveMaintainInfo(@RequestBody MaintainInfoEntity maintainInfoEntity){ + try{ + maintainInfoService.saveMaintainInfo(maintainInfoEntity); + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error(); + } + } + + @SysLogger(title="维修保养",optDesc = "修改维修保养记录") + @PostMapping("/update") + public HttpResult updateMaintainInfo(@RequestBody MaintainInfoEntity maintainInfoEntity){ + try{ + maintainInfoService.updateMaintainInfo(maintainInfoEntity); + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error(); + } + } + + @SysLogger(title="维修保养",optDesc = "查询维修保养记录") + @PostMapping("/query") + public HttpResult queryMaintainInfo(@RequestParam(value = "curDate",required = false) String curDate, + @RequestParam(value = "buildingId",required = false) String buildingId, + @RequestParam(value = "deviceType",required = false) String deviceType, + @RequestParam(value = "page") int page, + @RequestParam(value = "limit") int limit){ + try{ + List list=maintainInfoService.queryMaintainInfo(curDate,buildingId,deviceType,page,limit); + int count=maintainInfoService.getMaintainInfoCount(curDate,buildingId,deviceType,page,limit); + return HttpResult.ok(count,list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } + + @SysLogger(title="维修保养",optDesc = "删除维修保养记录") + @PostMapping("/delete") + public HttpResult deleteMaintainInfo(@RequestParam(value = "id") String id){ + try{ + maintainInfoService.deleteMaintainInfo(id); + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error(); + } + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/NowDataController.java b/user-service/src/main/java/com/mh/user/controller/NowDataController.java new file mode 100644 index 0000000..7543764 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/NowDataController.java @@ -0,0 +1,231 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.BusinessType; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.*; +import com.mh.user.model.DeviceModel; +import com.mh.user.model.PumpModel; +import com.mh.user.model.WaterLevelModel; +import com.mh.user.service.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@RestController +@RequestMapping("monitor") +public class NowDataController { + + @Autowired + NowDataService nowDataService; + + @Autowired + BuildingService buildingService; + + @Autowired + NowPublicDataService nowPublicDataService; + + @Autowired + DeviceInstallService deviceInstallService; + + @Autowired + DeviceFloorService deviceFloorService; + + @SysLogger(title="实时监控",optDesc = "实时查看每楼栋热水运行情况") + @PostMapping("/queryNow") + public HttpResult queryNowData(@RequestParam(value = "buildingId") String buildingId){ + try{ + //把热泵的水温保存到公共信息中中的用水温度和回水温度 + String avgWaterTemp=nowDataService.selectAve(buildingId); + String buildingName=buildingService.queryBuildingName(buildingId);//获取楼栋名称 + + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + String curDate=sdf1.format(date); + curDate=curDate.substring(0,13)+":00:00"; + + NowPublicDataEntity nowPublicData=new NowPublicDataEntity(); + nowPublicData.setBuildingId(buildingId); + nowPublicData.setBuildingName(buildingName); + if (avgWaterTemp!=null){ + nowPublicData.setBackWaterTemp(avgWaterTemp); + nowPublicData.setUseWaterTemp(avgWaterTemp); + }else{ + nowPublicData.setBackWaterTemp("0"); + nowPublicData.setUseWaterTemp("0"); + } + nowPublicDataService.saveNowHistoryPublicData(nowPublicData); + + //监视表生成初始记录 + List list=nowDataService.queryNowData(buildingId); + if (list.size()==0){//实时表生成记录 + List deviceList=deviceInstallService.selectDevices(buildingId,"热泵"); + if (deviceList.size()>0){ + for (DeviceModel list2:deviceList){ + NowDataEntity nowData=new NowDataEntity(); + nowData.setPumpId(list2.getDeviceAddr()); + nowData.setPumpName(list2.getDeviceName()); + nowData.setBuildingId(buildingId); + nowData.setBuildingName(buildingName); + nowData.setCurDate(curDate); + nowDataService.saveNowData(nowData); //当前状态表 + nowDataService.saveHistoryData(nowData); //历史状态表 + } + }else{ + NowDataEntity nowData=new NowDataEntity(); + PumpModel pump=deviceFloorService.selectDeviceId2("热泵",buildingId); + if (pump!=null){ + nowData.setPumpId(pump.getPumpId()); + nowData.setPumpName(pump.getPumpName()); + nowData.setBuildingId(buildingId); + nowData.setBuildingName(buildingName); + nowData.setCurDate(curDate); + nowDataService.saveNowData(nowData); + nowDataService.saveHistoryData(nowData); + } + } + } + list=nowDataService.queryNowData(buildingId); + return HttpResult.ok(list); + }catch (Exception e){ +// e.printStackTrace(); + return HttpResult.error("查询当前监控状态出错!"); + } + } + + @SysLogger(title="实时监控",optDesc = "分别查看热泵运行情况") + @PostMapping("/queryNowByPump") + public HttpResult queryNowByPump(@RequestParam(value = "buildingId") String buildingId,@RequestParam(value = "pumpId") String pumpId){ + try{ + NowDataEntity nowDataEntity=nowDataService.queryNowDataByPump(buildingId,pumpId); + return HttpResult.ok(nowDataEntity); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error("按热泵查询当前监控状态出错!"); + } + + } + + @SysLogger(title="运行信息",optDesc = "热泵历史状态查询") + @PostMapping("/query") + public HttpResult queryHistoryData(@RequestParam(value = "curDate") String curDate, + @RequestParam(value = "buildingId") String buildingId, + @RequestParam(value = "pumpId",required = false) String pumpId, + @RequestParam(value = "tankId",required = false) String tankId, + @RequestParam(value = "page") int page, + @RequestParam(value = "limit") int limit){ + try{ + List list; + list=nowDataService.queryHistoryData(curDate,buildingId,pumpId,tankId,page,limit); + int count=nowDataService.getHistoryDataCount(curDate,buildingId,pumpId,tankId,page,limit); + return HttpResult.ok(count,list); + }catch (Exception e){ +// e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + } + + //查询水位开始 + @SysLogger(title="水位变化表",optDesc = "水位变化查询") + @PostMapping("/waterLevel") + public HttpResult queryWaterLevel(@RequestParam(value = "curDate") String curDate, + @RequestParam(value = "buildingID") String buildingID, + @RequestParam(value = "page") int page, + @RequestParam(value = "limit") int limit){ + try{ + if (buildingID==null || buildingID.equals("") || buildingID.equals("所有楼栋")){ + List list=nowDataService.queryBuildWaterLevel(curDate, page, limit); + int count=nowDataService.buildWaterLevelCount(curDate); + return HttpResult.ok(count,list); + }else{ + List list=nowDataService.queryWaterLevel(curDate,buildingID,page,limit); + int count=nowDataService.getWaterLevelCount(curDate,buildingID); + return HttpResult.ok(count,list); + } + + }catch (Exception e){ +// e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + } + + @PostMapping("/levelByTime") + public HttpResult queryWaterLevelByTime(@RequestParam(value = "curDate") String curDate, + @RequestParam(value = "page") int page, + @RequestParam(value = "limit") int limit){ + try{ + int count=nowDataService.waterLevelByTimeCount(curDate); + List list=nowDataService.queryWaterLevelByTime(curDate,page,limit); + return HttpResult.ok(count,list); + }catch (Exception e){ +// e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + } + + //查询水位结束 + //查询水温,每天24小时情况 + @SysLogger(title="温度变化表",optDesc = "温度变化查询") + @PostMapping("/waterTemp") + public HttpResult queryWaterTemp(@RequestParam(value = "buildingID") String buildingID, + @RequestParam(value = "curDate") String curDate, + @RequestParam(value = "page") int page, + @RequestParam(value = "limit") int limit){ + try{ + List list; + int count; + if (buildingID==null || buildingID.equals("") || buildingID.equals("所有楼栋")){ + list=nowDataService.queryWaterTemp2(curDate,page,limit); + count=nowDataService.queryWaterTempCount2(curDate); + }else{ + list=nowDataService.queryWaterTemp(buildingID,curDate,page,limit); + count=nowDataService.queryWaterTempCount(buildingID,curDate); + } + return HttpResult.ok(count,list); + }catch (Exception e){ +// e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + } + + //查询运行时长 + @SysLogger(title="运行时长",optDesc = "热泵运行时长查询") + @PostMapping("/minutes") + public HttpResult pumpMinutes(@RequestParam(value = "startDate") String startDate, + @RequestParam(value = "endDate") String endDate, + @RequestParam(value = "buildingId",required = false) String buildingId, + @RequestParam(value = "pumpId",required = false) String pumpId, + @RequestParam(value = "type") int type, + @RequestParam(value = "page") int page, + @RequestParam(value = "limit") int limit){ + try{ + int count=0; + List list; + if(type==1){ + list=nowDataService.pumpMinutes(startDate,endDate,buildingId,pumpId,page,limit); + count=nowDataService.pumpMinutesCount(startDate,endDate,buildingId,pumpId); + }else if(type==2){ + list=nowDataService.pumpWeekMinutes(startDate,endDate,buildingId,pumpId,page,limit); + count=nowDataService.pumpWeekMinutesCount(startDate,endDate,buildingId,pumpId); + }else if(type==3){ + list=nowDataService.pumpMonthMinutes(startDate,endDate,buildingId,pumpId,page,limit); + count=nowDataService.pumpMonthMinutesCount(startDate,endDate,buildingId,pumpId); + }else{ + list=nowDataService.pumpMinutes(startDate,endDate,buildingId,pumpId,page,limit); + count=nowDataService.pumpMinutesCount(startDate,endDate,buildingId,pumpId); + } + + return HttpResult.ok(count,list); + }catch (Exception e){ +// e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/NowPublicDataController.java b/user-service/src/main/java/com/mh/user/controller/NowPublicDataController.java new file mode 100644 index 0000000..f5a259f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/NowPublicDataController.java @@ -0,0 +1,92 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.BusinessType; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.NowDataEntity; +import com.mh.user.entity.NowPublicDataEntity; +import com.mh.user.model.TempModel; +import com.mh.user.service.BuildingService; +import com.mh.user.service.NowDataService; +import com.mh.user.service.NowPublicDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("monitor_public") +public class NowPublicDataController { + + @Autowired + NowPublicDataService nowPublicDataService; + + @Autowired + BuildingService buildingService; + + @Autowired + NowDataService nowDataService; + + @PostMapping("/queryNow") + public HttpResult queryNowData(@RequestParam(value = "buildingId") String buildingId){ + try{ + NowPublicDataEntity nowPublicDataEntity=nowPublicDataService.queryNowPublicData(buildingId); + return HttpResult.ok(nowPublicDataEntity); + }catch (Exception e){ + //e.printStackTrace(); + return HttpResult.error("查询公共信息出错!"); + } + } + + @PostMapping("/query") + public HttpResult queryHistoryData(@RequestParam(value = "curDate") String curDate, + @RequestParam(value = "buildingId") String buildingId, + @RequestParam(value = "page") int page, + @RequestParam(value = "limit") int limit){ + try{ + List list=new ArrayList(); + list=nowPublicDataService.queryHistoryPublicData(curDate,buildingId,page,limit); + int count=nowPublicDataService.getHistoryPublicDataCount(curDate,buildingId,page,limit); + return HttpResult.ok(count,list); + }catch (Exception e){ + //e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + } + + @PostMapping("/temp") + public HttpResult buildWaterTemp(@RequestParam(value = "buildingName",required = false) String buildingName){ + try{ + if (buildingName!=null && !buildingName.equals("")){ + String buildingId=buildingService.selectBuildingId(buildingName); + TempModel tempModel=nowPublicDataService.queryWtTemp2(buildingId); + return HttpResult.ok(1,tempModel); + }else{ + List list=nowPublicDataService.queryWtTemp(); //楼栋所有水箱平均温度 + int count=list.size(); + return HttpResult.ok(count,list); + } + }catch (Exception e){ +// e.printStackTrace(); + return HttpResult.error(500,"查询楼栋水温异常!"); + } + } + +// @PostMapping("/temp") +// public HttpResult buildWaterTemp2(@RequestParam(value = "buildingName") String buildingName){ +// try{ +// String buildingId=buildingService.selectBuildingId(buildingName); +// TempModel tempModel=nowPublicDataService.queryWtTemp2(buildingId); +// return HttpResult.ok("success",tempModel); +// }catch (Exception e){ +//// e.printStackTrace(); +// return HttpResult.error(500,"查询楼栋水温异常!"); +// } +// } +} diff --git a/user-service/src/main/java/com/mh/user/controller/ReportController.java b/user-service/src/main/java/com/mh/user/controller/ReportController.java new file mode 100644 index 0000000..c674817 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/ReportController.java @@ -0,0 +1,67 @@ +package com.mh.user.controller; + +import com.alibaba.fastjson2.JSONObject; +import com.mh.common.http.HttpResult; +import com.mh.user.entity.ReportParamEntity; +import com.mh.user.service.ReportService; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author ljf + * @title :报表查询接口 + * @description : + * @updateTime 2020-07-03 + * @throws : + */ +@RestController +@RequestMapping("/report") +public class ReportController { + + private final ReportService reportService; + + public ReportController(ReportService reportService) { + this.reportService = reportService; + } + + @GetMapping("/indexInfo") + public HttpResult queryAllTarget(@RequestParam(value = "type",required = false) String type) { + List reportParamEntities = reportService.queryAllTarget(type); + List firstLevel = reportParamEntities.stream().filter(p -> String.valueOf(p.getParentId()).equals("0")).collect(Collectors.toList()); + System.out.println(firstLevel.toString()); + firstLevel.parallelStream().forEach(p -> { + setChild(p, reportParamEntities); + }); + JSONObject menuListJson = new JSONObject(); + menuListJson.put("indexInfo",firstLevel); + System.out.println(menuListJson.toJSONString()); + return HttpResult.ok("success", menuListJson); + + } + + /** + * 设置子元素 + * 2018.06.09 + * + * @param p + * @param reportParamEntities + */ + private void setChild(ReportParamEntity p, List reportParamEntities) { +// System.out.println(p.getId()); + List child = reportParamEntities.parallelStream().filter(a -> String.valueOf(a.getParentId()).equals(String.valueOf(p.getId()))).collect(Collectors.toList()); + p.setChildren(child); + if (!CollectionUtils.isEmpty(child)) { + child.parallelStream().forEach(c -> { + //递归设置子元素,多级菜单支持 + setChild(c, reportParamEntities); + }); + } + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/SerialPortController.java b/user-service/src/main/java/com/mh/user/controller/SerialPortController.java new file mode 100644 index 0000000..283dfa6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SerialPortController.java @@ -0,0 +1,423 @@ +package com.mh.user.controller; + +import com.alibaba.fastjson2.JSONObject; +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.SysLogger; +import com.mh.user.constants.Constant; +import com.mh.user.entity.ControlSetEntity; +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.entity.DeviceInstallEntity; +import com.mh.user.entity.PumpSetEntity; +import com.mh.user.model.DeviceModel; +import com.mh.user.model.SerialPortModel; +import com.mh.user.serialport.SerialPortSendReceive; +import com.mh.user.serialport.SerialPortSingle; +import com.mh.user.service.ControlSetService; +import com.mh.user.service.DeviceInstallService; +import com.mh.user.service.NowDataService; +import com.mh.user.service.PumpSetService; +import com.mh.user.utils.ExchangeStringUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +@Slf4j +@RestController +@RequestMapping("serial") +public class SerialPortController { + + @Autowired + DeviceInstallService deviceInstallService; + + @Autowired + PumpSetService pumpSetService; + + @Autowired + ControlSetService controlSetService; + + @Autowired + NowDataService nowDataService; + + //操作设备 + @SysLogger(title="控制管理",optDesc = "设置设备参数值") + @PostMapping(value="/operate") + public HttpResult operateDevice(@RequestBody List params){ + try{ + SerialPortSingle serialPortSingle = new SerialPortSingle(); //发送接收类 + DeviceCodeParamEntity deviceCodeParam=new DeviceCodeParamEntity();//参数实体类 + + Constant.WEB_FLAG=true; //单抄,暂时停止采集 + for (SerialPortModel serialPortModel : + params) { + String deviceAddr=serialPortModel.getDeviceAddr();//设备通讯地址 + String deviceType=serialPortModel.getDeviceType();//设备类型 + String buildingId=serialPortModel.getBuildingId();//楼栋 + String param=serialPortModel.getParam();//操作参数 + if (deviceAddr==null || deviceAddr=="" ){ + List list=deviceInstallService.selectDevices(buildingId,deviceType); + deviceAddr=list.get(0).getDeviceAddr(); + } + if(deviceAddr!=null && deviceAddr.length()>0){ + DeviceInstallEntity deviceInstallEntity=deviceInstallService.selectDevice(deviceAddr,deviceType,buildingId); + //发送指令实体类 + deviceCodeParam.setDeviceAddr(deviceAddr); //传入通讯编号 + deviceCodeParam.setDeviceType(deviceType); + deviceCodeParam.setDataCom(deviceInstallEntity.getDataCom()); + deviceCodeParam.setBaudrate(deviceInstallEntity.getBaudRate()); + deviceCodeParam.setParity(deviceInstallEntity.getParity()); + deviceCodeParam.setDataValue(serialPortModel.getDataValue());//传入相关参数值 + deviceCodeParam.setBuildingId(buildingId); + String brand=deviceInstallEntity.getBrand();//品牌 + deviceCodeParam.setBrand(brand); + + ControlSetEntity controlData=new ControlSetEntity(); + //设置设备实体对象 + controlData.setBuildingId(deviceInstallEntity.getBuildingId()); + + if (deviceType==null || deviceType.equals("") || deviceType.equals("热泵")){ + //设置热泵实体对象 + PumpSetEntity pumpData=new PumpSetEntity(); + pumpData.setBuildingId(deviceInstallEntity.getBuildingId()); + pumpData.setPumpId(deviceAddr); + if (param==null || param.equals("") || param.equals("温度设定")){ + //发送指令 + if (brand.equals("美的")){ + deviceCodeParam.setRegisterAddr("0642"); //寄存器地址 + deviceCodeParam.setFunCode("10"); //功能码写数据 + }else{ + deviceCodeParam.setRegisterAddr("0003"); //寄存器地址 + deviceCodeParam.setFunCode("06"); //功能码写数据 + } + //保存数据 + pumpData.setTempSet(serialPortModel.getDataValue()); + pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库 + + nowDataService.upTempSet2(buildingId,serialPortModel.getDataValue(),deviceAddr);//更新实时状态表 + log.info("楼栋编号:"+buildingId+",设定温度:"+serialPortModel.getDataValue()+",热泵编号:"+deviceAddr); + }else if(param.equals("时段1")){ + if (brand.equals("美的")) { + //发送指令 + deviceCodeParam.setRegisterAddr("0656"); //寄存器地址 + deviceCodeParam.setFunCode("10"); //功能码写数据 + //保存数据 + String time=serialPortModel.getDataValue(); + if (time.length()==8){ + String statTime=time.substring(0,2)+":"+time.substring(2,4); + String closeTime=time.substring(4,6)+":"+time.substring(6,8); + pumpData.setStartTime1(statTime); + pumpData.setCloseTime1(closeTime); + } + pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库 + } + }else if(param.equals("时段2")){ + if (brand.equals("美的")) { + //发送指令 + deviceCodeParam.setRegisterAddr("065A"); //寄存器地址 + deviceCodeParam.setFunCode("10"); //功能码写数据 + //保存数据 + String time=serialPortModel.getDataValue(); + if (time.length()==8){ + String statTime=time.substring(0,2)+":"+time.substring(2,4); + String closeTime=time.substring(4,6)+":"+time.substring(6,8); + pumpData.setStartTime2(statTime); + pumpData.setCloseTime2(closeTime); + } + pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库 + } + } + }else if (deviceType.equals("时控")){ + deviceCodeParam.setFunCode("10"); //功能码写数据 + String time=serialPortModel.getDataValue(); + if (time.length()==16){ + //时段1 HHmmHHmm + String statTime1=time.substring(0,2)+":"+time.substring(2,4); //HH:mm + String closeTime1=time.substring(4,6)+":"+time.substring(6,8); //HH:mm + //时段2 + String statTime2=time.substring(8,10)+":"+time.substring(10,12); + String closeTime2=time.substring(12,14)+":"+time.substring(14,16); + if(param.equals("L1")){ + deviceCodeParam.setRegisterAddr("0009"); //寄存器地址,L3路,L1(0009),L2(000D) + controlData.setUseStartTime1(statTime1); + controlData.setUseCloseTime1(closeTime1); + controlData.setUseStartTime2(statTime2); + controlData.setUseCloseTime2(closeTime2); + }else if(param.equals("L2")){ + deviceCodeParam.setRegisterAddr("000D"); + controlData.setUseStartTime3(statTime1); + controlData.setUseCloseTime3(closeTime1); + controlData.setUseStartTime4(statTime2); + controlData.setUseCloseTime4(closeTime2); + }else{ + deviceCodeParam.setRegisterAddr("0011"); + controlData.setUseStartTime5(statTime1); + controlData.setUseCloseTime5(closeTime1); + controlData.setUseStartTime6(statTime2); + controlData.setUseCloseTime6(closeTime2); + } + } + controlSetService.saveControlSet(controlData); //保存设置内容 + }else if (deviceType.equals("水位开关")){ + if (brand==null || brand.equals("") || brand.equals("中凯")){//品牌 + deviceCodeParam.setFunCode("12"); //功能码写数据 + if (!serialPortModel.getDataValue().equals("100%")){ + deviceCodeParam.setDataValue("100%"); + serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 + Thread.sleep(1500); + } + }else if(brand.equals("远向")){ + deviceCodeParam.setFunCode("06"); //功能码写数据 + if (!serialPortModel.getDataValue().equals("100%")){ + deviceCodeParam.setDataValue("100%"); + serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 + Thread.sleep(1500); + } + }else if(brand.equals("顶威")){ + deviceCodeParam.setFunCode("0407"); //功能码写数据 + } + deviceCodeParam.setDataValue(serialPortModel.getDataValue()); + //controlData.setLevelSet(serialPortModel.getDataValue()); + //controlSetService.saveControlSet(controlData); + nowDataService.upLevelSet(buildingId,serialPortModel.getDataValue());//更新实时状态表 + } + serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 + }else{ + return HttpResult.error("通讯ID为空!"); + } + } + Constant.WEB_FLAG=false; //单抄,恢复采集 + return HttpResult.ok(); + }catch(Exception e){ +// e.printStackTrace(); + Constant.WEB_FLAG=false; //单抄,恢复采集 + return HttpResult.error(500,"fail"); + } + } + + //读数据 + @SysLogger(title="控制管理",optDesc = "读设备数据") + @PostMapping(value="/read") + public HttpResult readData(@RequestBody List params){ + try{ + SerialPortSingle serialPortSingle = new SerialPortSingle(); + DeviceCodeParamEntity deviceCodeParam=new DeviceCodeParamEntity(); + String rtData=""; //返回值 + Constant.WEB_FLAG=true; //单抄,暂时停止采集 + for (SerialPortModel serialPortModel : + params) { + String deviceAddr=serialPortModel.getDeviceAddr();//设备通讯地址 + String deviceType=serialPortModel.getDeviceType();//设备类型 + String buildingId=serialPortModel.getBuildingId();//楼栋 + String param=serialPortModel.getParam();//操作参数 + if (deviceAddr==null || deviceAddr=="" ){ + List list=deviceInstallService.selectDevices(buildingId,deviceType); + deviceAddr=list.get(0).getDeviceAddr(); + } + if(deviceAddr!=null && deviceAddr.length()>0){ + DeviceInstallEntity deviceInstallEntity=deviceInstallService.selectDevice(deviceAddr,deviceType,buildingId); + //发送指令实体类 + deviceCodeParam.setDeviceAddr(deviceAddr); + deviceCodeParam.setDeviceType(deviceType); + deviceCodeParam.setDataCom(deviceInstallEntity.getDataCom()); + deviceCodeParam.setBaudrate(deviceInstallEntity.getBaudRate()); + deviceCodeParam.setParity(deviceInstallEntity.getParity()); + deviceCodeParam.setDataValue(serialPortModel.getDataValue());//传入相关参数值 + deviceCodeParam.setBuildingId(buildingId); + String brand=deviceInstallEntity.getBrand();//品牌 + deviceCodeParam.setBrand(brand); + //设置设备实体对象 + ControlSetEntity controlData=new ControlSetEntity(); + controlData.setBuildingId(deviceInstallEntity.getBuildingId()); + if (deviceType==null || deviceType.equals("") || deviceType.equals("热泵")){ + //设置热泵实体对象 + PumpSetEntity pumpData=new PumpSetEntity(); + pumpData.setBuildingId(deviceInstallEntity.getBuildingId()); + pumpData.setPumpId(deviceAddr); + if (param==null || param.equals("") || param.equals("读温度设定")){ + deviceCodeParam.setFunCode("03"); //功能码读数据 + if (brand.equals("美的")){ + deviceCodeParam.setRegisterAddr("0642"); //寄存器地址 + }else{ + deviceCodeParam.setRegisterAddr("0003"); //寄存器地址 + } + rtData=serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 + if (!rtData.equals("")){ + pumpData.setTempSet(rtData); + pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库 + } + } else if (param.equals("实际温度")){ + deviceCodeParam.setFunCode("03"); //功能码读数据 + if (brand.equals("美的")){ + deviceCodeParam.setRegisterAddr("0007"); //寄存器地址 + }else{ + deviceCodeParam.setRegisterAddr("0064"); //寄存器地址 + } + rtData=serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 + if (!rtData.equals("")){ + pumpData.setWaterTemp(rtData); + pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库 + } + } else if (param.equals("运行状态")){ + deviceCodeParam.setFunCode("03"); //功能码读数据 + if (brand.equals("美的")){ + deviceCodeParam.setRegisterAddr("0641"); //寄存器地址 + }else{ + deviceCodeParam.setRegisterAddr("0BBD"); //寄存器地址 + } + rtData=serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 + //pumpData(rtData); + //pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库 + } else if(param.equals("时段1")){ + if (brand.equals("美的")) { + //发送指令 + deviceCodeParam.setRegisterAddr("0656"); //寄存器地址 + deviceCodeParam.setFunCode("03"); //功能码读数据 + //保存数据 + rtData=serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 + String time=rtData; + if (time.length()==8){ + String statTime=time.substring(0,2)+":"+time.substring(2,4); + String closeTime=time.substring(4,6)+":"+time.substring(6,8); + pumpData.setStartTime1(statTime); + pumpData.setCloseTime1(closeTime); + } + pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库 + } + }else if(param.equals("时段2")){ + if (brand.equals("美的")) { + //发送指令 + deviceCodeParam.setRegisterAddr("065A"); //寄存器地址 + deviceCodeParam.setFunCode("03"); //功能码读数据 + //保存数据 + rtData=serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 + String time=rtData; + if (time.length()==8){ + String statTime=time.substring(0,2)+":"+time.substring(2,4); + String closeTime=time.substring(4,6)+":"+time.substring(6,8); + pumpData.setStartTime2(statTime); + pumpData.setCloseTime2(closeTime); + } + pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库 + } + } + }else if (deviceType.equals("时控")){ + if(param.equals("L1")){ + deviceCodeParam.setRegisterAddr("0009"); //寄存器地址,L3路,L1(0009),L2(000D) + }else if(param.equals("L2")){ + deviceCodeParam.setRegisterAddr("000D"); + }else{ + deviceCodeParam.setRegisterAddr("0011"); + } + deviceCodeParam.setFunCode("03"); //功能码读数据 + rtData=serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 + + String time=rtData; + if (time.length()==16){ + //时段1 + String statTime1=time.substring(0,2)+":"+time.substring(2,4); + String closeTime1=time.substring(4,6)+":"+time.substring(6,8); + //时段2 + String statTime2=time.substring(8,10)+":"+time.substring(10,12); + String closeTime2=time.substring(12,14)+":"+time.substring(14,16); + + if(param.equals("L1")){ + controlData.setUseStartTime1(statTime1); + controlData.setUseCloseTime1(closeTime1); + controlData.setUseStartTime2(statTime2); + controlData.setUseCloseTime2(closeTime2); + }else if(param.equals("L2")){ + controlData.setUseStartTime3(statTime1); + controlData.setUseCloseTime3(closeTime1); + controlData.setUseStartTime4(statTime2); + controlData.setUseCloseTime4(closeTime2); + }else{ + controlData.setUseStartTime5(statTime1); + controlData.setUseCloseTime5(closeTime1); + controlData.setUseStartTime6(statTime2); + controlData.setUseCloseTime6(closeTime2); + } + } + controlSetService.saveControlSet(controlData); //保存设置内容 + }else if (deviceType.equals("水位开关") && !param.equals("状态")){ + if (brand==null || brand.equals("") || brand.equals("中凯")){//品牌 + deviceCodeParam.setFunCode("17"); //功能码读 + deviceCodeParam.setRegisterAddr("0017"); + }else if(brand.equals("远向")){ + deviceCodeParam.setFunCode("03"); //功能码读 + deviceCodeParam.setRegisterAddr("0018"); + }else if(brand.equals("顶威")){ + deviceCodeParam.setFunCode("0102"); //功能码读 + deviceCodeParam.setRegisterAddr("0102"); + } + rtData=serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 + deviceCodeParam.setDataValue(rtData); + //controlData.setLevelSet(serialPortModel.getDataValue()); + //controlSetService.saveControlSet(controlData); + log.info("--------------读取返回数据:"+rtData+"------------------"); + }else if (deviceType.equals("水位开关") && param.equals("状态")){ + if(brand.equals("远向")){ + deviceCodeParam.setFunCode("03"); //功能码读 + deviceCodeParam.setRegisterAddr("0010"); + } + rtData=serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 + + }else if (deviceType.equals("温度变送器")){ + deviceCodeParam.setFunCode("03"); //功能码读 + deviceCodeParam.setRegisterAddr("0028"); + rtData=serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 + }else if (deviceType.equals("压变")){ + deviceCodeParam.setFunCode("03"); //功能码读 + deviceCodeParam.setRegisterAddr("0004"); + rtData=serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 + }else if (deviceType.equals("水表")){ + rtData=serialPortSingle.serialPortSend(deviceCodeParam); + }else if (deviceType.equals("电表")){ + rtData=serialPortSingle.serialPortSend(deviceCodeParam); + } + }else{ + return HttpResult.error(500,"fail"); + } + } + Constant.WEB_FLAG=false; //单抄,恢复采集 + if(ExchangeStringUtil.getJSONType(rtData)){ + Map map = JSONObject.parseObject(rtData); + return HttpResult.ok("success",map); + }else{ + if(rtData.equals("fail")){ + return HttpResult.error(500,"fail"); + }else{ + return HttpResult.ok(rtData,rtData); + } + } + }catch (Exception e){ + Constant.WEB_FLAG=false; //单抄,恢复采集 + return HttpResult.error(500,"fail"); + } + } + + @PostMapping(value="/pump") + public HttpResult queryPumpSet(@RequestParam(value = "pumpId",defaultValue = "2") String pumpId, + @RequestParam(value = "buildingId") String buildingId){ + try{ + PumpSetEntity list=pumpSetService.queryPumpSet(pumpId,buildingId); + return HttpResult.ok(list); + }catch (Exception e){ + //e.printStackTrace(); + return HttpResult.error(); + } + + } + + @PostMapping(value="/control") + public HttpResult queryControlSet(@RequestParam(value = "buildingId") String buildingId){ + try{ + ControlSetEntity list=controlSetService.queryControlSet(buildingId); + return HttpResult.ok(list); + }catch (Exception e){ + // e.printStackTrace(); + return HttpResult.error(); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/SummaryController.java b/user-service/src/main/java/com/mh/user/controller/SummaryController.java new file mode 100644 index 0000000..cae1e51 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SummaryController.java @@ -0,0 +1,97 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.entity.AlarmInfoSumEntity; +import com.mh.user.entity.DeviceStateEntity; +import com.mh.user.entity.EnergySumEntity; +import com.mh.user.entity.MaintainSumEntity; +import com.mh.user.service.BuildingService; +import com.mh.user.service.SummaryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("sum") +public class SummaryController { + + @Autowired + SummaryService summaryService; + + @Autowired + BuildingService buildingService; + + //查询运行状态页面设备状态汇总 + @PostMapping(value="/deviceState") + public HttpResult queryDeviceState() { + try{ + DeviceStateEntity record=summaryService.queryDeviceState(); + return HttpResult.ok(record); + }catch (Exception e){ + //e.printStackTrace(); + return HttpResult.error(); + } + + } + + //查询日月年用量汇总 + @PostMapping(value="/energySum") + public HttpResult queryEnergySum(@RequestParam(value= "buildingId", required=false)String buildingId, + @RequestParam(value= "curDate", required=false)String curDate, + @RequestParam(value= "type", required=true)Integer type) { + try{ + String areaId=""; + if (buildingId!=null && buildingId.length()>0){ + if (!buildingId.equals("所有")){ + areaId=buildingService.queryAreaId(Integer.parseInt(buildingId)); + } + } + EnergySumEntity record; + if (areaId!=null && areaId.length()>0){ + record=summaryService.queryEnergySum(areaId,curDate,type); + }else{ + record=summaryService.queryEnergySum(buildingId,curDate,type); + } + return HttpResult.ok(record); + }catch (Exception e){ + //e.printStackTrace(); + return HttpResult.error(); + } + } + + //查询维修量汇总 + @PostMapping(value="/maintainSum") + public HttpResult queryMaintainSum(@RequestParam(value= "buildingId", required=false)String buildingId, + @RequestParam(value= "curDate", required=false)String curDate) { + try{ + MaintainSumEntity record; + if(buildingId==null || buildingId.equals("")){ + record=summaryService.queryMaintainSum("所有",curDate); + }else { + record=summaryService.queryMaintainSum(buildingId,curDate); + } + + return HttpResult.ok(record); + }catch (Exception e){ + //e.printStackTrace(); + return HttpResult.error(); + } + } + + //警报管理汇总查询 + @PostMapping(value="/alarmInfoSum") + public HttpResult queryAlarmInfoSum(@RequestParam(value= "buildingId", required=false)String buildingId, + @RequestParam(value= "curDate", required=false)String curDate) { + try{ + + AlarmInfoSumEntity record=summaryService.queryAlarmInfoSum(buildingId,curDate); + return HttpResult.ok(record); + }catch (Exception e){ + //e.printStackTrace(); + return HttpResult.error(); + } + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/SysDeptController.java b/user-service/src/main/java/com/mh/user/controller/SysDeptController.java new file mode 100644 index 0000000..915c7e4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SysDeptController.java @@ -0,0 +1,46 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.model.SysDept; +import com.mh.user.service.SysDeptService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 机构控制器 + * @author ljf + * @date 2020-04-25 + */ +@RestController +@RequestMapping("dept") +public class SysDeptController { + + @Autowired + private SysDeptService sysDeptService; + + @PreAuthorize("hasAuthority('sys:dept:add') AND hasAuthority('sys:dept:edit')") + @PostMapping(value="/save") + public HttpResult save(@RequestBody SysDept record) { + return HttpResult.ok(sysDeptService.save(record)); + } + + @PreAuthorize("hasAuthority('sys:dept:delete')") + @PostMapping(value="/delete") + public HttpResult delete(@RequestBody List records) { + return HttpResult.ok(sysDeptService.delete(records)); + } + + @PreAuthorize("hasAuthority('sys:dept:view')") + @GetMapping(value="/findTree") + public HttpResult findTree() { + return HttpResult.ok(sysDeptService.findTree()); + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/SysDictController.java b/user-service/src/main/java/com/mh/user/controller/SysDictController.java new file mode 100644 index 0000000..0d5568f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SysDictController.java @@ -0,0 +1,54 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.common.page.PageRequest; +import com.mh.user.model.SysDict; +import com.mh.user.service.SysDictService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + + +/** + * 字典控制器 + * @author ljf + * @date 2020-04-25 + */ +@RestController +@RequestMapping("dict") +public class SysDictController { + + @Autowired + private SysDictService sysDictService; + + @PreAuthorize("hasAuthority('sys:dict:add') AND hasAuthority('sys:dict:edit')") + @PostMapping(value="/save") + public HttpResult save(@RequestBody SysDict record) { + return HttpResult.ok(sysDictService.save(record)); + } + + @PreAuthorize("hasAuthority('sys:dict:delete')") + @PostMapping(value="/delete") + public HttpResult delete(@RequestBody List records) { + return HttpResult.ok(sysDictService.delete(records)); + } + + @PreAuthorize("hasAuthority('sys:dict:view')") + @PostMapping(value="/findPage") + public HttpResult findPage(@RequestBody PageRequest pageRequest) { + return HttpResult.ok(sysDictService.findPage(pageRequest)); + } + + @PreAuthorize("hasAuthority('sys:dict:view')") + @GetMapping(value="/findByLable") + public HttpResult findByLable(@RequestParam String lable) { + return HttpResult.ok(sysDictService.findByLable(lable)); + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/SysLogController.java b/user-service/src/main/java/com/mh/user/controller/SysLogController.java new file mode 100644 index 0000000..3a77145 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SysLogController.java @@ -0,0 +1,75 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.common.page.PageRequest; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.SysParamEntity; +import com.mh.user.model.SysLog; +import com.mh.user.service.SysLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +/** + * 日志控制器 + * @author ljf + * @date 2020-04-25 + */ +@RestController +@RequestMapping("log") +public class SysLogController { + + @Autowired + private SysLogService sysLogService; + + @PostMapping(value="/findPage") + public HttpResult findPage(@RequestBody PageRequest pageRequest) { + return HttpResult.ok(sysLogService.findPage(pageRequest)); + } + + @SysLogger(title="日志",optDesc = "按操作员查询对应的操作日志") + @PostMapping(value="/findLogs") + public HttpResult findLogs(@RequestParam(value = "userName", required = false)String userName, + @RequestParam int page, + @RequestParam int limit) { + try{ + List list=new ArrayList(); + list=sysLogService.findLogs(userName,page,limit); + int count=sysLogService.findCount(userName,page,limit); + + return HttpResult.ok(count,list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + + } + + // 查询日志详情 + @SysLogger(title="日志",optDesc = "查询日志详情") + @PostMapping(value="/logInfo") + public HttpResult logInfo(@RequestParam int id){ + try{ + SysLog sysLog=sysLogService.logInfo(id); + return HttpResult.ok(sysLog); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } + + // 查询系统参数 + @PostMapping(value="/sysParam") + public HttpResult selectSysParam(){ + try{ + SysParamEntity sysParam=sysLogService.selectSysParam(); + return HttpResult.ok(sysParam); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/SysLoginController.java b/user-service/src/main/java/com/mh/user/controller/SysLoginController.java new file mode 100644 index 0000000..aa2f94c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SysLoginController.java @@ -0,0 +1,109 @@ +package com.mh.user.controller; + +import java.awt.image.BufferedImage; +import java.io.IOException; + +import javax.imageio.ImageIO; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.mh.common.http.HttpResult; +import com.mh.common.utils.IOUtils; +import com.mh.user.dynamic.datasource.DataSourceContextHolder; +import com.mh.user.dynamic.datasource.DataSourceObject; +import com.mh.user.entity.DBEntity; +import com.mh.user.model.SysUser; +import com.mh.user.security.JwtAuthenticatioToken; +import com.mh.user.service.SysUserService; +import com.mh.user.utils.AESUtil; +import com.mh.user.utils.PasswordUtils; +import com.mh.user.utils.SecurityUtils; +import com.mh.user.vo.LoginBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.google.code.kaptcha.Constants; +import com.google.code.kaptcha.Producer; + +/** + * 登录控制器 + * @author ljf + * @date 2020-04-25 + */ +@RestController +public class SysLoginController { + + @Autowired + private Producer producer; + @Autowired + private SysUserService sysUserService; + @Autowired + private AuthenticationManager authenticationManager; + + @GetMapping("captcha.jpg") + public void captcha(HttpServletResponse response, HttpServletRequest request) throws ServletException, IOException { + response.setHeader("Cache-Control", "no-store, no-cache"); + response.setContentType("image/jpeg"); + + // 生成文字验证码 + String text = producer.createText(); + // 生成图片验证码 + BufferedImage image = producer.createImage(text); + // 保存到验证码到 session + request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY, text); + + ServletOutputStream out = response.getOutputStream(); + ImageIO.write(image, "jpg", out); + IOUtils.closeQuietly(out); + } + + /** + * 登录接口 + */ + @PostMapping(value = "/login") + public HttpResult login(@RequestBody LoginBean loginBean, HttpServletRequest request) throws Exception { + String username = loginBean.getAccount(); + String password = loginBean.getPassword(); + String captcha = loginBean.getCaptcha(); + + // 用户信息 + SysUser user = sysUserService.findByName(username); + + // 账号不存在、密码错误 + if (user == null) { + return HttpResult.error("账号不存在"); + } + + if (!PasswordUtils.matches(user.getSalt(), password, user.getPassword())) { + return HttpResult.error("密码不正确"); + } + + // 账号锁定 + if (user.getStatus() == 0) { + return HttpResult.error("账号已被锁定,请联系管理员"); + } + + // 系统登录认证 + JwtAuthenticatioToken token = SecurityUtils.login(request, username, password, authenticationManager); + + //更新登录日期 + sysUserService.updateLoginTime(username); + +// DBEntity dbEntity = sysUserService.queryDBInfo(username); +// dbEntity.setDB_Pwd(AESUtil.AESdecrypt(dbEntity.getDB_Pwd())); +// // 切换数据源 +// DataSourceObject dataSourceObject = new DataSourceObject(); +// String SourceName = "sqlServer-"+dbEntity.getDB_Names(); +// dataSourceObject.SwitchSQLServerDataSource(dbEntity,SourceName); +// DataSourceContextHolder.setDBType(SourceName); + + return HttpResult.ok(token); + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/SysMenuController.java b/user-service/src/main/java/com/mh/user/controller/SysMenuController.java new file mode 100644 index 0000000..a982a36 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SysMenuController.java @@ -0,0 +1,54 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.model.SysMenu; +import com.mh.user.service.SysMenuService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 菜单控制器 + * @author ljf + * @date 2020-04-25 + */ +@RestController +@RequestMapping("menu") +public class SysMenuController { + + @Autowired + private SysMenuService sysMenuService; + + @PreAuthorize("hasAuthority('sys:menu:add') AND hasAuthority('sys:menu:edit')") + @PostMapping(value="/save") + public HttpResult save(@RequestBody SysMenu record) { + + return HttpResult.ok(sysMenuService.save(record)); + } + + @PreAuthorize("hasAuthority('sys:menu:delete')") + @PostMapping(value="/delete") + public HttpResult delete(@RequestBody List records) { + return HttpResult.ok(sysMenuService.delete(records)); + } + + //查询菜单树,用户ID和用户名为空则查询全部,获取菜单类型,0:获取所有菜单,包含按钮,1:获取所有菜单,不包含按钮 + @PreAuthorize("hasAuthority('sys:menu:view')") + @GetMapping(value="/findNavTree") + public HttpResult findNavTree(@RequestParam String userName) { + return HttpResult.ok(sysMenuService.findTree(userName, 1)); + } + + @PreAuthorize("hasAuthority('sys:menu:view')") + @GetMapping(value="/findMenuTree") + public HttpResult findMenuTree() { + return HttpResult.ok(sysMenuService.findTree(null, 0)); + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/SysRoleController.java b/user-service/src/main/java/com/mh/user/controller/SysRoleController.java new file mode 100644 index 0000000..a3bdad7 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SysRoleController.java @@ -0,0 +1,127 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.common.page.PageRequest; +import com.mh.user.annotation.SysLogger; +import com.mh.user.constants.SysConstants; +import com.mh.user.mapper.SysRoleMapper; +import com.mh.user.model.SysRole; +import com.mh.user.model.SysRoleMenu; +import com.mh.user.service.SysRoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Date; +import java.util.List; + +/** + * 角色控制器 + * @author ljf + * @date 2020-04-25 + */ +@RestController +@RequestMapping("role") +public class SysRoleController { + + @Autowired + private SysRoleService sysRoleService; + @Autowired + private SysRoleMapper sysRoleMapper; + + @SysLogger(title="角色管理",optDesc = "保存或者编辑角色信息") + @PostMapping(value="/save") + public HttpResult save(@RequestBody SysRole record) { + SysRole role = sysRoleService.findById(record.getId()); + if(role != null) { + if(SysConstants.ADMIN.equalsIgnoreCase(role.getName())) { + return HttpResult.error("超级管理员不允许修改!"); + } + List role1=sysRoleService.findByName(record.getName()); + if (role1!=null && role1.size()>0){ + if(role.getId()!=role1.get(0).getId()){ + return HttpResult.error("角色名不能重复!"); + } + } + } + // 新增角色 + if((record.getId() == null || record.getId() ==0) && !sysRoleService.findByName(record.getName()).isEmpty()) { + return HttpResult.error("角色名已存在!"); + } + record.setCreateBy("admin"); + Date date=new Date(); + record.setCreateTime(date); //创建日期 + record.setLastUpdateTime(date); //更新日期 + return HttpResult.ok(sysRoleService.save(record)); + } + + // 删除多个 + @SysLogger(title="角色管理",optDesc = "删除角色信息") + @PostMapping(value="/delete") + public HttpResult delete(@RequestBody List records) { + + return HttpResult.ok(sysRoleService.delete(records)); + } + + // 删除单个 + @PostMapping(value="/deleteById") + public HttpResult deleteById(@RequestBody SysRole record) { + + return HttpResult.ok(sysRoleService.delete(record)); + } + + @PreAuthorize("hasAuthority('sys:role:view')") + @PostMapping(value="/findPage") + public HttpResult findPage(@RequestBody PageRequest pageRequest) { + return HttpResult.ok(sysRoleService.findPage(pageRequest)); + } + + @PreAuthorize("hasAuthority('sys:role:view')") + @GetMapping(value="/findAll") + public HttpResult findAll() { + return HttpResult.ok(sysRoleService.findAll()); + } + + @PreAuthorize("hasAuthority('sys:role:view')") + @GetMapping(value="/findRoleMenus") + public HttpResult findRoleMenus(@RequestParam Long roleId) { + return HttpResult.ok(sysRoleService.findRoleMenus(roleId)); + } + + @PreAuthorize("hasAuthority('sys:role:view')") + @PostMapping(value="/saveRoleMenus") + public HttpResult saveRoleMenus(@RequestBody List records) { + for(SysRoleMenu record:records) { + SysRole sysRole = sysRoleMapper.selectByPrimaryKey(record.getRoleId()); + if(SysConstants.ADMIN.equalsIgnoreCase(sysRole.getName())) { + // 如果是超级管理员,不允许修改 + return HttpResult.error("超级管理员拥有所有菜单权限,不允许修改!"); + } + } + return HttpResult.ok(sysRoleService.saveRoleMenus(records)); + } + + @PostMapping(value="/findId") + public HttpResult findByName(@RequestParam String name) { + return HttpResult.ok(sysRoleService.findByName(name)); + } + + @SysLogger(title="角色管理",optDesc = "查询角色信息") + @PostMapping(value="/queryRoles") + public HttpResult queryRoles(@RequestParam(value = "roleName", required = false) String roleName, + @RequestParam(value = "page", required = false, defaultValue = "1") int page, + @RequestParam(value = "limit", required = false, defaultValue = "1000") int limit) { + try{ + List list=sysRoleService.queryRoles(roleName,page,limit); + int count=sysRoleService.getCount(roleName,page,limit); + return HttpResult.ok(count,list); + }catch (Exception e){ + return HttpResult.error(); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/SysUserController.java b/user-service/src/main/java/com/mh/user/controller/SysUserController.java new file mode 100644 index 0000000..9431032 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SysUserController.java @@ -0,0 +1,177 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.common.page.PageRequest; +import com.mh.user.annotation.SysLogger; +import com.mh.user.constants.SysConstants; +import com.mh.user.mapper.SysUserRoleMapper; +import com.mh.user.model.SysRole; +import com.mh.user.model.SysUser; +import com.mh.user.model.SysUserRole; +import com.mh.user.service.SysRoleService; +import com.mh.user.service.SysUserService; +import com.mh.user.utils.PasswordUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * 用户控制器 + * @author ljf + * @date 2020-04-25 + */ +@RestController +@RequestMapping("user") +public class SysUserController { + + @Autowired + private SysUserService sysUserService; + + @Autowired + private SysRoleService sysRoleService; + + @Autowired + private SysUserRoleMapper sysUserRoleMapper; + + @SysLogger(title="用户管理",optDesc = "保存或者编辑用户信息") + @PostMapping(value="/save") + public HttpResult save(@RequestBody SysUser record) { + SysUser user = sysUserService.findById(record.getId()); + if(user != null) { + if(SysConstants.ADMIN.equalsIgnoreCase(user.getUserName())) { + return HttpResult.error("超级管理员不允许修改!"); + } + } + if(record.getPassword() != null) { + + String salt = PasswordUtils.getSalt();//生成盐值 + + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + String curDate=sdf1.format(date); + + if(user == null) { + // 新增用户 + if(sysUserService.findByName(record.getUserName()) != null) { + return HttpResult.error("用户名已存在!"); + } + String password = PasswordUtils.encode(record.getPassword(), salt); + Byte Status=1; + Byte delFlag=1; + record.setSalt(salt); + record.setPassword(password); + record.setStatus(Status); + record.setDelFlag(delFlag); + try{ + record.setCreateTime(sdf1.parse(curDate)); //创建日期 + }catch (Exception e){ + + } + + } else { + SysUser user1=sysUserService.findByName(record.getUserName()); + if(user1!=null && user1.getId()!=record.getId()){ + return HttpResult.error("修改的用户名不能与存在的用户名相同!"); + } + // 修改用户, 且修改了密码 + if(!record.getPassword().equals(user.getPassword())) { //有问题 + String password = PasswordUtils.encode(record.getPassword(), salt); + record.setSalt(salt); + record.setPassword(password); + } + } + } + return HttpResult.ok(sysUserService.save(record)); + } + + @SysLogger(title="用户管理",optDesc = "删除用户信息") + @PostMapping(value="/delete") + public HttpResult delete(@RequestBody List records) { + for(SysUser record:records) { + SysUser sysUser = sysUserService.findById(record.getId()); + if(sysUser != null && SysConstants.ADMIN.equalsIgnoreCase(sysUser.getUserName())) { + return HttpResult.error("超级管理员不允许删除!"); + } + } + return HttpResult.ok(sysUserService.delete(records)); + } + + @PostMapping(value="/deleteById") + public HttpResult deleteById(@RequestBody SysUser record) { + SysUser sysUser = sysUserService.findById(record.getId()); + if(sysUser != null && SysConstants.ADMIN.equalsIgnoreCase(sysUser.getUserName())) { + return HttpResult.error("超级管理员不允许删除!"); + }else{ + return HttpResult.ok(sysUserService.delete(record)); + } + } + +// @PreAuthorize("hasAuthority('sys:user:view')") + @GetMapping(value="/findByName") + public HttpResult findByUserName(@RequestParam String name) { + + return HttpResult.ok(sysUserService.findByName(name)); + } + + @PreAuthorize("hasAuthority('sys:user:view')") + @GetMapping(value="/findPermissions") + public HttpResult findPermissions(@RequestParam String name) { + return HttpResult.ok(sysUserService.findPermissions(name)); + } + + @PreAuthorize("hasAuthority('sys:user:view')") + @GetMapping(value="/findUserRoles") + public HttpResult findUserRoles(@RequestParam Long userId) { + return HttpResult.ok(sysUserService.findUserRoles(userId)); + } + + @PreAuthorize("hasAuthority('sys:user:view')") + @PostMapping(value="/findPage") + public HttpResult findPage(@RequestBody PageRequest pageRequest) { + return HttpResult.ok(sysUserService.findPage(pageRequest)); + } + + @SysLogger(title="用户管理",optDesc = "查询用户信息") + @PostMapping(value="/queryUsers") + public HttpResult queryUsers(@RequestParam(value = "userName", required = false) String userName, + @RequestParam(value = "page", required = false, defaultValue = "1") int page, + @RequestParam(value = "limit", required = false, defaultValue = "1000") int limit){ + try{ + List list=sysUserService.queryUsers(userName,page,limit); + int count=sysUserService.getCount(userName,page,limit); + return HttpResult.ok(count,list); + }catch (Exception e){ + return HttpResult.error(); + } + + } + + @PostMapping(value="/password") + public HttpResult updatePassword(@RequestParam String oldPassword, + @RequestParam String newPassword, + @RequestParam String id) { + try{ + SysUser user = sysUserService.findById(Long.valueOf(id)); + + if (!PasswordUtils.matches(user.getSalt(), oldPassword, user.getPassword())) { + return HttpResult.error("原密码不正确"); + }else{ + String salt = PasswordUtils.getSalt(); + String password = PasswordUtils.encode(newPassword, salt); + sysUserService.updatePassword(password,salt,id); + return HttpResult.ok(); + } + }catch (Exception e){ + return HttpResult.error(); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/TestController.java b/user-service/src/main/java/com/mh/user/controller/TestController.java new file mode 100644 index 0000000..3691070 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/TestController.java @@ -0,0 +1,91 @@ +package com.mh.user.controller; + +import com.mh.user.constants.Constant; +import com.mh.user.dynamic.datasource.DataSourceContextHolder; +import com.mh.user.dynamic.datasource.DataSourceObject; +import com.mh.user.entity.DBEntity; +import com.mh.user.manage.QuartzManager; +import com.mh.user.mapper.NowDataMapper; +import com.mh.user.service.NowDataService; +import com.mh.user.service.SysUserService; +import com.mh.user.utils.AESUtil; +import com.mh.user.utils.AnalysisReceiveOrder485; +import com.mh.user.utils.GetReadOrder485; +import com.mh.user.utils.TimedTask2; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@RestController +public class TestController { + + @Autowired + private SysUserService sysUserService; + + @Autowired + NowDataService nowDataService; + + @Resource + QuartzManager quartzManager; + + @RequestMapping("/hello") + public String HelloWord() throws SchedulerException, InterruptedException { + // 停止JobTest + quartzManager.pauseAllJob(); + Constant.FLAG = true; + Thread.sleep(2000); + // 开始JobTest +// quartzManager.resumeAllJob(); + Constant.FLAG = false; + return "user hello word."; + } + + @RequestMapping("/startHello") + public String startHelloWord() throws SchedulerException, InterruptedException { + // 停止JobTest +// quartzManager.pauseAllJob(); +// Constant.FLAG = true; +// Thread.sleep(2000); + // 开始JobTest +// quartzManager.resumeAllJob(); +// Thread.sleep(2000); +// Constant.FLAG = false; + return "user hello word."; + } + + @GetMapping("/testQuery") + public void testQuery(){ +// try{ +// DBEntity dbEntity = sysUserService.queryDBInfo("admin"); +// dbEntity.setDB_Pwd(AESUtil.AESdecrypt(dbEntity.getDB_Pwd())); +// DataSourceObject dataSourceObject = new DataSourceObject(); +// String SourceName = "sqlServer-"+dbEntity.getDB_Names(); +// dataSourceObject.SwitchSQLServerDataSource(dbEntity,SourceName); +// DataSourceContextHolder.setDBType(SourceName); +// }catch (Exception e){ +// e.printStackTrace(); +// } + + AnalysisReceiveOrder485 analysis=new AnalysisReceiveOrder485(); + GetReadOrder485 getReadOrder485=new GetReadOrder485(); +// analysis.analysisWtMeterOrder485("5103040003141D953F","","","48"); + //analysis.analysisPumpOrder485("05030200004984","0BBD","美的2","80"); +// analysis.analysisMeterOrder485("6824095005000068810643C36B7A67335E16","","","63"); +// analysis.analysisRelayOrder485("12031000000001000000000000000000000000665F","0010","远向","34"); +// analysis.analysisMulTempOrder4852("010310013601290192018F0180F800F800F800AC21","","","1"); +// analysis.analysisPressureOrder485("150304400F1ABE00E1","","","22"); +// analysis.analysisStateOrder485("6874100000000068810358F3395C16","","","41"); +// analysis.analysisTempOrder485("020304013000010900","","","23"); + nowDataService.saveNowHistoryData("3","热泵","运行","runState","62"); +// nowDataService.updateRunState("70","2","离线"); + + + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/UseForecastController.java b/user-service/src/main/java/com/mh/user/controller/UseForecastController.java new file mode 100644 index 0000000..442284c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/UseForecastController.java @@ -0,0 +1,67 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.entity.UseForecastEntity; +import com.mh.user.service.BuildingService; +import com.mh.user.service.DeviceFloorService; +import com.mh.user.service.UseForecastService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("forecast") +public class UseForecastController { + + @Autowired + UseForecastService useForecastService; + + @Autowired + BuildingService buildingService; + + @Autowired + DeviceFloorService deviceFloorService; + + @PostMapping("/save") + public HttpResult saveUseForecast(@RequestBody UseForecastEntity useForecastEntity){ + try{ + useForecastService.saveUseForecast(useForecastEntity); + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error("保存出错!"); + } + } + + @PostMapping("/update") + public HttpResult updateUseForecast(@RequestBody UseForecastEntity useForecastEntity){ + try{ + useForecastService.updateUseForecast(useForecastEntity); + return HttpResult.ok(); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error("修改出错!"); + } + + } + + @PostMapping("/query") + public HttpResult queryUseForecast(@RequestParam(value = "buildingId",required = true) String buildingId, + @RequestParam(value = "deviceName",required = true) String deviceName, + @RequestParam(value = "curDate",required =true) String curDate, + @RequestParam(value = "page",required = true) int page, + @RequestParam(value = "limit",required = true) int limit){ + try{ + List list=new ArrayList(); +// String buildingId=buildingService.selectBuildingId(buildingName); + String deviceId=deviceFloorService.selectDeviceId(deviceName,"水箱",buildingId); + list=useForecastService.queryUseForecast(buildingId,deviceId,curDate,page,limit); + int count=useForecastService.getCount(buildingId,deviceId,curDate,page,limit); + return HttpResult.ok(count,list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + + } +} diff --git a/user-service/src/main/java/com/mh/user/dto/DeviceMessageDTO.java b/user-service/src/main/java/com/mh/user/dto/DeviceMessageDTO.java new file mode 100644 index 0000000..7b480e0 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/dto/DeviceMessageDTO.java @@ -0,0 +1,33 @@ +package com.mh.user.dto; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : 设备信息状态 + * @updateTime 2020-05-29 + * @throws : + */ +@Setter +@Getter +public class DeviceMessageDTO { + + private String label; + private int spanLength; + private boolean openState; + private String deviceId; + private int grade; // 0:A区 1:B区 + + @Override + public String toString() { + return "DeviceMessageDTO{" + + "label='" + label + '\'' + + ", spanLength=" + spanLength + + ", openState=" + openState + + ", deviceId='" + deviceId + '\'' + + ", grade=" + grade + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/dto/DisplayBoxDataDTO.java b/user-service/src/main/java/com/mh/user/dto/DisplayBoxDataDTO.java new file mode 100644 index 0000000..9bbc40a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/dto/DisplayBoxDataDTO.java @@ -0,0 +1,35 @@ +package com.mh.user.dto; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : 设备数据显示框 + * @updateTime 2020-05-29 + * @throws : + */ +@Setter +@Getter +public class DisplayBoxDataDTO { + + private String title; + private String secContent1; + private String secContent2; + private String firstDivClass; + private String deviceId; + private int grade; + + @Override + public String toString() { + return "DisplayBoxDataDTO{" + + "title='" + title + '\'' + + ", secContent1='" + secContent1 + '\'' + + ", secContent2='" + secContent2 + '\'' + + ", firstDivClass='" + firstDivClass + '\'' + + ", deviceId='" + deviceId + '\'' + + ", grade=" + grade + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/dto/TableInfoDTO.java b/user-service/src/main/java/com/mh/user/dto/TableInfoDTO.java new file mode 100644 index 0000000..56bb2ae --- /dev/null +++ b/user-service/src/main/java/com/mh/user/dto/TableInfoDTO.java @@ -0,0 +1,21 @@ +package com.mh.user.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-25 + * @throws : + */ +@Setter +@Getter +public class TableInfoDTO { + + private List tableInfo; + +} diff --git a/user-service/src/main/java/com/mh/user/dynamic/config/DataSourceConfig.java b/user-service/src/main/java/com/mh/user/dynamic/config/DataSourceConfig.java new file mode 100644 index 0000000..19ccf1a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/dynamic/config/DataSourceConfig.java @@ -0,0 +1,77 @@ +package com.mh.user.dynamic.config; + +import com.alibaba.druid.pool.DruidDataSource; +import com.mh.user.dynamic.datasource.DynamicDataSource; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; + +import javax.sql.DataSource; +import java.util.HashMap; +import java.util.Map; + +/** + * @author chison + * @date 2020-04-02 09:39 + * @Description + */ +@Configuration +@MapperScan("com.mh.*.mapper") // 扫描DAO +public class DataSourceConfig { + + @Value("${spring.datasource.druid.url}") + private String defaultDBUrl; + @Value("${spring.datasource.druid.username}") + private String defaultDBUser; + @Value("${spring.datasource.druid.password}") + private String defaultDBPassword; + @Value("${spring.datasource.druid.driver-class-name}") + private String defaultDBDreiverName; + + + @Bean + public DynamicDataSource dynamicDataSource() { + DynamicDataSource dynamicDataSource = DynamicDataSource.getInstance(); + + DruidDataSource defaultDataSource = new DruidDataSource(); + defaultDataSource.setUrl(defaultDBUrl); + defaultDataSource.setUsername(defaultDBUser); + defaultDataSource.setPassword(defaultDBPassword); + defaultDataSource.setDriverClassName(defaultDBDreiverName); + + Map map = new HashMap<>(); + map.put("default", defaultDataSource); + dynamicDataSource.setTargetDataSources(map); + dynamicDataSource.setDefaultTargetDataSource(defaultDataSource); + + return dynamicDataSource; + } + + @Bean + public SqlSessionFactory sqlSessionFactory( + @Qualifier("dynamicDataSource") DataSource dynamicDataSource) + throws Exception { + SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); + bean.setDataSource(dynamicDataSource); + bean.setTypeAliasesPackage("com.mh.*.model"); // 扫描Model + + bean.setMapperLocations(new PathMatchingResourcePatternResolver() + .getResources("classpath*:**/sqlmapper/*.xml")); + return bean.getObject(); + + } + + @Bean(name = "sqlSessionTemplate") + public SqlSessionTemplate sqlSessionTemplate( + @Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) + throws Exception { + return new SqlSessionTemplate(sqlSessionFactory); + } + +} diff --git a/user-service/src/main/java/com/mh/user/dynamic/config/MyBatisMapperScannerConfig.java b/user-service/src/main/java/com/mh/user/dynamic/config/MyBatisMapperScannerConfig.java new file mode 100644 index 0000000..7fff575 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/dynamic/config/MyBatisMapperScannerConfig.java @@ -0,0 +1,28 @@ +package com.mh.user.dynamic.config; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.Bean; +import tk.mybatis.spring.mapper.MapperScannerConfigurer; + +import java.util.Properties; + +/** + * @author chison + * @date 2020-04-02 09:40 + * @Description + */ +@EnableAutoConfiguration +public class MyBatisMapperScannerConfig { + @Bean + public MapperScannerConfigurer mapperScannerConfigurer() { + MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); + mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); + mapperScannerConfigurer.setBasePackage("com.mh.user.mapper"); + Properties properties = new Properties(); + properties.setProperty("notEmpty", "false"); + properties.setProperty("IDENTITY", "MYSQL"); + mapperScannerConfigurer.setProperties(properties); + return mapperScannerConfigurer; + } + +} diff --git a/user-service/src/main/java/com/mh/user/dynamic/datasource/DataSourceContextHolder.java b/user-service/src/main/java/com/mh/user/dynamic/datasource/DataSourceContextHolder.java new file mode 100644 index 0000000..7f7c010 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/dynamic/datasource/DataSourceContextHolder.java @@ -0,0 +1,23 @@ +package com.mh.user.dynamic.datasource; + +/** + * @author chison + * @date 2020-04-02 09:40 + * @Description 通过ThreadLocal维护一个全局唯一的map来实现数据源的动态切换 + */ +public class DataSourceContextHolder { + + private static final ThreadLocal contextHolder = new ThreadLocal(); + + public static synchronized void setDBType(String dbType){ + contextHolder.set(dbType); + } + + public static String getDBType(){ + return contextHolder.get(); + } + + public static void clearDBType(){ + contextHolder.remove(); + } +} diff --git a/user-service/src/main/java/com/mh/user/dynamic/datasource/DataSourceObject.java b/user-service/src/main/java/com/mh/user/dynamic/datasource/DataSourceObject.java new file mode 100644 index 0000000..e9524d8 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/dynamic/datasource/DataSourceObject.java @@ -0,0 +1,71 @@ +package com.mh.user.dynamic.datasource; + +import com.alibaba.druid.pool.DruidDataSource; +import com.mh.user.entity.DBEntity; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author chison + * @date 2020-04-02 09:40 + * @Description + */ +public class DataSourceObject { + + private Long MaxWait=6000L; + private Integer maxActive=10; + private Long timeBetweenEvictionRunsMillis=6000L; + + /** + * 切换sqlserver数据库,并动态赋值 + * @param dbInfo + * @param SourceName + */ + public void SwitchMySQLDataSource(DBEntity dbInfo, String SourceName) { + System.out.println("mysql进入数据源切换"); + System.out.println("MaxWait:"+MaxWait); + DruidDataSource dynamicDataSource = new DruidDataSource(); + dynamicDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); + dynamicDataSource.setUrl("jdbc:mysql://"+dbInfo.getDB_IP()+":"+dbInfo.getDB_Port()+"/"+dbInfo.getDB_Names()+"?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&autoReconnect=true"); + dynamicDataSource.setUsername(dbInfo.getDB_UserName()); + dynamicDataSource.setPassword(dbInfo.getDB_Pwd()); + dynamicDataSource.setMaxWait(MaxWait); + dynamicDataSource.setMaxActive(maxActive); + dynamicDataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + + DynamicDataSource dataSource = DynamicDataSource.getInstance(); + Map map=new HashMap(); + map.put(SourceName, dynamicDataSource); + dataSource.setTargetDataSources(map); + System.out.println(dynamicDataSource.getUrl()); + System.out.println(SourceName); + } + /** + * 第二个sqlserver数据库 + * @param dbInfo + * @param SourceName + */ + public void SwitchSQLServerDataSource(DBEntity dbInfo,String SourceName) { + System.out.println("进入数据源切换"); + System.out.println("MaxWait:"+MaxWait); + DruidDataSource dynamicDataSource = new DruidDataSource(); + dynamicDataSource.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); + dynamicDataSource.setUrl("jdbc:sqlserver://"+dbInfo.getDB_IP()+":"+dbInfo.getDB_Port()+";Databasename="+dbInfo.getDB_Names()); + dynamicDataSource.setUsername(dbInfo.getDB_UserName()); + dynamicDataSource.setPassword(dbInfo.getDB_Pwd()); + System.out.println(dbInfo.getDB_UserName()); + System.out.println(dbInfo.getDB_Pwd()); + dynamicDataSource.setMaxWait(MaxWait); + dynamicDataSource.setMaxActive(maxActive); + dynamicDataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + + DynamicDataSource dataSource = DynamicDataSource.getInstance(); + Map map=new HashMap(); + map.put(SourceName, dynamicDataSource); + dataSource.setTargetDataSources(map); + + System.out.println(dynamicDataSource.getUrl()); + System.out.println(SourceName); + } +} diff --git a/user-service/src/main/java/com/mh/user/dynamic/datasource/DynamicDataSource.java b/user-service/src/main/java/com/mh/user/dynamic/datasource/DynamicDataSource.java new file mode 100644 index 0000000..f7a70fd --- /dev/null +++ b/user-service/src/main/java/com/mh/user/dynamic/datasource/DynamicDataSource.java @@ -0,0 +1,44 @@ +package com.mh.user.dynamic.datasource; + +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author chison + * @date 2020-04-02 09:41 + * @Description + */ +public class DynamicDataSource extends AbstractRoutingDataSource { + + private static DynamicDataSource instance; + private static byte[] lock=new byte[0]; + private static Map dataSourceMap=new HashMap(); + + @Override + public void setTargetDataSources(Map targetDataSources) { + super.setTargetDataSources(targetDataSources); + dataSourceMap.putAll(targetDataSources); + super.afterPropertiesSet();// 必须添加该句,否则新添加数据源无法识别到 + } + + public Map getDataSourceMap() { + return dataSourceMap; + } + + public static synchronized DynamicDataSource getInstance(){ + if(instance==null){ + synchronized (lock){ + if(instance==null){ + instance=new DynamicDataSource(); + } + } + } + return instance; + } + //必须实现其方法 + protected Object determineCurrentLookupKey() { + return DataSourceContextHolder.getDBType(); + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/AddCronJobReq.java b/user-service/src/main/java/com/mh/user/entity/AddCronJobReq.java new file mode 100644 index 0000000..fb53423 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/AddCronJobReq.java @@ -0,0 +1,34 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author ljf + * @title : + * @description : 定时任务请求类 + * @updateTime 2020-04-03 + * @throws : + */ +@Setter +@Getter +public class AddCronJobReq { + + private String jobName; + + private String jobGroupName; + + private String triggerName; + + private String triggerGroupName; + + private String jobClass; + + private String date; + + private Map params = new HashMap<>(); + +} diff --git a/user-service/src/main/java/com/mh/user/entity/AddSimpleJobReq.java b/user-service/src/main/java/com/mh/user/entity/AddSimpleJobReq.java new file mode 100644 index 0000000..31fab1c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/AddSimpleJobReq.java @@ -0,0 +1,27 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * @author ljf + * @title : + * @description : 新增Simple定时任务请求实体类 + * @updateTime 2020-04-03 + * @throws : + */ +@Setter +@Getter +public class AddSimpleJobReq { + + private String jobClass; + + private Date date; + + private Map params = new HashMap<>(); + +} diff --git a/user-service/src/main/java/com/mh/user/entity/AlarmInfoEntity.java b/user-service/src/main/java/com/mh/user/entity/AlarmInfoEntity.java new file mode 100644 index 0000000..a55dc10 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/AlarmInfoEntity.java @@ -0,0 +1,21 @@ +package com.mh.user.entity; + + +import lombok.Data; + +import java.util.Date; + +@Data +public class AlarmInfoEntity { + + private Long id; + private String alarmId; + private String buildingId; + private String buildingName; + private Date alarmTime; + private String deviceAddr; + private String deviceType; + private String alarmType; + private String dealState; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/AlarmInfoSumEntity.java b/user-service/src/main/java/com/mh/user/entity/AlarmInfoSumEntity.java new file mode 100644 index 0000000..293a7b2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/AlarmInfoSumEntity.java @@ -0,0 +1,20 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class AlarmInfoSumEntity { + + private long id; + private String curDate; + private String buildingId; + private int deviceNum; + private int faultNum; + private String waterLevel; + private int waterLevelNum; + private String waterTemp; + private int waterTempNum; + private String electWater; + private int electWaterNum; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/AlarmValueSetEntity.java b/user-service/src/main/java/com/mh/user/entity/AlarmValueSetEntity.java new file mode 100644 index 0000000..8016767 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/AlarmValueSetEntity.java @@ -0,0 +1,22 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class AlarmValueSetEntity { + + private long id; + private String buildingId; + private String buildingName; + private String startTime; + private String endTime; + private String lowValue; + private String startTime2; + private String endTime2; + private String lowValue2; + private String startTime3; + private String endTime3; + private String lowValue3; + private String itemType; + private String type; +} diff --git a/user-service/src/main/java/com/mh/user/entity/AnalysisMonthEntity.java b/user-service/src/main/java/com/mh/user/entity/AnalysisMonthEntity.java new file mode 100644 index 0000000..b45ab40 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/AnalysisMonthEntity.java @@ -0,0 +1,46 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class AnalysisMonthEntity { + + private Long id; + private String curDate; + private String itemType; + private String day01; + private String day02; + private String day03; + private String day04; + private String day05; + private String day06; + private String day07; + private String day08; + private String day09; + private String day10; + private String day11; + private String day12; + private String day13; + private String day14; + private String day15; + private String day16; + private String day17; + private String day18; + private String day19; + private String day20; + private String day21; + private String day22; + private String day23; + private String day24; + private String day25; + private String day26; + private String day27; + private String day28; + private String day29; + private String day30; + private String day31; + private String day32; + private String totalValue; + private String buildingId; + private String buildingName; +} diff --git a/user-service/src/main/java/com/mh/user/entity/AnalysisYearEntity.java b/user-service/src/main/java/com/mh/user/entity/AnalysisYearEntity.java new file mode 100644 index 0000000..5cc7022 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/AnalysisYearEntity.java @@ -0,0 +1,27 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class AnalysisYearEntity { + + private Long id; + private String curDate; + private String itemType; + private String month01; + private String month02; + private String month03; + private String month04; + private String month05; + private String month06; + private String month07; + private String month08; + private String month09; + private String month10; + private String month11; + private String month12; + private String totalValue; + private String buildingId; + private String buildingName; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/AreaEntity.java b/user-service/src/main/java/com/mh/user/entity/AreaEntity.java new file mode 100644 index 0000000..a635d19 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/AreaEntity.java @@ -0,0 +1,32 @@ +package com.mh.user.entity; + +public class AreaEntity { + + private String areaId; + + private String areaName; + + public String getAreaId() { + return areaId; + } + + public void setAreaId(String areaId) { + this.areaId = areaId; + } + + public String getAreaName() { + return areaName; + } + + public void setAreaName(String areaName) { + this.areaName = areaName; + } + + @Override + public String toString() { + return "AreaEntity{" + + "areaId='" + areaId + '\'' + + ", areaName='" + areaName + '\'' + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/BaseEntity.java b/user-service/src/main/java/com/mh/user/entity/BaseEntity.java new file mode 100644 index 0000000..a728be9 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/BaseEntity.java @@ -0,0 +1,41 @@ +package com.mh.user.entity; + + +import lombok.Getter; +import lombok.Setter; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author ljf + * @title : + * @description : 基础实体类 + * @updateTime 2020-05-14 + * @throws : + */ +@Setter +@Getter +public class BaseEntity implements Serializable { + + static final long serialVersionUID = 42L; + + private Long id; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + @Override + public String toString() { + return "BaseEntity{" + + "id=" + id + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } + +} diff --git a/user-service/src/main/java/com/mh/user/entity/BuildingEntity.java b/user-service/src/main/java/com/mh/user/entity/BuildingEntity.java new file mode 100644 index 0000000..0830aac --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/BuildingEntity.java @@ -0,0 +1,20 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class BuildingEntity { + + private Long id; + private String buildingId; + private String buildingName; + private int levelsCount; + private int beginLevel; + private int houseCount; + private int bedCount; + private int checkInCount; + private String areaId; + private String remarks; + private Double tankHeight; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/ChillersEntity.java b/user-service/src/main/java/com/mh/user/entity/ChillersEntity.java new file mode 100644 index 0000000..e84887d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/ChillersEntity.java @@ -0,0 +1,61 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * @author ljf + * @title : + * @description :冷水机组设备实体类 + * @updateTime 2020-05-20 + * @throws : + */ +@Setter +@Getter +public class ChillersEntity extends BaseEntity { + + private String deviceCode; // 设备代码 + private String deviceNum; // 设备码 + private String collectionNum; // 冷水机组采集地址 + private String registerAddress; // 寄存器地址 + private String registerName; // 寄存器名称 + private String funCode; // 功能码 + private int digit; // 保留位数 + private String otherName; // 别名 + private int grade; // 标志 1:冷水机组设备 2:ddc设备采集参数 3:控制指令类型 4:故障类型 + private String lastValue; // 最新采集数据 +// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String lastTime; // 最新采集时间 +// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") +// private Date localTime; // 本地采集时间 + private String dataCom; // 采集端口号 + private String ddcAddr; // DDC地址 + + // update by ljf on 2020-05-26 添加网络管理器的IP和采集的端口号 + private String IP; // IP地址 + private int port; // 端口号 + + @Override + public String toString() { + return "ChillersEntity{" + + "deviceCode='" + deviceCode + '\'' + + ", deviceNum='" + deviceNum + '\'' + + ", collectionNum='" + collectionNum + '\'' + + ", registerAddress='" + registerAddress + '\'' + + ", registerName='" + registerName + '\'' + + ", funCode='" + funCode + '\'' + + ", digit=" + digit + + ", otherName='" + otherName + '\'' + + ", grade=" + grade + + ", lastValue='" + lastValue + '\'' + + ", lastTime=" + lastTime + + ", dataCom='" + dataCom + '\'' + + ", ddcAddr='" + ddcAddr + '\'' + + ", IP='" + IP + '\'' + + ", port=" + port + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/ControlSetEntity.java b/user-service/src/main/java/com/mh/user/entity/ControlSetEntity.java new file mode 100644 index 0000000..80b81b5 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/ControlSetEntity.java @@ -0,0 +1,24 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class ControlSetEntity { + + private String buildingId; + private String levelSet; + private String useStartTime1; + private String useCloseTime1; + private String useStartTime2; + private String useCloseTime2; + private String useStartTime3; + private String useCloseTime3; + private String useStartTime4; + private String useCloseTime4; + private String useStartTime5; + private String useCloseTime5; + private String useStartTime6; + private String useCloseTime6; + private String backWaterTemp; + private String upWaterTemp; +} diff --git a/user-service/src/main/java/com/mh/user/entity/DBEntity.java b/user-service/src/main/java/com/mh/user/entity/DBEntity.java new file mode 100644 index 0000000..4e0ba8c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DBEntity.java @@ -0,0 +1,91 @@ +package com.mh.user.entity; + +/** + * @author chison + * @date 2020-09-02 13:37 + * @Description + */ +public class DBEntity { + + private String DB_Names; + private String DB_UserName; + private String DB_Pwd; + private String DB_Port; + private Integer DB_Type; //0:sqlserver,1:oracle,2:mysql + private String DB_IP; + private String Project_Name; + private String Project_No; + private Integer DB_IsStatus; + + public String getDB_Names() { + return DB_Names; + } + + public void setDB_Names(String DB_Names) { + this.DB_Names = DB_Names; + } + + public String getDB_UserName() { + return DB_UserName; + } + + public void setDB_UserName(String DB_UserName) { + this.DB_UserName = DB_UserName; + } + + public String getDB_Pwd() { + return DB_Pwd; + } + + public void setDB_Pwd(String DB_Pwd) { + this.DB_Pwd = DB_Pwd; + } + + public String getDB_Port() { + return DB_Port; + } + + public void setDB_Port(String DB_Port) { + this.DB_Port = DB_Port; + } + + public Integer getDB_Type() { + return DB_Type; + } + + public void setDB_Type(Integer DB_Type) { + this.DB_Type = DB_Type; + } + + public String getDB_IP() { + return DB_IP; + } + + public void setDB_IP(String DB_IP) { + this.DB_IP = DB_IP; + } + + public String getProject_Name() { + return Project_Name; + } + + public void setProject_Name(String project_Name) { + Project_Name = project_Name; + } + + public String getProject_No() { + return Project_No; + } + + public void setProject_No(String project_No) { + Project_No = project_No; + } + + public Integer getDB_IsStatus() { + return DB_IsStatus; + } + + public void setDB_IsStatus(Integer DB_IsStatus) { + this.DB_IsStatus = DB_IsStatus; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/DataResultEntity.java b/user-service/src/main/java/com/mh/user/entity/DataResultEntity.java new file mode 100644 index 0000000..1dc52a0 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DataResultEntity.java @@ -0,0 +1,21 @@ +package com.mh.user.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class DataResultEntity { + + private Long id; + private String deviceAddr; + private String deviceType; + private String buildingId; + private String buildingName; + private double lastValue; + private Date lastDate; + private double curValue; + private Date curDate; + private double ratio; + private double calcValue; +} diff --git a/user-service/src/main/java/com/mh/user/entity/DeleteJobReq.java b/user-service/src/main/java/com/mh/user/entity/DeleteJobReq.java new file mode 100644 index 0000000..39f572d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeleteJobReq.java @@ -0,0 +1,25 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : 定时任务删除类 + * @updateTime 2020-04-03 + * @throws : + */ +@Setter +@Getter +public class DeleteJobReq { + + private String jobName; + + private String jobGroupName; + + private String triggerName; + + private String triggerGroupName; + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/entity/DeviceCodeParamEntity.java b/user-service/src/main/java/com/mh/user/entity/DeviceCodeParamEntity.java new file mode 100644 index 0000000..3eccc0a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeviceCodeParamEntity.java @@ -0,0 +1,23 @@ +package com.mh.user.entity; + +import lombok.Data; +import java.util.Date; + +@Data +public class DeviceCodeParamEntity { + + private Long id; + private String deviceAddr; + private String deviceName; + private String deviceType; + private String dataCom; + private int baudrate; + private String parity; + private String brand; + private String funCode; + private String registerAddr; + private String dataValue; //传入值 + private Date createTime; + private String buildingId; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/DeviceFloorEntity.java b/user-service/src/main/java/com/mh/user/entity/DeviceFloorEntity.java new file mode 100644 index 0000000..09ba29f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeviceFloorEntity.java @@ -0,0 +1,22 @@ +package com.mh.user.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class DeviceFloorEntity { + + private Long id; + private String deviceName; + private String deviceType; + private String brand; + private String model; + private String specs; + private String buildingId; + private String buildingName; + private String installer; + private Date installDate; + private boolean use; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/DeviceFloorTempEntity.java b/user-service/src/main/java/com/mh/user/entity/DeviceFloorTempEntity.java new file mode 100644 index 0000000..8006dd0 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeviceFloorTempEntity.java @@ -0,0 +1,18 @@ +package com.mh.user.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class DeviceFloorTempEntity { + + private String deviceName; + private String deviceType; + private String buildingId; + private Date installDate; + private String model; + private String specs; + private String remarks; + private String rowId; //行号 +} diff --git a/user-service/src/main/java/com/mh/user/entity/DeviceInstallEntity.java b/user-service/src/main/java/com/mh/user/entity/DeviceInstallEntity.java new file mode 100644 index 0000000..89042fd --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeviceInstallEntity.java @@ -0,0 +1,34 @@ +package com.mh.user.entity; + +import lombok.Data; +import java.util.Date; + +@Data +public class DeviceInstallEntity { + + private Long id; + private String deviceAddr; + private String deviceName; + private String deviceType; + private String dataCom; + private int baudRate; + private String parity; + private double ratio; + private double initValue; + private double lastValue; + private Date lastDate; + private String supDeviceAddr; + private String isOnline; + private String grade; + private boolean use; + private boolean fault; + private String faultState; + private String brand; + private String model; + private String buildingId; + private String buildingName; + private String installer; + private Date installDate; + private String remarks; + private double dayValue; +} diff --git a/user-service/src/main/java/com/mh/user/entity/DeviceInstallTempEntity.java b/user-service/src/main/java/com/mh/user/entity/DeviceInstallTempEntity.java new file mode 100644 index 0000000..f4ac045 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeviceInstallTempEntity.java @@ -0,0 +1,113 @@ +package com.mh.user.entity; + +import java.util.Date; + +public class DeviceInstallTempEntity { + + private String deviceAddr; + private String deviceName; + private String deviceType; + private int baudRate; + private String dataCom; + private double ratio; + private String buildingId; + private Date installDate; + private String remarks; + private String rowId; //行号 + + public String getDeviceAddr() { + return deviceAddr; + } + + public void setDeviceAddr(String deviceAddr) { + this.deviceAddr = deviceAddr; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public int getBaudRate() { + return baudRate; + } + + public void setBaudRate(int baudRate) { + this.baudRate = baudRate; + } + + public String getDataCom() { + return dataCom; + } + + public void setDataCom(String dataCom) { + this.dataCom = dataCom; + } + + public double getRatio() { + return ratio; + } + + public void setRatio(double ratio) { + this.ratio = ratio; + } + + public String getBuildingId() { + return buildingId; + } + + public void setBuildingId(String buildingId) { + this.buildingId = buildingId; + } + + public Date getInstallDate() { + return installDate; + } + + public void setInstallDate(Date installDate) { + this.installDate = installDate; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRowId() { + return rowId; + } + + public void setRowId(String rowId) { + this.rowId = rowId; + } + + @Override + public String toString() { + return "DeviceInstallTempEntity{" + + "deviceAddr='" + deviceAddr + '\'' + + ", deviceName='" + deviceName + '\'' + + ", deviceType='" + deviceType + '\'' + + ", baudRate=" + baudRate + + ", dataCom='" + dataCom + '\'' + + ", ratio=" + ratio + + ", buildingId='" + buildingId + '\'' + + ", installDate=" + installDate + + ", remarks='" + remarks + '\'' + + ", rowId='" + rowId + '\'' + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/DeviceManageEntity.java b/user-service/src/main/java/com/mh/user/entity/DeviceManageEntity.java new file mode 100644 index 0000000..dfbbffd --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeviceManageEntity.java @@ -0,0 +1,66 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * @author ljf + * @title : + * @description :设备管理实体类 + * @updateTime 2020-05-14 + * @throws : + */ +@Setter +@Getter +public class DeviceManageEntity extends BaseEntity { + + private String deviceCode; + private String deviceNum; + private String collectionNum; + private String dataCom; + private String initialValue; + private String deviceRate; + private String price; + private int paramId; + private String paramName; + private String lastValue; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date lastDate; + private String lastDates; + private String communicationType; + private String deviceType; + private String remark; + private int grade; + private String deviceCaliber; + private String type; + private String createTimes; + private String updateTimes; + + @Override + public String toString() { + return "DeviceManageEntity{" + + "deviceCode='" + deviceCode + '\'' + + ", deviceNum='" + deviceNum + '\'' + + ", collectionNum='" + collectionNum + '\'' + + ", dataCom='" + dataCom + '\'' + + ", initialValue='" + initialValue + '\'' + + ", deviceRate='" + deviceRate + '\'' + + ", price='" + price + '\'' + + ", paramId=" + paramId + + ", paramName='" + paramName + '\'' + + ", lastValue='" + lastValue + '\'' + + ", lastDate=" + lastDate + + ", communicationType='" + communicationType + '\'' + + ", deviceType='" + deviceType + '\'' + + ", remark='" + remark + '\'' + + ", grade=" + grade + + ", deviceCaliber=" + deviceCaliber + + ", type=" + type + + ", createTime=" + createTimes + + ", updateTime=" + updateTimes + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/DeviceParameterEntity.java b/user-service/src/main/java/com/mh/user/entity/DeviceParameterEntity.java new file mode 100644 index 0000000..622ff4c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeviceParameterEntity.java @@ -0,0 +1,35 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description :设备参数管理实体类 + * @updateTime 2020-05-14 + * @throws : + */ +@Setter +@Getter +public class DeviceParameterEntity extends BaseEntity { + + private int paramId; // 参数编号 + private String paramName; // 参数名称,及设备类型 + private int paramBaudrate; // 采集波特率 + private String checks; // 校验位 + private int grade; // 波特率 + private String type; //操作类型 + + @Override + public String toString() { + return "DeviceParameterEntity{" + + "paramId=" + paramId + + ", paramName='" + paramName + '\'' + + ", paramBaudrate=" + paramBaudrate + + ", checks='" + checks + '\'' + + ", grade=" + grade + + ", type=" + type + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/DeviceStateEntity.java b/user-service/src/main/java/com/mh/user/entity/DeviceStateEntity.java new file mode 100644 index 0000000..b429b74 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeviceStateEntity.java @@ -0,0 +1,26 @@ +package com.mh.user.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class DeviceStateEntity { + + private Date curDate; + private int deviceNum; + private int electNum; + private int waterNum; + private int pumpNum; + private int PressureNum; + private int runNum; + private int lastRunNum; + private String runP; + private int onlineNum; + private int offlineNum; + private int faultNum; + private int lastFaultNum; + private String faultP; + private int pumpOnline; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/EnergyEntity.java b/user-service/src/main/java/com/mh/user/entity/EnergyEntity.java new file mode 100644 index 0000000..d742948 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/EnergyEntity.java @@ -0,0 +1,26 @@ +package com.mh.user.entity; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.mh.user.utils.Double2Serializer; +import lombok.Data; + +@Data +public class EnergyEntity { + + private Long id; + private String curDate; //时间 + private String buildingId; //楼栋编号 + private String buildingName; //楼栋名称 + private double hotWaterValue; //热水产量 + private double useHotWater; //热水消耗 + private double electValue; //用电量 + private double electWater; //单耗 + private int checkInCount; //楼栋人数 + @JsonSerialize(using = Double2Serializer.class) + private double perElect; //平均用电 + @JsonSerialize(using = Double2Serializer.class) + private double perWater; //平均用水 + private String electCurValue; //电表读数 + private String wtCurValue; //水表读数 + +} diff --git a/user-service/src/main/java/com/mh/user/entity/EnergySumEntity.java b/user-service/src/main/java/com/mh/user/entity/EnergySumEntity.java new file mode 100644 index 0000000..7da51d6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/EnergySumEntity.java @@ -0,0 +1,18 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class EnergySumEntity { + private Long id; //序号 + private String curDate; //日期 + private String buildingId; //楼栋编号 + private String fillWater; //补水 + private String fillWaterP; //补水与昨日比 + private String waterValue; //用水 + private String waterP; //用水与昨日比 + private String electValue; //用电 + private String electP; //用电与昨日比 + private String electWater; //单耗 + private String electWaterP; //单耗与昨日比 +} diff --git a/user-service/src/main/java/com/mh/user/entity/ExceptionEntity.java b/user-service/src/main/java/com/mh/user/entity/ExceptionEntity.java new file mode 100644 index 0000000..75a183b --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/ExceptionEntity.java @@ -0,0 +1,33 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-31 + * @throws : + */ +@Setter +@Getter +public class ExceptionEntity { + + private Integer page; + private Integer limit; + private String beginTime; + private String endTime; + private Integer process; + + @Override + public String toString() { + return "ExceptionEntity{" + + "page=" + page + + ", limit=" + limit + + ", beginTime='" + beginTime + '\'' + + ", endTime='" + endTime + '\'' + + ", process=" + process + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/ExceptionTableData.java b/user-service/src/main/java/com/mh/user/entity/ExceptionTableData.java new file mode 100644 index 0000000..a80b0c6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/ExceptionTableData.java @@ -0,0 +1,35 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-31 + * @throws : + */ +@Getter +@Setter +public class ExceptionTableData { + + private int deviceId; + private String deviceName; + private int info; + private String timeStamp; + private String remark; + private int process; // 0(正常),1(处理中),2(异常) + + @Override + public String toString() { + return "TableData{" + + "deviceId=" + deviceId + + ", deviceName='" + deviceName + '\'' + + ", info=" + info + + ", timeStamp='" + timeStamp + '\'' + + ", remark='" + remark + '\'' + + ", process=" + process + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/FirstTableEntity.java b/user-service/src/main/java/com/mh/user/entity/FirstTableEntity.java new file mode 100644 index 0000000..cf526fb --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/FirstTableEntity.java @@ -0,0 +1,29 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-25 + * @throws : + */ +@Setter +@Getter +public class FirstTableEntity extends BaseEntity { + + private String type; + private List tableInfo; + + @Override + public String toString() { + return "FirstTableEntity{" + + "type='" + type + '\'' + + ", tableInfo=" + tableInfo + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/GatewayManageEntity.java b/user-service/src/main/java/com/mh/user/entity/GatewayManageEntity.java new file mode 100644 index 0000000..7b1788e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/GatewayManageEntity.java @@ -0,0 +1,32 @@ +package com.mh.user.entity; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * @author ljf + * @title : + * @description :网关管理实体类 + * @updateTime 2020-05-21 + * @throws : + */ +@Data +public class GatewayManageEntity { + + private Long id; //id + private String gatewayName; //网关名称 + private String gatewayIP; //网关IP地址 + private String gatewayAddress; //网关安装地址 + private String gatewayPort; //串口号或者端口号 + private String grade; //标志位(连接状态) 0:不在线;1:在线;2:异常 + private String internetCard; //物联网卡号 + private String operator; //0:中国移动 1:中国联通 2:中国电信 + private String createDate; //安装时间 + private String connectDate; //最新上线连接时间 + private String remarks; //备注 + private String type; //操作类型 +} diff --git a/user-service/src/main/java/com/mh/user/entity/GaugeEntity.java b/user-service/src/main/java/com/mh/user/entity/GaugeEntity.java new file mode 100644 index 0000000..2fcf244 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/GaugeEntity.java @@ -0,0 +1,31 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : 圆表盘的实体类 + * @description : + * @updateTime 2020-08-07 + * @throws : + */ +@Setter +@Getter +public class GaugeEntity { + + private String chartType; + private String title; + private String max; + private double dataValue; + + @Override + public String toString() { + return "GaugeEntity{" + + "chartType='" + chartType + '\'' + + ", title='" + title + '\'' + + ", max='" + max + '\'' + + ", dataValue=" + dataValue + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/HostValue.java b/user-service/src/main/java/com/mh/user/entity/HostValue.java new file mode 100644 index 0000000..cab0b77 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/HostValue.java @@ -0,0 +1,30 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title :主机进出水温度 + * @description : + * @updateTime 2020-07-30 + * @throws : + */ +@Setter +@Getter +public class HostValue { + + private int id; + private String type; + private double value; + + @Override + public String toString() { + return "HostValue{" + + "id=" + id + + ", type='" + type + '\'' + + ", value=" + value + + '}'; + } + +} diff --git a/user-service/src/main/java/com/mh/user/entity/MaintainInfoEntity.java b/user-service/src/main/java/com/mh/user/entity/MaintainInfoEntity.java new file mode 100644 index 0000000..7cee919 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/MaintainInfoEntity.java @@ -0,0 +1,23 @@ +package com.mh.user.entity; + + +import lombok.Data; + +import java.util.Date; + +@Data +public class MaintainInfoEntity { + + private Long id; //编号 + private Date curDate; //当前日期 + private String buildingId; //楼栋编号 + private String buildingName;//楼栋名称 + private String deviceType; //设备类型 + private String deviceAddr; //设备地址 + private String maintainType; //维护类型 + private String maintainPeople; //维护人员 + private Double cost; //费用 + private String contents; //维保内容 + + +} diff --git a/user-service/src/main/java/com/mh/user/entity/MaintainSumEntity.java b/user-service/src/main/java/com/mh/user/entity/MaintainSumEntity.java new file mode 100644 index 0000000..6337068 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/MaintainSumEntity.java @@ -0,0 +1,22 @@ +package com.mh.user.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class MaintainSumEntity { + + private Long id; + private String buildingId; + private String curDate; + private int dayNum; + private String dayP; + private int weekNum; + private String weekP; + private int monthNum; + private String monthP; + private int yearNum; + private String yearP; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/NowDataEntity.java b/user-service/src/main/java/com/mh/user/entity/NowDataEntity.java new file mode 100644 index 0000000..23242ae --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/NowDataEntity.java @@ -0,0 +1,26 @@ +package com.mh.user.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class NowDataEntity { + + private Long id; + private String curDate; //日期 + private String buildingId; //楼栋编号 + private String buildingName; //楼栋名称 + private String pumpId; //热泵编号 + private String pumpName; //热泵名称 + private String tempSet; //水温设定 + private String waterTemp; //水箱水温 + private String runState; //运行状态 + private String isFault; //是否故障 + private String levelSet; //水位设置 + private String waterLevel; //实际水位 + private String tankId; //水箱编号 + private String tankName; //水箱名称 + private String envTemp; //环境温度 + +} diff --git a/user-service/src/main/java/com/mh/user/entity/NowPublicDataEntity.java b/user-service/src/main/java/com/mh/user/entity/NowPublicDataEntity.java new file mode 100644 index 0000000..cef9f58 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/NowPublicDataEntity.java @@ -0,0 +1,21 @@ +package com.mh.user.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class NowPublicDataEntity { + + private Long id; + private Date curDate; //日期 + private String buildingId; //楼栋编号 + private String buildingName; //楼栋名称 + private String upWater; //补水状态 + private String useWater; //供水状态 + private String backWater; //回水状态 + private String useWaterTemp; //供水温度 + private String backWaterTemp; //回水温度 + private String singleTemp; //单箱温度 + +} diff --git a/user-service/src/main/java/com/mh/user/entity/OrderEntity.java b/user-service/src/main/java/com/mh/user/entity/OrderEntity.java new file mode 100644 index 0000000..6cfdb2f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/OrderEntity.java @@ -0,0 +1,35 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : 接收前端传过来的指令 + * @updateTime 2020-05-28 + * @throws : + */ +@Setter +@Getter +public class OrderEntity { + + private Integer id; + private String param; + private Integer type; // 0:修改频率, + // 1:修改开关状态, + // 2: 关闭冷却泵之前,查询最近关闭的冷却塔时间 + // 3:群控手自动模式切换 + // 4:修改温度 + // 5:修改压力 + + @Override + public String toString() { + return "OrderEntity{" + + "id=" + id + + ", param='" + param + '\'' + + ", type='" + type + '\'' + + '}'; + } + +} diff --git a/user-service/src/main/java/com/mh/user/entity/OrderMessageEntity.java b/user-service/src/main/java/com/mh/user/entity/OrderMessageEntity.java new file mode 100644 index 0000000..4eef932 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/OrderMessageEntity.java @@ -0,0 +1,46 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * @author ljf + * @title : + * @description : 指令存储实体类 + * @updateTime 2020-05-28 + * @throws : + */ +@Setter +@Getter +public class OrderMessageEntity extends BaseEntity { + + private String registerAddr; + private String registerName; + private String otherName; + private String orderStr; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date sendTime; + private int sendNum; + private int status; + private int grade; + + @Override + public String toString() { + return "OrderMessageEntity{" + + "registerAddr='" + registerAddr + '\'' + + ", registerName='" + registerName + '\'' + + ", otherName='" + otherName + '\'' + + ", orderStr='" + orderStr + '\'' + + ", createTime=" + createTime + + ", sendTime=" + sendTime + + ", sendNum=" + sendNum + + ", status=" + status + + ", grade=" + grade + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/PumpMinutesEntity.java b/user-service/src/main/java/com/mh/user/entity/PumpMinutesEntity.java new file mode 100644 index 0000000..338847d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/PumpMinutesEntity.java @@ -0,0 +1,17 @@ +package com.mh.user.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class PumpMinutesEntity { + + private String buildingId; + private String buildingName; + private String pumpId; + private String pumpName; + private String runMinutes; + private String curDate; +} + diff --git a/user-service/src/main/java/com/mh/user/entity/PumpSetEntity.java b/user-service/src/main/java/com/mh/user/entity/PumpSetEntity.java new file mode 100644 index 0000000..76e7389 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/PumpSetEntity.java @@ -0,0 +1,19 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class PumpSetEntity { + + private long id; + private String buildingId; + private String pumpId; + private String pumpName; + private String tempSet; + private String waterTemp; + private String startTime1; + private String closeTime1; + private String startTime2; + private String closeTime2; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/ReportParamEntity.java b/user-service/src/main/java/com/mh/user/entity/ReportParamEntity.java new file mode 100644 index 0000000..6cf9248 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/ReportParamEntity.java @@ -0,0 +1,35 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-03 + * @throws : + */ +@Setter +@Getter +public class ReportParamEntity { + + private int id; + private String label; + private int parentId; + private int levelType; + private List children; + + @Override + public String toString() { + return "ReportParamEntity{" + + "id=" + id + + ", label='" + label + '\'' + + ", parentId=" + parentId + + ", levelType=" + levelType + + ", children=" + children + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/SysParamEntity.java b/user-service/src/main/java/com/mh/user/entity/SysParamEntity.java new file mode 100644 index 0000000..520a342 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/SysParamEntity.java @@ -0,0 +1,10 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class SysParamEntity { + + private String customName; //公司或者单位名称 + private String logo; //logo地址 +} diff --git a/user-service/src/main/java/com/mh/user/entity/TableChartMessageEntity.java b/user-service/src/main/java/com/mh/user/entity/TableChartMessageEntity.java new file mode 100644 index 0000000..37efe42 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/TableChartMessageEntity.java @@ -0,0 +1,27 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-08-07 + * @throws : + */ +@Setter +@Getter +public class TableChartMessageEntity { + + private String timeName; + private int grade; + + @Override + public String toString() { + return "TableChartMessageEntity{" + + "timeName='" + timeName + '\'' + + ", grade=" + grade + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/TableDataEntity.java b/user-service/src/main/java/com/mh/user/entity/TableDataEntity.java new file mode 100644 index 0000000..ab98c7d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/TableDataEntity.java @@ -0,0 +1,33 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-25 + * @throws : + */ +@Getter +@Setter +public class TableDataEntity { + + private int span; + private String title; + private String info; + private String infos; + private int rows; + + @Override + public String toString() { + return "TableDataEntity{" + + "span=" + span + + ", title='" + title + '\'' + + ", info='" + info + '\'' + + ", infos='" + infos + '\'' + + ", rows=" + rows + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/TableInfoEntity.java b/user-service/src/main/java/com/mh/user/entity/TableInfoEntity.java new file mode 100644 index 0000000..fe41ba2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/TableInfoEntity.java @@ -0,0 +1,32 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-25 + * @throws : + */ +@Setter +@Getter +public class TableInfoEntity { + + private int rowspan; + private String td1; + private String td2; + private String td3; + + @Override + public String toString() { + return "TableInfoEntity{" + + "rowspan=" + rowspan + + ", td1='" + td1 + '\'' + + ", td2='" + td2 + '\'' + + ", td3='" + td3 + '\'' + + '}'; + } + +} diff --git a/user-service/src/main/java/com/mh/user/entity/TestEntity.java b/user-service/src/main/java/com/mh/user/entity/TestEntity.java new file mode 100644 index 0000000..a623b16 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/TestEntity.java @@ -0,0 +1,48 @@ +package com.mh.user.entity; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-08-20 + * @throws : + */ +public class TestEntity { + + private int id; + private String name; + private String sex; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + @Override + public String toString() { + return "TestEntity{" + + "id=" + id + + ", name='" + name + '\'' + + ", sex='" + sex + '\'' + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/UploadDeviceFloorEntity.java b/user-service/src/main/java/com/mh/user/entity/UploadDeviceFloorEntity.java new file mode 100644 index 0000000..ac83d8d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/UploadDeviceFloorEntity.java @@ -0,0 +1,31 @@ +package com.mh.user.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class UploadDeviceFloorEntity { + + private String deviceName; + private String deviceType; + private String buildingId; + private String model; + private String specs; + private String rowId; //行号 + + public UploadDeviceFloorEntity() { + + } + + public UploadDeviceFloorEntity(String deviceName,String deviceType, String buildingId, + String model, String specs, String rowId) { + this.deviceName = deviceName; + this.deviceType = deviceType; + this.buildingId = buildingId; + this.model = model; + this.specs = specs; + this.rowId = rowId; + } + +} diff --git a/user-service/src/main/java/com/mh/user/entity/UploadDeviceInstallEntity.java b/user-service/src/main/java/com/mh/user/entity/UploadDeviceInstallEntity.java new file mode 100644 index 0000000..4fad940 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/UploadDeviceInstallEntity.java @@ -0,0 +1,141 @@ +package com.mh.user.entity; + +import java.util.Date; + +public class UploadDeviceInstallEntity { + + private String deviceAddr; //通讯编号 + private String deviceName; //设备名称 + private String deviceType; //设备类型 + private String dataCom; //串口 + private int baudRate; //波特率 + private double ratio; //倍率 + private String brand; //品牌 + private String model; //型号 + private String installer; //安装人员 + private String buildingId; //楼栋编号 + private String rowId; //Eexcel文件行号 + + public UploadDeviceInstallEntity() { + } + + public UploadDeviceInstallEntity(String deviceAddr, String deviceName,String deviceType,String dataCom,int baudRate, + Double ratio, String brand,String model,String installer,String buildingId,String rowId) { + this.deviceAddr = deviceAddr; + this.deviceName = deviceName; + this.deviceType = deviceType; + this.dataCom = dataCom; + this.baudRate = baudRate; + this.ratio = ratio; + this.brand=brand; + this.model=model; + this.installer=installer; + this.buildingId = buildingId; + this.rowId = rowId; + } + + public String getDeviceAddr() { + return deviceAddr; + } + + public void setDeviceAddr(String deviceAddr) { + this.deviceAddr = deviceAddr; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public int getBaudRate() { + return baudRate; + } + + public void setBaudRate(int baudRate) { + this.baudRate = baudRate; + } + + public String getDataCom() { + return dataCom; + } + + public void setDataCom(String dataCom) { + this.dataCom = dataCom; + } + + public double getRatio() { + return ratio; + } + + public void setRatio(double ratio) { + this.ratio = ratio; + } + + public String getBuildingId() { + return buildingId; + } + + public void setBuildingId(String buildingId) { + this.buildingId = buildingId; + } + + public String getBrand() { + return brand; + } + + public void setBrand(String brand) { + this.brand = brand; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getInstaller() { + return installer; + } + + public void setInstaller(String installer) { + this.installer = installer; + } + + public String getRowId() { + return rowId; + } + + public void setRowId(String rowId) { + this.rowId = rowId; + } + + @Override + public String toString() { + return "UploadDeviceInstallEntity{" + + "deviceAddr='" + deviceAddr + '\'' + + ", deviceName='" + deviceName + '\'' + + ", deviceType='" + deviceType + '\'' + + ", dataCom='" + dataCom + '\'' + + ", baudRate=" + baudRate + + ", ratio=" + ratio + + ", brand='" + brand + '\'' + + ", model='" + model + '\'' + + ", installer='" + installer + '\'' + + ", buildingId='" + buildingId + '\'' + + ", rowId='" + rowId + '\'' + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/UseForecastEntity.java b/user-service/src/main/java/com/mh/user/entity/UseForecastEntity.java new file mode 100644 index 0000000..bae2ac3 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/UseForecastEntity.java @@ -0,0 +1,18 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class UseForecastEntity { + + private String tankId; + private String tankName; + private String wtLevelSet; + private String wtTempSet; + private String tankLevel; + private String tankTemp; + private String envTemp; + private String startDatetime; + private String buildingId; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/WaterLevelEntity.java b/user-service/src/main/java/com/mh/user/entity/WaterLevelEntity.java new file mode 100644 index 0000000..ee9b7d2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/WaterLevelEntity.java @@ -0,0 +1,27 @@ +package com.mh.user.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class WaterLevelEntity { + + private Date curDate; + private String buildingID; + private String buildingName; + private String level00; + private String level02; + private String level08; + private String level11; + private String level13; + private String level15; + private String level16; + private String level17; + private String level18; + private String level19; + private String level20; + private String level21; + private String level22; + private String level23; +} diff --git a/user-service/src/main/java/com/mh/user/entity/WaterTempEntity.java b/user-service/src/main/java/com/mh/user/entity/WaterTempEntity.java new file mode 100644 index 0000000..21ef6aa --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/WaterTempEntity.java @@ -0,0 +1,38 @@ +package com.mh.user.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class WaterTempEntity { + private Date curDate; + private String buildingID; + private String buildingName; + private String pumpID; + private String pumpName; + private String temp00; +// private String temp01; + private String temp02; +// private String temp03; +// private String temp04; +// private String temp05; +// private String temp06; +// private String temp07; + private String temp08; +// private String temp09; +// private String temp10; + private String temp11; +// private String temp12; + private String temp13; +// private String temp14; + private String temp15; + private String temp16; + private String temp17; + private String temp18; + private String temp19; + private String temp20; + private String temp21; + private String temp22; + private String temp23; +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/AxisLine.java b/user-service/src/main/java/com/mh/user/entity/chart/AxisLine.java new file mode 100644 index 0000000..3a50adc --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/AxisLine.java @@ -0,0 +1,23 @@ +package com.mh.user.entity.chart; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +public class AxisLine { + private boolean show; + private LineStyle lineStyle; + + public AxisLine(boolean show, LineStyle lineStyle) { + this.show = show; + this.lineStyle = lineStyle; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/BaseChartEntity.java b/user-service/src/main/java/com/mh/user/entity/chart/BaseChartEntity.java new file mode 100644 index 0000000..8f1b328 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/BaseChartEntity.java @@ -0,0 +1,45 @@ +package com.mh.user.entity.chart; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : 基础数据获取实体类 + * @description : + * @updateTime 2020-07-13 + * @throws : + */ +@Setter +@Getter +public class BaseChartEntity { + + private String chartTime; + private String indexName; + private String indexType; + private String displayType; + private int indexId; + private int width; + private String chartName; + private String timeName; + private int chartId; + private String unit; + private double data; + + @Override + public String toString() { + return "BaseChartEntity{" + + "chartTime='" + chartTime + '\'' + + ", indexName='" + indexName + '\'' + + ", indexType='" + indexType + '\'' + + ", displayType='" + displayType + '\'' + + ", indexId=" + indexId + + ", width=" + width + + ", chartName='" + chartName + '\'' + + ", timeName='" + timeName + '\'' + + ", chartId=" + chartId + + ", unit='" + unit + '\'' + + ", data=" + data + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/ChartEntity.java b/user-service/src/main/java/com/mh/user/entity/chart/ChartEntity.java new file mode 100644 index 0000000..8337438 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/ChartEntity.java @@ -0,0 +1,50 @@ +package com.mh.user.entity.chart; + +import com.alibaba.fastjson2.annotation.JSONType; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * @author ljf + * @title :图表实体类 + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +@JSONType(orders = {"title","feature","legend","xAxis","yAxis","series","timeName"}) +public class ChartEntity { + + private Title title; + private Feature feature; + private Legend legend; + private XAxis xAxis; + private List yAxis; + private List series; + + public ChartEntity(Title title, Feature feature, Legend legend, XAxis xAxis, List yAxis, List series) { + this.title = title; + this.feature = feature; + this.legend = legend; + this.xAxis = xAxis; + this.yAxis = yAxis; + this.series = series; + } + + @Override + public String toString() { + return "ChartEntity{" + + "title=" + title + + ", feature=" + feature + + ", legend=" + legend + + ", xAxis=" + xAxis + + ", yAxis=" + yAxis + + ", series=" + series + + '}'; + } +} + + diff --git a/user-service/src/main/java/com/mh/user/entity/chart/Feature.java b/user-service/src/main/java/com/mh/user/entity/chart/Feature.java new file mode 100644 index 0000000..8597323 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/Feature.java @@ -0,0 +1,31 @@ +package com.mh.user.entity.chart; + +import com.alibaba.fastjson2.annotation.JSONType; +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Getter +@Setter +@JSONType(orders = {"state","tile","icon","name"}) +public class Feature { + private boolean[] state; + private String[] title; + private String[] icon; + private String[] name; + private String[] yAxisName; + + public Feature(boolean[] state, String[] title, String[] icon, String[] name, String[] yAxisName) { + this.state = state; + this.title = title; + this.icon = icon; + this.name = name; + this.yAxisName = yAxisName; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/GetChartParams.java b/user-service/src/main/java/com/mh/user/entity/chart/GetChartParams.java new file mode 100644 index 0000000..477fe94 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/GetChartParams.java @@ -0,0 +1,35 @@ +package com.mh.user.entity.chart; + +import lombok.Getter; +import lombok.Setter; + +import java.util.Arrays; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-17 + * @throws : + */ +@Setter +@Getter +public class GetChartParams { + + private int chartId; + private int[] chooseIndexId; + private String beginTime; + private String endTime; + private String type; // 'today' 'yesterday' 'twentyFourHour' 'thisWeek' 'fourWeek' 'twelveMonth' 'fourYear' + + @Override + public String toString() { + return "GetChartParams{" + + "chartId=" + chartId + + ", chooseIndexId=" + Arrays.toString(chooseIndexId) + + ", beginTime='" + beginTime + '\'' + + ", endTime='" + endTime + '\'' + + ", type='" + type + '\'' + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/Legend.java b/user-service/src/main/java/com/mh/user/entity/chart/Legend.java new file mode 100644 index 0000000..397f89d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/Legend.java @@ -0,0 +1,27 @@ +package com.mh.user.entity.chart; + +import com.alibaba.fastjson2.annotation.JSONType; +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +@JSONType(orders = {"data","width","indexId"}) +public class Legend { + private String[] data; + private int width; + private int[] indexId; + + public Legend(String[] data, int width, int[] indexId) { + this.data = data; + this.width = width; + this.indexId = indexId; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/LineStyle.java b/user-service/src/main/java/com/mh/user/entity/chart/LineStyle.java new file mode 100644 index 0000000..b7b53bb --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/LineStyle.java @@ -0,0 +1,21 @@ +package com.mh.user.entity.chart; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +public class LineStyle { + private String color; + + public LineStyle(String color) { + this.color = color; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/Series.java b/user-service/src/main/java/com/mh/user/entity/chart/Series.java new file mode 100644 index 0000000..6c9f911 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/Series.java @@ -0,0 +1,29 @@ +package com.mh.user.entity.chart; + +import com.alibaba.fastjson2.annotation.JSONType; +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +@JSONType(orders = {"name","type","yAxisIndex","data"}) +public class Series { + private String name; + private String type; + private int yAxisIndex; + private Double[] data; + + public Series(String name, String type, int yAxisIndex, Double[] data) { + this.name = name; + this.type = type; + this.yAxisIndex = yAxisIndex; + this.data = data; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/SplitLine.java b/user-service/src/main/java/com/mh/user/entity/chart/SplitLine.java new file mode 100644 index 0000000..094faeb --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/SplitLine.java @@ -0,0 +1,21 @@ +package com.mh.user.entity.chart; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +public class SplitLine { + private boolean show; + + public SplitLine(boolean show) { + this.show = show; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/Title.java b/user-service/src/main/java/com/mh/user/entity/chart/Title.java new file mode 100644 index 0000000..898472e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/Title.java @@ -0,0 +1,25 @@ +package com.mh.user.entity.chart; + +import com.alibaba.fastjson2.annotation.JSONType; +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +@JSONType(orders = {"state","name"}) +public class Title { + private boolean state; + private String name; + + public Title(boolean state, String name) { + this.state = state; + this.name = name; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/Unit.java b/user-service/src/main/java/com/mh/user/entity/chart/Unit.java new file mode 100644 index 0000000..76b4cfd --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/Unit.java @@ -0,0 +1,37 @@ +package com.mh.user.entity.chart; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description :单位实体类 + * @updateTime 2020-07-13 + * @throws : + */ +@Setter +@Getter +public class Unit { + + private int id; + private String unitName; + private String unit; + private String icon; + private String grade; + private String indexName; + private String otherName; + + @Override + public String toString() { + return "Unit{" + + "id=" + id + + ", unitName='" + unitName + '\'' + + ", unit='" + unit + '\'' + + ", icon='" + icon + '\'' + + ", grade='" + grade + '\'' + + ", indexName='" + indexName + '\'' + + ", otherName='" + otherName + '\'' + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/XAxis.java b/user-service/src/main/java/com/mh/user/entity/chart/XAxis.java new file mode 100644 index 0000000..922df29 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/XAxis.java @@ -0,0 +1,21 @@ +package com.mh.user.entity.chart; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +public class XAxis { + private String[] data; + + public XAxis(String[] data) { + this.data = data; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/YAxis.java b/user-service/src/main/java/com/mh/user/entity/chart/YAxis.java new file mode 100644 index 0000000..d642a9a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/YAxis.java @@ -0,0 +1,31 @@ +package com.mh.user.entity.chart; + +import com.alibaba.fastjson2.annotation.JSONType; +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +@JSONType(orders = {"type","name","splitLine","axisLine","show"}) +public class YAxis { + private String type; + private String name; + private SplitLine splitLine; + private AxisLine axisLine; + private boolean show; + + public YAxis(String type, String name, SplitLine splitLine, AxisLine axisLine, boolean show) { + this.type = type; + this.name = name; + this.splitLine = splitLine; + this.axisLine = axisLine; + this.show = show; + } +} diff --git a/user-service/src/main/java/com/mh/user/exception/BaseErrorInfo.java b/user-service/src/main/java/com/mh/user/exception/BaseErrorInfo.java new file mode 100644 index 0000000..9e3a3f8 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/exception/BaseErrorInfo.java @@ -0,0 +1,9 @@ +package com.mh.user.exception; + +public interface BaseErrorInfo { + /** 错误码*/ + int getResultCode(); + + /** 错误描述*/ + String getResultMsg(); +} diff --git a/user-service/src/main/java/com/mh/user/exception/CommonNum.java b/user-service/src/main/java/com/mh/user/exception/CommonNum.java new file mode 100644 index 0000000..eae8c20 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/exception/CommonNum.java @@ -0,0 +1,50 @@ +package com.mh.user.exception; + +public enum CommonNum implements BaseErrorInfo { + /** + * 自定义错误信息 + */ + SUCCESS(200, "成功!"), + BODY_NOT_MATCH(400,"请求的数据格式不符!"), + SIGNATURE_NOT_MATCH(401,"请求的数字签名不匹配!"), + NOT_FOUND(404, "未找到该资源!"), + INTERNAL_SERVER_ERROR(500, "服务器内部错误!"), + SERVER_BUSY(503,"服务器正忙,请稍后再试!"), + + OK(0, ""), + FAIL(-1, "操作失败"), + RPC_ERROR(-2,"远程调度失败"), + USER_NOT_FOUND(1000,"用户不存在"), + USER_PASSWORD_ERROR(1001,"密码错误"), + GET_TOKEN_FAIL(1002,"获取token失败"), + TOKEN_IS_NOT_MATCH_USER(1003,"请使用自己的token进行接口请求"), + BLOG_IS_NOT_EXIST(2001,"该博客不存在"); + + /** + * 错误码 + */ + private int resultCode; + + /** + * 错误描述 + */ + private String resultMsg; + + + CommonNum(int resultCode, String resultMsg) { + this.resultCode = resultCode; + this.resultMsg = resultMsg; + } + + @Override + public int getResultCode() { + return resultCode; + } + + @Override + public String getResultMsg() { + return resultMsg; + } +} + + diff --git a/user-service/src/main/java/com/mh/user/exception/GlobalException.java b/user-service/src/main/java/com/mh/user/exception/GlobalException.java new file mode 100644 index 0000000..eba92d8 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/exception/GlobalException.java @@ -0,0 +1,51 @@ +package com.mh.user.exception; +import com.mh.common.http.HttpResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +@ControllerAdvice +public class GlobalException { + private static final Logger logger = LoggerFactory.getLogger(GlobalException.class); + + /** + * 处理自定义异常 + * @param e + * @return + */ + @ResponseBody + @ExceptionHandler(value = ServiceRuntimeException.class) + public HttpResult serviceRuntimeException(ServiceRuntimeException e){ + logger.error("发生业务异常!原因是:{}",e.getMessage()); + return HttpResult.error(e.getCode(),e.getMessage()); + } + + /** + * 处理空指针异常 + * @param e + * @return + */ + @ResponseBody + @ExceptionHandler(value = NullPointerException.class) + public HttpResult exceptionHandler(NullPointerException e){ + logger.error("发生空指针异常!原因是:",e); + return HttpResult.error(CommonNum.BODY_NOT_MATCH.getResultMsg()); + + } + + /** + * 其它异常 + * @param e + * @return + */ + @ResponseBody + @ExceptionHandler(value = Exception.class) + public HttpResult exceptionHandler(Exception e){ + logger.error("发生异常!原因是:",e); + return HttpResult.error(500,e.getMessage()); + + } + +} diff --git a/user-service/src/main/java/com/mh/user/exception/ServiceRuntimeException.java b/user-service/src/main/java/com/mh/user/exception/ServiceRuntimeException.java new file mode 100644 index 0000000..54c9c2c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/exception/ServiceRuntimeException.java @@ -0,0 +1,64 @@ +package com.mh.user.exception; + +public class ServiceRuntimeException extends RuntimeException{ + /** + * 错误码 + */ + private int code; + /** + * 错误信息 + */ + private String message; + + public ServiceRuntimeException(String message){ + super(message); + this.message = message; + + } + + public ServiceRuntimeException(int code,String message){ + super(message); + this.code = code; + this.message = message; + + } + + //Throwable是Error和Exception的父类,用来定义所有可以作为异常被抛出来的类。 + public ServiceRuntimeException(int code,String message,Throwable cause){ + super(message,cause); + this.code = code; + this.message = message; + + } + + public ServiceRuntimeException(BaseErrorInfo baseErrorInfo){ + super(baseErrorInfo.getResultMsg()); + this.code = baseErrorInfo.getResultCode(); + this.message = baseErrorInfo.getResultMsg(); + } + + public ServiceRuntimeException(BaseErrorInfo baseErrorInfo, Throwable cause){ + super(baseErrorInfo.getResultMsg(),cause); + this.code = baseErrorInfo.getResultCode(); + this.message = baseErrorInfo.getResultMsg(); + } + + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + @Override + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} + diff --git a/user-service/src/main/java/com/mh/user/job/CollectionLoopRunner.java b/user-service/src/main/java/com/mh/user/job/CollectionLoopRunner.java new file mode 100644 index 0000000..2c23bd1 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/CollectionLoopRunner.java @@ -0,0 +1,208 @@ +package com.mh.user.job; + +import com.mh.user.constants.Constant; +import com.mh.user.entity.AddCronJobReq; +import com.mh.user.manage.QuartzManager; +import com.mh.user.serialport.SerialPortListener; +import com.mh.user.serialport.SerialPortUtil; +import com.mh.user.utils.TimedTask2; +import gnu.io.SerialPort; +import gnu.io.SerialPortEvent; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** + * @author ljf + * @title : + * @description : 自动执行采集程序,通过 + * @updateTime 2020-05-15 + * @throws : + */ +@Component +public class CollectionLoopRunner implements ApplicationRunner { + + @Resource + QuartzManager quartzManager; + + public static SerialPort serialPort = null; + + @Override + public void run(ApplicationArguments args) throws Exception { +// collectionMeterAndCloud();//采集 +// Constant.WEB_FLAG=false; //恢复采集 + } + + public void test() throws Exception { + System.out.println("测试定时采集开关"); + // 执行定义的定时采集程序 + Map params = new HashMap<>(); + params.put("id", "2"); + params.put("name", "test1"); + //每 1 分钟 执行一次 + AddCronJobReq addCronJobReq = new AddCronJobReq(); + addCronJobReq.setDate("0/12 * * * * ?"); +// addCronJobReq.setDate("0/5 * * * * ?"); + addCronJobReq.setJobClass("JobTest1"); + addCronJobReq.setJobGroupName("JobTestGroup1"); + addCronJobReq.setJobName("Test1"); + addCronJobReq.setParams(params); + addCronJobReq.setTriggerGroupName("triggerTestGroup1"); + addCronJobReq.setTriggerName("triggerTest1"); + quartzManager.addCronJob(addCronJobReq); + } + + public void test1() throws Exception { + System.out.println("测试定时采集开关"); + // 执行定义的定时采集程序 + Map params = new HashMap<>(); + params.put("id", "1"); + params.put("name", "test"); + //每 1 分钟 执行一次 + AddCronJobReq addCronJobReq = new AddCronJobReq(); + addCronJobReq.setDate("0/10 * * * * ?"); +// addCronJobReq.setDate("0/5 * * * * ?"); + addCronJobReq.setJobClass("JobTest"); + addCronJobReq.setJobGroupName("JobTestGroup"); + addCronJobReq.setJobName("Test"); + addCronJobReq.setParams(params); + addCronJobReq.setTriggerGroupName("triggerTestGroup"); + addCronJobReq.setTriggerName("triggerTest"); + quartzManager.addCronJob(addCronJobReq); + } + + /** + * 定时采集电表和冷量计 + * + * @throws Exception + */ + public void collectionMeterAndCloud() throws Exception { + // 执行定义的定时采集程序 + Map params = new HashMap<>(); + params.put("id", "6"); + params.put("name", "cloud_meter"); + AddCronJobReq addCronJobReq = new AddCronJobReq(); + //每 2小时执行一次 +// addCronJobReq.setDate("0 0 0/2 * * ?"); //0 0 0/2 * * ? + //每 40 分钟 执行一次 +// addCronJobReq.setDate("0 10/40 * * * ?"); + //每 30 分钟 执行一次 +// addCronJobReq.setDate("0 0/30 * * * ?"); //广州理工 + //每 20 分钟 执行一次 +// addCronJobReq.setDate("0 0/20 * * * ?"); + //每 10 分钟 执行一次 + addCronJobReq.setDate("0 0/10 * * * ?"); //华厦 +// 每 3 分钟 执行一次 +// addCronJobReq.setDate("35 0/2 * * * ?"); + //每 2 分钟 执行一次 +// addCronJobReq.setDate("25 0/2 * * * ?"); + //每 1 分钟 执行一次 +// addCronJobReq.setDate("0/10 * * * * ?"); +// addCronJobReq.setDate("0/5 * * * * ?"); + addCronJobReq.setJobClass("JobCloudAndMeter"); + addCronJobReq.setJobGroupName("JobCloudAndMeterGroup"); + addCronJobReq.setJobName("CloudAndMeter"); + addCronJobReq.setParams(params); + addCronJobReq.setTriggerGroupName("triggerCloudAndMeterGroup"); + addCronJobReq.setTriggerName("triggerCloudAndMeter"); + quartzManager.addCronJob(addCronJobReq); + } + + /** + * 定时采集冷量计 + * + * @throws Exception + */ + public void collectionCloud() throws Exception { + // 执行定义的定时采集程序 + Map params = new HashMap<>(); + params.put("id", "1"); + params.put("name", "cloud"); + AddCronJobReq addCronJobReq = new AddCronJobReq(); + //每 2 分钟 执行一次 + addCronJobReq.setDate("25 0/2 * * * ?"); +// addCronJobReq.setDate("0/5 * * * * ?"); + addCronJobReq.setJobClass("JobCloud"); + addCronJobReq.setJobGroupName("JobCloudGroup"); + addCronJobReq.setJobName("Cloud"); + addCronJobReq.setParams(params); + addCronJobReq.setTriggerGroupName("triggerCloudGroup"); + addCronJobReq.setTriggerName("triggerCloud"); + quartzManager.addCronJob(addCronJobReq); + } + + /** + * 定时采集电表 + * + * @throws Exception + */ + public void collectionMeter() throws Exception { + // 执行定义的定时采集程序 + Map params = new HashMap<>(); + params.put("id", "2"); + params.put("name", "meter"); + AddCronJobReq addCronJobReq = new AddCronJobReq(); + //每 3 分钟 执行一次 + addCronJobReq.setDate("35 0/2 * * * ?"); +// addCronJobReq.setDate("0/20 * * * * ?"); + addCronJobReq.setJobClass("JobMeter"); + addCronJobReq.setJobGroupName("JobMeterGroup"); + addCronJobReq.setJobName("Meter"); + addCronJobReq.setParams(params); + addCronJobReq.setTriggerGroupName("triggerMeterGroup"); + addCronJobReq.setTriggerName("triggerMeter"); + quartzManager.addCronJob(addCronJobReq); + } + + + + public void testSerialPort(){ + + String portname = "COM7"; + //TestA(); + //查看所有串口 + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + ArrayList port = serialPortUtil.findPort(); + System.out.println("发现全部串口:" + port); + + System.out.println("打开指定portname:" + portname); + //打开该对应portname名字的串口 + CollectionLoopRunner.serialPort = serialPortUtil.openPort(portname, 2400, SerialPort.DATABITS_8, SerialPort.PARITY_EVEN, SerialPort.PARITY_ODD); + + byte[] HEX = SerialPortListener.hexStr2Byte("FEFEFE6810398710810000000103901F007C16"); + serialPortUtil.sendToPort(CollectionLoopRunner.serialPort, HEX); + + //给对应的serialPort添加监听器 + serialPortUtil.addListener(CollectionLoopRunner.serialPort, new SerialPortListener()); + } + public void plcAnalytic() { + String portName = "COM1"; + //查看所有串口 + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + //打开该对应portName名字的串口 + if (CollectionLoopRunner.serialPort == null) { + CollectionLoopRunner.serialPort = serialPortUtil.openPort(portName, 19200, SerialPort.DATABITS_8, SerialPort.PARITY_NONE, SerialPort.PARITY_ODD); + byte[] hex = SerialPortListener.hexStr2Byte("A55A230000000022".replaceAll("\\s*", "")); + serialPortUtil.sendToPort(CollectionLoopRunner.serialPort, hex); + + //给对应的serialPort添加监听器-->设置串口的Listener + SerialPortUtil.setListenerToSerialPort(CollectionLoopRunner.serialPort, serialPortEvent -> { + if (serialPortEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + byte[] bytes = serialPortUtil.readFromPort(CollectionLoopRunner.serialPort); + + String needData = SerialPortListener.printHexString(bytes); + + //数据校验 校验数据长度、起始5A A5、数据sum位 +// if (PlcUtil.makeChecksum(needData)) { +// //数据解析方法 此处编写你的解析方法,根据获取到的数据编写适合自己的方法 +// } + } + }); + } + } + +} diff --git a/user-service/src/main/java/com/mh/user/job/DealDataJob.java b/user-service/src/main/java/com/mh/user/job/DealDataJob.java new file mode 100644 index 0000000..5591f34 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/DealDataJob.java @@ -0,0 +1,180 @@ +package com.mh.user.job; + +import com.mh.user.constants.Constant; +import com.mh.user.serialport.SerialPortSendReceive; +import com.mh.user.serialport.SerialPortThread; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.service.DealDataService; +import com.mh.user.utils.AnalysisReceiveOrder485; +import com.mh.user.utils.GetReadOrder485; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @author ljf + * @title :定时处理采集回来的历史数据 + * @description : + * @updateTime 2020-07-28 + * @throws : + */ +@Slf4j +@Component +public class DealDataJob { + + private final DealDataService dealDataService; + + @Autowired + private DeviceCodeParamService deviceCodeParamService; + + private GetReadOrder485 getReadOrder485; + + private static int taskTimes = 1; + + public DealDataJob(DealDataService dealDataService) + { + this.dealDataService = dealDataService; + } + + /** + * 定时处理汇总数据:每15分钟处理一次,十分钟(0 0/10 * * * ?) + */ + @Scheduled(cron = "0 0/15 * * * ?") + public void ProEnergy() { + try { + SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd HH:00:00"); + Date date=new Date(); + String curDate=sdf1.format(date); + String name=dealDataService.customName(); + if (name!=null && name.length()>0 && name.contains("华夏学院")){ + dealDataService.proEnergy2(curDate); + }else{ + dealDataService.proEnergy(curDate); //yyyy-MM-dd HH:00:00 + } + dealDataService.proGatewayState(); //判断网关在线状态:在线或离线 + log.info("进入定时调试数据库过程汇总数据!yyyy-MM-dd HH:00:00"); + } catch (Exception e) { + e.printStackTrace(); + //Constant.FLAG=false; + //Constant.WEB_FLAG=false; + } + } + /** + * 采集 + */ + @Scheduled(cron = "35 0/2 * * * ?") +// @Scheduled(cron = "0/10 * * * * ?") 0 0/5 * * * ? +// @Scheduled(cron = "0 0/5 * * * ?") //5分钟 + public void collect() { + try { + log.info("------定时采集开始>>>>Constant.FLAG=="+Constant.FLAG+"------"); + SerialPortSendReceive sendReceive=new SerialPortSendReceive(); + if(Constant.FLAG==false){ + if(Constant.WEB_FLAG==false){ + log.info("------taskTimes=="+taskTimes+"------"); + if (taskTimes<=4) { + Constant.FLAG=true; + log.info("------Constant.WEB_FLAG=="+Constant.WEB_FLAG+"------"); + if (taskTimes == 2) {//2 + int r = deviceCodeParamService.queryCount2(); //查询记录数 + if (r == 0) { + getReadOrder485.createOrderParam2(); //生成采集参数 + } + for(int i=1;i<11;i++){ + SerialPortThread myThread = new SerialPortThread(); + Thread thread = new Thread(myThread); + myThread.setName("2", String.valueOf(i)); + thread.start(); + } + log.info("------采集水、电、运行状态!"+taskTimes+"------"); + }else if (taskTimes == 3){//3 + for(int i=1;i<11;i++){ + SerialPortThread myThread = new SerialPortThread(); + Thread thread = new Thread(myThread); + myThread.setName("1", String.valueOf(i)); + thread.start(); + } + log.info("------采集水位、水温!"+taskTimes+"------"); + }else if (taskTimes == 4) {//4 + for(int i=1;i<11;i++){ + SerialPortThread myThread = new SerialPortThread(); + Thread thread = new Thread(myThread); + myThread.setName("3", String.valueOf(i)); + thread.start(); + } + log.info("------采集设定温度、设定水位、故障状态!"+taskTimes+"------"); + }else { + for(int i=1;i<11;i++){ + SerialPortThread myThread = new SerialPortThread(); + Thread thread = new Thread(myThread); + myThread.setName("1", String.valueOf(i)); + thread.start(); + } + log.info("------采集水位、水温!"+taskTimes+"------"); + } + if(taskTimes<4){ + taskTimes++; + }else{ + taskTimes=1; + } + } +// Constant.FLAG=true; +// for(int i=1;i<4;i++){ +// SerialPortThread myThread = new SerialPortThread(); +// Thread thread = new Thread(myThread); +// myThread.setName("1",String.valueOf(i)); +// thread.start(); +// log.info("-------------采集水位、水温!线程"+String.valueOf(i)+"-------------"); +// } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + /** + * 定时处理数据:每十五分钟处理一次 + */ + @Scheduled(cron = "0 0/15 * * * ?") + public void dealData() { + try { + SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd"); + Date date=new Date(); + String curDate=sdf1.format(date); + String name=dealDataService.customName(); + if (name!=null && name.length()>0 && name.contains("华夏学院")){ + dealDataService.proEnergySum2(curDate); + }else{ + dealDataService.proEnergySum(curDate); + } + dealDataService.proMaintainSum(curDate); //汇总维修数 + dealDataService.proAlarmManage(curDate); //报警信息 + dealDataService.proAlarmInfoSum(curDate); //汇总相关警报数 + dealDataService.proAnalysisMonth(curDate); + dealDataService.proAnalysisYear(curDate); + dealDataService.proDeviceState(curDate); //汇总设备状态 + dealDataService.proTotalPumpMinutes(curDate); //统计周\月热泵运行时长 + log.info("进入定时调试数据库过程汇总数据!yyyy-MM-dd"); + } catch (Exception e) { + e.printStackTrace(); + //Constant.FLAG=false; + //Constant.WEB_FLAG=false; + } + } + + /** + * 定时删除历史流水记录(删除前三个月的记录) + */ +// @Scheduled(cron = "0 0 0 1 1/1 ? ") +// public void deleteDataHistory() { +// try { +// dealDataService.deleteChillersDataHistory(); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } + +} diff --git a/user-service/src/main/java/com/mh/user/job/JobCloud.java b/user-service/src/main/java/com/mh/user/job/JobCloud.java new file mode 100644 index 0000000..d627f86 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/JobCloud.java @@ -0,0 +1,41 @@ +package com.mh.user.job; + +import com.mh.user.netty.NettyClient; +import com.mh.user.constants.SocketMessage; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author ljf + * @title : + * @description : 定时采集冷量计任务 + * @updateTime 2020-05-18 + * @throws : + */ +/** + * :@DisallowConcurrentExecution : 此标记用在实现Job的类上面,意思是不允许并发执行. + * :注意org.quartz.threadPool.threadCount线程池中线程的数量至少要多个,否则@DisallowConcurrentExecution不生效 + * :假如Job的设置时间间隔为3秒,但Job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行, + * 否则会在3秒时再启用新的线程执行 + */ +@DisallowConcurrentExecution +@Slf4j +public class JobCloud implements Job { + + @Autowired + private SocketMessage socketMessage; + + @SneakyThrows + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + // 定时采集冷量计 + log.info("定时采集冷量计"); + NettyClient nettyClient = new NettyClient(); + nettyClient.connect(socketMessage.getPort(),socketMessage.getIP()); + } +} diff --git a/user-service/src/main/java/com/mh/user/job/JobCloudAndMeter.java b/user-service/src/main/java/com/mh/user/job/JobCloudAndMeter.java new file mode 100644 index 0000000..63d78eb --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/JobCloudAndMeter.java @@ -0,0 +1,159 @@ +package com.mh.user.job; + +import com.mh.user.constants.SocketMessage; +import com.mh.user.entity.GatewayManageEntity; +import com.mh.user.serialport.SerialPortThread; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.service.impl.DeviceDisplayServiceImpl; +import com.mh.user.utils.GetReadOrder485; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.beans.factory.annotation.Autowired; +import java.util.ArrayList; +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 定时采集冷量计任务 + * @updateTime 2020-05-18 + * @throws : + */ +/** + * :@DisallowConcurrentExecution : 此标记用在实现Job的类上面,意思是不允许并发执行. + * :注意org.quartz.threadPool.threadCount线程池中线程的数量至少要多个,否则@DisallowConcurrentExecution不生效 + * :假如Job的设置时间间隔为3秒,但Job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行, + * 否则会在3秒时再启用新的线程执行 + */ +@DisallowConcurrentExecution +@Slf4j +public class JobCloudAndMeter implements Job { + + @Autowired + private SocketMessage socketMessage; + + @Autowired + DeviceDisplayServiceImpl.GatewayManageService gatewayManageService; + + @Autowired + DeviceCodeParamService deviceCodeParamService; + + private static int taskTimes = 1; + List gatewayDtoList=new ArrayList<>(); + GetReadOrder485 getReadOrder485=new GetReadOrder485(); + + @SneakyThrows + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + log.info("定时采集开始>>>>>>"); + if(taskTimes==2){//2 + int r=deviceCodeParamService.queryCount2(); //查询记录数 + if (r==0){ + getReadOrder485.createOrderParam2(); //生成采集参数 + } + + SerialPortThread myThread = new SerialPortThread(); + Thread thread = new Thread(myThread); + myThread.setName("2","1"); + thread.start(); + System.out.println("当前活动线程数:"+Thread.activeCount()); + Thread.currentThread().sleep(3000);//毫秒 + +// SerialPortThread myThread2 = new SerialPortThread(); +// Thread thread2 = new Thread(myThread2); +// myThread2.setName("2","2"); +// thread2.start(); +// System.out.println("当前活动线程数:"+Thread.activeCount()); +// Thread.currentThread().sleep(3000);//毫秒 +// +// SerialPortThread myThread3 = new SerialPortThread(); +// Thread thread3 = new Thread(myThread3); +// myThread3.setName("2","3"); +// thread3.start(); +// System.out.println("当前活动线程数:"+Thread.activeCount()); +// Thread.currentThread().sleep(3000);//毫秒 +// +// SerialPortThread myThread4= new SerialPortThread(); +// Thread thread4 = new Thread(myThread4); +// myThread4.setName("2","4"); +// thread4.start(); +// System.out.println("当前活动线程数:"+Thread.activeCount()); +// Thread.currentThread().sleep(3000);//毫秒 + System.out.println("采集水、电、运行状态!"+taskTimes); + taskTimes++; + }else if(taskTimes==3){//5 + int r=deviceCodeParamService.queryCount3();//查询记录数 + if (r==0){ + getReadOrder485.createOrderParam3(); //生成采集参数 + } + + SerialPortThread myThread = new SerialPortThread(); + Thread thread = new Thread(myThread); + myThread.setName("3","1"); + thread.start(); + System.out.println("当前活动线程数:"+Thread.activeCount()); + Thread.currentThread().sleep(3000);//毫秒 + +// SerialPortThread myThread2 = new SerialPortThread(); +// Thread thread2 = new Thread(myThread2); +// myThread2.setName("3","2"); +// thread2.start(); +// System.out.println("当前活动线程数:"+Thread.activeCount()); +// Thread.currentThread().sleep(3000);//毫秒 +// +// SerialPortThread myThread3 = new SerialPortThread(); +// Thread thread3 = new Thread(myThread3); +// myThread3.setName("3","3"); +// thread3.start(); +// System.out.println("当前活动线程数:"+Thread.activeCount()); +// Thread.currentThread().sleep(3000);//毫秒 +// +// SerialPortThread myThread4= new SerialPortThread(); +// Thread thread4 = new Thread(myThread4); +// myThread4.setName("3","4"); +// thread4.start(); +// System.out.println("当前活动线程数:"+Thread.activeCount()); +// Thread.currentThread().sleep(3000);//毫秒 + System.out.println("采集设定温度、设定水位、故障状态!"+taskTimes); + taskTimes=1; + }else if(taskTimes==1){ + int r=deviceCodeParamService.queryCount(); //查询记录数 + if (r==0){ + getReadOrder485.createOrderParam(); //生成采集参数 + } + SerialPortThread myThread = new SerialPortThread(); + Thread thread = new Thread(myThread); + myThread.setName("1","1"); + thread.start(); + System.out.println("当前活动线程数:"+Thread.activeCount()); + Thread.currentThread().sleep(3000);//毫秒 + +// SerialPortThread myThread2 = new SerialPortThread(); +// Thread thread2 = new Thread(myThread2); +// myThread2.setName("1","2"); +// thread2.start(); +// System.out.println("当前活动线程数:"+Thread.activeCount()); +// Thread.currentThread().sleep(3000);//毫秒 +// +// SerialPortThread myThread3 = new SerialPortThread(); +// Thread thread3 = new Thread(myThread3); +// myThread3.setName("1","3"); +// thread3.start(); +// System.out.println("当前活动线程数:"+Thread.activeCount()); +// Thread.currentThread().sleep(3000);//毫秒 +// +// SerialPortThread myThread4= new SerialPortThread(); +// Thread thread4 = new Thread(myThread4); +// myThread4.setName("1","4"); +// thread4.start(); +// System.out.println("当前活动线程数:"+Thread.activeCount()); +// Thread.currentThread().sleep(3000);//毫秒 + System.out.println("采集水位、水温!"+taskTimes); + taskTimes++; + } + } +} diff --git a/user-service/src/main/java/com/mh/user/job/JobFactory.java b/user-service/src/main/java/com/mh/user/job/JobFactory.java new file mode 100644 index 0000000..b124b49 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/JobFactory.java @@ -0,0 +1,45 @@ +package com.mh.user.job; + +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.scheduling.quartz.AdaptableJobFactory; +import org.springframework.stereotype.Component; + +/** + * @author ljf + * @title :创建JobFactory实例 + * @description : + * @updateTime 2020-04-03 + * @throws : + */ +@Component +public class JobFactory extends AdaptableJobFactory { + + /** + * AutowireCapableBeanFactory接口是BeanFactory的子类 + * 可以连接和填充那些生命周期不被Spring管理的已存在的bean实例 + */ + private AutowireCapableBeanFactory factory; + + /** + * @author jinhaoxun + * @description 构造器 + * @param factory + */ + public JobFactory(AutowireCapableBeanFactory factory) { + this.factory = factory; + } + + /** + * @author jinhaoxun + * @description 创建Job实例 + * @param bundle + * @return Object + */ + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + Object job = super.createJobInstance(bundle);// 实例化对象 + factory.autowireBean(job);// 进行注入(Spring管理该Bean) + return job;//返回对象 + } +} diff --git a/user-service/src/main/java/com/mh/user/job/JobMeter.java b/user-service/src/main/java/com/mh/user/job/JobMeter.java new file mode 100644 index 0000000..b9e6cd8 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/JobMeter.java @@ -0,0 +1,39 @@ +package com.mh.user.job; + +import com.mh.user.netty.NettyMeterClient; +import com.mh.user.constants.SocketMessage; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author ljf + * @title : + * @description : 定时采集电表数据任务 + * @updateTime 2020-05-18 + * @throws : + */ +/** + * :@DisallowConcurrentExecution : 此标记用在实现Job的类上面,意思是不允许并发执行. + * :注意org.quartz.threadPool.threadCount线程池中线程的数量至少要多个,否则@DisallowConcurrentExecution不生效 + * :假如Job的设置时间间隔为3秒,但Job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行, + * 否则会在3秒时再启用新的线程执行 + */ +@DisallowConcurrentExecution +@Slf4j +public class JobMeter implements Job { + + @Autowired + private SocketMessage socketMessage; + + @SneakyThrows + @Override + public void execute(JobExecutionContext jobExecutionContext) { + log.info("定时采集电表数据任务开始"); + NettyMeterClient nettyMeterClient = new NettyMeterClient(); + nettyMeterClient.connect(socketMessage.getPort(), socketMessage.getIP()); + } +} diff --git a/user-service/src/main/java/com/mh/user/job/JobTest.java b/user-service/src/main/java/com/mh/user/job/JobTest.java new file mode 100644 index 0000000..ccbee63 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/JobTest.java @@ -0,0 +1,32 @@ +package com.mh.user.job; + +import com.mh.user.constants.Constant; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +/** + * :@DisallowConcurrentExecution : 此标记用在实现Job的类上面,意思是不允许并发执行. + * :注意org.quartz.threadPool.threadCount线程池中线程的数量至少要多个,否则@DisallowConcurrentExecution不生效 + * :假如Job的设置时间间隔为3秒,但Job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行, + * 否则会在3秒时再启用新的线程执行 + */ +@DisallowConcurrentExecution +@Slf4j +public class JobTest implements Job { + @SneakyThrows + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + for (int i = 0; i < 30; i++) { + if (Constant.FLAG) { + break; + } + Thread.sleep(1000); + log.info("第" + i + "个," +jobExecutionContext.getJobDetail()+"---------------------定时任务测试----------------------"); + } + + } +} diff --git a/user-service/src/main/java/com/mh/user/job/JobTest1.java b/user-service/src/main/java/com/mh/user/job/JobTest1.java new file mode 100644 index 0000000..fe03bc9 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/JobTest1.java @@ -0,0 +1,32 @@ +package com.mh.user.job; + +import com.mh.user.constants.Constant; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +/** + * :@DisallowConcurrentExecution : 此标记用在实现Job的类上面,意思是不允许并发执行. + * :注意org.quartz.threadPool.threadCount线程池中线程的数量至少要多个,否则@DisallowConcurrentExecution不生效 + * :假如Job的设置时间间隔为3秒,但Job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行, + * 否则会在3秒时再启用新的线程执行 + */ +@DisallowConcurrentExecution +@Slf4j +public class JobTest1 implements Job { + @SneakyThrows + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + for (int i = 0; i < 30; i++) { + if (Constant.FLAG) { + break; + } + Thread.sleep(1000); + log.info("第" + i + "个," +jobExecutionContext.getJobDetail()+"---------------------定时任务测试----------------------"); + } + + } +} diff --git a/user-service/src/main/java/com/mh/user/job/SendMeterWaterJob.java b/user-service/src/main/java/com/mh/user/job/SendMeterWaterJob.java new file mode 100644 index 0000000..5ab358a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/SendMeterWaterJob.java @@ -0,0 +1,190 @@ +package com.mh.user.job;//package com.mh.quartz.job; +// +//import com.mh.quartz.manage.SerialPortManager; +//import com.mh.quartz.utils.AnalysisReceiveOrder485; +//import com.mh.quartz.utils.ExchangeStringUtil; +//import com.mh.quartz.utils.GetReadOrder485; +//import gnu.io.PortInUseException; +//import gnu.io.SerialPort; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.scheduling.annotation.Scheduled; +//import org.springframework.stereotype.Component; +// +//import java.util.Date; +//import java.util.concurrent.BlockingQueue; +//import java.util.concurrent.LinkedBlockingQueue; +// +///** +// * @author ljf +// * @title : +// * @description : 定时采集发送水电表数据 +// * @updateTime 2020-04-22 +// * @throws : +// */ +//@Component +//@Slf4j +//public class SendMeterWaterJob { +// +// // 串口对象 +// private SerialPort mSerialPort; +// +// AnalysisReceiveOrder485 analysisReceiveOrder485; +// +// // 测试 +// @Scheduled(cron = "0,5 * * * * ? ") +// public void test() throws InterruptedException { +// Thread.sleep(10000); +// log.info("延迟10s"); +// } +// +// @Scheduled(cron = "0,20,40 * * * * ? ") +// public void task1() throws PortInUseException, InterruptedException { +// +// // 堵塞队列用来存放读到的数据 +// BlockingQueue msgQueue = new LinkedBlockingQueue(); +// log.info("每0、20、40秒执行一次!"); +// if (mSerialPort == null){ +// // 打开串口 +// } else { +// // 关闭串口 +// SerialPortManager.closePort(mSerialPort); +// } +// +// mSerialPort = SerialPortManager.openPort("COM2",1200); +// +// // 发送数据(采集冷量计累计流量) +// String sendMeterOrderStr = "FEFEFE" + GetReadOrder485.createMeterOrder("080140001125","1"); +// SerialPortManager.sendToPort(mSerialPort, ExchangeStringUtil.hexStrToBinaryStr(sendMeterOrderStr)); +// +// // 添加串口监听 +// SerialPort finalMSerialPort = mSerialPort; +// SerialPortManager.addListener(mSerialPort, () -> { +// byte[] data = null; +// try { +// // 读取串口数据 +// data = SerialPortManager.readFromPort(finalMSerialPort); +// String needData = ExchangeStringUtil.printHexString(data); +// msgQueue.add(needData); +// } catch (Exception e) { +// log.info(e.getMessage()); +// } +// }); +// +// // 创建线程解析队列信息 +// Thread thread = new Thread(() -> { +// try { +// log.info("--------------任务处理线程运行了--------------"); +// String vo = ""; +// String vos[] = new String[0]; +// while (true) { +// // 判断数组是否完整 +// // 电表 +// if (vos.length >= 22) { +// log.info("获取到数据长度: " + vos.length); +// log.info("电表: " + new Date() + " 完整收到的数据为:-----" + vo); +// // 解析接收到的报文 +// analysisReceiveOrder485.analysisMeterOrder485(vo); +// vos = new String[0]; +// vo = ""; +//// sendOrder(); +// } else { +// // 如果堵塞队列中存在数据就将其输出 +// if (msgQueue.size() > 0) { +// if (vo == "") { +// vo = msgQueue.peek(); +// } else { +// vo = vo + " " + msgQueue.peek(); +// } +// vos = vo.split(" ", -1); +//// getData(vos); +// msgQueue.take(); +// } +// } +// } +// } catch (Exception e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } +// }); +// +// thread.start(); +// +// } +// +// @Scheduled(cron = "10,30,50 * * * * ? ") +// public void task2() throws PortInUseException, InterruptedException { +// // 堵塞队列用来存放读到的数据 +// BlockingQueue msgQueue = new LinkedBlockingQueue(); +// log.info("每10、30、50秒执行一次!"); +// if (mSerialPort == null){ +// // 打开串口 +// } else { +// // 关闭串口 +// SerialPortManager.closePort(mSerialPort); +// } +// mSerialPort = SerialPortManager.openPort("COM3",9600); +// +// // 发送数据(采集冷量计累计流量) +// String sendOrderStr = GetReadOrder485.createCloudOrder("88","34"); +// SerialPortManager.sendToPort(mSerialPort, ExchangeStringUtil.hexStrToBinaryStr(sendOrderStr)); +// +// // 添加串口监听 +// SerialPort finalMSerialPort = mSerialPort; +// SerialPortManager.addListener(mSerialPort, () -> { +// byte[] data = null; +// try { +// // 读取串口数据 +// data = SerialPortManager.readFromPort(finalMSerialPort); +// String needData = ExchangeStringUtil.printHexString(data); +// msgQueue.add(needData); +// } catch (Exception e) { +// log.info(e.getMessage()); +// } +// }); +// +// // 创建线程解析队列信息 +// Thread thread = new Thread(() -> { +// try { +// log.info("--------------任务处理线程运行了--------------"); +// String vo = ""; +// String vos[] = new String[0]; +// while (true) { +// // 判断数组是否完整 +// // 冷量计 +// if (vos.length >= 9) { +// if (vos.length == 9) { +// log.info("获取到数据长度: " + vos.length); +// log.info("冷量计: " + new Date() + " 完整收到的数据为:-----" + vo); +// // 解析接收到的报文 +// analysisReceiveOrder485.analysisCloudOrder485(vo); +// } +// vos = new String[0]; +// vo = ""; +//// sendOrder(); +// } else { +// // 如果堵塞队列中存在数据就将其输出 +// if (msgQueue.size() > 0) { +// if (vo.equalsIgnoreCase("")){ +// vo = msgQueue.peek(); +// } else { +// vo = vo + " " + msgQueue.peek(); +// } +// vos = vo.split(" ", -1); +//// getData(vos); +// msgQueue.take(); +// } +// } +// +// +// } +// } catch (Exception e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } +// }); +// +// thread.start(); +// +// } +// +//} diff --git a/user-service/src/main/java/com/mh/user/manage/QuartzManager.java b/user-service/src/main/java/com/mh/user/manage/QuartzManager.java new file mode 100644 index 0000000..1449998 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/manage/QuartzManager.java @@ -0,0 +1,259 @@ +package com.mh.user.manage; + +import com.mh.user.entity.AddCronJobReq; +import com.mh.user.entity.AddSimpleJobReq; +import com.mh.user.entity.DeleteJobReq; +import lombok.extern.slf4j.Slf4j; +import org.quartz.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean; +import org.springframework.stereotype.Service; + +import static org.quartz.DateBuilder.futureDate; + +/** + * @author ljf + * @title : Quartz管理类 + * @description : + * @updateTime 2020-04-03 + * @throws : + */ +@Slf4j +@Service +public class QuartzManager { + + private final Scheduler scheduler; + + /** + * @author jinhaoxun + * @description 构造器 + * @param scheduler 调度器 + */ + public QuartzManager(Scheduler scheduler){ + this.scheduler = scheduler; + } + + /** + * quartz任务类包路径 + */ + private static String jobUri = "com.mh.user.job."; + + /** + * @author jinhaoxun + * @description 添加一个Simple定时任务,只执行一次的定时任务 + * @param addSimpleJobReq 参数对象 + * @param taskId 任务ID,不能同名 + * @throws RuntimeException + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public void addSimpleJob(AddSimpleJobReq addSimpleJobReq, String taskId) throws Exception { + String jobUrl = jobUri + addSimpleJobReq.getJobClass(); + System.out.println(jobUrl); + try { + MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean(); + /* + * 是否并发执行 + * 例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了, + * 如果此处为true,则下一个任务会执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行 + */ + jobDetail.setConcurrent(false); + Class aClass = (Class) Class.forName(jobUrl).newInstance().getClass(); + // 任务名,任务组,任务执行类 + JobDetail job = JobBuilder.newJob(aClass).withIdentity(taskId, + "JobGroup").build(); + //增加任务ID参数 + addSimpleJobReq.getParams().put("taskId",taskId); + // 添加任务参数 + job.getJobDataMap().putAll(addSimpleJobReq.getParams()); + // 转换为时间差,秒单位 + int time = (int) (addSimpleJobReq.getDate().getTime() - System.currentTimeMillis()) / 1000; + + SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger() + .withIdentity(taskId, taskId + "TriggerGroup") + .startAt(futureDate(time, DateBuilder.IntervalUnit.SECOND)) + .build(); + // 调度容器设置JobDetail和Trigger + scheduler.scheduleJob(job, trigger); + if (!scheduler.isShutdown()) { + // 启动 + scheduler.start(); + } + } catch (Exception e) { + e.printStackTrace(); + log.info("Quartz新增任务失败"); + } + } + + /** + * @author jinhaoxun + * @description 添加一个Cron定时任务,循环不断执行的定时任务 + * @param addCronJobReq 参数对象 + * @throws Exception + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public void addCronJob(AddCronJobReq addCronJobReq) throws Exception { + String jobUrl = jobUri + addCronJobReq.getJobClass(); + try { + MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean(); + /* + * 是否并发执行 + * 例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了, + * 如果此处为true,则下一个任务会执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行 + */ + jobDetail.setConcurrent(false); + Class aClass = (Class) Class.forName(jobUrl).newInstance().getClass(); + // 任务名,任务组,任务执行类 + JobDetail job = JobBuilder.newJob(aClass).withIdentity(addCronJobReq.getJobName(), + addCronJobReq.getJobGroupName()).build(); + // 添加任务参数 + job.getJobDataMap().putAll(addCronJobReq.getParams()); + // 创建触发器 + CronTrigger trigger = TriggerBuilder.newTrigger() + // 触发器名,触发器组 + .withIdentity(addCronJobReq.getTriggerName(), addCronJobReq.getTriggerGroupName()) + // 触发器时间设定 + .withSchedule(CronScheduleBuilder.cronSchedule(addCronJobReq.getDate())) + .build(); + // 调度容器设置JobDetail和Trigger + scheduler.scheduleJob(job, trigger); + + if (!scheduler.isShutdown()) { + // 启动 + scheduler.start(); + } + } catch (Exception e) { + log.info("Quartz新增任务失败"); + } + } + + /** + * @author jinhaoxun + * @description 修改一个任务的触发时间 + * @param triggerName 触发器名 + * @param triggerGroupName 触发器组名 + * @param cron 时间设置,参考quartz说明文档 + * @throws Exception + */ + public void modifyJobTime(String triggerName, String triggerGroupName, String cron) throws Exception { + try { + TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); + CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); + if (trigger == null) { + return; + } + String oldTime = trigger.getCronExpression(); + if (!oldTime.equalsIgnoreCase(cron)) { + // 触发器 + TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger(); + // 触发器名,触发器组 + triggerBuilder.withIdentity(triggerName, triggerGroupName); + triggerBuilder.startNow(); + // 触发器时间设定 + triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron)); + // 创建Trigger对象 + trigger = (CronTrigger) triggerBuilder.build(); + // 方式一 :修改一个任务的触发时间 + scheduler.rescheduleJob(triggerKey, trigger); + } + } catch (Exception e) { + log.info("Quartz修改任务失败"); + } + } + /** + * @author jinhaoxun + * @description 移除一个任务 + * @param deleteJobReq 参数对象 + * @throws Exception + */ + public void removeJob(DeleteJobReq deleteJobReq) throws Exception { + try { + TriggerKey triggerKey = TriggerKey.triggerKey(deleteJobReq.getTriggerName(), deleteJobReq.getTriggerGroupName()); + // 停止触发器 + scheduler.pauseTrigger(triggerKey); + // 移除触发器 + scheduler.unscheduleJob(triggerKey); + // 删除任务 + scheduler.deleteJob(JobKey.jobKey(deleteJobReq.getJobName(), deleteJobReq.getJobGroupName())); + } catch (Exception e) { + log.info("Quartz删除改任务失败"); + } + } + + /** + * @author jinhaoxun + * @description 获取任务是否存在 + * @param triggerName 触发器名 + * @param triggerGroupName 触发器组名 + * @return Boolean 返回操作结果 + * 获取任务是否存在 + * STATE_BLOCKED 4 阻塞 + * STATE_COMPLETE 2 完成 + * STATE_ERROR 3 错误 + * STATE_NONE -1 不存在 + * STATE_NORMAL 0 正常 + * STATE_PAUSED 1 暂停 + * @throws Exception + */ + public Boolean notExists(String triggerName, String triggerGroupName) throws Exception { + try { + if (scheduler.getTriggerState(TriggerKey.triggerKey(triggerName, triggerGroupName)) == Trigger.TriggerState.NORMAL){ + return true; + } + } catch (Exception e) { + log.info("Quartz获取任务是否存在失败"); + } + return false; + } + + /** + * @author jinhaoxun + * @description 关闭调度器 + * @throws RuntimeException + */ + public void shutdown() throws Exception { + try { + if(scheduler.isStarted()){ + scheduler.shutdown(true); + } + } catch (Exception e) { + log.info("Quartz关闭调度器失败"); + } + } + + //暂停所有任务 + public void pauseAllJob() throws SchedulerException { + scheduler.pauseAll(); + } + + //暂停任务 + public String pauseJob(String jobName, String jobGroup) throws SchedulerException { + JobKey jobKey = new JobKey(jobName, jobGroup); + JobDetail jobDetail = scheduler.getJobDetail(jobKey); + if (jobDetail == null) { + return "fail"; + }else { + scheduler.pauseJob(jobKey); + return "success"; + } + + } + + //恢复所有任务 + public void resumeAllJob() throws SchedulerException { + scheduler.resumeAll(); + } + + // 恢复某个任务 + public String resumeJob(String jobName, String jobGroup) throws SchedulerException { + + JobKey jobKey = new JobKey(jobName, jobGroup); + JobDetail jobDetail = scheduler.getJobDetail(jobKey); + if (jobDetail == null) { + return "fail"; + }else { + scheduler.resumeJob(jobKey); + return "success"; + } + } + +} diff --git a/user-service/src/main/java/com/mh/user/manage/SerialPortManager.java b/user-service/src/main/java/com/mh/user/manage/SerialPortManager.java new file mode 100644 index 0000000..eb6c256 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/manage/SerialPortManager.java @@ -0,0 +1,233 @@ +package com.mh.user.manage;//package com.mh.quartz.manage; +// +//import com.mh.quartz.utils.ExchangeStringUtil; +//import gnu.io.*; +//import lombok.extern.slf4j.Slf4j; +// +//import java.io.IOException; +//import java.io.InputStream; +//import java.io.OutputStream; +//import java.util.ArrayList; +//import java.util.Enumeration; +//import java.util.TooManyListenersException; +// +///** +// * 串口管理 +// * +// * @author yangle +// */ +//@Slf4j +//public class SerialPortManager { +// +// /** +// * 查找所有可用端口 +// * +// * @return 可用端口名称列表 +// */ +// public static final ArrayList findPorts() { +// // 获得当前所有可用串口 +// Enumeration portList = CommPortIdentifier.getPortIdentifiers(); +// ArrayList portNameList = new ArrayList(); +// // 将可用串口名添加到List并返回该List +// while (portList.hasMoreElements()) { +// String portName = portList.nextElement().getName(); +// portNameList.add(portName); +// } +// return portNameList; +// } +// +// /** +// * 打开串口 +// * +// * @param portName +// * 端口名称 +// * @param baudrate +// * 波特率 +// * @return 串口对象 +// * @throws PortInUseException +// * 串口已被占用 +// */ +// public static final SerialPort openPort(String portName, int baudrate) throws PortInUseException { +// try { +// // 通过端口名识别端口 +// CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); +// // 打开端口,并给端口名字和一个timeout(打开操作的超时时间) +// CommPort commPort = portIdentifier.open(portName, 2000); +// // 判断是不是串口 +// if (commPort instanceof SerialPort) { +// SerialPort serialPort = (SerialPort) commPort; +// try { +// // 设置一下串口的波特率等参数 +// // 数据位:8 +// // 停止位:1 +// // 校验位:even +// serialPort.setSerialPortParams(baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, +// SerialPort.PARITY_EVEN); +// } catch (UnsupportedCommOperationException e) { +// e.printStackTrace(); +// } +// return serialPort; +// } +// } catch (NoSuchPortException e1) { +// e1.printStackTrace(); +// } +// return null; +// } +// +// /** +// * 关闭串口 +// * +// * @param serialPort +// * 待关闭的串口对象 +// */ +// public static void closePort(SerialPort serialPort) { +// if (serialPort != null){ +// serialPort.close(); +// } +// } +// +// /** +// * 往串口发送数据 +// * +// * @param serialPort +// * 串口对象 +// * @param order +// * 待发送数据 +// */ +// public static void sendToPort(SerialPort serialPort, byte[] order) { +// OutputStream out = null; +// try { +// out = serialPort.getOutputStream(); +// out.write(order); +// out.flush(); +// } catch (IOException e) { +// e.printStackTrace(); +// } finally { +// try { +// if (out != null) { +// out.close(); +// out = null; +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// } +// +// /** +// * 从串口读取数据 +// * +// * @param serialPort +// * 当前已建立连接的SerialPort对象 +// * @return 读取到的数据 +// */ +// public static byte[] readFromPort(SerialPort serialPort) { +// InputStream in = null; +// byte[] bytes = {}; +// try { +// in = serialPort.getInputStream(); +// // 缓冲区大小为一个字节 +// byte[] readBuffer = new byte[1]; +// int bytesNum = in.read(readBuffer); +// while (bytesNum > 0) { +// bytes = ExchangeStringUtil.concat(bytes, readBuffer); +// bytesNum = in.read(readBuffer); +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } finally { +// try { +// if (in != null) { +// in.close(); +// in = null; +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return bytes; +// } +// +// /** +// * 添加监听器 +// * +// * @param serialPort +// * 串口对象 +// * @param listener +// * 串口存在有效数据监听 +// */ +// public static void addListener(SerialPort serialPort, DataAvailableListener listener) { +// try { +// // 给串口添加监听器 +// serialPort.addEventListener(new SerialPortListener(listener)); +// // 设置当有数据到达时唤醒监听接收线程 +// serialPort.notifyOnDataAvailable(true); +// // 设置当通信中断时唤醒中断线程 +// serialPort.notifyOnBreakInterrupt(true); +// } catch (TooManyListenersException e) { +// e.printStackTrace(); +// } +// } +// +// /** +// * 串口监听 +// */ +// public static class SerialPortListener implements SerialPortEventListener { +// +// private DataAvailableListener mDataAvailableListener; +// +// public SerialPortListener(DataAvailableListener mDataAvailableListener) { +// this.mDataAvailableListener = mDataAvailableListener; +// } +// +// public void serialEvent(SerialPortEvent serialPortEvent) { +// switch (serialPortEvent.getEventType()) { +// case SerialPortEvent.DATA_AVAILABLE: // 1.串口存在有效数据 +// if (mDataAvailableListener != null) { +// mDataAvailableListener.dataAvailable(); +// } +// break; +// +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2.输出缓冲区已清空 +// break; +// +// case SerialPortEvent.CTS: // 3.清除待发送数据 +// break; +// +// case SerialPortEvent.DSR: // 4.待发送数据准备好了 +// break; +// +// case SerialPortEvent.RI: // 5.振铃指示 +// break; +// +// case SerialPortEvent.CD: // 6.载波检测 +// break; +// +// case SerialPortEvent.OE: // 7.溢位(溢出)错误 +// break; +// +// case SerialPortEvent.PE: // 8.奇偶校验错误 +// break; +// +// case SerialPortEvent.FE: // 9.帧错误 +// break; +// +// case SerialPortEvent.BI: // 10.通讯中断 +// break; +// +// default: +// break; +// } +// } +// } +// +// /** +// * 串口存在有效数据监听 +// */ +// public interface DataAvailableListener { +// /** +// * 串口存在有效数据 +// */ +// void dataAvailable(); +// } +//} diff --git a/user-service/src/main/java/com/mh/user/manage/SerialPortManages.java b/user-service/src/main/java/com/mh/user/manage/SerialPortManages.java new file mode 100644 index 0000000..b9d75da --- /dev/null +++ b/user-service/src/main/java/com/mh/user/manage/SerialPortManages.java @@ -0,0 +1,345 @@ +package com.mh.user.manage;//package com.mh.quartz.manage; +// +//import com.mh.quartz.utils.ExchangeStringUtil; +//import gnu.io.*; +// +//import java.io.IOException; +//import java.io.InputStream; +//import java.io.OutputStream; +//import java.util.*; +//import java.util.concurrent.BlockingQueue; +//import java.util.concurrent.LinkedBlockingQueue; +// +///** +// * @author ljf +// * @title : +// * @description : +// * @updateTime 2020-04-20 +// * @throws : +// */ +//public class SerialPortManages extends Thread implements SerialPortEventListener { // SerialPortEventListener +// +// // 监听器,我的理解是独立开辟一个线程监听串口数据 +// // 串口通信管理类 +// static CommPortIdentifier portId; +// +// /* 有效连接上的端口的枚举 */ +// +// static Enumeration portList; +// InputStream inputStream; // 从串口来的输入流 +// static OutputStream outputStream;// 向串口输出的流 +// static SerialPort serialPort; // 串口的引用 +// // 堵塞队列用来存放读到的数据 +// private BlockingQueue msgQueue = new LinkedBlockingQueue(); +// +//// @Override +// /** +// * SerialPort EventListene 的方法,持续监听端口上是否有数据流 +// */ +// public void serialEvent(SerialPortEvent event) {// +// +// switch (event.getEventType()) { +// case SerialPortEvent.BI: +// case SerialPortEvent.OE: +// case SerialPortEvent.FE: +// case SerialPortEvent.PE: +// case SerialPortEvent.CD: +// case SerialPortEvent.CTS: +// case SerialPortEvent.DSR: +// case SerialPortEvent.RI: +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: +// break; +// case SerialPortEvent.DATA_AVAILABLE:// 当有可用数据时读取数据 +// byte[] readBuffer = new byte[1024]; +// int availableBytes = 0; +// try { +// availableBytes = inputStream.available(); +// while (availableBytes > 0) { +// readBuffer = SerialPortManages.readFromPort(serialPort); +// String needData = ExchangeStringUtil.printHexString(readBuffer); +// System.out.println(new Date() + " 真实收到的数据为:-----" + needData); +// availableBytes = inputStream.available(); +// msgQueue.add(needData); +// } +// } catch (IOException e) { +// } +// default: +// break; +// } +// } +// +// /** +// * 从串口读取数据 +// * +// * @param serialPort 当前已建立连接的SerialPort对象 +// * @return 读取到的数据 +// */ +// public static byte[] readFromPort(SerialPort serialPort) { +// InputStream in = null; +// byte[] bytes = {}; +// try { +// in = serialPort.getInputStream(); +// // 缓冲区大小为一个字节 +// byte[] readBuffer = new byte[1]; +// int bytesNum = in.read(readBuffer); +// while (bytesNum > 0) { +// bytes = ExchangeStringUtil.concat(bytes, readBuffer); +// bytesNum = in.read(readBuffer); +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } finally { +// try { +// if (in != null) { +// in.close(); +// in = null; +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return bytes; +// } +// +// +// /** +// * 通过程序打开COM4串口,设置监听器以及相关的参数 +// * +// * @return 返回1 表示端口打开成功,返回 0表示端口打开失败 +// */ +// public int startComPort() { +// // 通过串口通信管理类获得当前连接上的串口列表 +// portList = CommPortIdentifier.getPortIdentifiers(); +// +// while (portList.hasMoreElements()) { +// // 获取相应串口对象 +// portId = (CommPortIdentifier) portList.nextElement(); +// +// System.out.println("设备类型:--->" + portId.getPortType()); +// System.out.println("设备名称:---->" + portId.getName()); +// // 判断端口类型是否为串口 +// if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { +// // 判断如果COM4串口存在,就打开该串口 +// if (portId.getName().equals("COM3")) { +// try { +// // 打开串口名字为COM_4(名字任意),延迟为1000毫秒 +// serialPort = (SerialPort) portId.open(portId.getName(), 1000); +// +// } catch (PortInUseException e) { +// System.out.println("打开端口失败!"); +// e.printStackTrace(); +// return 0; +// } +// // 设置串口的一些读写参数 +// try { +// // 比特率、数据位、停止位、奇偶校验位 +// serialPort.setSerialPortParams(9600, +// SerialPort.DATABITS_8, SerialPort.STOPBITS_1, +// SerialPort.PARITY_EVEN); +// } catch (UnsupportedCommOperationException e) { +// e.printStackTrace(); +// return 0; +// } +// // 设置当前串口的输入输出流 +// try { +// inputStream = serialPort.getInputStream(); +// outputStream = serialPort.getOutputStream(); +// } catch (IOException e) { +// e.printStackTrace(); +// return 0; +// } +// // 给当前串口添加一个监听器 +// try { +// serialPort.addEventListener(this); +// } catch (TooManyListenersException e) { +// e.printStackTrace(); +// return 0; +// } +// // 设置监听器生效,即:当有数据时通知 +// serialPort.notifyOnDataAvailable(true); +// +// // 设置当通信中断时唤醒中断线程 +// serialPort.notifyOnBreakInterrupt(true); +// +// return 1; +// } +// } +// } +// return 0; +// } +// +// @Override +// public void run() { +// // TODO Auto-generated method stub +// try { +// System.out.println("--------------任务处理线程运行了--------------"); +// String vo = ""; +// String vos[] = new String[0]; +// while (true) { +// // 判断数组是否完整 +// // 冷量计 +// if (vos.length >= 9) { +// System.out.println("获取到数据长度: " + vos.length); +// System.out.println("串口: " + new Date() + " 完整收到的数据为:-----" + vo); +// vos = new String[0]; +// vo = ""; +//// sendOrder(); +// } else { +// // 如果堵塞队列中存在数据就将其输出 +// if (msgQueue.size() > 0) { +// if (vo == ""){ +// vo = msgQueue.peek(); +// } else { +// vo = vo + " " + msgQueue.peek(); +// } +// vos = vo.split(" ", -1); +//// getData(vos); +// msgQueue.take(); +// } +// } +// +// +// } +// } catch (Exception e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } +// } +// +// /** +// * @Description: 发送获取数据指令 +// * @Param: +// * @return: +// * @Author: LiangZF +// * @Date: 2019/1/3 +// */ +// public void sendOrder() { +// try { +// Thread.sleep(3000); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// int i = 1; +// if (i == 1) { +// // 启动线程来处理收到的数据 +// try { +//// byte[] b = new byte[]{(byte) 0xFE, 0x03, 0x00, 0x00, 0x00, 0x0E, (byte) 0xC4, 0x0E}; +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6825110040010868010143C35816"); // 单相表 +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("5803004900021914"); // 冷量计 +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6830043080000068110432326536C816"); // 三相表 +//// System.out.println("发送的数据:" + ExchangeStringUtil.byteArrayToHexString(b)); +//// outputStream.write(b); +//// outputStream.flush(); +// for (int j = 0; j < 10; j++) { +// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("5803004900021914"); // 冷量计 +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6830043080000068110432326536C816"); // 三相表 +// System.out.println("发送的数据:" + ExchangeStringUtil.byteArrayToHexString(b)); +// outputStream.write(b); +// Thread.sleep(100); +// outputStream.flush(); +// } +// } catch (IOException | InterruptedException e) { +// // TODO Auto-generated catch block +// serialPort.close(); +// e.printStackTrace(); +// } finally { +// try { +// if (outputStream != null) { +// outputStream.close(); +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// } +// } +// +// // 16转10计算 +// public long getNum(String num1, String num2) { +// long value = Long.parseLong(num1, 16) * 256 + Long.parseLong(num2, 16); +// return value; +// } +// +// public static void startService(){ +// SerialPortManages cRead = new SerialPortManages(); +// int i = cRead.startComPort(); +// if (i == 1) { +// // 启动线程来处理收到的数据 +// cRead.start(); +// try { +// //根据提供的文档给出的发送命令,发送16进制数据给仪器 +//// byte[] b = new byte[]{0x01, 0x03, 0x00, 0x00, 0x00, 0x0E, (byte) 0xC4, 0x0E}; +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6825110040010868010143C35816"); +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("5803004900021914"); +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6830043080000068110432326536C816"); // 三相表 +//// System.out.println("发送的数据:" + b); +//// System.out.println("发出字节数:" + b.length); +//// outputStream.write(b); +//// outputStream.flush(); +// for (int j = 0; j < 10; j++) { +// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("5803004900021914"); // 冷量计 +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6830043080000068110432326536C816"); // 三相表 +// System.out.println("发送的数据:" + ExchangeStringUtil.byteArrayToHexString(b)); +// outputStream.write(b); +// Thread.sleep(100); +// outputStream.flush(); +// } +// } catch (IOException | InterruptedException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } finally { +// try { +// if (outputStream != null) { +// outputStream.close(); +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// } else { +// return; +// } +// } +// +// public static void main(String[] args) { +// SerialPortManages cRead = new SerialPortManages(); +// int i = cRead.startComPort(); +// if (i == 1) { +// // 启动线程来处理收到的数据 +// cRead.start(); +// try { +// //根据提供的文档给出的发送命令,发送16进制数据给仪器 +//// byte[] b = new byte[]{0x01, 0x03, 0x00, 0x00, 0x00, 0x0E, (byte) 0xC4, 0x0E}; +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6825110040010868010143C35816"); +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("5803004900021914"); +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6830043080000068110432326536C816"); // 三相表 +//// System.out.println("发送的数据:" + b); +//// System.out.println("发出字节数:" + b.length); +//// outputStream.write(b); +//// outputStream.flush(); +// for (int j = 0; j < 10; j++) { +// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("5803004900021914"); // 冷量计 +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6830043080000068110432326536C816"); // 三相表 +// System.out.println("发送的数据:" + ExchangeStringUtil.byteArrayToHexString(b)); +// outputStream.write(b); +// Thread.sleep(100); +// outputStream.flush(); +// } +// } catch (IOException | InterruptedException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } finally { +// try { +// if (outputStream != null) { +// outputStream.close(); +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// } else { +// return; +// } +// } +// +//} diff --git a/user-service/src/main/java/com/mh/user/mapper/AlarmInfoMapper.java b/user-service/src/main/java/com/mh/user/mapper/AlarmInfoMapper.java new file mode 100644 index 0000000..7e33c58 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/AlarmInfoMapper.java @@ -0,0 +1,145 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.AlarmInfoEntity; +import com.mh.user.entity.AlarmValueSetEntity; +import com.mh.user.mapper.provider.AlarmInfoProvider; +import org.apache.ibatis.annotations.*; +import org.springframework.security.core.parameters.P; + +import java.util.List; + +@Mapper +public interface AlarmInfoMapper { + + /** + * 报警管理 + * 保存报警信息 + * @param alarmInfoEntity + */ + @Insert("insert into alarm_info(building_id,building_name,alarm_time,alarm_device,alarm_type,operate) values (" + + "#{buildingId},#{buildingName},#{alarmTime},#{alarmDevice},#{alarmType},#{operate})") + void saveAlarmInfo(AlarmInfoEntity alarmInfoEntity); + + /** + * 报警管理 + * 根据日期修改报警信息 + * @param alarmInfoEntity + */ + @Update("") + void updateAlarmInfo(AlarmInfoEntity alarmInfoEntity); + + /** + * 报警管理 + * 根据日期、设备、楼栋查询报警信息 + * @param alarmTime + * @param buildingId + * @param page + * @param limit + * @return + */ + @SelectProvider(type = AlarmInfoProvider.class,method = "queryAlarmInfo") + @Results({ + @Result(column = "building_id",property = "buildingId" ), + @Result(column = "building_name", property = "buildingName"), + @Result(column = "alarm_time", property = "alarmTime"), + @Result(column = "device_type", property = "deviceType"), + @Result(column = "alarm_type", property = "alarmType"), + @Result(column = "deal_state", property = "dealState"), + @Result(column = "id", property = "id"), + @Result(column = "device_addr", property = "deviceAddr") + }) + List queryAlarmInfo(@Param("alarmTime") String alarmTime, + @Param("alarmType") String alarmType, + @Param("buildingId") String buildingId, + @Param("dealState") String dealState, + @Param("page") int page, + @Param("limit") int limit); + + /** + * 报警管理 + * 根据日期、设备类型查询记录数 + * @return + */ + @SelectProvider(type = AlarmInfoProvider.class,method = "getAlarmInfoCount") + int getAlarmInfoCount(@Param("alarmTime") String alarmTime, + @Param("alarmType") String alarmType, + @Param("buildingId") String buildingId, + @Param("dealState") String dealState, + @Param("page") int page, + @Param("limit") int limit); + /** + * 报警管理 + * 根据报警编号删除报警信息 + * @param id + */ + @Delete("delete from Alarm_Info where id=#{id}") + void deleteAlarmInfo(@Param("id") String id); + /////////////////////////////////////// + //警报设置 + @Insert("insert into alarm_value_set(building_id,startTime,endTime,startTime2,endTime2,startTime3,endTime3,lowValue,lowValue2,lowValue3,itemType) values (" + + "#{buildingId},#{startTime},#{endTime},#{startTime2},#{endTime2},#{startTime3},#{endTime3},#{lowValue},#{lowValue2},#{lowValue3},#{itemType})") + void saveAlarmValueSet(AlarmValueSetEntity alarmValueSetEntity); + + //修改 + @Update("") + void updateAlarmValueSet(AlarmValueSetEntity alarmValueSetEntity); + + //查询报警值设置记录 + @SelectProvider(type = AlarmInfoProvider.class,method = "queryAlarmValueSet") + @Results({ + @Result(column = "building_id",property = "buildingId" ), + @Result(column = "building_name",property = "buildingName" ), + @Result(column = "startTime", property = "startTime"), + @Result(column = "endTime", property = "endTime"), + @Result(column = "startTime2", property = "startTime2"), + @Result(column = "endTime2", property = "endTime2"), + @Result(column = "startTime3", property = "startTime3"), + @Result(column = "endTime3", property = "endTime3"), + @Result(column = "lowValue", property = "lowValue"), + @Result(column = "lowValue2", property = "lowValue2"), + @Result(column = "lowValue3", property = "lowValue3"), + @Result(column = "itemType", property = "itemType"), + @Result(column = "id", property = "id") + }) + List queryAlarmValueSet(@Param("buildingId") String buildingId,@Param("itemType") String itemType,@Param("page") int page,@Param("limit") int limit); + + //查询报警值设置记录数 + @SelectProvider(type = AlarmInfoProvider.class,method = "getAlarmValueSetCount") + int getAlarmValueSetCount(@Param("buildingId") String buildingId,@Param("itemType") String itemType); + + //删除设置记录 + @Delete("delete from alarm_value_set where id=#{id}") + void delAlarmValueSet(@Param("id") String id); + + //修改状态 + @Update("update alarm_info set deal_state=#{dealState} where id=#{id}") + void updateDealState(@Param("id") String id,@Param("dealState") String dealState); + + //按楼栋编号删除设置记录 + @Delete("delete from alarm_value_set where building_id=#{buildingId} and itemType=#{itemType}") + void delAlarmValueSet2(@Param("buildingId") String buildingId,@Param("itemType") String itemType); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/AnalysisMapper.java b/user-service/src/main/java/com/mh/user/mapper/AnalysisMapper.java new file mode 100644 index 0000000..0490f8d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/AnalysisMapper.java @@ -0,0 +1,65 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.AnalysisMonthEntity; +import com.mh.user.entity.AnalysisYearEntity; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface AnalysisMapper { + + /** + * 分析查询 + * 根据日期、楼栋查询 + * @param curDate + * @param buildingId + * @return + */ + @Results(id ="rs_month",value ={ + @Result(column = "building_id",property = "buildingId" ), + @Result(column = "building_name", property = "buildingName"), + @Result(column = "cur_date", property = "curDate"), + @Result(column = "item_type", property = "itemType"), + @Result(column = "total_value", property = "totalValue") + }) + + @Select("select * from analysis_elect_year where cur_date=#{curDate} and building_id=#{buildingId}") + List queryAnalysisElectYear(@Param("curDate") String curDate, @Param("buildingId") String buildingId); + + @ResultMap("rs_month") + @Select("select * from analysis_Water_year where cur_date=#{curDate} and building_id=#{buildingId}") + List queryAnalysisWaterYear(@Param("curDate") String curDate, @Param("buildingId") String buildingId); + + @ResultMap("rs_month") + @Select("select * from analysis_Energy_year where cur_date=#{curDate} and building_id=#{buildingId}") + List queryAnalysisEnergyYear(@Param("curDate") String curDate, @Param("buildingId") String buildingId); + + @ResultMap("rs_month") + @Select("select * from analysis_Maintain_year where cur_date=#{curDate} and building_id=#{buildingId}") + List queryAnalysisMaintainYear(@Param("curDate") String curDate, @Param("buildingId") String buildingId); + + @Results(id ="rs_day",value ={ + @Result(column = "building_id",property = "buildingId" ), + @Result(column = "building_name", property = "buildingName"), + @Result(column = "cur_date", property = "curDate"), + @Result(column = "item_type", property = "itemType"), + @Result(column = "total_value", property = "totalValue") + }) + + @Select("select * from analysis_elect_month where cur_date=#{curDate} and building_id=#{buildingId}") + List queryAnalysisElectMonth(@Param("curDate") String curDate, @Param("buildingId") String buildingId); + + @ResultMap("rs_day") + @Select("select * from analysis_Water_month where cur_date=#{curDate} and building_id=#{buildingId}") + List queryAnalysisWaterMonth(@Param("curDate") String curDate, @Param("buildingId") String buildingId); + + @ResultMap("rs_day") + @Select("select * from analysis_Energy_month where cur_date=#{curDate} and building_id=#{buildingId}") + List queryAnalysisEnergyMonth(@Param("curDate") String curDate, @Param("buildingId") String buildingId); + + @ResultMap("rs_day") + @Select("select * from analysis_maintain_month where cur_date=#{curDate} and building_id=#{buildingId}") + List queryAnalysisMaintainMonth(@Param("curDate") String curDate, @Param("buildingId") String buildingId); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/AreaMapper.java b/user-service/src/main/java/com/mh/user/mapper/AreaMapper.java new file mode 100644 index 0000000..bde517c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/AreaMapper.java @@ -0,0 +1,18 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.AreaEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface AreaMapper { + + @Results({ @Result(property = "areaId", column = "area_id"), + @Result(property = "areaName", column = "area_name")}) + @Select("select * from area ") + List findAll(); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/BuildingMapper.java b/user-service/src/main/java/com/mh/user/mapper/BuildingMapper.java new file mode 100644 index 0000000..7fc6254 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/BuildingMapper.java @@ -0,0 +1,115 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.BuildingEntity; +import com.mh.user.mapper.provider.BuildingProvider; +import com.mh.user.model.BuildingModel; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface BuildingMapper { + + /** + * 楼栋管理模块 + * 保存楼栋信息 + * @param buildingEntity + */ + @Insert("insert into building(building_name,levels_count,begin_level,house_count,bed_count,check_in_count,area_id,remarks,tankHeight) values (" + + "#{buildingName},#{levelsCount},#{beginLevel},#{houseCount},#{bedCount},#{checkInCount},#{areaId},#{remarks},#{tankHeight})") + int saveBuilding(BuildingEntity buildingEntity); + + /** + * 楼栋管理模块 + * 保存楼栋信息 + * @param buildingEntity + */ + @Update("") + int updateBuilding(BuildingEntity buildingEntity); + + /** + * 楼栋管理模块: + * 查询楼栋资料 + * @param page + * @param limit + * @return + */ + @Results(value = { + @Result(property="buildingId",column="building_id"), + @Result(property="buildingName",column="building_name"), + @Result(property="levelsCount",column="levels_count"), + @Result(property="beginLevel",column="begin_level"), + @Result(property ="houseCount",column ="house_count"), + @Result(property ="bedCount",column ="bed_count"), + @Result(property="checkInCount",column="check_in_count"), + @Result(property="areaId",column="area_id"), + @Result(property="remarks",column="remarks") + }) + + @SelectProvider(type = BuildingProvider.class,method = "queryBuilding") + List queryBuilding(@Param("buildingId") String buildingId,@Param("page") int page, @Param("limit") int limit); + + /** + * 楼栋管理模块: + * 获取楼栋信息查询的总条数 + * @return + */ + @SelectProvider(type = BuildingProvider.class,method = "getCount") + int getCount(@Param("buildingId") String buildingId,@Param("page") int page, @Param("limit") int limit); + + //查询所有楼栋编号和名称 + @Results(value = { + @Result(property="buildingId",column="id"), + @Result(property="buildingName",column="building_name") + }) + @Select("select * from building order by sort ") + List selectBuildingName(); + + //查询楼栋编号 +// @Results(value = { +// @Result(property="buildingId",column="building_id") +// }) + @Select("select id from building where building_name=#{buildingName}") + String selectBuildingId(@Param("buildingName") String buildingName); + + //根据楼栋名称查询是否存在 + @Select("select count(*) from building where building_name=#{buildingName}") + int selectCount(@Param("buildingName") String buildingName); + + /** + * 楼栋管理模块: + * 根据名称删除楼栋信息 + * @param id + */ + @Delete("delete from building where id=#{id}") + int deleteBuilding(@Param("id") String id); + + //通过编号查询名称 + @Select("select building_name from building where id=#{id}") + String queryBuildingName(@Param("id") String id); + + //查询水箱高度 + @Select("select tankHeight from building where id=#{id}") + Double queryTankHeight(@Param("id") String id); + + //查询对应区域编号 + @Select("select area_id from building where id=#{id}") + String queryAreaId(@Param("id") int id); + + //查询楼栋热泵数目 + @Select("select ISNULL(pump_count,0) from building where id=#{buildingId}") + int selectPumpCount(@Param("buildingId") String buildingId); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/CodeTableMapper.java b/user-service/src/main/java/com/mh/user/mapper/CodeTableMapper.java new file mode 100644 index 0000000..86c1573 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/CodeTableMapper.java @@ -0,0 +1,21 @@ +package com.mh.user.mapper; + +import com.mh.user.model.DeviceTypeModel; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface CodeTableMapper { + + //从code_table表查询设备类型 + @Select("select * from code_table where name='deviceType' ") + List queryDeviceType(); + + //从code_table表查询品牌 + @Select("select * from code_table where name='brand' ") + List queryBrand(); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/ControlSetMapper.java b/user-service/src/main/java/com/mh/user/mapper/ControlSetMapper.java new file mode 100644 index 0000000..e5c4a37 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/ControlSetMapper.java @@ -0,0 +1,65 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.ControlSetEntity; +import com.mh.user.entity.PumpSetEntity; +import org.apache.ibatis.annotations.*; + +@Mapper +public interface ControlSetMapper { + + //插入记录 + @Insert("insert into control_set(building_id,level_set,use_start_time1,use_close_time1,use_start_time2,use_close_time2," + + "back_water_temp,up_water_temp,use_start_time3,use_close_time3,use_start_time4,use_close_time4,use_start_time5,use_close_time5,use_start_time6,use_close_time6) values (" + + "#{buildingId},#{levelSet},#{useStartTime1},#{useCloseTime1},#{useStartTime2},#{useCloseTime2},#{backWaterTemp},#{upWaterTemp},#{useStartTime3},#{useCloseTime3}," + + "#{useStartTime4},#{useCloseTime4},#{useStartTime5},#{useCloseTime5},#{useStartTime6},#{useCloseTime6})") + void saveControlSet(ControlSetEntity controlSetEntity); + + //修改记录 + @Update("") + void updateControlSet(ControlSetEntity controlSetEntity); + + //查询记录数 + @Select("select count(*) from control_set where building_id=#{buildingId}") + int selectCount(@Param("buildingId") String buildingId); + + //查询记录 + @Results({ + @Result(column = "building_id",property = "buildingId" ), + @Result(column = "level_set", property = "levelSet"), + @Result(column = "use_start_time1", property = "useStartTime1"), + @Result(column = "use_close_time1", property = "useCloseTime1"), + @Result(column = "use_start_time2", property = "useStartTime2"), + @Result(column = "use_close_time2", property = "useCloseTime2"), + @Result(column = "use_start_time3", property = "useStartTime3"), + @Result(column = "use_close_time3", property = "useCloseTime3"), + @Result(column = "use_start_time4", property = "useStartTime4"), + @Result(column = "use_close_time4", property = "useCloseTime4"), + @Result(column = "use_start_time5", property = "useStartTime5"), + @Result(column = "use_close_time5", property = "useCloseTime5"), + @Result(column = "use_start_time6", property = "useStartTime6"), + @Result(column = "use_close_time6", property = "useCloseTime6"), + @Result(column = "back_water_temp", property = "backWaterTemp"), + @Result(column = "up_water_temp", property = "upWaterTemp"), + }) + @Select("select * from control_Set where building_id=#{buildingId}") + ControlSetEntity queryControlSet(@Param("buildingId") String buildingId); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/DataResultMapper.java b/user-service/src/main/java/com/mh/user/mapper/DataResultMapper.java new file mode 100644 index 0000000..e7fc292 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/DataResultMapper.java @@ -0,0 +1,75 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.DataResultEntity; +import com.mh.user.mapper.provider.DataResultProvider; +import org.apache.ibatis.annotations.*; +import org.apache.ibatis.mapping.StatementType; + +import java.util.List; + +@Mapper +public interface DataResultMapper { + + @Insert("insert into data_result(device_addr,device_type,building_id,last_value,last_date,cur_value,cur_date,ratio,calc_value) values (" + + " #{deviceAddr},#{deviceType},#{buildingId},#{lastValue},#{lastDate},#{curValue},#{curDate},#{ratio},#{calcValue})") + void saveDataResult(DataResultEntity dataResultEntity); + + @Update("") + void updateDataResult(DataResultEntity dataResultEntity); + + @Results(id="rs", value = { + @Result(property="deviceAddr",column="device_addr"), + @Result(property="deviceType",column="device_type"), + @Result(property="buildingId",column="building_id"), + @Result(property="buildingName",column="building_Name"), + @Result(property="lastValue",column="last_value"), + @Result(property ="lastDate",column ="last_date"), + @Result(property ="curValue",column ="cur_value"), + @Result(property="curDate",column="cur_date"), + @Result(property="ratio",column="ratio"), + @Result(property="calcValue",column="calc_Value") + }) + @SelectProvider(type = DataResultProvider.class,method = "queryDataResult") + List queryDataResult(@Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("deviceType") String deviceType, + @Param("page") int page, + @Param("limit") int limit); + + + @SelectProvider(type = DataResultProvider.class,method = "getDataResultCount") + int getDataResultCount(@Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("deviceType") String deviceType, + @Param("page") int page, + @Param("limit") int limit); + + + //查询单条记录 + @ResultMap("rs") + @Select("select * from data_result where cur_date=#{curDate} and device_addr=#{deviceAddr} and device_type=#{deviceType} ") + DataResultEntity selectDataResult(@Param("curDate") String curDate, + @Param("deviceAddr") String deviceAddr, + @Param("deviceType") String deviceType); + + //查询是否存在记录 + @Select("select count(*) from data_result where cur_date=#{curDate} and device_addr=#{deviceAddr} and device_type=#{deviceType} ") +// @Select("select count(*) from data_result") + int selectDataResultCount(@Param("curDate") String curDate, + @Param("deviceAddr") String deviceAddr, + @Param("deviceType") String deviceType); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/DealDataMapper.java b/user-service/src/main/java/com/mh/user/mapper/DealDataMapper.java new file mode 100644 index 0000000..d418e56 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/DealDataMapper.java @@ -0,0 +1,84 @@ +package com.mh.user.mapper; + +import org.apache.ibatis.annotations.*; +import org.apache.ibatis.mapping.StatementType; + +/** + * @author nxr + * @title :处理数据mapper层 + * @description : + * @updateTime 2020-07-28 + * @throws : + */ +@Mapper +public interface DealDataMapper { + + //按日、月和年汇总水、电用量,计算单耗、平均用量 + @Select("exec pro_energy #{curDate,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proEnergy(@Param("curDate") String curDate); + + //按日、月和年汇总水、电用量,计算单耗、平均用量 + @Select("exec pro_energy2 #{curDate,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proEnergy2(@Param("curDate") String curDate); + + @Select("exec pro_energy_sum #{curDate,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proEnergySum(@Param("curDate") String curDate); + + @Select("exec pro_energy_sum2 #{curDate,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proEnergySum2(@Param("curDate") String curDate); + + //汇总维保量 + @Select("exec pro_maintain_sum #{curDate,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proMaintainSum(@Param("curDate") String curDate); + + @Select("exec pro_analysis_month #{curDate,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proAnalysisMonth(@Param("curDate") String curDate); + + @Select("exec pro_analysis_year #{curDate,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proAnalysisYear(@Param("curDate") String curDate); + + @Select("exec pro_alarm_manage #{curDate,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proAlarmManage(@Param("curDate") String curDate); + + @Select("exec pro_alarm_info_sum #{curDate,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proAlarmInfoSum(@Param("curDate") String curDate); + + //设备状态汇总 + @Select("exec pro_device_state #{curDate,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proDeviceState(@Param("curDate") String curDate); + + @Select("exec pro_deal_data ") + @Options(statementType = StatementType.CALLABLE) + void dealData(); + + @Delete("delete from chillers_data_history where convert(varchar(7),collection_time,23) = convert(varchar(7),dateadd(month,-3,getdate()),23)") + void deleteChillersDataHistory(); + + @Delete("delete from data_history where convert(varchar(7),cur_date,23) = convert(varchar(7),dateadd(month,-12,getdate()),23)") + void deleteDataHistory(); + + //查询学校名称 + @Select("select customName from SysParam ") + String customName(); + + //判断网关在线状态 + @Select("exec pro_gatewayState ") + @Options(statementType = StatementType.CALLABLE) + void proGatewayState(); + + //统计周、月热泵运行时长 + @Select("exec pro_TotalPumpMinutes #{curDate,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proTotalPumpMinutes(@Param("curDate") String curDate); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/DeviceCodeParamMapper.java b/user-service/src/main/java/com/mh/user/mapper/DeviceCodeParamMapper.java new file mode 100644 index 0000000..0af0666 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/DeviceCodeParamMapper.java @@ -0,0 +1,149 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.entity.OrderMessageEntity; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface DeviceCodeParamMapper { + + //插入指令参数 + @Insert("insert into device_code_param(device_addr,device_name,device_type,data_com,baudrate,brand,fun_code,register_addr,create_time)" + + "values(#{deviceAddr},#{deviceName},#{deviceType},#{dataCom},#{baudrate},#{brand},#{funCode},#{registerAddr},getDate())") + void insertDeviceCodeParam(DeviceCodeParamEntity deviceCodeParamEntity); + + //查询指令参数,传入IP和端口 + @Results(id="rs", value = { + @Result(property="id",column="id"), + @Result(property="deviceAddr",column="device_addr"), + @Result(property="deviceType",column="device_type"), + @Result(property="dataCom",column="data_com"), + @Result(property="baudrate",column="baudrate"), + @Result(property ="brand",column ="brand"), + @Result(property ="funCode",column ="fun_code"), + @Result(property ="registerAddr",column ="register_addr"), + @Result(property ="deviceName",column ="device_name"), + @Result(property ="createTime",column ="create_time"), + @Result(property ="buildingId",column ="building_id") + }) + @Select("select t1.* from device_code_param t1 join gateway_manage t2 on t1.data_com=t2.data_com where t2.gateway_ip=#{gatewayIP} and t2.gateway_port=#{gatewayPort} ") + List queryCodeParam(@Param("gatewayIP") String gatewayIP, @Param("gatewayPort") String gatewayPort); + + //查询指令参数,传入串口 + @ResultMap("rs") + @Select("select t1.* from device_code_param t1 join gateway_manage t2 on t1.data_com=t2.data_com where t2.data_com=#{comName}") + List queryCodeParam2(@Param("comName") String comName); + + //查询所有指令参数 + @ResultMap("rs") + @Select("select * from device_code_param where thread=#{thread} order by data_com,device_type") + //@Select("select * from device_code_param order by data_com,device_type ") +// @Select("select * from device_code_param order by device_type ") + List queryCodeParam3(@Param("thread") String thread); + + //查询所有指令参数 + @ResultMap("rs") + @Select("select * from device_code_param2 where thread=#{thread} order by data_com,device_type") + //@Select("select * from device_code_param2 order by data_com,device_type ") +// @Select("select * from device_code_param2 order by device_type ") + List queryCodeParam4(@Param("thread") String thread); + + //查询所有指令参数 + @ResultMap("rs") + @Select("select * from device_code_param3 where thread=#{thread} order by data_com,device_type") + //@Select("select * from device_code_param3 order by data_com,device_type") +// @Select("select * from device_code_param3 order by device_type ") + List queryCodeParam5(@Param("thread") String thread); + + //查询记录数 + @Select("select count(*) from device_code_param ") + int queryCount(); + + //查询记录数 + @Select("select count(*) from device_code_param2 ") + int queryCount2(); + + //查询记录数 + @Select("select count(*) from device_code_param3 ") + int queryCount3(); + + // 批量插入生成指令参数入数据库 + @Insert("") + void insertDeviceCodeParamList(@Param("deviceCodeParamEntityList") List deviceCodeParamEntityList); + + // 批量插入生成指令参数入数据库 + @Insert("") + void insertDeviceCodeParamList2(@Param("deviceCodeParamEntityList") List deviceCodeParamEntityList); + + // 批量插入生成指令参数入数据库 + @Insert("") + void insertDeviceCodeParamList3(@Param("deviceCodeParamEntityList") List deviceCodeParamEntityList); + + //查询插入压变、温控 + @Insert("insert into device_code_param(device_addr,device_name,device_type,data_com,baudrate,parity,brand,create_time,building_id) select device_addr,device_name,device_type,data_com,baudrate,parity,brand,getDate(),building_id from device_install where device_type='压变' or device_type='温控' or device_type='温度变送器' ") + void selectInsertDeviceCodeParam(); + + //查询插入水、电表、状态检测 + @Insert("insert into device_code_param2(device_addr,device_name,device_type,data_com,baudrate,parity,brand,create_time,building_id) select device_addr,device_name,device_type,data_com,baudrate,parity,brand,getDate(),building_id from device_install where device_type='电表' or device_type='水表' or device_type='状态检测' or device_type='热泵状态' ") + void selectInsertDeviceCodeParam2(); + + //查询插入水位开关 + @Insert("insert into device_code_param3(device_addr,device_name,device_type,data_com,baudrate,parity,brand,create_time,building_id) select device_addr,device_name,device_type,data_com,baudrate,parity,brand,getDate(),building_id from device_install where device_type='水位开关' ") + void selectInsertDeviceCodeParam3(); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/DeviceDisplayMapper.java b/user-service/src/main/java/com/mh/user/mapper/DeviceDisplayMapper.java new file mode 100644 index 0000000..64c6198 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/DeviceDisplayMapper.java @@ -0,0 +1,45 @@ +package com.mh.user.mapper; + +import com.mh.user.dto.DeviceMessageDTO; +import com.mh.user.dto.DisplayBoxDataDTO; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 设备数据显示持久化层 + * @updateTime 2020-05-29 + * @throws : + */ +@Component +@Mapper +public interface DeviceDisplayMapper { + + // deviceType: 设备类型(host:主机 pump:泵 tower:塔)type: 1(查询阴影值),0(查询数据框内容) + @Select("select title, sec_content1, sec_content2, first_div_class, device_id, grade from table_display_box_data " + + " where device_type = #{deviceType} and query_type = #{type}") + @Results({ + @Result(column = "title", property = "title"), + @Result(column = "sec_content1", property = "secContent1"), + @Result(column = "sec_content2", property = "secContent2"), + @Result(column = "first_div_class", property = "firstDivClass"), + @Result(column = "device_id", property = "deviceId"), + @Result(column = "grade", property = "grade") + }) + List deviceDisplayBoxData(@Param("deviceType") String deviceType, @Param("type") String type); + + // 设备信息状态显示 + @Select("select label, span_length, open_state, device_id, grade from table_device_status where device_type = #{deviceType}") + @Results({ + @Result(column = "label", property = "label"), + @Result(column = "span_length", property = "spanLength"), + @Result(column = "open_state", property = "openState"), + @Result(column = "device_id", property = "deviceId"), + @Result(column = "grade", property = "grade") + }) + List queryDeviceStatus(@Param("deviceType") String deviceType); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/DeviceFloorMapper.java b/user-service/src/main/java/com/mh/user/mapper/DeviceFloorMapper.java new file mode 100644 index 0000000..76ecdac --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/DeviceFloorMapper.java @@ -0,0 +1,178 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.DeviceFloorEntity; +import com.mh.user.entity.DeviceFloorTempEntity; +import com.mh.user.entity.DeviceInstallTempEntity; +import com.mh.user.mapper.provider.DeviceFloorProvider; +import com.mh.user.mapper.provider.DeviceInstallProvider; +import com.mh.user.model.DeviceModel; +import com.mh.user.model.PumpModel; +import org.apache.ibatis.annotations.*; +import org.apache.ibatis.mapping.StatementType; + +import java.util.Date; +import java.util.List; + +@Mapper +public interface DeviceFloorMapper { + + /** + * 楼面设备模块 + * 保存设备信息 + * @param deviceFloorEntity + */ + @Insert("insert into device_floor(device_name,device_type,brand,model,specs,building_id,installer,install_date,is_use) values (" + + " #{deviceName},#{deviceType},#{brand},#{model},#{specs},#{buildingId},#{installer},getDate(),#{use})") + int saveDevice(DeviceFloorEntity deviceFloorEntity); + + /** + * 楼面设备模块 + * 保存设备信息 + * @param deviceFloorEntity + */ + @Update("") + int updateDevice(DeviceFloorEntity deviceFloorEntity); + + /** + * 楼面设备模块 + * 查询设备资料 + * @param buildingId + * @param deviceType + * @param page + * @param limit + * @return + */ + @Results(value = { + @Result(property="id",column="id"), + @Result(property="deviceName",column="device_name"), + @Result(property="deviceType",column="device_type"), + @Result(property ="buildingId",column ="building_id"), + @Result(property ="buildingName",column ="building_name"), + @Result(property="installDate",column="install_date"), + @Result(property="model",column="model"), + @Result(property="specs",column="specs"), + @Result(property="use",column="is_use") + }) + @SelectProvider(type = DeviceFloorProvider.class,method = "queryDeviceFloor") + List queryDeviceFloor(@Param("buildingId") String buildingId,@Param("deviceType") String deviceType,@Param("page") int page, @Param("limit") int limit); + + /** + * 楼面设备模块 + * 获取设备查询的总条数 + * @param buildingId + * @param deviceType + * @param page + * @param limit + * @return + */ + @SelectProvider(type = DeviceFloorProvider.class,method = "getCount") + int getCount(@Param("buildingId") String buildingId,@Param("deviceType") String deviceType,@Param("page") int page, @Param("limit") int limit); + + //根据楼栋、类型查询设备名称 + @Results(value = { + @Result(property="deviceName",column="device_name") + }) + @Select("select * from device_floor where building_id=#{buildingId} and device_type=#{deviceType}") + List selectDeviceName(@Param("buildingId") String buildingId, @Param("deviceType") String deviceType); + + //根据楼栋、类型、设备名称判断是否存在 + @Select("select count(*) from device_floor where building_id=#{buildingId} and device_type=#{deviceType} and device_name=#{deviceName}") + int selectDeviceCount(@Param("buildingId") String buildingId,@Param("deviceType") String deviceType, @Param("deviceName") String deviceName); + + @Results(value = { + @Result(property="id",column="id"), + @Result(property="deviceName",column="device_name") + }) + @Select("select * from device_floor where building_id=#{buildingId} and device_type=#{deviceType} and pump_id=#{pumpId}") + DeviceModel selectTankName(@Param("buildingId") String buildingId, @Param("deviceType") String deviceType,@Param("pumpId") String pumpId); + + //根据设备名称、类型查询设备编号 + @Select("select id from device_floor where device_name=#{deviceName} and device_type=#{deviceType} and building_id=#{buildingId}") + String selectDeviceId(@Param("deviceName") String deviceName,@Param("deviceType") String deviceType,@Param("buildingId") String buildingId); + + //根据设备类型查询设备编号 + @Results(value = { + @Result(property="pumpId",column="id"), + @Result(property="pumpName",column="device_name") + }) + @Select("select id,device_name from device_floor where device_type=#{deviceType} and building_id=#{buildingId}") + PumpModel selectDeviceId2(@Param("deviceType") String deviceType, @Param("buildingId") String buildingId); + /** + * 楼面设备模块 + * 根据编号删除设备信息 + * @param id + */ + @Delete("delete from device_floor where id=#{id}") + int deleteDevice(String id); + + //EXCEL导入相关处理函数 + // 清临时表 + @Delete("DELETE FROM device_floor_temp") + void deleteDevice_floor_temp(); + + // 保存到临时表 + @Insert("insert into device_floor_temp(device_name,device_type,building_id,install_date,model,specs,row_id)" + + " values(#{deviceName},#{deviceType},#{buildingId},getDate(),#{model},#{specs},#{rowId})") + void insertDevice_floor_temp( @Param("deviceName") String deviceName, + @Param("deviceType") String deviceType, + @Param("buildingId") String buildingId, + @Param("model") String model, + @Param("specs") String specs, + @Param("rowId") String rowId + ); + + // EXCEL导入查询EXCEL内容 + @Select("SELECT device_name,device_type,building_id,install_date, " + + " model,specs,row_id, " + + " (CASE " + + " when remarks is not null then remarks + ',行号为' + convert(varchar(100),Row_id) " + + " else '' " + + " end" + + " ) as remarks " + + " FROM device_floor_temp " + + " ORDER BY ISNULL(remarks,'') DESC ,row_id ") + @Options(statementType = StatementType.CALLABLE) + @Results({ + @Result(column = "device_name", property = "deviceName"), + @Result(column = "device_type", property = "deviceType"), + @Result(column = "model", property = "model"), + @Result(column = "specs", property = "specs"), + @Result(column = "building_id", property = "buildingId"), + @Result(column = "install_date", property = "installDate"), + @Result(column = "remarks", property = "remarks"), + @Result(column = "row_id", property = "rowId") + }) + List queryExcelDevices(); + + //查询Excel导入的数据的记录数 + @Select("SELECT COUNT(*) FROM device_floor_temp ") + int queryExcelDevicesCount(); + + /** + * @author nxr + * @title :判断导入资料数据的合法 + * @description :在导入中的数据有重复 + * @updateTime 2022-06-19 + * @throws : + */ + @Update("update device_floor_temp " + + " set Remarks = '数据中表号有重复' " + + " where Remarks is null " + + " and device_id in ( select ISNULL(device_floor_temp.device_id,'') " + + " from device_floor_temp " + + " group by device_id " + + " having count(*) > 1)") + void updateDevice_floor_temp__multiple(); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java b/user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java new file mode 100644 index 0000000..02b8789 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java @@ -0,0 +1,312 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.BuildingEntity; +import com.mh.user.entity.DeviceInstallEntity; +import com.mh.user.entity.DeviceInstallTempEntity; +import com.mh.user.mapper.provider.DeviceInstallProvider; +import com.mh.user.model.DeviceModel; +import org.apache.ibatis.annotations.*; +import org.apache.ibatis.mapping.StatementType; +import java.util.Date; +import java.util.List; + +public interface +DeviceInstallMapper { + + /** + * 设备安装模块 + * 保存设备信息 + * @param deviceInstallEntity + */ + @Insert("insert into device_install(device_addr,device_name,device_type,data_com,ratio,baudrate,brand,model,building_id,installer,install_date,is_use) values (" + + " #{deviceAddr},#{deviceName},#{deviceType},#{dataCom},#{ratio},#{baudRate},#{brand},#{model},#{buildingId},#{installer},getDate(),#{use})") + int saveDevice(DeviceInstallEntity deviceInstallEntity); + + /** + * 设备安装模块 + * 保存设备信息 + * @param deviceInstallEntity + */ + @Update("") + int updateDevice(DeviceInstallEntity deviceInstallEntity); + + //按id更新水电表读数和采集日期 + @Update("update device_install set last_value=#{lastValue},last_date=#{lastDate} where id=#{id}") + void updateLastValue(@Param("id") Long id,@Param("lastValue") String lastValue,@Param("lastDate") Date lastDate); + /** + * 设备管理模块: + * 查询设备资料 + * @param page + * @param limit + * @return + */ + @Results(id="rs", value = { + @Result(property="deviceAddr",column="device_addr"), + @Result(property="deviceName",column="device_name"), + @Result(property="deviceType",column="device_type"), + @Result(property="dataCom",column="data_com"), + @Result(property ="buildingId",column ="building_id"), + @Result(property ="buildingName",column ="building_name"), + @Result(property ="ratio",column ="ratio"), + @Result(property ="lastValue",column ="last_value"), + @Result(property ="lastDate",column ="last_date"), + @Result(property="isOnline",column="is_online"), + @Result(property="installDate",column="install_date"), + @Result(property="baudRate",column="baudrate"), + @Result(property="remarks",column="remarks"), + @Result(property="use",column="is_use"), + @Result(property="fault",column="is_fault"), + @Result(property="faultState",column="fault_state") + }) + @Select("select * from (\n" + + "select *,ROW_NUMBER() over(order by id) as rn from device_install \n" + + ") t where rn between (#{page}-1)*#{limit} and #{page}*#{limit}") + List getAllDevice(@Param("page") int page, @Param("limit") int limit); + + //查询有多个采集参数的设备 + @ResultMap("rs") + @Select("select * from device_install where device_type='热泵'") + List selectDeviceParams(); + + @ResultMap("rs") + @Select("select * from device_install where device_type='热泵' or device_type='水位开关' ") + List selectDeviceParams2(); + + //查询需要手动开关机的热泵 + @ResultMap("rs") + @Select("select * from device_install where device_type='热泵' and brand='美的2' ") + List selectDevicePump(); + + //根据类型查询设备通讯号 + @Select("select top 1 device_addr from device_install where device_type=#{deviceType} and building_id=#{buildingId} ") + String selectDeviceAddr(@Param("deviceType") String deviceType,@Param("buildingId") String buildingId); + + /** + * 设备管理模块: + * 根据条件获取设备查询的总条数 + * @return + */ + @Select("select count(*) from device_install where is_use=1 ") + int getAllCount(); + + + @SelectProvider(type = DeviceInstallProvider.class,method = "queryDevice") + @ResultMap("rs") + List queryDevice(@Param("buildingId") String buildingId, + @Param("deviceType") String deviceType, + @Param("startDate") String startDate, + @Param("endDate")String endDate, + @Param("isOnline")String isOnline, + @Param("isUse")String isUse, + @Param("isFault")String isFault, + @Param("page") int page, + @Param("limit") int limit); + /** + * 设备管理模块: + * 根据条件获取设备查询的总条数 + * @return + */ + @SelectProvider(type = DeviceInstallProvider.class,method = "getCount") + int getCount(@Param("buildingId") String buildingId, + @Param("deviceType") String deviceType, + @Param("startDate") String startDate, + @Param("endDate")String endDate, + @Param("isOnline")String isOnline, + @Param("isUse")String isUse, + @Param("isFault")String isFault, + @Param("page") int page, + @Param("limit") int limit); + + //查询设备故障情况 + @SelectProvider(type = DeviceInstallProvider.class,method = "getIsFaultCount") + int getIsFaultCount(@Param("isFault") String isFault,@Param("deviceType") String deviceType); + + //查询设备在线情况 + @SelectProvider(type = DeviceInstallProvider.class,method = "getIsOnlineCount") + int getIsOnlineCount(@Param("isOnline") String isOnline,@Param("deviceType") String deviceType); + + // 修改设备在线情况,在线。 + @Update("update device_install set is_online=#{isOnline},last_date=getDate() where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId}") +// @Update("update device_install set is_online=#{isOnline} where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId}") + void updateOnline(@Param("deviceAddr") String deviceAddr, + @Param("deviceType") String deviceType, + @Param("buildingId") String buildingId, + @Param("isOnline") String isOnline); + + // 修改设备在线情况,离线。 + @Update("update device_install set is_online=#{isOnline} where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId}") + void updateNotOnline(@Param("deviceAddr") String deviceAddr, + @Param("deviceType") String deviceType, + @Param("buildingId") String buildingId, + @Param("isOnline") String isOnline); + + //根据通讯地址和设备类型查询对应的设备信息 + @ResultMap("rs") + @Select("select * from device_install where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId}") + DeviceInstallEntity selectDevice(@Param("deviceAddr") String deviceAddr,@Param("deviceType") String deviceType,@Param("buildingId") String buildingId); + + //查询通讯编号是否存在 + @Select("select count(*) from device_install where device_addr=#{deviceAddr} and device_type=#{deviceType} ") + int selectDeviceCount(@Param("deviceAddr") String deviceAddr,@Param("deviceType") String deviceType); + /** + * 设备管理模块: + * 根据通讯地址删除设备信息 + * @param id + */ + @Delete("delete from device_install where id=#{id}") + int deleteDevice(String id); + + //EXCEL导入相关处理函数 + // 清临时表 + @Delete("DELETE FROM device_install_temp") + void deleteDevice_install_temp(); + + // 保存到临时表 + @Insert("insert into device_install_temp(device_addr,device_name,device_type,baudrate,data_com,ratio,building_id,row_id)" + + " values(#{deviceAddr},#{deviceName},#{deviceType},#{baudRate},#{dataCom},#{ratio},#{buildingId},#{rowId})") + void insertDevice_install_temp(@Param("deviceAddr") String deviceAddr, + @Param("deviceName") String deviceName, + @Param("deviceType") String deviceType, + @Param("baudRate") int baudRate, + @Param("dataCom") String dataCom, + @Param("ratio") double ratio, + @Param("buildingId") String buildingId, + @Param("rowId") String rowId + ); + + // EXCEL导入查询EXCEL内容 + @Select("SELECT device_addr,device_name,device_type,baudRate,data_com,ratio, " + + " building_id,row_id, " + + " (CASE " + + " when remarks is not null then remarks + ',行号为' + convert(varchar(100),Row_id) " + + " else '' " + + " end " + + " ) as remarks " + + " FROM device_install_temp " + + " ORDER BY ISNULL(remarks,'') DESC ,row_id ") + @Options(statementType = StatementType.CALLABLE) + @Results({ + @Result(column = "device_addr",property = "deviceAddr" ), + @Result(column = "device_name", property = "deviceName"), + @Result(column = "device_type", property = "deviceType"), + @Result(column = "baudRate", property = "baudRate"), + @Result(column = "data_com", property = "dataCom"), + @Result(column = "ratio", property = "ratio"), + @Result(column = "building_id", property = "buildingId"), + @Result(column = "install_date", property = "installDate"), + @Result(column = "remarks", property = "remarks"), + @Result(column = "row_id", property = "rowId") + }) + List queryExcelDevices(); + + //查询Excel导入的数据的记录数 + @Select("SELECT COUNT(*) FROM device_install_temp ") + int queryExcelDevicesCount(); + + /** + * @author nxr + * @title :判断导入资料数据的合法 + * @description :在导入中的数据有重复 + * @updateTime 2022-06-19 + * @throws : + */ + @Update("update device_install_temp " + + " set Remarks = '数据中表号有重复' " + + " where Remarks is null " + + " and device_addr in ( select ISNULL(device_install_temp.device_addr,'') " + + " from device_install_temp " + + " group by device_addr " + + " having count(*) > 1)") + void updateDevice_install_temp__multiple(); + + //从临时表查询插入 + @Insert("insert into device_install(device_addr,device_name,device_type,data_com,baudRate,ratio,building_id) select device_addr,device_name,device_type,data_com,baudRate,ratio,building_id from device_install_temp") + void insertFromDevice_install_temp(); + + //修改启动状态 + @Update("update device_install set is_use=#{isUse} where device_addr=#{deviceAddr}") + void updateDeviceIsUse(@Param("isUse") String isUse, @Param("deviceAddr") String deviceAddr); + + //查询设备 + @Results({ + @Result(column = "device_addr",property = "deviceAddr" ), + @Result(column = "device_name", property = "deviceName"), + @Result(column = "id", property = "id") + }) + @Select("select * from device_install where building_id=#{buildingId} and device_type=#{deviceType}") + List selectDevices(@Param("buildingId") String buildingId, @Param("deviceType") String deviceType); + + + //修改故障状态 + @Update("update device_install set is_fault=#{isFault} where device_addr=#{deviceAddr} and device_type=#{deviceType}") + void updateDeviceFault(@Param("isFault") String isFault, + @Param("deviceAddr") String deviceAddr, + @Param("deviceType") String deviceType); + + //查询设备品牌 + @Select("select brand from device_install where building_id=#{buildingId} and device_addr=#{deviceAddr}") + String selectBrand(@Param("buildingId") String buildingId,@Param("deviceAddr") String deviceAddr); + + //修改使用状态1启用,0停用 + @Update("update device_code_param set isUse=#{isUse} where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId}") + void updateIsUse(@Param("isUse") String isUse, + @Param("deviceAddr") String deviceAddr, + @Param("deviceType") String deviceType, + @Param("buildingId") String buildingId); + + //修改使用状态1启用,0停用 + @Update("update device_code_param2 set isUse=#{isUse} where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId}") + void updateIsUse2(@Param("isUse") String isUse, + @Param("deviceAddr") String deviceAddr, + @Param("deviceType") String deviceType, + @Param("buildingId") String buildingId); + + //修改使用状态1启用,0停用 + @Update("update device_code_param3 set isUse=#{isUse} where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId}") + void updateIsUse3(@Param("isUse") String isUse, + @Param("deviceAddr") String deviceAddr, + @Param("deviceType") String deviceType, + @Param("buildingId") String buildingId); + + + //删除监控表停用热泵记录 + @Delete("delete * from now_data where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId}") + void deletePump(@Param("deviceAddr") String deviceAddr, + @Param("deviceType") String deviceType, + @Param("buildingId") String buildingId); + + //更新基表初始值 + @Update("update device_install set init_value=#{initValue} where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId} ") + void updateInitValue(@Param("deviceAddr") String deviceAddr, + @Param("deviceType") String deviceType, + @Param("buildingId") String buildingId, + @Param("initValue") String initValue); + + //查询最后一次采集时间 + @Select("select last_date from device_install where device_type=#{deviceType} and device_addr=#{deviceAddr} and building_id=#{buildingId}") + String selectLastDate(@Param("deviceType") String deviceType,@Param("deviceAddr") String deviceAddr,@Param("buildingId") String buildingId); + + //判断某栋楼是否有热泵设备 + @Select("select count(*) from device_install where device_type='热泵' and building_id=#{buildingId} ") + int judgePump(@Param("buildingId") String buildingId); + + //查询设备所属位置(低区或高区) + @Select("select seat from device_install where device_type=#{deviceType} and device_addr=#{deviceAddr} and building_id=#{buildingId} ") + String selectSeat(@Param("deviceType") String deviceType,@Param("deviceAddr") String deviceAddr,@Param("buildingId") String buildingId); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/DeviceManageMapper.java b/user-service/src/main/java/com/mh/user/mapper/DeviceManageMapper.java new file mode 100644 index 0000000..bfd4091 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/DeviceManageMapper.java @@ -0,0 +1,171 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.provide.DeviceManageProvider; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description :关于设备的持久化层,mapper层 + * @updateTime 2020-05-15 + * @throws : + */ +@Component +@Mapper +public interface DeviceManageMapper { + + // 查询全部的设备信息 +// @Select("select id, device_code, device_num, collection_num, data_com, initial_value, price, param_id, param_name, last_value, last_date, communication_type, device_type, remark, grade from device_manage") + @SelectProvider(type = DeviceManageProvider.class, method = "getDeviceByOthers") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "device_code", property = "deviceCode"), + @Result(column = "device_num", property = "deviceNum"), + @Result(column = "collection_num", property = "collectionNum"), + @Result(column = "data_com", property = "dataCom"), + @Result(column = "initial_value", property = "initialValue"), + @Result(column = "device_rate", property = "deviceRate"), + @Result(column = "device_caliber", property = "deviceCaliber"), + @Result(column = "price", property = "price"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "last_value", property = "lastValue"), + @Result(column = "last_date", property = "lastDates"), + @Result(column = "communication_type", property = "communicationType"), + @Result(column = "device_type", property = "deviceType"), + @Result(column = "create_time", property = "createTimes"), + @Result(column = "update_time", property = "updateTimes"), + @Result(column = "remark", property = "remark"), + @Result(column = "grade", property = "grade") + }) + List getDeviceByOther(@Param("deviceNum") String deviceNum); + + /** + * 更新基表信息 + * @param deviceManageEntity + */ + @Update("update device_manage set device_code=#{deviceCode},collection_num=#{collectionNum},data_com=#{dataCom},initial_value=#{initialValue}," + + "last_value=#{lastValue},device_caliber=#{deviceCaliber},device_rate=#{deviceRate},param_name=#{paramName}," + + "create_time=#{createTimes},update_time=#{updateTimes},device_type=#{deviceType} where device_num=#{deviceNum}") + void updateBaseMeter(DeviceManageEntity deviceManageEntity); + + /** + * 插入基表信息 + * @param deviceManageEntity + */ + @Insert("insert into device_manage(device_code,device_num,collection_num,data_com,initial_value,last_value,device_caliber,device_rate," + + "param_name,create_time,update_time,device_type) values(#{deviceCode},#{deviceNum},#{collectionNum},#{dataCom},#{initialValue}," + + "#{lastValue},#{deviceCaliber},#{deviceRate},#{paramName},getDate(),#{updateTimes},#{deviceType})") + void insertBaseMeter(DeviceManageEntity deviceManageEntity); + + + + + + + + @Select("select id, device_code, device_num, collection_num, data_com, initial_value, price, param_id, param_name, last_value, last_date, communication_type, device_type, remark, grade from device_manage") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "device_code", property = "deviceCode"), + @Result(column = "device_num", property = "deviceNum"), + @Result(column = "collection_num", property = "collectionNum"), + @Result(column = "data_com", property = "dataCom"), + @Result(column = "initial_value", property = "initialValue"), + @Result(column = "price", property = "price"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "last_value", property = "lastValue"), + @Result(column = "last_date", property = "lastDate"), + @Result(column = "communication_type", property = "communicationType"), + @Result(column = "device_type", property = "deviceType"), + @Result(column = "remark", property = "remark"), + @Result(column = "grade", property = "grade") + }) + List queryAllDevice(); + + /** + * 删除设备信息 + * @param deviceId + * @param deviceType + */ + @DeleteProvider(type = DeviceManageProvider.class, method = "deleteDeviceInfo") + void deleteDeviceInfo(@Param("deviceId")Integer deviceId,@Param("deviceType")String deviceType); + + // 查询全部的设备信息 +// @Select("select id, device_code, device_num, collection_num, data_com, initial_value, price, param_id, param_name, last_value, last_date, communication_type, device_type, remark, grade from device_manage") + @SelectProvider(type = DeviceManageProvider.class, method = "queryDeviceByOthers") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "device_code", property = "deviceCode"), + @Result(column = "device_num", property = "deviceNum"), + @Result(column = "collection_num", property = "collectionNum"), + @Result(column = "data_com", property = "dataCom"), + @Result(column = "initial_value", property = "initialValue"), + @Result(column = "price", property = "price"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "last_value", property = "lastValue"), + @Result(column = "last_date", property = "lastDate"), + @Result(column = "communication_type", property = "communicationType"), + @Result(column = "device_type", property = "deviceType"), + @Result(column = "remark", property = "remark"), + @Result(column = "grade", property = "grade") + }) + List queryDeviceByOther(@Param("page") int page, @Param("size") int size, @Param("deviceNum") String deviceNum); + + @SelectProvider(type = DeviceManageProvider.class, method = "queryDeviceByOthersCount") + int queryDeviceByOtherCount(@Param("deviceNum") String deviceNum); + + @Select("") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "device_code", property = "deviceCode"), + @Result(column = "device_num", property = "deviceNum"), + @Result(column = "collection_num", property = "collectionNum"), + @Result(column = "data_com", property = "dataCom"), + @Result(column = "initial_value", property = "initialValue"), + @Result(column = "price", property = "price"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "last_value", property = "lastValue"), + @Result(column = "last_date", property = "lastDate"), + @Result(column = "communication_type", property = "communicationType"), + @Result(column = "device_type", property = "deviceType"), + @Result(column = "remark", property = "remark"), + @Result(column = "grade", property = "grade") + }) + List queryDevicesByType(@Param("deviceType") String deviceType); + + @Select("select id, device_code, device_num, collection_num, data_com, initial_value, price, param_id, param_name, " + + "last_value, last_date, communication_type, device_type, remark, grade from device_${tableName}") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "device_code", property = "deviceCode"), + @Result(column = "device_num", property = "deviceNum"), + @Result(column = "collection_num", property = "collectionNum"), + @Result(column = "data_com", property = "dataCom"), + @Result(column = "initial_value", property = "initialValue"), + @Result(column = "price", property = "price"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "last_value", property = "lastValue"), + @Result(column = "last_date", property = "lastDate"), + @Result(column = "communication_type", property = "communicationType"), + @Result(column = "device_type", property = "deviceType"), + @Result(column = "remark", property = "remark"), + @Result(column = "grade", property = "grade") + }) + List queryDevicesByType1(@Param("tableName") String tableName); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/DeviceParamMapper.java b/user-service/src/main/java/com/mh/user/mapper/DeviceParamMapper.java new file mode 100644 index 0000000..6e39f15 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/DeviceParamMapper.java @@ -0,0 +1,93 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.entity.DeviceParameterEntity; +import com.mh.user.provide.DeviceParamProvider; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description :设备参数持久化层 + * @updateTime 2020-05-21 + * @throws : + */ +@Component +@Mapper +public interface DeviceParamMapper { + + @SelectProvider(type = DeviceParamProvider.class, method = "getBaseMeterParamList") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "param_baudrate", property = "paramBaudrate"), + @Result(column = "checks", property = "checks"), + @Result(column = "grade", property = "grade") + }) + List getBaseMeterParamList(@Param("baseMeterType")String baseMeterType); + + @Update("update device_parameter set param_name=#{paramName},param_baudrate=#{paramBaudrate},grade=#{grade},checks=#{checks} " + + "where param_id=#{paramId}") + void updateBaseMeterParam(DeviceParameterEntity deviceManageEntity); + + @Insert("insert into device_parameter(param_id,param_name,param_baudrate,grade,checks) values(#{paramId},#{paramName}," + + "#{paramBaudrate},#{grade},#{checks})") + void insertBaseMeterParam(DeviceParameterEntity deviceManageEntity); + + + + + // 添加网关设备 + @Insert("insert into device_parameter(param_id, param_name, param_baudrate, grade, checks)" + + " values (#{paramId}, #{paramName}, #{paramBaudrate}, 1, #{checks})") + void insertDeviceParam(DeviceParameterEntity deviceParameterEntity); + + // 通关网关ID删除设备 + @Delete("delete from device_parameter where id = #{id}") + void deleteDeviceParamByID(@Param("id") Long id); + + // 根据网关设备ID查询网关对应信息 + @Select("select id, param_id, param_name, param_baudrate, grade, checks from device_parameter where param_id = #{paramId}") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "param_baudrate", property = "paramBaudrate"), + @Result(column = "checks", property = "checks"), + @Result(column = "grade", property = "grade") + }) + DeviceParameterEntity queryParamById(int paramId); + + // 查询全部信息 + @Select("select id, param_id, param_name, param_baudrate, grade, checks from device_parameter") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "param_baudrate", property = "paramBaudrate"), + @Result(column = "checks", property = "checks"), + @Result(column = "grade", property = "grade") + }) + List queryAll(); + + // 根据页码和查询条件查询对应的设备信息 + @SelectProvider(type = DeviceParamProvider.class, method = "queryByOther") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "param_baudrate", property = "paramBaudrate"), + @Result(column = "checks", property = "checks"), + @Result(column = "grade", property = "grade") + }) + List queryByOther(int page, int size, int paramId); + + // 查询对应的总数 + @SelectProvider(type = DeviceParamProvider.class, method = "queryByOtherCount") + int queryByOtherCount(int page, int size, int paramId); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/EnergyMapper.java b/user-service/src/main/java/com/mh/user/mapper/EnergyMapper.java new file mode 100644 index 0000000..ba22126 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/EnergyMapper.java @@ -0,0 +1,233 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.EnergyEntity; +import com.mh.user.mapper.provider.EnergyProvider; +import com.mh.user.model.SumModel; +import org.apache.ibatis.annotations.*; +import org.apache.ibatis.mapping.StatementType; + +import java.util.List; + +public interface EnergyMapper { + /** + * 生产信息 + * 保存 + * @param energyEntity + */ + //按天 + @Insert("insert into energy_day(cur_date,building_id,building_name,hot_water_value,use_hot_water,elect_value,elect_water,check_in_count,per_elect,per_water) values (" + + " #{curDate},#{buildingId},#{buildingName},#{hotWaterValue},#{useHotWater},#{electValue},#{electWater},#{checkInCount},#{perElect},#{perWater})") + void saveEnergyDay(EnergyEntity energyEntity); + //按月 + @Insert("insert into energy_month(cur_date,building_id,building_name,hot_water_value,use_hot_water,elect_value,elect_water,check_in_count,per_elect,per_water) values (" + + " #{curTime},#{buildingId},#{buildingName},#{hotWaterValue},#{useHotWater},#{electValue},#{electWater},#{checkInCount},#{perElect},#{perWater})") + void saveEnergyMonth(EnergyEntity energyEntity); + //按年 + @Insert("insert into energy_month(cur_date,building_id,building_name,hot_water_value,use_hot_water,elect_value,elect_water,check_in_count,per_elect,per_water) values (" + + " #{curDate},#{buildingId},#{buildingName},#{hotWaterValue},#{useHotWater},#{electValue},#{electWater},#{checkInCount},#{perElect},#{perWater})") + void saveEnergyYear(EnergyEntity energyEntity); + /** + * 生产信息 + * 修改 + * @param energyEntity + */ + //按天 + @Update("") + void updateEnergyDay(EnergyEntity energyEntity); + //按月 + @Update("") + void updateEnergyMonth(EnergyEntity energyEntity); + //按年 + @Update("") + void updateEnergyYear(EnergyEntity energyEntity); + + /** + * 生产信息 + * 根据时间日期和楼栋编号删除记录 + * @param curDate + * @param buildingId + */ + //按天 + @Delete("delete from energy_day where cur_date=#{curDate} and building_id=#{buildingId} ") + void deleteEnergyDay(@Param("curDate") String curDate,@Param("buildingId") String buildingId); + //按月 + @Delete("delete from energy_month where cur_date=#{curDate} and building_id=#{buildingId} ") + void deleteEnergyMonth(@Param("curDate") String curDate,@Param("buildingId") String buildingId); + //按年 + @Delete("delete from energy_year where cur_date=#{curDate} and building_id=#{buildingId} ") + void deleteEnergyYear(@Param("curDate") String curDate,@Param("buildingId") String buildingId); + /** + * 生产信息 + * 查询 + * @param buildingId + * @param startDate + * @param endDate + * @param page + * @param limit + * @return + */ + //按天 + @SelectProvider(type = EnergyProvider.class,method = "queryEnergyDay") + @Results(id="rs",value = { + @Result(property="curDate",column="cur_date"), + @Result(property="buildingId",column="building_id"), + @Result(property="buildingName",column="building_name"), + @Result(property="hotWaterValue",column="hot_water_value"), + @Result(property ="useHotWater",column ="use_hot_water"), + @Result(property ="electValue",column ="elect_value"), + @Result(property="electWater",column="elect_water"), + @Result(property="checkInCount",column="check_in_count"), + @Result(property="perElect",column="per_elect"), + @Result(property="perWater",column="per_water"), + @Result(property="electCurValue",column="elect_curValue"), + @Result(property="wtCurValue",column="wt_curValue") + }) + List queryEnergyDay(@Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("page") int page, @Param("limit") int limit); + //按月 + @SelectProvider(type = EnergyProvider.class,method = "queryEnergyMonth") + @ResultMap("rs") + List queryEnergyMonth(@Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("page") int page, @Param("limit") int limit); + //按年 + @SelectProvider(type = EnergyProvider.class,method = "queryEnergyYear") + @ResultMap("rs") + List queryEnergyYear(@Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("page") int page, @Param("limit") int limit); + /** + * 生产信息 + * 查询记录数 + * @return + */ + //按天 + @SelectProvider(type = EnergyProvider.class,method = "getEnergyDayCount") + int getEnergyDayCount(@Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("page") int page, @Param("limit") int limit); + //按月 + @SelectProvider(type = EnergyProvider.class,method = "getEnergyMonthCount") + int getEnergyMonthCount(@Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("page") int page, @Param("limit") int limit); + //按年 + @SelectProvider(type = EnergyProvider.class,method = "getEnergyYearCount") + int getEnergyYearCount(@Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("page") int page, @Param("limit") int limit); + + //按天 + @Results(value = { + @Result(property="curDate",column="cur_date"), + @Result(property ="useHotWater",column ="use_hot_water"), + @Result(property ="electValue",column ="elect_value"), + @Result(property="electWater",column="elect_water"), + @Result(property="perElect",column="per_elect"), + @Result(property="perWater",column="per_water") + }) + @Select("SELECT cur_date,sum(use_hot_water) as use_hot_water,sum(elect_value) as elect_value,sum(elect_water) as elect_water FROM energy_day where Left(cur_date,10)=#{curDate} GROUP BY(cur_date)") + List queryEnergyDayGroup(@Param("curDate") String curDate); + + //按月 + @Select("SELECT cur_date,sum(use_hot_water) as use_hot_water,sum(elect_value) as elect_value,sum(elect_water) as elect_water FROM energy_month where Left(cur_date,7)=#{curDate} GROUP BY(cur_date)") + List queryEnergyMonthGroup(@Param("curDate") String curDate); + + //按年 + @Select("SELECT cur_date,sum(use_hot_water) as use_hot_water,sum(elect_value) as elect_value,sum(elect_water) as elect_water FROM energy_year where Left(cur_date,4)=#{curDate} GROUP BY(cur_date)") + List queryEnergyYearGroup(@Param("curDate") String curDate); + + //查询每天的用量 + @SelectProvider(type = EnergyProvider.class,method = "queryDayEnergy") + @ResultMap("rs") + List queryDayEnergy(@Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("page") int page, + @Param("limit") int limit); + + @SelectProvider(type = EnergyProvider.class,method = "getDayEnergyCount") + int getDayEnergyCount(@Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("page") int page, + @Param("limit") int limit); + /** + * 生产信息 + * 查询 + * @param buildingId + * @param curDate + * @param page + * @param limit + * @return + */ + //查询每小时的用量和能耗 + @SelectProvider(type = EnergyProvider.class,method = "queryHourEnergy") + @ResultMap("rs") + List queryHourEnergy(@Param("buildingId") String buildingId, + @Param("curDate") String curDate, + @Param("page") int page, @Param("limit") int limit); + + @SelectProvider(type = EnergyProvider.class,method = "getHourEnergyCount") + int getHourEnergyCount(@Param("buildingId") String buildingId, + @Param("curDate") String curDate); + + @ResultMap("rs") + @SelectProvider(type = EnergyProvider.class,method = "queryEnergyBuilding") + List queryEnergyBuilding(@Param("page") int page, + @Param("limit") int limit); + + @Select("select count(*) from energy_building ") + int getEnergyBuildingCount(); + + //按日、月和年查询水、电用量,计算单耗、平均用量 + @Select("exec pro_energy_building #{curDate,jdbcType=VARCHAR,mode=IN},#{endDate,jdbcType=VARCHAR,mode=IN},#{type,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proEnergyBuilding(@Param("curDate") String curDate,@Param("endDate") String endDate,@Param("type") int type); + + //查询合计 + @Select("select sum(use_hot_water) as sumWater,sum(elect_value) as sumElect from energy_building") + SumModel queryEnergySum(); + + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/ExceptionMapper.java b/user-service/src/main/java/com/mh/user/mapper/ExceptionMapper.java new file mode 100644 index 0000000..f3c7b8b --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/ExceptionMapper.java @@ -0,0 +1,37 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.ExceptionEntity; +import com.mh.user.entity.ExceptionTableData; +import com.mh.user.provide.ExceptionProvider; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * @author ljf + * @title : 异常接口 + * @description : + * @updateTime 2020-07-31 + * @throws : + */ +@Mapper +public interface ExceptionMapper { + + @SelectProvider(type = ExceptionProvider.class, method = "queryException") + @Results({ + @Result(column = "id", property = "deviceId"), + @Result(column = "register_name", property = "deviceName"), + @Result(column = "last_value", property = "info"), + @Result(column = "create_time", property = "timeStamp"), + @Result(column = "remark", property = "remark"), + @Result(column = "state", property = "process") + }) + List queryException(ExceptionEntity exceptionEntity); + + @SelectProvider(type = ExceptionProvider.class, method = "queryExceptionTotal") + int queryExceptionTotal(ExceptionEntity exceptionEntity); + + @Update("update device_exception_alarm set state = #{process}, remark = #{remark} where id = #{deviceId}") + int updateException(ExceptionTableData exceptionTableData); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/GatewayManageMapper.java b/user-service/src/main/java/com/mh/user/mapper/GatewayManageMapper.java new file mode 100644 index 0000000..d263efc --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/GatewayManageMapper.java @@ -0,0 +1,100 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.GatewayManageEntity; +import com.mh.user.provide.GatewayManageProvider; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * author: ljf + * desc: 网关管理实现类 + * create-date: 2020-05-21 + * */ +@Component +@Mapper +public interface GatewayManageMapper { + + /** + * 根据条件查询网关信息 + * @param grade 连接状态 + * @param operator 运营商 + * @return + */ + @SelectProvider(type = GatewayManageProvider.class, method = "queryByOther") + @Results(id="rs",value = { + @Result(column = "gateway_name", property = "gatewayName"), + @Result(column = "gateway_ip", property = "gatewayIP"), + @Result(column = "gateway_address", property = "gatewayAddress"), + @Result(column = "gateway_port", property = "gatewayPort"), + @Result(column = "grade", property = "grade"), + @Result(column = "internet_card", property = "internetCard"), + @Result(column = "operator", property = "operator"), + @Result(column = "create_date", property = "createDate"), + @Result(column = "connect_date", property = "connectDate"), + @Result(column = "remarks", property = "remarks"), + }) + List queryByOther(@Param("grade") Integer grade, @Param("operator") Integer operator); + + /** + * 新增网关信息 + * @param gatewayManageEntity + */ + @Insert("insert into gateway_manage(gateway_name, gateway_ip, gateway_address, gateway_port, grade,internet_card,operator, create_date,remarks " + + ") values(#{gatewayName},#{gatewayIP},#{gatewayAddress},#{gatewayPort},#{grade},#{internetCard},#{operator},getDate(),#{remarks})" ) + void insertGateWayInfo(GatewayManageEntity gatewayManageEntity); + + /** + * 更新网关信息 + * @param gatewayManageEntity + */ + @Update("update gateway_manage set gateway_name = #{gatewayName}, gateway_ip = #{gatewayIP}, gateway_address = #{gatewayAddress}, " + + "gateway_port = #{gatewayPort},grade = #{grade},internet_card = #{internetCard}, operator = #{operator}, " + + "remarks=#{remarks} where id = #{id}") + void updateGateWayInfo(GatewayManageEntity gatewayManageEntity); + + // 查询全部信息 + @SelectProvider(type = GatewayManageProvider.class, method = "queryAll") + @ResultMap("rs") +// @Select("select * from (\n" + +// "select *,ROW_NUMBER() over(order by id) as rn from gateway_manage \n" + +// ") t where rn between (#{page}-1)*#{limit} and #{page}*#{limit}") + List queryAll(@Param("gatewayID") String gatewayID, + @Param("operator") String operator, + @Param("grade") String grade, + @Param("page") int page, @Param("limit") int limit); + + // 查询全部记录数 + @SelectProvider(type = GatewayManageProvider.class, method = "queryCount") +// @Select("select count(*) from gateway_manage ") + int queryCount(@Param("gatewayID") String gatewayID, + @Param("operator") String operator, + @Param("grade") String grade); + + + // 添加网关设备 + @Insert("insert into gateway_manage(gateway_name, gateway_ip, gateway_address, data_com, connect_date, grade, internet_card, operator, gateway_port)" + + " values (#{gatewayName}, #{gatewayIP}, #{gatewayAddress}, #{dataCom}, #{connectDate}, #{grade}, #{internetCard}, #{operator}, #{gatewayPort})") + void insertGatewayManage(GatewayManageEntity gatewayManageEntity); + + // 通关网关ID删除设备 + @Delete("delete from gateway_manage where id = #{gatewayID}") + void deleteGatewayManageByID(@Param("gatewayID") int gatewayID); + + // 根据网关设备ID查询网关对应信息 + @Select("select id, gateway_name, gateway_ip, gateway_address, collection_loop, connect_date, internet_card, operator, gateway_port, grade from gateway_manage where id = #{gatewayID}") + GatewayManageEntity queryGatewayByID(@Param("gatewayID") Long gatewayID); + + // 查询对应的总数 + @SelectProvider(type = GatewayManageProvider.class, method = "queryByOtherCount") + int queryByOtherCount(@Param("page") int page, @Param("size") int size, @Param("gatewayID") int gatewayID); + + // 根据IP和端口号更新服务器在线时间 + @Update("update gateway_manage set connect_date = getDate() where gateway_ip = #{IP} and convert(varchar(20),gateway_port) = #{port}") + void updateGatewayManage(@Param("IP") String IP, @Param("port") String port); + + // 根据设备类型查询数据库,找出对应的详细信息 + @Select("select id, gateway_name, gateway_ip, gateway_address, data_com, connect_date, internet_card, operator, gateway_port, grade from gateway_manage where grade = #{grade}") + GatewayManageEntity queryGatewayByGrade(@Param("grade") Long grade); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/GaugeMapper.java b/user-service/src/main/java/com/mh/user/mapper/GaugeMapper.java new file mode 100644 index 0000000..e1e43e5 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/GaugeMapper.java @@ -0,0 +1,31 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.GaugeEntity; +import com.mh.user.entity.TableChartMessageEntity; +import com.mh.user.provide.GaugeProvider; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Component; + +/** + * @author ljf + * @title : 圆盘mapper层 + * @description : + * @updateTime 2020-08-07 + * @throws : + */ +@Component +@Mapper +public interface GaugeMapper { + + @Select("select 'detail' as chartType, last_value as dataValue, #{timeName} as title from chillers_register_address where id = #{deviceId}") + @Results({ + @Result(column = "chartType", property = "chartType"), + @Result(column = "title", property = "title"), + @Result(column = "dataValue", property = "dataValue") + }) + GaugeEntity getGaugeData(@Param("timeName") String timeName,@Param("deviceId") int deviceId); + + @Select("select time_name as timeName,grade from table_chart_message where width = #{type} and chart_name = #{deviceName}") + TableChartMessageEntity queryDeviceId(@Param("type") String type, @Param("deviceName") String deviceName); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/MaintainInfoMapper.java b/user-service/src/main/java/com/mh/user/mapper/MaintainInfoMapper.java new file mode 100644 index 0000000..c94e90f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/MaintainInfoMapper.java @@ -0,0 +1,91 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.BuildingEntity; +import com.mh.user.entity.DeviceInstallEntity; +import com.mh.user.entity.EnergyEntity; +import com.mh.user.entity.MaintainInfoEntity; +import com.mh.user.mapper.provider.EnergyProvider; +import com.mh.user.mapper.provider.MaintainInfoProvider; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface MaintainInfoMapper { + + /** + * 维修保养模块 + * 维修保养信息 + * @param maintainInfoEntity + */ + @Insert("insert into maintain_info(cur_date,building_id,device_type,device_addr,maintain_type,maintain_people,cost,contents) values (" + + " getDate(),#{buildingId},#{deviceType},#{deviceAddr},#{maintainType},#{maintainPeople},#{cost},#{contents})") + int saveMaintainInfo(MaintainInfoEntity maintainInfoEntity); + + /** + * 维修保养模块 + * 根据日期修改维修保养信息 + * @param maintainInfoEntity + */ + @Update("") + int updateMaintainInfo(MaintainInfoEntity maintainInfoEntity); + + + /** + * 维修保养模块 + * 根据日期、设备类型查询维修保养信息 + * @param curDate + * @param deviceType + * @param page + * @param limit + * @return + */ + @SelectProvider(type = MaintainInfoProvider.class,method = "queryMaintainInfo") + @Results(value = { + @Result(property="curDate",column="cur_date"), + @Result(property="buildingId",column="building_id"), + @Result(property="buildingName",column="building_name"), + @Result(property="deviceType",column="device_type"), + @Result(property ="deviceAddr",column ="device_addr"), + @Result(property ="maintainType",column ="maintain_type"), + @Result(property="maintainPeople",column="maintain_people"), + @Result(property="id",column="id"), + @Result(property="cost",column="cost"), + @Result(property="contents",column="contents") + }) + List queryMaintainInfo(@Param("curDate") String curDate, + @Param("buildingId") String buildingId, + @Param("deviceType") String deviceType, + @Param("page") int page, + @Param("limit") int limit); + /** + * 维修保养模块 + * 根据日期、设备类型查询记录数 + * @return + */ + @SelectProvider(type = MaintainInfoProvider.class,method = "getMaintainInfoCount") + int getMaintainInfoCount(@Param("curDate") String curDate, + @Param("buildingId") String buildingId, + @Param("deviceType") String deviceType, + @Param("page") int page, + @Param("limit") int limit); + + /** + * 维修保养模块 + * 根据维护编号删除维修保养信息 + * @param id + */ + @Delete("delete from maintain_info where id=#{id}") + void deleteMaintainInfo(String id); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java b/user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java new file mode 100644 index 0000000..f489425 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java @@ -0,0 +1,418 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.NowDataEntity; +import com.mh.user.entity.WaterLevelEntity; +import com.mh.user.entity.WaterTempEntity; +import com.mh.user.entity.PumpMinutesEntity; +import com.mh.user.mapper.provider.NowDataProvider; +import com.mh.user.model.WaterLevelModel; +import org.apache.ibatis.annotations.*; +import org.apache.ibatis.mapping.StatementType; + +import java.util.List; + + +@Mapper +public interface NowDataMapper { + + //保存监控界面实时信息 + @Insert("insert into now_data(cur_date,building_id,building_name,pump_id,pump_name,temp_set,water_temp,run_state,is_fault,level_set,water_level,tank_id,tank_name) values (" + + " getDate(),#{buildingId},#{buildingName},#{pumpId},#{pumpName},#{tempSet},#{waterTemp},#{runState},#{isFault},#{levelSet},#{waterLevel},#{tankId},#{tankName})") + void saveNowData(NowDataEntity nowDataEntity); + + //修改监控界面实时信息(热泵) + @Update("") + void updateNowData(NowDataEntity nowDataEntity); + + //修改监控界面实时信息(不包含热泵) + @Update("") + void updateNowData2(NowDataEntity nowDataEntity); + + //查询监控界面实时信息 + @Results(id="rs",value = { + @Result(property="curDate",column="cur_date"), + @Result(property="buildingId",column="building_id"), + @Result(property="buildingName",column="building_name"), + @Result(property="pumpId",column="pump_id"), + @Result(property ="pumpName",column ="pump_name"), + @Result(property ="tempSet",column ="temp_set"), + @Result(property="waterTemp",column="water_temp"), + @Result(property ="runState",column ="run_state"), + @Result(property ="isFault",column ="is_fault"), + @Result(property ="levelSet",column ="level_set"), + @Result(property ="waterLevel",column ="water_level"), + @Result(property ="tankId",column ="tank_id"), + @Result(property ="tankName",column ="tank_name"), + @Result(property ="envTemp",column ="env_temp") + }) + @Select("select * from now_data where building_id=#{buildingId} order by cast(pump_id as int) ") + List queryNowData(@Param("buildingId") String buildingId); + + //按热泵查询当前状态 + @ResultMap(value = "rs") + @Select("select * from now_data where pump_id=#{pumpId} and building_id=#{buildingId}") + NowDataEntity queryNowDataByPump(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId); + + //保存监控界面历史信息 + @Insert("insert into history_data(cur_date,building_id,building_name,pump_id,pump_name,temp_set,water_temp,run_state,is_fault,level_set,water_level,tank_id,tank_name) values (" + + " #{curDate},#{buildingId},#{buildingName},#{pumpId},#{pumpName},#{tempSet},#{waterTemp},#{runState},#{isFault},#{levelSet},#{waterLevel},#{tankId},#{tankName})") + void saveHistoryData(NowDataEntity nowDataEntity); + + //修改监控界面历史信息(热泵) + @Update("") + void updateHistoryData(NowDataEntity nowDataEntity); + + //修改监控界面历史信息(不包含热泵) + @Update("") + void updateHistoryData2(NowDataEntity nowDataEntity); + + //查询监控界面历史温度 + @ResultMap(value = "rs") + @SelectProvider(type = NowDataProvider.class,method = "queryHistoryData") + List queryHistoryData(@Param("curDate") String curDate, + @Param("buildingId") String buildingId, + @Param("pumpId") String pumpId, + @Param("tankId") String tankId, + @Param("page") int page, + @Param("limit") int limit); + + //查询记录数 + @SelectProvider(type = NowDataProvider.class,method = "getHistoryDataCount") + int getHistoryDataCount(@Param("curDate") String curDate, + @Param("buildingId") String buildingId, + @Param("pumpId") String pumpId, + @Param("tankId") String tankId, + @Param("page") int page, + @Param("limit") int limit); + + //从WaterLevel表查询水位 + @Results({ + @Result(property="curDate",column="cur_date"), + @Result(property="buildingID",column="building_id"), + @Result(property="buildingName",column="building_name") + }) + @SelectProvider(type = NowDataProvider.class,method = "queryWaterLevel") + List queryWaterLevel(@Param("curDate") String curDate, + @Param("buildingID") String buildingID, + @Param("page") int page, + @Param("limit") int limit); + + //从history_data表查询水位记录数 + @SelectProvider(type = NowDataProvider.class,method = "getWaterLevelCount") + int getWaterLevelCount(@Param("curDate") String curDate, + @Param("buildingID") String buildingID); + + //从history_data表按时间点查询水位 + @Results({ + @Result(property="curDate",column="cur_date"), + @Result(property="buildingID",column="building_id"), + @Result(property="buildingName",column="building_name"), + @Result(property ="waterLevel",column ="water_level") + }) +// @Select("select distinct building_id,building_name,cur_date,water_level from history_data where CONVERT(varchar(13),cur_date,121)=#{curDate} order by building_id ") + @SelectProvider(type = NowDataProvider.class,method = "queryWaterLevelByTime") + List queryWaterLevelByTime(@Param("curDate") String curDate, + @Param("page") int page, + @Param("limit") int limit); + + //从history_data表按时间查询水位记录数 + @SelectProvider(type = NowDataProvider.class,method = "waterLevelByTimeCount") + int waterLevelByTimeCount(@Param("curDate") String curDate); + + //查询每天楼栋水位变化 + @Results({ + @Result(property="curDate",column="cur_date"), + @Result(property="buildingID",column="building_id"), + @Result(property="buildingName",column="building_name") + }) + @SelectProvider(type = NowDataProvider.class,method = "queryBuildWaterLevel") + List queryBuildWaterLevel(@Param("curDate") String curDate, + @Param("page") int page, + @Param("limit") int limit); + //查询每天楼栋水位变化记录数 + @Select("select count(*) from waterLevel where convert(varchar(10),cur_date,121)=left(#{curDate},10)") + int buildWaterLevelCount(@Param("curDate") String curDate); + + //判断实时表有没有记录(热泵) + @Select("select count(*) from now_data where building_id=#{buildingId} and pump_id=#{pumpId}") + int selectNowDataCount(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId); + + //查询实时表记录(热泵) + @ResultMap(value = "rs") + @Select("select * from now_data where building_id=#{buildingId} and pump_id=#{pumpId}") + NowDataEntity selectNowData(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId); + + //判断实时表有没有记录(非热泵) + @Select("select count(*) from now_data where building_id=#{buildingId} ") + int selectNowDataCount2(@Param("buildingId") String buildingId); + + //查询实时表记录(非热泵) + @ResultMap(value = "rs") + @Select("select * from now_data where building_id=#{buildingId} ") + NowDataEntity selectNowData2(@Param("buildingId") String buildingId); + + //判断历史表有没有记录(热泵) + @Select("select count(*) from history_data where convert(varchar(19),cur_date,121)=#{curDate} and building_id=#{buildingId} and pump_id=#{pumpId}") + int selectHistoryDataCount(@Param("curDate") String curDate,@Param("buildingId") String buildingId,@Param("pumpId") String pumpId); + + //查询历史表记录(热泵) + @ResultMap(value = "rs") + @Select("select * from history_data where cur_date=#{curDate} and building_id=#{buildingId} and pump_id=#{pumpId}") + NowDataEntity selectHistoryData(@Param("curDate") String curDate,@Param("buildingId") String buildingId,@Param("pumpId") String pumpId); + + //判断历史表有没有记录(非热泵) + @Select("select count(*) from history_data where convert(varchar(19),cur_date,121)=#{curDate} and building_id=#{buildingId} ") + int selectHistoryDataCount2(@Param("curDate") String curDate,@Param("buildingId") String buildingId); + + //查询历史表记录(非热泵) + @ResultMap(value = "rs") + @Select("select * from history_data where cur_date=#{curDate} and building_id=#{buildingId} ") + NowDataEntity selectHistoryData2(@Param("curDate") String curDate,@Param("buildingId") String buildingId); + + //初始化开始----------------------------------------------------------------------------------------- + //初始化温度设置 + @Update("update now_data set temp_set='50' where building_id=#{buildingId} and temp_set is null ") + void updateTempSet(@Param("buildingId") String buildingId); + + //初始化水位设置 + @Update("update now_data set level_set='100' where building_id=#{buildingId} and level_set is null ") + void updateLevelSet(@Param("buildingId") String buildingId); + + //初始化故障状态 + @Update("update now_data set is_fault='无故障' where building_id=#{buildingId} and level_set is null ") + void updateIsFault(@Param("buildingId") String buildingId); + //初始化结束----------------------------------------------------------------------------------------- + + //求热泵平均温度 + @Select("select Convert(decimal(18,1),avg(CAST(water_temp as FLOAT))) from now_data where building_id=#{buildingId}") + String selectAve(@Param("buildingId") String buildingId); + + //求单个热泵温度 + @Select("select water_temp from now_data where pump_id=#{pumpId} and building_id=#{buildingId}") + String selectSingleTemp(@Param("pumpId") String pumpId,@Param("buildingId") String buildingId); + + //求热泵状态运行数 + @Select("select count(*) from now_data where building_id=#{buildingId} and run_state='运行'") + int selectStateCount(@Param("buildingId") String buildingId); + + //求热泵状态运行 + @Select("select run_state from now_data where building_id=#{buildingId} and pump_id=#{pumpId}") + String selectState(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId); + + //更新设置水位值 + @Update("update now_data set level_set=#{levelSet},cur_date=getDate() where building_id=#{buildingId}") + void upLevelSet(@Param("buildingId") String buildingId,@Param("levelSet") String levelSet); + + //更新设置温度值 + @Update("update now_data set temp_set=#{tempSet},cur_date=getDate() where building_id=#{buildingId} and pump_id=#{pumpID}") + void upTempSet2(@Param("buildingId") String buildingId,@Param("tempSet") String tempSet,@Param("pumpID") String pumpID); + + @Update("update now_data set temp_set=#{tempSet},cur_date=getDate() where building_id=#{buildingId}") + void upTempSet(@Param("buildingId") String buildingId,@Param("tempSet") String tempSet); + //---------------------------------------------------------------------------------------------------- + + //查询每天24小时每个热泵温度变化情况 + @Results({@Result(property="curDate",column="cur_date"), + @Result(property="buildingID",column="building_id"), + @Result(property="buildingName",column="building_name"), + @Result(property="pumpID",column="pump_id"), + @Result(property="pumpName",column="pump_name") + }) + @SelectProvider(type = NowDataProvider.class,method = "queryWaterTemp") + List queryWaterTemp(@Param("buildingID") String buildingID, + @Param("curDate") String curDate, + @Param("page") int page, + @Param("limit") int limit); + + @SelectProvider(type = NowDataProvider.class,method = "queryWaterTempCount") + int queryWaterTempCount(@Param("buildingID") String buildingID, + @Param("curDate") String curDate); + + //查询每天24小时每个热泵温度变化情况2 + @Results({@Result(property="curDate",column="cur_date"), + @Result(property="buildingID",column="building_id"), + @Result(property="buildingName",column="building_name") + }) + @SelectProvider(type = NowDataProvider.class,method = "queryWaterTemp2") + List queryWaterTemp2(@Param("curDate") String curDate, + @Param("page") int page, + @Param("limit") int limit); + + @SelectProvider(type = NowDataProvider.class,method = "queryWaterTempCount2") + int queryWaterTempCount2(@Param("curDate") String curDate); + + //生成楼栋温度 + @Select("exec pro_waterTemp #{curDate,jdbcType=VARCHAR,mode=IN},#{buildingID,jdbcType=VARCHAR,mode=IN},#{pumpID,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proWaterTemp(@Param("curDate") String curDate,@Param("buildingID") String buildingID,@Param("pumpID") String pumpID); + + //生成楼栋水位 + @Select("exec pro_waterLevel #{curDate,jdbcType=VARCHAR,mode=IN},#{buildingID,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proWaterLevel(@Param("curDate") String curDate,@Param("buildingID") String buildingID); + + //在没有接收到返回值前设置监控界面热泵是否离线 + @Update("update now_data set run_state=#{strState} where building_id=#{buildingId} and pump_id=#{pumpId}") + void updateRunState(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId,@Param("strState") String strState); + + //计算热泵运行时间,按分钟 + @Select("exec pro_pumpMinutes #{buildingId,jdbcType=VARCHAR,mode=IN}, #{pumpId,jdbcType=VARCHAR,mode=IN},#{runState,jdbcType=VARCHAR,mode=IN}") + @Options(statementType = StatementType.CALLABLE) + void proPumpMinutes(@Param("buildingId") String buildingID,@Param("pumpId") String pumpID,@Param("runState") String runState); + + //按日查询热泵运行时长 + @Results({@Result(property="curDate",column="cur_date"), + @Result(property="buildingId",column="building_id"), + @Result(property="buildingName",column="building_name"), + @Result(property="pumpId",column="pump_id"), + @Result(property="pumpName",column="pump_name"), + @Result(property="runMinutes",column="run_minutes") + }) + @SelectProvider(type = NowDataProvider.class,method = "pumpMinutes") + List pumpMinutes(@Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("buildingId") String buildingId, + @Param("pumpId") String pumpId, + @Param("page") int page, + @Param("limit") int limit); + + //按日查询热泵运行时长记录数 + @SelectProvider(type = NowDataProvider.class,method = "pumpMinutesCount") + int pumpMinutesCount(@Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("buildingId") String buildingId, + @Param("pumpId") String pumpId); + + + //按周查询热泵运行时长 + @Results({@Result(property="curDate",column="cur_date"), + @Result(property="buildingId",column="building_id"), + @Result(property="buildingName",column="building_name"), + @Result(property="pumpId",column="pump_id"), + @Result(property="pumpName",column="pump_name"), + @Result(property="runMinutes",column="run_minutes") + }) + @SelectProvider(type = NowDataProvider.class,method = "pumpWeekMinutes") + List pumpWeekMinutes(@Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("buildingId") String buildingId, + @Param("pumpId") String pumpId, + @Param("page") int page, + @Param("limit") int limit); + + //按周查询热泵运行时长记录数 + @SelectProvider(type = NowDataProvider.class,method = "pumpWeekMinutesCount") + int pumpWeekMinutesCount(@Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("buildingId") String buildingId, + @Param("pumpId") String pumpId); + + //按周查询热泵运行时长 + @Results({@Result(property="curDate",column="cur_date"), + @Result(property="buildingId",column="building_id"), + @Result(property="buildingName",column="building_name"), + @Result(property="pumpId",column="pump_id"), + @Result(property="pumpName",column="pump_name"), + @Result(property="runMinutes",column="run_minutes") + }) + @SelectProvider(type = NowDataProvider.class,method = "pumpMonthMinutes") + List pumpMonthMinutes(@Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("buildingId") String buildingId, + @Param("pumpId") String pumpId, + @Param("page") int page, + @Param("limit") int limit); + + //按周查询热泵运行时长记录数 + @SelectProvider(type = NowDataProvider.class,method = "pumpMonthMinutesCount") + int pumpMonthMinutesCount(@Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("buildingId") String buildingId, + @Param("pumpId") String pumpId); + + //通过楼栋编号获取最小热泵id号,规定最小热泵号为单箱 + @Select("select min(cast(pump_id as int)) from now_data where building_id=#{buildingId}") + String selectMinPumpId(@Param("buildingId") String buildingId); + + + //按高低区更新water_Level + @Update("update now_data SET now_data.water_Level=#{waterLevel} FROM device_install where now_data.pump_id =device_install.device_addr AND device_install.seat=#{seat} and now_data.building_id=#{buildingId} ") + void nowDataWaterLevel(@Param("waterLevel") String waterLevel, + @Param("seat") String seat, + @Param("buildingId") String buildingId); + + //按高低区更新levelSet + @Update("update now_data SET now_data.level_set=#{levelSet} FROM device_install where now_data.pump_id =device_install.device_addr AND device_install.seat=#{seat} and now_data.building_id=#{buildingId} ") + void nowDataLevelSet(@Param("levelSet") String levelSet, + @Param("seat") String seat, + @Param("buildingId") String buildingId); + + //按高低区更新water_Level + @Update("update history_Data SET history_Data.water_Level=#{waterLevel} FROM device_install where history_Data.pump_id =device_install.device_addr AND device_install.seat=#{seat} " + + " and history_Data.building_id=#{buildingId} and convert(varchar(13),cur_date,121)=left(#{curDate},13) ") + void historyDataWaterLevel(@Param("waterLevel") String waterLevel, + @Param("seat") String seat, + @Param("buildingId") String buildingId, + @Param("curDate") String curDate); + + //按高低区更新levelSet + @Update("update history_Data SET history_Data.level_set=#{levelSet} FROM device_install where history_Data.pump_id =device_install.device_addr AND device_install.seat=#{seat} " + + " and history_Data.building_id=#{buildingId} and convert(varchar(13),cur_date,121)=left(#{curDate},13) ") + void historyDataLevelSet(@Param("levelSet") String levelSet, + @Param("seat") String seat, + @Param("buildingId") String buildingId, + @Param("curDate") String curDate); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/NowPublicDataMapper.java b/user-service/src/main/java/com/mh/user/mapper/NowPublicDataMapper.java new file mode 100644 index 0000000..900705a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/NowPublicDataMapper.java @@ -0,0 +1,107 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.NowDataEntity; +import com.mh.user.entity.NowPublicDataEntity; +import com.mh.user.mapper.provider.NowPublicDataProvider; +import com.mh.user.model.TempModel; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface NowPublicDataMapper { + + //保存监控界面公共实时信息 + @Insert("insert into now_public_data(cur_date,building_id,building_name,up_water,use_water,back_water,use_water_temp,back_water_temp) values (" + + " getDate(),#{buildingId},#{buildingName},#{upWater},#{useWater},#{backWater},#{useWaterTemp},#{backWaterTemp})") + void saveNowPublicData(NowPublicDataEntity nowPublicDataEntity); + + //修改监控界面公共实时信息 + @Update("") + void updateNowPublicData(NowPublicDataEntity nowPublicDataEntity); + + //查询监控界面公共实时信息 + @Results(value = { + @Result(property="curDate",column="cur_date"), + @Result(property="buildingId",column="building_id"), + @Result(property="buildingName",column="building_name"), + @Result(property="upWater",column="up_water"), + @Result(property ="useWater",column ="use_water"), + @Result(property ="backWater",column ="back_water"), + @Result(property="useWaterTemp",column="use_water_temp"), + @Result(property ="backWaterTemp",column ="back_water_temp") + }) + @Select("select * from now_public_data where building_id=#{buildingId}") + NowPublicDataEntity queryNowPublicData(@Param("buildingId") String buildingId); + + //保存监控界面公共历史信息 + @Insert("insert into history_public_data(cur_date,building_id,building_name,up_water,use_water,back_water,use_water_temp,back_water_temp) values (" + + " #{curDate},#{buildingId},#{buildingName},#{upWater},#{useWater},#{backWater},#{useWaterTemp},#{backWaterTemp})") + void saveHistoryPublicData(NowPublicDataEntity nowPublicDataEntity); + + //修改监控界面公共历史信息 + @Update("") + void updateHistoryPublicData(NowPublicDataEntity nowPublicDataEntity); + + //查询监控界面公共历史信息 + @SelectProvider(type = NowPublicDataProvider.class,method = "queryHistoryPublicData") + List queryHistoryPublicData(@Param("curDate") String curDate, @Param("buildingId") String buildingId, + @Param("page") int page, @Param("limit") int limit); + //查询记录数 + @SelectProvider(type = NowPublicDataProvider.class,method = "getHistoryPublicDataCount") + int getHistoryPublicDataCount(@Param("curDate") String curDate, @Param("buildingId") String buildingId, + @Param("page") int page, @Param("limit") int limit); + + //判断实时表有没有记录(非热泵) + @Select("select count(*) from now_public_data where building_id=#{buildingId} ") + int selectNowPublicDataCount(@Param("buildingId") String buildingId); + + //判断历史表有没有记录(非热泵) + @Select("select count(*) from history_public_data where convert(varchar(19),cur_date,121)=#{curDate} and building_id=#{buildingId} ") + int selectHistoryPublicDataCount(@Param("curDate") String curDate,@Param("buildingId") String buildingId); + + //查询所有楼栋水箱平均温度 + @Results(value = { + @Result(property="buildingId",column="building_id"), + @Result(property="buildingName",column="building_name"), + @Result(property ="singleTemp",column ="single_temp"), + @Result(property ="avgTemp",column ="use_water_temp") + }) + @Select("select building_id,building_name,use_water_temp,single_temp from now_public_data") + List queryWtTemp(); + + //查询单个楼栋水箱平均温度 + @Results(value = { + @Result(property="buildingId",column="building_id"), + @Result(property="buildingName",column="building_name"), + @Result(property ="singleTemp",column ="single_temp"), + @Result(property ="avgTemp",column ="use_water_temp") + }) + @Select("select building_id,building_name,use_water_temp,single_temp from now_public_data where building_id=#{buildingId} ") + TempModel queryWtTemp2(@Param("buildingId") String buildingId); + + //更新单箱温度 + @Update("update now_public_data set single_temp=#{singleTemp} where building_id=#{buildingId}") + void updateSingleTemp(@Param("singleTemp") String singleTemp,@Param("buildingId") String buildingId); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/PumpSetMapper.java b/user-service/src/main/java/com/mh/user/mapper/PumpSetMapper.java new file mode 100644 index 0000000..c3e6481 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/PumpSetMapper.java @@ -0,0 +1,57 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.AlarmInfoEntity; +import com.mh.user.entity.PumpSetEntity; +import org.apache.ibatis.annotations.*; + +@Mapper +public interface PumpSetMapper { + + //插入记录 + @Insert("insert into pump_set(building_id,pump_id,pump_name,temp_set,water_temp,start_time1,close_time1,start_time2,close_time2) values (" + + "#{buildingId},#{pumpId},#{pumpName},#{tempSet},#{waterTemp},#{startTime1},#{closeTime1},#{startTime2},#{closeTime2})") + void savePumpSet(PumpSetEntity pumpSetEntity); + + //修改记录 + @Update("") + void updatePumpSet(PumpSetEntity pumpSetEntity); + + //更新设定温度 + @Update("update pump_set set temp_set=#{tempSet} where building_id = #{buildingId} and pump_id=#{pumpId}") + void updatePumpSetTemp(@Param("tempSet") String tempSet,@Param("buildingId") String buildingId,@Param("pumpId") String pumpId); + + //查询记录数 + @Select("select count(*) from pump_set where building_id=#{buildingId} and pump_id=#{pumpId}") + int selectCount(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId); + + //查询记录 + @Results(id="rs", value = { + @Result(column = "building_id",property = "buildingId" ), + @Result(column = "pump_id", property = "pumpId"), + @Result(column = "pump_name", property = "pumpName"), + @Result(column = "temp_set", property = "tempSet"), + @Result(column = "water_temp", property = "waterTemp"), + @Result(column = "start_time1", property = "startTime1"), + @Result(column = "close_time1", property = "closeTime1"), + @Result(column = "start_time2", property = "startTime2"), + @Result(column = "close_time2", property = "closeTime2") + }) + @Select("select * from Pump_Set where pump_id=#{pumpId} and building_id=#{buildingId}") + PumpSetEntity queryPumpSet(@Param("pumpId") String pumpId,@Param("buildingId") String buildingId); + + //查询记录 + @ResultMap("rs") + @Select("select * from Pump_Set where building_id='001'") + PumpSetEntity queryHandTime(); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/ReportMapper.java b/user-service/src/main/java/com/mh/user/mapper/ReportMapper.java new file mode 100644 index 0000000..e5b2af9 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/ReportMapper.java @@ -0,0 +1,40 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.ReportParamEntity; +import org.apache.ibatis.annotations.*; +import org.apache.ibatis.type.JdbcType; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author ljf + * @title :查询报表功能 + * @description : + * @updateTime 2020-07-03 + * @throws : + */ +@Mapper +@Component +public interface ReportMapper { + + // 查询全部的指标参数 + @Results({ + @Result(column="id", property="id", jdbcType= JdbcType.INTEGER, id=true), + @Result(column="parent_id", property="parentId", jdbcType=JdbcType.INTEGER), + @Result(column="other_name", property="label", jdbcType=JdbcType.VARCHAR), + @Result(column="level_type", property="levelType", jdbcType=JdbcType.INTEGER) + }) + @Select("select id, other_name, level_type, parent_id from report_param_manage ") + List queryAllTarget(); + + // 查询全部的指标参数 + @Results({ + @Result(column="id", property="id", jdbcType= JdbcType.INTEGER, id=true), + @Result(column="parent_id", property="parentId", jdbcType=JdbcType.INTEGER), + @Result(column="other_name", property="label", jdbcType=JdbcType.VARCHAR), + @Result(column="level_type", property="levelType", jdbcType=JdbcType.INTEGER) + }) + @Select("select id, other_name, level_type, parent_id from report_param_manage where grade = 1 or grade = 2") + List queryAllTarget1(); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/SummaryMapper.java b/user-service/src/main/java/com/mh/user/mapper/SummaryMapper.java new file mode 100644 index 0000000..bc46233 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SummaryMapper.java @@ -0,0 +1,92 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.AlarmInfoSumEntity; +import com.mh.user.entity.DeviceStateEntity; +import com.mh.user.entity.EnergySumEntity; +import com.mh.user.entity.MaintainSumEntity; +import org.apache.ibatis.annotations.*; + +@Mapper +public interface SummaryMapper { + + + @Results(value = { + @Result(property="curDate",column="cur_date"), + @Result(property="deviceNum",column="device_num"), + @Result(property="electNum",column="elect_num"), + @Result(property="waterNum",column="water_num"), + @Result(property="pumpNum",column="pump_num"), + @Result(property ="PressureNum",column ="Pressure_num"), + @Result(property ="runNum",column ="run_num"), + @Result(property ="lastRunNum",column ="last_run_num"), + @Result(property="runP",column="run_p"), + @Result(property="onlineNum",column="online_num"), + @Result(property="offlineNum",column="offline_num"), + @Result(property="faultNum",column="fault_num"), + @Result(property="lastFaultNum",column="last_fault_num"), + @Result(property="faultP",column="fault_p"), + @Result(property="pumpOnline",column="pump_online") + }) + //查询设备状态汇总 + @Select("select top 1* from device_state order by cur_date desc") + DeviceStateEntity queryDeviceState(); + + //查询日汇总 + @Results(id="rs", value = { + @Result(property="curDate",column="cur_date"), + @Result(property="buildingId",column="building_id"), + @Result(property="fillWater",column="fill_water"), + @Result(property="fillWaterP",column="fill_water_p"), + @Result(property ="waterValue",column ="water_value"), + @Result(property ="waterP",column ="water_p"), + @Result(property ="electValue",column ="elect_value"), + @Result(property="electP",column="elect_p"), + @Result(property="electWater",column="elect_water"), + @Result(property="electWaterP",column="elect_water_p") + }) + @Select("select * from energy_day_sum where building_id=#{buildingId} and cur_date=#{curDate} ") + EnergySumEntity queryEnergyDaySum(@Param("buildingId") String buildingId,@Param("curDate") String curDate); + + //查询月汇总 + @ResultMap("rs") + @Select("select * from energy_month_sum where building_id=#{buildingId} and cur_date=#{curDate} ") + EnergySumEntity queryEnergyMonthSum(@Param("buildingId") String buildingId,@Param("curDate") String curDate); + + //查询年汇总 + @ResultMap("rs") + @Select("select * from energy_year_sum where building_id=#{buildingId} and cur_date=#{curDate} ") + EnergySumEntity queryEnergyYearSum(@Param("buildingId") String buildingId,@Param("curDate") String curDate); + + //查询维修量汇总 + @Results(value = { + @Result(property="curDate",column="cur_date"), + @Result(property="buildingId",column="building_id"), + @Result(property="dayNum",column="day_num"), + @Result(property="dayP",column="day_p"), + @Result(property ="weekNum",column ="week_num"), + @Result(property ="weekP",column ="week_p"), + @Result(property ="monthNum",column ="month_num"), + @Result(property="monthP",column="month_p"), + @Result(property="yearNum",column="year_num"), + @Result(property="yearP",column="year_p") + }) + @Select("select * from maintain_sum where building_id=#{buildingId} and cur_date=#{curDate}") + MaintainSumEntity queryMaintainSum(@Param("buildingId") String buildingId,@Param("curDate") String curDate); + + //警报管理汇总查询 + @Results(value = { + @Result(property="curDate",column="cur_date"), + @Result(property="buildingId",column="building_id"), + @Result(property="deviceNum",column="device_num"), + @Result(property="faultNum",column="fault_num"), + @Result(property ="waterLevel",column ="water_level"), + @Result(property ="waterLevelNum",column ="water_level_num"), + @Result(property ="electWater",column ="elect_water"), + @Result(property="electWaterNum",column="elect_water_num"), + @Result(property ="waterTemp",column ="water_temp"), + @Result(property="waterTempNum",column="water_temp_num") + }) + @Select("select * from alarm_info_sum ") + AlarmInfoSumEntity queryAlarmInfoSum(@Param("buildingId") String buildingId, @Param("curDate") String curDate); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/SysDeptMapper.java b/user-service/src/main/java/com/mh/user/mapper/SysDeptMapper.java new file mode 100644 index 0000000..c567264 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SysDeptMapper.java @@ -0,0 +1,29 @@ +package com.mh.user.mapper; + +import com.mh.user.model.SysDept; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * author: ljf + * desc: 部门Mapper + */ +public interface SysDeptMapper { + + int deleteByPrimaryKey(Long id); + + int insert(SysDept record); + + int insertSelective(SysDept record); + + SysDept selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysDept record); + + int updateByPrimaryKey(SysDept record); + + List findPage(); + + List findAll(); +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/mapper/SysDictMapper.java b/user-service/src/main/java/com/mh/user/mapper/SysDictMapper.java new file mode 100644 index 0000000..f359c66 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SysDictMapper.java @@ -0,0 +1,31 @@ +package com.mh.user.mapper; + +import com.mh.user.model.SysDict; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * author: ljf + * desc: 系统日志 + */ +public interface SysDictMapper { + int deleteByPrimaryKey(Long id); + + int insert(SysDict record); + + int insertSelective(SysDict record); + + SysDict selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysDict record); + + int updateByPrimaryKey(SysDict record); + + List findPage(); + + List findPageByLabel(@Param(value = "label") String label); + + List findByLable(@Param(value = "label") String label); +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/mapper/SysLogMapper.java b/user-service/src/main/java/com/mh/user/mapper/SysLogMapper.java new file mode 100644 index 0000000..b489c43 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SysLogMapper.java @@ -0,0 +1,60 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.SysParamEntity; +import com.mh.user.mapper.provider.NowDataProvider; +import com.mh.user.mapper.provider.SysLogProvider; +import com.mh.user.model.SysLog; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * author: ljf + * desc: 系统日志Mapper + */ +@Mapper +public interface SysLogMapper { + int deleteByPrimaryKey(Long id); + + int insert(SysLog record); + + int insertSelective(SysLog record); + + SysLog selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysLog record); + + int updateByPrimaryKey(SysLog record); + + List findPage(); + + @SelectProvider(type = SysLogProvider.class,method = "findLogs") + @Results(value = { + @Result(property="createBy",column="create_by"), + @Result(property="createTime",column="create_time"), + @Result(property="ip",column="ip"), + @Result(property ="lastUpdateBy",column ="last_update_by"), + @Result(property="lastUpdateTime",column="last_update_time"), + @Result(property ="method",column ="method"), + @Result(property="operation",column="operation"), + @Result(property ="params",column ="params"), + @Result(property ="time",column ="time"), + @Result(property ="userName",column ="user_name"), + @Result(property ="loginTime",column ="login_time"), + @Result(property ="loginState",column ="login_state"), + @Result(property ="optDesc",column ="opt_desc") + }) + List findLogs(@Param("userName") String userName,@Param("page") int page,@Param("limit") int limit ); + + @SelectProvider(type = SysLogProvider.class,method = "findCount") + int findCount(@Param("userName") String userName,@Param("page") int page,@Param("limit") int limit ); + + //查询日志详情 + @Select("select * from sys_log where id=#{id}") + SysLog logInfo(@Param("id") int id); + + List findPageByUserName(@Param(value = "userName") String userName); + + @Select("select * from SysParam ") + SysParamEntity selectSysParam(); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/SysMenuMapper.java b/user-service/src/main/java/com/mh/user/mapper/SysMenuMapper.java new file mode 100644 index 0000000..a5f2530 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SysMenuMapper.java @@ -0,0 +1,35 @@ +package com.mh.user.mapper; + +import com.mh.user.model.SysMenu; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * author: ljf + * desc: 系统菜单Mapper + */ +public interface SysMenuMapper { + int deleteByPrimaryKey(Long id); + + int insert(SysMenu record); + + int insertSelective(SysMenu record); + + SysMenu selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysMenu record); + + int updateByPrimaryKey(SysMenu record); + + List findPage(); + + List findPageByName(@Param(value = "name") String name); + + List findAll(); + + List findByUserName(@Param(value = "userName") String userName); + + List findRoleMenus(@Param(value = "roleId") Long roleId); +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/mapper/SysRoleDeptMapper.java b/user-service/src/main/java/com/mh/user/mapper/SysRoleDeptMapper.java new file mode 100644 index 0000000..58495ad --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SysRoleDeptMapper.java @@ -0,0 +1,23 @@ +package com.mh.user.mapper; + +import com.mh.user.model.SysRoleDept; +import org.apache.ibatis.annotations.Mapper; + +/** + * author: ljf + * desc: 角色对应部门Mapper + */ +public interface SysRoleDeptMapper { + + int deleteByPrimaryKey(Long id); + + int insert(SysRoleDept record); + + int insertSelective(SysRoleDept record); + + SysRoleDept selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysRoleDept record); + + int updateByPrimaryKey(SysRoleDept record); +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/mapper/SysRoleMapper.java b/user-service/src/main/java/com/mh/user/mapper/SysRoleMapper.java new file mode 100644 index 0000000..53bff41 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SysRoleMapper.java @@ -0,0 +1,60 @@ +package com.mh.user.mapper; + +import com.mh.user.mapper.provider.SysRoleProvider; +import com.mh.user.mapper.provider.SysUserProvider; +import com.mh.user.model.SysRole; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * author: ljf + * desc: 系统角色Mapper + */ +@Mapper +public interface SysRoleMapper { + int deleteByPrimaryKey(Long id); + + int insert(SysRole record); + + int insertSelective(SysRole record); + + SysRole selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysRole record); + + int updateByPrimaryKey(SysRole record); + + List findPage(); + + List findAll(); + + List findPageByName(@Param(value = "roleName") String name); + + List findByName(@Param(value = "roleName") String name); + + @Results(id="rs",value = { + @Result(property="id",column="id"), + @Result(property="name",column="role_name"), + @Result(property="createBy",column="create_by"), + @Result(property="createTime",column="create_time"), + @Result(property ="lastUpdateBy",column ="last_update_by"), + @Result(property ="lastUpdateTime",column ="last_update_time"), + @Result(property="delFlag",column="del_flag"), + @Result(property="remarks",column="remarks") + }) + @Select("select * from sys_role where role_name=#{roleName}") + SysRole findId(@Param(value = "roleName") String name); + + //查询所有角色 + @ResultMap("rs") + @SelectProvider(type = SysRoleProvider.class,method = "queryRoles") + //@Select("select * from (select *,ROW_NUMBER() over(order by id) as rn from sys_role where 1=1 )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}") + List queryRoles(@Param("roleName") String roleName,@Param(value = "page") int page,@Param(value = "limit") int limit); + + //查询所有记录数 + //@Select("select count(*) from (select *,ROW_NUMBER() over(order by id) as rn from sys_role where 1=1)T ") + @SelectProvider(type = SysRoleProvider.class,method = "getCount") + int getCount(@Param("roleName") String roleName,@Param(value = "page") int page,@Param(value = "limit") int limit); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/SysRoleMenuMapper.java b/user-service/src/main/java/com/mh/user/mapper/SysRoleMenuMapper.java new file mode 100644 index 0000000..f515e13 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SysRoleMenuMapper.java @@ -0,0 +1,28 @@ +package com.mh.user.mapper; + +import com.mh.user.model.SysRoleMenu; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface SysRoleMenuMapper { + int deleteByPrimaryKey(Long id); + + int insert(SysRoleMenu record); + + int insertSelective(SysRoleMenu record); + + SysRoleMenu selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysRoleMenu record); + + int updateByPrimaryKey(SysRoleMenu record); + + List findRoleMenus(@Param(value = "roleId") Long roleId); + + List findAll(); + + int deleteByRoleId(@Param(value = "roleId") Long roleId); +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/mapper/SysUserMapper.java b/user-service/src/main/java/com/mh/user/mapper/SysUserMapper.java new file mode 100644 index 0000000..574c2d8 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SysUserMapper.java @@ -0,0 +1,72 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.DBEntity; +import com.mh.user.mapper.provider.AlarmInfoProvider; +import com.mh.user.mapper.provider.SysUserProvider; +import com.mh.user.model.SysRole; +import com.mh.user.model.SysUser; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * author: ljf + * desc: 系统用户Mapper + */ +@Mapper +public interface SysUserMapper { + + /** + * 根据用户名称查询数据库信息 + * @param userName + * @return + */ + @Select("select DB_Names,DB_UserName,DB_Pwd,DB_Port,DB_IP from sys_user S LEFT JOIN Tbl_Project P ON S.DBIds = P.ID where S.user_name=#{userName}") + DBEntity queryDBInfo(@Param("userName") String userName); + + int deleteByPrimaryKey(Long id); + + int insert(SysUser record); + + int insertSelective(SysUser record); + + SysUser selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysUser record); + + int updateByPrimaryKey(SysUser record); + + List findPage(); + + SysUser findByName(@Param(value = "userName") String name); + + List findPageByName(@Param(value = "userName") String name); + + List findPageByNameAndEmail(@Param(value = "userName") String name, @Param(value = "email") String email); + + @Results(value = { + @Result(property="id",column="id"), + @Result(property="userName",column="user_name"), + @Result(property="createBy",column="create_by"), + @Result(property="createTime",column="create_time"), + @Result(property ="loginTime",column ="login_time"), + @Result(property="roleNames",column="role_name") + }) + @SelectProvider(type = SysUserProvider.class,method = "queryUsers") + List queryUsers(@Param(value = "userName") String userName,@Param(value = "page") int page, @Param(value = "limit") int limit); + + //查询所有记录数 + @SelectProvider(type = SysUserProvider.class,method = "getCount") + int getCount(@Param(value = "userName") String userName,@Param(value = "page") int page,@Param(value = "limit") int limit); + + //根据id修改操作员密码 + @Update("update sys_user set password=#{password},salt=#{salt} where id=#{id}") + void updatePassword(@Param(value = "password") String password, + @Param(value = "salt") String salt, + @Param(value = "id") String id); + + //根据操作员名称修改登录日期 + @Update("update sys_user set login_time=getDate() where user_name=#{userName}") + void updateLoginTime(@Param(value = "userName") String userName); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/SysUserRoleMapper.java b/user-service/src/main/java/com/mh/user/mapper/SysUserRoleMapper.java new file mode 100644 index 0000000..608bc19 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SysUserRoleMapper.java @@ -0,0 +1,30 @@ +package com.mh.user.mapper; + +import com.mh.user.model.SysUserRole; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * author: ljf + * desc: 用户对应角色Mapper + */ +public interface SysUserRoleMapper { + + int deleteByPrimaryKey(Long id); + + int insert(SysUserRole record); + + int insertSelective(SysUserRole record); + + SysUserRole selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysUserRole record); + + int updateByPrimaryKey(SysUserRole record); + + List findUserRoles(@Param(value = "userId") Long userId); + + int deleteByUserId(@Param(value = "userId") Long userId); +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/mapper/UseForecastMapper.java b/user-service/src/main/java/com/mh/user/mapper/UseForecastMapper.java new file mode 100644 index 0000000..79f1974 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/UseForecastMapper.java @@ -0,0 +1,51 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.UseForecastEntity; +import com.mh.user.mapper.provider.UseForecastProvider; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface UseForecastMapper { + + //插入记录 + @Insert("insert into use_forecast(tank_id,tank_name,wt_level_set,wt_temp_set,tank_level,tank_temp,env_temp,start_datetime,building_id) values (" + + " #{tankId},#{tankName},#{wtLevelSet},#{wtTempSet},#{tankLevel},#{tankTemp},#{envTemp},#{startDatetime},#{buildingId})") + void saveUseForecast(UseForecastEntity useForecastEntity); + + //修改记录 + @Update("") + void updateUseForecast(UseForecastEntity useForecastEntity); + + // 查询 + @Results(value = { + @Result(property="tankId",column="tank_id"), + @Result(property="tankName",column="tank_name"), + @Result(property="wtLevelSet",column="wt_level_set"), + @Result(property ="wtTempSet",column ="wt_temp_set"), + @Result(property ="tankLevel",column ="tank_level"), + @Result(property="tankTemp",column="tank_temp"), + @Result(property="envTemp",column="env_temp"), + @Result(property="startDatetime",column="start_datetime"), + @Result(property="buildingId",column="building_id") + }) + @SelectProvider(type = UseForecastProvider.class,method = "queryUseForecast") + List queryUseForecast(@Param("buildingId") String buildingId, @Param("tankId") String tankId,@Param("curDate") String curDate, @Param("page") int page, @Param("limit") int limit); + + // 查询记录数 + @SelectProvider(type = UseForecastProvider.class,method = "getCount") + int getCount(@Param("buildingId") String buildingId,@Param("tankId") String tankId,@Param("curDate") String curDate,@Param("page") int page, @Param("limit") int limit); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/AlarmInfoProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/AlarmInfoProvider.java new file mode 100644 index 0000000..f0b369e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/AlarmInfoProvider.java @@ -0,0 +1,96 @@ +package com.mh.user.mapper.provider; + +public class AlarmInfoProvider { + + public String queryAlarmInfo(String alarmTime,String alarmType,String buildingId,String dealState, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from Alarm_info " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (alarmType != null && !alarmType.equals("")){ + sql.append(" AND alarm_type = #{alarmType} "); + } + if (alarmTime!= null && !alarmTime.equals("")) { + sql.append(" AND CONVERT(varchar(10),alarm_time,121)=#{alarmTime} "); + } + if (dealState!= null && !dealState.equals("")) { + sql.append(" AND deal_state=#{dealState} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.alarm_time desc "); + } else if (page == 0){ + sql.append(" ) T order by T.alarm_time desc "); + } + +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询记录数 + public String getAlarmInfoCount(String alarmTime,String alarmType,String buildingId,String dealState, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from Alarm_info " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (alarmType != null && !alarmType.equals("")){ + sql.append(" AND alarm_type = #{alarmType} "); + } + if (alarmTime!= null && !alarmTime.equals("")) { + sql.append(" AND CONVERT(varchar(10),alarm_time,121)=#{alarmTime} "); + } + if (dealState!= null && !dealState.equals("")) { + sql.append(" AND deal_state=#{dealState} "); + } + sql.append(" ) T join building T1 ON T.building_id=T1.id "); + +// System.out.println(sql.toString()); + return sql.toString(); + } + + public String queryAlarmValueSet(String buildingId,String itemType,int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from alarm_value_set " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (itemType != null && !itemType.equals("")){ + sql.append(" AND itemType = #{itemType} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } + +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询记录数 + public String getAlarmValueSetCount(String buildingId,String itemType){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from alarm_value_set " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (itemType != null && !itemType.equals("")){ + sql.append(" AND itemType = #{itemType} "); + } + sql.append(" ) T join building T1 ON T.building_id=T1.id "); + +// System.out.println(sql.toString()); + return sql.toString(); + } + + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/BuildingProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/BuildingProvider.java new file mode 100644 index 0000000..042d723 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/BuildingProvider.java @@ -0,0 +1,38 @@ +package com.mh.user.mapper.provider; + +public class BuildingProvider { + + public String queryBuilding(String buildingId, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from building " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND id = #{buildingId} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + public String getCount(String buildingId, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from building " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND id = #{buildingId} "); + } + sql.append(" ) T "); + +// System.out.println(sql.toString()); + return sql.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/DataResultProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/DataResultProvider.java new file mode 100644 index 0000000..6a73011 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/DataResultProvider.java @@ -0,0 +1,57 @@ +package com.mh.user.mapper.provider; + +public class DataResultProvider { + + public String queryDataResult(String buildingId,String startDate,String endDate,String deviceType, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by cur_date desc) as rn from data_result " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)>=#{startDate} "); + } + if (endDate!= null && !endDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)<=#{endDate} "); + } + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND device_type = #{deviceType} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date desc "); + } else if (page == 0){ + sql.append(" ) T order by T.cur_date desc "); + } + +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询记录数 + public String getDataResultCount(String buildingId,String startDate,String endDate,String deviceType, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by cur_date desc) as rn from data_result " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)>=#{startDate} "); + } + if (endDate!= null && !endDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)<=#{endDate} "); + } + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND device_type = #{deviceType} "); + } + sql.append(" ) T join building T1 ON T.building_id=T1.id "); + +// System.out.println(sql.toString()); + return sql.toString(); + } +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/DeviceFloorProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/DeviceFloorProvider.java new file mode 100644 index 0000000..383d049 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/DeviceFloorProvider.java @@ -0,0 +1,45 @@ +package com.mh.user.mapper.provider; + +public class DeviceFloorProvider { + + public String queryDeviceFloor(String buildingId,String deviceType, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from device_floor " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND device_type = #{deviceType} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } + +// System.out.println(sql.toString()); + return sql.toString(); + } + + public String getCount(String buildingId,String deviceType, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from device_floor " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND device_type = #{deviceType} "); + } + + sql.append(" ) T join building T1 ON T.building_id=T1.id "); + +// System.out.println(sql.toString()); + return sql.toString(); + } +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/DeviceInstallProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/DeviceInstallProvider.java new file mode 100644 index 0000000..75fe499 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/DeviceInstallProvider.java @@ -0,0 +1,97 @@ +package com.mh.user.mapper.provider; + +public class DeviceInstallProvider { + + public String queryDevice(String buildingId,String deviceType,String startDate,String endDate,String isOnline,String isUse,String isFault, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select top 1000 *,ROW_NUMBER() over(order by T.sort) as rn from (select top 1000 t1.*,t2.sort from device_install t1 " + + " join building t2 on t1.building_id=t2.id where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND t1.building_id = #{buildingId} "); + } + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND t1.device_type = #{deviceType} "); + } + if (startDate != null && endDate != null) { + sql.append(" AND CONVERT(varchar(10),t1.install_date,121)>=#{startDate} and CONVERT(varchar(10),t1.install_date,121)<=#{endDate} "); + } + else if (isOnline != null && !isOnline.equals("")){ + sql.append(" AND t1.is_online = #{isOnline} "); + } + if (isUse != null && !isUse.equals("")){ + sql.append(" AND t1.is_use = #{isUse} "); + } + if (isFault != null && !isFault.equals("")){ + sql.append(" AND t1.is_fault = #{isFault} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" order by t2.sort ) T )TT where TT.rn>(#{page}-1)*#{limit} and TT.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" order by t2.sort ) T )TT "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + public String getCount(String buildingId,String deviceType,String startDate,String endDate,String isOnline,String isUse,String isFault, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select top 1000 *,ROW_NUMBER() over(order by T.sort) as rn from (select top 1000 t1.*,t2.sort from device_install t1 " + + " join building t2 on t1.building_id=t2.id where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND t1.building_id = #{buildingId} "); + } + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND t1.device_type = #{deviceType} "); + } + if (startDate != null && endDate != null) { + sql.append(" AND CONVERT(varchar(10),t1.install_date,121)>=#{startDate} and CONVERT(varchar(10),t1.install_date,121)<=#{endDate} "); + } + else if (isOnline != null && !isOnline.equals("")){ + sql.append(" AND t1.is_online = #{isOnline} "); + } + if (isUse != null && !isUse.equals("")){ + sql.append(" AND t1.is_use = #{isUse} "); + } + if (isFault != null && !isFault.equals("")){ + sql.append(" AND t1.is_fault = #{isFault} "); + } + sql.append(" order by t2.sort ) T )TT "); +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询设备故障数 + public String getIsFaultCount(String isFault,String deviceType){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from device_install " + + " where 1=1 "); + if (isFault != null && !isFault.equals("")){ + sql.append(" AND is_fault = #{isFault} "); + } + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND device_type = #{deviceType} "); + } + +// System.out.println(sql.toString()); + return sql.toString(); + } + + public String getIsOnlineCount(String isOnline,String deviceType){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from device_install " + + " where 1=1 "); + if (isOnline != null && !isOnline.equals("")){ + sql.append(" AND is_online = #{isOnline} "); + } + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND device_type = #{deviceType} "); + } + +// System.out.println(sql.toString()); + return sql.toString(); + } +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/EnergyProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/EnergyProvider.java new file mode 100644 index 0000000..9e52252 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/EnergyProvider.java @@ -0,0 +1,352 @@ +package com.mh.user.mapper.provider; + +public class EnergyProvider { + + //按天 + public String queryEnergyDay(String buildingId,String startDate,String endDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by cur_date desc) as rn from energy_day " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)>=#{startDate} "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)<=#{endDate} "); + } + if(buildingId.equals("所有")){ + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date desc"); + } else if (page == 0){ + sql.append(" )T order by T.cur_date desc"); + } + }else{ + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date desc "); + } else if (page == 0){ + sql.append(" )T order by T.cur_date desc "); + } + } + System.out.println(sql.toString()); + return sql.toString(); + } + + //按月 + public String queryEnergyMonth(String buildingId,String startDate,String endDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by cur_date desc) as rn from energy_Month " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,7)>=#{startDate} "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,7)<=#{endDate} "); + } + + if(buildingId.equals("所有")){ + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date desc"); + } else if (page == 0){ + sql.append(" )T order by T.cur_date desc "); + } + }else{ + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date desc "); + } else if (page == 0){ + sql.append(" )T order by T.cur_date desc "); + } + } + System.out.println(sql.toString()); + return sql.toString(); + } + + //按年 + public String queryEnergyYear(String buildingId,String startDate,String endDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by cur_date desc) as rn from energy_year " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,4)>=#{startDate} "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,4)<=#{endDate} "); + } + if(buildingId.equals("所有")){ + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date desc "); + } else if (page == 0){ + sql.append(" )T order by T.cur_date desc "); + } + }else{ + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date desc "); + } else if (page == 0){ + sql.append(" )T order by T.cur_date desc "); + } + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询记录数 + //按天 + public String getEnergyDayCount(String buildingId,String startDate,String endDate,int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by cur_date desc) as rn from energy_day " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)>=#{startDate} "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)<=#{endDate} "); + } + if(buildingId.equals("所有")){ + sql.append(" ) T "); + }else{ + sql.append(" ) T "); + } + +// if ((page != 0) && (limit != 0)){ +// sql.append(" ) T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); +// } else if (page == 0){ +// sql.append(" ) T "); +// } + +// System.out.println(sql.toString()); + return sql.toString(); + } + + //按月 + public String getEnergyMonthCount(String buildingId,String startDate,String endDate,int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by cur_date desc) as rn from energy_month " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,7)>=#{startDate} "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,7)<=#{endDate} "); + } + if(buildingId.equals("所有")){ + sql.append(" ) T "); + }else{ + sql.append(" ) T "); + } +// if ((page != 0) && (limit != 0)){ +// sql.append(" ) T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); +// } else if (page == 0){ +// sql.append(" ) T "); +// } + +// System.out.println(sql.toString()); + return sql.toString(); + } + + //按年 + public String getEnergyYearCount(String buildingId,String startDate,String endDate,int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by cur_date desc) as rn from energy_year " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,4)>=#{startDate} "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,4)<=#{endDate} "); + } + + if(buildingId.equals("所有")){ + sql.append(" ) T "); + }else{ + sql.append(" ) T "); + } +// if ((page != 0) && (limit != 0)){ +// sql.append(" ) T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); +// } else if (page == 0){ +// sql.append(" ) T "); +// } + +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询每天的用量 + public String queryDayEnergy(String buildingId,String startDate,String endDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by cur_date desc) as rn from energy_day " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)>=#{startDate} "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)<=#{endDate} "); + } + if (buildingId.equals("所有")){ + if ((page != 0) && (limit != 0)){ + sql.append(" ) T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date asc "); + } else if (page == 0){ + sql.append(" ) T order by T.cur_date asc "); + } + }else { + if ((page != 0) && (limit != 0)){ + sql.append(" ) T join where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date asc "); + } else if (page == 0){ + sql.append(" ) T order by T.cur_date asc "); + } + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询每天的用量 + public String getDayEnergyCount(String buildingId,String startDate,String endDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by cur_date desc) as rn from energy_day " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)>=#{startDate} "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)<=#{endDate} "); + } + if (buildingId.equals("所有")){ + sql.append(" ) T "); + }else { + sql.append(" ) T "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询每小时用量和能耗 + public String queryHourEnergy(String buildingId,String curDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_hour " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + + if (curDate != null && !curDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)=#{curDate} "); + } + if(buildingId.equals("所有")){ + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date asc"); + } else if (page == 0){ + sql.append(" )T order by T.cur_date asc"); + } + }else{ + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date asc "); + } else if (page == 0){ + sql.append(" )T order by T.cur_date asc "); + } + } + +// System.out.println(sql.toString()); + return sql.toString(); + } + + //小时用量数 + public String getHourEnergyCount(String buildingId,String curDate){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_hour " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if (curDate != null && !curDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)=#{curDate} "); + } + if(buildingId.equals("所有")){ + sql.append(" ) T "); + }else{ + sql.append(" ) T "); + } + +// System.out.println(sql.toString()); + return sql.toString(); + } + + public String queryEnergyBuilding(int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by cur_date desc) as rn from energy_building " + + " where 1=1 "); + if ((page != 0) && (limit != 0)){ + sql.append(" )T left join area T1 ON T.building_id=T1.area_id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date desc,T1.sort "); +// sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date desc,T.building_id "); + } else if (page == 0){ + sql.append(" )T left join area T1 ON T.building_id=T1.area_id order by T.cur_date desc,T1.sort "); +// sql.append(" )T order by T.cur_date desc,T.building_id "); + } + +// System.out.println(sql.toString()); + return sql.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/MaintainInfoProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/MaintainInfoProvider.java new file mode 100644 index 0000000..f2612e9 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/MaintainInfoProvider.java @@ -0,0 +1,52 @@ +package com.mh.user.mapper.provider; + +public class MaintainInfoProvider { + + public String queryMaintainInfo(String curDate,String buildingId,String deviceType, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from maintain_info " + + " where 1=1 "); + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND device_type = #{deviceType} "); + } + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)=#{curDate} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } + +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询记录数 + public String getMaintainInfoCount(String curDate,String buildingId,String deviceType,int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from maintain_info " + + " where 1=1 "); + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND device_type = #{deviceType} "); + } + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (curDate != null && !curDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)=#{curDate} "); + } + sql.append(" ) T join building T1 ON T.building_id=T1.id "); + +// System.out.println(sql.toString()); + return sql.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/NowDataProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/NowDataProvider.java new file mode 100644 index 0000000..1a6e850 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/NowDataProvider.java @@ -0,0 +1,412 @@ +package com.mh.user.mapper.provider; + +public class NowDataProvider { + + //查询楼栋水箱温度 + public String queryHistoryData(String curDate,String buildingId,String pumpId,String tankId, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from history_data " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (pumpId != null && !pumpId.equals("")){ + sql.append(" AND pump_id = #{pumpId} "); + } + if (tankId != null && !tankId.equals("")){ + sql.append(" AND tank_id = #{tankId} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)=#{curDate} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询楼栋水箱温度记录数 + public String getHistoryDataCount(String curDate,String buildingId,String pumpId,String tankId, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from history_data " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (pumpId != null && !pumpId.equals("")){ + sql.append(" AND pump_id = #{pumpId} "); + } + if (tankId != null && !tankId.equals("")){ + sql.append(" AND tank_id = #{tankId} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)=#{curDate} "); + } + sql.append(" ) T join building T1 ON T.building_id=T1.id "); +// System.out.println(sql.toString()); + return sql.toString(); + } + + //从history_data表查询水位,改为从waterLevel表拿数据 + public String queryWaterLevel(String curDate,String buildingID, int page, int limit){ +// StringBuffer sql = new StringBuffer(""); +// sql.append("select * from (select *,ROW_NUMBER() over(order by cur_date) as rn from (" + +// " select DISTINCT t1.building_id,t1.cur_date,t1.water_level,t2.building_name from history_data t1 join building t2 on t1.building_id=t2.id " + +// " where 1=1 "); +// if (buildingID != null && !buildingID.equals("")){ +// sql.append(" AND t1.building_id = #{buildingID} "); +// } +// if (curDate!= null && !curDate.equals("")) { +// sql.append(" AND convert(varchar(10),t1.cur_date,121)=#{curDate} "); +// } +// if ((page != 0) && (limit != 0)){ +// sql.append(" ) T )TT where TT.rn>(#{page}-1)*#{limit} and TT.rn<=#{page}*#{limit} order by TT.cur_date "); +// } else if (page == 0){ +// sql.append(" ) T )TT order by TT.cur_date "); +// } + StringBuffer sql = new StringBuffer(""); + sql.append("select T.* from (select *,ROW_NUMBER() over(order by cur_date) as rn from waterLevel" + + " where 1=1 "); + if (buildingID != null && !buildingID.equals("")){ + sql.append(" AND building_id = #{buildingID} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)=left(#{curDate},10) "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T join building t1 on T.building_id=t1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date,t1.sort "); + } else if (page == 0){ + sql.append(" ) T join building t1 on T.building_id=t1.id order by T.cur_date,t1.sort "); + } +//// System.out.println(sql.toString()); + return sql.toString(); + } + + //从history_data表查询水位记录数,改为从waterLevel表拿数据 + public String getWaterLevelCount(String curDate,String buildingID){ +// StringBuffer sql = new StringBuffer(""); +// sql.append("select count(*) from (select *,ROW_NUMBER() over(order by cur_date) as rn from (" + +// " select DISTINCT t1.building_id,t1.cur_date,t1.water_level,t2.building_name from history_data t1 join building t2 on t1.building_id=t2.id " + +// " where 1=1 "); +// if (buildingID != null && !buildingID.equals("")){ +// sql.append(" AND t1.building_id = #{buildingID} "); +// } +// if (curDate!= null && !curDate.equals("")) { +// sql.append(" AND convert(varchar(10),t1.cur_date,121)=#{curDate} "); +// } +// sql.append(" ) T )TT "); + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (select *,ROW_NUMBER() over(order by cur_date) as rn from waterLevel" + + " where 1=1 "); + if (buildingID != null && !buildingID.equals("")){ + sql.append(" AND building_id = #{buildingID} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)=left(#{curDate},10) "); + } + sql.append(" ) T join building t1 on T.building_id=t1.id "); +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询每天楼栋水位变化 + public String queryBuildWaterLevel(String curDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (select top 1000 * ,ROW_NUMBER() over(order by cur_date desc) as rn from (select top 1000 t1.*,t2.sort " + + " from waterLevel t1 join building t2 on t1.building_id=t2.id order by t1.cur_date desc,t2.sort) t3 where 1=1 "); + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND convert(varchar(10),t3.cur_date,121)=left(#{curDate},10) "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) t4 where t4.rn>(#{page}-1)*#{limit} and t4.rn<=#{page}*#{limit} "); + } else if (page == 0){ + sql.append(" ) t4 "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //从history_data查询水温 + public String queryWaterTemp(String buildingID,String curDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (select *,ROW_NUMBER() over(order by cur_date) as rn from (" + + "select t1.*,t2.building_name from WaterTemp t1 join building t2 on t1.building_id=t2.id "+ + " where 1=1 "); + if (buildingID != null && !buildingID.equals("")){ + sql.append(" AND t1.building_id= #{buildingID} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND convert(varchar(10),t1.cur_date,121)=#{curDate} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" )T )TT where TT.rn>(#{page}-1)*#{limit} and TT.rn<=#{page}*#{limit} order by TT.pump_id "); + } else if (page == 0){ + sql.append(" )T )TT order by TT.pump_id "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //从history_data查询水温记录数 + public String queryWaterTempCount(String buildingID,String curDate){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (select *,ROW_NUMBER() over(order by cur_date) as rn from (" + + "select t1.*,t2.building_name from WaterTemp t1 join building t2 on t1.building_id=t2.id "+ + " where 1=1 "); + if (buildingID != null && !buildingID.equals("")){ + sql.append(" AND t1.building_id= #{buildingID} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND convert(varchar(10),t1.cur_date,121)=#{curDate} "); + } + sql.append(" ) T )TT "); +// System.out.println(sql.toString()); + return sql.toString(); + } + + public String queryWaterTemp2(String curDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select top 1000 * from (select *,ROW_NUMBER() over(order by cur_date) as rn from (" + + "select top 1000 t1.cur_date,t1.building_id,t2.building_name,t2.sort,convert(decimal(8,1),AVG(convert(float,t1.temp00)))as temp00," + + "convert(decimal(8,1),AVG(convert(float,t1.temp08)))as temp08,convert(decimal(8,1),AVG(convert(float,t1.temp11)))as temp11," + + "convert(decimal(8,1),AVG(convert(float,t1.temp13)))as temp13,convert(decimal(8,1),AVG(convert(float,t1.temp15)))as temp15," + + "convert(decimal(8,1),AVG(convert(float,t1.temp16)))as temp16,convert(decimal(8,1),AVG(convert(float,t1.temp17)))as temp17," + + "convert(decimal(8,1),AVG(convert(float,t1.temp18)))as temp18,convert(decimal(8,1),AVG(convert(float,t1.temp19)))as temp19," + + "convert(decimal(8,1),AVG(convert(float,t1.temp20)))as temp20,convert(decimal(8,1),AVG(convert(float,t1.temp21)))as temp21," + + "convert(decimal(8,1),AVG(convert(float,t1.temp22)))as temp22,convert(decimal(8,1),AVG(convert(float,t1.temp23)))as temp23 " + + " from WaterTemp t1 join building t2 on t1.building_id=t2.id where 1=1 "); + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND convert(varchar(10),t1.cur_date,121)=#{curDate} group by t1.building_id,t2.building_name,t2.sort,t1.cur_date order by t2.sort "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" )T )TT where TT.rn>(#{page}-1)*#{limit} and TT.rn<=#{page}*#{limit} order by TT.cur_date desc "); + } else if (page == 0){ + sql.append(" )T )TT order by TT.cur_date desc "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //从history_data查询水温记录数 + public String queryWaterTempCount2(String curDate){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (select *,ROW_NUMBER() over(order by cur_date) as rn from (" + + "select t1.cur_date,t1.building_id,t2.building_name,t2.sort,convert(decimal(8,1),AVG(convert(float,t1.temp00)))as temp00," + + "convert(decimal(8,1),AVG(convert(float,t1.temp08)))as temp08,convert(decimal(8,1),AVG(convert(float,t1.temp11)))as temp11," + + "convert(decimal(8,1),AVG(convert(float,t1.temp13)))as temp13,convert(decimal(8,1),AVG(convert(float,t1.temp15)))as temp15," + + "convert(decimal(8,1),AVG(convert(float,t1.temp16)))as temp16,convert(decimal(8,1),AVG(convert(float,t1.temp17)))as temp17," + + "convert(decimal(8,1),AVG(convert(float,t1.temp18)))as temp18,convert(decimal(8,1),AVG(convert(float,t1.temp19)))as temp19," + + "convert(decimal(8,1),AVG(convert(float,t1.temp20)))as temp20,convert(decimal(8,1),AVG(convert(float,t1.temp21)))as temp21," + + "convert(decimal(8,1),AVG(convert(float,t1.temp22)))as temp22,convert(decimal(8,1),AVG(convert(float,t1.temp23)))as temp23 " + + " from WaterTemp t1 join building t2 on t1.building_id=t2.id where 1=1 "); + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND convert(varchar(10),t1.cur_date,121)=#{curDate} group by t1.building_id,t2.building_name,t2.sort,t1.cur_date "); + } + sql.append(" )T )TT "); +// System.out.println(sql.toString()); + return sql.toString(); + } + + //从history_data表按时间点查询水位 + public String queryWaterLevelByTime(String curDate, int page, int limit){ +// StringBuffer sql = new StringBuffer(""); +// sql.append("select * from (select *,ROW_NUMBER() over(order by cur_date) as rn from history_data " + +// " where 1=1 "); +// if (curDate!= null && !curDate.equals("")) { +// sql.append(" AND convert(varchar(13),cur_date,121)=#{curDate} "); +// } +// if ((page != 0) && (limit != 0)){ +// sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); +// } else if (page == 0){ +// sql.append(" )T order by T.cur_date "); +// } +// System.out.println(sql.toString()); +// return sql.toString(); + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (select *,ROW_NUMBER() over(order by cur_date) as rn from (" + + " select DISTINCT t1.building_id,t1.cur_date,t1.water_level,t2.building_name from history_data t1 join building t2 on t1.building_id=t2.id " + + " where 1=1 "); + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND convert(varchar(13),t1.cur_date,121)=#{curDate} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T )TT where TT.rn>(#{page}-1)*#{limit} and TT.rn<=#{page}*#{limit} order by TT.cur_date "); + } else if (page == 0){ + sql.append(" ) T )TT order by TT.cur_date "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //从history_data表按时间点查询水位记录数 + public String waterLevelByTimeCount(String curDate){ + StringBuffer sql = new StringBuffer(""); +// sql.append("select count(*) from (select *,ROW_NUMBER() over(order by cur_date) as rn from history_data" + +// " where 1=1 "); +// if (curDate!= null && !curDate.equals("")) { +// sql.append(" AND convert(varchar(13),cur_date,121)=#{curDate} "); +// } +// sql.append(" )T "); +// System.out.println(sql.toString()); +// return sql.toString(); + sql.append("select count(*) from (select *,ROW_NUMBER() over(order by cur_date) as rn from (" + + " select DISTINCT t1.building_id,t1.cur_date,t1.water_level,t2.building_name from history_data t1 join building t2 on t1.building_id=t2.id " + + " where 1=1 "); + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND convert(varchar(13),t1.cur_date,121)=#{curDate} "); + } + sql.append(" ) T )TT "); +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询热泵时长记录 + public String pumpMinutes(String startDate,String endDate,String buildingId,String pumpId,int page,int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (select *,ROW_NUMBER() over(order by cur_date) as rn from pump_minutes " + + " where 1=1 "); + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)>=#{startDate} "); + } + if (endDate!= null && !endDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)<=#{endDate} "); + } + if (buildingId!= null && !buildingId.equals("")) { + sql.append(" AND building_id=#{buildingId} "); + } + if (pumpId!= null && !pumpId.equals("")) { + sql.append(" AND pump_id=#{pumpId} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T order by T.cur_date "); + } + System.out.println(sql.toString()); + return sql.toString(); + } + + //查询热泵时长记录 + public String pumpMinutesCount(String startDate,String endDate,String buildingId,String pumpId){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (select *,ROW_NUMBER() over(order by cur_date) as rn from pump_minutes " + + " where 1=1 "); + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)>=#{startDate} "); + } + if (endDate!= null && !endDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)<=#{endDate} "); + } + if (buildingId!= null && !buildingId.equals("")) { + sql.append(" AND building_id=#{buildingId} "); + } + if (pumpId!= null && !pumpId.equals("")) { + sql.append(" AND pump_id=#{pumpId} "); + } + sql.append(" )T"); + //System.out.println(sql.toString()); + return sql.toString(); + } + + //查询热泵时长记录 + public String pumpWeekMinutes(String startDate,String endDate,String buildingId,String pumpId,int page,int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (select *,ROW_NUMBER() over(order by cur_date) as rn from pump_week_minutes " + + " where 1=1 "); + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND cur_date>=#{startDate} "); + } + if (endDate!= null && !endDate.equals("")) { + sql.append(" AND cur_date<=#{endDate} "); + } + if (buildingId!= null && !buildingId.equals("")) { + sql.append(" AND building_id=#{buildingId} "); + } + if (pumpId!= null && !pumpId.equals("")) { + sql.append(" AND pump_id=#{pumpId} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T order by T.cur_date "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询热泵时长记录 + public String pumpWeekMinutesCount(String startDate,String endDate,String buildingId,String pumpId){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (select *,ROW_NUMBER() over(order by cur_date) as rn from pump_week_minutes " + + " where 1=1 "); + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)>=#{startDate} "); + } + if (endDate!= null && !endDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)<=#{endDate} "); + } + if (buildingId!= null && !buildingId.equals("")) { + sql.append(" AND building_id=#{buildingId} "); + } + if (pumpId!= null && !pumpId.equals("")) { + sql.append(" AND pump_id=#{pumpId} "); + } + sql.append(" )T"); +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询热泵时长记录 + public String pumpMonthMinutes(String startDate,String endDate,String buildingId,String pumpId,int page,int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (select *,ROW_NUMBER() over(order by cur_date) as rn from pump_month_minutes " + + " where 1=1 "); + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND cur_date>=#{startDate} "); + } + if (endDate!= null && !endDate.equals("")) { + sql.append(" AND cur_date<=#{endDate} "); + } + if (buildingId!= null && !buildingId.equals("")) { + sql.append(" AND building_id=#{buildingId} "); + } + if (pumpId!= null && !pumpId.equals("")) { + sql.append(" AND pump_id=#{pumpId} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T order by T.cur_date "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询热泵时长记录 + public String pumpMonthMinutesCount(String startDate,String endDate,String buildingId,String pumpId){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (select *,ROW_NUMBER() over(order by cur_date) as rn from pump_month_minutes " + + " where 1=1 "); + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND cur_date>=#{startDate} "); + } + if (endDate!= null && !endDate.equals("")) { + sql.append(" AND cur_date<=#{endDate} "); + } + if (buildingId!= null && !buildingId.equals("")) { + sql.append(" AND building_id=#{buildingId} "); + } + if (pumpId!= null && !pumpId.equals("")) { + sql.append(" AND pump_id=#{pumpId} "); + } + sql.append(" )T"); +// System.out.println(sql.toString()); + return sql.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/NowPublicDataProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/NowPublicDataProvider.java new file mode 100644 index 0000000..14af6ae --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/NowPublicDataProvider.java @@ -0,0 +1,44 @@ +package com.mh.user.mapper.provider; + +public class NowPublicDataProvider { + + public String queryHistoryPublicData(String curDate,String buildingId, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from history_public_data " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)=#{curDate} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } + +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询记录数 + public String getHistoryPublicDataCount(String curDate,String buildingId, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from history_public_data " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)=#{curDate} "); + } + + sql.append(" ) T join building T1 ON T.building_id=T1.id "); + +// System.out.println(sql.toString()); + return sql.toString(); + } +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/SysLogProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/SysLogProvider.java new file mode 100644 index 0000000..e3f12af --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/SysLogProvider.java @@ -0,0 +1,37 @@ +package com.mh.user.mapper.provider; + +public class SysLogProvider { + + public String findLogs(String userName, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from sys_log " + + " where 1=1 "); + if (userName != null && !userName.equals("")){ + sql.append(" AND user_name = #{userName} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询记录数 + public String findCount(String userName, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from sys_log " + + " where 1=1 "); + if (userName != null && !userName.equals("")){ + sql.append(" AND user_name = #{userName} "); + } + + sql.append(" ) T "); + +// System.out.println(sql.toString()); + return sql.toString(); + } +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/SysRoleProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/SysRoleProvider.java new file mode 100644 index 0000000..ce67580 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/SysRoleProvider.java @@ -0,0 +1,33 @@ +package com.mh.user.mapper.provider; + +public class SysRoleProvider { + public String queryRoles(String roleName, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (select *,ROW_NUMBER() over(order by id) as rn from sys_role where 1=1 "); + if (roleName != null && !roleName.equals("")){ + sql.append(" AND role_name = #{roleName} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + public String getCount(String roleName, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (select *,ROW_NUMBER() over(order by id) as rn from sys_role where 1=1 "); + if (roleName != null && !roleName.equals("")){ + sql.append(" AND role_name = #{roleName} "); + } + sql.append(" ) T "); + +// System.out.println(sql.toString()); + return sql.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/SysUserProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/SysUserProvider.java new file mode 100644 index 0000000..a424551 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/SysUserProvider.java @@ -0,0 +1,38 @@ +package com.mh.user.mapper.provider; + +public class SysUserProvider { + + public String queryUsers(String userName, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from (select t1.*,t3.role_name from sys_user t1 " + + " left join sys_user_role t2 on t1.id=t2.user_id left join sys_role t3 on t2.role_id=t3.id)T where 1=1 "); + if (userName != null && !userName.equals("")){ + sql.append(" AND T.user_name = #{userName} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) TT where TT.rn>(#{page}-1)*#{limit} and TT.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) TT "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + public String getCount(String userName, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from (select t1.*,t3.role_name from sys_user t1 " + + " left join sys_user_role t2 on t1.id=t2.user_id left join sys_role t3 on t2.role_id=t3.id)T where 1=1 "); + if (userName != null && !userName.equals("")){ + sql.append(" AND T.user_name = #{userName} "); + } + sql.append(" ) TT "); + +// System.out.println(sql.toString()); + return sql.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/UseForecastProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/UseForecastProvider.java new file mode 100644 index 0000000..fa20de9 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/UseForecastProvider.java @@ -0,0 +1,48 @@ +package com.mh.user.mapper.provider; + +public class UseForecastProvider { + + public String queryUseForecast(String buildingId,String tankId,String curDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from use_forecast " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (tankId != null && !tankId.equals("")){ + sql.append(" AND tank_id = #{tankId} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)=#{curDate} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询记录数 + public String getCount(String buildingId,String tankId,String curDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from use_forecast " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (tankId != null && !tankId.equals("")){ + sql.append(" AND tank_id = #{tankId} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)=#{curDate} "); + } + sql.append(" ) T join building T1 ON T.building_id=T1.id "); + +// System.out.println(sql.toString()); + return sql.toString(); + } +} diff --git a/user-service/src/main/java/com/mh/user/model/BaseModel.java b/user-service/src/main/java/com/mh/user/model/BaseModel.java new file mode 100644 index 0000000..536735c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/BaseModel.java @@ -0,0 +1,37 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +/** + * 基础模型 + * @author ljf + * @date 2020-04-25 + */ +@Setter +@Getter +public class BaseModel { + + private Long id; + + private String createBy; + + private Date createTime; + + private String lastUpdateBy; + + private Date lastUpdateTime; + + @Override + public String toString() { + return "BaseModel{" + + "id=" + id + + ", createBy='" + createBy + '\'' + + ", createTime=" + createTime + + ", lastUpdateBy='" + lastUpdateBy + '\'' + + ", lastUpdateTime=" + lastUpdateTime + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/model/BuildingModel.java b/user-service/src/main/java/com/mh/user/model/BuildingModel.java new file mode 100644 index 0000000..99b8912 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/BuildingModel.java @@ -0,0 +1,10 @@ +package com.mh.user.model; + +import lombok.Data; + +@Data +public class BuildingModel { + + private Long buildingId; + private String buildingName; +} diff --git a/user-service/src/main/java/com/mh/user/model/DeviceModel.java b/user-service/src/main/java/com/mh/user/model/DeviceModel.java new file mode 100644 index 0000000..3fa4efd --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/DeviceModel.java @@ -0,0 +1,12 @@ +package com.mh.user.model; + +import lombok.Data; + +@Data +public class DeviceModel { + + private long id;//号 + private String deviceAddr;//通讯号 + private String deviceName;//设备名称 + +} diff --git a/user-service/src/main/java/com/mh/user/model/DeviceTypeModel.java b/user-service/src/main/java/com/mh/user/model/DeviceTypeModel.java new file mode 100644 index 0000000..bf403da --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/DeviceTypeModel.java @@ -0,0 +1,9 @@ +package com.mh.user.model; + +import lombok.Data; + +@Data +public class DeviceTypeModel { + private String code; + private String des; +} diff --git a/user-service/src/main/java/com/mh/user/model/OrderParamModel.java b/user-service/src/main/java/com/mh/user/model/OrderParamModel.java new file mode 100644 index 0000000..d09f8cc --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/OrderParamModel.java @@ -0,0 +1,17 @@ +package com.mh.user.model; + +import lombok.Data; + +@Data +public class OrderParamModel { + + private String comName; //串口 + private String deviceAddr; //通讯地址 + private String deviceType; //设备类型 + private int baudrate; //波特率 + private String brand; //品牌 + private String funCode; //功能码 + private String registerAddr; //寄存器地址 + private String dataValue; //传入值 + +} diff --git a/user-service/src/main/java/com/mh/user/model/PumpModel.java b/user-service/src/main/java/com/mh/user/model/PumpModel.java new file mode 100644 index 0000000..fb90b43 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/PumpModel.java @@ -0,0 +1,9 @@ +package com.mh.user.model; + +import lombok.Data; + +@Data +public class PumpModel { + private String pumpId; + private String pumpName; +} diff --git a/user-service/src/main/java/com/mh/user/model/SerialPortModel.java b/user-service/src/main/java/com/mh/user/model/SerialPortModel.java new file mode 100644 index 0000000..ada73c2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SerialPortModel.java @@ -0,0 +1,13 @@ +package com.mh.user.model; + +import lombok.Data; + +@Data +public class SerialPortModel { + + private String buildingId; + private String deviceAddr; + private String deviceType; + private String param; + private String dataValue; +} diff --git a/user-service/src/main/java/com/mh/user/model/SumModel.java b/user-service/src/main/java/com/mh/user/model/SumModel.java new file mode 100644 index 0000000..a5bd7d6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SumModel.java @@ -0,0 +1,10 @@ +package com.mh.user.model; + +import lombok.Data; + +@Data +public class SumModel { + + private Double sumWater; + private Double sumElect; +} diff --git a/user-service/src/main/java/com/mh/user/model/SysDept.java b/user-service/src/main/java/com/mh/user/model/SysDept.java new file mode 100644 index 0000000..744760c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysDept.java @@ -0,0 +1,27 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Setter +@Getter +public class SysDept extends BaseModel { + + private String name; + + private Long parentId; + + private Integer orderNum; + + private Byte delFlag; + + private List children; + + // 非数据库字段 + private String parentName; + // 非数据库字段 + private Integer level; + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/model/SysDict.java b/user-service/src/main/java/com/mh/user/model/SysDict.java new file mode 100644 index 0000000..a99cbd6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysDict.java @@ -0,0 +1,24 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class SysDict extends BaseModel { + + private String value; + + private String label; + + private String type; + + private String description; + + private Long sort; + + private String remarks; + + private Byte delFlag; + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/model/SysLog.java b/user-service/src/main/java/com/mh/user/model/SysLog.java new file mode 100644 index 0000000..20bfb67 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysLog.java @@ -0,0 +1,22 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Setter +@Getter +public class SysLog extends BaseModel { + + private String userName; + private String operation; + private String method; + private String params; + private Long time; + private String ip; + private Date loginTime; + private String loginState; + private String optDesc; + +} diff --git a/user-service/src/main/java/com/mh/user/model/SysMenu.java b/user-service/src/main/java/com/mh/user/model/SysMenu.java new file mode 100644 index 0000000..7ebc2e8 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysMenu.java @@ -0,0 +1,35 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Setter +@Getter +public class SysMenu extends BaseModel { + + private Long parentId; + + private String menuName; + + private String url; + + private String perms; + + private Integer menuType; + + private String icon; + + private Integer orderNum; + + private Byte delFlag; + + // 非数据库字段 + private String parentName; + // 非数据库字段 + private Integer level; + // 非数据库字段 + private List children; + +} diff --git a/user-service/src/main/java/com/mh/user/model/SysRole.java b/user-service/src/main/java/com/mh/user/model/SysRole.java new file mode 100644 index 0000000..4fdaf82 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysRole.java @@ -0,0 +1,16 @@ +package com.mh.user.model; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +@Data +public class SysRole extends BaseModel { + + private String name; + + private String remark; + + private Byte delFlag; + +} diff --git a/user-service/src/main/java/com/mh/user/model/SysRoleDept.java b/user-service/src/main/java/com/mh/user/model/SysRoleDept.java new file mode 100644 index 0000000..a54db5d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysRoleDept.java @@ -0,0 +1,14 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class SysRoleDept extends BaseModel { + + private Long roleId; + + private Long deptId; + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/model/SysRoleMenu.java b/user-service/src/main/java/com/mh/user/model/SysRoleMenu.java new file mode 100644 index 0000000..c33b0e2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysRoleMenu.java @@ -0,0 +1,14 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class SysRoleMenu extends BaseModel { + + private Long roleId; + + private Long menuId; + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/model/SysUser.java b/user-service/src/main/java/com/mh/user/model/SysUser.java new file mode 100644 index 0000000..02aec11 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysUser.java @@ -0,0 +1,39 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Setter +@Getter +public class SysUser extends BaseModel { + + private String userName; + + private String password; + + private String salt; + + private String email; + + private String mobile; + + private Byte status; + + private Long deptId; + + private String deptName; + + private Byte delFlag; + + private String roleNames; + + private Date loginTime; + + private List userRoles = new ArrayList<>(); + + +} diff --git a/user-service/src/main/java/com/mh/user/model/SysUserRole.java b/user-service/src/main/java/com/mh/user/model/SysUserRole.java new file mode 100644 index 0000000..f40eaa4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysUserRole.java @@ -0,0 +1,14 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class SysUserRole extends BaseModel { + + private Long userId; + + private Long roleId; + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/model/TempModel.java b/user-service/src/main/java/com/mh/user/model/TempModel.java new file mode 100644 index 0000000..03f00cd --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/TempModel.java @@ -0,0 +1,12 @@ +package com.mh.user.model; + +import lombok.Data; + +@Data +public class TempModel { + + private String buildingId; + private String buildingName; + private String avgTemp; + private String singleTemp; +} diff --git a/user-service/src/main/java/com/mh/user/model/WaterLevelModel.java b/user-service/src/main/java/com/mh/user/model/WaterLevelModel.java new file mode 100644 index 0000000..2b4a25d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/WaterLevelModel.java @@ -0,0 +1,15 @@ +package com.mh.user.model; + +import lombok.Data; + +import java.util.Date; + +@Data +public class WaterLevelModel { + + private Date curDate; + private String buildingID; + private String buildingName; + private String waterLevel; + +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyChillerControlClient.java b/user-service/src/main/java/com/mh/user/netty/NettyChillerControlClient.java new file mode 100644 index 0000000..e266f9f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyChillerControlClient.java @@ -0,0 +1,98 @@ +package com.mh.user.netty; + +import com.mh.user.entity.OrderMessageEntity; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.timeout.IdleStateHandler; +import io.netty.handler.timeout.ReadTimeoutHandler; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @author ljf + * @title : + * @description : 控制冷水机组和其他设备 + * @updateTime 2020-05-28 + * @throws : + */ +@Setter +@Getter +@Slf4j +public class NettyChillerControlClient { + +// private int port; +// private String host; +// private List orderMessageEntityList; + + // 构造函数传递值 继承Thread时需要 +// public NettyChillerControlClient(int port, String host) { +// this.port = port; +// this.host = host; +// } + + public void connect(int port, String host, List orderMessageEntityList) throws InterruptedException { + // 配置客户端NIO线程组 + EventLoopGroup group = new NioEventLoopGroup(1); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(group).channel(NioSocketChannel.class) + .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000) + .option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(1024*1024)) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { + // 基于换行符号 +// socketChannel.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,4,4,-8,0)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringDecoder(StandardCharsets.UTF_8)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringEncoder(StandardCharsets.UTF_8)); +// socketChannel.pipeline().addLast(new LengthFieldPrepender(4)); + // 超过10秒钟没有数据读取自动断开连接 +// socketChannel.pipeline().addLast(new ReadTimeoutHandler(30)); + // 超过10秒没有返回触发心跳机制 update by ljf on 2021-01-30 + socketChannel.pipeline().addLast(new IdleStateHandler(10,10,6, TimeUnit.SECONDS)); + // 在管道中添加我们自己的接收数据实现方法 + socketChannel.pipeline().addLast(new NettyChillerControlHandler(orderMessageEntityList)); +// socketChannel.pipeline().addLast(new NettyMeterClientHandler()); + } + }); + // 发起异步连接操作 + ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); + if (channelFuture.isSuccess()) { + log.info("connect server 成功---------"); + } else { + log.info("连接失败!"); + log.info("准备重连!"); +// connect(port, host); + } + + // 等待客户端连接链路关闭future.channel().closeFuture().sync(); // 阻塞main线程 + channelFuture.channel().closeFuture().sync(); + } catch (Exception e) { + log.error(e.getMessage()); + } finally { + group.shutdownGracefully(); +// try { +// TimeUnit.SECONDS.sleep(5); +// connect(port, host); // 断线重连 +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + } + } + +// @SneakyThrows +// @Override +// public void run() { +// connect(port, host); +// } +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyChillerControlHandler.java b/user-service/src/main/java/com/mh/user/netty/NettyChillerControlHandler.java new file mode 100644 index 0000000..f7fdbd3 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyChillerControlHandler.java @@ -0,0 +1,311 @@ +package com.mh.user.netty; + +import com.mh.user.entity.OrderMessageEntity; +import com.mh.user.service.impl.DeviceDisplayServiceImpl; +import com.mh.user.constants.Constant; +import com.mh.user.utils.ExchangeStringUtil; +import com.mh.user.utils.SpringBeanUtil; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.timeout.IdleState; +import io.netty.handler.timeout.IdleStateEvent; +import io.netty.util.ReferenceCountUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @author ljf + * @title : + * @description :客户端异步消息处理机制 + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +public class NettyChillerControlHandler extends ChannelHandlerAdapter { + + private int num = 0; + private int size = 0; + private String receiveStr = ""; + private int sendNum = 0; + private int idle_count = 1; + + List orderMessageEntityList; + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + DeviceDisplayServiceImpl.GatewayManageService gatewayManageService = context.getBean(DeviceDisplayServiceImpl.GatewayManageService.class); + //OrderMessageService orderMessageService = context.getBean(OrderMessageService.class); + + public NettyChillerControlHandler(List orderMessageEntityList) { + this.orderMessageEntityList = orderMessageEntityList; + } + + @Override + public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { + log.info("当前channel从EventLoop取消注册"); +// Constant.SEND_STATUS = false; +// super.channelUnregistered(ctx); + ctx.close(); + } + + /** + * 超时处理 + * 如果120秒没有接受客户端的心跳,就触发; + * 如果超过3次,则直接关闭; + */ + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object obj) throws Exception { + if (obj instanceof IdleStateEvent) { + IdleStateEvent event = (IdleStateEvent) obj; + if (IdleState.READER_IDLE.equals(event.state())) { //如果读通道处于空闲状态,说明没有接收到心跳命令 + System.out.println("第" + idle_count + "已经10秒没有接收到服务器的信息了,发送第" + num + "条数据"); + if (num > size - 1) { + num = 0; + // 关闭连接 + receiveStr = null; + Constant.SEND_STATUS = true; + System.out.println("关闭这个不活跃的channel"); + ctx.close(); + } else if (idle_count > 3) { + System.out.println("关闭这个不活跃的channel"); + num = 0; + // 关闭连接 + receiveStr = null; + Constant.SEND_STATUS = false; + ctx.close(); + } else { + // 发送采集DDC指令 + // 判断空值 + if (orderMessageEntityList.get(num).getRegisterAddr() == null || + orderMessageEntityList.get(num).getRegisterAddr().equalsIgnoreCase("")) { + num = 0; + // 关闭连接 + receiveStr = null; + Constant.SEND_STATUS = true; + ctx.close(); + } else { + String sendStr = orderMessageEntityList.get(num).getOrderStr(); +// // 获取采集参数个数 +// size = orderMessageEntityList.size(); + // 2.发送数据 + ByteBuf buffer = getByteBuf(ctx, sendStr); + ctx.channel().writeAndFlush(buffer); + idle_count++; + } + } + } + } else { + super.userEventTriggered(ctx, obj); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { +// super.exceptionCaught(ctx, cause); + log.info("通信异常!!"); + cause.printStackTrace(); +// receiveStr = null; +// Channel incoming = ctx.channel(); +// if (incoming.isActive()) { +// // 重新发送 +// if (sendNum > 2) { +// // 通信异常,发送失败 +// log.info("SimpleClient: " + incoming.remoteAddress() + "异常"); +// cause.printStackTrace(); +// Constant.SEND_STATUS = false; +// ctx.close(); +// } else { +// // 发送采集DDC指令 +// String sendStr = orderMessageEntityList.get(num).getOrderStr(); +// // 获取采集参数个数 +// size = orderMessageEntityList.size(); +// // 2.发送数据 +// ByteBuf buffer = getByteBuf(ctx,sendStr); +// ctx.channel().writeAndFlush(buffer); +// sendNum += 1; +// } +// } +// // 判断发送的下标,如果不等于指令数组大小 +// num = num + 1; +// if (num > size-1) { +// num = 0; +// // 关闭连接 +// receiveStr = null; +// Constant.SEND_STATUS = true; +// ctx.close(); +// } + } + + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + super.channelActive(ctx); + SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); + Date date=new Date(); + log.info(ctx.channel().remoteAddress() + " " + sdf1.format(date) + "链接服务端成功!"); + // 截取IP地址 + String IP = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress()+"","/", ":"); + // 截取端口号 + String port = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress()+"",":", ""); + log.info("IP: " + IP + ",端口号: " + port); + // 更新对应的网关在线情况 + gatewayManageService.updateGatewayManage(IP, port); + + // 发送控制DDC指令 + String sendStr = orderMessageEntityList.get(num).getOrderStr(); + // 获取采集参数个数 + size = orderMessageEntityList.size(); + + // 2.发送数据 + ByteBuf buffer = getByteBuf(ctx,sendStr); + ctx.channel().writeAndFlush(buffer); + } + + private ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { + // 申请一个数据结构存储信息 + ByteBuf buffer = ctx.alloc().buffer(); + // 将信息放入数据结构中 + buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制 + return buffer; + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { +// Thread.sleep(100); + ctx.close(); + log.info(ctx.channel().localAddress() + "退出链接!!"); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); + // ByteBuf buf = (ByteBuf)msg; +// byte[] req = new byte[buf.readableBytes()]; +// buf.readBytes(req); +// String body = new String(req, "UTF-8"); + try { + ByteBuf buf = (ByteBuf)msg; + byte [] bytes = new byte[buf.readableBytes()]; + buf.readBytes(bytes);//复制内容到字节数组bytes + buf.clear(); + log.info("获取到的值: " + ExchangeStringUtil.bytesToHexString(bytes)); +// if (bytes.length <= 24) { + if (bytes.length != 0) { +// receiveStr = receiveStr.replace("null", ""); +// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 +// log.info(ctx.channel().remoteAddress() + " " + ctx.channel().localAddress() + " 接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 + receiveStr = receiveStr.replace("null", ""); + log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + ReferenceCountUtil.release(msg); + } + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + log.info("数据读取接收完成: " + receiveStr); + if (receiveStr.length() == 24) { + if (receiveStr.equalsIgnoreCase(orderMessageEntityList.get(num).getOrderStr())) { + // 解析采集回来的数据 + log.info("采集完整的报文: " + receiveStr + ",指令下标: " + size); + // 解析采集的报文 + // 更新发送后的指令 + OrderMessageEntity orderMessageEntity = new OrderMessageEntity(); + orderMessageEntity.setRegisterAddr(orderMessageEntityList.get(num).getRegisterAddr()); + orderMessageEntity.setCreateTime(orderMessageEntityList.get(num).getCreateTime()); + orderMessageEntity.setGrade(1); + orderMessageEntity.setSendNum(1); + orderMessageEntity.setStatus(1); + orderMessageEntity.setOrderStr(orderMessageEntityList.get(num).getOrderStr()); + //orderMessageService.updateOrderMessage(orderMessageEntity); + +// // 关闭连接 +// receiveStr = null; +// Constant.SEND_STATUS = true; +// ctx.close(); + + // 清空receiveStr + receiveStr = ""; + // 判断发送的下标,如果不等于指令数组大小 + num = num + 1; + if (num > size - 1) { + num = 0; + // 关闭连接 + receiveStr = null; + Constant.SEND_STATUS = true; + ctx.close(); + } else { + Thread.sleep(4000); + // 继续发送下一个采集DDC设备指令 + String sendStr = orderMessageEntityList.get(num).getOrderStr(); + ByteBuf buffer = getByteBuf(ctx, sendStr); + // 2.发送数据 + ctx.channel().writeAndFlush(buffer); + log.info("客户端再次往服务端发送数据" + num + ",报文: " + sendStr); + } + } + } else if ((receiveStr.length() > 24) && (num == 0)) { + // 发送采集DDC指令 + String sendStr = orderMessageEntityList.get(num).getOrderStr(); + // 获取采集参数个数 + size = orderMessageEntityList.size(); + // 2.发送数据 + ByteBuf buffer = getByteBuf(ctx,sendStr); + ctx.channel().writeAndFlush(buffer); + // 清空receiveStr + receiveStr = ""; + sendNum += 1; + } else if (sendNum > 2){ + // 更新发送后的指令 + OrderMessageEntity orderMessageEntity = new OrderMessageEntity(); + orderMessageEntity.setRegisterAddr(orderMessageEntityList.get(num).getRegisterAddr()); + orderMessageEntity.setCreateTime(orderMessageEntityList.get(num).getCreateTime()); + orderMessageEntity.setGrade(1); + orderMessageEntity.setSendNum(sendNum); + orderMessageEntity.setStatus(0); + orderMessageEntity.setOrderStr(orderMessageEntityList.get(num).getOrderStr()); + //orderMessageService.updateOrderMessage(orderMessageEntity); + Constant.SEND_STATUS = false; + ctx.close(); + } else if ((receiveStr.length() > 24)) { + // 接收采集DDC的数据 + // 解析采集的报文 +// AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); +// analysisReceiveOrder485.analysisChillersDDC(receiveStr); + + // 清空receiveStr + receiveStr = ""; + // 更新发送后的指令 + OrderMessageEntity orderMessageEntity = new OrderMessageEntity(); + orderMessageEntity.setRegisterAddr(orderMessageEntityList.get(num).getRegisterAddr()); + orderMessageEntity.setCreateTime(orderMessageEntityList.get(num).getCreateTime()); + orderMessageEntity.setGrade(1); + orderMessageEntity.setSendNum(1); + orderMessageEntity.setStatus(1); + orderMessageEntity.setOrderStr(orderMessageEntityList.get(num).getOrderStr()); + //orderMessageService.updateOrderMessage(orderMessageEntity); + + // 判断发送的下标,如果不等于指令数组大小 + num = num + 1; +// Thread.sleep(500); + if (num > size-1) { + num = 0; + // 关闭连接 + receiveStr = null; + Constant.SEND_STATUS = true; + ctx.close(); + } + } + ctx.flush(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyClient.java b/user-service/src/main/java/com/mh/user/netty/NettyClient.java new file mode 100644 index 0000000..828c646 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyClient.java @@ -0,0 +1,90 @@ +package com.mh.user.netty; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.timeout.ReadTimeoutHandler; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +/** + * @author ljf + * @title : + * @description :Netty客户端,采集冷量计 + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +@Setter +@Getter +public class NettyClient { + + private int port; + private String host; + + // 构造函数传递值 继承Thread时需要 +// public NettyClient(int port, String host) { +// this.port = port; +// this.host = host; +// } + + public void connect(int port, String host) throws InterruptedException { + // 配置客户端NIO线程组 + EventLoopGroup group = new NioEventLoopGroup(1); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(group).channel(NioSocketChannel.class) + .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000) + .option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(1024*1024)) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { + // 基于换行符号 +// socketChannel.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,4,4,-8,0)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringDecoder(StandardCharsets.UTF_8)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringEncoder(StandardCharsets.UTF_8)); +// socketChannel.pipeline().addLast(new LengthFieldPrepender(4)); + // 超过10秒钟没有数据读取自动断开连接 + socketChannel.pipeline().addLast(new ReadTimeoutHandler(10)); + // 在管道中添加我们自己的接收数据实现方法 + socketChannel.pipeline().addLast(new NettyClientHandler()); +// socketChannel.pipeline().addLast(new NettyMeterClientHandler()); + } + }); + // 发起异步连接操作 + ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); + if (channelFuture.isSuccess()) { + log.info("connect server 成功---------"); + } else { + log.info("连接失败!"); + log.info("准备重连!"); +// connect(port, host); + } + + // 等待客户端连接链路关闭future.channel().closeFuture().sync(); // 阻塞main线程 + channelFuture.channel().closeFuture().sync(); + } catch (Exception e) { + log.error(e.getMessage()); + } finally { + group.shutdownGracefully(); +// try { +// TimeUnit.SECONDS.sleep(5); +// connect(port, host); // 断线重连 +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + } + } + +// @SneakyThrows +// @Override +// public void run() { +// connect(port, host); +// } +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyClientHandler.java b/user-service/src/main/java/com/mh/user/netty/NettyClientHandler.java new file mode 100644 index 0000000..8862451 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyClientHandler.java @@ -0,0 +1,295 @@ +package com.mh.user.netty; + +import com.mh.user.constants.Constant; +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.service.DeviceManageService; +import com.mh.user.utils.*; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; +import io.netty.util.ReferenceCountUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @author ljf + * @title : + * @description :客户端异步消息处理机制 + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +public class NettyClientHandler extends ChannelHandlerAdapter { + + private int num = 0; + private int size = 0; + private String receiveStr = null; + private String IP = null; + private String port = null; + List deviceManageEntityList; + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + DeviceManageService deviceManageService = context.getBean(DeviceManageService.class); + + + @Override + public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { + log.info("当前channel从EventLoop取消注册"); + super.channelUnregistered(ctx); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { +// super.exceptionCaught(ctx, cause); + log.info("通信异常!!"); + receiveStr = null; + Channel incoming = ctx.channel(); + if (incoming.isActive()){ + log.info("SimpleClient: " + incoming.remoteAddress() + "异常"); + cause.printStackTrace(); + ctx.close(); +// receiveStr = null; +// try { +// TimeUnit.SECONDS.sleep(5); +// SocketAddress remoteAddress = ctx.channel().remoteAddress(); +// String port = ExchangeStringUtil.endData(remoteAddress.toString(),":"); +// String host = ExchangeStringUtil.splitData(remoteAddress.toString(),"/",":"); +// NettyClient nettyClient = new NettyClient(); +// nettyClient.connect(Integer.parseInt(port), host); // 断线重连 +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + } + } + + + @Override + public void channelActive(ChannelHandlerContext ctx) { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + ctx.channel().read(); + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); + Date date = new Date(); + log.info(ctx.channel().remoteAddress() + " " + sdf1.format(date) + "链接服务端成功!"); + // 截取IP地址 + IP = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", "/", ":"); + // 截取端口号 + port = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", ":", ""); + log.info("IP: " + IP + ",端口号: " + port); + // 生成对应采集冷量计的命令 + // 生成对应的采集指令 + deviceManageEntityList = deviceManageService.queryDevicesByType("3"); + size = deviceManageEntityList.size(); + + // 封装工具类进行采集,update by ljf on 2021-01-26 + SendOrderUtils.sendCloudOrder(deviceManageEntityList.get(0),0,IP,port,ctx); +// // 1.创建将要写出的数据 +// String collectionNum = deviceManageEntityList.get(0).getCollectionNum(); +// String sendStr = GetReadOrder485.createCloudOrder(IP, port, +// deviceManageEntityList.get(0).getDataCom(), +// collectionNum, "34"); +//// String sendStr = "5803004900021914"; +// ByteBuf buffer = getByteBuf(ctx, sendStr); +// // 2.发送数据 +// ctx.channel().writeAndFlush(buffer); + } + +// String sendStr = "5803004900021914"; // 冷量计 +// // 申请一个数据结构存储信息 +// ByteBuf buffer = ctx.alloc().buffer(); +// // 将信息放入数据结构中 +// buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制 +// ctx.writeAndFlush(buffer, ctx.newProgressivePromise()); + } + + private ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { + // byte类型的数据 +// byte[] bytes = "这里是将要写往服务端的数据".getBytes(Charset.forName("utf-8")); +// String sendStr = "5803004900021914"; // 冷量计 + // 申请一个数据结构存储信息 + ByteBuf buffer = ctx.alloc().buffer(); + // 将信息放入数据结构中 + buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制 + return buffer; + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + Thread.sleep(100); + ctx.close(); + log.info(ctx.channel().localAddress() + "退出链接!!"); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + try { + ByteBuf buf = (ByteBuf)msg; + byte [] bytes = new byte[buf.readableBytes()]; + buf.readBytes(bytes);//复制内容到字节数组bytes + buf.clear(); + log.info("获取到的值: " + ExchangeStringUtil.bytesToHexString(bytes)); + if (bytes.length <= 36) { +// receiveStr = receiveStr.replace("null", ""); +// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 +// log.info(ctx.channel().remoteAddress() + " " + ctx.channel().localAddress() + " 接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 + receiveStr = receiveStr.replace("null", ""); + log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + ReferenceCountUtil.release(msg); + } + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + log.info("采集冷量计-数据读取接收完成: " + receiveStr); +// A9 FE C2 C7 1F 90 01 58 03 04 4A 30 00 53 65 1C C4 06 + if (receiveStr.length() == 36) { + // 接收到的报文 + log.info("接收完整报文: " + receiveStr); + // 解析报文 +// AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); +// analysisReceiveOrder485.analysisCloudOrder485(receiveStr); // 解析冷量计 + receiveStr = ""; + // 1.创建将要写出的数据 +// String sendStr = "5803004900021914"; + num = num + 1; + Thread.sleep(500); + if (num > size-1) { + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); +// 保持长连接 +// // 封装工具类进行采集,update by ljf on 2021-01-26 +// SendOrderUtils.sendCloudOrder(deviceManageEntityList.get(num),num,IP,port,ctx); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + log.info("有指令下发退出定时采集DDC参数"); + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + // 封装工具类进行采集,update by ljf on 2021-01-26 + SendOrderUtils.sendCloudOrder(deviceManageEntityList.get(num),num,IP,port,ctx); +// // 1.创建将要写出的数据 +// String collectionNum = deviceManageEntityList.get(num).getCollectionNum(); +// String sendStr = GetReadOrder485.createCloudOrder(IP, port, +// deviceManageEntityList.get(num).getDataCom(), +// collectionNum, "34"); +//// String sendStr = "5803004900021914"; +// ByteBuf buffer = getByteBuf(ctx, sendStr); +// // 2.发送数据 +// ctx.channel().writeAndFlush(buffer); +// log.info("客户端再次往服务端发送数据" + sendStr); + } + } + + } else { + log.info(receiveStr); + receiveStr = null; + ctx.flush(); + ctx.close(); + } + +// if (receiveStr.contains("c0a801fc")) { // 冷量计 +// +// // 生成对应的采集指令 +// deviceManageEntityList = deviceManageService.queryDevicesByType("3"); +// size = deviceManageEntityList.size(); +// +// log.info("初始连接报文: " + receiveStr); +// IP = receiveStr; +// receiveStr = ""; +// // 1.创建将要写出的数据 +// String collectionNum = deviceManageEntityList.get(0).getCollectionNum(); +// String sendStr = GetReadOrder485.createCloudOrder(collectionNum,"34"); +//// String sendStr = "5803004900021914"; +// ByteBuf buffer = getByteBuf(ctx,sendStr); +// // 2.发送数据 +// ctx.channel().writeAndFlush(buffer); +// } else if (receiveStr.contains("c0a801f0")) { // 电表 +// +// // 生成对应的采集指令 +// deviceManageEntityList = deviceManageService.queryDevicesByType("1"); +// size = deviceManageEntityList.size(); +// +// log.info("初始连接报文: " + receiveStr); +// IP = receiveStr; +// receiveStr = ""; +// // 1.创建将要写出的数据 +//// String sendStr = "6830043080000068110432326536C816"; // 网络单相电表 +//// String sendStr = "FEFEFEFE6880025007000068010243C3B216"; // 广仪三相电表 +// String collectionNum = deviceManageEntityList.get(0).getCollectionNum(); +// String sendStr = GetReadOrder485.createMeterOrder(collectionNum,"1"); +// ByteBuf buffer = getByteBuf(ctx,sendStr); +// // 2.发送数据 +// ctx.channel().writeAndFlush(buffer); +// } else if ((receiveStr.length() == 18) && (IP.contains("c0a801fc"))) { +// analysisReceiveOrder485.analysisCloudOrder485(receiveStr); // 解析冷量计 +// receiveStr = ""; +// // 1.创建将要写出的数据 +//// String sendStr = "5803004900021914"; +// num = num + 1; +// Thread.sleep(1000); +// if (num >= size-1) { +// num = 0; +// // 关闭连接 +// receiveStr = null; +// ctx.close(); +// } else { +// String collectionNum = deviceManageEntityList.get(num).getCollectionNum(); +// String sendStr = GetReadOrder485.createCloudOrder(collectionNum, "34"); +// ByteBuf buffer = getByteBuf(ctx, sendStr); +// // 2.发送数据 +// ctx.channel().writeAndFlush(buffer); +// log.info("客户端再次往服务端发送数据" + num); +// } +// +// } else if ((receiveStr.length() == 44) && (IP.contains("c0a801f0"))) { +// analysisReceiveOrder485.analysisMeterOrder485(receiveStr); // 解析电表 +// receiveStr = ""; +// num = num + 1; +// Thread.sleep(1000); +// if (num >= size-1) { +// num = 0; +// receiveStr = null; +// // 关闭连接 +// ctx.close(); +// } else { +// // 1.创建将要写出的数据 +// // fe fe fe fe 68 80 02 50 07 00 00 68 81 06 43 c3 8c 34 33 33 5c 16 +//// String sendStr = "FEFEFE6880025007000068010243C3B216"; +// String collectionNum = deviceManageEntityList.get(num).getCollectionNum(); +// String sendStr = GetReadOrder485.createMeterOrder(collectionNum, "1"); +// ByteBuf buffer = getByteBuf(ctx, sendStr); +// // 2.发送数据 +// ctx.channel().writeAndFlush(buffer); +// log.info("客户端再次往服务端发送数据" + num); +// } +// } else if ((receiveStr.length() > 44)) { +// log.info(receiveStr); +// receiveStr = null; +// ctx.flush(); +// ctx.close(); +// } + ctx.flush(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyEchoServer.java b/user-service/src/main/java/com/mh/user/netty/NettyEchoServer.java new file mode 100644 index 0000000..d0d1c75 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyEchoServer.java @@ -0,0 +1,179 @@ +package com.mh.user.netty; + +import com.mh.user.utils.ExchangeStringUtil; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StringUtils; + +import java.io.IOException; +import java.net.InetSocketAddress; + + +/** + * @author ljf + * @title :Netty + * @description :netty 使用 + * @updateTime 2020-04-21 + * @throws : + */ +@Slf4j +public class NettyEchoServer { + + public void bind(int port) throws Exception { + // accept线程组,用来接收连接 + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + // IO 线程组,用来处理业务逻辑 + EventLoopGroup workerGroup = new NioEventLoopGroup(1); + + try { + // 服务端启动引导 + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap.group(bossGroup,workerGroup) // 绑定两个线程 + .channel(NioServerSocketChannel.class) // 指定通道类型 + .option(ChannelOption.SO_BACKLOG, 1024) // 设置TCP连接的缓冲区 + .handler(new LoggingHandler(LogLevel.INFO)) // 设置日志级别 + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + ChannelPipeline pipeline = socketChannel.pipeline(); // 获取处理器链 + pipeline.addLast(new EchoServerHandler()); // 添加新的事件处理器 + } + }); + // 通过bind启动服务 + ChannelFuture f = serverBootstrap.bind(port).sync(); + // 阻塞主线程,知道网络服务被关闭 + f.channel().closeFuture().sync(); + } catch (Exception e){ + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } + + static class EchoServerHandler extends ChannelHandlerAdapter { + + // 每当从客户端收到新的数据时,这个方法会在收到消息时被调用 + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + try { + ByteBuf buf = (ByteBuf)msg; + byte [] bytes = new byte[buf.readableBytes()]; + buf.readBytes(bytes);//复制内容到字节数组bytes + String receiveStr = ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 + log.info("接收到的数据: "+ receiveStr); + //返回16进制到客户端 + writeToClient(receiveStr,ctx,"测试"); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } +// ctx.write(Unpooled.wrappedBuffer("Server message".getBytes())); +// ctx.fireChannelRead(msg); + } + + // 数据读取完后被调用 + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + ctx.flush(); + } + + // 当Netty由于IO错误或者处理器在处理事件时抛出的异常时被调用 + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } + + /** + * 客户端与服务端第一次建立连接时 执行 + * + * @param ctx + * @throws Exception + */ + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception, IOException + { + super.channelActive(ctx); + ctx.channel().read(); + InetSocketAddress ifsock = (InetSocketAddress) ctx.channel().remoteAddress(); + String clientIp = ifsock.getAddress().getHostAddress(); + //此处不能使用ctx.close(),否则客户端始终无法与服务端建立连接 + log.info("channelActive: "+clientIp + ctx.name()); + } + + /** + * 客户端与服务端 断连时 执行 + * + * @param ctx + * @throws Exception + */ + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception, IOException + { + super.channelInactive(ctx); + InetSocketAddress ifsock = (InetSocketAddress) ctx.channel().remoteAddress(); + String clientIp = ifsock.getAddress().getHostAddress(); + ctx.close(); //断开连接时,必须关闭,否则造成资源浪费,并发量很大情况下可能造成宕机 + System.out.println("channelInactive:"+clientIp); + } + + /** + * 服务端当read超时, 会调用这个方法 + * + * @param ctx + * @param evt + * @throws Exception + */ + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception, IOException + { + super.userEventTriggered(ctx, evt); + InetSocketAddress ifsock = (InetSocketAddress) ctx.channel().remoteAddress(); + String clientIp = ifsock.getAddress().getHostAddress(); + ctx.close();//超时时断开连接 + System.out.println("userEventTriggered:"+clientIp); + } + + + /** + * 公用回写数据到客户端的方法 + * @param channel + * @param mark 用于打印/log的输出 + *
//channel.writeAndFlush(msg);//不行 + *
//channel.writeAndFlush(receiveStr.getBytes());//不行 + *
在netty里,进出的都是ByteBuf,楼主应确定服务端是否有对应的编码器,将字符串转化为ByteBuf + */ + private void writeToClient(final String receiveStr, ChannelHandlerContext channel, final String mark) { + try { + ByteBuf buff = Unpooled.buffer();//netty需要用ByteBuf传输 + buff.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(receiveStr));//对接需要16进制 + channel.writeAndFlush(buff).addListener((ChannelFutureListener) future -> { + StringBuilder sb = new StringBuilder(""); + if(!StringUtils.isEmpty(mark)){ + sb.append("【").append(mark).append("】"); + } + if (future.isSuccess()) { + System.out.println(sb.toString()+"回写成功"+receiveStr); + log.info(sb.toString()+"回写成功"+receiveStr); + } else { + System.out.println(sb.toString()+"回写失败"+receiveStr); + log.error(sb.toString()+"回写失败"+receiveStr); + } + }); + } catch (Exception e) { + e.printStackTrace(); + System.out.println("调用通用writeToClient()异常"+e.getMessage()); + log.error("调用通用writeToClient()异常:",e); + } + } + } +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyMeterAndCloudClient.java b/user-service/src/main/java/com/mh/user/netty/NettyMeterAndCloudClient.java new file mode 100644 index 0000000..b95a213 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyMeterAndCloudClient.java @@ -0,0 +1,97 @@ +package com.mh.user.netty; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.timeout.IdleStateHandler; +import io.netty.handler.timeout.ReadTimeoutHandler; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.TimeUnit; + +/** + * @author ljf + * @title : + * @description :Netty客户端,采集电表 + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +@Setter +@Getter +public class NettyMeterAndCloudClient { +// implements Runnable { + + private int port; + private String host; + + // 构造函数传递值 继承Thread时需要 + public NettyMeterAndCloudClient(int port, String host) { + this.port = port; + this.host = host; + } + + public NettyMeterAndCloudClient() { + super(); + } + + public void connect(int port, String host) throws InterruptedException { + // 配置客户端NIO线程组 + EventLoopGroup group = new NioEventLoopGroup(1); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(group).channel(NioSocketChannel.class) + .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000) + .option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(1024*1024)) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { + // 基于换行符号 +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringDecoder(StandardCharsets.UTF_8)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringEncoder(StandardCharsets.UTF_8)); + // 超过10秒钟没有数据读取自动断开连接 + socketChannel.pipeline().addLast(new IdleStateHandler(10,10,10, TimeUnit.SECONDS)); + // 在管道中添加我们自己的接收数据实现方法 +// socketChannel.pipeline().addLast(new NettyClientHandler()); + socketChannel.pipeline().addLast(new NettyMeterAndCloudClientHandler()); + } + }); + // 发起异步连接操作 + ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); + if (channelFuture.isSuccess()) { + log.info("connect server 成功---------"); + } else { + log.info("连接失败!"); + log.info("准备重连!"); +// connect(port, host); + } + + // 等待客户端连接链路关闭future.channel().closeFuture().sync(); // 阻塞main线程 + channelFuture.channel().closeFuture().sync(); + } catch (Exception e) { + log.error(e.getMessage()); + } finally { + group.shutdownGracefully(); +// try { +// TimeUnit.SECONDS.sleep(5); +// connect(port, host); // 断线重连 +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + } + } +// +// @SneakyThrows +// @Override +// public void run() { +// connect(port, host); +// } +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyMeterAndCloudClientHandler.java b/user-service/src/main/java/com/mh/user/netty/NettyMeterAndCloudClientHandler.java new file mode 100644 index 0000000..f8d876a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyMeterAndCloudClientHandler.java @@ -0,0 +1,193 @@ +package com.mh.user.netty; + +import com.mh.user.constants.Constant; +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.service.DeviceManageService; +import com.mh.user.utils.*; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.timeout.IdleState; +import io.netty.handler.timeout.IdleStateEvent; +import io.netty.util.ReferenceCountUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @author ljf + * @title : + * @description :客户端异步消息处理机制 + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +public class NettyMeterAndCloudClientHandler extends ChannelHandlerAdapter { + + + private int num = 0; + private int size = 0; + private String receiveStr = null; + private int idle_count = 0; + private String IP = ""; + private String port = ""; + + List deviceManageEntityList; + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + DeviceManageService deviceManageService = context.getBean(DeviceManageService.class); + + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + + @Override + public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { + log.info("当前channel从EventLoop取消注册"); + super.channelUnregistered(ctx); + } + + /** + * 超时处理 + * 如果120秒没有接受客户端的心跳,就触发; + * 如果超过3次,则直接关闭; + */ + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object obj) throws Exception { + if (obj instanceof IdleStateEvent) { + IdleStateEvent event = (IdleStateEvent) obj; + if (IdleState.READER_IDLE.equals(event.state())) { //如果读通道处于空闲状态,说明没有接收到心跳命令 + System.out.println("第" + idle_count + "已经20秒没有接收到服务器的信息了,发送的第" + num + "条数据"); + if (deviceManageEntityList.get(num) == null) { + ctx.channel().close(); + } else { + if (idle_count > 3 || num > size - 1) { + System.out.println("关闭这个不活跃的channel"); + ctx.channel().close(); + } + + SendOrderUtils.sendMeterOrCloud(deviceManageEntityList.get(num), num, IP, port, ctx); + idle_count++; + } + } + } else { + super.userEventTriggered(ctx, obj); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + log.info("通信异常!!"); + Channel incoming = ctx.channel(); + if (incoming.isActive()) { + log.info("SimpleClient: " + incoming.remoteAddress() + "异常"); + receiveStr = null; + cause.printStackTrace(); + ctx.close(); + } + } + + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { +// super.channelActive(ctx); + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); + Date date = new Date(); + log.info(ctx.channel().remoteAddress() + " " + sdf1.format(date) + "链接服务端成功!"); + + // 截取IP地址 + IP = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", "/", ":"); + // 截取端口号 + port = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", ":", ""); + log.info("IP: " + IP + ",端口号: " + port); + + // 生成对应的采集指令 + deviceManageEntityList = deviceManageService.queryDevicesByType(null); + size = deviceManageEntityList.size(); + + log.info("初始连接报文: " + receiveStr); + receiveStr = ""; + // 保持长连接,封装发送电表工具方法 update by ljf on 2021-01-26 + SendOrderUtils.sendMeterOrCloud(deviceManageEntityList.get(0), 0, IP, port, ctx); + } + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + Thread.sleep(500); + receiveStr = null; + ctx.close(); + log.info(ctx.channel().localAddress() + "退出链接!!"); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + try { + ByteBuf buf = (ByteBuf) msg; + byte[] bytes = new byte[buf.readableBytes()]; + buf.readBytes(bytes);//复制内容到字节数组bytes + buf.clear(); + log.info("获取到的值: " + ExchangeStringUtil.bytesToHexString(bytes)); + if (bytes.length <= 62) { +// if (bytes.length <= 142) { +// receiveStr = receiveStr.replace("null", ""); +// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 +// log.info(ctx.channel().remoteAddress() + " " + ctx.channel().localAddress() + " 接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 + receiveStr = receiveStr.replace("null", ""); + log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + ReferenceCountUtil.release(msg); + } + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + log.info("采集电表或者冷量计-数据读取接收完成: " + receiveStr); + if ((receiveStr.length() == 36) && (deviceManageEntityList.get(num).getParamId() == 3)) { +// analysisReceiveOrder485.analysisCloudOrder485(receiveStr); // 解析冷量计 + } else if ((receiveStr.length() == 62) && (deviceManageEntityList.get(num).getParamId() == 1)) { +// 把receiveStr的"null"值去掉 +// a9fec2c71f9002fefefefe6839025007000068810643c3bb446c338d16c2b8 +// A9 FE C2 C7 1F 90 02 FE FE FE FE 68 39 02 50 07 00 00 68 81 06 43 C3 5B 38 6C 33 21 16 F8 12 + analysisReceiveOrder485.analysisMeterOrder485(receiveStr,"","",""); // 解析电表 + } + receiveStr = ""; + num = num + 1; + Thread.sleep(600); + if (num > size - 1) { + num = 0; + receiveStr = null; + // 关闭连接 + ctx.close(); +// // 保持长连接,封装发送电表工具方法 update by ljf on 2021-01-26 +// SendOrderUtils.sendMeterOrder(deviceManageEntityList.get(num),num,IP,port,ctx); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + log.info("有指令下发退出定时采集DDC参数"); + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + // 封装发送电表工具方法 update by ljf on 2021-01-26 + SendOrderUtils.sendMeterOrCloud(deviceManageEntityList.get(num), num, IP, port, ctx); + } + } + ctx.flush(); + } +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyMeterClient.java b/user-service/src/main/java/com/mh/user/netty/NettyMeterClient.java new file mode 100644 index 0000000..77f00df --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyMeterClient.java @@ -0,0 +1,96 @@ +package com.mh.user.netty; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.timeout.ReadTimeoutHandler; +import lombok.Getter; +import lombok.Setter; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +/** + * @author ljf + * @title : + * @description :Netty客户端,采集电表 + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +@Setter +@Getter +public class NettyMeterClient { +// implements Runnable { + + private int port; + private String host; + + // 构造函数传递值 继承Thread时需要 + public NettyMeterClient(int port, String host) { + this.port = port; + this.host = host; + } + + public NettyMeterClient() { + super(); + } + + public void connect(int port, String host) throws InterruptedException { + // 配置客户端NIO线程组 + // 配置客户端NIO线程组 + EventLoopGroup group = new NioEventLoopGroup(1); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(group).channel(NioSocketChannel.class) + .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000) + .option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(1024*1024)) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { + // 基于换行符号 +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringDecoder(StandardCharsets.UTF_8)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringEncoder(StandardCharsets.UTF_8)); + // 超过10秒钟没有数据读取自动断开连接 + socketChannel.pipeline().addLast(new ReadTimeoutHandler(20)); + // 在管道中添加我们自己的接收数据实现方法 +// socketChannel.pipeline().addLast(new NettyClientHandler()); + socketChannel.pipeline().addLast(new NettyMeterClientHandler1()); + } + }); + // 发起异步连接操作 + ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); + if (channelFuture.isSuccess()) { + log.info("connect server 成功---------"); + } else { + log.info("连接失败!"); + log.info("准备重连!"); +// connect(port, host); + } + + // 等待客户端连接链路关闭future.channel().closeFuture().sync(); // 阻塞main线程 + channelFuture.channel().closeFuture().sync(); + } catch (Exception e) { + log.error(e.getMessage()); + } finally { + group.shutdownGracefully(); +// try { +// TimeUnit.SECONDS.sleep(5); +// connect(port, host); // 断线重连 +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + } + } +// +// @SneakyThrows +// @Override +// public void run() { +// connect(port, host); +// } +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyMeterClientHandler.java b/user-service/src/main/java/com/mh/user/netty/NettyMeterClientHandler.java new file mode 100644 index 0000000..6f383f9 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyMeterClientHandler.java @@ -0,0 +1,143 @@ +//package com.mh.user.netty; +// +//import com.mh.user.entity.DeviceManageEntity; +//import com.mh.user.service.DeviceManageService; +//import com.mh.user.utils.AnalysisReceiveOrder485; +//import com.mh.user.utils.ExchangeStringUtil; +//import com.mh.user.utils.GetReadOrder485; +//import com.mh.user.utils.SpringBeanUtil; +//import io.netty.buffer.ByteBuf; +//import io.netty.channel.Channel; +//import io.netty.channel.ChannelHandlerAdapter; +//import io.netty.channel.ChannelHandlerContext; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.context.ApplicationContext; +// +//import java.text.SimpleDateFormat; +//import java.util.Date; +//import java.util.List; +// +///** +// * @author ljf +// * @title : +// * @description :客户端异步消息处理机制 +// * @updateTime 2020-05-13 +// * @throws : +// */ +//@Slf4j +//public class NettyMeterClientHandler extends ChannelHandlerAdapter { +// +// private static int num = 0; +// private static int size = 0; +// private static String receiveStr = ""; +// private static String IP = ""; +// List deviceManageEntityList; +// +// // 调用service +// ApplicationContext context = SpringBeanUtil.getApplicationContext(); +// DeviceManageService deviceManageService = context.getBean(DeviceManageService.class); +// +// AnalysisReceiveOrder485 analysisReceiveOrder485; +// +// // 到处理IO事件,异常抛出时调用,已丢弃 +// @Override +// public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { +// Channel incoming = ctx.channel(); +// if (!incoming.isActive()){ +// log.info("通信异常!!"); +// receiveStr = ""; +// log.info("SimpleClient: " + incoming.remoteAddress() + "异常"); +// cause.printStackTrace(); +// ctx.close(); +// } +// } +// +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); +// Date date=new Date(); +// log.info(sdf1.format(date) + "链接服务端成功!"); +// } +// +// private ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { +// // byte类型的数据 +//// byte[] bytes = "这里是将要写往服务端的数据".getBytes(Charset.forName("utf-8")); +//// String sendStr = "5803004900021914"; // 冷量计 +// // 申请一个数据结构存储信息 +// ByteBuf buffer = ctx.alloc().buffer(); +// // 将信息放入数据结构中 +// buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制 +// return buffer; +// } +// +// @Override +// public void channelInactive(ChannelHandlerContext ctx) throws Exception { +// Thread.sleep(500); +// ctx.close(); +// log.info("退出链接!!"); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +//// ByteBuf buf = (ByteBuf)msg; +//// byte[] req = new byte[buf.readableBytes()]; +//// buf.readBytes(req); +//// String body = new String(req, "UTF-8"); +// ByteBuf buf = (ByteBuf)msg; +// byte [] bytes = new byte[buf.readableBytes()]; +// buf.readBytes(bytes);//复制内容到字节数组bytes +// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 +// log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); +// } +// +// @Override +// public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { +// log.info("数据读取接收完成"); +// if (receiveStr.contains("c0a801f0")) { // 电表 +// +// // 生成对应的采集指令 +// deviceManageEntityList = deviceManageService.queryDevicesByType("1"); +// size = deviceManageEntityList.size(); +// +// log.info("初始连接报文: " + receiveStr); +// IP = receiveStr; +// receiveStr = ""; +// num = 0; +// // 1.创建将要写出的数据 +//// String sendStr = "6830043080000068110432326536C816"; // 网络单相电表 +//// String sendStr = "FEFEFEFE6880025007000068010243C3B216"; // 广仪三相电表 +// String collectionNum = deviceManageEntityList.get(num).getCollectionNum(); +// String sendStr = GetReadOrder485.createMeterOrder(collectionNum,"1"); +// ByteBuf buffer = getByteBuf(ctx,sendStr); +// // 2.发送数据 +// ctx.channel().writeAndFlush(buffer); +// } else if ((receiveStr.length() == 44) && (IP.contains("c0a801f0"))) { +// analysisReceiveOrder485.analysisMeterOrder485(receiveStr); // 解析电表 +// receiveStr = ""; +// num = num + 1; +// Thread.sleep(1000); +// if (num >= size-1) { +// num = 0; +// // 关闭连接 +// ctx.close(); +// } else { +// // 1.创建将要写出的数据 +// // fe fe fe fe 68 80 02 50 07 00 00 68 81 06 43 c3 8c 34 33 33 5c 16 +//// String sendStr = "FEFEFE6880025007000068010243C3B216"; +// String collectionNum = deviceManageEntityList.get(num).getCollectionNum(); +// String sendStr = GetReadOrder485.createMeterOrder(collectionNum, "1"); +// ByteBuf buffer = getByteBuf(ctx, sendStr); +// // 2.发送数据 +// ctx.channel().writeAndFlush(buffer); +// log.info("客户端再次往服务端发送数据" + num); +// } +// } else if ((receiveStr.length() > 44)) { +// log.info(receiveStr); +// receiveStr = ""; +// ctx.flush(); +// ctx.close(); +// } +// ctx.flush(); +// } +// +//} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyMeterClientHandler1.java b/user-service/src/main/java/com/mh/user/netty/NettyMeterClientHandler1.java new file mode 100644 index 0000000..d2f2c65 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyMeterClientHandler1.java @@ -0,0 +1,259 @@ +package com.mh.user.netty; + +import com.mh.user.constants.Constant; +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.service.DeviceManageService; +import com.mh.user.utils.*; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; +import io.netty.util.ReferenceCountUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @author ljf + * @title : + * @description :客户端异步消息处理机制 + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +public class NettyMeterClientHandler1 extends ChannelHandlerAdapter { + + + private int num = 0; + private int size = 0; + private String receiveStr = null; + private String IP = ""; + private String port = ""; + List deviceManageEntityList; + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + DeviceManageService deviceManageService = context.getBean(DeviceManageService.class); + + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + + @Override + public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { + log.info("当前channel从EventLoop取消注册"); + super.channelUnregistered(ctx); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { +// super.exceptionCaught(ctx, cause); + log.info("通信异常!!"); +// receiveStr = null; + Channel incoming = ctx.channel(); + if (incoming.isActive()) { + log.info("SimpleClient: " + incoming.remoteAddress() + "异常"); + receiveStr = null; + cause.printStackTrace(); + ctx.close(); +// receiveStr = null; +// try { +// TimeUnit.SECONDS.sleep(5); +// SocketAddress remoteAddress = ctx.channel().remoteAddress(); +// String port = ExchangeStringUtil.endData(remoteAddress.toString(),":"); +// String host = ExchangeStringUtil.splitData(remoteAddress.toString(),"/",":"); +// NettyClient nettyClient = new NettyClient(); +// nettyClient.connect(Integer.parseInt(port), host); // 断线重连 +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + } + } + + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { +// super.channelActive(ctx); + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + ctx.channel().read(); + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); + Date date = new Date(); + log.info(ctx.channel().remoteAddress() + " " + sdf1.format(date) + "链接服务端成功!"); + + // 截取IP地址 + IP = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", "/", ":"); + // 截取端口号 + port = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", ":", ""); + log.info("IP: " + IP + ",端口号: " + port); + + // 生成对应的采集指令 + // 修改生成指令(冷量计和电量一起采集) update by ljf on 2021-01-27 + deviceManageEntityList = deviceManageService.queryDevicesByType(null); + size = deviceManageEntityList.size(); + + log.info("初始连接报文: " + receiveStr); + receiveStr = ""; + // 保持长连接,封装发送电表工具方法 update by ljf on 2021-01-26 + SendOrderUtils.sendMeterOrder(deviceManageEntityList.get(0), 0, IP, port, ctx); + // 1.创建将要写出的数据 +// String sendStr = "6830043080000068110432326536C816"; // 网络单相电表 +// String sendStr = "FEFEFEFE6880025007000068010243C3B216"; // 广仪三相电表 +// String collectionNum = deviceManageEntityList.get(0).getCollectionNum(); +// String sendStr = GetReadOrder485.createMeterOrder(IP, port, +// deviceManageEntityList.get(0).getDataCom(), collectionNum, "1"); +//// FileUtils.createFileAndWrite(sendStr, 0); +// ByteBuf buffer = getByteBuf(ctx, sendStr); +// // 2.发送数据 +// ctx.channel().writeAndFlush(buffer); + } + + } + + private ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { + // byte类型的数据 +// byte[] bytes = "这里是将要写往服务端的数据".getBytes(Charset.forName("utf-8")); +// String sendStr = "5803004900021914"; // 冷量计 + // 申请一个数据结构存储信息 + ByteBuf buffer = ctx.alloc().buffer(); + // 将信息放入数据结构中 + buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制 + return buffer; + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + Thread.sleep(500); + receiveStr = null; + ctx.close(); + log.info(ctx.channel().localAddress() + "退出链接!!"); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + try { + ByteBuf buf = (ByteBuf) msg; + byte[] bytes = new byte[buf.readableBytes()]; + buf.readBytes(bytes);//复制内容到字节数组bytes + buf.clear(); + log.info("获取到的值: " + ExchangeStringUtil.bytesToHexString(bytes)); + if (bytes.length <= 62) { +// if (bytes.length <= 142) { +// receiveStr = receiveStr.replace("null", ""); +// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 +// log.info(ctx.channel().remoteAddress() + " " + ctx.channel().localAddress() + " 接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 + receiveStr = receiveStr.replace("null", ""); + log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + ReferenceCountUtil.release(msg); + } +// super.channelRead(ctx, msg); + // ByteBuf buf = (ByteBuf)msg; +// byte[] req = new byte[buf.readableBytes()]; +// buf.readBytes(req); +// String body = new String(req, "UTF-8"); +// ByteBuf buf = (ByteBuf)msg; +// byte [] bytes = new byte[buf.readableBytes()]; +// buf.readBytes(bytes);//复制内容到字节数组bytes +// log.info("获取到的值: " + ExchangeStringUtil.bytesToHexString(bytes)); +// if (bytes.length != 0) { +//// receiveStr = receiveStr.replace("null", ""); +//// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 +//// log.info(ctx.channel().remoteAddress() + " " + ctx.channel().localAddress() + " 接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); +// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 +// receiveStr = receiveStr.replace("null", ""); +// log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); +// } + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + log.info("采集电表-数据读取接收完成: " + receiveStr); +// 把receiveStr的"null"值去掉 +// a9fec2c71f9002fefefefe6839025007000068810643c3bb446c338d16c2b8 +// A9 FE C2 C7 1F 90 02 FE FE FE FE 68 39 02 50 07 00 00 68 81 06 43 C3 5B 38 6C 33 21 16 F8 12 + if ((receiveStr.length() == 62)) { +// log.info(receiveStr); + analysisReceiveOrder485.analysisMeterOrder485(receiveStr,"","",""); // 解析电表 + receiveStr = ""; + num = num + 1; + Thread.sleep(600); + if (num > size - 1) { + num = 0; + receiveStr = null; + // 关闭连接 + ctx.close(); +// // 保持长连接,封装发送电表工具方法 update by ljf on 2021-01-26 +// SendOrderUtils.sendMeterOrder(deviceManageEntityList.get(num),num,IP,port,ctx); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + log.info("有指令下发退出定时采集DDC参数"); + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + // 封装发送电表工具方法 update by ljf on 2021-01-26 + SendOrderUtils.sendMeterOrder(deviceManageEntityList.get(num), num, IP, port, ctx); + // 1.创建将要写出的数据 + // fe fe fe fe 68 80 02 50 07 00 00 68 81 06 43 c3 8c 34 33 33 5c 16 +// String sendStr = "FEFEFE6880025007000068010243C3B216"; +// String collectionNum = deviceManageEntityList.get(num).getCollectionNum(); +// String sendStr = GetReadOrder485.createMeterOrder(IP, port, +// deviceManageEntityList.get(num).getDataCom(), collectionNum, "1"); +// ByteBuf buffer = getByteBuf(ctx, sendStr); +// // 2.发送数据 +// ctx.channel().writeAndFlush(buffer); +// log.info("客户端再次往服务端发送数据" + num); + } + } + } else if ((receiveStr.length() > 62)) { + receiveStr = null; + num = num + 1; + Thread.sleep(500); + if (num > size - 1) { + num = 0; + receiveStr = null; + // 关闭连接 + ctx.close(); +// // 保持长连接,封装发送电表工具方法 update by ljf on 2021-01-26 +// SendOrderUtils.sendMeterOrder(deviceManageEntityList.get(num),num,IP,port,ctx); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + log.info("有指令下发退出定时采集DDC参数"); + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + // 封装发送电表工具方法 update by ljf on 2021-01-26 + SendOrderUtils.sendMeterOrder(deviceManageEntityList.get(num), num, IP, port, ctx); + // 1.创建将要写出的数据 + // fe fe fe fe 68 80 02 50 07 00 00 68 81 06 43 c3 8c 34 33 33 5c 16 +// String sendStr = "FEFEFE6880025007000068010243C3B216"; +// String collectionNum = deviceManageEntityList.get(num).getCollectionNum(); +// String sendStr = GetReadOrder485.createMeterOrder(IP, port, +// deviceManageEntityList.get(num).getDataCom(), collectionNum, "1"); +// ByteBuf buffer = getByteBuf(ctx, sendStr); +// // 2.发送数据 +// ctx.channel().writeAndFlush(buffer); +// log.info("客户端再次往服务端发送数据" + num); + } + } + } + ctx.flush(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/primary/Clients.java b/user-service/src/main/java/com/mh/user/primary/Clients.java new file mode 100644 index 0000000..bd336a9 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/primary/Clients.java @@ -0,0 +1,70 @@ +package com.mh.user.primary; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.Socket; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * @author ljf + * @title : + * @description : 使用原生的socket + * @updateTime 2020-05-20 + * @throws : + */ +public class Clients { + + Socket socketServer; + ExecutorService executorService; + + public Clients() throws IOException { + socketServer = new Socket("192.168.1.222", 10001); + // 创建新的线程池 + executorService = Executors.newCachedThreadPool(); + executorService.execute(new ClientThread(socketServer)); + } + + class ClientThread extends Thread{ + Socket socket; + BufferedReader in; + PrintWriter out; + InputStreamReader keybox = new InputStreamReader(System.in); + BufferedReader br = new BufferedReader(keybox); + public ClientThread(Socket socket) throws IOException { + this.socket = socket; + /**用于读取客户端返回的信息**/ + in = new BufferedReader(new InputStreamReader(socket.getInputStream())); + out = new PrintWriter(socket.getOutputStream()); + } + @Override + public void run() { + try { + while(true){ + String str = br.readLine(); + out.println(str); + out.flush(); + System.out.println("服务器响应"+in.readLine()); + if(str.equals("bye")){ + break; + } + } + in.close(); + out.close(); + socket.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + } + + public static void main(String[] args) throws IOException { + new Clients(); + } + +} + diff --git a/user-service/src/main/java/com/mh/user/provide/ChillersProvider.java b/user-service/src/main/java/com/mh/user/provide/ChillersProvider.java new file mode 100644 index 0000000..d2fe310 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/provide/ChillersProvider.java @@ -0,0 +1,32 @@ +package com.mh.user.provide; + +import org.springframework.util.StringUtils; + +import java.util.Map; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-26 + * @throws : + */ +public class ChillersProvider { + + public String queryChillersByOther(Map param) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("select id, device_code, device_num, collection_num, register_address, register_name, function_code, digit, other_name," + + " data_com, last_value, last_time, create_time, update_time,ddc_addr, " + + " (select gateway_ip as IP from gateway_manage where data_com = c.data_com) as IP, " + + " (select port as port from gateway_manage where data_com = c.data_com) as port " + + " from chillers_register_address as c where c.grade = #{grade} "); + if (!StringUtils.isEmpty(param.get("ddcAddr"))) { + stringBuilder.append(" and ddc_addr = #{ddcAddr}"); + } +// stringBuilder.append(" order by c.id"); + // update by ljf on 2021-01-30 + stringBuilder.append(" order by device_code,register_address"); + return stringBuilder.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/provide/DeviceManageProvider.java b/user-service/src/main/java/com/mh/user/provide/DeviceManageProvider.java new file mode 100644 index 0000000..b312e3e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/provide/DeviceManageProvider.java @@ -0,0 +1,70 @@ +package com.mh.user.provide; + +import java.util.Map; + +/** + * @author ljf + * @title : + * @description : 设备管理动态sql语句拼接 + * @updateTime 2020-05-15 + * @throws : + */ +public class DeviceManageProvider { + + public String getDeviceByOthers(Map params){ + System.out.println(params.get("deviceNum")); + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select id, device_code, device_num, collection_num, data_com, initial_value, device_rate, price, param_id, " + + "param_name, device_caliber, last_value, last_date, communication_type, create_time, update_time, device_type, remark, " + + "grade from device_manage"); + if (params.get("deviceNum") != null && !params.get("deviceNum").equals("")){ + sqlStr.append(" where device_num = #{deviceNum}"); + } + return sqlStr.toString(); + } + +// -- 分页查询(通用型) +// select top pageSize * +// from (select row_number() +// over(order by sno asc) as rownumber,* +// from student) temp_row +// where rownumber>((pageIndex-1)*pageSize); + public String queryDeviceByOthers(Map params) { + System.out.println(params); + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select top " + params.get("size") + " * from (select row_number() over(order by id asc) as rowNumber, id, device_code, device_num, collection_num, data_com, initial_value, price, param_id, " + + "param_name, last_value, last_date, communication_type, device_type, remark, grade from device_manage "); + if (params.get("deviceNum") != null && !params.get("deviceNum").equals("")){ + sqlStr.append(" where device_num = #{deviceNum}"); + } + sqlStr.append(" ) temp_row where rowNumber > (("+ params.get("page") +"-1)*" + params.get("size") + ")"); + return sqlStr.toString(); + } + + public String queryDeviceByOthersCount(Map params) { + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select count(id) from device_manage "); + if (params.get("deviceNum") != null && !params.get("deviceNum").equals("")){ + sqlStr.append(" where device_num = #{deviceNum}"); + } + return sqlStr.toString(); + } + + /** + * 删除设备信息 + * @param params + * @return + */ + public String deleteDeviceInfo(Map params){ + StringBuffer sqlStr = new StringBuffer(); + if(params.get("deviceType").equals("gateWay")){ + sqlStr.append("delete gateway_manage where gateway_id = #{deviceId}"); + } else if (params.get("deviceType").equals("baseMeterParam")){ + sqlStr.append("delete device_parameter where id = #{deviceId}"); + } else if (params.get("deviceType").equals("baseMeter")){ + sqlStr.append("delete device_manage where id = #{deviceId}"); + } + return sqlStr.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/provide/DeviceParamProvider.java b/user-service/src/main/java/com/mh/user/provide/DeviceParamProvider.java new file mode 100644 index 0000000..a34887a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/provide/DeviceParamProvider.java @@ -0,0 +1,45 @@ +package com.mh.user.provide; + +import java.util.Map; + +/** + * @author ljf + * @title : + * @description :网关管理提供类 + * @updateTime 2020-05-21 + * @throws : + */ +public class DeviceParamProvider { + + + public String getBaseMeterParamList(Map params){ + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select id,param_id,param_name,param_baudrate,grade,checks from device_parameter"); + if (params.get("baseMeterType") != null && !params.get("baseMeterType").equals("")){ + sqlStr.append(" where param_name like '%${baseMeterType}%'"); + } + return sqlStr.toString(); + } + + public String queryByOther(Map params) { + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select top " + params.get("size") + " * from (select row_number() over(order by id asc) as rowNumber, id, " + + "param_id, param_name, param_baudrate, grade, checks from device_parameter "); + if (params.get("gatewayID") != null && !params.get("gatewayID").equals("")){ + sqlStr.append(" where gateway_id = #{gatewayID}"); + } + sqlStr.append(" ) temp_row where rowNumber > (("+ params.get("page") +"-1)*" + params.get("size") + ")"); + return sqlStr.toString(); + } + + public String queryByOtherCount(Map params) { + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select top " + params.get("size") + " * from (select row_number() over(order by id asc) as rowNumber, id, " + + "param_id, param_name, param_baudrate, grade, checks from device_parameter "); + if (params.get("gatewayID") != null && !params.get("gatewayID").equals("")){ + sqlStr.append(" where gateway_id = #{gatewayID}"); + } + return sqlStr.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/provide/ExceptionProvider.java b/user-service/src/main/java/com/mh/user/provide/ExceptionProvider.java new file mode 100644 index 0000000..f848015 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/provide/ExceptionProvider.java @@ -0,0 +1,44 @@ +package com.mh.user.provide; + +import com.mh.user.entity.ExceptionEntity; + +import java.util.Map; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-31 + * @throws : + */ +public class ExceptionProvider { + + public String queryException(ExceptionEntity exceptionEntity) { + + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select top " + exceptionEntity.getLimit() + " * from (select row_number() over(order by id desc) as rowNumber, id, register_name, create_time, last_value, remark, state from device_exception_alarm where 1 = 1 "); + if (exceptionEntity.getBeginTime() != null && exceptionEntity.getEndTime() != null){ + sqlStr.append(" and convert(varchar(10),create_time,23) >= convert(varchar(10),#{beginTime}) and convert(varchar(10),create_time,23) <= convert(varchar(10),#{endTime})"); + } + if (exceptionEntity.getProcess() != null) { + sqlStr.append(" and state = #{process} "); + } + sqlStr.append(" ) temp_row where rowNumber > (("+ exceptionEntity.getPage() +"-1)*" + exceptionEntity.getLimit() + ")"); + return sqlStr.toString(); + + } + + public String queryExceptionTotal(ExceptionEntity exceptionEntity) { + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select count(id) from device_exception_alarm where 1 = 1 "); + if (exceptionEntity.getBeginTime() != null && exceptionEntity.getEndTime() != null){ + sqlStr.append(" and convert(varchar(10),create_time,23) >= convert(varchar(10),#{beginTime}) and convert(varchar(10),create_time,23) <= convert(varchar(10),#{endTime})"); + } + if (exceptionEntity.getProcess() != null) { + sqlStr.append(" and state = #{process}"); + } + return sqlStr.toString(); + + } + +} diff --git a/user-service/src/main/java/com/mh/user/provide/GatewayManageProvider.java b/user-service/src/main/java/com/mh/user/provide/GatewayManageProvider.java new file mode 100644 index 0000000..5006395 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/provide/GatewayManageProvider.java @@ -0,0 +1,91 @@ +package com.mh.user.provide; + +import java.util.Map; + +/** + * @author ljf + * @title : + * @description :网关管理提供类 + * @updateTime 2020-05-21 + * @throws : + */ +public class GatewayManageProvider { + + public String queryAll(String gatewayID,String operator,String grade,int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from gateway_manage " + + " where 1=1 "); + if (gatewayID != null && !gatewayID.equals("")){ + sql.append(" AND id = #{gatewayID} "); + } + if (operator != null && !operator.equals("")){ + sql.append(" AND operator = #{operator} "); + } + if (grade != null && !grade.equals("")){ + sql.append(" AND grade = #{grade} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } + + System.out.println(sql.toString()); + return sql.toString(); + } + + //查询记录 + public String queryCount(String gatewayID,String operator,String grade){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from gateway_manage " + + " where 1=1 "); + if (gatewayID != null && !gatewayID.equals("")){ + sql.append(" AND id = #{gatewayID} "); + } + if (operator != null && !operator.equals("")){ + sql.append(" AND operator = #{operator} "); + } + if (grade != null && !grade.equals("")){ + sql.append(" AND grade = #{grade} "); + } + sql.append(" ) T "); + + System.out.println(sql.toString()); + return sql.toString(); + } + + public String queryByOther(Map params) { + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select id, gateway_name, gateway_ip, gateway_address, data_com, " + + "create_date, connect_date, internet_card, operator, gateway_port, grade from gateway_manage where 1=1 "); + if(params.get("grade") != null){ + sqlStr.append(" and grade = #{grade}"); + } + if(params.get("operator") != null){ + sqlStr.append(" and operator = #{operator}"); + } + sqlStr.append(" order by id"); +// sqlStr.append("select top " + params.get("size") + " * from (select row_number() over(order by id asc) as rowNumber, id, " + +// "gateway_id, gateway_name, gateway_ip, gateway_address, data_com, collection_loop, connect_date, internet_card, operator, port, grade from gateway_manage "); +// if (params.get("gatewayID") != null && !params.get("gatewayID").equals("")){ +// sqlStr.append(" where param_id = #{paramId}"); +// } +// sqlStr.append(" ) temp_row where rowNumber > (("+ params.get("page") +"-1)*" + params.get("size") + ")"); + return sqlStr.toString(); + } + + public String queryByOtherCount(Map params) { + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select top " + params.get("size") + " * from (select row_number() over(order by id asc) as rowNumber, id, " + + "gateway_name, gateway_ip, gateway_address, data_com, connect_date, internet_card, operator, gateway_port, grade from gateway_manage "); + if (params.get("paramId") != null && !params.get("paramId").equals("")){ + sqlStr.append(" where param_id = #{paramId}"); + } + return sqlStr.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/provide/GaugeProvider.java b/user-service/src/main/java/com/mh/user/provide/GaugeProvider.java new file mode 100644 index 0000000..88269f7 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/provide/GaugeProvider.java @@ -0,0 +1,26 @@ +package com.mh.user.provide; + +import java.util.ArrayList; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-08-07 + * @throws : + */ +public class GaugeProvider { + + /** + * type:分析图类型(0:当前制冷量,1:当前COP,2:运行功率,3:冷却水趋近度,4:当前频率,5:当前速度,6:功率,7:电流) + * deviceName:1号冷水机、2号冷水机、1~6号冷却泵、1~6号冷冻泵、1~11号冷却塔 + * @param type + * @param deviceName + * @return + */ + public String getGaugeData(String type, String deviceName) { + StringBuffer stringBuffer = new StringBuffer(); + return stringBuffer.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/security/GrantedAuthorityImpl.java b/user-service/src/main/java/com/mh/user/security/GrantedAuthorityImpl.java new file mode 100644 index 0000000..281e7df --- /dev/null +++ b/user-service/src/main/java/com/mh/user/security/GrantedAuthorityImpl.java @@ -0,0 +1,29 @@ +package com.mh.user.security; +import org.springframework.security.core.GrantedAuthority; + +/** + * 权限封装 + * @author Louis + * @date Jan 14, 2019 + */ +public class GrantedAuthorityImpl implements GrantedAuthority { + + private static final long serialVersionUID = 1L; + + private String authority; + + public GrantedAuthorityImpl(String authority) { + + this.authority = authority; + System.out.println("权限列表:"+authority); + } + + public void setAuthority(String authority) { + this.authority = authority; + } + + @Override + public String getAuthority() { + return this.authority; + } +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/security/JwtAuthenticatioToken.java b/user-service/src/main/java/com/mh/user/security/JwtAuthenticatioToken.java new file mode 100644 index 0000000..0d6701e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/security/JwtAuthenticatioToken.java @@ -0,0 +1,45 @@ +package com.mh.user.security; + +import java.util.Collection; + +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; + +/** + * 自定义令牌对象 + * @author Louis + * @date Jan 14, 2019 + */ +public class JwtAuthenticatioToken extends UsernamePasswordAuthenticationToken { + + private static final long serialVersionUID = 1L; + + private String token; + + public JwtAuthenticatioToken(Object principal, Object credentials){ + super(principal, credentials); + } + + public JwtAuthenticatioToken(Object principal, Object credentials, String token){ + super(principal, credentials); + this.token = token; + } + + public JwtAuthenticatioToken(Object principal, Object credentials, Collection authorities, String token) { + super(principal, credentials, authorities); + this.token = token; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + +} diff --git a/user-service/src/main/java/com/mh/user/security/JwtAuthenticationFilter.java b/user-service/src/main/java/com/mh/user/security/JwtAuthenticationFilter.java new file mode 100644 index 0000000..185df17 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/security/JwtAuthenticationFilter.java @@ -0,0 +1,35 @@ +package com.mh.user.security; + +import java.io.IOException; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import com.mh.user.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; + +/** + * 登录认证过滤器 + * @author Louis + * @date Jan 14, 2019 + */ +public class JwtAuthenticationFilter extends BasicAuthenticationFilter { + + + @Autowired + public JwtAuthenticationFilter(AuthenticationManager authenticationManager) { + super(authenticationManager); + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { + // 获取token, 并检查登录状态 + SecurityUtils.checkAuthentication(request); + chain.doFilter(request, response); + System.out.println("test3"); + } + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/security/JwtAuthenticationProvider.java b/user-service/src/main/java/com/mh/user/security/JwtAuthenticationProvider.java new file mode 100644 index 0000000..6e5ac3d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/security/JwtAuthenticationProvider.java @@ -0,0 +1,39 @@ +package com.mh.user.security; + +import com.mh.user.utils.PasswordEncoder; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; + +/** + * 身份验证提供者 + * @author Louis + * @date Jan 14, 2019 + */ +public class JwtAuthenticationProvider extends DaoAuthenticationProvider { + + public JwtAuthenticationProvider(UserDetailsService userDetailsService) { + setUserDetailsService(userDetailsService); + } + + @Override + protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) + throws AuthenticationException { + if (authentication.getCredentials() == null) { + logger.debug("Authentication failed: no credentials provided"); + throw new BadCredentialsException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); + } + + String presentedPassword = authentication.getCredentials().toString(); + String salt = ((JwtUserDetails) userDetails).getSalt(); + // 覆写密码验证逻辑 + if (!new PasswordEncoder(salt).matches(userDetails.getPassword(), presentedPassword)) { + logger.debug("Authentication failed: password does not match stored value"); + throw new BadCredentialsException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); + } + } + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/security/JwtUserDetails.java b/user-service/src/main/java/com/mh/user/security/JwtUserDetails.java new file mode 100644 index 0000000..82385a5 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/security/JwtUserDetails.java @@ -0,0 +1,74 @@ +package com.mh.user.security; +import java.util.Collection; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 安全用户模型 + * @author Louis + * @date Jan 14, 2019 + */ +public class JwtUserDetails implements UserDetails { + + private static final long serialVersionUID = 1L; + + private String username; + private String password; + private String salt; + private Collection authorities; + + JwtUserDetails(String username, String password, String salt, Collection authorities) { + this.username = username; + this.password = password; + this.salt = salt; + this.authorities = authorities; + } + + @Override + public String getUsername() { + return username; + } + + @JsonIgnore + @Override + public String getPassword() { + return password; + } + + public String getSalt() { + return salt; + } + + @Override + public Collection getAuthorities() { + return authorities; + } + + @JsonIgnore + @Override + public boolean isAccountNonExpired() { + return true; + } + + @JsonIgnore + @Override + public boolean isAccountNonLocked() { + return true; + } + + @JsonIgnore + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @JsonIgnore + @Override + public boolean isEnabled() { + return true; + } + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/security/UserDetailsServiceImpl.java b/user-service/src/main/java/com/mh/user/security/UserDetailsServiceImpl.java new file mode 100644 index 0000000..a0383bf --- /dev/null +++ b/user-service/src/main/java/com/mh/user/security/UserDetailsServiceImpl.java @@ -0,0 +1,41 @@ +package com.mh.user.security; + +import com.mh.user.model.SysUser; +import com.mh.user.service.SysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 用户登录认证信息查询 + * @author Louis + * @date Jan 14, 2019 + */ +@Service +public class UserDetailsServiceImpl implements UserDetailsService { + + @Autowired(required = false) + private SysUserService sysUserService; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + System.out.println("test1"); + SysUser user = sysUserService.findByName(username); + if (user == null) { + throw new UsernameNotFoundException("该用户不存在"); + } + // 用户权限列表,根据用户拥有的权限标识与如 @PreAuthorize("hasAuthority('sys:menu:view')") 标注的接口对比,决定是否可以调用接口 + Set permissions = sysUserService.findPermissions(user.getUserName()); + List grantedAuthorities = permissions.stream().map(GrantedAuthorityImpl::new).collect(Collectors.toList()); + System.out.println("获取权限列表"+grantedAuthorities); + System.out.println(user.getUserName()); + return new JwtUserDetails(user.getUserName(), user.getPassword(), user.getSalt(), grantedAuthorities); + } +} diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortListener.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortListener.java new file mode 100644 index 0000000..f911983 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortListener.java @@ -0,0 +1,161 @@ +package com.mh.user.serialport; + +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.utils.AnalysisReceiveOrder485; +import com.mh.user.utils.SendOrderUtils; +import com.mh.user.utils.SpringBeanUtil; +import gnu.io.SerialPort; +import gnu.io.SerialPortEvent; +import gnu.io.SerialPortEventListener; +import lombok.SneakyThrows; +import org.springframework.context.ApplicationContext; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 串口监听器 + * @author mar + * @date 2021年08月10日 09:56 + */ +public class SerialPortListener implements SerialPortEventListener { + + private String receiveStr = null; +// public static SerialPort serialPort = null; + public SerialPort serialPort = null; + private int num = 0; + private int size = 0; + List deviceManageEntityList; + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + + @SneakyThrows + @Override + public void serialEvent(SerialPortEvent arg0) { + if (arg0.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); +// byte[] bytes = serialPortUtil.readFromPort(serialPort); + byte[] bytes = serialPortUtil.readFromPort(SerialPortThread.serialPort); + String byteStr = new String(bytes, 0, bytes.length).trim(); + System.out.println("===========start==========="); + receiveStr = receiveStr + printHexString(bytes); + receiveStr = receiveStr.replace("null", ""); + receiveStr = receiveStr.replace(" ", ""); + System.out.println(new Date() + "【字节数组转16进制字符串】:" + receiveStr); + System.out.println("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + System.out.println("===========end==========="); + size = deviceManageEntityList.size(); + } + } + + public void serialPortSend(String comName){ + + //查看所有串口 + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + ArrayList port = serialPortUtil.findPort(); + System.out.println("发现全部串口:" + port); + if (port.contains(comName)){ + //打开该对应comName名字的串口 + if (serialPort != null) { //打开之前先关闭 + serialPortUtil.closePort(serialPort); + serialPort = null; + } + System.out.println("打开指定串口:" + comName); + serialPort = serialPortUtil.openPort(comName, 2400, SerialPort.DATABITS_8, SerialPort.PARITY_EVEN, SerialPort.PARITY_ODD); + //给对应的serialPort添加监听器 + serialPortUtil.addListener(serialPort, new SerialPortListener()); + try{ + //生成对应的采集指令 + deviceManageEntityList = deviceCodeParamService.queryCodeParam2(comName); + System.out.println("打印列表:"+deviceManageEntityList); + size = deviceManageEntityList.size(); +// SendOrderUtils.sendSerialPort(deviceManageEntityList.get(0), serialPort); + Thread.sleep(1000); + }catch (Exception e){ + e.printStackTrace(); + } + }else { + System.out.println("串口:"+comName+"不存在!" ); + } + } + + + /** + * 字节数组转16进制字符串 + * @param b 字节数组 + * @return 16进制字符串 + */ + public static String printHexString(byte[] b) { + StringBuilder sbf = new StringBuilder(); + for (byte value : b) { + String hex = Integer.toHexString(value & 0xFF); + if (hex.length() == 1) { + hex = '0' + hex; + } + sbf.append(hex.toUpperCase()).append(" "); + } + return sbf.toString().trim(); + } + + /** + * 十六进制字符串转byte[] + * @param hex 十六进制字符串 + * @return byte[] + */ + public static byte[] hexStr2Byte(String hex) { + if (hex == null) { + return new byte[] {}; + } + + // 奇数位补0 + if (hex.length() % 2 != 0) { + hex = "0" + hex; + } + + int length = hex.length(); + ByteBuffer buffer = ByteBuffer.allocate(length / 2); + for (int i = 0; i < length; i++) { + String hexStr = hex.charAt(i) + ""; + i++; + hexStr += hex.charAt(i); + byte b = (byte) Integer.parseInt(hexStr, 16); + buffer.put(b); + } + return buffer.array(); + } + + /** + * 16进制转换成为string类型字符串 + * @param s 待转换字符串 + */ + public static String hexStringToString(String s) { + if (s == null || "".equals(s)) { + return null; + } + s = s.replace(" ", ""); + byte[] baKeyword = new byte[s.length() / 2]; + for (int i = 0; i < baKeyword.length; i++) { + try { + baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); + } catch (Exception e) { + e.printStackTrace(); + } + } + try { + s = new String(baKeyword, StandardCharsets.UTF_8); + } catch (Exception e1) { + e1.printStackTrace(); + } + return s; + } + +} + + + diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive.java new file mode 100644 index 0000000..80ce0c0 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive.java @@ -0,0 +1,306 @@ +package com.mh.user.serialport; + +import com.mh.user.constants.Constant; +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.service.BuildingService; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.service.DeviceInstallService; +import com.mh.user.service.NowDataService; +import com.mh.user.utils.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; +import gnu.io.SerialPort; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author nxr + * @title : + * @description : 串口发送和接收处理,采集类 + * @updateTime 2022-08-10 + * @throws : + */ +@Slf4j +public class SerialPortSendReceive { + + private String receiveStr = null; + public SerialPort serialPort = null; + private int size = 0; + private int baudrate=9600; + private String parity=null; + List deviceManageEntityList; + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); + DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class); + NowDataService nowDataService = context.getBean(NowDataService.class); + BuildingService buildingService = context.getBean(BuildingService.class); + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + + public void serialPortSend(String sort,String thread) { + //查看所有串口 + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + ArrayList port = serialPortUtil.findPort(); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = df.format(date); + +// SerialTool serialPortUtil = SerialTool.getSerialPortUtil(); +// ArrayList port = serialPortUtil.findPort(); +// comName=comName.toUpperCase(); //转为大写 +// if (port.contains(comName)){ + try{ + //生成对应的采集指令 + if (sort.equals("1")){ //水温、水位 + deviceManageEntityList = deviceCodeParamService.queryCodeParam3(thread); + }else if (sort.equals("2")){ //采集水、电、运行状态! + deviceManageEntityList = deviceCodeParamService.queryCodeParam4(thread); + }else if (sort.equals("3")){ //采集设定温度、设定水位、故障状态! + deviceManageEntityList = deviceCodeParamService.queryCodeParam5(thread); + }else{ + deviceManageEntityList = deviceCodeParamService.queryCodeParam3(thread); + } + size = deviceManageEntityList.size(); + for (int i=0;i8){ + String str1=receiveData.substring(0,8); + String str2=receiveData.substring(8); + dataStr=str1.replace("FE", "")+str2; + }else{ + dataStr = receiveData.replace("FE", ""); + } + deviceInstallService.updateOnline(deviceAddr,deviceType,buildingId,"在线"); //设备在线 + log.info("----------------"+deviceType+"在线,设备号:"+deviceAddr+",所属楼栋:"+buildingName+"----------------"); + if (deviceType.equals("热泵")){ + String strState=nowDataService.selectState(buildingId,deviceAddr); + if (strState!=null && strState.equals("离线")){ //采集到数据 + nowDataService.updateRunState(buildingId,deviceAddr,"不运行"); //监控界面状态表热泵在线状态 + } + } + try{ + if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length()==40 || dataStr.length()==50) && deviceType.equals("电表")) { + analysisReceiveOrder485.analysisMeterOrder485(dataStr,registerAddr,brand,buildingId); + nowDataService.proWaterLevel(dateStr,buildingId); //保存时间点楼栋水位 + }else if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) { + analysisReceiveOrder485.analysisWtMeterOrder485(dataStr,registerAddr,brand,buildingId); + }else if (deviceType.equals("压变")) { + analysisReceiveOrder485.analysisPressureOrder485(dataStr,registerAddr,brand,buildingId); + }else if (deviceType.equals("热泵")) { + analysisReceiveOrder485.analysisPumpOrder485(dataStr,registerAddr,brand,buildingId); + }else if (deviceType.equals("温控")) { + analysisReceiveOrder485.analysisTempOrder485(dataStr,registerAddr,brand,buildingId); + }else if (deviceType.equals("时控")) { + analysisReceiveOrder485.analysisTimeSetOrder485(dataStr,registerAddr,brand,buildingId); + }else if (deviceType.equals("水位开关") && (registerAddr.equals("0018") || registerAddr.equals("0017"))){ + analysisReceiveOrder485.analysisRelayOrder485(dataStr,registerAddr,brand,buildingId); + }else if (dataStr.length() == 30 && deviceType.equals("状态检测")) {//五路状态读取,兼容旧版系统 + analysisReceiveOrder485.analysisStateOrder485(dataStr,registerAddr,brand,buildingId); + }else if (deviceType.equals("水位开关") && registerAddr.equals("0010")){ + analysisReceiveOrder485.analysisPumpStateOrder(dataStr,registerAddr,brand,buildingId); //创新,热泵状态与水位共用一个8路设备 +// analysisReceiveOrder485.analysisRelayOrder485(dataStr,registerAddr,brand,buildingId); //华厦 + nowDataService.proWaterLevel(dateStr,buildingId); //保存时间点楼栋水位 + }else if (deviceType.equals("温度变送器")){ + analysisReceiveOrder485.analysisMulTempOrder485(dataStr,registerAddr,brand,buildingId); + }else if (deviceType.equals("热泵状态")){ + analysisReceiveOrder485.analysisPumpStateOrder(dataStr,registerAddr,brand,buildingId); + } + }catch (Exception e){ +// e.printStackTrace(); + Constant.WEB_FLAG=false;//可以采集的状态 + if(i==size-1){ + Constant.FLAG=false; + } + log.error(deviceManageEntityList.get(i).getDeviceType()+"保存数据库失败!"+i); + } + Thread.sleep(1000); + }else{ + Constant.WEB_FLAG=false;//可以采集的状态 + if(i==size-1){ + Constant.FLAG=false; + } + log.info("-------------串口:"+comName+"不存在!-------------"); + } + if(i==size-1){ + Constant.FLAG=false; + log.info("-------------一轮采集完,采集标志Constant.Flag="+Constant.FLAG+"-------------"); + } + } + }catch (Exception e){ + e.printStackTrace(); + Constant.WEB_FLAG=false;//可以采集的状态 + Constant.FLAG=false; + log.error("-------------串口采集异常!-------------"); + } +// }else { +// log.info("串口:"+comName+"不存在!"); +// } + } + /** + * 字节数组转16进制字符串 + * @param b 字节数组 + * @return 16进制字符串 + */ + public static String printHexString(byte[] b) { + StringBuilder sbf = new StringBuilder(); + for (byte value : b) { + String hex = Integer.toHexString(value & 0xFF); + if (hex.length() == 1) { + hex = '0' + hex; + } + sbf.append(hex.toUpperCase()).append(" "); + } + return sbf.toString().trim(); + } + + /** + * 十六进制字符串转byte[] + * @param hex 十六进制字符串 + * @return byte[] + */ + public static byte[] hexStr2Byte(String hex) { + if (hex == null) { + return new byte[] {}; + } + + // 奇数位补0 + if (hex.length() % 2 != 0) { + hex = "0" + hex; + } + + int length = hex.length(); + ByteBuffer buffer = ByteBuffer.allocate(length / 2); + for (int i = 0; i < length; i++) { + String hexStr = hex.charAt(i) + ""; + i++; + hexStr += hex.charAt(i); + byte b = (byte) Integer.parseInt(hexStr, 16); + buffer.put(b); + } + return buffer.array(); + } + + /** + * 16进制转换成为string类型字符串 + * @param s 待转换字符串 + */ + public static String hexStringToString(String s) { + if (s == null || "".equals(s)) { + return null; + } + s = s.replace(" ", ""); + byte[] baKeyword = new byte[s.length() / 2]; + for (int i = 0; i < baKeyword.length; i++) { + try { + baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); + } catch (Exception e) { + e.printStackTrace(); + } + } + try { + s = new String(baKeyword, StandardCharsets.UTF_8); + } catch (Exception e1) { + e1.printStackTrace(); + } + return s; + } +} diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java new file mode 100644 index 0000000..55616e4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java @@ -0,0 +1,305 @@ +package com.mh.user.serialport; + +import com.mh.user.constants.Constant; +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.service.BuildingService; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.service.DeviceInstallService; +import com.mh.user.service.NowDataService; +import com.mh.user.utils.AnalysisReceiveOrder485; +import com.mh.user.utils.ExchangeStringUtil; +import com.mh.user.utils.SendOrderUtils; +import com.mh.user.utils.SpringBeanUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; +import purejavacomm.SerialPort; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @author nxr + * @title : + * @description : 串口发送和接收处理,采集类 + * @updateTime 2022-08-10 + * @throws : + */ +@Slf4j +public class SerialPortSendReceive2 { + + private String receiveStr = null; +// public SerialPort serialPort = null; + private int size = 0; + private int baudrate=9600; + private String parity=null; + List deviceManageEntityList; + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); + DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class); + NowDataService nowDataService = context.getBean(NowDataService.class); + BuildingService buildingService = context.getBean(BuildingService.class); + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + + public void serialPortSend(String sort,String thread) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = df.format(date); + SerialPort serialPort = null; + +// if (port.contains(comName)){ + try{ + //生成对应的采集指令 + if (sort.equals("1")){ //水温、水位 + deviceManageEntityList = deviceCodeParamService.queryCodeParam3(thread); + }else if (sort.equals("2")){ //采集水、电、运行状态! + deviceManageEntityList = deviceCodeParamService.queryCodeParam4(thread); + }else if (sort.equals("3")){ //采集设定温度、设定水位、故障状态! + deviceManageEntityList = deviceCodeParamService.queryCodeParam5(thread); + }else{ + deviceManageEntityList = deviceCodeParamService.queryCodeParam3(thread); + } + size = deviceManageEntityList.size(); + for (int i=0;i8){ + String str1=receiveData.substring(0,8); + String str2=receiveData.substring(8); + dataStr=str1.replace("FE", "")+str2; + }else{ + dataStr = receiveData.replace("FE", ""); + } + deviceInstallService.updateOnline(deviceAddr,deviceType,buildingId,"在线"); //设备在线 + log.info("----------------"+deviceType+"在线,设备号:"+deviceAddr+",所属楼栋:"+buildingName+"----------------"); + if (deviceType.equals("热泵")){ + String strState=nowDataService.selectState(buildingId,deviceAddr); + if (strState!=null && strState.equals("离线")){ //采集到数据 + nowDataService.updateRunState(buildingId,deviceAddr,"不运行"); //监控界面状态表热泵在线状态 + } + } + try{ + if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length()==40 || dataStr.length()==50) && deviceType.equals("电表")) { + analysisReceiveOrder485.analysisMeterOrder485(dataStr,registerAddr,brand,buildingId); + nowDataService.proWaterLevel(dateStr,buildingId); //保存时间点楼栋水位 + }else if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) { + analysisReceiveOrder485.analysisWtMeterOrder485(dataStr,registerAddr,brand,buildingId); + }else if (deviceType.equals("压变")) { + analysisReceiveOrder485.analysisPressureOrder485(dataStr,registerAddr,brand,buildingId); + }else if (deviceType.equals("热泵")) { + analysisReceiveOrder485.analysisPumpOrder485(dataStr,registerAddr,brand,buildingId); + }else if (deviceType.equals("温控")) { + analysisReceiveOrder485.analysisTempOrder485(dataStr,registerAddr,brand,buildingId); + }else if (deviceType.equals("时控")) { + analysisReceiveOrder485.analysisTimeSetOrder485(dataStr,registerAddr,brand,buildingId); + }else if (deviceType.equals("水位开关") && (registerAddr.equals("0018") || registerAddr.equals("0017"))){ + analysisReceiveOrder485.analysisRelayOrder485(dataStr,registerAddr,brand,buildingId); + }else if (dataStr.length() == 30 && deviceType.equals("状态检测")) {//五路状态读取,兼容旧版系统 + analysisReceiveOrder485.analysisStateOrder485(dataStr,registerAddr,brand,buildingId); + }else if (deviceType.equals("水位开关") && registerAddr.equals("0010")){ + analysisReceiveOrder485.analysisPumpStateOrder(dataStr,registerAddr,brand,buildingId); //创新,热泵状态与水位共用一个8路设备 +// analysisReceiveOrder485.analysisRelayOrder485(dataStr,registerAddr,brand,buildingId); //华厦 + nowDataService.proWaterLevel(dateStr,buildingId); //保存时间点楼栋水位 + }else if (deviceType.equals("温度变送器")){ + analysisReceiveOrder485.analysisMulTempOrder485(dataStr,registerAddr,brand,buildingId); + }else if (deviceType.equals("热泵状态")){ + analysisReceiveOrder485.analysisPumpStateOrder(dataStr,registerAddr,brand,buildingId); + } + }catch (Exception e){ +// e.printStackTrace(); + Constant.WEB_FLAG=false;//可以采集的状态 + if(i==size-1){ + Constant.FLAG=false; + } + log.error(deviceManageEntityList.get(i).getDeviceType()+"保存数据库失败!"+i); + } + Thread.sleep(1000); + }else{ + Constant.WEB_FLAG=false;//可以采集的状态 + if(i==size-1){ + Constant.FLAG=false; + } + log.info("-------------串口:"+comName+"不存在!-------------"); + } + if(i==size-1){ + Constant.FLAG=false; + log.info("-------------一轮采集完,采集标志Constant.Flag="+Constant.FLAG+"-------------"); + } + } + }catch (Exception e){ + e.printStackTrace(); + Constant.WEB_FLAG=false;//可以采集的状态 + Constant.FLAG=false; + log.error("-------------串口采集异常!-------------"); + } +// }else { +// log.info("串口:"+comName+"不存在!"); +// } + } + /** + * 字节数组转16进制字符串 + * @param b 字节数组 + * @return 16进制字符串 + */ + public static String printHexString(byte[] b) { + StringBuilder sbf = new StringBuilder(); + for (byte value : b) { + String hex = Integer.toHexString(value & 0xFF); + if (hex.length() == 1) { + hex = '0' + hex; + } + sbf.append(hex.toUpperCase()).append(" "); + } + return sbf.toString().trim(); + } + + /** + * 十六进制字符串转byte[] + * @param hex 十六进制字符串 + * @return byte[] + */ + public static byte[] hexStr2Byte(String hex) { + if (hex == null) { + return new byte[] {}; + } + + // 奇数位补0 + if (hex.length() % 2 != 0) { + hex = "0" + hex; + } + + int length = hex.length(); + ByteBuffer buffer = ByteBuffer.allocate(length / 2); + for (int i = 0; i < length; i++) { + String hexStr = hex.charAt(i) + ""; + i++; + hexStr += hex.charAt(i); + byte b = (byte) Integer.parseInt(hexStr, 16); + buffer.put(b); + } + return buffer.array(); + } + + /** + * 16进制转换成为string类型字符串 + * @param s 待转换字符串 + */ + public static String hexStringToString(String s) { + if (s == null || "".equals(s)) { + return null; + } + s = s.replace(" ", ""); + byte[] baKeyword = new byte[s.length() / 2]; + for (int i = 0; i < baKeyword.length; i++) { + try { + baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); + } catch (Exception e) { + e.printStackTrace(); + } + } + try { + s = new String(baKeyword, StandardCharsets.UTF_8); + } catch (Exception e1) { + e1.printStackTrace(); + } + return s; + } +} diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle.java new file mode 100644 index 0000000..82bc9d1 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle.java @@ -0,0 +1,210 @@ +package com.mh.user.serialport; + +import com.mh.user.constants.Constant; +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.service.BuildingService; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.service.DeviceInstallService; +import com.mh.user.service.NowDataService; +import com.mh.user.utils.AnalysisReceiveOrder485; +import com.mh.user.utils.SendOrderUtils; +import com.mh.user.utils.SpringBeanUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; +//import purejavacomm.SerialPort; +import gnu.io.SerialPort; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +/** + * @author nxr + * @title : + * @description : 串口发送和接收处理,操作类 + * @updateTime 2022-08-10 + * @throws : + */ +@Slf4j +public class SerialPortSingle { + + public SerialPort serialPort = null; + private String receiveStr = null; + private int baudrate=9600; + private String parity=null; + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + //DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class); + NowDataService nowDataService = context.getBean(NowDataService.class); + BuildingService buildingService = context.getBean(BuildingService.class); + public String serialPortSend(DeviceCodeParamEntity deviceCodeParamEntity){ + + //查看所有串口 + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + ArrayList port = serialPortUtil.findPort(); +// SerialTool serialPortUtil = SerialTool.getSerialPortUtil(); +// ArrayList port = serialPortUtil.findPort(); + String rtData=""; +// System.out.println("发现全部串口:" + port); + String comName=deviceCodeParamEntity.getDataCom().toUpperCase(); + if (port.contains(comName)){ + try{ + try{ + baudrate=deviceCodeParamEntity.getBaudrate(); + parity=deviceCodeParamEntity.getParity(); + if (parity==null || parity.equals("") || parity.equalsIgnoreCase("none")){ + serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_NONE, SerialPort.PARITY_ODD); + }else{ + serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_EVEN, SerialPort.PARITY_ODD); + } + //向串口发送指令 + log.info("-----------------------------单抄向串口"+serialPort+"发送指令!-----------------------------"); + SendOrderUtils.sendSerialPort(deviceCodeParamEntity, serialPort); + Thread.sleep(1500); + }catch(Exception e){ + + } + //对返回数据进行相关解析处理 + receiveStr=null; + byte[] bytes = serialPortUtil.readFromPort(serialPort); //读取串口数据 + try { + String byteStr = new String(bytes, 0, bytes.length).trim(); + receiveStr = receiveStr + printHexString(bytes); + //去掉空格和null + receiveStr = receiveStr.replace("null", ""); + receiveStr = receiveStr.replace(" ", ""); + log.info("串口"+serialPort+"接收数据:" + receiveStr + ",大小: " + receiveStr.length()); + } catch (NullPointerException e) { + serialPortUtil.closePort(serialPort); + log.info("单抄串口"+serialPort+"异常,没有数据返回!关闭串口"); + } + //返回值全部变成大写 + String receiveData = receiveStr.toUpperCase(); + //截取去掉FE + String dataStr = receiveData.replace("FE", ""); + String deviceType=deviceCodeParamEntity.getDeviceType(); + String deviceAddr=deviceCodeParamEntity.getDeviceAddr(); + String registerAddr=deviceCodeParamEntity.getRegisterAddr(); + String brand=deviceCodeParamEntity.getBrand(); + String buildingId=deviceCodeParamEntity.getBuildingId(); + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + + deviceInstallService.updateOnline(deviceAddr,deviceType,buildingId,"在线"); //设备在线 + log.info(deviceType+"在线,设备号:"+deviceAddr+",所属楼栋:"+buildingName); + if (deviceType.equals("热泵")){ + String strState=nowDataService.selectState(buildingId,deviceAddr); + if (strState!=null && strState.equals("离线")){ //采集到数据 + nowDataService.updateRunState(buildingId,deviceAddr,"不运行"); //监控界面状态表热泵在线状态 + } + } + try{ + if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) { + rtData=analysisReceiveOrder485.analysisWtMeterOrder4852(dataStr,registerAddr,brand,buildingId); + } else if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length()==40 || dataStr.length()==50) && deviceType.equals("电表")) { + rtData=analysisReceiveOrder485.analysisMeterOrder4852(dataStr,registerAddr,brand,buildingId); + } else if (deviceType.equals("压变")) { + rtData=analysisReceiveOrder485.analysisPressureOrder4852(dataStr,registerAddr,brand,buildingId); + } else if ((dataStr.length() == 30) && deviceType.equals("状态检测")) {//五路状态读取,兼容旧版系统 + analysisReceiveOrder485.analysisStateOrder485(dataStr,registerAddr,brand,buildingId); + } else if (deviceType.equals("水位开关") && (registerAddr.equals("0018") || registerAddr.equals("0017"))) { + rtData=analysisReceiveOrder485.analysisRelayOrder4852(dataStr,registerAddr,brand,buildingId); + } else if (deviceType.equals("热泵")) { + rtData=analysisReceiveOrder485.analysisPumpOrder4852(dataStr,registerAddr,brand,buildingId); + } else if (deviceType.equals("时控")) { + rtData=analysisReceiveOrder485.analysisTimeSetOrder4852(dataStr,registerAddr,brand,buildingId); + } else if (deviceType.equals("水位开关") && registerAddr.equals("0010")){ //热泵状态 + rtData=analysisReceiveOrder485.analysisPumpStateOrder2(dataStr,registerAddr,brand,buildingId); + } else if (deviceType.equals("温度变送器")) { + rtData=analysisReceiveOrder485.analysisMulTempOrder4852(dataStr,registerAddr,brand,buildingId); + } else if (deviceType.equals("热泵状态")){ + rtData=analysisReceiveOrder485.analysisPumpStateOrder2(dataStr,registerAddr,brand,buildingId); + } + }catch (Exception e){ + log.error(deviceCodeParamEntity.getDeviceType()+"单抄保存数据库失败!"); + serialPortUtil.closePort(serialPort); + } + serialPortUtil.closePort(serialPort); + System.out.println("关闭"+serialPort); + Thread.sleep(500); + log.info("-----------------------------"+serialPort+"单抄结束!-----------------------------"); + return rtData; + }catch (Exception e){ +// e.printStackTrace(); + } + }else { + log.info("串口:"+comName+"不存在!"); + } + return "fail"; + } + /** + * 字节数组转16进制字符串 + * @param b 字节数组 + * @return 16进制字符串 + */ + public static String printHexString(byte[] b) { + StringBuilder sbf = new StringBuilder(); + for (byte value : b) { + String hex = Integer.toHexString(value & 0xFF); + if (hex.length() == 1) { + hex = '0' + hex; + } + sbf.append(hex.toUpperCase()).append(" "); + } + return sbf.toString().trim(); + } + + /** + * 十六进制字符串转byte[] + * @param hex 十六进制字符串 + * @return byte[] + */ + public static byte[] hexStr2Byte(String hex) { + if (hex == null) { + return new byte[] {}; + } + + // 奇数位补0 + if (hex.length() % 2 != 0) { + hex = "0" + hex; + } + + int length = hex.length(); + ByteBuffer buffer = ByteBuffer.allocate(length / 2); + for (int i = 0; i < length; i++) { + String hexStr = hex.charAt(i) + ""; + i++; + hexStr += hex.charAt(i); + byte b = (byte) Integer.parseInt(hexStr, 16); + buffer.put(b); + } + return buffer.array(); + } + /** + * 16进制转换成为string类型字符串 + * @param s 待转换字符串 + */ + public static String hexStringToString(String s) { + if (s == null || "".equals(s)) { + return null; + } + s = s.replace(" ", ""); + byte[] baKeyword = new byte[s.length() / 2]; + for (int i = 0; i < baKeyword.length; i++) { + try { + baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); + } catch (Exception e) { + e.printStackTrace(); + } + } + try { + s = new String(baKeyword, StandardCharsets.UTF_8); + } catch (Exception e1) { + e1.printStackTrace(); + } + return s; + } +} diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java new file mode 100644 index 0000000..f529a58 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java @@ -0,0 +1,199 @@ +package com.mh.user.serialport; + +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.service.BuildingService; +import com.mh.user.service.DeviceInstallService; +import com.mh.user.service.NowDataService; +import com.mh.user.utils.AnalysisReceiveOrder485; +import com.mh.user.utils.SendOrderUtils; +import com.mh.user.utils.SpringBeanUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import purejavacomm.SerialPort; + +/** + * @author nxr + * @title : + * @description : 串口发送和接收处理,操作类 + * @updateTime 2022-08-10 + * @throws : + */ +@Slf4j +public class SerialPortSingle2 { + + private String receiveStr = null; + private int baudrate=9600; + private String parity=null; + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class); + NowDataService nowDataService = context.getBean(NowDataService.class); + BuildingService buildingService = context.getBean(BuildingService.class); + public String serialPortSend(DeviceCodeParamEntity deviceCodeParamEntity){ + SerialPort serialPort = null; + String rtData=""; + String comName=deviceCodeParamEntity.getDataCom().toUpperCase(); + //if (port.contains(comName)){ + try{ + try{ + baudrate=deviceCodeParamEntity.getBaudrate(); + parity=deviceCodeParamEntity.getParity(); + if (parity==null || parity.equals("") || parity.equalsIgnoreCase("none")){ + serialPort = SerialTool.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); + }else{ + serialPort = SerialTool.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_EVEN); + } + //向串口发送指令 + log.info("-----------------------------单抄向串口"+serialPort+"发送指令!-----------------------------"); + if (serialPort != null) { + String sendStr=SendOrderUtils.getSendStr(deviceCodeParamEntity); + SerialTool.sendToPort(SerialTool.HexString2Bytes(sendStr), serialPort,sendStr,deviceCodeParamEntity.getDeviceType()); + Thread.sleep(1500); + } + }catch(Exception e){ + e.printStackTrace(); + } + //对返回数据进行相关解析处理 + receiveStr=null; + byte[] bytes = SerialTool.readFromPort(serialPort); //读取串口数据 + try { + String byteStr = new String(bytes, 0, bytes.length).trim(); + receiveStr = receiveStr + printHexString(bytes); + //去掉空格和null + receiveStr = receiveStr.replace("null", ""); + receiveStr = receiveStr.replace(" ", ""); + log.info("串口"+serialPort+"接收数据:" + receiveStr + ",大小: " + receiveStr.length()); + } catch (NullPointerException e) { + SerialTool.closePort(serialPort); + log.info("单抄串口"+serialPort+"异常,没有数据返回!关闭串口"); + } + //返回值全部变成大写 + String receiveData = receiveStr.toUpperCase(); + //截取去掉FE + String dataStr = receiveData.replace("FE", ""); + String deviceType=deviceCodeParamEntity.getDeviceType(); + String deviceAddr=deviceCodeParamEntity.getDeviceAddr(); + String registerAddr=deviceCodeParamEntity.getRegisterAddr(); + String brand=deviceCodeParamEntity.getBrand(); + String buildingId=deviceCodeParamEntity.getBuildingId(); + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + + deviceInstallService.updateOnline(deviceAddr,deviceType,buildingId,"在线"); //设备在线 + log.info(deviceType+"在线,设备号:"+deviceAddr+",所属楼栋:"+buildingName); + if (deviceType.equals("热泵")){ + String strState=nowDataService.selectState(buildingId,deviceAddr); + if (strState!=null && strState.equals("离线")){ //采集到数据 + nowDataService.updateRunState(buildingId,deviceAddr,"不运行"); //监控界面状态表热泵在线状态 + } + } + try{ + if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) { + rtData=analysisReceiveOrder485.analysisWtMeterOrder4852(dataStr,registerAddr,brand,buildingId); + } else if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length()==40 || dataStr.length()==50) && deviceType.equals("电表")) { + rtData=analysisReceiveOrder485.analysisMeterOrder4852(dataStr,registerAddr,brand,buildingId); + } else if (deviceType.equals("压变")) { + rtData=analysisReceiveOrder485.analysisPressureOrder4852(dataStr,registerAddr,brand,buildingId); + } else if ((dataStr.length() == 30) && deviceType.equals("状态检测")) {//五路状态读取,兼容旧版系统 + analysisReceiveOrder485.analysisStateOrder485(dataStr,registerAddr,brand,buildingId); + } else if (deviceType.equals("水位开关") && (registerAddr.equals("0018") || registerAddr.equals("0017"))) { + rtData=analysisReceiveOrder485.analysisRelayOrder4852(dataStr,registerAddr,brand,buildingId); + } else if (deviceType.equals("热泵")) { + rtData=analysisReceiveOrder485.analysisPumpOrder4852(dataStr,registerAddr,brand,buildingId); + } else if (deviceType.equals("时控")) { + rtData=analysisReceiveOrder485.analysisTimeSetOrder4852(dataStr,registerAddr,brand,buildingId); + } else if (deviceType.equals("水位开关") && registerAddr.equals("0010")){ //热泵状态 + rtData=analysisReceiveOrder485.analysisPumpStateOrder2(dataStr,registerAddr,brand,buildingId); + } else if (deviceType.equals("温度变送器")) { + rtData=analysisReceiveOrder485.analysisMulTempOrder4852(dataStr,registerAddr,brand,buildingId); + } else if (deviceType.equals("热泵状态")){ + rtData=analysisReceiveOrder485.analysisPumpStateOrder2(dataStr,registerAddr,brand,buildingId); + } + }catch (Exception e){ + log.error(deviceCodeParamEntity.getDeviceType()+"单抄保存数据库失败!"); + SerialTool.closePort(serialPort); + } + SerialTool.closePort(serialPort); + System.out.println("关闭"+serialPort); + Thread.sleep(500); + log.info("-----------------------------"+serialPort+"单抄结束!-----------------------------"); + return rtData; + }catch (Exception e){ +// e.printStackTrace(); + } + //}else { + //log.info("串口:"+comName+"不存在!"); + //} + return "fail"; + } + /** + * 字节数组转16进制字符串 + * @param b 字节数组 + * @return 16进制字符串 + */ + public static String printHexString(byte[] b) { + StringBuilder sbf = new StringBuilder(); + for (byte value : b) { + String hex = Integer.toHexString(value & 0xFF); + if (hex.length() == 1) { + hex = '0' + hex; + } + sbf.append(hex.toUpperCase()).append(" "); + } + return sbf.toString().trim(); + } + + /** + * 十六进制字符串转byte[] + * @param hex 十六进制字符串 + * @return byte[] + */ + public static byte[] hexStr2Byte(String hex) { + if (hex == null) { + return new byte[] {}; + } + + // 奇数位补0 + if (hex.length() % 2 != 0) { + hex = "0" + hex; + } + + int length = hex.length(); + ByteBuffer buffer = ByteBuffer.allocate(length / 2); + for (int i = 0; i < length; i++) { + String hexStr = hex.charAt(i) + ""; + i++; + hexStr += hex.charAt(i); + byte b = (byte) Integer.parseInt(hexStr, 16); + buffer.put(b); + } + return buffer.array(); + } + /** + * 16进制转换成为string类型字符串 + * @param s 待转换字符串 + */ + public static String hexStringToString(String s) { + if (s == null || "".equals(s)) { + return null; + } + s = s.replace(" ", ""); + byte[] baKeyword = new byte[s.length() / 2]; + for (int i = 0; i < baKeyword.length; i++) { + try { + baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); + } catch (Exception e) { + e.printStackTrace(); + } + } + try { + s = new String(baKeyword, StandardCharsets.UTF_8); + } catch (Exception e1) { + e1.printStackTrace(); + } + return s; + } +} diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortThread.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortThread.java new file mode 100644 index 0000000..9d08947 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortThread.java @@ -0,0 +1,32 @@ +package com.mh.user.serialport; + +import gnu.io.SerialPort; +import lombok.extern.slf4j.Slf4j; + +/** + * @author nxr + * @title : + * @description : 串口线程处理 + * @updateTime 2022-08-10 + * @throws : + */ +@Slf4j +public class SerialPortThread implements Runnable{ + + private String thread = "1"; + public static SerialPort serialPort = null; + private String name; + // 调用service + //ApplicationContext context = SpringBeanUtil.getApplicationContext(); + + public void setName(String name,String thread){ + this.name = name; + this.thread=thread; + } + + public void run(){ + SerialPortSendReceive2 serial=new SerialPortSendReceive2(); + serial.serialPortSend(name,thread); + log.info("创建发送接收数据线程>>>>>>>>>>>>>>"+thread); + } +} diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortUtil.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortUtil.java new file mode 100644 index 0000000..e194d3f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortUtil.java @@ -0,0 +1,262 @@ +package com.mh.user.serialport; + +import gnu.io.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.TooManyListenersException; + +/** + * @description : 串口工具类(RXTXcomm.jar、rxtxParallel.dll和rxtxSerial.dll) + * @author nxr + * @date 2022年08月10日 09:54 + */ +public class SerialPortUtil { + + private static final Logger logger = LoggerFactory.getLogger(SerialPortUtil.class); + + private static SerialPortUtil serialPortUtil = null; + + static { + //在该类被ClassLoader加载时就初始化一个SerialTool对象 + if (serialPortUtil == null) { + serialPortUtil = new SerialPortUtil(); + } + } + + //私有化SerialTool类的构造方法,不允许其他类生成SerialTool对象 + private SerialPortUtil() { + } + + /** + * 获取提供服务的SerialTool对象 + * @return serialPortUtil + */ + public static SerialPortUtil getSerialPortUtil() { + if (serialPortUtil == null) { + serialPortUtil = new SerialPortUtil(); + } + return serialPortUtil; + } + + /** + * 查找所有可用端口 + * @return 可用端口名称列表 + */ + public ArrayList findPort() { + //获得当前所有可用串口 + Enumeration portList = CommPortIdentifier.getPortIdentifiers(); + ArrayList portNameList = new ArrayList<>(); + //将可用串口名添加到List并返回该List + while (portList.hasMoreElements()) { + String portName = portList.nextElement().getName(); + portNameList.add(portName); + } + return portNameList; + } + + /** + * 打开串口 + * @param portName 端口名称 + * @param baudrate 波特率 19200 + * @param databits 数据位 8 + * @param parity 校验位(奇偶位) NONE :0 + * @param stopbits 停止位 1 + * @return 串口对象 + * // * @throws SerialPortParameterFailure 设置串口参数失败 + * // * @throws NotASerialPort 端口指向设备不是串口类型 + * // * @throws NoSuchPort 没有该端口对应的串口设备 + * // * @throws PortInUse 端口已被占用 + */ + public SerialPort openPort(String portName, int baudrate, int databits, int parity, int stopbits) { + try { + //通过端口名识别端口 + CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); + + //打开端口,并给端口名字和一个timeout(打开操作的超时时间) + CommPort commPort = portIdentifier.open(portName, 2000); + + //判断是不是串口 + if (commPort instanceof SerialPort) { + + SerialPort serialPort = (SerialPort) commPort; + try { + //设置一下串口的波特率等参数 + serialPort.setSerialPortParams(baudrate, databits, stopbits, parity); + } catch (UnsupportedCommOperationException e) { + } + System.out.println("Open " + portName + " successfully !"); + return serialPort; + } else { + logger.error("不是串口"); + } + } catch (NoSuchPortException e1) { + logger.error("没有找到端口"); +// e1.printStackTrace(); + } catch (PortInUseException e2) { + logger.error("端口被占用"); +// e2.printStackTrace(); + } + return null; + } + + /** + * 关闭串口 + * @param serialPort 待关闭的串口对象 + */ + public void closePort(SerialPort serialPort) { + if (serialPort != null) { + serialPort.close(); +// serialPort=null; + } + } + + /** + * 往串口发送数据 + * @param serialPort 串口对象 + * @param order 待发送数据 + * // * @throws SendDataToSerialPortFailure 向串口发送数据失败 + * // * @throws SerialPortOutputStreamCloseFailure 关闭串口对象的输出流出错 + */ + public void sendToPort(SerialPort serialPort, byte[] order) { + OutputStream out = null; + try { + out = serialPort.getOutputStream(); + out.write(order); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 从串口读取数据 + * @param serialPort 当前已建立连接的SerialPort对象 + * @return 读取到的数据 + * // * @throws ReadDataFromSerialPortFailure 从串口读取数据时出错 + * // * @throws SerialPortInputStreamCloseFailure 关闭串口对象输入流出错 + */ + public byte[] readFromPort(SerialPort serialPort) { + + InputStream in = null; + byte[] bytes = null; + + try { + in = serialPort.getInputStream(); + int bufflenth = in.available(); + + while (bufflenth != 0) { + bytes = new byte[bufflenth]; + in.read(bytes); + bufflenth = in.available(); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return bytes; + +// InputStream in = null; +// byte[] bytes = {}; +// try { +// in = serialPort.getInputStream(); +// // 缓冲区大小为一个字节 +// byte[] readBuffer = new byte[1]; +// int bytesNum = 1; +// while (bytesNum > 0) { +// //如果缓冲区读取结束,且数组长度为7(防止串口数据发送缓慢读取到空数据),跳出循环 +// if (in.available() > 0) { +// bytesNum = in.read(readBuffer); +// bytes = ArrayUtils.concat(bytes, readBuffer); +// }else if(bytes.length==7){ +// break; +// } +// } +// } catch (IOException e) { +// new ReadDataFromSerialPortFailure().printStackTrace(); +// } finally { +// try { +// if (in != null) { +// in.close(); +// in = null; +// } +// } catch (IOException e) { +// new SerialPortInputStreamCloseFailure().printStackTrace(); +// } +// } +// return bytes; + } + + + /** + * 添加监听器 + * @param port 串口对象 + * @param listener 串口监听器 + * // * @throws TooManyListeners 监听类对象过多 + */ + public void addListener(SerialPort port, SerialPortEventListener listener) { + + try { + //给串口添加监听器 + port.addEventListener(listener); + //设置当有数据到达时唤醒监听接收线程 + port.notifyOnDataAvailable(true); + //设置当通信中断时唤醒中断线程 + port.notifyOnBreakInterrupt(true); + } catch (TooManyListenersException e) { +// throw new TooManyListeners(); + logger.error("太多监听器"); + e.printStackTrace(); + } + } + + /** + * 删除监听器 + * @param port 串口对象 + * @param listener 串口监听器 + * // * @throws TooManyListeners 监听类对象过多 + */ + public void removeListener(SerialPort port, SerialPortEventListener listener) { + //删除串口监听器 + port.removeEventListener(); + } + + /** + * 设置串口的Listener + * @author mar + * @date 2021/8/20 11:04 + * @param serialPort + * @param listener + */ + public static void setListenerToSerialPort(SerialPort serialPort, SerialPortEventListener listener){ + try { + //给串口添加事件监听 + serialPort.addEventListener(listener); + } catch (TooManyListenersException e) { + e.printStackTrace(); + } + //串口有数据监听 + serialPort.notifyOnDataAvailable(true); + //中断事件监听 + serialPort.notifyOnBreakInterrupt(true); + } +} diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialResquest.java b/user-service/src/main/java/com/mh/user/serialport/SerialResquest.java new file mode 100644 index 0000000..0a8b7a2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/serialport/SerialResquest.java @@ -0,0 +1,118 @@ +package com.mh.user.serialport; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import purejavacomm.SerialPort; +import purejavacomm.SerialPortEvent; +import purejavacomm.SerialPortEventListener; + +import java.io.IOException; + +/** + * @description : 串口发送和接收(驱动purejavacomm) + * @author nxr + * @date 2022年08月10日 09:54 + */ + +public class SerialResquest { + + private static Logger logger = LoggerFactory.getLogger(SerialResquest.class); + +// public static void resquest(String portName, Integer baudrate, Integer dataBits, Integer stopBits, +// Integer parity,byte[] data) throws Exception { +// SerialPort serialPort; +// if (!GlobalCache.smap.containsKey(portName)) { +// GlobalCache.bmap.put(portName, false); +// serialPort = SerialTool.openPort(portName, baudrate, dataBits, stopBits, parity); +// GlobalCache.smap.put(portName, serialPort); +// SerialTool.addListener(new SerialPortEventListener() { +// +// @Override +// public void serialEvent(SerialPortEvent event) { +// try { +// Thread.sleep(50); +// } catch (InterruptedException e1) { +// logger.error("SerialResquest 监听异常!"+e1); +// } +// switch (event.getEventType()) { +// case SerialPortEvent.DATA_AVAILABLE: +// byte[] readBuffer = null; +// int availableBytes = 0; +// try { +// availableBytes = serialPort.getInputStream().available(); +// if (availableBytes > 0) { +// try { +// readBuffer = SerialTool.readFromPort(serialPort); +// GlobalCache.bmap.put(portName, true); +// GlobalCache.dmap.put(portName, readBuffer); +// } catch (Exception e) { +// logger.error("读取推送信息异常!"+e); +// } +// } +// } catch (IOException e) { +// logger.error("读取流信息异常!"+e); +// } +// } +// } +// +// }, serialPort); +// }else { +// serialPort = GlobalCache.smap.get(portName); +// } +// SerialTool.sendToPort(data, serialPort); +// } +// +// public static byte[] response(String portName) throws InterruptedException { +// /*if (!GlobalCache.dmap.containsKey(portName)) { +// return null; +// }*/ +// Thread.sleep(100); +// int i =0; +// while (!GlobalCache.bmap.get(portName)) { +// Thread.sleep(100); +// if (i++>30) { +// return new byte[0]; +// } +// } +// GlobalCache.bmap.put(portName, false); +// return GlobalCache.dmap.get(portName); +// } +// +// public static void close(String portName) throws IOException { +// SerialTool.closePort(GlobalCache.smap.get(portName)); +// GlobalCache.smap.remove(portName); +// } + + public static short toShort(byte b1, byte b2) { + return (short) (b1 << 8 | b2 & 0xFF); + } + + private float bytes2Float(byte[] bytes) { + String BinaryStr = bytes2BinaryStr(bytes); + // 符号位S + Long s = Long.parseLong(BinaryStr.substring(0, 1)); + // 指数位E + Long e = Long.parseLong(BinaryStr.substring(1, 9), 2); + // 位数M + String M = BinaryStr.substring(9); + float m = 0, a, b; + for (int i = 0; i < M.length(); i++) { + a = Integer.valueOf(M.charAt(i) + ""); + b = (float) Math.pow(2, i + 1); + m = m + (a / b); + } + Float f = (float) ((Math.pow(-1, s)) * (1 + m) * (Math.pow(2, (e - 127)))); + return f; + } + + private static String bytes2BinaryStr(byte[] bytes) { + StringBuffer binaryStr = new StringBuffer(); + for (int i = 0; i < bytes.length; i++) { + String str = Integer.toBinaryString((bytes[i] & 0xFF) + 0x100).substring(1); + binaryStr.append(str); + } + return binaryStr.toString(); + } + +} + diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialTool.java b/user-service/src/main/java/com/mh/user/serialport/SerialTool.java new file mode 100644 index 0000000..b081a25 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/serialport/SerialTool.java @@ -0,0 +1,291 @@ +package com.mh.user.serialport; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import purejavacomm.*; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.TooManyListenersException; + +/** + * @Author : Rainbow + * @date : 2023/5/12 + */ +@Component +@Slf4j +public class SerialTool { + + /**公司电表波特率*/ + public static final int COMPANY_BIT_RATE = 1200; + /**主机波特率*/ + public static final int CHILLER_BIT_RATE = 9600; + /**现场电表等设备波特率-待定*/ + public static final int DEVICE_BIT_RATE = 2400; + /**现场冷量表设备波特率-待定*/ + public static final int CLOUD_BIT_RATE = 9600; + /**DDC波特率*/ + public static final int DDC_BIT_RATE = 9600; + /**数据位*/ + public static final int DATA_BITS = SerialPort.DATABITS_8; + public static final int STOP_BIT = SerialPort.STOPBITS_1; + /**公司电表校验位-偶校验*/ + public static final int COMPANY_PARITY_BIT = SerialPort.PARITY_EVEN; + /**冷量表校验位-偶校验*/ + public static final int CLOUD_PARITY_BIT = SerialPort.PARITY_NONE; + /**通用校验位,无校验*/ + public static final int COMMON_PARITY_BIT = SerialPort.PARITY_NONE; + + /** + * 查询并返回串口集合 + * + * @return + */ + public static List findPorts() { + Enumeration portList = CommPortIdentifier.getPortIdentifiers(); + ArrayList portNameList = new ArrayList<>(); + while (portList.hasMoreElements()) { + String portName = portList.nextElement().getName(); + portNameList.add(portName); + } + return portNameList; + } + + /** + * 打开串口 + * + * @param portName 端口名称 + * @param baudRate 波特率 + * @param dataBits 数据位 + * @param stopBits 停止位 + * @param parity 校验位 + * @return + */ + public static SerialPort openPort(String portName, Integer baudRate, Integer dataBits, Integer stopBits, Integer parity) throws Exception { + try { + //通过端口名识别端口 + CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); + + //打开串口,设置超时时间 + CommPort commPort = portIdentifier.open(portName, 2000); + + if (commPort instanceof SerialPort) { + SerialPort serialPort = (SerialPort) commPort; + try { + serialPort.setSerialPortParams(baudRate, dataBits, stopBits, parity); + log.info("串口: {} 打开成功",portName); + } catch (UnsupportedCommOperationException e) { + log.error("串口: {} 设置失败,错误原因:{}",portName,e.getMessage()); + throw e; + } + return serialPort; + } else { + throw new Exception(); + } + + } catch (NoSuchPortException e) { + log.error("无此串口:",e); + throw e; + } catch (PortInUseException e) { + log.error("串口使用中:",e); + throw e; + } + } + + + public static byte[] HexString2Bytes(String src) { + if (null == src || 0 == src.length()) { + return null; + } + byte[] ret = new byte[src.length() / 2]; + byte[] tmp = src.getBytes(); + for (int i = 0; i < (tmp.length / 2); i++) { + ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]); + } + return ret; + } + + /**byte转十六进制字符串*/ + public static String ByteArrayToString(byte[] by) { + String str = ""; + for (int i = 0; i < by.length; i++) { + String hex = Integer.toHexString(by[i] & 0xFF); + if (hex.length() == 1) { + hex = "0" + hex; + } + str += hex.toUpperCase(); + } + return str; + } + + /**byte类型数据,转成十六进制形式*/ + public static byte uniteBytes(byte src0, byte src1) { + byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 })).byteValue(); + _b0 = (byte) (_b0 << 4); + byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 })).byteValue(); + byte ret = (byte) (_b0 ^ _b1); + return ret; + } + + /** + * 关闭串口 + * + * @throws IOException + */ + public static synchronized void closePort(SerialPort serialPort) throws IOException { + if (serialPort != null) { + serialPort.close(); + log.info("串口" + serialPort.getName() + "已关闭"); + } + } + + /** + * 往串口发送数据 + * + * @param order + * 待发送数据 + * @throws IOException + * 向串口发送数据失败 + * 关闭串口对象的输出流出错 + */ + public static void sendToPort(byte[] order, SerialPort serialPort,String cmd ,String name) throws IOException { + + OutputStream out = null; + + try { + + out = serialPort.getOutputStream(); + out.write(order); + out.flush(); + log.info(name + "发送数据成功,指令:"+cmd + " " + serialPort.getName()); + } catch (IOException e) { + log.error("发送数据失败" + serialPort.getName()); + throw e; + } finally { + try { + if (out != null) { + out.close(); + out = null; + } +// if (serialPort != null) { +// serialPort.close(); +// } + } catch (IOException e) { + log.error("关闭串口对象的输出流出错"); + throw e; + } + } + + } + + /** + * 从串口读取数据 + * @param serialPort + * 当前已建立连接的SerialPort对象 + * @return 读取到的数据 + * @throws IOException + * 从串口读取数据时出错 + * @throws IOException + * 关闭串口对象输入流出错 + */ + public static byte[] readFromPort(SerialPort serialPort) throws Exception { + + InputStream in = null; + byte[] bytes = null; + + try { + if (serialPort != null) { + in = serialPort.getInputStream(); + } else { + return null; + } + int bufflenth = in.available(); // 获取buffer里的数据长度 + while (bufflenth != 0) { + bytes = new byte[bufflenth]; // 初始化byte数组为buffer中数据的长度 + in.read(bytes); + bufflenth = in.available(); + } + } catch (Exception e) { + throw e; + } finally { + try { + if (in != null) { + in.close(); + in = null; + } + } catch (IOException e) { + throw e; + } + + } + + return bytes; + + } + + /** + * 添加监听器 + * + * @param serialPort + * 串口对象 + * @param listener + * 串口监听器 + * @throws TooManyListenersException + * 监听类对象过多 + */ + public static void addListener(SerialPortEventListener listener, SerialPort serialPort) throws TooManyListenersException { + + try { + //判断监听器是否存在 + // 给串口添加监听器 + serialPort.addEventListener(listener); + // 设置当有数据到达时唤醒监听接收线程 + serialPort.notifyOnDataAvailable(true); + // 设置当通信中断时唤醒中断线程 + serialPort.notifyOnBreakInterrupt(true); + + } catch (TooManyListenersException e) { + throw e; + } + } + + private static String byteToString (byte[] bytes) { + if (null == bytes || bytes.length == 0) { + return ""; + } + String strContent = ""; + try { + strContent = new String(bytes, "utf-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return strContent; + } + + + //public static void main(String[] args) { + // List ports = findPorts(); + // String str = "FEFEFE6821034010010968010235189E16"; + // byte[] cmd = HexString2Bytes(str); + // System.out.println("ports = " + ports); + // try { + // SerialPort serialPort = SerialTool.openPort(ports.get(1), COMPANY_BIT_RATE, DATA_BITS, STOP_BIT, COMPANY_PARITY_BIT); + // SerialTool.sendToPort(cmd,serialPort); + // Thread.sleep(2000); + // byte[] bytes = SerialTool.readFromPort(serialPort); + // String receive = byteToString(bytes); + // String receive2 = ByteArrayToString(bytes); + // System.out.println("receive = " + receive); + // System.out.println("receive2 = " + receive2); + // //SerialTool.closePort(serialPort); + // } catch (Exception e) { + // e.printStackTrace(); + // } + // + //} +} diff --git a/user-service/src/main/java/com/mh/user/service/AlarmInfoService.java b/user-service/src/main/java/com/mh/user/service/AlarmInfoService.java new file mode 100644 index 0000000..e3daf9e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/AlarmInfoService.java @@ -0,0 +1,74 @@ +package com.mh.user.service; + +import com.mh.user.entity.AlarmInfoEntity; +import com.mh.user.entity.AlarmValueSetEntity; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +public interface AlarmInfoService { + + + /** + * 报警管理 + * 保存报警信息 + * @param alarmInfoEntity + */ + void saveAlarmInfo(AlarmInfoEntity alarmInfoEntity); + + /** + * 报警管理 + * 根据日期修改报警信息 + * @param alarmInfoEntity + */ + void updateAlarmInfo(AlarmInfoEntity alarmInfoEntity); + + /** + * 报警管理 + * 根据日期、设备、楼栋查询报警信息 + * @param alarmTime + * @param alarmType + * @param buildingId + * @param page + * @param limit + * @return + */ + + List queryAlarmInfo(String alarmTime,String alarmType, + String buildingId,String dealState,int page,int limit); + + + /** + * 报警管理 + * 根据日期、设备类型查询记录数 + * @return + */ + int getAlarmInfoCount(String alarmTime,String alarmType, + String buildingId,String dealState,int page,int limit); + + /** + * 报警管理 + * 根据报警编号删除报警信息 + * @param id + */ + void deleteAlarmInfo(String id); + + //警报设置 + void saveAlarmValueSet(AlarmValueSetEntity alarmValueSetEntity); + + //修改处理状态 + void updateDealState(String id,String dealState); + + //查询报警值设置记录 + List queryAlarmValueSet(String buildingId,String itemType,int page,int limit); + + //查询报警值设置记录数 + int getAlarmValueSetCount(String buildingId,String itemType); + + //删除设置记录 + void delAlarmValueSet(String id); + + //按楼栋编号删除设置记录 + void delAlarmValueSet2(String buildingId,String itemType); + +} diff --git a/user-service/src/main/java/com/mh/user/service/AnalysisService.java b/user-service/src/main/java/com/mh/user/service/AnalysisService.java new file mode 100644 index 0000000..b0bc75d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/AnalysisService.java @@ -0,0 +1,14 @@ +package com.mh.user.service; + +import com.mh.user.entity.AnalysisMonthEntity; +import com.mh.user.entity.AnalysisYearEntity; + +import java.util.List; + +public interface AnalysisService { + + List queryAnalysisYear(String curDate, String buildingId, int type); + + List queryAnalysisMonth(String curDate, String buildingId, int type); + +} diff --git a/user-service/src/main/java/com/mh/user/service/AreaService.java b/user-service/src/main/java/com/mh/user/service/AreaService.java new file mode 100644 index 0000000..969afc5 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/AreaService.java @@ -0,0 +1,10 @@ +package com.mh.user.service; + +import com.mh.user.entity.AreaEntity; + +import java.util.List; + +public interface AreaService { + + List findAll(); +} diff --git a/user-service/src/main/java/com/mh/user/service/BuildingService.java b/user-service/src/main/java/com/mh/user/service/BuildingService.java new file mode 100644 index 0000000..0f4ef6a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/BuildingService.java @@ -0,0 +1,74 @@ +package com.mh.user.service; + +import com.mh.user.entity.BuildingEntity; +import com.mh.user.model.BuildingModel; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +public interface BuildingService { + + /** + * 楼栋管理模块 + * 保存楼栋信息 + * @param buildingEntity + */ + int saveBuilding(BuildingEntity buildingEntity); + + /** + * 楼栋管理模块 + * 保存楼栋信息 + * @param buildingEntity + */ + int updateBuilding(BuildingEntity buildingEntity); + + /** + * 楼栋管理模块: + * 查询楼栋资料 + * @param page + * @param limit + * @return + */ + List queryBuilding(String buildingId,int page, int limit); + + /** + * 楼栋管理模块: + * 获取楼栋信息查询的总条数 + * @return + */ + int getCount(String buildingId,int page, int limit); + + //查询楼栋名称 + List selectBuildingName(); + + //查询楼栋编号 + String selectBuildingId(String buildingName); + + int selectCount(@Param("buildingName") String buildingName); + /** + * 楼栋管理模块: + * 根据名称删除楼栋信息 + * @param records + */ + int deleteBuilding(List records); + + /** + * 楼栋管理模块: + * 根据名称删除楼栋信息 + * @param id + */ + int deleteBuilding(String id); + + //通过编号查询名称 + String queryBuildingName(String id); + + //查询水箱高度 + Double queryTankHeight(String id); + + //查询对应区域编号 + String queryAreaId(int id); + + //查询楼栋热泵数目 + int selectPumpCount(String buildingId); +} diff --git a/user-service/src/main/java/com/mh/user/service/CodeTableService.java b/user-service/src/main/java/com/mh/user/service/CodeTableService.java new file mode 100644 index 0000000..ce8850c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/CodeTableService.java @@ -0,0 +1,12 @@ +package com.mh.user.service; + +import com.mh.user.model.DeviceTypeModel; + +import java.util.List; + +public interface CodeTableService { + + List queryDeviceType(); + + List queryBrand(); +} diff --git a/user-service/src/main/java/com/mh/user/service/ControlSetService.java b/user-service/src/main/java/com/mh/user/service/ControlSetService.java new file mode 100644 index 0000000..b1e01ce --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/ControlSetService.java @@ -0,0 +1,10 @@ +package com.mh.user.service; + +import com.mh.user.entity.ControlSetEntity; + +public interface ControlSetService { + + void saveControlSet(ControlSetEntity controlSetEntity); + + ControlSetEntity queryControlSet(String buildingId); +} diff --git a/user-service/src/main/java/com/mh/user/service/DataResultService.java b/user-service/src/main/java/com/mh/user/service/DataResultService.java new file mode 100644 index 0000000..341ff12 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/DataResultService.java @@ -0,0 +1,29 @@ +package com.mh.user.service; + +import com.mh.user.entity.DataResultEntity; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; + +public interface DataResultService { + + void saveDataResult(DataResultEntity dataResultEntity) throws ParseException; + + void updateDataResult(DataResultEntity dataResultEntity); + + List queryDataResult(String buildingId, + String startDate, + String endDate, + String deviceType, + int page, + int limit); + + int getDataResultCount(String buildingId, + String startDate, + String endDate, + String deviceType, + int page, + int limit); + +} diff --git a/user-service/src/main/java/com/mh/user/service/DealDataService.java b/user-service/src/main/java/com/mh/user/service/DealDataService.java new file mode 100644 index 0000000..7467631 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/DealDataService.java @@ -0,0 +1,47 @@ +package com.mh.user.service; + +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +/** + * @author ljf + * @title :处理采集数据 + * @description : + * @updateTime 2020-07-28 + * @throws : + */ +public interface DealDataService { + + void proEnergy(String curDate); + + void proEnergy2(String curDate); + + void proEnergySum(String curDate); + + void proEnergySum2(String curDate); + + void proMaintainSum(String curDate); + + void proAnalysisMonth(String curDate); + + void proAnalysisYear(String curDate); + + void proAlarmManage(String curDate); + + void proAlarmInfoSum(String curDate); + + void proDeviceState(String curDate); + + void dealData(); + + void deleteChillersDataHistory(); + + void deleteDataHistory(); + + void proTotalPumpMinutes(String curDate); + + String customName(); + + void proGatewayState(); + +} diff --git a/user-service/src/main/java/com/mh/user/service/DeviceCodeParamService.java b/user-service/src/main/java/com/mh/user/service/DeviceCodeParamService.java new file mode 100644 index 0000000..b6edf7b --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/DeviceCodeParamService.java @@ -0,0 +1,55 @@ +package com.mh.user.service; + +import com.mh.user.entity.DeviceCodeParamEntity; +import org.apache.ibatis.annotations.Param; + + +import java.util.List; + +public interface DeviceCodeParamService { + + //插入指令参数 + void insertDeviceCodeParam(DeviceCodeParamEntity deviceCodeParamEntity); + + //查询指令参数,传入IP和端口 + List queryCodeParam(String gatewayIP, String gatewayPort); + + //查询指令参数,传入串口 + List queryCodeParam2(String comName); + + //查询所有指令参数device_code_param + List queryCodeParam3(String thread); + + //查询所有指令参数device_code_param2 + List queryCodeParam4(String thread); + + //查询所有指令参数device_code_param3 + List queryCodeParam5(String thread); + + //查询记录数 + int queryCount(); + + //查询记录数2 + int queryCount2(); + + //查询记录数3 + int queryCount3(); + + // 批量插入生成指令参数入数据库 + void insertDeviceCodeParamList(List deviceCodeParamEntityList); + + // 批量插入生成指令参数入数据库 + void insertDeviceCodeParamList2(List deviceCodeParamEntityList); + + // 批量插入生成指令参数入数据库 + void insertDeviceCodeParamList3(List deviceCodeParamEntityList); + + //查询插入 + void selectInsertDeviceCodeParam(); + + //查询插入 + void selectInsertDeviceCodeParam2(); + + //查询插入 + void selectInsertDeviceCodeParam3(); +} diff --git a/user-service/src/main/java/com/mh/user/service/DeviceDisplayService.java b/user-service/src/main/java/com/mh/user/service/DeviceDisplayService.java new file mode 100644 index 0000000..11212ba --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/DeviceDisplayService.java @@ -0,0 +1,23 @@ +package com.mh.user.service; + +import com.mh.user.dto.DeviceMessageDTO; +import com.mh.user.dto.DisplayBoxDataDTO; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 设备数据显示 + * @updateTime 2020-05-29 + * @throws : + */ +public interface DeviceDisplayService { + + // 查询设备显示内容 + // deviceType: 设备类型(host:主机 pump:泵 tower:塔)type: 1(查询阴影值),0(查询数据框内容) + List deviceDisplayBoxData(String deviceType, String type); + + // 设备信息状态显示 + List queryDeviceStatus(String deviceType); +} diff --git a/user-service/src/main/java/com/mh/user/service/DeviceFloorService.java b/user-service/src/main/java/com/mh/user/service/DeviceFloorService.java new file mode 100644 index 0000000..b5a0294 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/DeviceFloorService.java @@ -0,0 +1,93 @@ +package com.mh.user.service; + +import com.mh.user.entity.*; +import com.mh.user.mapper.provider.DeviceFloorProvider; +import com.mh.user.model.DeviceModel; +import com.mh.user.model.PumpModel; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.SelectProvider; + +import java.util.List; + +public interface DeviceFloorService { + + /** + * 设备管理模块 + * 保存设备信息 + * @param deviceFloorEntity + */ + int saveDevice(DeviceFloorEntity deviceFloorEntity); + + /** + * 设备管理模块 + * 保存设备信息 + * @param deviceFloorEntity + */ + int updateDevice(DeviceFloorEntity deviceFloorEntity); + + /** + * 设备管理模块: + * 查询设备资料 + * @param buildingId + * @param deviceType + * @param page + * @param limit + * @return + */ + List queryDeviceFloor(String buildingId, String deviceType,int page, int limit); + + /** + * 楼面设备模块 + * 获取设备查询的总条数 + * @param buildingId + * @param deviceType + * @param page + * @param limit + * @return + */ + int getCount(String buildingId,String deviceType,int page,int limit); + + //查询所有水箱名称 + List selectDeviceName(String buildingId, String deviceType); + + //根据楼栋、类型、设备名称判断是否存在 + int selectDeviceCount(String buildingId,String deviceType,String deviceName); + + DeviceModel selectTankName(String buildingId, String deviceType,String pumpId); + + //查询水箱编号 + String selectDeviceId(String deviceName,String deviceType,String buildingId); + + //查询非远程控制普通热泵 + PumpModel selectDeviceId2(String deviceType,String buildingId); + /** + * 设备管理模块: + * 根据通讯地址删除设备信息 + * @param records + */ + int deleteDevice(List records); + + /** + * 设备管理模块: + * 根据设备编号删除设备信息 + * @param id + */ + int deleteDevice(String id); + + // Excel导入相关函数 + // 删除临时表 + void deleteDevice_floor_temp(); + + // 插入临时表 + void insertDevice_floor_temp(UploadDeviceFloorEntity uploadDeviceFloorEntity); + + // 查询Excel导入的数据 + List queryExcelDevices(); + + // 查询Excel导入的数据的记录数 + int queryExcelDevicesCount(); + + // 在导入中的数据有重复 + void updateDevice_floor_temp__multiple(); + +} diff --git a/user-service/src/main/java/com/mh/user/service/DeviceInstallService.java b/user-service/src/main/java/com/mh/user/service/DeviceInstallService.java new file mode 100644 index 0000000..dbdffdf --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/DeviceInstallService.java @@ -0,0 +1,166 @@ +package com.mh.user.service; + +import com.mh.user.entity.BuildingEntity; +import com.mh.user.entity.DeviceInstallEntity; +import com.mh.user.entity.DeviceInstallTempEntity; +import com.mh.user.entity.UploadDeviceInstallEntity; +import com.mh.user.mapper.provider.DeviceInstallProvider; +import com.mh.user.model.DeviceModel; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.SelectProvider; +import org.apache.ibatis.annotations.Update; + +import java.util.Date; +import java.util.List; + +public interface DeviceInstallService { + + /** + * 设备管理模块 + * 保存设备信息 + * + * @param deviceInstallEntity + */ + int saveDevice(DeviceInstallEntity deviceInstallEntity); + + /** + * 设备管理模块 + * 保存设备信息 + * + * @param deviceInstallEntity + */ + int updateDevice(DeviceInstallEntity deviceInstallEntity); + + //按id更新水电表读数和采集日期 + void updateLastValue(Long id, String lastValue, Date lastDate); + /** + * 设备管理模块 + * 查询设备资料 + * + * @param page + * @param limit + * @return + */ + List getAllDevice(int page, int limit); + + //查询有多个采集参数的设备 + List selectDeviceParams(); + + //查询有多个采集参数的设备 + List selectDeviceParams2(); + + //查询需要手动开关机的热泵 + List selectDevicePump(); + + // 查询所有启用的设备 + int getAllCount(); + /** + * 设备管理模块 + * 按条件查询设备资料 + * @param buildingId + * @param startDate + * @param startDate + * @param page + * @param limit + * @return + */ + List queryDevice(String buildingId,String deviceType, String startDate, String endDate,String isOnline, String isUse, String isFault, int page, int limit); + + /** + * 设备管理模块: + * 获取设备查询的总条数 + * + * @return + */ + int getCount(String buildingId,String deviceType, String startDate, String endDate,String isOnline, String isUse, String isFault, int page, int limit); + + //查询设备故障情况 + int getIsFaultCount(String isFault,String deviceType); + + //查询设备在线情况 + int getIsOnlineCount(String isOnline,String deviceType); + + // 修改设备在线状态 + void updateOnline(String deviceAddr,String deviceType,String buildingId,String isOnline); + + // 修改设备离线状态 + void updateNotOnline(String deviceAddr,String deviceType,String buildingId,String isOnline); + + //根据通讯地址和设备类型查询对应的设备信息 + DeviceInstallEntity selectDevice(String deviceAddr,String deviceType,String buildingId); + + //查询通讯编号是否存在 + int selectDeviceCount(String deviceAddr,String deviceType); + /** + * 设备管理模块 + * 根据通讯地址删除设备信息 + * + * @param records + */ + int deleteDevice(List records); + + /** + * 设备管理模块 + * 根据通讯地址删除设备信息 + * + * @param id + */ + int deleteDevice(String id); + + // Excel导入相关函数 + // 删除临时表 + void deleteDevice_install_temp(); + + // 插入临时表 + void insertDevice_install_temp(UploadDeviceInstallEntity uploadDeviceInstallEntity); + + // 查询Excel导入的数据 + List queryExcelDevices(); + + // 查询Excel导入的数据的记录数 + int queryExcelDevicesCount(); + + // 在导入中的数据有重复 + void updateDevice_install_temp__multiple(); + + //从临时表查询插入 + void insertFromDevice_install_temp(); + + //修改启动状态 + void updateDeviceIsUse(String isUse, String deviceAddr); + + //查询设备 + List selectDevices(String buildingId,String deviceType); + + //修改故障状态 + void updateDeviceFault(String isFault, String deviceAddr, String deviceType); + + //查询设备品牌 + String selectBrand(String buildingId,String deviceAddr); + + //修改使用状态1启用,0停用 + void updateIsUse(String isUse, String deviceAddr, String deviceType, String buildingId); + + //修改使用状态1启用,0停用 + void updateIsUse2(String isUse, String deviceAddr, String deviceType, String buildingId); + + //修改使用状态1启用,0停用 + void updateIsUse3(String isUse, String deviceAddr, String deviceType, String buildingId); + + //删除监控表停用热泵记录 + void deletePump(String deviceAddr,String deviceType,String buildingId); + + //更新基表初始值 + void updateInitValue(String deviceAddr, String deviceType, String buildingId, String initValue); + + //查询最后一次采集时间 + String selectLastDate(String deviceType,String deviceAddr,String buildingId); + + //判断某栋楼是否有热泵设备 + int judgePump(String buildingId); + + //查询设备所属位置(低区或高区) + String selectSeat(String deviceType,String deviceAddr,String buildingId); + +} diff --git a/user-service/src/main/java/com/mh/user/service/DeviceManageService.java b/user-service/src/main/java/com/mh/user/service/DeviceManageService.java new file mode 100644 index 0000000..e0dfa56 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/DeviceManageService.java @@ -0,0 +1,39 @@ +package com.mh.user.service; + +import com.mh.user.entity.DeviceManageEntity; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 设备管理接口 + * @updateTime 2020-05-14 + * @throws : + */ +public interface DeviceManageService { + + // 根据设备机身表号查询对应的设备信息 + List getDeviceByOther(String deviceNum); + + void addOrUpdateBaseMeter(DeviceManageEntity deviceManageEntity); + + /** + * 删除设备信息 + * @param deviceId + * @param deviceType + */ + void deleteDeviceInfo(Integer deviceId, String deviceType); + + // 通过设备类型查询设备信息 1:广仪电表 3:冷量计 + List queryDevicesByType(String deviceType); + + // 查询全部信息 + List queryAllDevice(); + + // 根据设备ID查询对应的设备信息 + List queryDeviceByOther(int page, int size, String deviceNum); + + // 查询设备总数 + int queryDeviceByOtherCount(String deviceNum); +} diff --git a/user-service/src/main/java/com/mh/user/service/DeviceParamService.java b/user-service/src/main/java/com/mh/user/service/DeviceParamService.java new file mode 100644 index 0000000..d787cad --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/DeviceParamService.java @@ -0,0 +1,40 @@ +package com.mh.user.service; + +import com.mh.user.entity.DeviceParameterEntity; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description :设备参数实体类 + * @updateTime 2020-05-21 + * @throws : + */ +public interface DeviceParamService { + + // 根据页码查询对应数据信息 + List getBaseMeterParamList(String baseMeterType); + + + void addOrUpdateBaseMeterParam(DeviceParameterEntity deviceParameterEntity); + + // 添加网关设备 + String insertDeviceParam(DeviceParameterEntity deviceParameterEntity); + + // 根据网关ID删除网关设备 + void deleteDeviceParamByID(Long id); + + // 根据网关ID查询设备信息 + DeviceParameterEntity queryParamById(int paramId); + + // 查询全部 + List queryAll(); + + // 根据页码查询对应数据信息 + List queryByOther(int page, int size, int paramId); + + // 设备总数 + int queryByOtherCount(int page, int size, int paramId); + +} diff --git a/user-service/src/main/java/com/mh/user/service/EnergyService.java b/user-service/src/main/java/com/mh/user/service/EnergyService.java new file mode 100644 index 0000000..5b02839 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/EnergyService.java @@ -0,0 +1,83 @@ +package com.mh.user.service; + +import com.mh.user.entity.EnergyEntity; +import com.mh.user.model.SumModel; +import java.util.List; + +public interface EnergyService { + + /** + * 生产信息 + * 保存 + * @param energyEntity + */ + void saveEnergy(EnergyEntity energyEntity,int type); + + /** + * 生产信息 + * 修改 + * @param energyEntity + */ + void updateEnergy(EnergyEntity energyEntity,int type); + + /** + * 生产信息 + * 根据时间日期和楼栋编号删除记录 + * @param curDate + * @param buildingId + */ + void deleteEnergy(String curDate,String buildingId,int type); + + + /** + * 生产信息 + * 查询 + * @param buildingId + * @param startDate + * @param endDate + * @param page + * @param limit + * @param type (1按天,2按月,3按年) + * @return + */ + List queryEnergy(String buildingId, String startDate,String endDate, + int page, int limit,int type); + + /** + * 生产信息 + * 查询记录数 + * @return + */ + int getEnergyCount( String buildingId, String startDate,String endDate, + int page, int limit,int type); + + /** + * 生产信息 + * 查询 + * @param curDate + * @param type (1按天,2按月,3按年) + * @return + */ + List queryEnergyGroup(String curDate, int type); + + //查询每天的用量 + List queryDayEnergy(String buildingId, String startDate, String endDate, int page, int limit); + + int getDayEnergyCount(String buildingId, String startDate, String endDate, int page, int limit); + + //查询小时的用量 + List queryHourEnergy(String buildingId,String curDate, int page, int limit); + + int getHourEnergyCount(String buildingId, String curDate); + + //查询记录 + List queryEnergyBuilding(int page,int limit); + + //查询记录数 + int getEnergyBuildingCount(); + + void proEnergyBuilding(String curDate,String endDate,int type); + + SumModel queryEnergySum(); + +} diff --git a/user-service/src/main/java/com/mh/user/service/ExceptionService.java b/user-service/src/main/java/com/mh/user/service/ExceptionService.java new file mode 100644 index 0000000..7683710 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/ExceptionService.java @@ -0,0 +1,23 @@ +package com.mh.user.service; + +import com.mh.user.entity.ExceptionEntity; +import com.mh.user.entity.ExceptionTableData; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-31 + * @throws : + */ +public interface ExceptionService { + + List queryException(ExceptionEntity exceptionEntity); + + int queryExceptionTotal(ExceptionEntity exceptionEntity); + + String updateException(ExceptionTableData exceptionTableData); + +} diff --git a/user-service/src/main/java/com/mh/user/service/GatewayManageService.java b/user-service/src/main/java/com/mh/user/service/GatewayManageService.java new file mode 100644 index 0000000..77b892a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/GatewayManageService.java @@ -0,0 +1,53 @@ +package com.mh.user.service; + +import com.mh.user.entity.GatewayManageEntity; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 网关管理服务类 + * author:ljf + * create—date:2020-05-21 + */ +public interface GatewayManageService { + + /** + * 根据条件查询网关信息 + * @param grade + * @param operator + * @return + */ + List queryByOther(Integer grade, Integer operator); + + /** + * 新增或更新网关信息 + * @param gatewayManageEntity + */ + void addOrUpdateGateWayInfo(GatewayManageEntity gatewayManageEntity); + + // 查询全部 + List queryAll(String gatewayID, String operator, String grade, int page, int limit); + + // 查询记录数 + int queryCount(String gatewayID, String operator, String grade); + + // 添加网关设备 + String insertGatewayManage(GatewayManageEntity gatewayManageEntity); + + // 根据网关ID删除网关设备 + void deleteGatewayManageByID(int gatewayID); + + // 根据网关ID查询设备信息 + GatewayManageEntity queryGatewayByID(Long gatewayID); + + // 设备总数 + int queryByOtherCount(int page, int size, int gatewayID); + + // 更新网关管理器的最新连接数据 + void updateGatewayManage(String IP, String port); + + // 根据grade查询对应的网关路由信息 + GatewayManageEntity queryGatewayByGrade(Long grade); + +} diff --git a/user-service/src/main/java/com/mh/user/service/GaugeService.java b/user-service/src/main/java/com/mh/user/service/GaugeService.java new file mode 100644 index 0000000..06cbe90 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/GaugeService.java @@ -0,0 +1,19 @@ +package com.mh.user.service; + +import com.mh.user.entity.GaugeEntity; +import com.mh.user.entity.TableChartMessageEntity; + +/** + * @author ljf + * @title : 圆盘接口 + * @description : + * @updateTime 2020-08-07 + * @throws : + */ +public interface GaugeService { + + GaugeEntity getGaugeData(String type, String deviceName); + + TableChartMessageEntity queryDeviceId(String type, String deviceName); + +} diff --git a/user-service/src/main/java/com/mh/user/service/MaintainInfoService.java b/user-service/src/main/java/com/mh/user/service/MaintainInfoService.java new file mode 100644 index 0000000..191f83c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/MaintainInfoService.java @@ -0,0 +1,48 @@ +package com.mh.user.service; + +import com.mh.user.entity.MaintainInfoEntity; + +import java.util.List; + +public interface MaintainInfoService { + + /** + * 维修保养模块 + * 维修保养信息 + * @param maintainInfoEntity + */ + int saveMaintainInfo(MaintainInfoEntity maintainInfoEntity); + + /** + * 维修保养模块 + * 根据日期修改维修保养信息 + * @param maintainInfoEntity + */ + int updateMaintainInfo(MaintainInfoEntity maintainInfoEntity); + + /** + * 维修保养模块 + * 根据日期、设备类型查询维修保养信息 + * @param curDate + * @param deviceType + * @param page + * @param limit + * @return + */ + List queryMaintainInfo(String curDate,String buildingId,String deviceType, int page, int limit); + + /** + * 维修保养模块 + * 根据日期、设备类型查询记录数 + * @return + */ + int getMaintainInfoCount(String curDate,String buildingId, String deviceType, int page, int limit); + + + /** + * 维修保养模块 + * 根据维护编号删除维修保养信息 + * @param id + */ + void deleteMaintainInfo(String id); +} diff --git a/user-service/src/main/java/com/mh/user/service/NowDataService.java b/user-service/src/main/java/com/mh/user/service/NowDataService.java new file mode 100644 index 0000000..b79904d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/NowDataService.java @@ -0,0 +1,139 @@ +package com.mh.user.service; + +import com.mh.common.annotation.SysLogger; +import com.mh.user.entity.NowDataEntity; +import com.mh.user.entity.PumpMinutesEntity; +import com.mh.user.entity.WaterLevelEntity; +import com.mh.user.entity.WaterTempEntity; +import com.mh.user.model.WaterLevelModel; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +public interface NowDataService { + + //保存监控界面实时信息 + void saveNowData(NowDataEntity nowDataEntity); + + //保存热泵相关数据 + void saveNowHistoryData(String pumpId,String deviceType,String strData,String dataType,String buildingId); + + //非热泵保存数据 + void saveNowHistoryData2(String deviceAddr,String deviceType,String strData,String dataType,String buildingId); + + //非热泵温度变送器相关数据 + void saveNowHistoryData3(String pumpId,String deviceType,String strData,String dataType,String buildingId); + + //修改监控界面实时信息 + void updateNowData(NowDataEntity nowDataEntity); + + //查询监控界面实时信息 + List queryNowData(String buildingId); + + //按热泵查询当前状态 + NowDataEntity queryNowDataByPump(String buildingId,String pumpId); + + //保存监控界面历史信息 + void saveHistoryData(NowDataEntity nowDataEntity); + + //修改监控界面历史信息 + void updateHistoryData(NowDataEntity nowDataEntity); + + //查询监控界面历史信息 + List queryHistoryData(String curDate,String buildingId,String pumpId,String tankId,int page,int limit); + + //查询记录数 + int getHistoryDataCount(String curDate,String buildingId,String pumpId,String tankId,int page,int limit); + + //查询水位 + List queryWaterLevel(String curDate, String buildingID, int page, int limit); + + //查询水位记录数 + int getWaterLevelCount(String curDate,String buildingID); + + //按时间查询水位 + List queryWaterLevelByTime(String curDate,int page,int limit); + + //按时间查询水位记录 + int waterLevelByTimeCount(String curDate); + + //查询每天楼栋水位变化 + List queryBuildWaterLevel(String curDate, int page, int limit); + + //查询每天楼栋水位变化记录数 + int buildWaterLevelCount(String curDate); + + //从监视表查询热泵温度平均值 + String selectAve(String buildingId); + + //求单个热泵温度 + String selectSingleTemp(String pumpId,String buildingId); + + //从监视表查询热泵运行状态 + String selectStateCount(String buildingId); + + //从监视表查询热泵运行状态 + String selectState(String buildingId,String pumpId); + + //更新设置水位值 + void upLevelSet(String buildingId,String levelSet); + + //更新设置温度值 + void upTempSet(String buildingId,String tempSet); + + //更新设置温度值 + void upTempSet2(String buildingId,String tempSet,String pumpID); + + //查询每天24小时每个热泵温度变化情况 + @SysLogger + List queryWaterTemp(String buildingID,String curDate,int page,int limit); + + int queryWaterTempCount(String buildingID,String curDate); + + //查询每天24小时每个热泵温度变化情况2 + List queryWaterTemp2(String curDate,int page,int limit); + + int queryWaterTempCount2(String curDate); + + //生成楼栋温度 + void proWaterTemp(String curDate,String buildingID,String pumpID); + + //生成楼栋水位 + void proWaterLevel(String curDate,String buildingID); + + //在没有接收到返回值前设置监控界面热泵是否离线 + void updateRunState(String buildingId,String pumpId,String strState); + + //计算热泵运行时间,按分钟 + void proPumpMinutes(String buildingId,String pumpId,String runState); + + //按日查询运行时长 + List pumpMinutes(String startDate,String endDate,String buildingId,String pumpId,int page,int limit); + + int pumpMinutesCount(String startDate, + String endDate, + String buildingId, + String pumpId); + + //按周查询运行时长 + List pumpWeekMinutes(String startDate,String endDate,String buildingId,String pumpId,int page,int limit); + + int pumpWeekMinutesCount(String startDate, + String endDate, + String buildingId, + String pumpId); + + //按月查询运行时长 + List pumpMonthMinutes(String startDate,String endDate,String buildingId,String pumpId,int page,int limit); + + int pumpMonthMinutesCount(String startDate, + String endDate, + String buildingId, + String pumpId); + + //通过楼栋编号获取最小热泵id号,规定最小热泵号为单箱 + String selectMinPumpId(String buildingId); + +} + diff --git a/user-service/src/main/java/com/mh/user/service/NowPublicDataService.java b/user-service/src/main/java/com/mh/user/service/NowPublicDataService.java new file mode 100644 index 0000000..fcf4ba1 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/NowPublicDataService.java @@ -0,0 +1,46 @@ +package com.mh.user.service; + +import com.mh.user.entity.NowPublicDataEntity; +import com.mh.user.mapper.provider.NowPublicDataProvider; +import com.mh.user.model.TempModel; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.SelectProvider; + +import java.util.List; + +public interface NowPublicDataService { + + //保存监控界面公共实时信息 + void saveNowPublicData(NowPublicDataEntity nowPublicDataEntity); + + //修改监控界面公共实时信息 + void updateNowPublicData(NowPublicDataEntity nowPublicDataEntity); + + //查询监控界面公共实时信息 + NowPublicDataEntity queryNowPublicData(String buildingId); + + //保存监控界面公共历史信息 + void saveHistoryPublicData(NowPublicDataEntity nowPublicDataEntity); + + //修改监控界面公共历史信息 + void updateHistoryPublicData(NowPublicDataEntity nowPublicDataEntity); + + //查询监控界面公共历史信息 + List queryHistoryPublicData(String curDate, String buildingId, int page, int limit); + + //查询记录数 + int getHistoryPublicDataCount(String curDate, String buildingId, int page, int limit); + + //保存 + void saveNowHistoryPublicData(NowPublicDataEntity nowPublicDataEntity ); + + //查询楼栋水箱平均温度 + List queryWtTemp(); + + //查询单楼栋水箱平均温度 + TempModel queryWtTemp2(String buildingId); + + //更新单箱温度 + void updateSingleTemp(String singleTemp,String buildingId); +} diff --git a/user-service/src/main/java/com/mh/user/service/PumpSetService.java b/user-service/src/main/java/com/mh/user/service/PumpSetService.java new file mode 100644 index 0000000..c436a19 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/PumpSetService.java @@ -0,0 +1,15 @@ +package com.mh.user.service; + +import com.mh.user.entity.PumpSetEntity; + +public interface PumpSetService { + + void savePumpSet(PumpSetEntity pumpSetEntity); + + void updatePumpSetTemp(String tempSet, String buildingId, String pumpId); + + PumpSetEntity queryPumpSet(String pumpId, String buildingId); + + PumpSetEntity queryHandTime(); + +} diff --git a/user-service/src/main/java/com/mh/user/service/ReportService.java b/user-service/src/main/java/com/mh/user/service/ReportService.java new file mode 100644 index 0000000..64f94e1 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/ReportService.java @@ -0,0 +1,18 @@ +package com.mh.user.service; + +import com.mh.user.entity.ReportParamEntity; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-03 + * @throws : + */ +public interface ReportService { + + List queryAllTarget(String type); + +} diff --git a/user-service/src/main/java/com/mh/user/service/SummaryService.java b/user-service/src/main/java/com/mh/user/service/SummaryService.java new file mode 100644 index 0000000..4432dd2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/SummaryService.java @@ -0,0 +1,22 @@ +package com.mh.user.service; + +import com.mh.user.entity.AlarmInfoSumEntity; +import com.mh.user.entity.DeviceStateEntity; +import com.mh.user.entity.EnergySumEntity; +import com.mh.user.entity.MaintainSumEntity; + +public interface SummaryService { + + //查询设备状态汇总 + DeviceStateEntity queryDeviceState(); + + //查询用量汇总比较 + EnergySumEntity queryEnergySum(String buildingId,String curDate,int type); + + //查询维修量汇总 + MaintainSumEntity queryMaintainSum(String buildingId, String curDate); + + //警报管理汇总查询 + AlarmInfoSumEntity queryAlarmInfoSum(String buildingId, String curDate); + +} diff --git a/user-service/src/main/java/com/mh/user/service/SysDeptService.java b/user-service/src/main/java/com/mh/user/service/SysDeptService.java new file mode 100644 index 0000000..f7928ca --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/SysDeptService.java @@ -0,0 +1,21 @@ +package com.mh.user.service; + + +import com.mh.common.service.CurdService; +import com.mh.user.model.SysDept; + +import java.util.List; + +/** + * 机构管理 + * @author ljf + * @date 2020-04-25 + */ +public interface SysDeptService extends CurdService { + + /** + * 查询机构树 + * @return + */ + List findTree(); +} diff --git a/user-service/src/main/java/com/mh/user/service/SysDictService.java b/user-service/src/main/java/com/mh/user/service/SysDictService.java new file mode 100644 index 0000000..3398fa6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/SysDictService.java @@ -0,0 +1,21 @@ +package com.mh.user.service; + +import com.mh.common.service.CurdService; +import com.mh.user.model.SysDict; + +import java.util.List; + +/** + * 字典管理 + * @author ljf + * @date 2020-04-25 + */ +public interface SysDictService extends CurdService { + + /** + * 根据名称查询 + * @param lable + * @return + */ + List findByLable(String lable); +} diff --git a/user-service/src/main/java/com/mh/user/service/SysLogService.java b/user-service/src/main/java/com/mh/user/service/SysLogService.java new file mode 100644 index 0000000..4ebbfad --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/SysLogService.java @@ -0,0 +1,25 @@ +package com.mh.user.service; + + +import com.mh.common.service.CurdService; +import com.mh.user.entity.SysParamEntity; +import com.mh.user.model.SysLog; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 日志管理 + * @author ljf + * @date 2020-04-25 + */ +public interface SysLogService extends CurdService { + + List findLogs(String userName, int page, int limit ); + + int findCount(String userName,int page,int limit ); + + SysLog logInfo(int id); + + SysParamEntity selectSysParam(); +} diff --git a/user-service/src/main/java/com/mh/user/service/SysMenuService.java b/user-service/src/main/java/com/mh/user/service/SysMenuService.java new file mode 100644 index 0000000..60169be --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/SysMenuService.java @@ -0,0 +1,29 @@ +package com.mh.user.service; + + +import com.mh.common.service.CurdService; +import com.mh.user.model.SysMenu; + +import java.util.List; + +/** + * 菜单管理 + * @author Louis + * @date Oct 29, 2018 + */ +public interface SysMenuService extends CurdService { + + /** + * 查询菜单树,用户ID和用户名为空则查询全部 + * @param menuType 获取菜单类型,0:获取所有菜单,包含按钮,1:获取所有菜单,不包含按钮 + * @return + */ + List findTree(String userName, int menuType); + + /** + * 根据用户名查找菜单列表 + * @param userName + * @return + */ + List findByUser(String userName); +} diff --git a/user-service/src/main/java/com/mh/user/service/SysRoleService.java b/user-service/src/main/java/com/mh/user/service/SysRoleService.java new file mode 100644 index 0000000..cc3163d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/SysRoleService.java @@ -0,0 +1,58 @@ +package com.mh.user.service; + + +import com.mh.common.service.CurdService; +import com.mh.user.model.SysMenu; +import com.mh.user.model.SysRole; +import com.mh.user.model.SysRoleMenu; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 角色管理 + * @author Louis + * @date Oct 29, 2018 + */ +public interface SysRoleService extends CurdService { + + /** + * 查询全部 + * @return + */ + List findAll(); + + /** + * 查询角色菜单集合 + * @return + */ + List findRoleMenus(Long roleId); + + /** + * 保存角色菜单 + * @param records + * @return + */ + int saveRoleMenus(List records); + + /** + * 根据名称查询 + * @param name + * @return + */ + + List findByName(String name); + + //根据名称查找编号 + SysRole findId(String name); + + //查询所有角色 + List queryRoles(String roleName, int page,int limit); + + //查询所有记录数 + int getCount( String roleName,int page,int limit); + +} diff --git a/user-service/src/main/java/com/mh/user/service/SysUserService.java b/user-service/src/main/java/com/mh/user/service/SysUserService.java new file mode 100644 index 0000000..7c9e09b --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/SysUserService.java @@ -0,0 +1,51 @@ +package com.mh.user.service; + +import com.mh.common.service.CurdService; +import com.mh.user.entity.DBEntity; +import com.mh.user.model.SysUser; +import com.mh.user.model.SysUserRole; +import org.apache.ibatis.annotations.Param; + + +import java.util.List; +import java.util.Set; + + +/** + * 用户管理 + * @author Louis + * @date Oct 29, 2018 + */ +public interface SysUserService extends CurdService { + + DBEntity queryDBInfo(String username); + + + SysUser findByName(String userName); + + /** + * 查找用户的菜单权限标识集合 + * @param userName + * @return + */ + Set findPermissions(String userName); + + /** + * 查找用户的角色集合 + * @param userId + * @return + */ + List findUserRoles(Long userId); + + //查询用户 + List queryUsers(String userName,int page,int limit); + + //查询记录数 + int getCount(String userName,int page,int limit); + + //根据id修改操作员密码 + void updatePassword(String password,String salt,String id); + + //根据操作员名称修改登录日期 + void updateLoginTime(String userName); +} diff --git a/user-service/src/main/java/com/mh/user/service/UseForecastService.java b/user-service/src/main/java/com/mh/user/service/UseForecastService.java new file mode 100644 index 0000000..2351e18 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/UseForecastService.java @@ -0,0 +1,16 @@ +package com.mh.user.service; + +import com.mh.user.entity.UseForecastEntity; + +import java.util.List; + +public interface UseForecastService { + + void saveUseForecast(UseForecastEntity useForecastEntity); + + void updateUseForecast(UseForecastEntity useForecastEntity); + + List queryUseForecast(String buildingId,String tankId,String curDate, int page,int limit); + + int getCount(String buildingId, String tankId,String curDate, int page, int limit); +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/AlarmInfoServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/AlarmInfoServiceImpl.java new file mode 100644 index 0000000..8af5038 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/AlarmInfoServiceImpl.java @@ -0,0 +1,79 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.AlarmInfoEntity; +import com.mh.user.entity.AlarmValueSetEntity; +import com.mh.user.mapper.AlarmInfoMapper; +import com.mh.user.service.AlarmInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class AlarmInfoServiceImpl implements AlarmInfoService { + + @Autowired + AlarmInfoMapper alarmInfoMapper; + + @Override + public void saveAlarmInfo(AlarmInfoEntity alarmInfoEntity) { + alarmInfoMapper.saveAlarmInfo(alarmInfoEntity); + } + + @Override + public void updateAlarmInfo(AlarmInfoEntity alarmInfoEntity) { + alarmInfoMapper.updateAlarmInfo(alarmInfoEntity); + } + + @Override + public List queryAlarmInfo(String alarmTime, String alarmType, String buildingId,String dealState, int page, int limit) { + return alarmInfoMapper.queryAlarmInfo(alarmTime, alarmType, buildingId,dealState, page, limit); + } + + @Override + public int getAlarmInfoCount(String alarmTime, String alarmType, String buildingId,String dealState, int page, int limit) { + return alarmInfoMapper.getAlarmInfoCount(alarmTime, alarmType, buildingId,dealState, page, limit); + } + + @Override + public void deleteAlarmInfo(String id) { + alarmInfoMapper.deleteAlarmInfo(id); + } + + @Override + public void saveAlarmValueSet(AlarmValueSetEntity alarmValueSetEntity) { + try{ +// alarmInfoMapper.delAlarmValueSet(); //先删除 + alarmInfoMapper.saveAlarmValueSet(alarmValueSetEntity);//后保存 + + }catch (Exception e){ + e.printStackTrace(); + } + } + + @Override + public void updateDealState(String id, String dealState) { + alarmInfoMapper.updateDealState(id,dealState); + } + + + @Override + public List queryAlarmValueSet(String buildingId,String itemType, int page, int limit) { + return alarmInfoMapper.queryAlarmValueSet(buildingId,itemType,page,limit); + } + + @Override + public int getAlarmValueSetCount(String buildingId,String itemType) { + return alarmInfoMapper.getAlarmValueSetCount(buildingId,itemType); + } + + @Override + public void delAlarmValueSet(String id) { + alarmInfoMapper.delAlarmValueSet(id); + } + + @Override + public void delAlarmValueSet2(String buildingId,String itemType) { + alarmInfoMapper.delAlarmValueSet2(buildingId,itemType); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/AnalysisServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/AnalysisServiceImpl.java new file mode 100644 index 0000000..f01f726 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/AnalysisServiceImpl.java @@ -0,0 +1,43 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.AnalysisMonthEntity; +import com.mh.user.entity.AnalysisYearEntity; +import com.mh.user.mapper.AnalysisMapper; +import com.mh.user.service.AnalysisService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class AnalysisServiceImpl implements AnalysisService { + + @Autowired + AnalysisMapper analysisMapper; + + @Override + public List queryAnalysisYear(String curDate, String buildingId, int type) { + if (type==1){ + return analysisMapper.queryAnalysisWaterYear(curDate,buildingId); + }else if (type==2){ + return analysisMapper.queryAnalysisElectYear(curDate,buildingId); + }else if(type==3){ + return analysisMapper.queryAnalysisEnergyYear(curDate,buildingId); + }else { + return analysisMapper.queryAnalysisMaintainYear(curDate,buildingId); + } + } + + @Override + public List queryAnalysisMonth(String curDate, String buildingId, int type) { + if (type==1){ + return analysisMapper.queryAnalysisWaterMonth(curDate,buildingId); + }else if (type==2){ + return analysisMapper.queryAnalysisElectMonth(curDate,buildingId); + }else if (type==3){ + return analysisMapper.queryAnalysisEnergyMonth(curDate,buildingId); + }else{ + return analysisMapper.queryAnalysisMaintainMonth(curDate,buildingId); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/AreaServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/AreaServiceImpl.java new file mode 100644 index 0000000..6874f66 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/AreaServiceImpl.java @@ -0,0 +1,21 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.AreaEntity; +import com.mh.user.mapper.AreaMapper; +import com.mh.user.service.AreaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class AreaServiceImpl implements AreaService { + + @Autowired + AreaMapper areaMapper; + + public List findAll(){ + + return areaMapper.findAll(); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/BuildingServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/BuildingServiceImpl.java new file mode 100644 index 0000000..859cb65 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/BuildingServiceImpl.java @@ -0,0 +1,91 @@ +package com.mh.user.service.impl; + +import com.mh.common.http.HttpResult; +import com.mh.user.constants.SysConstants; +import com.mh.user.entity.BuildingEntity; +import com.mh.user.mapper.BuildingMapper; +import com.mh.user.model.BuildingModel; +import com.mh.user.service.BuildingService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class BuildingServiceImpl implements BuildingService { + + @Autowired + private BuildingMapper buildingMapper; + + @Override + public int saveBuilding(BuildingEntity buildingEntity) { + return buildingMapper.saveBuilding(buildingEntity); + } + + @Override + public int updateBuilding(BuildingEntity buildingEntity) { + return buildingMapper.updateBuilding(buildingEntity); + } + + @Override + public List queryBuilding(String buildingId,int page, int limit) { + return buildingMapper.queryBuilding(buildingId,page,limit); + } + + @Override + public int getCount(String buildingId,int page, int limit) { + return buildingMapper.getCount(buildingId,page,limit); + } + + @Override + public List selectBuildingName(){ + return buildingMapper.selectBuildingName(); + } + + //查询楼栋编号 + @Override + public String selectBuildingId(String buildingName) { + return buildingMapper.selectBuildingId(buildingName); + } + + @Override + public int selectCount(String buildingName) { + return buildingMapper.selectCount(buildingName); + } + + // 删除多个 + @Override + public int deleteBuilding(List records) { + for(BuildingEntity record:records) { + buildingMapper.deleteBuilding(record.getId().toString()); + } + return 0; + } + + // 删除单个 + @Override + public int deleteBuilding(String id) { + return buildingMapper.deleteBuilding(id); + } + + //通过编号查询名称 + @Override + public String queryBuildingName(String id) { + return buildingMapper.queryBuildingName(id); + } + + @Override + public Double queryTankHeight(String id) { + return buildingMapper.queryTankHeight(id); + } + + @Override + public String queryAreaId(int id) { + return buildingMapper.queryAreaId(id); + } + + @Override + public int selectPumpCount(String buildingId) { + return buildingMapper.selectPumpCount(buildingId); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/CodeTableServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/CodeTableServiceImpl.java new file mode 100644 index 0000000..5978de9 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/CodeTableServiceImpl.java @@ -0,0 +1,26 @@ +package com.mh.user.service.impl; + +import com.mh.user.mapper.CodeTableMapper; +import com.mh.user.model.DeviceTypeModel; +import com.mh.user.service.CodeTableService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CodeTableServiceImpl implements CodeTableService { + + @Autowired + CodeTableMapper codeTableMapper; + + @Override + public List queryDeviceType() { + return codeTableMapper.queryDeviceType(); + } + + @Override + public List queryBrand() { + return codeTableMapper.queryBrand(); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/ControlSetServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/ControlSetServiceImpl.java new file mode 100644 index 0000000..5ee0f39 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/ControlSetServiceImpl.java @@ -0,0 +1,33 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.ControlSetEntity; +import com.mh.user.mapper.ControlSetMapper; +import com.mh.user.service.ControlSetService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class ControlSetServiceImpl implements ControlSetService { + + @Autowired + ControlSetMapper controlSetMapper; + + @Override + public void saveControlSet(ControlSetEntity controlSetEntity) { + + + String buildingId=controlSetEntity.getBuildingId(); + int n=controlSetMapper.selectCount(buildingId); + if(n==0){ + controlSetMapper.saveControlSet(controlSetEntity); + }else{ + controlSetMapper.updateControlSet(controlSetEntity); + } + } + + @Override + public ControlSetEntity queryControlSet(String buildingId) { + + return controlSetMapper.queryControlSet(buildingId); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java new file mode 100644 index 0000000..404fcf4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java @@ -0,0 +1,151 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.DataResultEntity; +import com.mh.user.entity.DeviceInstallEntity; +import com.mh.user.mapper.DataResultMapper; +import com.mh.user.mapper.DeviceInstallMapper; +import com.mh.user.service.DataResultService; +import com.mh.user.service.DeviceInstallService; +import com.mh.user.utils.ExchangeStringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +@Service +public class DataResultServiceImpl implements DataResultService { + + @Autowired + DataResultMapper dataResultMapper; + + @Autowired + DeviceInstallMapper deviceInstallMapper; + + @Autowired + DeviceInstallService deviceInstallService; + + @Override + public void saveDataResult(DataResultEntity dataResultEntity) { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + double lastValue=0; + double calcValue=0; + double initValue=0; + double curValue=0; + double dayValue=0; + int days=0; + try{ + Date date=new Date(); //获取系统日期 + if (dataResultEntity.getCurDate()==null){ + dataResultEntity.setCurDate(date); + } + //从安装表获取设备信息 + DeviceInstallEntity deviceInstallEntity=deviceInstallMapper.selectDevice(dataResultEntity.getDeviceAddr(),dataResultEntity.getDeviceType(),dataResultEntity.getBuildingId()); + double ratio=deviceInstallEntity.getRatio(); //倍率 + initValue=deviceInstallEntity.getInitValue(); + dayValue=deviceInstallEntity.getDayValue(); + if(dataResultEntity.getDeviceType().equals("电表")){ + dayValue=1000; + }else{ + dayValue=100; + } + //判断是否有记录 + int r = dataResultMapper.selectDataResultCount(sdf1.format(dataResultEntity.getCurDate()), + dataResultEntity.getDeviceAddr(),dataResultEntity.getDeviceType()); + if (r==0){//插入记录 + DataResultEntity data=new DataResultEntity(); + data.setDeviceAddr(dataResultEntity.getDeviceAddr()); //通讯地址 + data.setDeviceType(dataResultEntity.getDeviceType()); //设备类型 + String curDate=sdf1.format(dataResultEntity.getCurDate()); + data.setCurDate(sdf1.parse(curDate)); //当前日期 + data.setCurValue(dataResultEntity.getCurValue()); //当前读数 + curValue=dataResultEntity.getCurValue(); + data.setBuildingId(deviceInstallEntity.getBuildingId()); //楼栋编号 + data.setRatio(ratio); //倍率 + lastValue=deviceInstallEntity.getLastValue(); //上次读数 + calcValue=(dataResultEntity.getCurValue()-lastValue)*ratio; //计算用量 + DecimalFormat df = new DecimalFormat("0.000"); + calcValue=Double.parseDouble(df.format(calcValue)); + + data.setCalcValue(calcValue); //用量 + if (deviceInstallEntity.getLastDate()!=null){ //上次抄表日期 + String lastDate=sdf1.format(deviceInstallEntity.getLastDate()); + data.setLastDate(sdf1.parse(lastDate)); + }else{ + String lastDate=sdf1.format(date); + data.setLastDate(sdf1.parse(lastDate)); + } + data.setLastValue(lastValue); + + //判断读数,并保存数据 + days=(int)ExchangeStringUtil.daysBetween(dataResultEntity.getCurDate(),deviceInstallEntity.getLastDate()); //计算相差天数 + if (calcValue>=0 && calcValue<=dayValue){ + dataResultMapper.saveDataResult(data); //插入新的记录 + }else if(calcValue>dayValue){ + if(days>0){ + if(calcValue/days<=dayValue){ + dataResultMapper.saveDataResult(data); + } + } + } + + }else {//修改记录的curValue、calcValue + DataResultEntity data2=dataResultMapper.selectDataResult(sdf1.format(dataResultEntity.getCurDate()),dataResultEntity.getDeviceAddr(),dataResultEntity.getDeviceType()); + lastValue=data2.getLastValue(); //安装基表上次读数 + calcValue=dataResultEntity.getCurValue()-lastValue; //计算用量 + String curDate=sdf1.format(dataResultEntity.getCurDate()); + data2.setCurDate(sdf1.parse(curDate));//当前日期 + data2.setCurValue(dataResultEntity.getCurValue());//当前读数 + data2.setCalcValue(calcValue);//用量 + + //判断读数,并保存数据 + days=(int)ExchangeStringUtil.daysBetween(dataResultEntity.getCurDate(),data2.getLastDate()); //计算相差天数 + if (calcValue>=0 && calcValue<=dayValue){ + dataResultMapper.updateDataResult(data2); //更新记录 + }else if(calcValue>dayValue){ + if(days>0){ + if(calcValue/days<=dayValue){ + dataResultMapper.saveDataResult(data2); + } + } + } + } + + //修改安装表中lastValue,lastDate,ini_value的值 + if (calcValue>=0 && calcValue<=dayValue){ + deviceInstallMapper.updateLastValue(deviceInstallEntity.getId(),String.valueOf(dataResultEntity.getCurValue()),date); + }else if(calcValue>dayValue){ + if(days>0){ + if(calcValue/days<=dayValue){ + deviceInstallMapper.updateLastValue(deviceInstallEntity.getId(),String.valueOf(dataResultEntity.getCurValue()),date); + } + } + } + if(initValue==0){//第一次采集的时候 + deviceInstallMapper.updateLastValue(deviceInstallEntity.getId(),String.valueOf(dataResultEntity.getCurValue()),date); + deviceInstallMapper.updateInitValue(dataResultEntity.getDeviceAddr(),dataResultEntity.getDeviceType(),dataResultEntity.getBuildingId(),String.valueOf(curValue)); + } + }catch (Exception e){ + //e.printStackTrace(); + } + } + + @Override + public void updateDataResult(DataResultEntity dataResultEntity) { + dataResultMapper.updateDataResult(dataResultEntity); + } + + @Override + public List queryDataResult(String buildingId, String startDate, String endDate,String deviceType, int page, int limit) { + return dataResultMapper.queryDataResult(buildingId,startDate,endDate,deviceType,page,limit); + } + + @Override + public int getDataResultCount(String buildingId, String startDate, String endDate,String deviceType, int page, int limit) { + return dataResultMapper.getDataResultCount(buildingId,startDate,endDate,deviceType,page,limit); + } + +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/DealDataServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DealDataServiceImpl.java new file mode 100644 index 0000000..c6496c3 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/DealDataServiceImpl.java @@ -0,0 +1,104 @@ +package com.mh.user.service.impl; + +import com.mh.user.mapper.DealDataMapper; +import com.mh.user.service.DealDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-28 + * @throws : + */ +@Service +public class DealDataServiceImpl implements DealDataService { + + private final DealDataMapper dealDataMapper; + + @Autowired + public DealDataServiceImpl(DealDataMapper dealDataMapper) { + this.dealDataMapper = dealDataMapper; + } + + @Override + public void proEnergy(String curDate) { + dealDataMapper.proEnergy(curDate); + } + + @Override + public void proEnergy2(String curDate) { + dealDataMapper.proEnergy2(curDate); + } + + @Override + public void proEnergySum(String curDate) { + dealDataMapper.proEnergySum(curDate); + } + + @Override + public void proEnergySum2(String curDate) { + dealDataMapper.proEnergySum2(curDate); + } + + @Override + public void proMaintainSum(String curDate) { + dealDataMapper.proMaintainSum(curDate); + } + + @Override + public void proAnalysisMonth(String curDate) { + dealDataMapper.proAnalysisMonth(curDate); + } + + @Override + public void proAnalysisYear(String curDate) { + dealDataMapper.proAnalysisYear(curDate); + } + + @Override + public void proAlarmManage(String curDate) { + dealDataMapper.proAlarmManage(curDate); + } + + @Override + public void proAlarmInfoSum(String curDate) { + dealDataMapper.proAlarmInfoSum(curDate); + } + + @Override + public void proDeviceState(String curDate) { + dealDataMapper.proDeviceState(curDate); + } + + @Override + public void dealData() { + dealDataMapper.dealData(); + } + + @Override + public void deleteChillersDataHistory() { + dealDataMapper.deleteChillersDataHistory(); + } + + @Override + public void deleteDataHistory() { + dealDataMapper.deleteDataHistory(); + } + + @Override + public void proTotalPumpMinutes(String curDate) { + dealDataMapper.proTotalPumpMinutes(curDate); + } + + @Override + public String customName() { + return dealDataMapper.customName(); + } + + @Override + public void proGatewayState() { + dealDataMapper.proGatewayState(); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/DeviceCodeParamServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DeviceCodeParamServiceImpl.java new file mode 100644 index 0000000..a3a9724 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/DeviceCodeParamServiceImpl.java @@ -0,0 +1,94 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.mapper.DeviceCodeParamMapper; +import com.mh.user.service.DeviceCodeParamService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class DeviceCodeParamServiceImpl implements DeviceCodeParamService { + + @Autowired + DeviceCodeParamMapper deviceCodeParamMapper; + + + @Override + public void insertDeviceCodeParam(DeviceCodeParamEntity deviceCodeParamEntity) { + deviceCodeParamMapper.insertDeviceCodeParam(deviceCodeParamEntity); + } + + @Override + public List queryCodeParam(String gatewayIP, String gatewayPort) { + return deviceCodeParamMapper.queryCodeParam(gatewayIP,gatewayPort); + } + + @Override + public List queryCodeParam2(String comName) { + return deviceCodeParamMapper.queryCodeParam2(comName); + } + + @Override + public List queryCodeParam3(String thread) { + return deviceCodeParamMapper.queryCodeParam3(thread); + } + + @Override + public List queryCodeParam4(String thread) { + + return deviceCodeParamMapper.queryCodeParam4(thread); + } + + @Override + public List queryCodeParam5(String thread) { + + return deviceCodeParamMapper.queryCodeParam5(thread); + } + + @Override + public int queryCount() { + return deviceCodeParamMapper.queryCount(); + } + + @Override + public int queryCount2() { + return deviceCodeParamMapper.queryCount2(); + } + + @Override + public int queryCount3() { + return deviceCodeParamMapper.queryCount3(); + } + + @Override + public void insertDeviceCodeParamList(List deviceCodeParamEntityList) { + deviceCodeParamMapper.insertDeviceCodeParamList(deviceCodeParamEntityList); + } + + @Override + public void insertDeviceCodeParamList2(List deviceCodeParamEntityList) { + deviceCodeParamMapper.insertDeviceCodeParamList2(deviceCodeParamEntityList); + } + + @Override + public void insertDeviceCodeParamList3(List deviceCodeParamEntityList) { + deviceCodeParamMapper.insertDeviceCodeParamList3(deviceCodeParamEntityList); + } + + @Override + public void selectInsertDeviceCodeParam() { + deviceCodeParamMapper.selectInsertDeviceCodeParam(); + } + + @Override + public void selectInsertDeviceCodeParam2() { + deviceCodeParamMapper.selectInsertDeviceCodeParam2(); + } + + @Override + public void selectInsertDeviceCodeParam3() { + deviceCodeParamMapper.selectInsertDeviceCodeParam3(); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/DeviceDisplayServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DeviceDisplayServiceImpl.java new file mode 100644 index 0000000..baef948 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/DeviceDisplayServiceImpl.java @@ -0,0 +1,85 @@ +package com.mh.user.service.impl; + +import com.mh.user.dto.DeviceMessageDTO; +import com.mh.user.dto.DisplayBoxDataDTO; +import com.mh.user.entity.GatewayManageEntity; +import com.mh.user.mapper.DeviceDisplayMapper; +import com.mh.user.service.DeviceDisplayService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 设备数据显示实现类 + * @updateTime 2020-05-29 + * @throws : + */ +@Service +public class DeviceDisplayServiceImpl implements DeviceDisplayService { + + // 通过构造函数调用Mapper层接口 + private final DeviceDisplayMapper deviceDisplayMapper; + + public DeviceDisplayServiceImpl(DeviceDisplayMapper deviceDisplayMapper) { + this.deviceDisplayMapper = deviceDisplayMapper; + } + + @Override + public List deviceDisplayBoxData(String deviceType, String type) { + return deviceDisplayMapper.deviceDisplayBoxData(deviceType, type); + } + + @Override + public List queryDeviceStatus(String deviceType) { + return deviceDisplayMapper.queryDeviceStatus(deviceType); + } + + /** + * 网关管理服务类 + * author:ljf + * create—date:2020-05-21 + */ + public static interface GatewayManageService { + + /** + * 根据条件查询网关信息 + * @param grade + * @param operator + * @return + */ + List queryByOther(Integer grade, Integer operator); + + /** + * 新增或更新网关信息 + * @param gatewayManageEntity + */ + void addOrUpdateGateWayInfo(GatewayManageEntity gatewayManageEntity); + + // 查询全部 + List queryAll(String gatewayID, String operator, String grade, int page, int limit); + + // 查询记录数 + int queryCount(String gatewayID, String operator, String grade); + + // 添加网关设备 + String insertGatewayManage(GatewayManageEntity gatewayManageEntity); + + // 根据网关ID删除网关设备 + void deleteGatewayManageByID(int gatewayID); + + // 根据网关ID查询设备信息 + GatewayManageEntity queryGatewayByID(Long gatewayID); + + // 设备总数 + int queryByOtherCount(int page, int size, int gatewayID); + + // 更新网关管理器的最新连接数据 + void updateGatewayManage(String IP, String port); + + // 根据grade查询对应的网关路由信息 + GatewayManageEntity queryGatewayByGrade(Long grade); + + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/DeviceFloorServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DeviceFloorServiceImpl.java new file mode 100644 index 0000000..02e06b5 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/DeviceFloorServiceImpl.java @@ -0,0 +1,125 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.*; +import com.mh.user.mapper.DeviceFloorMapper; +import com.mh.user.model.DeviceModel; +import com.mh.user.model.PumpModel; +import com.mh.user.service.DeviceFloorService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +@Service +public class DeviceFloorServiceImpl implements DeviceFloorService { + + @Autowired + private DeviceFloorMapper deviceFloorMapper; + + @Override + public int saveDevice(DeviceFloorEntity deviceFloorEntity) { + return deviceFloorMapper.saveDevice(deviceFloorEntity); + } + + @Override + public int updateDevice(DeviceFloorEntity deviceFloorEntity) { + return deviceFloorMapper.updateDevice(deviceFloorEntity); + } + + @Override + public List queryDeviceFloor(String buildingId,String deviceType,int page, int limit) { + return deviceFloorMapper.queryDeviceFloor(buildingId,deviceType,page,limit); + } + + @Override + public int getCount(String buildingId, String deviceType, int page, int limit) { + return deviceFloorMapper.getCount(buildingId,deviceType,page,limit); + } + + @Override + public List selectDeviceName(String buildingId, String deviceType) { + return deviceFloorMapper.selectDeviceName(buildingId,deviceType); + } + + @Override + public int selectDeviceCount(String buildingId, String deviceType, String deviceName) { + return deviceFloorMapper.selectDeviceCount(buildingId,deviceType,deviceName); + } + + @Override + public DeviceModel selectTankName(String buildingId, String deviceType, String pumpId) { + return deviceFloorMapper.selectTankName(buildingId,deviceType,pumpId); + } + + @Override + public String selectDeviceId(String deviceName, String deviceType,String buildingId) { + return deviceFloorMapper.selectDeviceId(deviceName,deviceType,buildingId); + } + + @Override + public PumpModel selectDeviceId2(String deviceType, String buildingId) { + return deviceFloorMapper.selectDeviceId2(deviceType,buildingId); + } + + @Override + public int deleteDevice(List records) { + for(DeviceFloorEntity record:records) { + deviceFloorMapper.deleteDevice(record.getId().toString()); + } + return 0; + } + + @Override + public int deleteDevice(String id) { + return deviceFloorMapper.deleteDevice(id); + } + + //Excel导入相关处理函数 + @Override + public void deleteDevice_floor_temp() { + deviceFloorMapper.deleteDevice_floor_temp(); + } + + @Override + public void insertDevice_floor_temp(UploadDeviceFloorEntity uploadDeviceFloorEntity) { + String deviceName = uploadDeviceFloorEntity.getDeviceName(); + String deviceType = uploadDeviceFloorEntity.getDeviceType(); + String buildingId = uploadDeviceFloorEntity.getBuildingId(); + String model=uploadDeviceFloorEntity.getModel(); + String specs=uploadDeviceFloorEntity.getSpecs(); + String rowId = uploadDeviceFloorEntity.getRowId(); + deviceFloorMapper.insertDevice_floor_temp(deviceName, deviceType, buildingId, model, specs, rowId); + } + + // 查询Excel导入的数据 + @Override + public List queryExcelDevices(){ + return deviceFloorMapper.queryExcelDevices(); + }; + + // 查询Excel导入的数据的记录数 + @Override + public int queryExcelDevicesCount(){ + return deviceFloorMapper.queryExcelDevicesCount(); + }; + + // 在导入中的数据有重复 + @Override + public void updateDevice_floor_temp__multiple() { + deviceFloorMapper.updateDevice_floor_temp__multiple(); + } + + /** + * @author nxr + * @title : + * @description :判断导入资料数据的合法性 + * @updateTime 2022-06-19 + * @throws : + */ + public void updateDevice_floor_temp(){ + //判断通讯地址,在导入中的数据有重复 + deviceFloorMapper.updateDevice_floor_temp__multiple(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java new file mode 100644 index 0000000..33d8097 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java @@ -0,0 +1,244 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.DeviceInstallEntity; +import com.mh.user.entity.DeviceInstallTempEntity; +import com.mh.user.entity.UploadDeviceInstallEntity; +import com.mh.user.exception.CommonNum; +import com.mh.user.exception.ServiceRuntimeException; +import com.mh.user.mapper.DeviceInstallMapper; +import com.mh.user.mapper.provider.DeviceInstallProvider; +import com.mh.user.model.DeviceModel; +import com.mh.user.serialport.SerialPortSendReceive; +import com.mh.user.service.DeviceInstallService; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.SelectProvider; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +@Slf4j +@Service +public class DeviceInstallServiceImpl implements DeviceInstallService { + + @Autowired + private DeviceInstallMapper deviceInstallMapper; + + @Override + public int saveDevice(DeviceInstallEntity deviceInstallEntity) { + return deviceInstallMapper.saveDevice(deviceInstallEntity); + } + + @Override + public int updateDevice(DeviceInstallEntity deviceInstallEntity) { + return deviceInstallMapper.updateDevice(deviceInstallEntity); + } + + @Override + public void updateLastValue(Long id, String lastValue, Date lastDate) { + deviceInstallMapper.updateLastValue(id,lastValue,lastDate); + } + + @Override + public List getAllDevice(int page, int limit) { + return deviceInstallMapper.getAllDevice(page,limit); + } + + @Override + public List selectDeviceParams() { + return deviceInstallMapper.selectDeviceParams(); + } + + @Override + public List selectDeviceParams2() { + return deviceInstallMapper.selectDeviceParams2(); + } + + @Override + public List selectDevicePump() { + return deviceInstallMapper.selectDevicePump(); + } + + // 查询所有启用的设备 + @Override + public int getAllCount(){ + return deviceInstallMapper.getAllCount(); + } + + @Override + public List queryDevice(String buildingId,String deviceType, String startDate, String endDate,String isOnline, String isUse,String isFault,int page, int limit) { + return deviceInstallMapper.queryDevice(buildingId,deviceType,startDate, endDate,isOnline,isUse, isFault,page, limit); + } + + @Override + public int getCount(String buildingId,String deviceType, String startDate, String endDate,String isOnline, String isUse, String isFault, int page, int limit) { + return deviceInstallMapper.getCount(buildingId,deviceType, startDate, endDate,isOnline,isUse, isFault, page, limit); + } + + //查询设备故障情况 + @Override + public int getIsFaultCount(String isFault,String deviceType){ + return deviceInstallMapper.getIsFaultCount(isFault,deviceType); + } + + //查询设备在线情况 + @Override + public int getIsOnlineCount(String isOnline,String deviceType){ + return deviceInstallMapper.getIsOnlineCount(isOnline,deviceType); + } + + @Override + public void updateOnline(String deviceAddr, String deviceType,String buildingId,String isOnline) { + deviceInstallMapper.updateOnline(deviceAddr,deviceType,buildingId,isOnline); + } + + @Override + public void updateNotOnline(String deviceAddr, String deviceType,String buildingId,String isOnline) { + deviceInstallMapper.updateNotOnline(deviceAddr,deviceType,buildingId,isOnline); + } + + //根据通讯地址和设备类型查询对应的设备信息 + @Override + public DeviceInstallEntity selectDevice(String deviceAddr, String deviceType,String buildingId) { + return deviceInstallMapper.selectDevice(deviceAddr,deviceType,buildingId); + } + + @Override + public int selectDeviceCount(String deviceAddr, String deviceType) { + return deviceInstallMapper.selectDeviceCount(deviceAddr,deviceType); + } + + @Override + public int deleteDevice(List records) { + for(DeviceInstallEntity record:records) { + deviceInstallMapper.deleteDevice(record.getId().toString()); + } + return 0; + } + + @Override + public int deleteDevice(String id) { + return deviceInstallMapper.deleteDevice(id); + } + + //Excel导入相关处理函数 + @Override + public void deleteDevice_install_temp() { + deviceInstallMapper.deleteDevice_install_temp(); + } + + @Override + public void insertDevice_install_temp(UploadDeviceInstallEntity uploadDeviceInstallEntity) { + String deviceAddr = uploadDeviceInstallEntity.getDeviceAddr(); + String deviceName = uploadDeviceInstallEntity.getDeviceName(); + String deviceType = uploadDeviceInstallEntity.getDeviceType(); + int baudRate = uploadDeviceInstallEntity.getBaudRate(); + String dataCom = uploadDeviceInstallEntity.getDataCom(); + double ratio = uploadDeviceInstallEntity.getRatio(); + String buildingId = uploadDeviceInstallEntity.getBuildingId(); + String rowId = uploadDeviceInstallEntity.getRowId(); + deviceInstallMapper.insertDevice_install_temp(deviceAddr, deviceName, deviceType, baudRate, dataCom, ratio, buildingId, rowId); + } + + // 查询Excel导入的数据 + @Override + public List queryExcelDevices(){ + return deviceInstallMapper.queryExcelDevices(); + }; + + // 查询Excel导入的数据的记录数 + @Override + public int queryExcelDevicesCount(){ + return deviceInstallMapper.queryExcelDevicesCount(); + }; + + // 在导入中的数据有重复 + @Override + public void updateDevice_install_temp__multiple() { + deviceInstallMapper.updateDevice_install_temp__multiple(); + } + + /** + * @author nxr + * @title : + * @description :判断导入资料数据的合法性 + * @updateTime 2022-06-19 + * @throws : + */ + public void updateDevice_install_temp(){ + //判断通讯地址,在导入中的数据有重复 + deviceInstallMapper.updateDevice_install_temp__multiple(); + } + + //从临时表查询插入 + @Override + public void insertFromDevice_install_temp() { + deviceInstallMapper.insertFromDevice_install_temp(); + deviceInstallMapper.deleteDevice_install_temp(); + } + + //修改设备启用状态 + @Override + public void updateDeviceIsUse(String isUse, String deviceAddr) { + deviceInstallMapper.updateDeviceIsUse(isUse,deviceAddr); + } + + @Override + public List selectDevices(String buildingId, String deviceType) { + return deviceInstallMapper.selectDevices(buildingId, deviceType); + } + + @Override + public void updateDeviceFault(String isFault, String deviceAddr, String deviceType) { + deviceInstallMapper.updateDeviceFault(isFault,deviceAddr,deviceType); + } + + //查询设备品牌 + @Override + public String selectBrand(String buildingId,String deviceAddr) { + return deviceInstallMapper.selectBrand(buildingId,deviceAddr); + } + + @Override + public void updateIsUse(String isUse, String deviceAddr, String deviceType, String buildingId) { + deviceInstallMapper.updateIsUse(isUse, deviceAddr, deviceType, buildingId); + } + + @Override + public void updateIsUse2(String isUse, String deviceAddr, String deviceType, String buildingId) { + deviceInstallMapper.updateIsUse2(isUse, deviceAddr, deviceType, buildingId); + } + + @Override + public void updateIsUse3(String isUse, String deviceAddr, String deviceType, String buildingId) { + deviceInstallMapper.updateIsUse3(isUse, deviceAddr, deviceType, buildingId); + } + + @Override + public void deletePump(String deviceAddr, String deviceType, String buildingId) { + deviceInstallMapper.deletePump(deviceAddr, deviceType, buildingId); + } + + @Override + public void updateInitValue(String deviceAddr, String deviceType, String buildingId, String initValue) { + deviceInstallMapper.updateInitValue(deviceAddr, deviceType, buildingId, initValue); + } + + @Override + public String selectLastDate(String deviceType, String deviceAddr,String buildingId) { + return deviceInstallMapper.selectLastDate(deviceType,deviceAddr,buildingId); + } + + @Override + public int judgePump(String buildingId) { + return deviceInstallMapper.judgePump(buildingId); + } + + @Override + public String selectSeat(String deviceType, String deviceAddr, String buildingId) { + return deviceInstallMapper.selectSeat(deviceType, deviceAddr, buildingId); + } +} + diff --git a/user-service/src/main/java/com/mh/user/service/impl/DeviceManageServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DeviceManageServiceImpl.java new file mode 100644 index 0000000..06854ab --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/DeviceManageServiceImpl.java @@ -0,0 +1,77 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.mapper.DeviceManageMapper; +import com.mh.user.service.DeviceManageService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-14 + * @throws : + */ +@Slf4j +@Component +@Service +public class DeviceManageServiceImpl implements DeviceManageService { + + // 构造方法注入 + private final DeviceManageMapper deviceManageMapper; + + @Autowired + public DeviceManageServiceImpl(DeviceManageMapper deviceManageMapper) { + this.deviceManageMapper = deviceManageMapper; + } + + @Override + public List getDeviceByOther(String deviceNum) { + return deviceManageMapper.getDeviceByOther(deviceNum); + } + + @Override + public void addOrUpdateBaseMeter(DeviceManageEntity deviceManageEntity) { + if(deviceManageEntity.getType().equals("edit")){ + deviceManageMapper.updateBaseMeter(deviceManageEntity); + }else if(deviceManageEntity.getType().equals("add")){ + deviceManageMapper.insertBaseMeter(deviceManageEntity); + } + } + + /** + * 删除设备信息 + * @param deviceId + * @param deviceType + */ + @Override + public void deleteDeviceInfo(Integer deviceId, String deviceType) { + deviceManageMapper.deleteDeviceInfo(deviceId,deviceType); + } + + @Override + public List queryDevicesByType(String deviceType) { + return deviceManageMapper.queryDevicesByType(deviceType); + } + + @Override + public List queryAllDevice() { + log.info("查询全部设备------------------"); + return deviceManageMapper.queryAllDevice(); + } + + @Override + public List queryDeviceByOther(int page, int size, String deviceNum) { + return deviceManageMapper.queryDeviceByOther(page, size, deviceNum); + } + + @Override + public int queryDeviceByOtherCount(String deviceNum) { + return deviceManageMapper.queryDeviceByOtherCount(deviceNum); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/DeviceParamServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DeviceParamServiceImpl.java new file mode 100644 index 0000000..21b5280 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/DeviceParamServiceImpl.java @@ -0,0 +1,76 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.DeviceParameterEntity; +import com.mh.user.mapper.DeviceParamMapper; +import com.mh.user.service.DeviceParamService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 实现类 + * @updateTime 2020-05-21 + * @throws : + */ +@Service +public class DeviceParamServiceImpl implements DeviceParamService { + + private final DeviceParamMapper deviceParamMapper; + + public DeviceParamServiceImpl(DeviceParamMapper deviceParamMapper) { + this.deviceParamMapper = deviceParamMapper; + } + + @Override + public List getBaseMeterParamList(String baseMeterType) { + return deviceParamMapper.getBaseMeterParamList(baseMeterType); + } + + @Override + public void addOrUpdateBaseMeterParam(DeviceParameterEntity deviceParameterEntity) { + if(deviceParameterEntity.getType().equals("edit")){ + deviceParamMapper.updateBaseMeterParam(deviceParameterEntity); + }else if(deviceParameterEntity.getType().equals("add")){ + deviceParamMapper.insertBaseMeterParam(deviceParameterEntity); + } + } + + @Override + public String insertDeviceParam(DeviceParameterEntity deviceParameterEntity) { + // 判断是否已经包含 + DeviceParameterEntity deviceParameterEntity1 = deviceParamMapper.queryParamById(deviceParameterEntity.getParamId()); + if (deviceParameterEntity1.getId() != null) { + return "数据重复,请重新插入"; + } else { + deviceParamMapper.insertDeviceParam(deviceParameterEntity); + return "数据插入成功"; + } + } + + @Override + public void deleteDeviceParamByID(Long id) { + deviceParamMapper.deleteDeviceParamByID(id); + } + + @Override + public DeviceParameterEntity queryParamById(int paramId) { + return deviceParamMapper.queryParamById(paramId); + } + + @Override + public List queryAll() { + return deviceParamMapper.queryAll(); + } + + @Override + public List queryByOther(int page, int size, int paramId) { + return deviceParamMapper.queryByOther(page, size, paramId); + } + + @Override + public int queryByOtherCount(int page, int size, int paramId) { + return deviceParamMapper.queryByOtherCount(page, size, paramId); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/EnergyServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/EnergyServiceImpl.java new file mode 100644 index 0000000..7185788 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/EnergyServiceImpl.java @@ -0,0 +1,132 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.EnergyEntity; +import com.mh.user.mapper.EnergyMapper; +import com.mh.user.model.SumModel; +import com.mh.user.service.EnergyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class EnergyServiceImpl implements EnergyService { + + @Autowired + EnergyMapper energyMapper; + + @Override + public void saveEnergy(EnergyEntity energyEntity,int type) { + + if(type==1){ // 保存天 + energyMapper.saveEnergyDay(energyEntity); + }else if(type==2){ // 保存月 + energyMapper.saveEnergyMonth(energyEntity); + }else if(type==3){ // 保存年 + energyMapper.saveEnergyYear(energyEntity); + } + } + + @Override + public void updateEnergy(EnergyEntity energyEntity,int type) { + + if(type==1){ + energyMapper.updateEnergyDay(energyEntity); + } else if (type==2){ + energyMapper.updateEnergyMonth(energyEntity); + } else if (type==3){ + energyMapper.updateEnergyYear(energyEntity); + } + } + + @Override + public void deleteEnergy(String curDate, String buildingId,int type) { + + if(type==1){ + energyMapper.deleteEnergyDay(curDate,buildingId); + } else if (type==2){ + energyMapper.deleteEnergyMonth(curDate,buildingId); + } else if (type==3){ + energyMapper.deleteEnergyYear(curDate,buildingId); + } + } + + @Override + public List queryEnergy(String buildingId, String startDate,String endDate, int page, int limit,int type) { + List list=new ArrayList(); + if(type==1) { + list=energyMapper.queryEnergyDay(buildingId,startDate,endDate,page,limit); + } else if (type==2){ + list=energyMapper.queryEnergyMonth(buildingId,startDate,endDate,page,limit); + System.out.println(list); + } else if (type==3){ + list=energyMapper.queryEnergyYear(buildingId,startDate,endDate,page,limit); + } + return list; + } + + @Override + public int getEnergyCount(String buildingId, String startDate,String endDate, int page, int limit,int type) { + int r=0; // 记录数 + if(type==1) { + r=energyMapper.getEnergyDayCount(buildingId,startDate,endDate, page, limit); + }else if (type==2){ + r=energyMapper.getEnergyMonthCount(buildingId,startDate,endDate, page, limit); + } else if (type==3){ + r=energyMapper.getEnergyYearCount(buildingId,startDate,endDate, page, limit); + } + return r; + } + + @Override + public List queryEnergyGroup(String curDate, int type) { + if(type==2) { + return energyMapper.queryEnergyMonthGroup(curDate); + }else if (type==3){ + return energyMapper.queryEnergyYearGroup(curDate); + }else { + return energyMapper.queryEnergyDayGroup(curDate); + } + } + + @Override + public List queryDayEnergy(String buildingId, String startDate, String endDate, int page, int limit) { + return energyMapper.queryDayEnergy(buildingId,startDate,endDate,page,limit); + } + + @Override + public int getDayEnergyCount(String buildingId, String startDate, String endDate, int page, int limit) { + return energyMapper.getDayEnergyCount(buildingId,startDate,endDate,page,limit); + } + + @Override + public List queryHourEnergy(String buildingId, String curDate, int page, int limit) { + return energyMapper.queryHourEnergy(buildingId,curDate,page,limit); + } + + @Override + public int getHourEnergyCount(String buildingId, String curDate) { + return energyMapper.getHourEnergyCount(buildingId,curDate); + } + + @Override + public List queryEnergyBuilding(int page, int limit) { + return energyMapper.queryEnergyBuilding(page,limit); + } + + @Override + public int getEnergyBuildingCount() { + return energyMapper.getEnergyBuildingCount(); + } + + @Override + public void proEnergyBuilding(String curDate, String endDate, int type) { + energyMapper.proEnergyBuilding(curDate,endDate,type); + } + + @Override + public SumModel queryEnergySum() { + return energyMapper.queryEnergySum(); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/ExceptionServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/ExceptionServiceImpl.java new file mode 100644 index 0000000..b45b0ad --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/ExceptionServiceImpl.java @@ -0,0 +1,47 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.ExceptionEntity; +import com.mh.user.entity.ExceptionTableData; +import com.mh.user.mapper.ExceptionMapper; +import com.mh.user.service.ExceptionService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-31 + * @throws : + */ +@Service +public class ExceptionServiceImpl implements ExceptionService { + + private final ExceptionMapper exceptionMapper; + + public ExceptionServiceImpl(ExceptionMapper exceptionMapper) { + this.exceptionMapper = exceptionMapper; + } + + @Override + public List queryException(ExceptionEntity exceptionEntity) { + return exceptionMapper.queryException(exceptionEntity); + } + + @Override + public int queryExceptionTotal(ExceptionEntity exceptionEntity) { + return exceptionMapper.queryExceptionTotal(exceptionEntity); + } + + @Override + public String updateException(ExceptionTableData exceptionTableData) { + int a = exceptionMapper.updateException(exceptionTableData); + if (a != 0) { + return "success"; + } else { + return "fail"; + } + } + +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/GatewayManageServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/GatewayManageServiceImpl.java new file mode 100644 index 0000000..0973c14 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/GatewayManageServiceImpl.java @@ -0,0 +1,100 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.GatewayManageEntity; +import com.mh.user.mapper.GatewayManageMapper; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 网关管理实现类 + * @updateTime 2020-05-21 + * @throws : + */ +@Service +public class GatewayManageServiceImpl implements DeviceDisplayServiceImpl.GatewayManageService { + + // 通过构造函数注入,引用Mapper + private final GatewayManageMapper gatewayManageMapper; + + public GatewayManageServiceImpl(GatewayManageMapper gatewayManageMapper) { + this.gatewayManageMapper = gatewayManageMapper; + } + + /** + * 按条件查询网关信息 + * @param grade + * @param operator + * @return + */ + @Override + public List queryByOther(Integer grade, Integer operator) { + return gatewayManageMapper.queryByOther(grade, operator); + } + + //查询所有记录 + @Override + public List queryAll(String gatewayID, String operator, String grade, int page, int limit) { + return gatewayManageMapper.queryAll(gatewayID,operator,grade,page,limit); + } + + //查询记录数 + @Override + public int queryCount(String gatewayID, String operator, String grade){ + return gatewayManageMapper.queryCount(gatewayID,operator,grade); + } + + /** + * 新增或更新网关信息 + * @param gatewayManageEntity + */ + @Override + public void addOrUpdateGateWayInfo(GatewayManageEntity gatewayManageEntity) { + if(gatewayManageEntity.getType().equals("edit")){ + // 更新 + gatewayManageMapper.updateGateWayInfo(gatewayManageEntity); + } else if (gatewayManageEntity.getType().equals("add")) { + // 新增 + gatewayManageMapper.insertGateWayInfo(gatewayManageEntity); + } + } + @Override + public String insertGatewayManage(GatewayManageEntity gatewayManageEntity) { + // 判断是否已经包含 + GatewayManageEntity gatewayManageEntity1 = gatewayManageMapper.queryGatewayByID(gatewayManageEntity.getId()); + + if (gatewayManageEntity1.getId() != null) { + return "数据重复,请重新插入"; + } else { + gatewayManageMapper.insertGatewayManage(gatewayManageEntity); + return "数据插入成功"; + } + } + + @Override + public void deleteGatewayManageByID(int gatewayID) { + gatewayManageMapper.deleteGatewayManageByID(gatewayID); + } + + @Override + public GatewayManageEntity queryGatewayByID(Long gatewayID) { + return gatewayManageMapper.queryGatewayByID(gatewayID); + } + + @Override + public int queryByOtherCount(int page, int size, int gatewayID) { + return gatewayManageMapper.queryByOtherCount(page, size, gatewayID); + } + + @Override + public void updateGatewayManage(String IP, String port) { + gatewayManageMapper.updateGatewayManage(IP, port); + } + + @Override + public GatewayManageEntity queryGatewayByGrade(Long grade) { + return gatewayManageMapper.queryGatewayByGrade(grade); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/GaugeServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/GaugeServiceImpl.java new file mode 100644 index 0000000..604ca38 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/GaugeServiceImpl.java @@ -0,0 +1,51 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.GaugeEntity; +import com.mh.user.entity.TableChartMessageEntity; +import com.mh.user.mapper.GaugeMapper; +import com.mh.user.service.GaugeService; +import org.springframework.stereotype.Service; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-08-07 + * @throws : + */ +@Service +public class GaugeServiceImpl implements GaugeService { + + private final GaugeMapper gaugeMapper; + + public GaugeServiceImpl(GaugeMapper gaugeMapper) { + this.gaugeMapper = gaugeMapper; + } + + + @Override + public GaugeEntity getGaugeData(String type, String deviceName) { + try { + TableChartMessageEntity tableChartMessageEntity = gaugeMapper.queryDeviceId(type, deviceName); + GaugeEntity gaugeEntity = gaugeMapper.getGaugeData(tableChartMessageEntity.getTimeName(),tableChartMessageEntity.getGrade()); + if (type.equalsIgnoreCase("0")) { + gaugeEntity.setMax("5000"); + } else if (type.equalsIgnoreCase("1")) { + gaugeEntity.setMax("20"); + } else if (type.equalsIgnoreCase("2")) { + gaugeEntity.setMax("2500"); + } else if (type.equalsIgnoreCase("3")) { + gaugeEntity.setMax("10"); + } + return gaugeEntity; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + @Override + public TableChartMessageEntity queryDeviceId(String type, String deviceName) { + return gaugeMapper.queryDeviceId(type, deviceName); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/MaintainInfoServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/MaintainInfoServiceImpl.java new file mode 100644 index 0000000..75e76e1 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/MaintainInfoServiceImpl.java @@ -0,0 +1,41 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.MaintainInfoEntity; +import com.mh.user.mapper.MaintainInfoMapper; +import com.mh.user.service.MaintainInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class MaintainInfoServiceImpl implements MaintainInfoService { + + @Autowired + MaintainInfoMapper maintainInfoMapper; + + @Override + public int saveMaintainInfo(MaintainInfoEntity maintainInfoEntity) { + return maintainInfoMapper.saveMaintainInfo(maintainInfoEntity); + } + + @Override + public int updateMaintainInfo(MaintainInfoEntity maintainInfoEntity) { + return maintainInfoMapper.updateMaintainInfo(maintainInfoEntity); + } + + @Override + public List queryMaintainInfo(String curDate,String buildingId, String deviceType, int page, int limit) { + return maintainInfoMapper.queryMaintainInfo(curDate,buildingId,deviceType,page,limit); +} + + @Override + public int getMaintainInfoCount(String curDate,String buildingId, String deviceType, int page, int limit) { + return maintainInfoMapper.getMaintainInfoCount(curDate,buildingId,deviceType,page,limit); + } + + @Override + public void deleteMaintainInfo(String id) { + maintainInfoMapper.deleteMaintainInfo(id); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java new file mode 100644 index 0000000..eb99c16 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java @@ -0,0 +1,505 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.*; +import com.mh.user.mapper.DeviceFloorMapper; +import com.mh.user.mapper.DeviceInstallMapper; +import com.mh.user.mapper.NowDataMapper; +import com.mh.user.mapper.NowPublicDataMapper; +import com.mh.user.model.DeviceModel; +import com.mh.user.model.PumpModel; +import com.mh.user.model.WaterLevelModel; +import com.mh.user.service.BuildingService; +import com.mh.user.service.DeviceInstallService; +import com.mh.user.service.NowDataService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +@Slf4j +@Service +public class NowDataServiceImpl implements NowDataService { + + @Autowired + NowDataMapper nowDataMapper; + + @Autowired + NowPublicDataMapper nowPublicDataMapper; + + @Autowired + DeviceInstallService deviceInstallService; + + @Autowired + DeviceInstallMapper deviceInstallMapper; + + @Autowired + DeviceFloorMapper deviceFloorMapper; + + @Autowired + BuildingService buildingService; + + @Override + public void saveNowData(NowDataEntity nowDataEntity) { + nowDataMapper.saveNowData(nowDataEntity); + } + + //保存热泵采集数据 + @Override + public void saveNowHistoryData(String pumpId, String deviceType, String strData,String dataType,String buildingId) { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + String strDate=sdf1.format(date); + strDate=strDate.substring(0,13)+":00:00"; + + NowDataEntity data=new NowDataEntity(); + try{ + if (dataType.equals("tempSet")){ //温度设定 + data.setTempSet(strData); + }else if (dataType.equals("waterTemp")){ //水箱水温 + data.setWaterTemp(strData); + }else if (dataType.equals("runState")){ //运行状态 + data.setRunState(strData); + }else if (dataType.equals("isFault")){ //是否故障 + data.setIsFault(strData); + } + //从安装表获取设备信息 + DeviceInstallEntity deviceInstallEntity=deviceInstallMapper.selectDevice(pumpId,deviceType,buildingId); + //获取对应水箱信息 + DeviceModel tank=deviceFloorMapper.selectTankName(buildingId,"水箱",pumpId); + if (tank!=null){ + data.setTankId(String.valueOf(tank.getId())); //对应水箱编号 + data.setTankName(tank.getDeviceName()); //对应水箱名称 + } + String buildingName=buildingService.queryBuildingName(buildingId); + //判断实时表是否有记录 + int r1 = nowDataMapper.selectNowDataCount(deviceInstallEntity.getBuildingId(),pumpId);//判断now_data表是否存在记录 + if(r1==0){ + data.setPumpId(pumpId); //通讯地址 + data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址 + data.setBuildingId(deviceInstallEntity.getBuildingId()); + data.setBuildingName(buildingName); + nowDataMapper.saveNowData(data); + } else { + NowDataEntity data1=nowDataMapper.selectNowData(deviceInstallEntity.getBuildingId(),pumpId); + if (data1!=null){ + if (dataType.equals("tempSet")){ //温度设定 + data1.setTempSet(strData); + }else if (dataType.equals("waterTemp")){ //水箱水温 + data1.setWaterTemp(strData); + }else if (dataType.equals("runState")){ //运行状态 + data1.setRunState(strData); + }else if (dataType.equals("isFault")){ //是否故障 + data1.setIsFault(strData); + } + nowDataMapper.updateNowData(data1); + } + } + //判断历史表是否有记录 + int r2 = nowDataMapper.selectHistoryDataCount(strDate,deviceInstallEntity.getBuildingId(),pumpId);//判断now_data表是否存在记录 + if (r2==0){ + data.setPumpId(pumpId); //通讯地址 + data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址 + data.setBuildingId(deviceInstallEntity.getBuildingId()); + data.setBuildingName(buildingName); + data.setCurDate(strDate); + nowDataMapper.saveHistoryData(data); + }else { + NowDataEntity data2=nowDataMapper.selectHistoryData(strDate,deviceInstallEntity.getBuildingId(),pumpId); + if (data2!=null){ + if (dataType.equals("tempSet")){ //温度设定 + data2.setTempSet(strData); + }else if (dataType.equals("waterTemp")){ //水箱水温 + data2.setWaterTemp(strData); + }else if (dataType.equals("runState")){ //运行状态 + data2.setRunState(strData); + }else if (dataType.equals("isFault")){ //是否故障 + data2.setIsFault(strData); + } + nowDataMapper.updateHistoryData(data2); + } + } + }catch (Exception e){ + e.printStackTrace(); + } + } + + //非热泵温控、状态检测数据 + @Override + public void saveNowHistoryData2(String deviceAddr, String deviceType, String strData, String dataType,String buildingId) { + NowDataEntity data=new NowDataEntity(); + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + String strDate=sdf1.format(date); + strDate=strDate.substring(0,13)+":00:00"; + + try{ + if (dataType.equals("tempSet")){ //温度设定 + data.setTempSet(strData); + }else if (dataType.equals("waterTemp")){ //水箱水温 + data.setWaterTemp(strData); + }else if (dataType.equals("runState")){ //运行状态 + data.setRunState(strData); + }else if (dataType.equals("isFault")){ //是否故障 + data.setIsFault(strData); + }else if (dataType.equals("levelSet")){ //水位设定 + data.setLevelSet(strData); + }else if (dataType.equals("waterLevel")){//实际水位 + data.setWaterLevel(strData); + } + //从安装表获取设备信息 + DeviceInstallEntity deviceInstallEntity=deviceInstallMapper.selectDevice(deviceAddr,deviceType,buildingId); + String buildingName=buildingService.queryBuildingName(buildingId); + data.setBuildingName(buildingName); + if (deviceType.equals("温控")) { + //为了兼容旧系统,旧系统热泵信息保存在楼面表,从楼面表获取热泵资料 + PumpModel pump=deviceFloorMapper.selectDeviceId2("热泵",buildingId); + String pumpId="1"; + String pumpName="热泵1"; + if (pump!=null){ + pumpId=pump.getPumpId(); + pumpName=pump.getPumpName(); + //获取对应水箱信息 + DeviceModel tank=deviceFloorMapper.selectTankName(buildingId,"水箱",pumpId); + if (tank!=null){ + data.setTankId(String.valueOf(tank.getId())); //对应水箱编号 + data.setTankName(tank.getDeviceName()); //对应水箱名称 + }else{ + data.setTankId("1"); //对应水箱编号 + data.setTankName("水箱1"); //对应水箱名称 + } + } + data.setPumpId(pumpId); //热泵编号 + data.setPumpName(pumpName); //通讯地址 + } + data.setBuildingId(buildingId); + data.setCurDate(strDate); + //判断实时表是否有记录 + int r1 = nowDataMapper.selectNowDataCount2(buildingId);//判断now_data表是否存在记录 + if (r1==0){ + nowDataMapper.saveNowData(data); + }else { + if (deviceType.equals("压变")) { + String seat=deviceInstallService.selectSeat("压变",deviceAddr,buildingId); + log.info("-------楼栋:"+buildingName+",类型:"+deviceType+",地址:"+deviceAddr+",区位:"+seat+",数值:"+strData+"------"); + if (seat!=null){ + nowDataMapper.nowDataWaterLevel(strData,seat,buildingId); + }else{ + nowDataMapper.updateNowData2(data); + } + }else if (deviceType.equals("水位开关")){ + String seat=deviceInstallService.selectSeat("水位开关",deviceAddr,buildingId); + log.info("-------楼栋:"+buildingName+",类型:"+deviceType+",地址:"+deviceAddr+",区位:"+seat+",数值:"+strData+"------"); + if (seat!=null){ + nowDataMapper.nowDataLevelSet(strData,seat,buildingId); + }else{ + nowDataMapper.updateNowData2(data); + } + }else{ + nowDataMapper.updateNowData2(data); + } + } + //判断历史表是否有记录 + int r2 = nowDataMapper.selectHistoryDataCount2(strDate,buildingId);//判断history_Data表是否存在记录 + if (r2==0){ + nowDataMapper.saveHistoryData(data); + }else { + if (deviceType.equals("压变")) { + String seat=deviceInstallService.selectSeat("压变",deviceAddr,buildingId); + if (seat!=null){ + nowDataMapper.historyDataWaterLevel(strData,seat,buildingId,""); + log.info("------楼栋:"+buildingName+",历史记录压变区位:"+seat+"------"); + }else{ + nowDataMapper.updateHistoryData2(data); + } + }else if (deviceType.equals("水位开关")){ + String seat=deviceInstallService.selectSeat("水位开关",deviceAddr,buildingId); + if (seat!=null){ + nowDataMapper.historyDataLevelSet(strData,seat,buildingId,""); + log.info("------楼栋:"+buildingName+",历史记录水位开关区位:"+seat+"------"); + }else{ + nowDataMapper.updateHistoryData2(data); + } + }else{ + nowDataMapper.updateHistoryData2(data); + } + } + }catch (Exception e){ + e.printStackTrace(); + } + } + + //非热泵温度变送器、状态检测相关数据 + @Override + public void saveNowHistoryData3(String pumpId, String deviceType, String strData,String dataType,String buildingId) { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + String strDate=sdf1.format(date); + strDate=strDate.substring(0,13)+":00:00"; + NowDataEntity data=new NowDataEntity(); + try{ + if (dataType.equals("tempSet")){ //温度设定 + data.setTempSet(strData); + }else if (dataType.equals("waterTemp")){ //水箱水温 + data.setWaterTemp(strData); + }else if (dataType.equals("runState")){ //运行状态 + data.setRunState(strData); + }else if (dataType.equals("isFault")){ //是否故障 + data.setIsFault(strData); + } + String buildingName=buildingService.queryBuildingName(buildingId); + //判断实时表是否有记录 + int r1 = nowDataMapper.selectNowDataCount(buildingId,pumpId);//判断now_data表是否存在记录 + if(r1==0){ + data.setPumpId(pumpId); //热泵编号 + String pumpName="热泵"+pumpId; + data.setPumpName(pumpName); //热泵名称 + data.setBuildingId(buildingId); + data.setBuildingName(buildingName); + nowDataMapper.saveNowData(data); + } else { + NowDataEntity data1=nowDataMapper.selectNowData(buildingId,pumpId); + if (data1!=null){ + if (dataType.equals("tempSet")){ //温度设定 + data1.setTempSet(strData); + }else if (dataType.equals("waterTemp")){ //水箱水温 + data1.setWaterTemp(strData); + }else if (dataType.equals("runState")){ //运行状态 + data1.setRunState(strData); + }else if (dataType.equals("isFault")){ //是否故障 + data1.setIsFault(strData); + } + nowDataMapper.updateNowData(data1); + } + } + //判断历史表是否有记录 + int r2 = nowDataMapper.selectHistoryDataCount(strDate,buildingId,pumpId);//判断now_data表是否存在记录 + if (r2==0){ + data.setPumpId(pumpId); //热泵编号 + String pumpName="热泵"+pumpId; + data.setPumpName(pumpName); //热泵名称 + data.setBuildingId(buildingId); + data.setBuildingName(buildingName); + data.setCurDate(strDate); + nowDataMapper.saveHistoryData(data); + }else { + NowDataEntity data2=nowDataMapper.selectHistoryData(strDate,buildingId,pumpId); + if (data2!=null){ + if (dataType.equals("tempSet")){ //温度设定 + data2.setTempSet(strData); + }else if (dataType.equals("waterTemp")){ //水箱水温 + data2.setWaterTemp(strData); + }else if (dataType.equals("runState")){ //运行状态 + data2.setRunState(strData); + }else if (dataType.equals("isFault")){ //是否故障 + data2.setIsFault(strData); + } + nowDataMapper.updateHistoryData(data2); + } + } + }catch (Exception e){ + e.printStackTrace(); + } + } + + @Override + public void updateNowData(NowDataEntity nowDataEntity) { + nowDataMapper.updateNowData(nowDataEntity); + } + + @Override + public List queryNowData(String buildingId) { + nowDataMapper.updateTempSet(buildingId); + nowDataMapper.updateLevelSet(buildingId); + return nowDataMapper.queryNowData(buildingId); + } + + @Override + public NowDataEntity queryNowDataByPump(String buildingId,String pumpId) { + return nowDataMapper.queryNowDataByPump(buildingId,pumpId); + } + + @Override + public void saveHistoryData(NowDataEntity nowDataEntity) { + nowDataMapper.saveHistoryData(nowDataEntity); + } + + @Override + public void updateHistoryData(NowDataEntity nowDataEntity) { + nowDataMapper.updateHistoryData(nowDataEntity); + } + + @Override + public List queryHistoryData(String curDate, String buildingId,String pumpId,String tankId, int page, int limit) { + return nowDataMapper.queryHistoryData(curDate,buildingId,pumpId,tankId,page,limit); + } + + @Override + public int getHistoryDataCount(String curDate, String buildingId,String pumpId,String tankId, int page, int limit) { + return nowDataMapper.getHistoryDataCount(curDate,buildingId,pumpId,tankId,page,limit); + } + + @Override + public List queryWaterLevel(String curDate, String buildingID, int page, int limit) { + return nowDataMapper.queryWaterLevel(curDate,buildingID,page,limit); + } + + @Override + public int getWaterLevelCount(String curDate, String buildingID) { + return nowDataMapper.getWaterLevelCount(curDate,buildingID); + } + + @Override + public List queryWaterLevelByTime(String curDate,int page,int limit) { + return nowDataMapper.queryWaterLevelByTime(curDate,page,limit); + } + + @Override + public int waterLevelByTimeCount(String curDate) { + return nowDataMapper.waterLevelByTimeCount(curDate); + } + + //从监视表查询热泵温度平均值 + @Override + public String selectAve(String buildingId) { + return nowDataMapper.selectAve(buildingId); + } + + @Override + public String selectSingleTemp(String pumpId,String buildingId) { + return nowDataMapper.selectSingleTemp(pumpId,buildingId); + } + + //从监视表查询热泵运行状态 + @Override + public String selectStateCount(String buildingId) { + int count=nowDataMapper.selectStateCount(buildingId); + String state=""; + if (count==0){ + state="不运行"; + }else{ + state="运行"; + } + return state; + } + + @Override + public String selectState(String buildingId, String pumpId) { + return nowDataMapper.selectState(buildingId,pumpId); + } + + @Override + public void upLevelSet(String buildingId, String levelSet) { + nowDataMapper.upLevelSet(buildingId,levelSet); + } + + @Override + public void upTempSet(String buildingId, String tempSet) { + nowDataMapper.upTempSet(buildingId,tempSet); + } + + @Override + public void upTempSet2(String buildingId, String tempSet, String pumpID) { + nowDataMapper.upTempSet2(buildingId, tempSet, pumpID); + } + + @Override + public List queryWaterTemp(String buildingID, String curDate,int page,int limit) { + return nowDataMapper.queryWaterTemp(buildingID,curDate,page,limit); + } + + @Override + public int queryWaterTempCount(String buildingID, String curDate) { + return nowDataMapper.queryWaterTempCount(buildingID,curDate); + } + + //查询所有楼栋每栋楼的平均温度 + @Override + public List queryWaterTemp2(String curDate,int page,int limit) { + return nowDataMapper.queryWaterTemp2(curDate,page,limit); + } + //查询所有楼栋每栋楼的平均温度记录数 + @Override + public int queryWaterTempCount2(String curDate) { + return nowDataMapper.queryWaterTempCount2(curDate); + } + + //调用过程proWaterTemp + @Override + public void proWaterTemp(String curDate, String buildingID, String pumpID) { + nowDataMapper.proWaterTemp(curDate,buildingID,pumpID); + } + + @Override + public List queryBuildWaterLevel(String curDate, int page, int limit) { + return nowDataMapper.queryBuildWaterLevel(curDate, page, limit); + } + + @Override + public int buildWaterLevelCount(String curDate) { + return nowDataMapper.buildWaterLevelCount(curDate); + } + + @Override + public void proWaterLevel(String curDate, String buildingID) { + nowDataMapper.proWaterLevel(curDate, buildingID); + } + + @Override + public void updateRunState(String buildingId, String pumpId,String strState) { + DeviceInstallEntity deviceInstallEntity=deviceInstallMapper.selectDevice(pumpId,"热泵",buildingId); + String buildingName=buildingService.queryBuildingName(buildingId); + NowDataEntity data=new NowDataEntity(); + int r1 = nowDataMapper.selectNowDataCount(buildingId,pumpId);//判断now_data表是否存在记录 + if(r1==0){ + data.setPumpId(pumpId); //通讯地址 + data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址 + data.setBuildingId(buildingId); + data.setBuildingName(buildingName); + data.setRunState(strState); + nowDataMapper.saveNowData(data); + } + nowDataMapper.updateRunState(buildingId,pumpId,strState); + } + + @Override + public void proPumpMinutes(String buildingId, String pumpId, String runState) { + nowDataMapper.proPumpMinutes(buildingId,pumpId,runState); + } + + @Override + public List pumpMinutes(String startDate,String endDate, String buildingId, String pumpId, int page, int limit) { + return nowDataMapper.pumpMinutes(startDate,endDate,buildingId,pumpId,page,limit); + } + + @Override + public int pumpMinutesCount(String startDate,String endDate, String buildingId, String pumpId) { + return nowDataMapper.pumpMinutesCount(startDate,endDate,buildingId,pumpId); + } + + @Override + public List pumpWeekMinutes(String startDate, String endDate, String buildingId, String pumpId, int page, int limit) { + return nowDataMapper.pumpWeekMinutes(startDate, endDate, buildingId, pumpId, page, limit); + } + + @Override + public int pumpWeekMinutesCount(String startDate, String endDate, String buildingId, String pumpId) { + return nowDataMapper.pumpWeekMinutesCount(startDate, endDate, buildingId, pumpId); + } + + @Override + public List pumpMonthMinutes(String startDate, String endDate, String buildingId, String pumpId, int page, int limit) { + return nowDataMapper.pumpMonthMinutes(startDate, endDate, buildingId, pumpId, page, limit); + } + + @Override + public int pumpMonthMinutesCount(String startDate, String endDate, String buildingId, String pumpId) { + return nowDataMapper.pumpMonthMinutesCount(startDate, endDate, buildingId, pumpId); + } + + @Override + public String selectMinPumpId(String buildingId) { + return nowDataMapper.selectMinPumpId(buildingId); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/NowPublicDataServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/NowPublicDataServiceImpl.java new file mode 100644 index 0000000..d33bf8a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/NowPublicDataServiceImpl.java @@ -0,0 +1,115 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.DeviceInstallEntity; +import com.mh.user.entity.NowDataEntity; +import com.mh.user.entity.NowPublicDataEntity; +import com.mh.user.mapper.BuildingMapper; +import com.mh.user.mapper.DeviceInstallMapper; +import com.mh.user.mapper.NowPublicDataMapper; +import com.mh.user.model.TempModel; +import com.mh.user.service.NowPublicDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +@Service +public class NowPublicDataServiceImpl implements NowPublicDataService { + + @Autowired + NowPublicDataMapper nowPublicDataMapper; + + @Autowired + DeviceInstallMapper deviceInstallMapper; + + @Autowired + BuildingMapper buildingMapper; + + @Override + public void saveNowPublicData(NowPublicDataEntity nowPublicDataEntity) { + nowPublicDataMapper.saveNowPublicData(nowPublicDataEntity); + } + + @Override + public void updateNowPublicData(NowPublicDataEntity nowPublicDataEntity) { + nowPublicDataMapper.updateNowPublicData(nowPublicDataEntity); + } + + @Override + public NowPublicDataEntity queryNowPublicData(String buildingId) { + return nowPublicDataMapper.queryNowPublicData(buildingId); + } + + @Override + public void saveHistoryPublicData(NowPublicDataEntity nowPublicDataEntity) { + nowPublicDataMapper.saveHistoryPublicData(nowPublicDataEntity); + } + + @Override + public void updateHistoryPublicData(NowPublicDataEntity nowPublicDataEntity) { + nowPublicDataMapper.updateHistoryPublicData(nowPublicDataEntity); + } + + @Override + public List queryHistoryPublicData(String curDate, String buildingId, int page, int limit) { + return nowPublicDataMapper.queryHistoryPublicData(curDate,buildingId,page,limit); + } + + @Override + public int getHistoryPublicDataCount(String curDate, String buildingId, int page, int limit) { + return nowPublicDataMapper.getHistoryPublicDataCount(curDate,buildingId,page,limit); + } + + @Override + public void saveNowHistoryPublicData(NowPublicDataEntity nowPublicDataEntity ) { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + String strDate=sdf1.format(date); + strDate=strDate.substring(0,13)+":00:00"; + + try{ + //从安装表获取设备信息 + String buildingId=nowPublicDataEntity.getBuildingId(); + String buildingName=buildingMapper.queryBuildingName(buildingId); + nowPublicDataEntity.setBuildingName(buildingName); +// DeviceInstallEntity deviceInstallEntity=deviceInstallMapper.selectDevice(deviceAddr,deviceType,buildingId); + int r1 = nowPublicDataMapper.selectNowPublicDataCount(buildingId);//判断now_public_data表是否存在记录 + nowPublicDataEntity.setCurDate(sdf1.parse(strDate)); + + if (r1==0){ + nowPublicDataMapper.saveNowPublicData(nowPublicDataEntity); + } else { + nowPublicDataMapper.updateNowPublicData(nowPublicDataEntity); + } + //判断历史表是否有记录 + int r2 = nowPublicDataMapper.selectHistoryPublicDataCount(strDate,buildingId);//判断now_data表是否存在记录 + if (r2==0){ + nowPublicDataMapper.saveHistoryPublicData(nowPublicDataEntity); + }else { + nowPublicDataMapper.updateHistoryPublicData(nowPublicDataEntity); + } + }catch (Exception e){ + e.printStackTrace(); + } + } + + //查询楼栋水箱平均温度 + @Override + public List queryWtTemp() { + return nowPublicDataMapper.queryWtTemp(); + } + + //查询单楼栋水箱平均温度 + @Override + public TempModel queryWtTemp2(String buildingId) { + return nowPublicDataMapper.queryWtTemp2(buildingId); + } + + //更新单箱温度 + @Override + public void updateSingleTemp(String singleTemp, String buildingId) { + nowPublicDataMapper.updateSingleTemp(singleTemp, buildingId); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/PumpSetServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/PumpSetServiceImpl.java new file mode 100644 index 0000000..f79f0be --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/PumpSetServiceImpl.java @@ -0,0 +1,41 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.PumpSetEntity; +import com.mh.user.mapper.PumpSetMapper; +import com.mh.user.service.PumpSetService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class PumpSetServiceImpl implements PumpSetService { + + @Autowired + PumpSetMapper pumpSetMapper; + + @Override + public void savePumpSet(PumpSetEntity pumpSetEntity) { + String buildingId=pumpSetEntity.getBuildingId(); + String pumpId=pumpSetEntity.getPumpId(); + int n=pumpSetMapper.selectCount(buildingId,pumpId); + if(n==0){ + pumpSetMapper.savePumpSet(pumpSetEntity); + }else{ + pumpSetMapper.updatePumpSet(pumpSetEntity); + } + } + + @Override + public void updatePumpSetTemp(String tempSet, String buildingId, String pumpId) { + pumpSetMapper.updatePumpSetTemp(tempSet,buildingId,pumpId); + } + + @Override + public PumpSetEntity queryPumpSet(String pumpId, String buildingId) { + return pumpSetMapper.queryPumpSet(pumpId,buildingId); + } + + @Override + public PumpSetEntity queryHandTime() { + return pumpSetMapper.queryHandTime(); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/ReportServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..d1568ee --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/ReportServiceImpl.java @@ -0,0 +1,36 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.ReportParamEntity; +import com.mh.user.mapper.ReportMapper; +import com.mh.user.service.ReportService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-03 + * @throws : + */ +@Service +public class ReportServiceImpl implements ReportService { + + private final ReportMapper reportMapper; + + public ReportServiceImpl(ReportMapper reportMapper) { + this.reportMapper = reportMapper; + } + + @Override + public List queryAllTarget(String type) { + if (type.equalsIgnoreCase("fourWeek") + || type.equalsIgnoreCase("twelveMonth") + || type.equalsIgnoreCase("fourYear") + ) { + return reportMapper.queryAllTarget1(); + } + return reportMapper.queryAllTarget(); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/SummaryServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/SummaryServiceImpl.java new file mode 100644 index 0000000..45f35c4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/SummaryServiceImpl.java @@ -0,0 +1,43 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.AlarmInfoSumEntity; +import com.mh.user.entity.DeviceStateEntity; +import com.mh.user.entity.EnergySumEntity; +import com.mh.user.entity.MaintainSumEntity; +import com.mh.user.mapper.SummaryMapper; +import com.mh.user.service.SummaryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class SummaryServiceImpl implements SummaryService { + + @Autowired + SummaryMapper summaryMapper; + + @Override + public DeviceStateEntity queryDeviceState() { + return summaryMapper.queryDeviceState(); + } + + @Override + public EnergySumEntity queryEnergySum(String buildingId, String curDate, int type) { + if (type==1){ + return summaryMapper.queryEnergyDaySum(buildingId,curDate); //日 + }else if (type==2){ + return summaryMapper.queryEnergyMonthSum(buildingId,curDate); //月 + }else { + return summaryMapper.queryEnergyYearSum(buildingId,curDate); //年 + } + } + + @Override + public MaintainSumEntity queryMaintainSum(String buildingId, String curDate) { + return summaryMapper.queryMaintainSum(buildingId,curDate); + } + + @Override + public AlarmInfoSumEntity queryAlarmInfoSum(String buildingId, String curDate) { + return summaryMapper.queryAlarmInfoSum(buildingId,curDate); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/SysDeptServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/SysDeptServiceImpl.java new file mode 100644 index 0000000..2134253 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/SysDeptServiceImpl.java @@ -0,0 +1,81 @@ +package com.mh.user.service.impl; + +import java.util.ArrayList; +import java.util.List; + +import com.mh.common.page.MybatisPageHelper; +import com.mh.common.page.PageRequest; +import com.mh.common.page.PageResult; +import com.mh.user.mapper.SysDeptMapper; +import com.mh.user.model.SysDept; +import com.mh.user.service.SysDeptService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class SysDeptServiceImpl implements SysDeptService { + + @Autowired + private SysDeptMapper sysDeptMapper; + + @Override + public int save(SysDept record) { + if(record.getId() == null || record.getId() == 0) { + return sysDeptMapper.insertSelective(record); + } + return sysDeptMapper.updateByPrimaryKeySelective(record); + } + + @Override + public int delete(SysDept record) { + return sysDeptMapper.deleteByPrimaryKey(record.getId()); + } + + @Override + public int delete(List records) { + for(SysDept record:records) { + delete(record); + } + return 1; + } + + @Override + public SysDept findById(Long id) { + return sysDeptMapper.selectByPrimaryKey(id); + } + + @Override + public PageResult findPage(PageRequest pageRequest) { + return MybatisPageHelper.findPage(pageRequest, sysDeptMapper); + } + + @Override + public List findTree() { + List sysDepts = new ArrayList<>(); + List depts = sysDeptMapper.findAll(); + for (SysDept dept : depts) { + if (dept.getParentId() == null || dept.getParentId() == 0) { + dept.setLevel(0); + sysDepts.add(dept); + } + } + findChildren(sysDepts, depts); + return sysDepts; + } + + private void findChildren(List sysDepts, List depts) { + for (SysDept sysDept : sysDepts) { + List children = new ArrayList<>(); + for (SysDept dept : depts) { + if (sysDept.getId() != null && sysDept.getId().equals(dept.getParentId())) { + dept.setParentName(dept.getName()); + dept.setLevel(sysDept.getLevel() + 1); + children.add(dept); + } + } + sysDept.setChildren(children); + findChildren(children, depts); + } + } + +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/SysDictServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/SysDictServiceImpl.java new file mode 100644 index 0000000..39e6c68 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/SysDictServiceImpl.java @@ -0,0 +1,61 @@ +package com.mh.user.service.impl; + +import com.mh.common.page.ColumnFilter; +import com.mh.common.page.MybatisPageHelper; +import com.mh.common.page.PageRequest; +import com.mh.common.page.PageResult; +import com.mh.user.mapper.SysDictMapper; +import com.mh.user.model.SysDict; +import com.mh.user.service.SysDictService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class SysDictServiceImpl implements SysDictService { + + @Autowired + private SysDictMapper sysDictMapper; + + @Override + public int save(SysDict record) { + if(record.getId() == null || record.getId() == 0) { + return sysDictMapper.insertSelective(record); + } + return sysDictMapper.updateByPrimaryKeySelective(record); + } + + @Override + public int delete(SysDict record) { + return sysDictMapper.deleteByPrimaryKey(record.getId()); + } + + @Override + public int delete(List records) { + for(SysDict record:records) { + delete(record); + } + return 1; + } + + @Override + public SysDict findById(Long id) { + return sysDictMapper.selectByPrimaryKey(id); + } + + @Override + public PageResult findPage(PageRequest pageRequest) { + ColumnFilter columnFilter = pageRequest.getColumnFilter("label"); + if(columnFilter != null) { + return MybatisPageHelper.findPage(pageRequest, sysDictMapper, "findPageByLabel", columnFilter.getValue()); + } + return MybatisPageHelper.findPage(pageRequest, sysDictMapper); + } + + @Override + public List findByLable(String lable) { + return sysDictMapper.findByLable(lable); + } + +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/SysLogServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/SysLogServiceImpl.java new file mode 100644 index 0000000..31cd2c4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/SysLogServiceImpl.java @@ -0,0 +1,76 @@ +package com.mh.user.service.impl; + +import com.mh.common.page.ColumnFilter; +import com.mh.common.page.MybatisPageHelper; +import com.mh.common.page.PageRequest; +import com.mh.common.page.PageResult; +import com.mh.user.entity.SysParamEntity; +import com.mh.user.mapper.SysLogMapper; +import com.mh.user.model.SysLog; +import com.mh.user.service.SysLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class SysLogServiceImpl implements SysLogService { + + @Autowired + private SysLogMapper sysLogMapper; + + @Override + public int save(SysLog record) { + if(record.getId() == null || record.getId() == 0) { + return sysLogMapper.insertSelective(record); + } + return sysLogMapper.updateByPrimaryKeySelective(record); + } + + @Override + public int delete(SysLog record) { + return sysLogMapper.deleteByPrimaryKey(record.getId()); + } + + @Override + public int delete(List records) { + for(SysLog record:records) { + delete(record); + } + return 1; + } + + @Override + public SysLog findById(Long id) { + return sysLogMapper.selectByPrimaryKey(id); + } + + @Override + public PageResult findPage(PageRequest pageRequest) { + ColumnFilter columnFilter = pageRequest.getColumnFilter("userName"); + if(columnFilter != null) { + return MybatisPageHelper.findPage(pageRequest, sysLogMapper, "findPageByUserName", columnFilter.getValue()); + } + return MybatisPageHelper.findPage(pageRequest, sysLogMapper); + } + + @Override + public List findLogs(String userName, int page, int limit) { + return sysLogMapper.findLogs(userName,page,limit); + } + + @Override + public int findCount(String userName, int page, int limit) { + return sysLogMapper.findCount(userName,page,limit); + } + + @Override + public SysLog logInfo(int id) { + return sysLogMapper.logInfo(id); + } + + @Override + public SysParamEntity selectSysParam() { + return sysLogMapper.selectSysParam(); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/SysMenuServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..d07d623 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,113 @@ +package com.mh.user.service.impl; + +import java.util.ArrayList; +import java.util.List; + +import com.mh.common.page.MybatisPageHelper; +import com.mh.common.page.PageRequest; +import com.mh.common.page.PageResult; +import com.mh.user.constants.SysConstants; +import com.mh.user.mapper.SysMenuMapper; +import com.mh.user.model.SysMenu; +import com.mh.user.service.SysMenuService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class SysMenuServiceImpl implements SysMenuService { + + @Autowired + private SysMenuMapper sysMenuMapper; + + @Override + public int save(SysMenu record) { + if(record.getId() == null || record.getId() == 0) { + return sysMenuMapper.insertSelective(record); + } + if(record.getParentId() == null) { + record.setParentId(0L); + } + return sysMenuMapper.updateByPrimaryKeySelective(record); + } + + @Override + public int delete(SysMenu record) { + return sysMenuMapper.deleteByPrimaryKey(record.getId()); + } + + @Override + public int delete(List records) { + for(SysMenu record:records) { + delete(record); + } + return 1; + } + + @Override + public SysMenu findById(Long id) { + return sysMenuMapper.selectByPrimaryKey(id); + } + + @Override + public PageResult findPage(PageRequest pageRequest) { + return MybatisPageHelper.findPage(pageRequest, sysMenuMapper); + } + + @Override + public List findTree(String userName, int menuType) { + List sysMenus = new ArrayList<>(); + List menus = findByUser(userName); + for (SysMenu menu : menus) { + if (menu.getParentId() == null || menu.getParentId() == 0) { + menu.setLevel(0); + if(!exists(sysMenus, menu)) { + sysMenus.add(menu); + } + } + } + sysMenus.sort((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum())); + findChildren(sysMenus, menus, menuType); + return sysMenus; + } + + @Override + public List findByUser(String userName) { + if(userName == null || "".equals(userName) || SysConstants.ADMIN.equalsIgnoreCase(userName)) { + return sysMenuMapper.findAll(); + } + return sysMenuMapper.findByUserName(userName); + } + + private void findChildren(List SysMenus, List menus, int menuType) { + for (SysMenu SysMenu : SysMenus) { + List children = new ArrayList<>(); + for (SysMenu menu : menus) { + if(menuType == 1 && menu.getMenuType() == 2) { + // 如果是获取类型不需要按钮,且菜单类型是按钮的,直接过滤掉 + continue ; + } + if (SysMenu.getId() != null && SysMenu.getId().equals(menu.getParentId())) { + menu.setParentName(SysMenu.getMenuName()); + menu.setLevel(SysMenu.getLevel() + 1); + if(!exists(children, menu)) { + children.add(menu); + } + } + } + SysMenu.setChildren(children); + children.sort((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum())); + findChildren(children, menus, menuType); + } + } + + private boolean exists(List sysMenus, SysMenu sysMenu) { + boolean exist = false; + for(SysMenu menu:sysMenus) { + if(menu.getId().equals(sysMenu.getId())) { + exist = true; + } + } + return exist; + } + +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/SysRoleServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..872c0dd --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,124 @@ +package com.mh.user.service.impl; + +import com.mh.common.page.ColumnFilter; +import com.mh.common.page.MybatisPageHelper; +import com.mh.common.page.PageRequest; +import com.mh.common.page.PageResult; +import com.mh.user.constants.SysConstants; +import com.mh.user.mapper.SysMenuMapper; +import com.mh.user.mapper.SysRoleMapper; +import com.mh.user.mapper.SysRoleMenuMapper; +import com.mh.user.model.SysMenu; +import com.mh.user.model.SysRole; +import com.mh.user.model.SysRoleMenu; +import com.mh.user.service.SysRoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + + +@Service +public class SysRoleServiceImpl implements SysRoleService { + + @Autowired + private SysRoleMapper sysRoleMapper; + @Autowired + private SysRoleMenuMapper sysRoleMenuMapper; + @Autowired + private SysMenuMapper sysMenuMapper; + + @Override + public int save(SysRole record) { + if(record.getId() == null || record.getId() == 0) { + return sysRoleMapper.insertSelective(record); + } + return sysRoleMapper.updateByPrimaryKeySelective(record); + } + + @Override + public int delete(SysRole record) { + return sysRoleMapper.deleteByPrimaryKey(record.getId()); + } + + @Override + public int delete(List records) { + for(SysRole record:records) { + delete(record); + } + return 1; + } + + @Override + public SysRole findById(Long id) { + return sysRoleMapper.selectByPrimaryKey(id); + } + + @Override + public PageResult findPage(PageRequest pageRequest) { + ColumnFilter columnFilter = pageRequest.getColumnFilter("name"); + if(columnFilter != null && columnFilter.getValue() != null) { + return MybatisPageHelper.findPage(pageRequest, sysRoleMapper, "findPageByName", columnFilter.getValue()); + } + return MybatisPageHelper.findPage(pageRequest, sysRoleMapper); + } + + @Override + public List findAll() { + return sysRoleMapper.findAll(); + } + + public SysRoleMapper getSysRoleMapper() { + return sysRoleMapper; + } + + public void setSysRoleMapper(SysRoleMapper sysRoleMapper) { + this.sysRoleMapper = sysRoleMapper; + } + + @Override + public List findRoleMenus(Long roleId) { + SysRole sysRole = sysRoleMapper.selectByPrimaryKey(roleId); + if(SysConstants.ADMIN.equalsIgnoreCase(sysRole.getName())) { + // 如果是超级管理员,返回全部 + return sysMenuMapper.findAll(); + } + return sysMenuMapper.findRoleMenus(roleId); + } + + @Transactional + @Override + public int saveRoleMenus(List records) { + if(records == null || records.isEmpty()) { + return 1; + } + Long roleId = records.get(0).getRoleId(); + sysRoleMenuMapper.deleteByRoleId(roleId); + for(SysRoleMenu record:records) { + sysRoleMenuMapper.insertSelective(record); + } + return 1; + } + + @Override + public List findByName(String name) { + return sysRoleMapper.findByName(name); + } + + @Override + public SysRole findId(String name) { + return sysRoleMapper.findId(name); + } + + + @Override + public List queryRoles(String roleName, int page, int limit) { + return sysRoleMapper.queryRoles(roleName,page,limit); + } + + @Override + public int getCount(String roleName,int page, int limit) { + return sysRoleMapper.getCount(roleName,page,limit); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/SysUserServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..4ce3677 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/SysUserServiceImpl.java @@ -0,0 +1,212 @@ +package com.mh.user.service.impl; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import com.mh.common.page.ColumnFilter; +import com.mh.common.page.MybatisPageHelper; +import com.mh.common.page.PageRequest; +import com.mh.common.page.PageResult; +import com.mh.user.entity.DBEntity; +import com.mh.user.mapper.SysRoleMapper; +import com.mh.user.mapper.SysUserMapper; +import com.mh.user.mapper.SysUserRoleMapper; +import com.mh.user.model.SysMenu; +import com.mh.user.model.SysRole; +import com.mh.user.model.SysUser; +import com.mh.user.model.SysUserRole; +import com.mh.user.service.SysMenuService; +import com.mh.user.service.SysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +@Service +public class SysUserServiceImpl implements SysUserService { + + /** + * 获取用户对应的数据库信息 + * @param username + * @return + */ + @Override + public DBEntity queryDBInfo(String username) { + return sysUserMapper.queryDBInfo(username); + } + + @Autowired(required = false) + private SysUserMapper sysUserMapper; + + @Autowired + private SysMenuService sysMenuService; + + @Autowired(required = false) + private SysUserRoleMapper sysUserRoleMapper; + + @Autowired(required = false) + private SysRoleMapper sysRoleMapper; + + @Transactional + @Override + public int save(SysUser record) { + Long id = null; + if(record.getId() == null || record.getId() == 0) { + // 新增用户 + sysUserMapper.insertSelective(record); + SysUser sysUser=sysUserMapper.findByName(record.getUserName()); + id = sysUser.getId(); + } else { + // 更新用户信息 + sysUserMapper.updateByPrimaryKeySelective(record); + } + + // 更新用户角色 + if(id != null && id == 0) { + return 1; + } + if(id != null) { +// for(SysUserRole sysUserRole:record.getUserRoles()) { +// sysUserRole.setUserId(id); +// } + + } else { + sysUserRoleMapper.deleteByUserId(record.getId()); + id=record.getId(); + } +// for(SysUserRole sysUserRole:record.getUserRoles()) { +// sysUserRoleMapper.insertSelective(sysUserRole); +// } + SysRole sysRole=sysRoleMapper.findId(record.getRoleNames()); //获取角色编号 + SysUserRole sysUserRole=new SysUserRole(); + sysUserRole.setUserId(id); + sysUserRole.setRoleId(sysRole.getId()); + + sysUserRoleMapper.insertSelective(sysUserRole); + return 1; + } + + @Override + public int delete(SysUser record) { + return sysUserMapper.deleteByPrimaryKey(record.getId()); + } + + @Override + public int delete(List records) { + for(SysUser record:records) { + delete(record); + } + return 1; + } + + @Override + public SysUser findById(Long id) { + return sysUserMapper.selectByPrimaryKey(id); + } + + @Override + public SysUser findByName(String name) { + return sysUserMapper.findByName(name); + } + + @Override + public PageResult findPage(PageRequest pageRequest) { + PageResult pageResult = null; + String name = getColumnFilterValue(pageRequest, "name"); + String email = getColumnFilterValue(pageRequest, "email"); + if(name != null) { + if(email != null) { + pageResult = MybatisPageHelper.findPage(pageRequest, sysUserMapper, "findPageByNameAndEmail", name, email); + } else { + pageResult = MybatisPageHelper.findPage(pageRequest, sysUserMapper, "findPageByName", name); + } + } else { + pageResult = MybatisPageHelper.findPage(pageRequest, sysUserMapper); + } + // 加载用户角色信息 + findUserRoles(pageResult); + return pageResult; + } + + /** + * 获取过滤字段的值 + * @param filterName + * @return + */ + public String getColumnFilterValue(PageRequest pageRequest, String filterName) { + String value = null; + ColumnFilter columnFilter = pageRequest.getColumnFilter(filterName); + if(columnFilter != null) { + value = columnFilter.getValue(); + } + return value; + } + + /** + * 加载用户角色 + * @param pageResult + */ + private void findUserRoles(PageResult pageResult) { + List content = pageResult.getContent(); + for(Object object:content) { + SysUser sysUser = (SysUser) object; + List userRoles = findUserRoles(sysUser.getId()); + sysUser.setUserRoles(userRoles); + sysUser.setRoleNames(getRoleNames(userRoles)); + } + } + + private String getRoleNames(List userRoles) { + StringBuilder sb = new StringBuilder(); + for(Iterator iter = userRoles.iterator(); iter.hasNext();) { + SysUserRole userRole = iter.next(); + SysRole sysRole = sysRoleMapper.selectByPrimaryKey(userRole.getRoleId()); + if(sysRole == null) { + continue ; + } + sb.append(sysRole.getRemark()); + if(iter.hasNext()) { + sb.append(", "); + } + } + return sb.toString(); + } + + @Override + public Set findPermissions(String userName) { + Set perms = new HashSet<>(); + List sysMenus = sysMenuService.findByUser(userName); + for(SysMenu sysMenu:sysMenus) { + if(sysMenu.getPerms() != null && !"".equals(sysMenu.getPerms())) { + perms.add(sysMenu.getPerms()); + } + } + return perms; + } + + @Override + public List findUserRoles(Long userId) { + return sysUserRoleMapper.findUserRoles(userId); + } + + @Override + public List queryUsers(String userName, int page, int limit) { + return sysUserMapper.queryUsers(userName,page,limit); + } + + @Override + public int getCount(String userName, int page, int limit) { + return sysUserMapper.getCount(userName,page,limit); + } + + @Override + public void updatePassword(String password,String salt, String id) { + sysUserMapper.updatePassword(password,salt,id); + } + + @Override + public void updateLoginTime(String userName) { + sysUserMapper.updateLoginTime(userName); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/UseForecastServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/UseForecastServiceImpl.java new file mode 100644 index 0000000..53db24d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/UseForecastServiceImpl.java @@ -0,0 +1,36 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.UseForecastEntity; +import com.mh.user.mapper.UseForecastMapper; +import com.mh.user.service.UseForecastService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class UseForecastServiceImpl implements UseForecastService { + + @Autowired + UseForecastMapper useForecastMapper; + + @Override + public void saveUseForecast(UseForecastEntity useForecastEntity) { + useForecastMapper.saveUseForecast(useForecastEntity); + } + + @Override + public void updateUseForecast(UseForecastEntity useForecastEntity) { + useForecastMapper.updateUseForecast(useForecastEntity); + } + + @Override + public List queryUseForecast(String buildingId, String tankId, String curDate, int page, int limit) { + return useForecastMapper.queryUseForecast(buildingId,tankId,curDate,page,limit); + } + + @Override + public int getCount(String buildingId, String tankId, String curDate, int page, int limit) { + return useForecastMapper.getCount(buildingId,tankId,curDate,page,limit); + } +} diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysDeptMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysDeptMapper.xml new file mode 100644 index 0000000..e9ca351 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysDeptMapper.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + id, parent_id, dept_name, order_num, create_by, create_time, last_update_by, last_update_time, + del_flag + + + + delete from sys_dept + where id = #{id,jdbcType=BIGINT} or parent_id = #{id,jdbcType=BIGINT} + + + insert into sys_dept (id, parent_id, dept_name, + order_num, create_by, create_time, + last_update_by, last_update_time, del_flag + ) + values (#{id,jdbcType=BIGINT}, #{parentId,jdbcType=BIGINT}, #{deptName,jdbcType=VARCHAR}, + #{orderNum,jdbcType=INTEGER}, #{createBy,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, + #{lastUpdateBy,jdbcType=BIGINT}, #{lastUpdateTime,jdbcType=TIMESTAMP}, #{delFlag,jdbcType=TINYINT} + ) + + + insert into sys_dept + + + id, + + + parent_id, + + + dept_name, + + + order_num, + + + create_by, + + + create_time, + + + last_update_by, + + + last_update_time, + + + del_flag, + + + + + #{id,jdbcType=BIGINT}, + + + #{parentId,jdbcType=BIGINT}, + + + #{deptName,jdbcType=VARCHAR}, + + + #{orderNum,jdbcType=INTEGER}, + + + #{createBy,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{lastUpdateBy,jdbcType=BIGINT}, + + + #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + #{delFlag,jdbcType=TINYINT}, + + + + + update sys_dept + + + parent_id = #{parentId,jdbcType=BIGINT}, + + + dept_name = #{deptName,jdbcType=VARCHAR}, + + + order_num = #{orderNum,jdbcType=INTEGER}, + + + create_by = #{createBy,jdbcType=BIGINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + + + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + del_flag = #{delFlag,jdbcType=TINYINT}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_dept + set parent_id = #{parentId,jdbcType=BIGINT}, + dept_name = #{deptName,jdbcType=VARCHAR}, + order_num = #{orderNum,jdbcType=INTEGER}, + create_by = #{createBy,jdbcType=BIGINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + del_flag = #{delFlag,jdbcType=TINYINT} + where id = #{id,jdbcType=BIGINT} + + + + diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysDictMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysDictMapper.xml new file mode 100644 index 0000000..c29d58c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysDictMapper.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + id, value, label, type, description, sort, create_by, create_time, last_update_by, + last_update_time, remarks, del_flag + + + + delete from sys_dict + where id = #{id,jdbcType=BIGINT} + + + insert into sys_dict (id, value, label, + type, description, sort, + create_by, create_time, last_update_by, + last_update_time, remarks, del_flag + ) + values (#{id,jdbcType=BIGINT}, #{value,jdbcType=VARCHAR}, #{label,jdbcType=VARCHAR}, + #{type,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, #{sort,jdbcType=DECIMAL}, + #{createBy,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, #{lastUpdateBy,jdbcType=BIGINT}, + #{lastUpdateTime,jdbcType=TIMESTAMP}, #{remarks,jdbcType=VARCHAR}, #{delFlag,jdbcType=TINYINT} + ) + + + insert into sys_dict + + + id, + + + value, + + + label, + + + type, + + + description, + + + sort, + + + create_by, + + + create_time, + + + last_update_by, + + + last_update_time, + + + remarks, + + + del_flag, + + + + + #{id,jdbcType=BIGINT}, + + + #{value,jdbcType=VARCHAR}, + + + #{label,jdbcType=VARCHAR}, + + + #{type,jdbcType=VARCHAR}, + + + #{description,jdbcType=VARCHAR}, + + + #{sort,jdbcType=DECIMAL}, + + + #{createBy,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{lastUpdateBy,jdbcType=BIGINT}, + + + #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + #{remarks,jdbcType=VARCHAR}, + + + #{delFlag,jdbcType=TINYINT}, + + + + + update sys_dict + + + value = #{value,jdbcType=VARCHAR}, + + + label = #{label,jdbcType=VARCHAR}, + + + type = #{type,jdbcType=VARCHAR}, + + + description = #{description,jdbcType=VARCHAR}, + + + sort = #{sort,jdbcType=DECIMAL}, + + + create_by = #{createBy,jdbcType=BIGINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + + + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + remarks = #{remarks,jdbcType=VARCHAR}, + + + del_flag = #{delFlag,jdbcType=TINYINT}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_dict + set value = #{value,jdbcType=VARCHAR}, + label = #{label,jdbcType=VARCHAR}, + type = #{type,jdbcType=VARCHAR}, + description = #{description,jdbcType=VARCHAR}, + sort = #{sort,jdbcType=DECIMAL}, + create_by = #{createBy,jdbcType=BIGINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + remarks = #{remarks,jdbcType=VARCHAR}, + del_flag = #{delFlag,jdbcType=TINYINT} + where id = #{id,jdbcType=BIGINT} + + + + + \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysLogMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysLogMapper.xml new file mode 100644 index 0000000..ce4a821 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysLogMapper.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + id, user_name, operation, method, params, time, ip, create_by, create_time, last_update_by, + last_update_time,login_time,login_state,opt_desc + + + + delete from sys_log + where id = #{id,jdbcType=BIGINT} + + + insert into sys_log (id, user_name, operation, + method, params, time, + ip, create_by, create_time, + last_update_by, last_update_time,login_time,login_state,opt_desc) + values (#{id,jdbcType=BIGINT}, #{userName,jdbcType=VARCHAR}, #{operation,jdbcType=VARCHAR}, + #{method,jdbcType=VARCHAR}, #{params,jdbcType=VARCHAR}, #{time,jdbcType=BIGINT}, + #{ip,jdbcType=VARCHAR}, #{createBy,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, + #{lastUpdateBy,jdbcType=BIGINT}, #{lastUpdateTime,jdbcType=TIMESTAMP}, + #{loginTime,jdbcType=TIMESTAMP},#{loginState,jdbcType=VARCHAR},#{optDesc,jdbcType=VARCHAR}) + + + insert into sys_log + + + id, + + + user_name, + + + operation, + + + method, + + + params, + + + time, + + + ip, + + + create_by, + + + create_time, + + + last_update_by, + + + last_update_time, + + + login_time, + + + login_state, + + + opt_desc, + + + + + #{id,jdbcType=BIGINT}, + + + #{userName,jdbcType=VARCHAR}, + + + #{operation,jdbcType=VARCHAR}, + + + #{method,jdbcType=VARCHAR}, + + + #{params,jdbcType=VARCHAR}, + + + #{time,jdbcType=BIGINT}, + + + #{ip,jdbcType=VARCHAR}, + + + #{createBy,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{lastUpdateBy,jdbcType=BIGINT}, + + + #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + #{loginTime,jdbcType=TIMESTAMP}, + + + #{loginState,jdbcType=VARCHAR}, + + + #{optDesc,jdbcType=VARCHAR}, + + + + + update sys_log + + + user_name = #{userName,jdbcType=VARCHAR}, + + + operation = #{operation,jdbcType=VARCHAR}, + + + method = #{method,jdbcType=VARCHAR}, + + + params = #{params,jdbcType=VARCHAR}, + + + time = #{time,jdbcType=BIGINT}, + + + ip = #{ip,jdbcType=VARCHAR}, + + + create_by = #{createBy,jdbcType=BIGINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + + + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + login_time = #{loginTime,jdbcType=TIMESTAMP}, + + + login_state = #{loginState,jdbcType=VARCHAR}, + + + opt_desc = #{optDesc,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_log + set user_name = #{userName,jdbcType=VARCHAR}, + operation = #{operation,jdbcType=VARCHAR}, + method = #{method,jdbcType=VARCHAR}, + params = #{params,jdbcType=VARCHAR}, + time = #{time,jdbcType=BIGINT}, + ip = #{ip,jdbcType=VARCHAR}, + create_by = #{createBy,jdbcType=BIGINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + login_time = #{loginTime,jdbcType=TIMESTAMP}, + login_state = #{loginState,jdbcType=VARCHAR}, + opt_desc = #{optDesc,jdbcType=VARCHAR} + where id = #{id,jdbcType=BIGINT} + + + + diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysMenuMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysMenuMapper.xml new file mode 100644 index 0000000..ffe3e07 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysMenuMapper.xml @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + id, parent_id, menu_name, url, perms, menu_type, icon, order_num, create_by, create_time, + last_update_by, last_update_time, del_flag + + + + delete from sys_menu + where id = #{id,jdbcType=BIGINT} + + + insert into sys_menu (id, parent_id, menu_name, + url, perms, menu_type, icon, + order_num, create_by, create_time, + last_update_by, last_update_time, del_flag + ) + values (#{id,jdbcType=BIGINT}, #{parentId,jdbcType=BIGINT}, #{menuName,jdbcType=VARCHAR}, + #{url,jdbcType=VARCHAR}, #{perms,jdbcType=VARCHAR}, #{menuType,jdbcType=INTEGER}, #{icon,jdbcType=VARCHAR}, + #{orderNum,jdbcType=INTEGER}, #{createBy,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, + #{lastUpdateBy,jdbcType=BIGINT}, #{lastUpdateTime,jdbcType=TIMESTAMP}, #{delFlag,jdbcType=TINYINT} + ) + + + insert into sys_menu + + + id, + + + parent_id, + + + menu_name, + + + url, + + + perms, + + + menu_type, + + + icon, + + + order_num, + + + create_by, + + + create_time, + + + last_update_by, + + + last_update_time, + + + del_flag, + + + + + #{id,jdbcType=BIGINT}, + + + #{parentId,jdbcType=BIGINT}, + + + #{menuName,jdbcType=VARCHAR}, + + + #{url,jdbcType=VARCHAR}, + + + #{perms,jdbcType=VARCHAR}, + + + #{menuType,jdbcType=INTEGER}, + + + #{icon,jdbcType=VARCHAR}, + + + #{orderNum,jdbcType=INTEGER}, + + + #{createBy,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{lastUpdateBy,jdbcType=BIGINT}, + + + #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + #{delFlag,jdbcType=TINYINT}, + + + + + update sys_menu + + + parent_id = #{parentId,jdbcType=BIGINT}, + + + menu_name = #{menuName,jdbcType=VARCHAR}, + + + url = #{url,jdbcType=VARCHAR}, + + + perms = #{perms,jdbcType=VARCHAR}, + + + menu_type = #{menuType,jdbcType=INTEGER}, + + + icon = #{icon,jdbcType=VARCHAR}, + + + order_num = #{orderNum,jdbcType=INTEGER}, + + + create_by = #{createBy,jdbcType=BIGINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + + + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + del_flag = #{delFlag,jdbcType=TINYINT}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_menu + set parent_id = #{parentId,jdbcType=BIGINT}, + menu_name = #{menuName,jdbcType=VARCHAR}, + url = #{url,jdbcType=VARCHAR}, + perms = #{perms,jdbcType=VARCHAR}, + menu_type = #{menuType,jdbcType=INTEGER}, + icon = #{icon,jdbcType=VARCHAR}, + order_num = #{orderNum,jdbcType=INTEGER}, + create_by = #{createBy,jdbcType=BIGINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + del_flag = #{delFlag,jdbcType=TINYINT} + where id = #{id,jdbcType=BIGINT} + + + + + + + diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleDeptMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleDeptMapper.xml new file mode 100644 index 0000000..4238270 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleDeptMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + id, role_id, dept_id, create_by, create_time, last_update_by, last_update_time + + + + delete from sys_role_dept + where id = #{id,jdbcType=BIGINT} + + + insert into sys_role_dept (id, role_id, dept_id, + create_by, create_time, last_update_by, + last_update_time) + values (#{id,jdbcType=BIGINT}, #{roleId,jdbcType=BIGINT}, #{deptId,jdbcType=BIGINT}, + #{createBy,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, #{lastUpdateBy,jdbcType=BIGINT}, + #{lastUpdateTime,jdbcType=TIMESTAMP}) + + + insert into sys_role_dept + + + id, + + + role_id, + + + dept_id, + + + create_by, + + + create_time, + + + last_update_by, + + + last_update_time, + + + + + #{id,jdbcType=BIGINT}, + + + #{roleId,jdbcType=BIGINT}, + + + #{deptId,jdbcType=BIGINT}, + + + #{createBy,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{lastUpdateBy,jdbcType=BIGINT}, + + + #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + + + update sys_role_dept + + + role_id = #{roleId,jdbcType=BIGINT}, + + + dept_id = #{deptId,jdbcType=BIGINT}, + + + create_by = #{createBy,jdbcType=BIGINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + + + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_role_dept + set role_id = #{roleId,jdbcType=BIGINT}, + dept_id = #{deptId,jdbcType=BIGINT}, + create_by = #{createBy,jdbcType=BIGINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleMapper.xml new file mode 100644 index 0000000..90a8775 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleMapper.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + id, role_name, remark, create_by, create_time, last_update_by, last_update_time, + del_flag + + + + delete from sys_role + where id = #{id,jdbcType=BIGINT} + + + insert into sys_role (id, role_name, remark, + create_by, create_time, last_update_by, + last_update_time, del_flag) + values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR}, + #{createBy,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, #{lastUpdateBy,jdbcType=BIGINT}, + #{lastUpdateTime,jdbcType=TIMESTAMP}, #{delFlag,jdbcType=TINYINT}) + + + insert into sys_role + + + id, + + + role_name, + + + remark, + + + create_by, + + + create_time, + + + last_update_by, + + + last_update_time, + + + del_flag, + + + + + #{id,jdbcType=BIGINT}, + + + #{name,jdbcType=VARCHAR}, + + + #{remark,jdbcType=VARCHAR}, + + + #{createBy,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{lastUpdateBy,jdbcType=BIGINT}, + + + #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + #{delFlag,jdbcType=TINYINT}, + + + + + update sys_role + + + role_name = #{name,jdbcType=VARCHAR}, + + + remark = #{remark,jdbcType=VARCHAR}, + + + create_by = #{createBy,jdbcType=BIGINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + + + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + del_flag = #{delFlag,jdbcType=TINYINT}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_role + set role_name = #{name,jdbcType=VARCHAR}, + remark = #{remark,jdbcType=VARCHAR}, + create_by = #{createBy,jdbcType=BIGINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + del_flag = #{delFlag,jdbcType=TINYINT} + where id = #{id,jdbcType=BIGINT} + + + + + + + diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleMenuMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleMenuMapper.xml new file mode 100644 index 0000000..d0086d1 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleMenuMapper.xml @@ -0,0 +1,84 @@ + + + + + + + + + + id, role_id, menu_id + + + + delete from sys_role_menu + where id = #{id,jdbcType=BIGINT} + + + insert into sys_role_menu (id, role_id, menu_id) + values (#{id,jdbcType=BIGINT}, #{roleId,jdbcType=BIGINT}, #{menuId,jdbcType=BIGINT}) + + + insert into sys_role_menu + + + id, + + + role_id, + + + menu_id, + + + + + #{id,jdbcType=BIGINT}, + + + #{roleId,jdbcType=BIGINT}, + + + #{menuId,jdbcType=BIGINT}, + + + + + update sys_role_menu + + + role_id = #{roleId,jdbcType=BIGINT}, + + + menu_id = #{menuId,jdbcType=BIGINT}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_role_menu + set role_id = #{roleId,jdbcType=BIGINT}, + menu_id = #{menuId,jdbcType=BIGINT} + where id = #{id,jdbcType=BIGINT} + + + + + delete from sys_role_menu + where role_id = #{roleId,jdbcType=BIGINT} + + diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysUserMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysUserMapper.xml new file mode 100644 index 0000000..07f0356 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysUserMapper.xml @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + id, user_name, password, salt, email, mobile, status, dept_id, create_by, create_time, + last_update_by, last_update_time, del_flag + + + + + delete from sys_user + where id = #{id,jdbcType=BIGINT} + + + + insert into sys_user (id, user_name, password, + salt, email, mobile, + status, dept_id, create_by, + create_time, last_update_by, last_update_time, + del_flag) + values (#{id,jdbcType=BIGINT}, #{userName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, + #{salt,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}, #{mobile,jdbcType=VARCHAR}, + #{status,jdbcType=TINYINT}, #{deptId,jdbcType=BIGINT}, #{createBy,jdbcType=BIGINT}, + #{createTime,jdbcType=TIMESTAMP}, #{lastUpdateBy,jdbcType=BIGINT}, #{lastUpdateTime,jdbcType=TIMESTAMP}, + #{delFlag,jdbcType=TINYINT}) + + + + insert into sys_user + + + id, + + + user_name, + + + password, + + + salt, + + + email, + + + mobile, + + + status, + + + dept_id, + + + create_by, + + + create_time, + + + last_update_by, + + + last_update_time, + + + del_flag, + + + + + #{id,jdbcType=BIGINT}, + + + #{userName,jdbcType=VARCHAR}, + + + #{password,jdbcType=VARCHAR}, + + + #{salt,jdbcType=VARCHAR}, + + + #{email,jdbcType=VARCHAR}, + + + #{mobile,jdbcType=VARCHAR}, + + + #{status,jdbcType=TINYINT}, + + + #{deptId,jdbcType=BIGINT}, + + + #{createBy,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{lastUpdateBy,jdbcType=BIGINT}, + + + #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + #{delFlag,jdbcType=TINYINT}, + + + + + + update sys_user + + + user_name = #{userName,jdbcType=VARCHAR}, + + + password = #{password,jdbcType=VARCHAR}, + + + salt = #{salt,jdbcType=VARCHAR}, + + + email = #{email,jdbcType=VARCHAR}, + + + mobile = #{mobile,jdbcType=VARCHAR}, + + + status = #{status,jdbcType=TINYINT}, + + + dept_id = #{deptId,jdbcType=BIGINT}, + + + create_by = #{createBy,jdbcType=BIGINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + + + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + del_flag = #{delFlag,jdbcType=TINYINT}, + + + where id = #{id,jdbcType=BIGINT} + + + + update sys_user + set user_name = #{userName,jdbcType=VARCHAR}, + password = #{password,jdbcType=VARCHAR}, + salt = #{salt,jdbcType=VARCHAR}, + email = #{email,jdbcType=VARCHAR}, + mobile = #{mobile,jdbcType=VARCHAR}, + status = #{status,jdbcType=TINYINT}, + dept_id = #{deptId,jdbcType=BIGINT}, + create_by = #{createBy,jdbcType=BIGINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + del_flag = #{delFlag,jdbcType=TINYINT} + where id = #{id,jdbcType=BIGINT} + + + + + + + + + + + diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysUserRoleMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysUserRoleMapper.xml new file mode 100644 index 0000000..7a9a5ab --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysUserRoleMapper.xml @@ -0,0 +1,81 @@ + + + + + + + + + + id, user_id, role_id + + + + delete from sys_user_role + where id = #{id,jdbcType=BIGINT} + + + insert into sys_user_role (user_id, role_id + ) + values (#{userId,jdbcType=BIGINT}, #{roleId,jdbcType=BIGINT} + ) + + + insert into sys_user_role + + + id, + + + user_id, + + + role_id, + + + + + #{id,jdbcType=BIGINT}, + + + #{userId,jdbcType=BIGINT}, + + + #{roleId,jdbcType=BIGINT}, + + + + + update sys_user_role + + + user_id = #{userId,jdbcType=BIGINT}, + + + role_id = #{roleId,jdbcType=BIGINT}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_user_role + set user_id = #{userId,jdbcType=BIGINT}, + role_id = #{roleId,jdbcType=BIGINT} + where id = #{id,jdbcType=BIGINT} + + + + delete from sys_user_role + where user_id = #{userId,jdbcType=BIGINT} + + diff --git a/user-service/src/main/java/com/mh/user/utils/AESUtil.java b/user-service/src/main/java/com/mh/user/utils/AESUtil.java new file mode 100644 index 0000000..2705a2a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/AESUtil.java @@ -0,0 +1,60 @@ +package com.mh.user.utils; + +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +/** + * @author chison + * @date 2020-09-17 12:39 + * @Description AES加密解密帮助类 + */ +public class AESUtil { + + //--------------AES--------------- + private static final String KEY = "f4k9f5w7f8g4er26"; // 密匙,必须16位 + private static final String OFFSET = "5e8y6w45ju8w9jq8"; // 偏移量 + private static final String ENCODING = "UTF-8"; // 编码 + private static final String ALGORITHM = "AES"; //算法 + private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"; // 默认的加密算法,CBC模式 + + public static void main(String[] args) throws Exception { + String s = AESencrypt("test"); + System.out.println(s); + } + + /** + * AES加密 + * @param data + * @return String + * @author anson + * @date 2019-8-24 18:43:07 + */ + public static String AESencrypt(String data) throws Exception { + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + SecretKeySpec skeySpec = new SecretKeySpec(KEY.getBytes("ASCII"), ALGORITHM); + IvParameterSpec iv = new IvParameterSpec(OFFSET.getBytes());//CBC模式偏移量IV + cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); + byte[] encrypted = cipher.doFinal(data.getBytes(ENCODING)); + return new Base64().encodeToString(encrypted);//加密后再使用BASE64做转码 + } + + /** + * AES解密 + * @param data + * @return String + * @author anson + * @date 2019-8-24 18:46:07 + */ + public static String AESdecrypt(String data) throws Exception { + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + SecretKeySpec skeySpec = new SecretKeySpec(KEY.getBytes("ASCII"), ALGORITHM); + IvParameterSpec iv = new IvParameterSpec(OFFSET.getBytes()); //CBC模式偏移量IV + cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); + byte[] buffer = new Base64().decode(data);//先用base64解码 + byte[] encrypted = cipher.doFinal(buffer); + return new String(encrypted, ENCODING); + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java b/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java new file mode 100644 index 0000000..1c6746f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java @@ -0,0 +1,1726 @@ +package com.mh.user.utils; + +import com.alibaba.fastjson2.JSON; +import com.mh.user.entity.*; +import com.mh.user.service.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * @author ljf + * @title : + * @description : 解析485接收的数据 + * @updateTime 2020-04-23 + * @throws : + */ +@Slf4j +public class AnalysisReceiveOrder485 { + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + ThreadPoolExecutor threadPoolService = ThreadPoolService.getInstance(); + DataResultService dataResultService=context.getBean(DataResultService.class); + NowDataService nowDataService=context.getBean(NowDataService.class); + NowPublicDataService nowPublicDataService=context.getBean(NowPublicDataService.class); + PumpSetService pumpSetService=context.getBean(PumpSetService.class); + DeviceInstallService deviceInstallService=context.getBean(DeviceInstallService.class); + BuildingService buildingService=context.getBean(BuildingService.class); + /** + * 解析电表返回的数据 + * @param dataStr + */ + public void analysisMeterOrder485(final String dataStr,final String registerAddr,final String brand,String buildingId) { + threadPoolService.execute(() -> { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + if (dataStr.length() == 36 || dataStr.length() == 40 || dataStr.length() == 44 || dataStr.length() == 50) { + String checkStr = dataStr.substring(0, dataStr.length() - 4); //减去校验码 + String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 + //返回的校验码与重新生成的校验码进行校验 + if (checkNum.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4, dataStr.length() - 2))) { + //表号,12位 + String meterId = checkStr.substring(12, 14) + checkStr.substring(10, 12) + checkStr.substring(8, 10) + + checkStr.substring(6, 8) + checkStr.substring(4, 6) + checkStr.substring(2, 4); + meterId = String.format("%012d", Long.parseLong(meterId)); + String data = ""; + StringBuilder stringBuilder = new StringBuilder(); + if (dataStr.length() == 36){ + for (int i = 0; i < 4; i++) { + String data1 = checkStr.substring(32 - 2 * (i + 1), 32 - 2 * i); + stringBuilder.append(data1); + } + }else { + for (int i = 0; i < 4; i++) { + String data1 = checkStr.substring(36 - 2 * (i + 1), 36 - 2 * i); + stringBuilder.append(data1); + } + } + data = stringBuilder.toString(); + data = ExchangeStringUtil.cutThree(data); + // 0 代表前面补充0,4 代表长度为4,d 代表参数为正数型 + data = String.format("%08d", Long.parseLong(data)); + data = data.substring(0, 6) + "." + data.substring(6, 8); + log.info("电表表号:" + meterId+",电表读数:" + data); + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + try { + DataResultEntity dataResultEntity = new DataResultEntity(); + dataResultEntity.setDeviceAddr(meterId);//通讯编号 + dataResultEntity.setDeviceType("电表"); + dataResultEntity.setBuildingId(buildingId); + dataResultEntity.setCurValue(Double.parseDouble(data)); //当前读数 + dataResultEntity.setCurDate(sdf1.parse(dateStr)); //当前日期 + dataResultService.saveDataResult(dataResultEntity); + log.info("电表数据保存数据库成功! 楼栋名称:"+buildingName); + } catch (Exception e) { + e.printStackTrace(); + log.error("电表数据保存数据库失败!楼栋名称:"+buildingName); + } + }else { + log.info("电表报文检验失败: " + dataStr); + } + } + }); + } + + public String analysisMeterOrder4852(final String dataStr,final String registerAddr,final String brand,String buildingId) { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + String data = ""; + if (dataStr.length() == 36 || dataStr.length() == 40 || dataStr.length() == 44 || dataStr.length() == 50) { + String checkStr = dataStr.substring(0, dataStr.length() - 4); //减去校验码 + String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 + //返回的校验码与重新生成的校验码进行校验 + if (checkNum.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4, dataStr.length() - 2))) { + log.info("电表报文检验成功: " + dataStr); + //表号,12位 + String meterId = checkStr.substring(12, 14) + checkStr.substring(10, 12) + checkStr.substring(8, 10) + + checkStr.substring(6, 8) + checkStr.substring(4, 6) + checkStr.substring(2, 4); + meterId = String.format("%012d", Long.parseLong(meterId)); + StringBuilder stringBuilder = new StringBuilder(); + if (dataStr.length() == 36){ + for (int i = 0; i < 4; i++) { + String data1 = checkStr.substring(32 - 2 * (i + 1), 32 - 2 * i); + stringBuilder.append(data1); + } + }else { + for (int i = 0; i < 4; i++) { + String data1 = checkStr.substring(36 - 2 * (i + 1), 36 - 2 * i); + stringBuilder.append(data1); + } + } + data = stringBuilder.toString(); + data = ExchangeStringUtil.cutThree(data); + // 0 代表前面补充0,4 代表长度为4,d 代表参数为正数型 + data = String.format("%08d", Long.parseLong(data)); + data = data.substring(0, 6) + "." + data.substring(6, 8); + log.info("电表表号:" + meterId+",电表读数:" + data); + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + try { + DataResultEntity dataResultEntity = new DataResultEntity(); + dataResultEntity.setDeviceAddr(meterId);//通讯编号 + dataResultEntity.setDeviceType("电表"); + dataResultEntity.setBuildingId(buildingId); + dataResultEntity.setCurValue(Double.parseDouble(data)); //当前读数 + dataResultEntity.setCurDate(sdf1.parse(dateStr)); //当前日期 + dataResultService.saveDataResult(dataResultEntity); + log.info("电表数据保存数据库成功! 楼栋名称:"+buildingName); + } catch (Exception e) { +// e.printStackTrace(); + log.error("电表数据保存数据库失败!楼栋名称:"+buildingName); + } + }else { + log.info("电表报文检验失败: " + dataStr); + } + } + if (!data.equals("")){ + data=String.valueOf(Double.valueOf(data)); //00010.76,去除读数前面带0的情况 + } + return data; + } + + // 水表 + public void analysisWtMeterOrder485(final String dataStr,final String registerAddr,final String brand,String buildingId) { + threadPoolService.execute(() -> { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + String data = ""; + String meterId=""; + if (dataStr.length() == 44 || dataStr.length() == 70) { + String checkStr = dataStr.substring(0, dataStr.length() - 4);//减去校验码 + String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 + if (checkNum.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4, dataStr.length() - 2))) { + meterId =checkStr.substring(16, 18)+checkStr.substring(14, 16)+ checkStr.substring(12, 14) + checkStr.substring(10, 12)// 表号 + + checkStr.substring(8, 10)+ checkStr.substring(6, 8) + checkStr.substring(4, 6); + meterId = String.format("%014d", Long.parseLong(meterId)); + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < 4; i++) { + //String data1 = checkStr.substring(checkStr.length() - 2 * (i + 1), checkStr.length() - 2 * i); + String data1 = checkStr.substring(36 - 2 * (i + 1), 36 - 2 * i); + stringBuilder.append(data1); + } + data = stringBuilder.toString(); + // 0 代表前面补充0,4 代表长度为4,d 代表参数为正数型 + data = String.format("%08d", Long.parseLong(data)); + data = data.substring(0, 6) + "." + data.substring(6, 8); + }else{ + log.info("水表报文检验失败: " + dataStr); + } + } else if(dataStr.length() == 18){ + String checkStr = dataStr.substring(0, dataStr.length() - 4);//检验报文 + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); + String sValue=null; + if (checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) { + meterId = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 + if (checkStr.substring(2, 4).equalsIgnoreCase("03")) { + data=String.valueOf(Integer.parseInt(ExchangeStringUtil.hexToDec(checkStr.substring(6, 14)))/10); //读数 + } + }else { + log.info("水表报文检验失败: " + dataStr); + } + } + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + log.info("水表表号: " + meterId+",水表读数:" + data); + try { + DataResultEntity dataResultEntity = new DataResultEntity(); + dataResultEntity.setDeviceAddr(meterId);//通讯编号 + dataResultEntity.setDeviceType("水表"); + dataResultEntity.setCurValue(Double.parseDouble(data)); //当前读数 + dataResultEntity.setCurDate(sdf1.parse(dateStr)); //当前日期 + dataResultEntity.setBuildingId(buildingId); + dataResultService.saveDataResult(dataResultEntity); + log.info("水表数据保存数据库成功!楼栋名称:"+buildingName); + } catch (Exception e) { + e.printStackTrace(); + log.error("水表数据保存数据库失败!楼栋名称:"+buildingName); + } + }); + } + + // 水表 + public String analysisWtMeterOrder4852(final String dataStr,final String registerAddr,final String brand,String buildingId) { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + String data = ""; + String meterId=""; + if (dataStr.length() == 44 || dataStr.length() == 70) { + String checkStr = dataStr.substring(0, dataStr.length() - 4);//减去校验码 + String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 + if (checkNum.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4, dataStr.length() - 2))) { + meterId =checkStr.substring(16, 18)+checkStr.substring(14, 16)+ checkStr.substring(12, 14) + checkStr.substring(10, 12)// 表号 + + checkStr.substring(8, 10)+ checkStr.substring(6, 8) + checkStr.substring(4, 6); + meterId = String.format("%014d", Long.parseLong(meterId)); + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < 4; i++) { + //String data1 = checkStr.substring(checkStr.length() - 2 * (i + 1), checkStr.length() - 2 * i); + String data1 = checkStr.substring(36 - 2 * (i + 1), 36 - 2 * i); + stringBuilder.append(data1); + } + data = stringBuilder.toString(); + // 0 代表前面补充0,4 代表长度为4,d 代表参数为正数型 + data = String.format("%08d", Long.parseLong(data)); + data = data.substring(0, 6) + "." + data.substring(6, 8); + }else{ + log.info("水表报文检验失败: " + dataStr); + } + } else if(dataStr.length() == 18){ + String checkStr = dataStr.substring(0, dataStr.length() - 4);//检验报文 + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); + String sValue=null; + if (checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) { + meterId = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 + if (checkStr.substring(2, 4).equalsIgnoreCase("03")) { + data=String.valueOf(Integer.parseInt(ExchangeStringUtil.hexToDec(checkStr.substring(6, 14)))/10); //读数 + } + }else { + log.info("水表报文检验失败: " + dataStr); + } + } + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + log.info("水表表号: " + meterId+",水表读数:" + data); + try { + DataResultEntity dataResultEntity = new DataResultEntity(); +// if (meterId.length()>8){ +// dataResultEntity.setDeviceAddr(meterId.substring(meterId.length()-8,meterId.length()));//通讯编号 +// }else{ + dataResultEntity.setDeviceAddr(meterId);//通讯编号 +// } + dataResultEntity.setDeviceType("水表"); + dataResultEntity.setCurValue(Double.parseDouble(data)); //当前读数 + dataResultEntity.setCurDate(sdf1.parse(dateStr)); //当前日期 + dataResultEntity.setBuildingId(buildingId); + dataResultService.saveDataResult(dataResultEntity); + log.info("水表数据保存数据库成功!楼栋名称:"+buildingName); + } catch (Exception e) { + e.printStackTrace(); + log.error("水表数据保存数据库失败!楼栋名称:"+buildingName); + } + if (!data.equals("")){ + data=String.valueOf(Double.valueOf(data)); + } + return data; + } + + // 热泵 + public void analysisPumpOrder485(final String receiveData, final String registerAddr,final String brand,String buildingId) { +// if (!Constant.CONTROL_WEB_FLAG) { + threadPoolService.execute(() -> { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + String checkStr = receiveData.substring(0, receiveData.length() - 4);//检验报文 + String checkWord=ExchangeStringUtil.getStrCRC16(checkStr);//生成校验码 + String sValue=null; + String dataType=null; + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { + String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 + String data = ""; + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + if (brand==null || brand.equals("") || brand.equals("美的")){ + if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {//读 + if (registerAddr.equalsIgnoreCase("0641")) { //运行状态 + dataType="runState"; + data = checkStr.substring(8, 10); + log.info("------------美的热泵状态值-----------"+data); + if(data.equalsIgnoreCase("08")){ + sValue="不运行"; //关机模式 + }else if(data.equalsIgnoreCase("01")){ + sValue="运行"; //制冷模式 + }else if(data.equalsIgnoreCase("02")){ + sValue="运行"; //制热模式 + }else if(data.equalsIgnoreCase("04")){ + sValue="运行"; //水泵模式 + }else if(data.equalsIgnoreCase("10")){ + sValue="运行"; //制热水模式 + } + //计算热泵运行时间,按分钟 + nowDataService.proPumpMinutes(buildingId,addr,sValue); + log.info("计算热泵运行时长,楼栋名称:"+buildingName+",热泵编号:"+addr+",状态:"+sValue); + nowDataService.saveNowHistoryData(addr,"热泵",sValue,dataType,buildingId); +// String state=nowDataService.selectState(buildingId); //判断热泵状态,如果有一个以上热泵运行,楼栋公共信息补水运行 +// NowPublicDataEntity publicData=new NowPublicDataEntity(); +// publicData.setBuildingId(buildingId); +// publicData.setUpWater(state); +// nowPublicDataService.saveNowHistoryPublicData(publicData); + log.info("热泵ID:" + addr + ",数据: " + sValue+",保存数据库成功!楼栋名称:"+buildingName); + }else if (registerAddr.equalsIgnoreCase("0642") || registerAddr.equalsIgnoreCase("0007")){ + //0642设定温度,0007水箱水温 + if (registerAddr.equalsIgnoreCase("0642")){ + dataType="tempSet"; + }else { + dataType="waterTemp"; + } + //读数 + sValue=ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)); + if (dataType.equals("waterTemp")){ + String avgTemp=nowDataService.selectAve(buildingId); + NowPublicDataEntity publicData=new NowPublicDataEntity(); + publicData.setBuildingId(buildingId); + publicData.setUseWaterTemp(avgTemp); + publicData.setBackWaterTemp(avgTemp); + String pumpId=nowDataService.selectMinPumpId(buildingId); + if(addr.equals(pumpId)){ //取ID最小的热泵为单箱温度 + publicData.setSingleTemp(sValue); + log.info("---------------单箱温度:"+sValue+"---------------"); + } + nowPublicDataService.saveNowHistoryPublicData(publicData); + log.info("楼栋名称:" + buildingName + ",热泵编号:"+addr); +// nowDataService.proWaterTemp(dateStr,buildingId,addr); //保存楼栋时间点温度变化 +// log.info("=========保存楼栋时间点温度变化值!==========="); + }else if (dataType.equals("tempSet")){ + pumpSetService.updatePumpSetTemp(sValue,buildingId,addr); //更新设定温度 + } + nowDataService.saveNowHistoryData(addr,"热泵",sValue,dataType,buildingId); + log.info("热泵ID:" + addr + ",数据:" + sValue+",保存数据库成功!楼栋名称:"+buildingName); + }else if (registerAddr.equalsIgnoreCase("000B")){ //故障状态 + dataType="isFault"; + String sData=ExchangeStringUtil.hexString2binaryString(checkStr.substring(8,10)); + sData=ExchangeStringUtil.addZeroForNum(sData,8); + if (sData.substring(7,8).equalsIgnoreCase("0")){ + sValue="无故障"; + deviceInstallService.updateDeviceFault("0",addr,"热泵"); + } else if (sData.substring(7,8).equalsIgnoreCase("1")){ + sValue="有故障"; + deviceInstallService.updateDeviceFault("1",addr,"热泵"); + } + nowDataService.saveNowHistoryData(addr,"热泵",sValue,dataType,buildingId); + log.info("热泵ID:" + addr + ",数据: " + sValue+",保存数据库成功!楼栋名称:"+buildingName); + }else if (registerAddr.equalsIgnoreCase("0656") || registerAddr.equalsIgnoreCase("065A") + || registerAddr.equalsIgnoreCase("065E")) { //定时设置值 + sValue = ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)); + } + } else if (checkStr.substring(2, 4).equalsIgnoreCase("10") ) { + log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! " ); + } + }else if( brand.equals("美的2")){ + if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 + if (registerAddr.equalsIgnoreCase("0BBD")) { //运行状态 + dataType="runState"; + data=ExchangeStringUtil.hexString2binaryString(checkStr.substring(8,10)); + data=ExchangeStringUtil.addZeroForNum(data,8);//二进制数,补够8位 + data=data.substring(4,8); //截取后四位 + log.info("------------美的2热泵状态值-----------"+data); + if (data.equalsIgnoreCase("0000")){ //0 + sValue="不运行"; //关机 + }else if(data.equalsIgnoreCase("0001")){//1 + sValue="运行"; //水泵 + }else if(data.equalsIgnoreCase("0010")){//2 + sValue="运行"; //制冷 + }else if(data.equalsIgnoreCase("0011")){//3 + sValue="运行"; //制热 + }else if(data.equalsIgnoreCase("0100")){//4 + sValue="运行"; //热水 + }else if(data.equalsIgnoreCase("0101")){//5 + sValue="运行"; //采暖 + }else if(data.equalsIgnoreCase("0110")){//6 + sValue="运行"; //电热模式 + } + //计算热泵运行时间,按分钟 + nowDataService.proPumpMinutes(buildingId,addr,sValue); + log.info("计算热泵运行时长,楼栋名称:"+buildingName+",热泵编号:"+addr+",状态:"+sValue); + nowDataService.saveNowHistoryData(addr,"热泵",sValue,dataType,buildingId); +// String state=nowDataService.selectState(buildingId); //判断热泵状态,如果有一个以上热泵运行,楼栋公共信息补水运行 +// NowPublicDataEntity publicData=new NowPublicDataEntity(); +// publicData.setBuildingId(buildingId); +// publicData.setUpWater(state); +// nowPublicDataService.saveNowHistoryPublicData(publicData); + log.info("热泵ID: " + addr + ",数据: " + sValue+"保存数据库成功!楼栋名称:"+buildingName); + }else if (registerAddr.equalsIgnoreCase("0003") || registerAddr.equalsIgnoreCase("0064")){ + //0003设定温度,0064水箱水温 + if (registerAddr.equalsIgnoreCase("0003")){ + dataType="tempSet"; + }else { + dataType="waterTemp"; + } + //读数 + sValue=ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)); + if (dataType.equals("waterTemp")){ + String avgTemp=nowDataService.selectAve(buildingId); + NowPublicDataEntity publicData=new NowPublicDataEntity(); + publicData.setBuildingId(buildingId); + publicData.setUseWaterTemp(avgTemp); + publicData.setBackWaterTemp(avgTemp); + String pumpId=nowDataService.selectMinPumpId(buildingId); + log.info("---------------addr:"+addr+",pumpId:"+pumpId+" ---------------"); + if(addr.equals(pumpId)){ //取ID最小的热泵为单箱温度 + publicData.setSingleTemp(sValue); + log.info("---------------单箱温度:"+sValue+"---------------"); + } + nowPublicDataService.saveNowHistoryPublicData(publicData); + log.info("楼栋名称:" + buildingName + ",热泵编号:"+addr); + }else if (dataType.equals("tempSet")){ + pumpSetService.updatePumpSetTemp(sValue,buildingId,addr); //更新设定温度 + } + nowDataService.saveNowHistoryData(addr,"热泵",sValue,dataType,buildingId); + log.info("热泵ID: " + addr + ",数据: " + sValue+",保存数据库成功!楼栋编号:"+buildingId); + }else if (registerAddr.equalsIgnoreCase("0BBB")){ //故障状态 + dataType="isFault"; + String sData=ExchangeStringUtil.hexString2binaryString(checkStr.substring(8,10)); + sData=ExchangeStringUtil.addZeroForNum(sData,8); + if (sData.substring(7,8).equalsIgnoreCase("0")){ + sValue="无故障"; + } else if (sData.substring(7,8).equalsIgnoreCase("1")){ + sValue="有故障"; + } + nowDataService.saveNowHistoryData(addr,"热泵",sValue,dataType,buildingId); + log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue+"保存数据库成功!楼栋名称:"+buildingName); + }else if (registerAddr.equalsIgnoreCase("0656") || registerAddr.equalsIgnoreCase("065A") + || registerAddr.equalsIgnoreCase("065E")) { //定时设置值 + sValue = ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)); + } + } else if (checkStr.substring(2, 4).equalsIgnoreCase("06") ) { + log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! " ); + } + } + nowDataService.proWaterTemp(dateStr,buildingId,addr); //保存楼栋时间点温度变化 + log.info("----------------保存楼栋时间点温度变化值!----------------"); + }else{ + log.info("热泵报文检验失败: " + receiveData); + } + }); +// } + } + + public String analysisPumpOrder4852(final String receiveData, final String registerAddr,final String brand,String buildingId) { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + String rtData=""; + //检验报文 + String checkStr = receiveData.substring(0, receiveData.length() - 4); + String checkWord=ExchangeStringUtil.getStrCRC16(checkStr);//生成校验码 + String sValue=null; + String dataType=null; + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { + log.info("热泵报文检验成功: " + receiveData); + String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2)); + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + String data = ""; + if (brand==null || brand.equals("") || brand.equals("美的")){ + if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {//读 + if (registerAddr.equalsIgnoreCase("0641")) { //运行状态 + dataType="runState"; + data = checkStr.substring(8, 10); + if(data.equalsIgnoreCase("08")){ + sValue="不运行"; //关机模式 + }else if(data.equalsIgnoreCase("01")){ + sValue="运行"; //制冷模式 + }else if(data.equalsIgnoreCase("02")){ + sValue="运行"; //制热模式 + }else if(data.equalsIgnoreCase("04")){ + sValue="运行"; //水泵模式 + }else if(data.equalsIgnoreCase("10")){ + sValue="运行"; //制热水模式 + } + //计算热泵运行时间,按分钟 + nowDataService.proPumpMinutes(buildingId,addr,sValue); + log.info("计算热泵运行时长,楼栋名称:"+buildingName+",热泵编号:"+addr+",状态:"+sValue); + nowDataService.saveNowHistoryData(addr,"热泵",sValue,dataType,buildingId); +// NowPublicDataEntity publicData=new NowPublicDataEntity(); +// publicData.setBuildingId(buildingId); +// publicData.setUpWater(sValue); +// nowPublicDataService.saveNowHistoryPublicData(publicData); + log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue+"保存数据库成功!楼栋名称:"+buildingName); + }else if (registerAddr.equalsIgnoreCase("0642") || registerAddr.equalsIgnoreCase("0007")){ + //0642设定温度,0007水箱水温 + if (registerAddr.equalsIgnoreCase("0642")){ + dataType="tempSet"; + }else { + dataType="waterTemp"; + } + //读数 + sValue=ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)); + if (dataType.equals("waterTemp")){ + NowPublicDataEntity publicData=new NowPublicDataEntity(); + publicData.setBuildingId(buildingId); + publicData.setUseWaterTemp(sValue); + publicData.setBackWaterTemp(sValue); + nowPublicDataService.saveNowHistoryPublicData(publicData); + nowDataService.proWaterTemp(dateStr,buildingId,addr); //保存楼栋时间点温度变化 + }else if (dataType.equals("tempSet")){ + pumpSetService.updatePumpSetTemp(sValue,buildingId,addr); //更新设定温度 + } + nowDataService.saveNowHistoryData(addr,"热泵",sValue,dataType,buildingId); + log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue+"保存数据库成功!楼栋名称:"+buildingName); + }else if (registerAddr.equalsIgnoreCase("000B")){ //故障状态 + dataType="isFault"; + String sData=ExchangeStringUtil.hexString2binaryString(checkStr.substring(8,10)); + sData=ExchangeStringUtil.addZeroForNum(sData,8); + if (sData.substring(7,8).equalsIgnoreCase("0")){ + sValue="无故障"; + deviceInstallService.updateDeviceFault("0",addr,"热泵"); + } else if (sData.substring(7,8).equalsIgnoreCase("1")){ + sValue="有故障"; + deviceInstallService.updateDeviceFault("1",addr,"热泵"); + } + nowDataService.saveNowHistoryData(addr,"热泵",sValue,dataType,buildingId); + log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue+"保存数据库成功!楼栋名称:"+buildingName); + }else if (registerAddr.equalsIgnoreCase("0656") || registerAddr.equalsIgnoreCase("065A") + || registerAddr.equalsIgnoreCase("065E")) { //读定时设置值 + String startTime=checkStr.substring(8,10)+checkStr.substring(12,14); + String closetTime=checkStr.substring(16,18)+checkStr.substring(20,22); + sValue =startTime+closetTime; + } + } else if (checkStr.substring(2, 4).equalsIgnoreCase("10") ) { + log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! " ); + } + rtData=sValue; + }else if( brand.equals("美的2")){ + System.out.println("品牌:"+brand+","+"寄存器地址:"+registerAddr); + if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 + if (registerAddr.equalsIgnoreCase("0BBD")) { //运行状态 + dataType="runState"; + data=ExchangeStringUtil.hexString2binaryString(checkStr.substring(8,10)); + data=ExchangeStringUtil.addZeroForNum(data,8);//二进制数,补够8位 + data=data.substring(4,8); //截取后四位 + if (data.equalsIgnoreCase("0000")){ //0 + sValue="不运行"; //关机 + }else if(data.equalsIgnoreCase("0001")){//1 + sValue="运行"; //水泵 + }else if(data.equalsIgnoreCase("0010")){//2 + sValue="运行"; //制冷 + }else if(data.equalsIgnoreCase("0011")){//3 + sValue="运行"; //制热 + }else if(data.equalsIgnoreCase("0100")){//4 + sValue="运行"; //热水 + }else if(data.equalsIgnoreCase("0101")){//5 + sValue="运行"; //采暖 + }else if(data.equalsIgnoreCase("0110")){//6 + sValue="运行"; //电热模式 + } + //计算热泵运行时间,按分钟 + nowDataService.proPumpMinutes(buildingId,addr,sValue); + log.info("计算热泵运行时长,楼栋名称:"+buildingName+",热泵编号:"+addr+",状态:"+sValue); + nowDataService.saveNowHistoryData(addr,"热泵",sValue,dataType,buildingId); +// NowPublicDataEntity publicData=new NowPublicDataEntity(); +// publicData.setBuildingId(buildingId); +// publicData.setUpWater(sValue); +// nowPublicDataService.saveNowHistoryPublicData(publicData); + log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue+"保存数据库成功!楼栋名称:"+buildingName); + }else if (registerAddr.equalsIgnoreCase("0003") || registerAddr.equalsIgnoreCase("0064")){ + //0003设定温度,0064水箱水温 + if (registerAddr.equalsIgnoreCase("0003")){ + dataType="tempSet"; + }else { + dataType="waterTemp"; + } + //读数 + sValue=ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)); + if (dataType.equals("waterTemp")){ + NowPublicDataEntity publicData=new NowPublicDataEntity(); + publicData.setBuildingId(buildingId); + publicData.setUseWaterTemp(sValue); + publicData.setBackWaterTemp(sValue); + nowPublicDataService.saveNowHistoryPublicData(publicData); + nowDataService.proWaterTemp(dateStr,buildingId,addr);//保存楼栋温度变化 + }else if (dataType.equals("tempSet")){ + pumpSetService.updatePumpSetTemp(sValue,buildingId,addr); //更新设定温度 + } + nowDataService.saveNowHistoryData(addr,"热泵",sValue,dataType,buildingId); + log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue+"保存数据库成功!楼栋名称:"+buildingName); + }else if (registerAddr.equalsIgnoreCase("0BBB")){ //故障状态 + dataType="isFault"; + String sData=ExchangeStringUtil.hexString2binaryString(checkStr.substring(8,10)); + sData=ExchangeStringUtil.addZeroForNum(sData,8); + if (sData.substring(7,8).equalsIgnoreCase("0")){ + sValue="无故障"; + } else if (sData.substring(7,8).equalsIgnoreCase("1")){ + sValue="有故障"; + } + nowDataService.saveNowHistoryData(addr,"热泵",sValue,dataType,buildingId); + log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue+"保存数据库成功!楼栋名称:"+buildingName); + }else if (registerAddr.equalsIgnoreCase("0656") || registerAddr.equalsIgnoreCase("065A") + || registerAddr.equalsIgnoreCase("065E")) { //定时设置值 + String startTime=checkStr.substring(8,10)+checkStr.substring(12,14); + String closetTime=checkStr.substring(16,18)+checkStr.substring(20,22); + sValue =startTime+closetTime; + } + rtData=sValue; + } else if (checkStr.substring(2, 4).equalsIgnoreCase("06") ) { + log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! " ); + } + } + }else{ + log.info("热泵报文检验失败: " + receiveData); + } + return rtData; + } + + // 温度变送器,长度42,读功能03 + public void analysisMulTempOrder485(final String receiveData, final String registerAddr,final String brand,String buildingId) { +// if (!Constant.CONTROL_WEB_FLAG) { + threadPoolService.execute(() -> { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文 + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { + //log.info("温度变送器报文检验成功: " + receiveData); + String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 + //log.info("温度变送器:" + addr); + String data = ""; + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 + Map map= new HashMap<>(); + String L1=checkStr.substring(6, 10); //1路 + map.put("1",String.valueOf(ExchangeStringUtil.parseHex4(L1)/10)); + String L2=checkStr.substring(10, 14); //2路 + map.put("2",String.valueOf(ExchangeStringUtil.parseHex4(L2)/10)); + String L3=checkStr.substring(14, 18); //3路 + map.put("3",String.valueOf(ExchangeStringUtil.parseHex4(L3)/10)); + String L4=checkStr.substring(18, 22); //4路 + map.put("4",String.valueOf(ExchangeStringUtil.parseHex4(L4)/10)); + String L5=checkStr.substring(22, 26); //5路 + map.put("5",String.valueOf(ExchangeStringUtil.parseHex4(L5)/10)); + String L6=checkStr.substring(26, 30); //6路 + map.put("6",String.valueOf(ExchangeStringUtil.parseHex4(L6)/10)); + String L7=checkStr.substring(30, 34); //7路 + map.put("7",String.valueOf(ExchangeStringUtil.parseHex4(L7)/10)); + String L8=checkStr.substring(34, 38); //8路 + map.put("8",String.valueOf(ExchangeStringUtil.parseHex4(L8)/10)); + + int count=buildingService.selectPumpCount(buildingId); //楼栋热泵数 + if (count>0){ + for (Map.Entry entry : map.entrySet()) { + addr=entry.getKey(); + data=entry.getValue(); + if(addr!=null && Integer.valueOf(addr)<=count){ + nowDataService.saveNowHistoryData3(addr,"温度变送器",data,"waterTemp",buildingId); + nowDataService.proWaterTemp(dateStr,buildingId,addr); //保存时间点温度 + } + } + log.info("温度变送器:" + addr+",保存数据库成功!楼栋名称:"+buildingName); + String avgTemp=nowDataService.selectAve(buildingId); + NowPublicDataEntity publicData=new NowPublicDataEntity(); + publicData.setBuildingId(buildingId); + publicData.setUseWaterTemp(avgTemp); + publicData.setBackWaterTemp(avgTemp); + nowPublicDataService.saveNowHistoryPublicData(publicData); + } + } + }else{ + log.info("温度变送器报文检验失败: " + receiveData); + } + }); +// } + } + + // 温度变送器,长度42,读功能03 + public String analysisMulTempOrder4852(final String receiveData, final String registerAddr,final String brand,String buildingId) { + String result="fail"; + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文 + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { + //log.info("温度变送器报文检验成功: " + receiveData); + String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 + String data = ""; + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 + Map map= new HashMap<>(); + String L1=checkStr.substring(6, 10); //1路 + map.put("1",String.valueOf(ExchangeStringUtil.parseHex4(L1)/10)); + String L2=checkStr.substring(10, 14); //2路 + map.put("2",String.valueOf(ExchangeStringUtil.parseHex4(L2)/10)); + String L3=checkStr.substring(14, 18); //3路 + map.put("3",String.valueOf(ExchangeStringUtil.parseHex4(L3)/10)); + String L4=checkStr.substring(18, 22); //4路 + map.put("4",String.valueOf(ExchangeStringUtil.parseHex4(L4)/10)); + String L5=checkStr.substring(22, 26); //5路 + map.put("5",String.valueOf(ExchangeStringUtil.parseHex4(L5)/10)); + String L6=checkStr.substring(26, 30); //6路 + map.put("6",String.valueOf(ExchangeStringUtil.parseHex4(L6)/10)); + String L7=checkStr.substring(30, 34); //7路 + map.put("7",String.valueOf(ExchangeStringUtil.parseHex4(L7)/10)); + String L8=checkStr.substring(34, 38); //8路 + map.put("8",String.valueOf(ExchangeStringUtil.parseHex4(L8)/10)); + int count=buildingService.selectPumpCount(buildingId); //楼栋热泵数 + if (count>0){ + for (Map.Entry entry : map.entrySet()) { + addr=entry.getKey(); + data=entry.getValue(); + if(addr!=null && Integer.valueOf(addr)<=count){ + nowDataService.saveNowHistoryData3(addr,"温度变送器",data,"waterTemp",buildingId); + nowDataService.proWaterTemp(dateStr,buildingId,addr);//保存时间点温度 + } + } + log.info("温度变送器:" + addr+",保存数据库成功!楼栋名称:"+buildingName); + String avgTemp=nowDataService.selectAve(buildingId); + NowPublicDataEntity publicData=new NowPublicDataEntity(); + publicData.setBuildingId(buildingId); + publicData.setUseWaterTemp(avgTemp); + publicData.setBackWaterTemp(avgTemp); + publicData.setSingleTemp(map.get("1"));//编号最小的热泵温度作为单箱温度 + nowPublicDataService.saveNowHistoryPublicData(publicData); + result = JSON.toJSONString(map); //map转json字符串 + } + } + }else{ + log.info("温度变送器报文检验失败: " + receiveData); + } + return result; + } + + // 温控,长度18,读功能03,用于检测水箱水温 + public void analysisTempOrder485(final String receiveData, final String registerAddr,final String brand,String buildingId) { +// if (!Constant.CONTROL_WEB_FLAG) { + threadPoolService.execute(() -> { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + // 检验报文 + String checkStr = receiveData.substring(0, receiveData.length() - 4); + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { + String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 + //log.info("温控号:" + addr); + String data = ""; + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 + data=ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)); + Double fdata=Double.parseDouble(data)/10; + if (fdata<=25){ + fdata=25.0; + }else if (fdata>=65){ + fdata=65.0; + } + nowDataService.saveNowHistoryData2(addr,"温控",String.valueOf(fdata),"waterTemp",buildingId); + nowDataService.proWaterTemp(dateStr,buildingId,"");//保存时间点温度 + String avgTemp=nowDataService.selectAve(buildingId); + NowPublicDataEntity publicData=new NowPublicDataEntity(); + publicData.setBuildingId(buildingId); + publicData.setUseWaterTemp(avgTemp); + publicData.setBackWaterTemp(avgTemp); + publicData.setSingleTemp(String.valueOf(fdata));//单箱温度 + nowPublicDataService.saveNowHistoryPublicData(publicData); + log.info("温控号:" + addr+",温度值:"+fdata+",保存数据库成功!楼栋名称:"+buildingName); + } + }else{ + log.info("温控报文检验失败: " + receiveData); + } + }); +// } + } + + // 压变,长度14,18读功能03 + public void analysisPressureOrder485(final String receiveData, final String registerAddr,final String brand,String buildingId) { +// if (!Constant.CONTROL_WEB_FLAG) { + threadPoolService.execute(() -> { + String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文 + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); + String sValue=null; + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 + String data = ""; + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 + Double wtHeight=0.0; + if (brand==null || brand.equals("")){ + float fdata=ExchangeStringUtil.hexToSingle(checkStr.substring(6, 14));//十六进制转浮点型 + wtHeight=fdata*1.02; //通过压力求水高 + }else if (brand.equals("澳升") || brand.equals("汝翊")){ + data=ExchangeStringUtil.hexToDec(checkStr.substring(6, 10));//十六进制转整形 + wtHeight=Double.parseDouble(data)/100*0.102; //通过压力求水高 + } + Double tankHeight=buildingService.queryTankHeight(buildingId);//水箱高,从数据库获取 + if (tankHeight==null){ + tankHeight=2.0; + } + Double wtLevel=wtHeight/tankHeight*100; //水箱水位 + log.info("------水箱水高:"+wtLevel+"------"); + if (wtLevel<=0){ + wtLevel=0.0; + }else if (wtLevel>=100){ + wtLevel=100.0; + } + DecimalFormat df = new DecimalFormat("0.0"); + String strWtLevel=df.format(wtLevel); + nowDataService.saveNowHistoryData2(addr,"压变",strWtLevel,"waterLevel",buildingId); + log.info("压变号:" + addr+",保存数据库成功!楼栋名称:"+buildingName); + nowDataService.proWaterLevel(dateStr,buildingId); //楼栋水位 + log.info("------保存每栋楼小时水位情况"+dateStr+"------"); + } + }else{ + log.info("压变报文检验失败: " + receiveData); + } + }); +// } + } + + // 压变,长度14,18读功能03 + public String analysisPressureOrder4852(final String receiveData, final String registerAddr,final String brand,String buildingId) { + String result="fail"; + String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文 + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); + String sValue=null; + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 + String data = ""; + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 + Double wtHeight=0.0; + if (brand==null || brand.equals("")){ + float fdata=ExchangeStringUtil.hexToSingle(checkStr.substring(6, 14));//十六进制转浮点型 + wtHeight=fdata*1.02; //通过压力求水高 + }else if (brand.equals("澳升") || brand.equals("汝翊")){ + data=ExchangeStringUtil.hexToDec(checkStr.substring(6, 10));//十六进制转整形 + wtHeight=Double.parseDouble(data)/100*0.102; //通过压力求水高 + } + Double tankHeight=buildingService.queryTankHeight(buildingId);//水箱高,从数据库获取 + if (tankHeight==null){ + tankHeight=2.0; + } + Double wtLevel=wtHeight/tankHeight*100; //水箱水位 + log.info("------水箱水高:"+wtLevel+"------"); + if (wtLevel<=0){ + wtLevel=0.0; + }else if (wtLevel>=100){ + wtLevel=100.0; + } + DecimalFormat df = new DecimalFormat("0.0"); + String strWtLevel=df.format(wtLevel); + result=strWtLevel; + nowDataService.saveNowHistoryData2(addr,"压变",strWtLevel,"waterLevel",buildingId); + log.info("压变号:" + addr+",保存数据库成功!楼栋名称:"+buildingName); + nowDataService.proWaterLevel(dateStr,buildingId); //楼栋水位 + log.info("------保存每栋楼小时水位情况------"+dateStr); + } + }else{ + log.info("压变报文检验失败: " + receiveData); + } + return result; + } + + // 水位开关,长度42,128 + public void analysisRelayOrder485(final String receiveData, final String registerAddr,final String brand,String buildingId) { + threadPoolService.execute(() -> { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + String l1=""; + String l2=""; + String l3=""; + String l4=""; + String l5=""; + String l6=""; + String l7=""; + String l8=""; + String waterLevelSet=""; + String addr=""; + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + if (brand==null || brand.equals("") || brand.equals("中凯")){ + String checkStr = receiveData.substring(0, receiveData.length() - 4); //减去校验码 + addr = ExchangeStringUtil.hexToDec(checkStr.substring(2, 4)); + if (registerAddr!=null && !registerAddr.equals("")) { + if (registerAddr.equalsIgnoreCase("0017")) { //中凯拿功能码作为寄存器地址用 + l1 = checkStr.substring(4, 6); + l2 = checkStr.substring(20, 22); + l3 = checkStr.substring(36, 38); + l4 = checkStr.substring(52, 54); + l5 = checkStr.substring(68, 70); + l6 = checkStr.substring(84, 86); + l7 = checkStr.substring(100, 102); + l8 = checkStr.substring(116, 118); + } else if (registerAddr.equals("0012")) { + log.info("时间:" + dateStr + ",水位开关ID:" + addr + ",操作成功! "); + } + } + }else if (brand.equals("远向")){ + String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文 + String checkWord=ExchangeStringUtil.getStrCRC16(checkStr); + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { + addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 + if (checkStr.substring(2, 4).equals("03")) { + if (registerAddr!=null && !registerAddr.equals("")){ +// if (registerAddr.equals("0018")){ + l1=checkStr.substring(6,10); + l2=checkStr.substring(10,14); + l3=checkStr.substring(14,18); + l4=checkStr.substring(18,22); + l5=checkStr.substring(22,26); + l6=checkStr.substring(26,30); + l7=checkStr.substring(30,34); + l8=checkStr.substring(34,38); +// } + } + } else if (checkStr.substring(2, 4).equals("06") || checkStr.substring(2, 4).equals("04")) { + log.info("时间:" + dateStr + ",水位开关ID:" + addr + ",操作成功! " ); + } + }else{ + log.info("水位开关报文检验失败: " + receiveData); + } + }else if (brand.equals("顶威")){ + String checkStr = receiveData.substring(0, receiveData.length() - 4); //减去校验码 + String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 + if (checkNum.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4,receiveData.length()-2))) { + //表号,12位 + String meterId = checkStr.substring(12, 14) + checkStr.substring(10, 12) + checkStr.substring(8, 10) + + checkStr.substring(6, 8) + checkStr.substring(4, 6) + checkStr.substring(2, 4); + meterId = String.format("%012d", Long.parseLong(meterId)); + if (registerAddr!=null && !registerAddr.equals("")){ + if (registerAddr.equals("0102")){ + String data=receiveData.substring(26,28); + data=ExchangeStringUtil.cutThree(data); + data=ExchangeStringUtil.addZeroForNum(data,2); + if (data.equalsIgnoreCase("00")){//全闭 + waterLevelSet="100"; //100% + }else if(data.equalsIgnoreCase("01")){ + waterLevelSet="90"; //90% + }else if(data.equalsIgnoreCase("03")){ + waterLevelSet="85"; + }else if(data.equalsIgnoreCase("07")){ + waterLevelSet="80"; + }else if(data.equalsIgnoreCase("0F")){ + waterLevelSet="75"; + }else if(data.equalsIgnoreCase("1F")){ + waterLevelSet="70"; + }else if(data.equalsIgnoreCase("3F")){ + waterLevelSet="65"; + }else if(data.equalsIgnoreCase("7F")){ + waterLevelSet="60"; + }else if(data.equalsIgnoreCase("FF")){ //全开 + waterLevelSet="50"; + }else if(data.equalsIgnoreCase("24")){ + waterLevelSet="自动"; + } + nowDataService.saveNowHistoryData2(meterId,"水位开关",waterLevelSet,"levelSet",buildingId); + log.info("水位开关号:" + meterId+",保存数据库成功!楼栋名称:"+buildingName); + }else if (registerAddr.equalsIgnoreCase("0407")){ + log.info("时间: " + dateStr + ",继电器ID: " + meterId + ",操作成功! "); + } + } + }else{ + log.info("水位开关报文检验失败: " + receiveData); + } + } + if (registerAddr!=null && !registerAddr.equals("")){ + if (registerAddr.equals("0017") || registerAddr.equals("0018")){ + if (l1.equals("12") || l1.equals("0001")){ + waterLevelSet="90"; + }else if (l2.equals("12") || l2.equals("0001")){ + waterLevelSet="80"; + }else if (l3.equals("12") || l3.equals("0001")){ + waterLevelSet="70"; + }else if (l4.equals("12") || l4.equals("0001")){ + waterLevelSet="60"; + }else if (l5.equals("12") || l5.equals("0001")){ + waterLevelSet="50"; + }else if (l6.equals("12") || l6.equals("0001")){ + waterLevelSet="40"; + } + //全开或者全关 + if (l1.equals("12") && l2.equals("12") && l3.equals("12") && l4.equals("12") && l5.equals("12") && l6.equals("12")){ + waterLevelSet="40"; + }else if (l1.equals("11") && l2.equals("11") && l3.equals("11") && l4.equals("11") && l5.equals("11") && l6.equals("11")){ + waterLevelSet="100"; + }else if (l1.equals("0001") && l2.equals("0001") && l3.equals("0001") && l4.equals("0001") && l5.equals("0001") && l6.equals("0001")){ + waterLevelSet="40"; + }else if(l1.equals("0000") && l2.equals("0000") && l3.equals("0000") && l4.equals("0000") && l5.equals("0000") && l6.equals("0000")){ + waterLevelSet="100"; + } + nowDataService.saveNowHistoryData2(addr,"水位开关",waterLevelSet,"levelSet",buildingId); + log.info("水位开关保存数据库成功!楼栋名称:"+buildingName); + }else if (registerAddr.equals("0010")){ + NowPublicDataEntity publicData=new NowPublicDataEntity(); + publicData.setBuildingId(buildingId); + if (l1.equals("0001")){ //l路,0000表示有输入,0001表示无输入 + publicData.setUseWater("运行"); //供水 + publicData.setBackWater("运行");//回水 + }else { + publicData.setUseWater("不运行"); + publicData.setBackWater("不运行"); + } + log.info("-----------------供水/回水状态:"+l1+"-----------------"); + if (l2.equals("0001")){ //2路 //补水 + publicData.setUpWater("运行"); + }else { + publicData.setUpWater("不运行"); + } + log.info("-----------------补水状态:"+l2+"-----------------"); + nowPublicDataService.saveNowHistoryPublicData(publicData); + log.info("-----------------状态保存数据库成功!楼栋名称:"+buildingName+"-----------------"); + } + } + }); + } + + // 水位开关,长度42,128 + public String analysisRelayOrder4852(final String receiveData, final String registerAddr,final String brand,String buildingId) { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + String l1=""; + String l2=""; + String l3=""; + String l4=""; + String l5=""; + String l6=""; + String l7=""; + String l8=""; + String waterLevelSet=""; + String addr=""; + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + if (brand==null || brand.equals("") || brand.equals("中凯")){ + // 检验报文 + String checkStr = receiveData.substring(0, receiveData.length() - 4); //减去校验码 + addr = ExchangeStringUtil.hexToDec(checkStr.substring(2, 4)); //地址 + if (registerAddr!=null && !registerAddr.equals("")){ + if (registerAddr.equalsIgnoreCase("0017")) { //中凯拿功能码作为寄存器地址用 + l1 = checkStr.substring(4, 6); + l2 = checkStr.substring(20, 22); + l3 = checkStr.substring(36, 38); + l4 = checkStr.substring(52, 54); + l5 = checkStr.substring(68, 70); + l6 = checkStr.substring(84, 86); + l7 = checkStr.substring(100, 102); + l8 = checkStr.substring(116, 118); + } else if (registerAddr.equalsIgnoreCase("0012")) { + log.info("时间:" + dateStr + ",水位开关ID:" + addr + ",操作成功! "); + } + } + }else if (brand.equals("远向")){ + String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文 + String checkWord=ExchangeStringUtil.getStrCRC16(checkStr); + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { + addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2)); + if (checkStr.substring(2, 4).equalsIgnoreCase("03")) { + if (registerAddr!=null && !registerAddr.equals("")){ + if (registerAddr.equalsIgnoreCase("0018")){ + l1=checkStr.substring(6,10); + l2=checkStr.substring(10,14); + l3=checkStr.substring(14,18); + l4=checkStr.substring(18,22); + l5=checkStr.substring(22,26); + l6=checkStr.substring(26,30); + l7=checkStr.substring(30,34); + l8=checkStr.substring(34,38); + } + } + } else if (checkStr.substring(2, 4).equalsIgnoreCase("06") || checkStr.substring(2, 4).equalsIgnoreCase("04")) { + log.info("时间:" + dateStr + ",水位开关ID:" + addr + ",操作成功! " ); + } + }else{ + log.info("水位开关报文检验失败: " + receiveData); + } + }else if (brand.equals("顶威")){ + String checkStr = receiveData.substring(0, receiveData.length() - 4); //减去校验码 + String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 + if (checkNum.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4,receiveData.length() -2))) { + //表号,12位 + String meterId = checkStr.substring(12, 14) + checkStr.substring(10, 12) + checkStr.substring(8, 10) + + checkStr.substring(6, 8) + checkStr.substring(4, 6) + checkStr.substring(2, 4); + meterId = String.format("%012d", Long.parseLong(meterId)); + if (registerAddr!=null && !registerAddr.equals("")){ + if (registerAddr.equalsIgnoreCase("0102")){ + String data=receiveData.substring(24,26); + data=ExchangeStringUtil.cutThree(data); + data=ExchangeStringUtil.addZeroForNum(data,2); + if (data.equalsIgnoreCase("00")){//全闭 + waterLevelSet="100"; //100% + }else if(data.equalsIgnoreCase("01")){ + waterLevelSet="90"; + }else if(data.equalsIgnoreCase("03")){ + waterLevelSet="85"; + }else if(data.equalsIgnoreCase("07")){ + waterLevelSet="80"; + }else if(data.equalsIgnoreCase("0F")){ + waterLevelSet="75"; + }else if(data.equalsIgnoreCase("1F")){ + waterLevelSet="70"; + }else if(data.equalsIgnoreCase("3F")){ + waterLevelSet="65"; + }else if(data.equalsIgnoreCase("7F")){ + waterLevelSet="60"; + }else if(data.equalsIgnoreCase("FF")){ //全开 + waterLevelSet="50"; + }else if(data.equalsIgnoreCase("24")){ + waterLevelSet="自动"; + } + nowDataService.saveNowHistoryData2(meterId,"水位开关",waterLevelSet,"levelSet",buildingId); + log.info("水位开关"+meterId+",保存数据库成功!楼栋名称:"+buildingName); + }else if (registerAddr.equalsIgnoreCase("0407")){ + log.info("时间:" + dateStr + ",继电器ID:" + meterId + ",操作成功! "); + } + } + }else{ + log.info("水位开关报文检验失败: " + receiveData); + } + } + if (registerAddr!=null && !registerAddr.equals("")){ + if (registerAddr.equals("0017") || registerAddr.equals("0018")){ + if (l1.equals("12") || l1.equals("0001")){ + waterLevelSet="90"; + }else if (l2.equals("12") || l2.equals("0001")){ + waterLevelSet="80"; + }else if (l3.equals("12") || l3.equals("0001")){ + waterLevelSet="70"; + }else if (l4.equals("12") || l4.equals("0001")){ + waterLevelSet="60"; + }else if (l5.equals("12") || l5.equals("0001")){ + waterLevelSet="50"; + }else if (l6.equals("12") || l6.equals("0001")){ + waterLevelSet="40"; + } + //全开或者全关 + if (l1.equals("12") && l2.equals("12") && l3.equals("12") && l4.equals("12") && l5.equals("12") && l6.equals("12")){ + waterLevelSet="40"; + }else if (l1.equals("11") && l2.equals("11") && l3.equals("11") && l4.equals("11") && l5.equals("11") && l6.equals("11")){ + waterLevelSet="100"; + }else if (l1.equals("0001") && l2.equals("0001") && l3.equals("0001") && l4.equals("0001") && l5.equals("0001") && l6.equals("0001")){ + waterLevelSet="40"; + }else if(l1.equals("0000") && l2.equals("0000") && l3.equals("0000") && l4.equals("0000") && l5.equals("0000") && l6.equals("0000")){ + waterLevelSet="100"; + } + nowDataService.saveNowHistoryData2(addr,"水位开关",waterLevelSet,"levelSet",buildingId); + log.info("水位开关保存数据库成功!楼栋名称:"+buildingName); + } + } + log.info("--------------水位:"+registerAddr+","+waterLevelSet); + return waterLevelSet; + } + + // 热泵状态处理(水位开关),长度42,128 + public void analysisPumpStateOrder(final String receiveData, final String registerAddr,final String brand,String buildingId) { + threadPoolService.execute(() -> { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + String l1=""; + String l2=""; + String l3=""; + String l4=""; + String l5=""; + String l6=""; + String l7=""; + String l8=""; + String runState=""; + String addr=""; + Map map=new HashMap(); + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + if (brand==null || brand.equals("") || brand.equals("顶威")){ + String checkStr = receiveData.substring(0, receiveData.length() - 4); //检验报文减,去校验码 + String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 + if (checkNum.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4, receiveData.length() - 2))) { + //表号,12位 + addr = checkStr.substring(12, 14) + checkStr.substring(10, 12) + checkStr.substring(8, 10) + + checkStr.substring(6, 8) + checkStr.substring(4, 6) + checkStr.substring(2, 4); + addr = addr.replaceAll("^0*", ""); + String data = checkStr.substring(24, 26); //截取数值 + data = ExchangeStringUtil.cutThree(data); + String strStatus = ExchangeStringUtil.hexString2binaryString(data); + strStatus = String.format("%08d", Long.parseLong(strStatus)); + if (strStatus.substring(7, 8).equals("1")) { + l1 = "1"; + } else { + l1 = "0"; + } + if (strStatus.substring(6, 7).equals("1")) { + l2 = "1"; + } else { + l2 = "0"; + } + if (strStatus.substring(5, 6).equals("1")) { + l3 = "1"; + } else { + l3 = "0"; + } + if (strStatus.substring(4, 5).equals("1")) { + l4 = "1"; + } else { + l4 = "0"; + } + if (strStatus.substring(3, 4).equals("1")) { + l5 = "1"; + } else { + l5 = "0"; + } + if (strStatus.substring(2, 3).equals("1")) { + l6 = "1"; + } else { + l6 = "0"; + } + if (strStatus.substring(1, 2).equals("1")) { + l7 = "1"; + } else { + l7 = "0"; + } + if (strStatus.substring(0, 1).equals("1")) { + l8 = "1"; + } else { + l8 = "0"; + } + } + }else if (brand.equals("中凯")){ + String checkStr = receiveData.substring(0, receiveData.length() - 4); //检验报文,减去校验码 + addr = ExchangeStringUtil.hexToDec(checkStr.substring(2, 4)); + //if (registerAddr!=null && !registerAddr.equals("")) { + //if (registerAddr.equalsIgnoreCase("0017")) { //中凯拿功能码作为寄存器地址用 + l1 = checkStr.substring(4, 6); + l2 = checkStr.substring(20, 22); + l3 = checkStr.substring(36, 38); + l4 = checkStr.substring(52, 54); + l5 = checkStr.substring(68, 70); + l6 = checkStr.substring(84, 86); + l7 = checkStr.substring(100, 102); + l8 = checkStr.substring(116, 118); + //} else if (registerAddr.equals("0012")) { + //log.info("时间: " + dateStr + ",热泵状态号: " + addr + ",操作成功! "); + //} + //} + }else if (brand.equals("远向")){ + String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文 + String checkWord=ExchangeStringUtil.getStrCRC16(checkStr); + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { + addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 + //if (checkStr.substring(2, 4).equals("03")) { + //if (registerAddr!=null && !registerAddr.equals("")){ + l1=checkStr.substring(6,10); + l2=checkStr.substring(10,14); + l3=checkStr.substring(14,18); + l4=checkStr.substring(18,22); + l5=checkStr.substring(22,26); + l6=checkStr.substring(26,30); + l7=checkStr.substring(30,34); + l8=checkStr.substring(34,38); + //} + //} else if (checkStr.substring(2, 4).equals("06") || checkStr.substring(2, 4).equals("04")) { + //log.info("时间: " + dateStr + ",热泵状态号: " + addr + ",操作成功! " ); + //} + }else{ + log.info("热泵状态报文检验失败: " + receiveData); + } + } + //if (registerAddr!=null && !registerAddr.equals("")){ + //if (registerAddr.equals("0017") || registerAddr.equals("0010")){ + if (l1.equals("12") || l1.equals("0001")){ //正常是0001 +// if (l1.equals("12") || l1.equals("0000") || l1.equals("1")){ + map.put("1","运行"); + }else { + map.put("1", "不运行"); + } + if (l2.equals("12") || l2.equals("0001")){ +// if (l2.equals("12") || l2.equals("0000") || l2.equals("1")){ + map.put("2","运行"); + }else{ + map.put("2","不运行"); + } + if (l3.equals("12") || l3.equals("0001")) { +// if (l3.equals("12") || l3.equals("0000") || l3.equals("1")) { + map.put("3", "运行"); + }else{ + map.put("3","不运行"); + } + if (l4.equals("12") || l4.equals("0001")){ +// if (l4.equals("12") || l4.equals("0000") || l4.equals("1")){ + map.put("4","运行"); + }else{ + map.put("4","不运行"); + } + if (l5.equals("12") || l5.equals("0001")){ +// if (l5.equals("12") || l5.equals("0000") || l5.equals("1")){ + map.put("5","运行"); + }else{ + map.put("5","不运行"); + } + if (l6.equals("12") || l6.equals("0001")){ +// if (l6.equals("12") || l6.equals("0000") || l6.equals("1")){ + map.put("6","运行"); + }else{ + map.put("6","不运行"); + } + if (l7.equals("12") || l7.equals("0001")){ +// if (l7.equals("12") || l7.equals("0000") || l7.equals("1")){ + map.put("7","运行"); + }else{ + map.put("7","不运行"); + } + if (l8.equals("12") || l8.equals("0001")){ +// if (l8.equals("12") || l8.equals("0000") || l8.equals("1")){ + map.put("8","运行"); + }else{ + map.put("8","不运行"); + } + int count=buildingService.selectPumpCount(buildingId); //楼栋热泵数 + if (count>0){ + for (Map.Entry entry : map.entrySet()) { + addr=entry.getKey(); //获取Key值作为热泵ID + runState=entry.getValue(); + if(addr!=null && Integer.valueOf(addr)<=count){ + nowDataService.saveNowHistoryData3(addr,"热泵状态",runState,"runState",buildingId); + nowDataService.proPumpMinutes(buildingId,addr,runState); //计算热泵运行时长 + nowDataService.proWaterTemp(dateStr,buildingId,addr); //保存时间点温度 + log.info("计算热泵运行时长,楼栋名称:"+buildingName+",热泵编号:"+addr+",状态:"+runState); + } + } + log.info("热泵状态号:"+addr+",保存数据库成功!楼栋名称:"+buildingName); + } + //} + //} + }); + } + + // 热泵状态处理(水位开关),长度42,128 + public String analysisPumpStateOrder2(final String receiveData, final String registerAddr,final String brand,String buildingId) { + String result="fail"; + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + String l1=""; + String l2=""; + String l3=""; + String l4=""; + String l5=""; + String l6=""; + String l7=""; + String l8=""; + String runState=""; + String addr=""; + Map map=new HashMap(); + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + if (brand==null || brand.equals("") || brand.equals("顶威")){ + String checkStr = receiveData.substring(0, receiveData.length() - 4); //检验报文减,去校验码 + String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 + if (checkNum.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4, receiveData.length() - 2))) { + //表号,12位 + addr = checkStr.substring(12, 14) + checkStr.substring(10, 12) + checkStr.substring(8, 10) + + checkStr.substring(6, 8) + checkStr.substring(4, 6) + checkStr.substring(2, 4); + addr = addr.replaceAll("^0*", ""); + String data = checkStr.substring(24, 26); //截取数值 + data = ExchangeStringUtil.cutThree(data); + String strStatus = ExchangeStringUtil.hexString2binaryString(data); + strStatus = String.format("%08d", Long.parseLong(strStatus)); + if (strStatus.substring(7, 8).equals("1")) { + l1 = "1"; + } else { + l1 = "0"; + } + if (strStatus.substring(6, 7).equals("1")) { + l2 = "1"; + } else { + l2 = "0"; + } + if (strStatus.substring(5, 6).equals("1")) { + l3 = "1"; + } else { + l3 = "0"; + } + if (strStatus.substring(4, 5).equals("1")) { + l4 = "1"; + } else { + l4 = "0"; + } + if (strStatus.substring(3, 4).equals("1")) { + l5 = "1"; + } else { + l5 = "0"; + } + if (strStatus.substring(2, 3).equals("1")) { + l6 = "1"; + } else { + l6 = "0"; + } + if (strStatus.substring(1, 2).equals("1")) { + l7 = "1"; + } else { + l7 = "0"; + } + if (strStatus.substring(0, 1).equals("1")) { + l8 = "1"; + } else { + l8 = "0"; + } + } + }else if (brand.equals("中凯")){ + String checkStr = receiveData.substring(0, receiveData.length() - 4); //检验报文,减去校验码 + addr = ExchangeStringUtil.hexToDec(checkStr.substring(2, 4)); + //if (registerAddr!=null && !registerAddr.equals("")) { + //if (registerAddr.equalsIgnoreCase("0017")) { //中凯拿功能码作为寄存器地址用 + l1 = checkStr.substring(4, 6); + l2 = checkStr.substring(20, 22); + l3 = checkStr.substring(36, 38); + l4 = checkStr.substring(52, 54); + l5 = checkStr.substring(68, 70); + l6 = checkStr.substring(84, 86); + l7 = checkStr.substring(100, 102); + l8 = checkStr.substring(116, 118); + //} else if (registerAddr.equals("0012")) { + //log.info("时间: " + dateStr + ",热泵状态号: " + addr + ",操作成功! "); + //} + //} + }else if (brand.equals("远向")){ + String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文 + String checkWord=ExchangeStringUtil.getStrCRC16(checkStr); + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { + addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 + //if (checkStr.substring(2, 4).equals("03")) { + //if (registerAddr!=null && !registerAddr.equals("")){ + l1=checkStr.substring(6,10); + l2=checkStr.substring(10,14); + l3=checkStr.substring(14,18); + l4=checkStr.substring(18,22); + l5=checkStr.substring(22,26); + l6=checkStr.substring(26,30); + l7=checkStr.substring(30,34); + l8=checkStr.substring(34,38); + //} + //} else if (checkStr.substring(2, 4).equals("06") || checkStr.substring(2, 4).equals("04")) { + //log.info("时间: " + dateStr + ",热泵状态号: " + addr + ",操作成功! " ); + //} + }else{ + log.info("热泵状态报文检验失败: " + receiveData); + } + } + //if (registerAddr!=null && !registerAddr.equals("")){ + //if (registerAddr.equals("0017") || registerAddr.equals("0010")){ + if (l1.equals("12") || l1.equals("0001")){ //正常是0001 +// if (l1.equals("12") || l1.equals("0000") || l1.equals("1")){ + map.put("1","运行"); + }else { + map.put("1", "不运行"); + } + if (l2.equals("12") || l2.equals("0001")){ +// if (l2.equals("12") || l2.equals("0000") || l2.equals("1")){ + map.put("2","运行"); + }else{ + map.put("2","不运行"); + } + if (l3.equals("12") || l3.equals("0001")) { +// if (l3.equals("12") || l3.equals("0000") || l3.equals("1")) { + map.put("3", "运行"); + }else{ + map.put("3","不运行"); + } + if (l4.equals("12") || l4.equals("0001")){ +// if (l4.equals("12") || l4.equals("0000") || l4.equals("1")){ + map.put("4","运行"); + }else{ + map.put("4","不运行"); + } + if (l5.equals("12") || l5.equals("0001")){ +// if (l5.equals("12") || l5.equals("0000") || l5.equals("1")){ + map.put("5","运行"); + }else{ + map.put("5","不运行"); + } + if (l6.equals("12") || l6.equals("0001")){ +// if (l6.equals("12") || l6.equals("0000") || l6.equals("1")){ + map.put("6","运行"); + }else{ + map.put("6","不运行"); + } + if (l7.equals("12") || l7.equals("0001")){ +// if (l7.equals("12") || l7.equals("0000") || l7.equals("1")){ + map.put("7","运行"); + }else{ + map.put("7","不运行"); + } + if (l8.equals("12") || l8.equals("0001")){ +// if (l8.equals("12") || l8.equals("0000") || l8.equals("1")){ + map.put("8","运行"); + }else{ + map.put("8","不运行"); + } + int count=buildingService.selectPumpCount(buildingId); //楼栋热泵数 + if (count>0) { + for (Map.Entry entry : map.entrySet()) { + addr = entry.getKey(); //获取Key值作为热泵ID + runState = entry.getValue(); + if (addr != null && Integer.valueOf(addr) <= count) { + nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId); + nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长 + log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState); + } + } + log.info("热泵状态号" + addr + ",保存数据库成功!楼栋名称:" + buildingName); + result = JSON.toJSONString(map); //map转json字符串 + } + //} + //} + return result; + } + + //状态检测 + public void analysisStateOrder485(final String dataStr,final String registerAddr,final String brand,String buildingId) { + threadPoolService.execute(() -> { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称 + if (dataStr.length() == 30) { + //检验报文 + String checkStr = dataStr.substring(0, dataStr.length() - 4); //减去校验码 + String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 + //返回的校验码与重新生成的校验码进行校验 + if (checkNum.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4, dataStr.length() - 2))) { + //表号,12位 + String meterId = checkStr.substring(12, 14) + checkStr.substring(10, 12) + checkStr.substring(8, 10) + + checkStr.substring(6, 8) + checkStr.substring(4, 6) + checkStr.substring(2, 4); + meterId = meterId.replaceAll("^0*",""); + //数值 + String data = checkStr.substring(24, 26); + data = ExchangeStringUtil.cutThree(data); + String strStatus=ExchangeStringUtil.hexString2binaryString(data); + strStatus = String.format("%08d", Long.parseLong(strStatus)); + String backWater; + if (strStatus.substring(7,8).equals("1")){//回水 + backWater="运行"; + }else{ + backWater="不运行"; + } + String hotPump; + if (strStatus.substring(6,7).equals("1")){//热泵 + hotPump="运行"; + }else{ + hotPump="不运行"; + } + String upWater; + if (strStatus.substring(5,6).equals("1")){//上水或者补水 + upWater="运行"; + }else{ + upWater="不运行"; + } + String useWater; + if (strStatus.substring(4,5).equals("1")){//用水或者供水 + useWater="运行"; + }else{ + useWater="不运行"; + } + NowPublicDataEntity publicData=new NowPublicDataEntity(); + publicData.setUseWater(useWater); + publicData.setUpWater(upWater); + publicData.setBackWater(backWater); + publicData.setBuildingId(buildingId); + try { + //通过状态检测保存热泵状态 + nowDataService.saveNowHistoryData2(meterId,"状态检测",hotPump,"runState",buildingId); + nowPublicDataService.saveNowHistoryPublicData(publicData); + nowDataService.proPumpMinutes(buildingId,"1",hotPump); //如果只有一台热泵,pumpId为1 + log.info("状态ID:"+ meterId+",回水:"+backWater+",补水:"+upWater+",供水:"+useWater+",热泵:"+hotPump+",保存数据成功!楼栋:"+buildingName); + } catch (Exception e) { +// e.printStackTrace(); + } + }else{ + log.info("状态检测报文检验失败: " + dataStr); + } + } + }); + } + + //时间控制器,长度26、22 + public void analysisTimeSetOrder485(final String receiveData, final String registerAddr,final String brand,String buildingId) { +// if (!Constant.CONTROL_WEB_FLAG) { + threadPoolService.execute(() -> { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + // 去掉空格 +// String receiveData = receiveData1.replace(" ", ""); + // 检验报文 + String checkStr = receiveData.substring(0, receiveData.length() - 4); + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); + + String sValue=null; + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { + log.info("时控报文检验成功: " + receiveData); +// System.out.println("时控报文检验成功: " + receiveData); + //地址 + String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2)); + log.info("时控号: " + addr); +// System.out.println("时控号: " + addr); + String data = ""; + if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 + int rec=receiveData.length(); + + if (rec==26) { //读时间设置值 + data=checkStr.substring(6,rec-4); + String curTimeBegin1=data.substring(0,2)+":"+data.substring(2,4); + String curTimeEnd1=data.substring(4,6)+":"+data.substring(6,8); + String curTimeBegin2=data.substring(8,10)+":"+data.substring(10,12); + String curTimeEnd2=data.substring(12,14)+":"+data.substring(14,16); + + }else if (rec==22){ //读校对时间 + data=checkStr.substring(8,rec-4); + String strDate="20"+data.substring(0,2)+"-"+data.substring(2,4)+"-"+data.substring(4,6); //拼接日期 + String strTime=data.substring(6,8)+":"+data.substring(8,10); //拼接时间 + } + } else if (checkStr.substring(2, 4).equalsIgnoreCase("05") || checkStr.substring(2, 4).equalsIgnoreCase("10")) { + log.info("时间: " + dateStr + ",时控ID: " + addr + ",操作成功! " ); +// System.out.println("时间: " + dateStr + ",时控ID: " + addr + ",操作成功! "); + } + } + }); +// } + } + + //时间控制器,长度26、22 + public String analysisTimeSetOrder4852(final String receiveData, final String registerAddr,final String brand,String buildingId) { + String result="fail"; + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + // 去掉空格 +// String receiveData = receiveData1.replace(" ", ""); + // 检验报文 + String checkStr = receiveData.substring(0, receiveData.length() - 4); + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); + + String sValue=null; + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { + log.info("时控报文检验成功: " + receiveData); +// System.out.println("时控报文检验成功: " + receiveData); + //地址 + String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2)); + log.info("时控号:" + addr); +// System.out.println("时控号: " + addr); + String data = ""; + if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 + int rec=receiveData.length(); + + if (rec==26) { //读时间设置值 + data=checkStr.substring(6,rec-4); + String curTimeBegin1=data.substring(0,2)+":"+data.substring(2,4); + String curTimeEnd1=data.substring(4,6)+":"+data.substring(6,8); + String curTimeBegin2=data.substring(8,10)+":"+data.substring(10,12); + String curTimeEnd2=data.substring(12,14)+":"+data.substring(14,16); + }else if (rec==22){ //读校对时间 + data=checkStr.substring(8,rec-4); + String strDate="20"+data.substring(0,2)+"-"+data.substring(2,4)+"-"+data.substring(4,6); //拼接日期 + String strTime=data.substring(6,8)+":"+data.substring(8,10); //拼接时间 + } + result=data; + } else if (checkStr.substring(2, 4).equalsIgnoreCase("05") || checkStr.substring(2, 4).equalsIgnoreCase("10")) { + log.info("时间:" + dateStr + ",时控ID:" + addr + ",操作成功! " ); +// System.out.println("时间: " + dateStr + ",时控ID: " + addr + ",操作成功! "); + result="success"; + } + } + return result; + } + + public static int dValue(String lastDate) throws ParseException { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date lastTime = format.parse(lastDate); + long min = lastTime.getTime(); + Calendar calendar = Calendar.getInstance(); + long min1 = calendar.getTimeInMillis(); + long subtract = min1 - min; +// System.out.println("相减值:" + subtract/(1000*60)); + return (int) subtract / (1000 * 60); + } + + // 判断是否存在寄存器地址 + public Boolean queryRegisterAddr(List stringList, String registerAddr) { + boolean flag = false; + for (int i = 0; i < stringList.size(); i++) { + if (stringList.get(i).equalsIgnoreCase(registerAddr)) { + flag = true; + break; + } + } + return flag; + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/CRC16.java b/user-service/src/main/java/com/mh/user/utils/CRC16.java new file mode 100644 index 0000000..9949035 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/CRC16.java @@ -0,0 +1,253 @@ +package com.mh.user.utils; + +/** + * CRC16_CCITT:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结果与0x0000异或 + * CRC16_CCITT_FALSE:多项式x16+x12+x5+1(0x1021),初始值0xFFFF,低位在后,高位在前,结果与0x0000异或 + * CRC16_XMODEM:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在后,高位在前,结果与0x0000异或 + * CRC16_X25:多项式x16+x12+x5+1(0x1021),初始值0xffff,低位在前,高位在后,结果与0xFFFF异或 + * CRC16_MODBUS:多项式x16+x15+x2+1(0x8005),初始值0xFFFF,低位在前,高位在后,结果与0x0000异或 + * CRC16_IBM:多项式x16+x15+x2+1(0x8005),初始值0x0000,低位在前,高位在后,结果与0x0000异或 + * CRC16_MAXIM:多项式x16+x15+x2+1(0x8005),初始值0x0000,低位在前,高位在后,结果与0xFFFF异或 + * CRC16_USB:多项式x16+x15+x2+1(0x8005),初始值0xFFFF,低位在前,高位在后,结果与0xFFFF异或 + * CRC16_DNP:多项式x16+x13+x12+x11+x10+x8+x6+x5+x2+1(0x3D65),初始值0x0000,低位在前,高位在后,结果与0xFFFF异或 + *

+ * (1)、预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器; + * (2)、把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器,高八位数据不变; + * (3)、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位; + * (4)、如果移出位为0:重复第3步(再次右移一位);如果移出位为1,CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或; + * (5)、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理; + * (6)、重复步骤2到步骤5,进行通讯信息帧下一个字节的处理; + * (7)、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换; + * (8)、最后得到的CRC寄存器内容即为:CRC码。 + *

+ * 以上计算步骤中的多项式0xA001是0x8005按位颠倒后的结果。 + * 0x8408是0x1021按位颠倒后的结果。 + * 在线校验工具 + * http://www.ip33.com/crc.html + * https://blog.csdn.net/htmlxx/article/details/17369105 + *

+ * Author:Water + * Time:2018/11/19 0019 15:03 + */ +public class CRC16 { + + /** + * CRC16_CCITT:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结果与0x0000异或 + * 0x8408是0x1021按位颠倒后的结果。 + * + * @param buffer + * @return + */ + public static int CRC16_CCITT(byte[] buffer) { + int wCRCin = 0x0000; + int wCPoly = 0x8408; + for (byte b : buffer) { + wCRCin ^= ((int) b & 0x00ff); + for (int j = 0; j < 8; j++) { + if ((wCRCin & 0x0001) != 0) { + wCRCin >>= 1; + wCRCin ^= wCPoly; + } else { + wCRCin >>= 1; + } + } + } +// wCRCin=(wCRCin<<8)|(wCRCin>>8); +// wCRCin &= 0xffff; + return wCRCin ^= 0x0000; + + } + + /** + * CRC-CCITT (0xFFFF) + * CRC16_CCITT_FALSE:多项式x16+x12+x5+1(0x1021),初始值0xFFFF,低位在后,高位在前,结果与0x0000异或 + * + * @param buffer + * @return + */ + public static int CRC16_CCITT_FALSE(byte[] buffer) { + int wCRCin = 0xffff; + int wCPoly = 0x1021; + for (byte b : buffer) { + for (int i = 0; i < 8; i++) { + boolean bit = ((b >> (7 - i) & 1) == 1); + boolean c15 = ((wCRCin >> 15 & 1) == 1); + wCRCin <<= 1; + if (c15 ^ bit) + wCRCin ^= wCPoly; + } + } + wCRCin &= 0xffff; + return wCRCin ^= 0x0000; + } + + /** + * CRC-CCITT (XModem) + * CRC16_XMODEM:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在后,高位在前,结果与0x0000异或 + * + * @param buffer + * @return + */ + public static int CRC16_XMODEM(byte[] buffer) { + int wCRCin = 0x0000; // initial value 65535 + int wCPoly = 0x1021; // 0001 0000 0010 0001 (0, 5, 12) + for (byte b : buffer) { + for (int i = 0; i < 8; i++) { + boolean bit = ((b >> (7 - i) & 1) == 1); + boolean c15 = ((wCRCin >> 15 & 1) == 1); + wCRCin <<= 1; + if (c15 ^ bit) + wCRCin ^= wCPoly; + } + } + wCRCin &= 0xffff; + return wCRCin ^= 0x0000; + } + + + /** + * CRC16_X25:多项式x16+x12+x5+1(0x1021),初始值0xffff,低位在前,高位在后,结果与0xFFFF异或 + * 0x8408是0x1021按位颠倒后的结果。 + * + * @param buffer + * @return + */ + public static int CRC16_X25(byte[] buffer) { + int wCRCin = 0xffff; + int wCPoly = 0x8408; + for (byte b : buffer) { + wCRCin ^= ((int) b & 0x00ff); + for (int j = 0; j < 8; j++) { + if ((wCRCin & 0x0001) != 0) { + wCRCin >>= 1; + wCRCin ^= wCPoly; + } else { + wCRCin >>= 1; + } + } + } + return wCRCin ^= 0xffff; + } + + /** + * CRC-16 (Modbus) + * CRC16_MODBUS:多项式x16+x15+x2+1(0x8005),初始值0xFFFF,低位在前,高位在后,结果与0x0000异或 + * 0xA001是0x8005按位颠倒后的结果 + * + * @param buffer + * @return + */ + public static int CRC16_MODBUS(byte[] buffer) { + int wCRCin = 0xffff; + int POLYNOMIAL = 0xa001; + for (byte b : buffer) { + wCRCin ^= ((int) b & 0x00ff); + for (int j = 0; j < 8; j++) { + if ((wCRCin & 0x0001) != 0) { + wCRCin >>= 1; + wCRCin ^= POLYNOMIAL; + } else { + wCRCin >>= 1; + } + } + } + return wCRCin ^= 0x0000; + } + + /** + * CRC-16 + * CRC16_IBM:多项式x16+x15+x2+1(0x8005),初始值0x0000,低位在前,高位在后,结果与0x0000异或 + * 0xA001是0x8005按位颠倒后的结果 + * + * @param buffer + * @return + */ + public static int CRC16_IBM(byte[] buffer) { + int wCRCin = 0x0000; + int wCPoly = 0xa001; + for (byte b : buffer) { + wCRCin ^= ((int) b & 0x00ff); + for (int j = 0; j < 8; j++) { + if ((wCRCin & 0x0001) != 0) { + wCRCin >>= 1; + wCRCin ^= wCPoly; + } else { + wCRCin >>= 1; + } + } + } + return wCRCin ^= 0x0000; + } + + /** + * CRC16_MAXIM:多项式x16+x15+x2+1(0x8005),初始值0x0000,低位在前,高位在后,结果与0xFFFF异或 + * 0xA001是0x8005按位颠倒后的结果 + * + * @param buffer + * @return + */ + public static int CRC16_MAXIM(byte[] buffer) { + int wCRCin = 0x0000; + int wCPoly = 0xa001; + for (byte b : buffer) { + wCRCin ^= ((int) b & 0x00ff); + for (int j = 0; j < 8; j++) { + if ((wCRCin & 0x0001) != 0) { + wCRCin >>= 1; + wCRCin ^= wCPoly; + } else { + wCRCin >>= 1; + } + } + } + return wCRCin ^= 0xffff; + } + + /** + * CRC16_USB:多项式x16+x15+x2+1(0x8005),初始值0xFFFF,低位在前,高位在后,结果与0xFFFF异或 + * 0xA001是0x8005按位颠倒后的结果 + * + * @param buffer + * @return + */ + public static int CRC16_USB(byte[] buffer) { + int wCRCin = 0xFFFF; + int wCPoly = 0xa001; + for (byte b : buffer) { + wCRCin ^= ((int) b & 0x00ff); + for (int j = 0; j < 8; j++) { + if ((wCRCin & 0x0001) != 0) { + wCRCin >>= 1; + wCRCin ^= wCPoly; + } else { + wCRCin >>= 1; + } + } + } + return wCRCin ^= 0xffff; + } + + /** + * CRC16_DNP:多项式x16+x13+x12+x11+x10+x8+x6+x5+x2+1(0x3D65),初始值0x0000,低位在前,高位在后,结果与0xFFFF异或 + * 0xA6BC是0x3D65按位颠倒后的结果 + * + * @param buffer + * @return + */ + public static int CRC16_DNP(byte[] buffer) { + int wCRCin = 0x0000; + int wCPoly = 0xA6BC; + for (byte b : buffer) { + wCRCin ^= ((int) b & 0x00ff); + for (int j = 0; j < 8; j++) { + if ((wCRCin & 0x0001) != 0) { + wCRCin >>= 1; + wCRCin ^= wCPoly; + } else { + wCRCin >>= 1; + } + } + } + return wCRCin ^= 0xffff; + } +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/utils/DateUtil.java b/user-service/src/main/java/com/mh/user/utils/DateUtil.java new file mode 100644 index 0000000..41ef900 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/DateUtil.java @@ -0,0 +1,311 @@ +package com.mh.user.utils; + +import java.text.ParseException; +import java.text.ParsePosition; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-12-16 + * @throws : + */ +public class DateUtil { + /** + * 通过时间秒毫秒数判断两个时间的间隔 + * + * @param form 开始时间 + * @param to 结束时间 + * @return 相差天数 + */ + public static int differentDays(Date form, Date to) { + return (int) ((to.getTime() - form.getTime()) / (1000 * 3600 * 24)); + } + + /** + * 通过时间秒毫秒数判断两个时间的间隔 + * + * @param startDate 开始时间 + * @param endDate 结束时间 + * @return 相差小时数 + */ + public static int differentHours(String startDate, String endDate) { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + ParsePosition pos = new ParsePosition(0); + Date to = sdf1.parse(startDate,pos); + Date form = sdf1.parse(endDate,pos); + return (int) ((to.getTime() - form.getTime()) / (1000 * 3600)); + } + + /** + * 通过时间秒毫秒数判断两个时间的间隔 + * + * @param startDate 开始时间 + * @param endDate 结束时间 + * @return 相差分钟数 + */ + public static int differentMinute(String startDate, String endDate) { + startDate = startDate.substring(0,15) + "0:00"; + endDate = endDate.substring(0,15) + "0:00"; + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + ParsePosition pos = new ParsePosition(0); + Date start = sdf1.parse(startDate,pos); + ParsePosition pos1 = new ParsePosition(0); + Date end = sdf1.parse(endDate,pos1); + + int dValue = (int) ((end.getTime() - start.getTime()) / (1000 * 60)); + System.out.println("时间相差------" + dValue + " 分钟"); + return dValue; + } + + // 格式化时间为"yyyy-MM-dd HH:00:00" + public static String formatDateStr(String dateStr) { + // 判断是15的倍数 + String substring = dateStr.substring(14, 16); + int i = (Integer.parseInt(substring) / 15); + dateStr = dateStr.substring(0,14) + ExchangeStringUtil.addZeroForNum(String.valueOf(i*15),2) + ":00"; + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = null; + try { + date = simpleDateFormat.parse(dateStr); + } catch (ParseException e) { + e.printStackTrace(); + } + return simpleDateFormat.format(date); + } + + // 格式化时间为"yyyy-MM-dd HH:m0:00" + public static String changeDateStr(String dateStr) { + dateStr = dateStr.substring(0,15) + "0:00"; + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = null; + try { + date = simpleDateFormat.parse(dateStr); + } catch (ParseException e) { + e.printStackTrace(); + } + return simpleDateFormat.format(date); + } + + /** + * 判断两个时间相差多少个月 + * + * @param form 开始时间 + * @param to 结束时间 + * @return 相差月数 + */ + public static int differentMonth(Date form, Date to) { + Calendar bef = Calendar.getInstance(); + Calendar aft = Calendar.getInstance(); + bef.setTime(form); + aft.setTime(to); + int result = aft.get(Calendar.MONTH) - bef.get(Calendar.MONTH); + int month = (aft.get(Calendar.YEAR) - bef.get(Calendar.YEAR)) * 12; + return Math.abs(month + result); + } + + /** + * 把日期格式化为字符串 + * + * @param date 日期 + * @param format 格式 + * @return 返回格式化之后的字符串 + */ + public static String dateToString(Date date, String format) { + SimpleDateFormat dateFormat = new SimpleDateFormat(format); + return dateFormat.format(date); + } + + /** + * 把日期格式化为字符串 + * + * @param date 日期 + * @param format 格式 + * @return 返回格式化之后的字符串 + */ + public static Date stringToDate(String date, String format) { + SimpleDateFormat dateFormat = new SimpleDateFormat(format); + try { + return dateFormat.parse(date); + } catch (ParseException e) { + return null; + } + } + + /** + * 通过传入的日期加指定的天数 + * + * @param date 日期 + * @param day 天数 + * @return 相加后的天数 + */ + public static Date getNextDay(Date date, int day) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.DAY_OF_YEAR, day); + return calendar.getTime(); + } + + /** + * 通过传入的日期加指定的分钟数 + * + * @param date 日期 + * @param minute 天数 + * @return 相加后的天数 + */ + public static Date getNextMinute(Date date, int minute) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.MINUTE, minute); + return calendar.getTime(); + } + + /** + * 通过传入的日期加指定的天数 + * + * @param date 日期 + * @param day 天数 + * @return 相加后的天数 + */ + public static String getNextDay(String date, int day, String format) { + return dateToString(getNextDay(stringToDate(date, format), day), format); + } + + /** + * 通过传入的日期加指定的年数 + * + * @param date 日期 + * @param year 年数 + * @return 计算后的日期 + */ + public static Date getNextYear(Date date, int year) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.YEAR, year); + return calendar.getTime(); + } + + /** + * 通过传入的日期加指定的月数 + * + * @param date 日期 + * @param month 月数 + * @return 计算后的日期 + */ + public static Date getNextMonth(Date date, int month) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.MONTH, month); + return calendar.getTime(); + } + + + /** + * 获取当前的时间 + * + * @return 返回当前的时间 + */ + public static Date getNowDate() { + return new Date(); + } + + /** + * 获得某天23:59:59点时间 + * + * @return + */ + public static Date getTimesnight(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.MILLISECOND, 0); + return cal.getTime(); + } + + /** + * 获得某天0点时间 + * + * @return + */ + public static Date getTimesmorning(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.MILLISECOND, 0); + return cal.getTime(); + } + + /** + * @param inputJudgeDate 要判断是否在当天24h内的时间 + * @return boolean + * @Description 是否为当天24h内 + * @author guo + */ + public static boolean isToday(Date inputJudgeDate) { + boolean flag = false; + //获取当前系统时间 + long longDate = System.currentTimeMillis(); + Date nowDate = new Date(longDate); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String format = dateFormat.format(nowDate); + String subDate = format.substring(0, 10); + //定义每天的24h时间范围 + String beginTime = subDate + " 00:00:00"; + String endTime = subDate + " 23:59:59"; + Date paseBeginTime = null; + Date paseEndTime = null; + try { + paseBeginTime = dateFormat.parse(beginTime); + paseEndTime = dateFormat.parse(endTime); + + } catch (ParseException e) { + e.printStackTrace(); + } + if (inputJudgeDate.after(paseBeginTime) && inputJudgeDate.before(paseEndTime)) { + flag = true; + } + return flag; + } + + /** + * 把日期格式化为字符串 + * + * @param date 日期 + * @return 返回格式化之后的字符串 + */ + public static Date stringToDateFormat(String date) { + String format = "yyyy-MM-dd HH:mm:ss"; + SimpleDateFormat dateFormat = new SimpleDateFormat(format); + try { + return dateFormat.parse(date); + } catch (ParseException e) { + return null; + } + } + + /** + * 时间戳转date + * + * @return + */ + public static Date timeToDate(Long time) { + //时间戳转化为Sting或Date + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String d = format.format(time); + Date date = null; + try { + date = format.parse(d); + return date; + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/Double2Serializer.java b/user-service/src/main/java/com/mh/user/utils/Double2Serializer.java new file mode 100644 index 0000000..2f7ee74 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/Double2Serializer.java @@ -0,0 +1,39 @@ +package com.mh.user.utils; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import java.io.IOException; +import java.text.DecimalFormat; + +/** + * 小数保留2位返回给前端序列化器 + * + * @author: nxr + * date: 2023-03-30 + */ +public class Double2Serializer extends JsonSerializer { + + private DecimalFormat df = new DecimalFormat("0.0000"); + + /** + * 小数保留2位返回给前端序列化器 + * @param data + * @param jsonGenerator + * @param serializerProvider + * @throws IOException + */ + @Override + public void serialize(Double data, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) + throws IOException { + if (data != null) { + if (data == 0) { + jsonGenerator.writeString("0"); + } else { + jsonGenerator.writeString(df.format(data)); + } + + } + } +} + diff --git a/user-service/src/main/java/com/mh/user/utils/ExchangeStringUtil.java b/user-service/src/main/java/com/mh/user/utils/ExchangeStringUtil.java new file mode 100644 index 0000000..da5d999 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/ExchangeStringUtil.java @@ -0,0 +1,1198 @@ +package com.mh.user.utils; + +import com.mh.common.utils.StringUtils; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import java.io.*; +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @Auther: LJF + * @Date: 2020-02-26 15:11 + * @Description: + */ +public class ExchangeStringUtil { + +// public static void main(String args[]){ +//// byte[] result = hexStrToBinaryStr("686868"); +//// for (byte a : +//// result) { +//// System.out.println(a); +//// } +//// String str = "/192.168.1.252:30000"; +//// String tempStr = str.replace("30000","40000"); +//// String tempStr = str.substring(str.indexOf("/") + 1, str.lastIndexOf(":")); +// Double tempStr=parseHex4("FD00"); +// System.out.println(tempStr); +// +// } + + //十六进制转正负数十进制 + public static double parseHex4(String num) { + if (num.length() != 4) { + throw new NumberFormatException("Wrong length: " + num.length() + ", must be 4."); + } + int ret = Integer.parseInt(num, 16); + ret = ((ret & 0x8000) > 0) ? (ret - 0x10000) : (ret); + return (double) ret; + } + //十六进制转十进制 + public static int covert(String content){ + int number=0; + String [] HighLetter = {"A","B","C","D","E","F"}; + Map map = new HashMap<>(); + for(int i = 0;i <= 9;i++){ + map.put(i+"",i); + } + for(int j= 10;j= 'A' && c <= 'F') + return 10 + c - 'A'; + else + return c - '0'; + } + + /** + * 获取到对应的buffer + * @param ctx + * @param sendStr + * @return + */ + public static ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { + // byte类型的数据 +// byte[] bytes = "这里是将要写往服务端的数据".getBytes(Charset.forName("utf-8")); +// String sendStr = "5803004900021914"; // 冷量计 + // 申请一个数据结构存储信息 + ByteBuf buffer = ctx.alloc().buffer(); + // 将信息放入数据结构中 + buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制 + return buffer; + } + + /** + * double转换为String :当为整数时,只显示整数,当小数时直接显示小数 + * @param num + * @return + */ + public static String doubleTrans1(double num){ + if(num % 1.0 == 0){ + return String.valueOf((long)num); + } + return String.valueOf(num); + } + + /** + * 获取String中的数值 + * @param result + * @return + */ + public static String getNumFromString(String result) { + String regEx="[^0-9]"; + Pattern p = Pattern.compile(regEx); + Matcher m = p.matcher(result); + return m.replaceAll("").trim(); + } + + /** + * 获取检验位值,update by ljf on 2020-06-02 + * @param result + * @return + */ + //返回指令+校验码 + public static String getCRCStr(String result) { + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(result); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = ExchangeStringUtil.addZeroForNum(checkWord,4); + checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); + result = result + checkWord; + return result; + } + + //只返回校验码 + public static String getStrCRC16(String result) { + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(result); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = ExchangeStringUtil.addZeroForNum(checkWord,4); + checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); + return checkWord; + } + + public static String getMidString(String str, String beginStr, String endStr) { + String regex = beginStr + "(.*)" + endStr; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(str); + String result = ""; + while (matcher.find()) { + result = matcher.group(1); + } + return result; + } + + /** + * 字符串不足补“0” + * @param str + * @param strLength + * @return + */ + public static String addZeroForNum(String str, int strLength) { + int strLen = str.length(); + if (strLen < strLength) { + while (strLen < strLength) { + StringBuffer sb = new StringBuffer(); + sb.append("0").append(str);// 左补0 + // sb.append(str).append("0");//右补0 + str = sb.toString(); + strLen = str.length(); + } + } + return str; + } + + /** + * ip地址转换成16进制long + * @param ipString + * @return + */ + public static String ipToHex(String ipString) { + String[] strings = ipString.split("\\."); + String result = ""; + for (int i = 0; i < strings.length; i++) { + result = result + ExchangeStringUtil.decToHex(strings[i]); + } + return result; + } + + /** + * ip地址转换成16进制long + * @param ipString + * @return + */ + public static Long ipToLong(String ipString) { + Long[] ip = new Long[4]; + int pos1= ipString.indexOf("."); + int pos2= ipString.indexOf(".",pos1+1); + int pos3= ipString.indexOf(".",pos2+1); + ip[0] = Long.parseLong(ipString.substring(0 , pos1)); + ip[1] = Long.parseLong(ipString.substring(pos1+1 , pos2)); + ip[2] = Long.parseLong(ipString.substring(pos2+1 , pos3)); + ip[3] = Long.parseLong(ipString.substring(pos3+1)); + return (ip[0]<<24)+(ip[1]<<16)+(ip[2]<<8)+ip[3]; + } + + public static String splitData(String str, String strStart, String strEnd) { + String tempStr; + tempStr = str.substring(str.indexOf(strStart) + 1, str.lastIndexOf(strEnd)); + return tempStr; + } + + public static String endData(String str, String strStart) { + String tempStr; + String str1=str.substring(0, str.indexOf(strStart)); + tempStr=str.substring(str1.length()+1); + return tempStr; + } + + // 转换位置 + public static String changePosition(String changeStr) { + StringBuffer s1 = new StringBuffer(); + for (int i = changeStr.length(); i >= 2; i = i - 2) { + s1 = s1.append(changeStr.substring(i - 2, i)); + } + return s1.toString(); + } + + // 加33 + public static String addThree(String data){ + String result = ""; + for (int i = 0; i < data.length() / 2; i++) { + BigInteger a = new BigInteger(data.substring(2*i,2*(i+1)),16); + BigInteger b = new BigInteger("33",16); + BigInteger c = a.add(b); + result = result + ExchangeStringUtil.decToHex(c.toString(10)); + } + + return result; + } + + // 减33 + public static String cutThree(String data){ + String result = ""; + for (int i = 0; i < data.length() / 2; i++) { + BigInteger a = new BigInteger(data.substring(2*i,2*(i+1)),16); + BigInteger b = new BigInteger("33",16); + BigInteger c = a.subtract(b); + result = result + ExchangeStringUtil.decToHex(c.toString(10)); + } + + return result; + } + + public static String makeChecksum(String data) { + if (data == null || data.equals("")) { + return ""; + } + int total = 0; + int len = data.length(); + int num = 0; + while (num < len) { + String s = data.substring(num, num + 2); + total += Integer.parseInt(s, 16); + num = num + 2; + } + /** + * 用256求余最大是255,即16进制的FF + */ + int mod = total % 256; + String hex = Integer.toHexString(mod); + len = hex.length(); + // 如果不够校验位的长度,补0,这里用的是两位校验 + if (len < 2) { + hex = "0" + hex; + } + return hex; + } + /** + * 十进制数据转换为十六进制字符串数 + * + * @param dec + * @return + */ + public static String decToHex(String dec) { + BigInteger data = new BigInteger(dec,10); + String result = data.toString(16); + if (result.length() < 2) { + result = "0" + result; + } + if ((result.length() % 2)!=0) { + result = "0" + result; + } + return result.toUpperCase(); + } + /** + * 十六进制数据转换为十进制字符串数 + * + * @param hex + * @return + */ + public static String hexToDec(String hex) { + BigInteger data = new BigInteger(hex,16); + return data.toString(10); + } + + public static String IntToHex(int n){ + char[] ch = new char[20]; + int nIndex = 0; + while ( true ){ + int m = n/16; + int k = n%16; + if ( k == 15 ) + ch[nIndex] = 'F'; + else if ( k == 14 ) + ch[nIndex] = 'E'; + else if ( k == 13 ) + ch[nIndex] = 'D'; + else if ( k == 12 ) + ch[nIndex] = 'C'; + else if ( k == 11 ) + ch[nIndex] = 'B'; + else if ( k == 10 ) + ch[nIndex] = 'A'; + else + ch[nIndex] = (char)('0' + k); + nIndex++; + if ( m == 0 ) + break; + n = m; + } + StringBuffer sb = new StringBuffer(); + sb.append(ch, 0, nIndex); + sb.reverse(); + String strHex = new String(""); + strHex += sb.toString(); + return strHex; + } + + // 字节数组转字符串 + public static String printHexString(byte[] b) { + + StringBuffer sbf = new StringBuffer(); + for (int i = 0; i < b.length; i++) { + String hex = Integer.toHexString(b[i] & 0xFF); + if (hex.length() == 1) { + hex = '0' + hex; + } + sbf.append(hex.toUpperCase() + " "); + } + return sbf.toString().trim(); + } + + public static String bytesToHexString(byte[] src){ + StringBuilder stringBuilder = new StringBuilder(""); + if (src == null || src.length <= 0) { + return null; + } + for (int i = 0; i < src.length; i++) { + int v = src[i] & 0xFF; + String hv = Integer.toHexString(v); + if (hv.length() < 2) { + stringBuilder.append(0); + } + stringBuilder.append(hv); + } + return stringBuilder.toString(); + } + + /** + * 字符串转化成为16进制字符串 + * @param s + * @return + */ + public static String strTo16(String s) { + String str = ""; + for (int i = 0; i < s.length(); i++) { + int ch = (int) s.charAt(i); + String s4 = Integer.toHexString(ch); + str = str + s4; + } + return str; + } + + /** + * 字符串转换成为16进制(无需Unicode编码) + * @param str + * @return + */ + public static String str2HexStr(String str) { + char[] chars = "0123456789ABCDEF".toCharArray(); + StringBuilder sb = new StringBuilder(""); + byte[] bs = str.getBytes(); + int bit; + for (int i = 0; i < bs.length; i++) { + bit = (bs[i] & 0x0f0) >> 4; + sb.append(chars[bit]); + bit = bs[i] & 0x0f; + sb.append(chars[bit]); + // sb.append(' '); + } + return sb.toString().trim(); + } + + /** + * 16进制转换成为string类型字符串 + * @param s + * @return + */ + public static String hexStringToString(String s) { + if (s == null || s.equals("")) { + return null; + } + s = s.replace(" ", ""); + byte[] baKeyword = new byte[s.length() / 2]; + for (int i = 0; i < baKeyword.length; i++) { + try { + baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); + } catch (Exception e) { + e.printStackTrace(); + } + } + try { + s = new String(baKeyword, "UTF-8"); + new String(); + } catch (Exception e1) { + e1.printStackTrace(); + } + return s; + } + + /** + * 字节转十六进制 + * @param b 需要进行转换的byte字节 + * @return 转换后的Hex字符串 + */ + public static String byteToHex(byte b){ + String hex = Integer.toHexString(b & 0xFF); + if(hex.length() < 2){ + hex = "0" + hex; + } + return hex; + } + + /** + * hex字符串转byte数组 + * @param inHex 待转换的Hex字符串 + * @return 转换后的byte数组结果 + */ + public static byte[] hexToByteArray(String inHex){ + int hexlen = inHex.length(); + byte[] result; + if (hexlen % 2 == 1){ + //奇数 + hexlen++; + result = new byte[(hexlen/2)]; + inHex="0"+inHex; + }else { + //偶数 + result = new byte[(hexlen/2)]; + } + int j=0; + for (int i = 0; i < hexlen; i+=2){ + result[j]=(byte)Integer.parseInt(inHex.substring(i,i+2),16); + j++; + } + return result; + } + + /** + * 将十六进制的字符串转换成字节数组 + * + * @param hexString + * @return + */ + public static byte[] hexStrToBinaryStr(String hexString) { + hexString = hexString.replaceAll(" ", ""); + int len = hexString.length(); + int index = 0; + byte[] bytes = new byte[len / 2]; + while (index < len) { + String sub = hexString.substring(index, index + 2); + bytes[index/2] = (byte) Integer.parseInt(sub,16); + index += 2; + } + return bytes; + } + + /** + * 获取当前日期 : "yyyy-MM-dd HH:mm:ss" + * + * @return "yyyy-MM-dd HH:mm:ss"字符串 + */ + public static String formatDateStr_ss() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + } + + /** + * 字符串是否为空 + * 如果这个字符串为null或者trim后为空字符串则返回true,否则返回false。 + * @param str + * @return + */ + public static boolean isEmpty(String str) { + if (str == null || "".equals(str.trim())) + return true; + return false; + } + + /** + * 用来把mac字符串转换为long + * @param strMac + * @return + */ + public static long macToLong(String strMac) { + byte[] mb = new BigInteger(strMac, 16).toByteArray(); + ByteBuffer mD = ByteBuffer.allocate(mb.length); + mD.put(mb); + long mac = 0; + // 如果长度等于8代表没有补0; + if (mD.array().length == 8) { + mac = mD.getLong(0); + } else if (mD.array().length == 9) { + mac = mD.getLong(1); + } + return mac; + } + + public static byte[] getBytes(Object obj) throws IOException { + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(bout); + out.writeObject(obj); + out.flush(); + byte[] bytes = bout.toByteArray(); + bout.close(); + out.close(); + return bytes; + } + + public static Object getObject(byte[] bytes) throws IOException, ClassNotFoundException { + ByteArrayInputStream bi = new ByteArrayInputStream(bytes); + ObjectInputStream oi = new ObjectInputStream(bi); + Object obj = oi.readObject(); + bi.close(); + oi.close(); + return obj; + } + + public static ByteBuffer getByteBuffer(Object obj) throws IOException { + byte[] bytes = ExchangeStringUtil.getBytes(obj); + ByteBuffer buff = ByteBuffer.wrap(bytes); + return buff; + } + + /** + * byte[] 转short 2字节 + * @param bytes + * @return + */ + public static short bytesToshort(byte[] bytes) { + return (short) ((bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00)); + + } + + /** + * byte 转Int + * @param b + * @return + */ + public static int byteToInt(byte b) { + return (b) & 0xff; + } + + public static int bytesToInt(byte[] bytes) { + int addr = bytes[0] & 0xFF; + addr |= ((bytes[1] << 8) & 0xFF00); + addr |= ((bytes[2] << 16) & 0xFF0000); + addr |= ((bytes[3] << 24) & 0xFF000000); + return addr; + } + + public static byte[] intToByte(int i) { + byte[] abyte0 = new byte[4]; + abyte0[0] = (byte) (0xff & i); + abyte0[1] = (byte) ((0xff00 & i) >> 8); + abyte0[2] = (byte) ((0xff0000 & i) >> 16); + abyte0[3] = (byte) ((0xff000000 & i) >> 24); + return abyte0; + } + + public static byte[] LongToByte(Long i) { + byte[] abyte0 = new byte[8]; + abyte0[0] = (byte) (0xff & i); + abyte0[1] = (byte) ((0xff00 & i) >> 8); + abyte0[2] = (byte) ((0xff0000 & i) >> 16); + abyte0[3] = (byte) ((0xff000000 & i) >> 24); + abyte0[4] = (byte) ((0xff00000000l & i) >> 32); + abyte0[5] = (byte) ((0xff0000000000l & i) >> 40); + abyte0[6] = (byte) ((0xff000000000000l & i) >> 48); + abyte0[7] = (byte) ((0xff00000000000000l & i) >> 56); + return abyte0; + } + + /** + * 函数名称:shortChange
+ * 功能描述:short 大端转小端 + * @param mshort + */ + public static short shortChange(Short mshort) { + mshort = (short) ((mshort >> 8 & 0xFF) | (mshort << 8 & 0xFF00)); + return mshort; + } + + /** + * 函数名称:intChange
+ * 功能描述:int 大端转小端 + * @param mint + */ + public static int intChange(int mint) { + mint = (int) (((mint) >> 24 & 0xFF) | ((mint) >> 8 & 0xFF00) | ((mint) << 8 & 0xFF0000) + | ((mint) << 24 & 0xFF000000)); + return mint; + } + + /** + * 函数名称:intChange
+ * 功能描述:LONG 大端转小端 + * @param mlong + */ + public static long longChange(long mlong) { + + mlong = (long) (((mlong) >> 56 & 0xFF) | ((mlong) >> 48 & 0xFF00) | ((mlong) >> 24 & 0xFF0000) + | ((mlong) >> 8 & 0xFF000000) | ((mlong) << 8 & 0xFF00000000l) | ((mlong) << 24 & 0xFF0000000000l) + | ((mlong) << 40 & 0xFF000000000000l) | ((mlong) << 56 & 0xFF00000000000000l)); + return mlong; + } + + /** + * 将byte转换为无符号的short类型 + * @param b 需要转换的字节数 + * @return 转换完成的short + */ + public static short byteToUshort(byte b) { + return (short) (b & 0x00ff); + } + + /** + * 将byte转换为无符号的int类型 + * @param b 需要转换的字节数 + * @return 转换完成的int + */ + public static int byteToUint(byte b) { + return b & 0x00ff; + } + + /** + * 将byte转换为无符号的long类型 + * @param b 需要转换的字节数 + * @return 转换完成的long + */ + public static long byteToUlong(byte b) { + return b & 0x00ff; + } + + /** + * 将short转换为无符号的int类型 + * @param s 需要转换的short + * @return 转换完成的int + */ + public static int shortToUint(short s) { + return s & 0x00ffff; + } + + /** + * 将short转换为无符号的long类型 + * + * @param s 需要转换的字节数 + * @return 转换完成的long + */ + public static long shortToUlong(short s) { + return s & 0x00ffff; + } + + /** + * 将int转换为无符号的long类型 + * + * @param i 需要转换的字节数 + * @return 转换完成的long + */ + public static long intToUlong(int i) { + return i & 0x00ffffffff; + } + + /** + * 将short转换成小端序的byte数组 + * + * @param s 需要转换的short + * @return 转换完成的byte数组 + */ + public static byte[] shortToLittleEndianByteArray(short s) { + return ByteBuffer.allocate(2).order(ByteOrder.LITTLE_ENDIAN).putShort(s).array(); + } + + /** + * 将int转换成小端序的byte数组 + * + * @param i 需要转换的int + * @return 转换完成的byte数组 + */ + public static byte[] intToLittleEndianByteArray(int i) { + return ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(i).array(); + } + + /** + * 将long转换成小端序的byte数组 + * + * @param l 需要转换的long + * @return 转换完成的byte数组 + */ + public static byte[] longToLittleEndianByteArray(long l) { + return ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN).putLong(l).array(); + } + + /** + * 将short转换成大端序的byte数组 + * + * @param s 需要转换的short + * @return 转换完成的byte数组 + */ + public static byte[] shortToBigEndianByteArray(short s) { + return ByteBuffer.allocate(2).order(ByteOrder.BIG_ENDIAN).putShort(s).array(); + } + + /** + * 将int转换成大端序的byte数组 + * + * @param i 需要转换的int + * @return 转换完成的byte数组 + */ + public static byte[] intToBigEndianByteArray(int i) { + return ByteBuffer.allocate(2).order(ByteOrder.BIG_ENDIAN).putInt(i).array(); + } + + /** + * 将long转换成大端序的byte数组 + * + * @param l 需要转换的long + * @return 转换完成的byte数组 + */ + public static byte[] longToBigEndianByteArray(long l) { + return ByteBuffer.allocate(2).order(ByteOrder.BIG_ENDIAN).putLong(l).array(); + } + + /** + * 将short转换为16进制字符串 + * + * @param s 需要转换的short + * @param isLittleEndian 是否是小端序(true为小端序false为大端序) + * @return 转换后的字符串 + */ + public static String shortToHexString(short s, boolean isLittleEndian) { + byte byteArray[] = null; + if (isLittleEndian) { + byteArray = shortToLittleEndianByteArray(s); + } else { + byteArray = shortToBigEndianByteArray(s); + } + return byteArrayToHexString(byteArray); + } + + /** + * 将int转换为16进制字符串 + * + * @param i 需要转换的int + * @param isLittleEndian 是否是小端序(true为小端序false为大端序) + * @return 转换后的字符串 + */ + public static String intToHexString(int i, boolean isLittleEndian) { + byte byteArray[] = null; + if (isLittleEndian) { + byteArray = intToLittleEndianByteArray(i); + } else { + byteArray = intToBigEndianByteArray(i); + } + return byteArrayToHexString(byteArray); + } + + /** + * 将long转换为16进制字符串 + * + * @param l 需要转换的long + * @param isLittleEndian 是否是小端序(true为小端序false为大端序) + * @return 转换后的字符串 + */ + public static String longToHexString(long l, boolean isLittleEndian) { + byte byteArray[] = null; + if (isLittleEndian) { + byteArray = longToLittleEndianByteArray(l); + } else { + byteArray = longToBigEndianByteArray(l); + } + return byteArrayToHexString(byteArray); + } + + /** + * 将字节数组转换成16进制字符串 + * @param array 需要转换的字符串 + * @param toPrint 是否为了打印输出,如果为true则会每4自己添加一个空格 + * @return 转换完成的字符串 + */ +// public static String byteArrayToHexString(byte[] array, boolean toPrint) { +// if (array == null) { +// return "null"; +// } +// StringBuffer sb = new StringBuffer(); +// +// for (int i = 0; i < array.length; i++) { +// sb.append(byteToHex(array[i])); +// if (toPrint && (i + 1) % 4 == 0) { +// sb.append(" "); +// } +// } +// return sb.toString(); +// } + + /** + * 字节数组转换成String,指定长度转换长度 + * @param arrBytes + * @param count 转换长度 + * @param blank 要不要空格(每个byte字节,最是否用一个“ ”隔开) + * @return "" | arrBytes换成的字符串(不存在null) + */ + public static String byteArray2HexString(byte[] arrBytes, int count, boolean blank) { + String ret = ""; + if (arrBytes == null || arrBytes.length < 1) + return ret; + if (count > arrBytes.length) + count = arrBytes.length; + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < count; i++) { + ret = Integer.toHexString(arrBytes[i] & 0xFF).toUpperCase(); + if (ret.length() == 1) + builder.append("0").append(ret); + else + builder.append(ret); + if (blank) + builder.append(" "); + } + return builder.toString(); + } + + public static String hexStr2Str(String hexStr) { + String string = "0123456789ABCDEF"; + char[] hexs = hexStr.toCharArray(); + byte[] bytes = new byte[hexStr.length() / 2]; + int n; + for (int i = 0; i < bytes.length; i++) { + n = string.indexOf(hexs[2 * i]) * 16; + n += string.indexOf(hexs[2 * i + 1]); + bytes[i] = (byte) (n & 0xff); + } + return new String(bytes); + } + + /** + * 将指定字符串src,以每两个字符分割转换为16进制形式 如:"2B44EFD9" --> byte[]{0x2B, 0x44, 0xEF, 0xD9} + * @param src String + * @return null | byte[] + */ + public static byte[] HexString2Bytes(String src) { + // String strTemp = ""; + if (src == null || "".equals(src)) + return null; + StringBuilder builder = new StringBuilder(); + for (char c : src.trim().toCharArray()) { + /* 去除中间的空格 */ + if (c != ' ') { + builder.append(c); + } + } + src = builder.toString(); + byte[] ret = new byte[src.length() / 2]; + byte[] tmp = src.getBytes(); + for (int i = 0; i < src.length() / 2; i++) { + ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]); + } + return ret; + } + + /** + * 将两个ASCII字符合成一个字节; 如:"EF"--> 0xEF + * @param src0 byte + * @param src1 byte + * @return byte + */ + public static byte uniteBytes(byte src0, byte src1) { + byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 })).byteValue(); + _b0 = (byte) (_b0 << 4); + byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 })).byteValue(); + byte ret = (byte) (_b0 ^ _b1); + return ret; + } + + /** + * 将字节数组转换成16进制字符串 + * @param array 需要转换的字符串(字节间没有分隔符) + * @return 转换完成的字符串 + */ + public static String byteArrayToHexString(byte[] array) { + return byteArray2HexString(array, Integer.MAX_VALUE, false); + } + + /** + * 将字节数组转换成long类型 + * @param bytes 字节数据 + * @return long类型 + */ + public static long byteArrayToLong(byte[] bytes) { + return ((((long) bytes[0] & 0xff) << 24) | (((long) bytes[1] & 0xff) << 16) | (((long) bytes[2] & 0xff) << 8) + | (((long) bytes[3] & 0xff) << 0)); + } + + /** + * 合并数组 + * @param firstArray 第一个数组 + * @param secondArray 第二个数组 + * @return 合并后的数组 + */ + public static byte[] concat(byte[] firstArray, byte[] secondArray) { + if (firstArray == null || secondArray == null) { + if (firstArray != null) + return firstArray; + if (secondArray != null) + return secondArray; + return null; + } + byte[] bytes = new byte[firstArray.length + secondArray.length]; + System.arraycopy(firstArray, 0, bytes, 0, firstArray.length); + System.arraycopy(secondArray, 0, bytes, firstArray.length, secondArray.length); + return bytes; + } + + //字符转二进制 + public static String toBinary(String str){ + char[] strChar=str.toCharArray(); + String result=""; + for(int i=0;i 0) { + flagValue = 1; + } else if (millisecond < 0) { + flagValue = -1; + } else if (millisecond == 0) { + flagValue = 0; + } + } catch (ParseException e) { + e.printStackTrace(); + } + return (flagValue); + } + + /** 表两个时间差 */ + public static int compareTwoTime(Date time1, Date time2) { + int flagValue = 0; + try { + long millisecond = time1.getTime() - time2.getTime(); + if (millisecond > 0) { + flagValue = 1; + } else if (millisecond < 0) { + flagValue = -1; + } else if (millisecond == 0) { + flagValue = 0; + } + } catch (Exception e) { + e.printStackTrace(); + } + return (flagValue); + } + + /** 比较两个时间相差天数 */ + public static float calculateTimeGapDay(String time1, String time2) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss"); + float day = 0; + Date date1 = null; + Date date2 = null; + try { + date1 = simpleDateFormat.parse(time1); + date2 = simpleDateFormat.parse(time2); + long millisecond = date2.getTime() - date1.getTime(); + day = millisecond / (24 * 60 * 60 * 1000); + } catch (ParseException e) { + e.printStackTrace(); + } + return (day); + } + + /** 比较两个时间相差天数 */ + public static float calculateTimeGapDay(Date time1, Date time2) { + float day = 0; + try { + Date date1, date2; + date1 = time1; + date2 = time2; + long millisecond = date2.getTime() - date1.getTime(); + day = millisecond / (24 * 60 * 60 * 1000); + } catch (Exception e) { + e.printStackTrace(); + } + return (day); + } + + /** 比较两个时间相差小时 */ + public static double calculateTimeGapHour(String time1, String time2) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss"); + double hour = 0; + try { + Date date1, date2; + date1 = simpleDateFormat.parse(time1); + date2 = simpleDateFormat.parse(time2); + double millisecond = date2.getTime() - date1.getTime(); + hour = millisecond / (60 * 60 * 1000); + } catch (ParseException e) { + e.printStackTrace(); + } + return hour; + } + + /** 比较两个时间相差小时 */ + public static double calculateTimeGapHour(Date date1, Date date2) { + double hour = 0; + double millisecond = date2.getTime() - date1.getTime(); + hour = millisecond / (60 * 60 * 1000); + return hour; + } + + /** 比较两个时间相差分钟 */ + public static double calculateTimeGapMinute(String time1, String time2) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + double minute = 0; + try { + Date date1, date2; + date1 = simpleDateFormat.parse(time1); + date2 = simpleDateFormat.parse(time2); + double millisecond = date2.getTime() - date1.getTime(); + minute = millisecond / (60 * 1000); + } catch (ParseException e) { + e.printStackTrace(); + } + return minute; + } + + /** 比较两个时间相差分钟 */ + public static double calculateTimeGapMinute(Date date1, Date date2) { + double minute = 0; + double millisecond = date2.getTime() - date1.getTime(); + minute = millisecond / (60 * 1000); + return minute; + } + + /** 比较两个时间相差秒 */ + public static double calculateTimeGapSecond(String time1, String time2) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss"); + double second = 0; + try { + Date date1, date2; + date1 = simpleDateFormat.parse(time1); + date2 = simpleDateFormat.parse(time2); + double millisecond = date2.getTime() - date1.getTime(); + second = millisecond / (1000); + } catch (ParseException e) { + e.printStackTrace(); + } + return second; + } + + /** 比较两个时间相差秒 */ + public static double calculateTimeGapSecond(Date date1, Date date2) { + double second = 0; + double millisecond = date2.getTime() - date1.getTime(); + second = millisecond / (1000); + return second; + } + + public static int compareCopyTime(String time1, String time2) { + int flagValue = 0; + double millisecond =calculateTimeGapMinute(time1,time2); + if (millisecond > 180) { + flagValue = 1; + } else if (millisecond < 180) { + flagValue = -1; + } else if (millisecond == 180) { + flagValue = 0; + } + return (flagValue); + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/FileUtils.java b/user-service/src/main/java/com/mh/user/utils/FileUtils.java new file mode 100644 index 0000000..15c5955 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/FileUtils.java @@ -0,0 +1,66 @@ +package com.mh.user.utils; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +/** + * @author ljf + * @title : + * @description : 创建文件 + * @updateTime 2020-09-17 + * @throws : + */ +public class FileUtils { + + public static void createFileAndWrite(String writeStr, int type) { + + String timeStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); + String fileName = "D:/meterLog"+timeStr+".txt"; + File file = new File(fileName); + try { + if (!file.exists()) { + file.createNewFile(); + } + } catch (IOException e) { + e.printStackTrace(); + } + Path path = Paths.get(fileName); + // 使用newBufferedWriter创建文件并写文件 + // 这里使用了try-with-resources方法来关闭流,不用手动关闭 +// try (BufferedWriter writer = +// Files.newBufferedWriter(path, StandardCharsets.UTF_8)) { +// writer.write("Hello World -创建文件!!"); +// } catch (IOException e) { +// e.printStackTrace(); +// } + + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))) + .append(" ") + .append(writeStr); + if (1==type) { + stringBuilder.append(" 接收到的报文\t\n"); + } else { + stringBuilder.append(" 发送的报文\t\n"); + } + //追加写模式 + try (BufferedWriter writer = + Files.newBufferedWriter(path, + StandardCharsets.UTF_8, + StandardOpenOption.APPEND)){ + writer.write(stringBuilder.toString()); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java b/user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java new file mode 100644 index 0000000..ceab370 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java @@ -0,0 +1,828 @@ +package com.mh.user.utils; + +import com.mh.user.entity.*; +import com.mh.user.model.OrderParamModel; +import com.mh.user.serialport.SerialPortThread; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.service.DeviceInstallService; +import com.mh.user.service.impl.DeviceDisplayServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static com.mh.user.utils.ExchangeStringUtil.doubleTrans1; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-04-22 + * @throws : + */ +@Slf4j +public class GetReadOrder485 { + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + DeviceDisplayServiceImpl.GatewayManageService gatewayManageService = context.getBean(DeviceDisplayServiceImpl.GatewayManageService.class); + DeviceInstallService deviceInstallService=context.getBean(DeviceInstallService.class); + DeviceCodeParamService deviceCodeParamService=context.getBean(DeviceCodeParamService.class); + + // 电表 + public static String createMeterOrder(OrderParamModel orderParamModel){ + String str=null; + String deviceAddr=orderParamModel.getDeviceAddr(); + if (deviceAddr!=null && deviceAddr.length()>0){ + try{ + //0代表前面补充0,12代表长度为12,d代表参数为正数型,基表通讯号 + str = String.format("%012d", Long.parseLong(deviceAddr)); + //转换位置 + str = ExchangeStringUtil.changePosition(str); + //拼接功能码 + str = "68" + str + "680102"; + String strData = "1090"; + //加33操作 + str = str + ExchangeStringUtil.addThree(strData); + //检验和 + String checkSum = ExchangeStringUtil.makeChecksum(str); + str = "FEFEFE" + str + checkSum + "16"; + }catch (Exception e){ + e.printStackTrace(); + } + } +// log.info("发送电表采集数据>>>>" + str); + return str.toUpperCase(); + } + + // 水表 + public static String createWtMeterOrder(OrderParamModel orderParamModel){ + String deviceAddr=orderParamModel.getDeviceAddr(); + String brand=orderParamModel.getBrand(); + String str=null; + if(deviceAddr!=null && deviceAddr.length()>0){ + try{ + if (brand==null || brand.equals("") || brand.equals("艾美柯")){ + // 0 代表前面补充0,14 代表长度为14,d 代表参数为正数型 + str = String.format("%014d", Long.parseLong(deviceAddr));//基表通讯号 + // 转换位置 + str = ExchangeStringUtil.changePosition(str); + // 拼接功能码 + str = "6810" + str + "0103901F00"; //水表读读数指令 + // 检验和 + String checkSum = ExchangeStringUtil.makeChecksum(str); + str = "FEFEFE" + str + checkSum + "16"; + }else if(brand.equals("脉冲")){ + str = ExchangeStringUtil.decToHex(deviceAddr); + str=ExchangeStringUtil.addZeroForNum(str,2); + str=str+"0302020002";//读表累计值 + String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验 + str = str + checkWord; + } + }catch (Exception e){ + e.printStackTrace(); + } + } +// log.info("生成水表采集指令>>>>" + str); + return str.toUpperCase(); + } + + // 热泵,参数:功能码、品牌、数据、通讯表号、寄存器地址 + public static String createPumpOrder(OrderParamModel orderParamModel){ + String deviceAddr=orderParamModel.getDeviceAddr(); + String brand=orderParamModel.getBrand(); + String funCode=orderParamModel.getFunCode(); + String registerAddr=orderParamModel.getRegisterAddr(); + String dataValue=orderParamModel.getDataValue(); + String str=null; + String param=""; + if(deviceAddr!=null && deviceAddr.length()>0) { + try{ + // 0代表前面补充0,2代表长度为2,d代表参数为正数型 + str = ExchangeStringUtil.decToHex(deviceAddr); + str=ExchangeStringUtil.addZeroForNum(str,2); + if (brand==null || brand.equals("") || brand.equals("美的")){ + if (funCode==null || funCode.equals("") || funCode.equals("03")){ + if (registerAddr==null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0641")){ // 运行状态 + str = str + "0306410001"; + param="运行状态"; + } else if (registerAddr.equalsIgnoreCase("0007")){ // 水温 + str = str + "0300070001"; + param="实际温度"; + } else if (registerAddr.equalsIgnoreCase("000B")){ // 故障状态,100*N+11 + str = str + "03000B0001"; + param="故障状态"; + } else if (registerAddr.equalsIgnoreCase("0642")){ // 读温度设定 + str = str + "0306420001"; + param="设定温度"; + } else if (registerAddr.equalsIgnoreCase("0656")){ //读时段1 + str = str + "0306560004"; + param="时段1"; + } else if (registerAddr.equalsIgnoreCase("065A")){ //读时段2 + str = str + "03065A0004"; + param="时段2"; + } + }else{//10 + if (registerAddr==null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0642")){//温度设定,写 + str = str + "100642000102"+ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(dataValue)),4); //写,待测试 + }else if(registerAddr.equalsIgnoreCase("0656")){//时段1 + if(dataValue.length()==8){ + String strData="00"+dataValue.substring(0,2)+"00"+dataValue.substring(2,4)+"00"+dataValue.substring(4,6)+"00"+dataValue.substring(6,8); + str = str + "100656000408"+strData; //写 + } + }else if(registerAddr.equalsIgnoreCase("065A")){//时段2 + if(dataValue.length()==8){ + String strData="00"+dataValue.substring(0,2)+"00"+dataValue.substring(2,4)+"00"+dataValue.substring(4,6)+"00"+dataValue.substring(6,8); + str = str + "10065A000408"+strData; //写 + } + } + } + }else if(brand.equals("美的2")){ + if (funCode==null || funCode.equals("") || funCode.equals("03")){ + if (registerAddr==null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0BBD")){ // 运行状态 + str = str + "030BBD0001"; + param="运行状态"; + } else if (registerAddr.equalsIgnoreCase("0064")){ // 水温 + str = str + "0300640001"; + param="实际温度"; + } else if (registerAddr.equalsIgnoreCase("0BBB")){ // 故障状态 + str = str + "030BBB0001"; + param="故障状态"; + } else if (registerAddr.equalsIgnoreCase("0003")){ // 读温度设定 + str = str + "0300030001"; + param="设定温度"; + } + }else{//06 + if (registerAddr==null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0003")){//温度设定,写 + str = str + "060003"+ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(dataValue)),4); //写,待测试 + }else if(registerAddr.equals("0000")) {//开关机 + if(dataValue.equals("0000")){ + str = str + "0600000000"; //关机 + }else{ + str = str + "0600000003"; //制热水,开机 + } + } + } + } + String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验 + str = str + checkWord; + }catch (Exception e){ + e.printStackTrace(); + } + } + log.info("热泵"+param+"指令>>>>" + str); + return str.toUpperCase(); + } + + // 水位开关(水位设定) + public static String createRelayOrder(OrderParamModel orderParamModel){ + String deviceAddr=orderParamModel.getDeviceAddr(); + String brand=orderParamModel.getBrand(); + String funCode=orderParamModel.getFunCode(); + String registerAddr=orderParamModel.getRegisterAddr(); + String dataValue=orderParamModel.getDataValue(); + String str=null; + if(deviceAddr!=null && deviceAddr.length()>0){ + try{ + if (brand==null || brand.equals("") || brand.equals("中凯")) + { + str = ExchangeStringUtil.decToHex(deviceAddr); + str=ExchangeStringUtil.addZeroForNum(str,2); + if (funCode==null || funCode.equals("") || funCode.equals("17")){ //读 + str ="33"+ str + "1700000000"; //旧版继电器 + }else if (funCode.equals("12")){//写 + if (dataValue!=null && !dataValue.equals("")){ + //0001(90%) 0002(80%) 0003(70%)... + if (dataValue.equals("100%")){ + registerAddr="1300000000"; //全开 + }else if (dataValue.equals("90%")){ + registerAddr="1200000001"; + }else if(dataValue.equals("80%")){ + registerAddr="1200000002"; + }else if(dataValue.equals("70%")){ + registerAddr="1200000003"; + }else if(dataValue.equals("60%")){ + registerAddr="1200000004"; + }else if(dataValue.equals("50%")){ + registerAddr="1200000005"; + }else if(dataValue.equals("40%")){ + registerAddr="1200000006"; + } + str ="33"+ str+registerAddr; //示例:33011200000001 + } + }else if (funCode.equals("13")) {//写 + str ="33"+ str + "1300000000"; //全开 + }else { + str ="33"+ str + "1400000000"; //全合 + } + // 检验和 + String checkSum = ExchangeStringUtil.makeChecksum(str); + str = str + checkSum ; + + } else if (brand.equals("远向")){ + str = ExchangeStringUtil.decToHex(deviceAddr); + str=ExchangeStringUtil.addZeroForNum(str,2); + if (funCode==null || funCode.equals("") || funCode.equals("03")){//读 + if (registerAddr.equalsIgnoreCase("0018")){ //读全部位置 + str = str + "0300180008"; + } else if (registerAddr.equalsIgnoreCase("0010")){ //读全部DI + str = str + "0300100008"; + } + }else if (funCode.equals("06")){ // 写 + if (dataValue!=null && !dataValue.equals("")){ + if (dataValue.equals("100%")){ + registerAddr="10001800081000000000000000000000000000000000"; //全开 + }else if (dataValue.equals("90%")){ + registerAddr="0600180001"; + }else if(dataValue.equals("80%")){ + registerAddr="0600190001"; + }else if(dataValue.equals("70%")){ + registerAddr="06001A0001"; + }else if(dataValue.equals("60%")){ + registerAddr="06001B0001"; + }else if(dataValue.equals("50%")){ + registerAddr="06001C0001"; + }else if(dataValue.equals("40%")){ + registerAddr="06001D0001"; + } + //0018(90%) 0019(80%) 001A(70%)... + str = str +registerAddr; //示例:010600180001 + } + }else {//写 + if (dataValue.equals("0000")){ + str = str + "10001800081000000000000000000000000000000000"; //全开 + }else{ + str = str + "10001800081000010001000100010001000100010001"; //全合 + } + } + String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验 + str = str + checkWord; + }else if (brand.equals("顶威")){ + str = String.format("%012d", Long.parseLong(deviceAddr)); + //转换位置 + str = ExchangeStringUtil.changePosition(str); //表号 + String strData=""; + if (funCode.equals("0407")){//写 + str ="68"+str+"680407"; + String mark="25C0"; //C025交换位置 + String strData1="00000000"; //命令带密码4字节,权限密码默认为00000000 + String strData2=""; + if (dataValue.equals("100%")){ + strData2=ExchangeStringUtil.parseByte2HexStr("00000000"); + }else if(dataValue.equals("90%")){ + strData2=ExchangeStringUtil.parseByte2HexStr("00000001"); + }else if(dataValue.equals("85%")){ + strData2=ExchangeStringUtil.parseByte2HexStr("00000011"); + }else if(dataValue.equals("80%")){ + strData2=ExchangeStringUtil.parseByte2HexStr("00000111"); + }else if(dataValue.equals("75%")){ + strData2=ExchangeStringUtil.parseByte2HexStr("00001111"); + }else if(dataValue.equals("70%")){ + strData2=ExchangeStringUtil.parseByte2HexStr("00011111"); + }else if(dataValue.equals("65%")){ + strData2=ExchangeStringUtil.parseByte2HexStr("00111111"); + }else if(dataValue.equals("60%")){ + strData2=ExchangeStringUtil.parseByte2HexStr("01111111"); + }else if(dataValue.equals("50%")){ + strData2=ExchangeStringUtil.parseByte2HexStr("11111111"); + }else if(dataValue.equals("自动")){ + strData2=ExchangeStringUtil.parseByte2HexStr("00100110"); + } + strData=mark+strData1+strData2; + }else if (funCode.equals("0102")){ //读 + str ="68"+str+"680102"; + strData="25C0"; //标志 + } + strData=ExchangeStringUtil.addThree(strData); //加33 + str=str+strData; + //检验和 + String checkSum = ExchangeStringUtil.makeChecksum(str);//校验 + str = "FEFEFE" + str + checkSum + "16"; + } + }catch (Exception e){ +// e.printStackTrace(); + if(registerAddr.equals("0010")){ + log.info("生成热泵状态指令出错!" + str); + }else{ + log.info("生成水位开关指令出错!" + str); + } + } + } +// if(registerAddr.equals("0010")){ +// log.info("生成热泵状态采集指令>>>>" + str); +// }else{ +// log.info("生成水位开关采集指令>>>>" + str); +// } + return str.toUpperCase(); + } + + // 热泵状态(8路开关) + public static String createPumpStateOrder(OrderParamModel orderParamModel){ + String deviceAddr=orderParamModel.getDeviceAddr(); + String brand=orderParamModel.getBrand(); + String funCode=orderParamModel.getFunCode(); + String registerAddr=orderParamModel.getRegisterAddr(); + String str=null; + if(deviceAddr!=null && deviceAddr.length()>0){ + try{ + if (brand==null || brand.equals("") || brand.equals("中凯")) + { + str = ExchangeStringUtil.decToHex(deviceAddr); + str=ExchangeStringUtil.addZeroForNum(str,2); + //if (funCode==null || funCode.equals("") || funCode.equals("17")){ //读 + str ="33"+ str + "1700000000"; //旧版继电器 + //} + // 检验和 + String checkSum = ExchangeStringUtil.makeChecksum(str); + str = str + checkSum ; + } else if (brand.equals("远向")){ + str = ExchangeStringUtil.decToHex(deviceAddr); + str=ExchangeStringUtil.addZeroForNum(str,2); + //if (funCode==null || funCode.equals("") || funCode.equals("03")){//读 + //if (registerAddr.equalsIgnoreCase("0018")){ //读全部DO + // str = str + "0300180008"; + // } else if (registerAddr.equalsIgnoreCase("0010")){ //读全部DI + str = str + "0300100008"; + //} + //} + String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验 + str = str + checkWord; + }else if (brand.equals("顶威")){ + str = String.format("%012d", Long.parseLong(deviceAddr)); + //转换位置 + str = ExchangeStringUtil.changePosition(str); //表号 + String strData=""; + // if (funCode.equals("0102")){ //读 + str ="68"+str+"680102"; + strData="25C0"; //标志 + // } + strData=ExchangeStringUtil.addThree(strData); //加33 + str=str+strData; + //检验和 + String checkSum = ExchangeStringUtil.makeChecksum(str);//校验 + str = "FEFEFE" + str + checkSum + "16"; + } + }catch (Exception e){ +// e.printStackTrace(); + log.info("生成热泵状态指令出错!" + str); + } + } + log.info("生成热泵状态采集指令>>>>" + str); + return str.toUpperCase(); + } + + //状态检测 + public static String createStateOrder(OrderParamModel orderParamModel){ + String deviceAddr=orderParamModel.getDeviceAddr(); + String brand=orderParamModel.getBrand(); + String str=null; + if(deviceAddr!=null && deviceAddr.length()>0){ + try{ + // 0代表前面补充0,12代表长度为12,d代表参数为正数型.12位通讯地址,以0补位 + str = String.format("%012d", Long.parseLong(deviceAddr)); + // 转换位置 + str = ExchangeStringUtil.changePosition(str); + // 拼接功能码 + str = "68" + str + "680102"; + String strData = "25C0"; + // 加33操作 + str = str + ExchangeStringUtil.addThree(strData); + // 检验和 + String checkSum = ExchangeStringUtil.makeChecksum(str); + str = "FEFEFE" + str + checkSum + "16"; + + }catch (Exception e){ +// e.printStackTrace(); + log.info("生成状态检测指令出错!" + str); + } + } +// log.info("生成状态检测采集指令>>>>" + str); + return str.toUpperCase(); + } + + // 压变 + public static String createPressureOrder(OrderParamModel orderParamModel){ + String deviceAddr=orderParamModel.getDeviceAddr(); + String brand=orderParamModel.getBrand(); + String str=null; + if(deviceAddr!=null && deviceAddr.length()>0){ + try{ + str = ExchangeStringUtil.decToHex(deviceAddr); //十进制转为十六进制 + str = ExchangeStringUtil.addZeroForNum(str, 2); //以0补位 + if (brand==null || brand.equals("")){ + str = str + "0300000002"; // 压力变送器(新的协议) + }else if (brand.equals("澳升")){ + str = str + "0300040001"; // 新款压力变送器 + }else if (brand.equals("汝翊")){ + str = str + "0300040001"; + } + String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验 + str = str + checkWord; + }catch (Exception e){ +// e.printStackTrace(); + log.info("生成压变指令出错!" + str); + } + } +// log.info("生成压变采集指令>>>>" + str); + return str.toUpperCase(); + } + + // 温控 + public static String createTempOrder(OrderParamModel orderParamModel){ + String deviceAddr=orderParamModel.getDeviceAddr(); + String registerAddr=orderParamModel.getRegisterAddr(); + String str=null; + if(deviceAddr!=null && deviceAddr.length()>0){ + try{ + str = ExchangeStringUtil.decToHex(deviceAddr); + str = ExchangeStringUtil.addZeroForNum(str, 2); //以0补位 +// if(registerAddr.equals("")){ +// str=str+"0300000002"; +// }else if(registerAddr.equals("")){ +// str=str+"0300000002"; +// } + str=str+"0300000002"; + String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验 + str = str + checkWord; + }catch (Exception e){ +// e.printStackTrace(); + log.info("生成温控指令出错!" + str); + } + } +// log.info("生成温控采集指令>>>>" + str); +// System.out.println("生成温控采集指令>>>>" + str); + return str.toUpperCase(); + } + + // 温度变送器 + public static String createMulTempOrder(OrderParamModel orderParamModel){ + String deviceAddr=orderParamModel.getDeviceAddr(); + String registerAddr=orderParamModel.getRegisterAddr(); + String str=null; + if(deviceAddr!=null && deviceAddr.length()>0){ + try{ + str = ExchangeStringUtil.decToHex(deviceAddr); + str = ExchangeStringUtil.addZeroForNum(str, 2); //以0补位 + str=str+"0300280008"; //读8路温度 + String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验 + str = str + checkWord; + }catch (Exception e){ +// e.printStackTrace(); + log.info("生成多路温度变送器指令出错!" + str); + } + } +// log.info("生成多路温度变送器采集指令>>>>" + str); + return str.toUpperCase(); + } + + //时控设置,registerAddr 0009(L1)、000D(L2)、0011(L3) 读:010300090004、写:01100009000408+dataValue + public static String createTimeSetOrder(OrderParamModel orderParamModel){ + String deviceAddr=orderParamModel.getDeviceAddr(); + String brand=orderParamModel.getBrand(); + String funCode=orderParamModel.getFunCode(); + String registerAddr=orderParamModel.getRegisterAddr(); + String dataValue=orderParamModel.getDataValue(); + String str=null; + if(deviceAddr!=null && deviceAddr.length()>0){ + str = ExchangeStringUtil.decToHex(deviceAddr); + str = ExchangeStringUtil.addZeroForNum(str, 2); //以0补位 + try{ +// if (!brand.equals("")){ //品牌 + if (!funCode.equals("") && !registerAddr.equals("")){ + registerAddr=ExchangeStringUtil.addZeroForNum(registerAddr,4); //寄存器地址 + funCode=ExchangeStringUtil.addZeroForNum(funCode,2); // 功能码 + + if (funCode.equals("03")){ //功能码,读 + str = str + "03"+registerAddr +"0004"; + }else if (funCode.equals("10")){//写 + if (!dataValue.equals("")){ + str = str + "10"+registerAddr +"000408"+dataValue; + } + } + } + String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验 + str = str + checkWord; +// } + }catch (Exception e){ +// e.printStackTrace(); + log.info("生成时控指令出错!" + str); + } + } +// log.info("发送时控采集数据>>>>" + str); + return str.toUpperCase(); + } + + // 冷量计 + public static String createCloudOrder(String IP,String port, String dataCom,String cloudNum, String cloudType){ + IP = ExchangeStringUtil.ipToHex(IP); + port = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(port),4); + dataCom = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(ExchangeStringUtil.getNumFromString(dataCom)),2); + String str1 = IP + port + dataCom; + // 0 代表前面补充0,2 代表长度为2,d 代表参数为正数型 + String str = ExchangeStringUtil.decToHex(cloudNum); + str = String.format("%02d", Long.parseLong(str)); + if (cloudType.equalsIgnoreCase("4")){ //温控设备,地址为十六进制 + str = str + "0300000002"; + } else if (cloudType.equalsIgnoreCase("31")){ //流量计冷冻水量 + str = str + "0300080002"; + } else if (cloudType.equalsIgnoreCase("32")){ // 流量计出水温度 + str = str + "0300490002"; + } else if (cloudType.equalsIgnoreCase("33")){ // 流量计回水温度 + str = str + "03004B0002"; + } else if (cloudType.equalsIgnoreCase("34")){ // 流量计冷量累积量 + str = str + "0300500002"; + } + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(str); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = ExchangeStringUtil.addZeroForNum(checkWord,4); + checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); + str = str + checkWord; + // 拼接字符 + str = str1 + str; + str = ExchangeStringUtil.getCRCStr(str); + return str.toUpperCase(); + } + + /** + * // 冷水机组 指令:IP+端口+COM口+数据+modeBus校验 + * @param chillersEntity + * @return + */ + public String createChillersOrder(ChillersEntity chillersEntity) { + String str = null; + try { + log.info(chillersEntity.toString()); + // 获取IP地址,转16进制 + String ip = chillersEntity.getIP(); + ip = ExchangeStringUtil.ipToHex(ip); + str = ip; + // 获取端口号,转16进制 + int port = chillersEntity.getPort(); + String portStr = ExchangeStringUtil.decToHex(String.valueOf(port)); + portStr = ExchangeStringUtil.addZeroForNum(portStr,4); + str += portStr; + // 获取COM口 + String com = ExchangeStringUtil.getNumFromString(chillersEntity.getDataCom()); + String dataCom = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(com),2); + str += dataCom; + // 获取冷水机组地址 + String chillerAddr = chillersEntity.getCollectionNum(); + chillerAddr = ExchangeStringUtil.decToHex(chillerAddr); + String str1 = ExchangeStringUtil.addZeroForNum(chillerAddr, 2); + // 获取功能码 + String funCode = chillersEntity.getFunCode(); + str1 = str1 + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(funCode),2); + // 寄存器地址 + String registerAddr = chillersEntity.getRegisterAddress(); + str1 = str1 + ExchangeStringUtil.addZeroForNum(registerAddr,4) + "0001"; + log.info(str1); + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(str1); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = ExchangeStringUtil.addZeroForNum(checkWord,4); + checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); + str1 = str1 + checkWord; + // 拼接新的采集报文 + str = str + str1; + str = ExchangeStringUtil.getCRCStr(str); + } catch (Exception e) { + e.printStackTrace(); + } + log.info("发送采集数据>>>>" + str); + return str.toUpperCase(); + } + + // DDC 设备指令生成 + // 服务端 IP(HEX) + 端口(HEX) + 设备地址号(HEX) + CRC16 校验 + public static String createDDCOrder(ChillersEntity chillersEntity) { + String result = ""; + // 把IP地址转为16进制 + String ip = ExchangeStringUtil.ipToHex(chillersEntity.getIP()); + // 端口号转为16进制 + String port = ExchangeStringUtil.decToHex(String.valueOf(chillersEntity.getPort())); + // DDC地址 + String ddcAddr = ExchangeStringUtil.decToHex(chillersEntity.getDdcAddr()); + // 拼接成采集报文 + result = ip + port + ddcAddr; + // 得出校验位后的值 + result = ExchangeStringUtil.getCRCStr(result); + return result; + } + + // 生成对设备操作指令参数 + public void createOrderParam(){ + + List deviceList1; + deviceCodeParamService.selectInsertDeviceCodeParam(); //查询插入设备采集参数,包括压变、温控、温度变送器、热泵状态 + deviceList1=deviceInstallService.selectDeviceParams();//查找多个采集参数的设备,包括热泵 + System.out.println(deviceList1); + + for (DeviceInstallEntity devices:deviceList1) { + List deviceCodeParamEntityList = new ArrayList<>(); + if (devices.getDeviceType().equals("热泵")){ + if (devices.getBrand().equals("美的")){ + + DeviceCodeParamEntity deviceCodeParamEntity3 = new DeviceCodeParamEntity(); + deviceCodeParamEntity3.setRegisterAddr("0007");//水温 + deviceCodeParamEntity3.setFunCode("03"); + deviceCodeParamEntity3.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity3.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity3.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity3.setBaudrate(devices.getBaudRate()); + deviceCodeParamEntity3.setBrand(devices.getBrand()); + deviceCodeParamEntity3.setDataCom(devices.getDataCom()); + deviceCodeParamEntity3.setBuildingId(devices.getBuildingId()); + deviceCodeParamEntity3.setParity(devices.getParity()); + deviceCodeParamEntityList.add(deviceCodeParamEntity3); + + }else if (devices.getBrand().equals("美的2")){ + + DeviceCodeParamEntity deviceCodeParamEntity3 = new DeviceCodeParamEntity(); + deviceCodeParamEntity3.setRegisterAddr("0064");//水温 + deviceCodeParamEntity3.setFunCode("03"); + deviceCodeParamEntity3.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity3.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity3.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity3.setBaudrate(devices.getBaudRate()); + deviceCodeParamEntity3.setBrand(devices.getBrand()); + deviceCodeParamEntity3.setDataCom(devices.getDataCom()); + deviceCodeParamEntity3.setBuildingId(devices.getBuildingId()); + deviceCodeParamEntity3.setParity(devices.getParity()); + deviceCodeParamEntityList.add(deviceCodeParamEntity3); + } + } + deviceCodeParamService.insertDeviceCodeParamList(deviceCodeParamEntityList); + } + } + + // 生成对设备操作指令参数 + public void createOrderParam2(){ + List deviceList1; + deviceCodeParamService.selectInsertDeviceCodeParam2(); //查询插入设备采集参数,包括水、电表、状态检测 + deviceList1=deviceInstallService.selectDeviceParams(); //查找多个采集参数的设备,包括热泵 + System.out.println(deviceList1); + + for (DeviceInstallEntity devices:deviceList1) { + List deviceCodeParamEntityList = new ArrayList<>(); + if (devices.getDeviceType().equals("热泵")) { + if (devices.getBrand().equals("美的")) { + DeviceCodeParamEntity deviceCodeParamEntity1 = new DeviceCodeParamEntity(); + deviceCodeParamEntity1.setRegisterAddr("0641"); //运行状态 + deviceCodeParamEntity1.setFunCode("03"); + deviceCodeParamEntity1.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity1.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity1.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity1.setBaudrate(devices.getBaudRate()); + deviceCodeParamEntity1.setBrand(devices.getBrand()); + deviceCodeParamEntity1.setDataCom(devices.getDataCom()); + deviceCodeParamEntity1.setBuildingId(devices.getBuildingId()); + deviceCodeParamEntity1.setParity(devices.getParity()); + deviceCodeParamEntityList.add(deviceCodeParamEntity1);//添加到列表 + } else if (devices.getBrand().equals("美的2")) { + DeviceCodeParamEntity deviceCodeParamEntity1 = new DeviceCodeParamEntity(); + deviceCodeParamEntity1.setRegisterAddr("0BBD"); //运行状态 + deviceCodeParamEntity1.setFunCode("03"); + deviceCodeParamEntity1.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity1.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity1.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity1.setBaudrate(devices.getBaudRate()); + deviceCodeParamEntity1.setBrand(devices.getBrand()); + deviceCodeParamEntity1.setDataCom(devices.getDataCom()); + deviceCodeParamEntity1.setBuildingId(devices.getBuildingId()); + deviceCodeParamEntity1.setParity(devices.getParity()); + deviceCodeParamEntityList.add(deviceCodeParamEntity1);//添加到列表 + } + } + deviceCodeParamService.insertDeviceCodeParamList2(deviceCodeParamEntityList); + } + } + + // 生成对设备操作指令参数 + public void createOrderParam3(){ + List deviceList1; +// deviceCodeParamService.selectInsertDeviceCodeParam3(); //查询插入设备采集参数-水位开关 + deviceList1=deviceInstallService.selectDeviceParams2(); //查找多个采集参数的设备,包括热泵、水位开关 + System.out.println(deviceList1); + + for (DeviceInstallEntity devices:deviceList1) { + List deviceCodeParamEntityList = new ArrayList<>(); + if (devices.getDeviceType().equals("热泵")){ + if (devices.getBrand().equals("美的")){ + DeviceCodeParamEntity deviceCodeParamEntity2 = new DeviceCodeParamEntity(); + deviceCodeParamEntity2.setRegisterAddr("0642");//设定温度 + deviceCodeParamEntity2.setFunCode("03"); + deviceCodeParamEntity2.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity2.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity2.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity2.setBaudrate(devices.getBaudRate()); + deviceCodeParamEntity2.setBrand(devices.getBrand()); + deviceCodeParamEntity2.setDataCom(devices.getDataCom()); + deviceCodeParamEntity2.setBuildingId(devices.getBuildingId()); + deviceCodeParamEntity2.setParity(devices.getParity()); + deviceCodeParamEntityList.add(deviceCodeParamEntity2); + + DeviceCodeParamEntity deviceCodeParamEntity4 = new DeviceCodeParamEntity(); + deviceCodeParamEntity4.setRegisterAddr("000B");//故障状态 + deviceCodeParamEntity4.setFunCode("03"); + deviceCodeParamEntity4.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity4.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity4.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity4.setBaudrate(devices.getBaudRate()); + deviceCodeParamEntity4.setBrand(devices.getBrand()); + deviceCodeParamEntity4.setDataCom(devices.getDataCom()); + deviceCodeParamEntity4.setBuildingId(devices.getBuildingId()); + deviceCodeParamEntity4.setParity(devices.getParity()); + deviceCodeParamEntityList.add(deviceCodeParamEntity4); + + }else if (devices.getBrand().equals("美的2")){ + + DeviceCodeParamEntity deviceCodeParamEntity2 = new DeviceCodeParamEntity(); + deviceCodeParamEntity2.setRegisterAddr("0003");//设定温度 + deviceCodeParamEntity2.setFunCode("03"); + deviceCodeParamEntity2.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity2.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity2.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity2.setBaudrate(devices.getBaudRate()); + deviceCodeParamEntity2.setBrand(devices.getBrand()); + deviceCodeParamEntity2.setDataCom(devices.getDataCom()); + deviceCodeParamEntity2.setBuildingId(devices.getBuildingId()); + deviceCodeParamEntity2.setParity(devices.getParity()); + deviceCodeParamEntityList.add(deviceCodeParamEntity2); + + DeviceCodeParamEntity deviceCodeParamEntity4 = new DeviceCodeParamEntity(); + deviceCodeParamEntity4.setRegisterAddr("0BBB");//故障状态 + deviceCodeParamEntity4.setFunCode("03"); + deviceCodeParamEntity4.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity4.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity4.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity4.setBaudrate(devices.getBaudRate()); + deviceCodeParamEntity4.setBrand(devices.getBrand()); + deviceCodeParamEntity4.setDataCom(devices.getDataCom()); + deviceCodeParamEntity4.setBuildingId(devices.getBuildingId()); + deviceCodeParamEntity4.setParity(devices.getParity()); + deviceCodeParamEntityList.add(deviceCodeParamEntity4); + } + } if (devices.getDeviceType().equals("水位开关")){ + if (devices.getBrand().equals("远向")){ + DeviceCodeParamEntity deviceCodeParamEntity2 = new DeviceCodeParamEntity(); + deviceCodeParamEntity2.setRegisterAddr("0018");//读水位设定 + deviceCodeParamEntity2.setFunCode("03"); + deviceCodeParamEntity2.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity2.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity2.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity2.setBaudrate(devices.getBaudRate()); + deviceCodeParamEntity2.setBrand(devices.getBrand()); + deviceCodeParamEntity2.setDataCom(devices.getDataCom()); + deviceCodeParamEntity2.setBuildingId(devices.getBuildingId()); + deviceCodeParamEntity2.setParity(devices.getParity()); + deviceCodeParamEntityList.add(deviceCodeParamEntity2); + + DeviceCodeParamEntity deviceCodeParamEntity4 = new DeviceCodeParamEntity(); + deviceCodeParamEntity4.setRegisterAddr("0010");//读热泵状态、上水用水状态 + deviceCodeParamEntity4.setFunCode("03"); + deviceCodeParamEntity4.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity4.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity4.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity4.setBaudrate(devices.getBaudRate()); + deviceCodeParamEntity4.setBrand(devices.getBrand()); + deviceCodeParamEntity4.setDataCom(devices.getDataCom()); + deviceCodeParamEntity4.setBuildingId(devices.getBuildingId()); + deviceCodeParamEntity4.setParity(devices.getParity()); + deviceCodeParamEntityList.add(deviceCodeParamEntity4); + }else if (devices.getBrand().equals("中凯")){ + DeviceCodeParamEntity deviceCodeParamEntity2 = new DeviceCodeParamEntity(); + deviceCodeParamEntity2.setRegisterAddr("0017");//读水位设定 + deviceCodeParamEntity2.setFunCode("03"); + deviceCodeParamEntity2.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity2.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity2.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity2.setBaudrate(devices.getBaudRate()); + deviceCodeParamEntity2.setBrand(devices.getBrand()); + deviceCodeParamEntity2.setDataCom(devices.getDataCom()); + deviceCodeParamEntity2.setBuildingId(devices.getBuildingId()); + deviceCodeParamEntity2.setParity(devices.getParity()); + deviceCodeParamEntityList.add(deviceCodeParamEntity2); + } else { //顶威 + DeviceCodeParamEntity deviceCodeParamEntity2 = new DeviceCodeParamEntity(); + deviceCodeParamEntity2.setRegisterAddr("0102");//读水位设定 + deviceCodeParamEntity2.setFunCode("0102"); + deviceCodeParamEntity2.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity2.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity2.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity2.setBaudrate(devices.getBaudRate()); + deviceCodeParamEntity2.setBrand(devices.getBrand()); + deviceCodeParamEntity2.setDataCom(devices.getDataCom()); + deviceCodeParamEntity2.setBuildingId(devices.getBuildingId()); + deviceCodeParamEntity2.setParity(devices.getParity()); + deviceCodeParamEntityList.add(deviceCodeParamEntity2); + } + } + deviceCodeParamService.insertDeviceCodeParamList3(deviceCodeParamEntityList); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/HttpUtils.java b/user-service/src/main/java/com/mh/user/utils/HttpUtils.java new file mode 100644 index 0000000..24b0076 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/HttpUtils.java @@ -0,0 +1,44 @@ +package com.mh.user.utils; + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.mh.common.http.HttpResult; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import com.alibaba.fastjson2.JSONObject; + +/** + * HTTP工具类 + * @author Louis + * @date Oct 29, 2018 + */ +public class HttpUtils { + + /** + * 获取HttpServletRequest对象 + * @return + */ + public static HttpServletRequest getHttpServletRequest() { + return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + } + + /** + * 输出信息到浏览器 + * @param response + * @param msg + * @throws IOException + */ + public static void print(HttpServletResponse response, int code, String msg) throws IOException { + response.setContentType("application/json; charset=utf-8"); + HttpResult result = HttpResult.error(code, msg); + String json = JSONObject.toJSONString(result); + response.getWriter().print(json); + response.getWriter().flush(); + response.getWriter().close(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/IPUtils.java b/user-service/src/main/java/com/mh/user/utils/IPUtils.java new file mode 100644 index 0000000..abb7e6f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/IPUtils.java @@ -0,0 +1,67 @@ +package com.mh.user.utils; + +import javax.servlet.http.HttpServletRequest; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +/** + * IP相关工具类 + */ +public class IPUtils { + private static Logger logger = LoggerFactory.getLogger(IPUtils.class); + + /** + * 获取IP地址 + * + * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址 + * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址 + */ + public static String getIpAddr(HttpServletRequest request) { + String ip = null; + try { + ip = request.getHeader("x-forwarded-for"); + if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); + } + if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + } catch (Exception e) { + logger.error("IPUtils ERROR ", e); + } + +// //使用代理,则获取第一个IP地址 +// if(StringUtils.isEmpty(ip) && ip.length() > 15) { +// if(ip.indexOf(",") > 0) { +// ip = ip.substring(0, ip.indexOf(",")); +// } +// } + + return ip; + } + + public static String getRemoteIp() { + HttpServletRequest request = null; + try { + request = + ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); + } catch (Exception e) { + System.out.println("Can not get current IP."); + } + return request.getRemoteAddr(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/JwtTokenUtils.java b/user-service/src/main/java/com/mh/user/utils/JwtTokenUtils.java new file mode 100644 index 0000000..c45dc1b --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/JwtTokenUtils.java @@ -0,0 +1,216 @@ +package com.mh.user.utils; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import com.mh.user.security.GrantedAuthorityImpl; +import com.mh.user.security.JwtAuthenticatioToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +/** + * JWT工具类 + * @author Louis + * @date Jan 14, 2019 + */ +public class JwtTokenUtils implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 用户名称 + */ + private static final String USERNAME = Claims.SUBJECT; + /** + * 创建时间 + */ + private static final String CREATED = "created"; + /** + * 权限列表 + */ + private static final String AUTHORITIES = "authorities"; + /** + * 密钥 + */ + private static final String SECRET = "abcdefgh"; + /** + * 有效期12小时 + */ + private static final long EXPIRE_TIME = 12 * 60 * 60 * 1000; + + /** + * 生成令牌 + * + * @param + * @return 令牌 + */ + public static String generateToken(Authentication authentication) { + Map claims = new HashMap<>(3); + claims.put(USERNAME, SecurityUtils.getUsername(authentication)); + claims.put(CREATED, new Date()); + claims.put(AUTHORITIES, authentication.getAuthorities()); + return generateToken(claims); + } + + /** + * 从数据声明生成令牌 + * + * @param claims 数据声明 + * @return 令牌 + */ + private static String generateToken(Map claims) { + Date expirationDate = new Date(System.currentTimeMillis() + EXPIRE_TIME); + return Jwts.builder().setClaims(claims).setExpiration(expirationDate).signWith(SignatureAlgorithm.HS256, SECRET).compact(); + } + + /** + * 从令牌中获取用户名 + * + * @param token 令牌 + * @return 用户名 + */ + public static String getUsernameFromToken(String token) { + String username; + try { + Claims claims = getClaimsFromToken(token); + username = claims.getSubject(); + } catch (Exception e) { + username = null; + } + return username; + } + + /** + * 根据请求令牌获取登录认证信息 + * @param + * @return 用户名 + */ + public static Authentication getAuthenticationeFromToken(HttpServletRequest request) { + Authentication authentication = null; + // 获取请求携带的令牌 + String token = JwtTokenUtils.getToken(request); + System.out.println("获取请求携带的令牌"+token); + if(token != null) { + // 请求令牌不能为空 + if(SecurityUtils.getAuthentication() == null) { + // 上下文中Authentication为空 + Claims claims = getClaimsFromToken(token); + if(claims == null) { + return null; + } + String username = claims.getSubject(); + if(username == null) { + return null; + } + if(isTokenExpired(token)) { + return null; + } + Object authors = claims.get(AUTHORITIES); + List authorities = new ArrayList(); + if (authors != null && authors instanceof List) { + for (Object object : (List) authors) { + authorities.add(new GrantedAuthorityImpl((String) ((Map) object).get("authority"))); + } + } + + authentication = new JwtAuthenticatioToken(username, null, authorities, token); + } else { + if(validateToken(token, SecurityUtils.getUsername())) { + // 如果上下文中Authentication非空,且请求令牌合法,直接返回当前登录认证信息 + authentication = SecurityUtils.getAuthentication(); + } + } + } + System.out.println("获取认证:"+authentication); + return authentication; + } + + /** + * 从令牌中获取数据声明 + * + * @param token 令牌 + * @return 数据声明 + */ + private static Claims getClaimsFromToken(String token) { + Claims claims; + try { + claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody(); + } catch (Exception e) { + claims = null; + } + return claims; + } + + /** + * 验证令牌 + * @param token + * @param username + * @return + */ + public static Boolean validateToken(String token, String username) { + String userName = getUsernameFromToken(token); + return (userName.equals(username) && !isTokenExpired(token)); + } + + /** + * 刷新令牌 + * @param token + * @return + */ + public static String refreshToken(String token) { + String refreshedToken; + try { + Claims claims = getClaimsFromToken(token); + claims.put(CREATED, new Date()); + refreshedToken = generateToken(claims); + } catch (Exception e) { + refreshedToken = null; + } + return refreshedToken; + } + + /** + * 判断令牌是否过期 + * + * @param token 令牌 + * @return 是否过期 + */ + public static Boolean isTokenExpired(String token) { + try { + Claims claims = getClaimsFromToken(token); + Date expiration = claims.getExpiration(); + return expiration.before(new Date()); + } catch (Exception e) { + return false; + } + } + + /** + * 获取请求token + * @param request + * @return + */ + public static String getToken(HttpServletRequest request) { + String token = request.getHeader("Authorization"); + String tokenHead = "Bearer "; + if(token == null) { + token = request.getHeader("token"); + } else if(token.contains(tokenHead)){ + token = token.substring(tokenHead.length()); + } + if("".equals(token)) { + token = null; + } + return token; + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/PasswordEncoder.java b/user-service/src/main/java/com/mh/user/utils/PasswordEncoder.java new file mode 100644 index 0000000..d23db50 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/PasswordEncoder.java @@ -0,0 +1,115 @@ +package com.mh.user.utils; + +import java.security.MessageDigest; + +/** + * 密码加密 + * @author Louis + * @date Jan 13, 2019 + */ +public class PasswordEncoder { + + private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", + "e", "f" }; + + private final static String MD5 = "MD5"; + private final static String SHA = "SHA"; + + private Object salt; + private String algorithm; + + public PasswordEncoder(Object salt) { + this(salt, MD5); + } + + public PasswordEncoder(Object salt, String algorithm) { + this.salt = salt; + this.algorithm = algorithm; + } + + /** + * 密码加密 + * @param rawPass + * @return + */ + public String encode(String rawPass) { + String result = null; + try { + MessageDigest md = MessageDigest.getInstance(algorithm); + // 加密后的字符串 + result = byteArrayToHexString(md.digest(mergePasswordAndSalt(rawPass).getBytes("utf-8"))); + } catch (Exception ex) { + } + return result; + } + + /** + * 密码匹配验证 + * @param encPass 密文 + * @param rawPass 明文 + * @return + */ + public boolean matches(String encPass, String rawPass) { + String pass1 = "" + encPass; + String pass2 = encode(rawPass); + + return pass1.equals(pass2); + } + + private String mergePasswordAndSalt(String password) { + if (password == null) { + password = ""; + } + + if ((salt == null) || "".equals(salt)) { + return password; + } else { + return password + "{" + salt.toString() + "}"; + } + } + + /** + * 转换字节数组为16进制字串 + * + * @param b + * 字节数组 + * @return 16进制字串 + */ + private String byteArrayToHexString(byte[] b) { + StringBuffer resultSb = new StringBuffer(); + for (int i = 0; i < b.length; i++) { + resultSb.append(byteToHexString(b[i])); + } + return resultSb.toString(); + } + + /** + * 将字节转换为16进制 + * @param b + * @return + */ + private static String byteToHexString(byte b) { + int n = b; + if (n < 0) + n = 256 + n; + int d1 = n / 16; + int d2 = n % 16; + return hexDigits[d1] + hexDigits[d2]; + } + +// public static void main(String[] args) { +// String salt = "helloworld"; +// PasswordEncoder encoderMd5 = new PasswordEncoder(salt, "MD5"); +// String encode = encoderMd5.encode("test"); +// System.out.println(encode); +// boolean passwordValid = encoderMd5.validPassword("1bd98ed329aebc7b2f89424b5a38926e", "test"); +// System.out.println(passwordValid); +// +// PasswordEncoder encoderSha = new PasswordEncoder(salt, "SHA"); +// String pass2 = encoderSha.encode("test"); +// System.out.println(pass2); +// boolean passwordValid2 = encoderSha.validPassword("1bd98ed329aebc7b2f89424b5a38926e", "test"); +// System.out.println(passwordValid2); +// } + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/utils/PasswordUtils.java b/user-service/src/main/java/com/mh/user/utils/PasswordUtils.java new file mode 100644 index 0000000..54e34e3 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/PasswordUtils.java @@ -0,0 +1,40 @@ +package com.mh.user.utils; + +import java.util.UUID; + +/** + * 密码工具类 + * @author Louis + * @date Sep 1, 2018 + */ +public class PasswordUtils { + + /** + * 匹配密码 + * @param salt 盐 + * @param rawPass 明文 + * @param encPass 密文 + * @return + */ + public static boolean matches(String salt, String rawPass, String encPass) { + return new PasswordEncoder(salt).matches(encPass, rawPass); + } + + /** + * 明文密码加密 + * @param rawPass 明文 + * @param salt + * @return + */ + public static String encode(String rawPass, String salt) { + return new PasswordEncoder(salt).encode(rawPass); + } + + /** + * 获取加密盐 + * @return + */ + public static String getSalt() { + return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 20); + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/QuerySendThread.java b/user-service/src/main/java/com/mh/user/utils/QuerySendThread.java new file mode 100644 index 0000000..79bd3e2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/QuerySendThread.java @@ -0,0 +1,38 @@ +package com.mh.user.utils; + +import com.mh.user.constants.Constant; +import lombok.extern.slf4j.Slf4j; + +/** + * @author ljf + * @title : + * @description : 查询指令发送指令 + * @updateTime 2020-05-29 + * @throws : + */ +@Slf4j +public class QuerySendThread extends Thread { + + public boolean stop = false; + private int i = 0; + + public void run(){ + while (!Constant.SEND_STATUS && !stop){ + try { + i = i + 1; + sleep(1); + if (i > 15000) + { + stop = true; + } + } catch (InterruptedException e){ + log.info(e.getMessage()); + } + } + stop = false; + } + + + + +} diff --git a/user-service/src/main/java/com/mh/user/utils/SecurityUtils.java b/user-service/src/main/java/com/mh/user/utils/SecurityUtils.java new file mode 100644 index 0000000..ffe4b74 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/SecurityUtils.java @@ -0,0 +1,107 @@ +package com.mh.user.utils; + +import javax.servlet.http.HttpServletRequest; + +import com.mh.user.security.JwtAuthenticatioToken; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; + +import java.util.Date; + +/** + * Security相关操作 + * @author Louis + * @date Jan 14, 2019 + */ +public class SecurityUtils { + + /** + * 系统登录认证 + * @param request + * @param username + * @param password + * @param authenticationManager + * @return + */ + public static JwtAuthenticatioToken login(HttpServletRequest request, String username, String password, AuthenticationManager authenticationManager) { + JwtAuthenticatioToken token = new JwtAuthenticatioToken(username, password); + token.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + // 执行登录认证过程 + Authentication authentication = authenticationManager.authenticate(token); + // 认证成功存储认证信息到上下文 + SecurityContextHolder.getContext().setAuthentication(authentication); + // 生成令牌并返回给客户端 + token.setToken(JwtTokenUtils.generateToken(authentication)); + System.out.println("返回token到前端!"); + return token; + } + + /** + * 获取令牌进行认证 + * @param request + */ + public static void checkAuthentication(HttpServletRequest request) { + // 获取令牌并根据令牌获取登录认证信息 + Authentication authentication = JwtTokenUtils.getAuthenticationeFromToken(request); + System.out.println("认证:"+authentication); + // 设置登录认证信息到上下文 + SecurityContextHolder.getContext().setAuthentication(authentication); + } + + /** + * 获取当前用户名 + * @return + */ + public static String getUsername() { + String username = null; + Authentication authentication = getAuthentication(); + if(authentication != null) { + Object principal = authentication.getPrincipal(); + if(principal != null && principal instanceof UserDetails) { + username = ((UserDetails) principal).getUsername(); + } + } + return username; + } + + /** + * 获取用户名 anonymousUser + * @return + */ + public static String getUsername(Authentication authentication) { + String username = null; + if(authentication != null) { + Object principal = authentication.getPrincipal(); + if(principal != null && principal instanceof UserDetails) { + username = ((UserDetails) principal).getUsername(); + } + } + return username; + } + + /** + * 获取当前登录时间 + * @return + */ + public static Date getLoginTime() { + Date date=new Date(); + return date; + } + + /** + * 获取当前登录信息 + * @return + */ + public static Authentication getAuthentication() { + if(SecurityContextHolder.getContext() == null) { + return null; + } + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + return authentication; + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/SendOrderUtils.java b/user-service/src/main/java/com/mh/user/utils/SendOrderUtils.java new file mode 100644 index 0000000..c1b8084 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/SendOrderUtils.java @@ -0,0 +1,204 @@ +package com.mh.user.utils; + +import com.mh.user.entity.ChillersEntity; +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.model.OrderParamModel; +import com.mh.user.serialport.SerialPortListener; +import com.mh.user.serialport.SerialPortUtil; +import com.mh.user.serialport.SerialTool; +//import purejavacomm.SerialPort; +import gnu.io.SerialPort; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import lombok.extern.slf4j.Slf4j; + +/** + * @author ljf + * @title : + * @description : 发送指令工具类 + * @updateTime 2021-01-26 + * @throws : + */ +@Slf4j +public class SendOrderUtils { + + /** + * 发送采集冷水机组 + * @param chillersEntity + * @param ctx + * @param num + * @param size + */ + public static void sendChillersOrder(ChillersEntity chillersEntity, ChannelHandlerContext ctx, int num, int size) { + // 继续发送下一个采集冷水机设备指令 + GetReadOrder485 getReadOrder485 = new GetReadOrder485(); + String sendStr = getReadOrder485.createChillersOrder(chillersEntity); + ByteBuf buffer = getByteBuf(ctx, sendStr); + // 2.发送数据 + ctx.channel().writeAndFlush(buffer); + log.info("客户端再次往服务端发送数据" + num + " 数据条数:" + size); + } + + public static void sendMeterOrCloud(DeviceManageEntity deviceManageEntity, + int num, + String IP, + String port, + ChannelHandlerContext ctx) { + if (deviceManageEntity.getParamId() == 1) { + sendMeterOrder(deviceManageEntity, num, IP, port, ctx); + } else if (deviceManageEntity.getParamId() == 3) { + sendCloudOrder(deviceManageEntity, num, IP, port, ctx); + } + } + /** + * 发送采集电表 + * @param deviceManageEntity + * @param num + * @param IP + * @param port + * @param ctx + */ + public static void sendMeterOrder(DeviceManageEntity deviceManageEntity, + int num, + String IP, + String port, + ChannelHandlerContext ctx) { +// String collectionNum = deviceManageEntity.getCollectionNum(); +// String sendStr = GetReadOrder485.createMeterOrder(); + String sendStr=""; + ByteBuf buffer = getByteBuf(ctx, sendStr); + // 2.发送数据 + ctx.channel().writeAndFlush(buffer); + log.info("客户端再次往服务端发送数据" + num); + } + + /** + * 发送采集冷量计工具类 + * @param deviceManageEntity + * @param num + * @param IP + * @param port + * @param ctx + */ + public static void sendCloudOrder(DeviceManageEntity deviceManageEntity, + int num, + String IP, + String port, + ChannelHandlerContext ctx) { + // 1.创建将要写出的数据 + String collectionNum = deviceManageEntity.getCollectionNum(); + String sendStr = GetReadOrder485.createCloudOrder(IP, port, + deviceManageEntity.getDataCom(), + collectionNum, "34"); +// String sendStr = "5803004900021914"; + ByteBuf buffer = getByteBuf(ctx, sendStr); + // 2.发送数据 + ctx.channel().writeAndFlush(buffer); + log.info("客户端再次往服务端发送数据" + sendStr); + } + + //向串口发指令数据 + public static void sendSerialPort(DeviceCodeParamEntity deviceCodeParamEntity,SerialPort serialPort ) { + //创建将要写出的数据 + OrderParamModel orderParamModel=new OrderParamModel(); + orderParamModel.setDeviceAddr(deviceCodeParamEntity.getDeviceAddr());//通讯地址 + orderParamModel.setDeviceType(deviceCodeParamEntity.getDeviceType());//设备类型 + orderParamModel.setBaudrate(deviceCodeParamEntity.getBaudrate());//波特率 + orderParamModel.setBrand(deviceCodeParamEntity.getBrand());//品牌 + orderParamModel.setFunCode(deviceCodeParamEntity.getFunCode());//功能码 + orderParamModel.setRegisterAddr(deviceCodeParamEntity.getRegisterAddr());//寄存器地址 + orderParamModel.setComName(deviceCodeParamEntity.getDataCom()); //串口 + orderParamModel.setDataValue(deviceCodeParamEntity.getDataValue());//传入数据 + + String deviceType=deviceCodeParamEntity.getDeviceType(); + String registerAddr=deviceCodeParamEntity.getRegisterAddr(); + String sendStr=null; + if (deviceType.equals("电表")){ + sendStr = GetReadOrder485.createMeterOrder(orderParamModel); + }else if (deviceType.equals("水表")){ + sendStr = GetReadOrder485.createWtMeterOrder(orderParamModel); + }else if (deviceType.equals("压变")){ + sendStr = GetReadOrder485.createPressureOrder(orderParamModel); + }else if (deviceType.equals("热泵")){ + sendStr = GetReadOrder485.createPumpOrder(orderParamModel); + }else if (deviceType.equals("温控")){ + sendStr = GetReadOrder485.createTempOrder(orderParamModel); + }else if (deviceType.equals("时控")){ + sendStr = GetReadOrder485.createTimeSetOrder(orderParamModel); + }else if (deviceType.equals("水位开关")){ + sendStr = GetReadOrder485.createRelayOrder(orderParamModel); + }else if (deviceType.equals("状态检测")){ + sendStr = GetReadOrder485.createStateOrder(orderParamModel); + }else if (deviceType.equals("温度变送器")){ + sendStr = GetReadOrder485.createMulTempOrder(orderParamModel); + }else if (deviceType.equals("热泵状态")){ + sendStr = GetReadOrder485.createPumpStateOrder(orderParamModel); + } + + String str=sendStr; + try{ + byte[] HEX = SerialPortListener.hexStr2Byte(str); + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + serialPortUtil.sendToPort(serialPort, HEX); + +// SerialTool serialPortUtil = SerialTool.getSerialPortUtil(); +// serialPortUtil.sendToPort(HEX,serialPort); + log.info(deviceType+"向串口"+serialPort+"发送数据>>>>" + str); + }catch (Exception e){ + e.printStackTrace(); + log.error("向串口"+serialPort+"发送数据异常!"); + } + } + + //向串口发指令数据 + public static String getSendStr(DeviceCodeParamEntity deviceCodeParamEntity) { + //创建将要写出的数据 + OrderParamModel orderParamModel=new OrderParamModel(); + orderParamModel.setDeviceAddr(deviceCodeParamEntity.getDeviceAddr());//通讯地址 + orderParamModel.setDeviceType(deviceCodeParamEntity.getDeviceType());//设备类型 + orderParamModel.setBaudrate(deviceCodeParamEntity.getBaudrate());//波特率 + orderParamModel.setBrand(deviceCodeParamEntity.getBrand());//品牌 + orderParamModel.setFunCode(deviceCodeParamEntity.getFunCode());//功能码 + orderParamModel.setRegisterAddr(deviceCodeParamEntity.getRegisterAddr());//寄存器地址 + orderParamModel.setComName(deviceCodeParamEntity.getDataCom()); //串口 + orderParamModel.setDataValue(deviceCodeParamEntity.getDataValue());//传入数据 + + String deviceType=deviceCodeParamEntity.getDeviceType(); + String registerAddr=deviceCodeParamEntity.getRegisterAddr(); + String sendStr=null; + if (deviceType.equals("电表")){ + sendStr = GetReadOrder485.createMeterOrder(orderParamModel); + }else if (deviceType.equals("水表")){ + sendStr = GetReadOrder485.createWtMeterOrder(orderParamModel); + }else if (deviceType.equals("压变")){ + sendStr = GetReadOrder485.createPressureOrder(orderParamModel); + }else if (deviceType.equals("热泵")){ + sendStr = GetReadOrder485.createPumpOrder(orderParamModel); + }else if (deviceType.equals("温控")){ + sendStr = GetReadOrder485.createTempOrder(orderParamModel); + }else if (deviceType.equals("时控")){ + sendStr = GetReadOrder485.createTimeSetOrder(orderParamModel); + }else if (deviceType.equals("水位开关")){ + sendStr = GetReadOrder485.createRelayOrder(orderParamModel); + }else if (deviceType.equals("状态检测")){ + sendStr = GetReadOrder485.createStateOrder(orderParamModel); + }else if (deviceType.equals("温度变送器")){ + sendStr = GetReadOrder485.createMulTempOrder(orderParamModel); + }else if (deviceType.equals("热泵状态")){ + sendStr = GetReadOrder485.createPumpStateOrder(orderParamModel); + } + + return sendStr; + } + + + + private static ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { + // 申请一个数据结构存储信息 + ByteBuf buffer = ctx.alloc().buffer(); + // 将信息放入数据结构中 + buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制 + return buffer; + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/SpringBeanUtil.java b/user-service/src/main/java/com/mh/user/utils/SpringBeanUtil.java new file mode 100644 index 0000000..51637c4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/SpringBeanUtil.java @@ -0,0 +1,54 @@ +package com.mh.user.utils; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +/** + * + * @ClassName: SpringUtils + * @Description:TODO(spring获取bean类型) + * @author: 铭汉科技—LJF + * @date: 2019年6月14日 下午4:05:44 + * + */ +@Component +public class SpringBeanUtil implements ApplicationContextAware{ + + private static ApplicationContext applicationContext = null; + + @Override + public void setApplicationContext(ApplicationContext arg0) throws BeansException { + // TODO Auto-generated method stub + if (SpringBeanUtil.applicationContext == null) { + SpringBeanUtil.applicationContext = arg0; + } + } + + // 获取applicationContext + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + // 通过Name获取Bean + public static Object getBean(String name) { + return getApplicationContext().getBean(name); + } + + // 通过class获取Bean + public static T getBean(Class claszz) { + return getApplicationContext().getBean(claszz); + } + + // 通过name,以及claszz返回指定的bean + public static T getBean(String name,Class clazz) { + return getApplicationContext().getBean(name,clazz); + } + + public static String getProperty(String key) { + return applicationContext.getBean(Environment.class).getProperty(key); + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/SpringContextUtils.java b/user-service/src/main/java/com/mh/user/utils/SpringContextUtils.java new file mode 100644 index 0000000..dca4d18 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/SpringContextUtils.java @@ -0,0 +1,45 @@ +package com.mh.user.utils; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * @author ljf + * @title :工具类 + * @description :spring或者bean工具类 + * @updateTime 2020-04-01 + * @throws : + */ +@Component +public class SpringContextUtils implements ApplicationContextAware { + private static ApplicationContext applicationContext = null; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + if (SpringContextUtils.applicationContext == null) { + SpringContextUtils.applicationContext = applicationContext; + } + } + + //获取applicationContext + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + //通过name获取 Bean. + public static Object getBean(String name) { + return getApplicationContext().getBean(name); + } + + //通过class获取Bean. + public static T getBean(Class clazz) { + return getApplicationContext().getBean(clazz); + } + + //通过name,以及Clazz返回指定的Bean + public static T getBean(String name, Class clazz) { + return getApplicationContext().getBean(name, clazz); + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/Test.java b/user-service/src/main/java/com/mh/user/utils/Test.java new file mode 100644 index 0000000..603bcdc --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/Test.java @@ -0,0 +1,120 @@ +package com.mh.user.utils; + +import com.mh.user.annotation.BusinessType; +import com.mh.user.constants.Constant; +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.service.NowDataService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-15 + * @throws : + */ +@Slf4j +public class Test { + +// @Autowired +// protected DeviceManageService deviceManageService; +// private static Test test ; +// @PostConstruct //通过@PostConstruct实现初始化bean之前进行的操作 +// public void init() { +// test = this; +// test.deviceManageService = this.deviceManageService; +// // 初使化时将已静态化的testService实例化 +// } +// +// //测试调用 +// public void test1(){ +// +// } + + public void myAnalysisCloudOrder485(String receiveData){ + + // 去掉空格 + receiveData = receiveData.replace(" ",""); + + // 检验报文 + String checkStr = receiveData.substring(0,receiveData.length()-4); + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); + + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length()-4,receiveData.length()))) { + + log.info("报文检验成功: " + receiveData); + + // IP地址 + String ip = checkStr.substring(0, 8); + // 端口号 + String port = checkStr.substring(8, 12); + // COM口 + String dataCom = checkStr.substring(12, 14); + // 数据 + String dataStr1 = checkStr.substring(14); + + // 检验报文 + String checkStr1 = dataStr1.substring(0, dataStr1.length() - 4); + byte[] strOrder1 = ExchangeStringUtil.hexStrToBinaryStr(checkStr1); + int checkNum1 = CRC16.CRC16_MODBUS(strOrder1); + String checkWord1 = ExchangeStringUtil.decToHex(String.valueOf(checkNum1)); + checkWord1 = checkWord1.substring(2, 4) + checkWord1.substring(0, 2); + if (checkWord1.equalsIgnoreCase(dataStr1.substring(dataStr1.length() - 4))) { + + // 时间 + //创建SimpleDateFormat对象,指定样式 2019-05-13 22:39:30 + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + log.info("时间: " + dateStr); + + // 表号 + String cloudId = ExchangeStringUtil.hexToDec(dataStr1.substring(0, 2)); + log.info("冷量计ID: " + cloudId); + + // 读数 + String data = dataStr1.substring(dataStr1.length() - 8, dataStr1.length() - 6) + + dataStr1.substring(dataStr1.length() - 6, dataStr1.length() - 4) + + dataStr1.substring(dataStr1.length() - 12, dataStr1.length() - 10) + + dataStr1.substring(dataStr1.length() - 10, dataStr1.length() - 8); + data = ExchangeStringUtil.hexToDec(data); + log.info("冷量计读数: " + data); + + try { + DeviceManageEntity deviceManageEntity = new DeviceManageEntity(); + deviceManageEntity.setDeviceNum(cloudId); + deviceManageEntity.setDeviceCode(cloudId); + deviceManageEntity.setLastValue(data); + deviceManageEntity.setLastDate(new Date()); + + } catch (Exception e) { + e.printStackTrace(); + } + + } + } + + } + + public static void main(String[] args) throws ParseException, IOException { + + + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/ThreadPoolService.java b/user-service/src/main/java/com/mh/user/utils/ThreadPoolService.java new file mode 100644 index 0000000..f92e2dd --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/ThreadPoolService.java @@ -0,0 +1,46 @@ +package com.mh.user.utils; + +import java.util.concurrent.*; + +/** + * @author ljf + * @title : 单例的线程池 + * @description : 使用静态内部类进行创建,专门解析接收到的报文数据 + * @updateTime 2020-12-09 + * @throws : + */ +public class ThreadPoolService { + + /** 线程池保持ALIVE状态线程数 */ + public static final int CORE_POOL_SIZE = 10; + + /** 线程池最大线程数 */ + public static final int MAX_POOL_SIZE = 50; + + /** 空闲线程回收时间 */ + public static final int KEEP_ALIVE_TIME = 30000; + + /** 线程池等待队列 */ + public static final int BLOCKING_QUEUE_SIZE = 1000; + + // 私有化构造器 + private ThreadPoolService(){} + + // 对外访问的公共方法 + public static ThreadPoolExecutor getInstance() { + return ThreadPoolServiceHolder.instance; + } + + //写一个静态内部类,里面实例化外部类 + private static class ThreadPoolServiceHolder { + private static final ThreadPoolExecutor instance = new ThreadPoolExecutor( + CORE_POOL_SIZE, // 线程池保持存活的线程数 + MAX_POOL_SIZE, // 最大线程数 + KEEP_ALIVE_TIME, // 空闲线程回收时间 + TimeUnit.MICROSECONDS, // 单位 + new LinkedBlockingQueue<>(BLOCKING_QUEUE_SIZE), // 线程队列 + new ThreadPoolExecutor.AbortPolicy() // 线程池对拒绝任务的处理策略 + ); + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/TimeDifferenceUtil.java b/user-service/src/main/java/com/mh/user/utils/TimeDifferenceUtil.java new file mode 100644 index 0000000..55149e4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/TimeDifferenceUtil.java @@ -0,0 +1,49 @@ +package com.mh.user.utils; + +//import com.mh.user.service.OrderMessageService; +import org.springframework.context.ApplicationContext; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-06-09 + * @throws : + */ +public class TimeDifferenceUtil { + + ApplicationContext context = SpringContextUtils.getApplicationContext(); + //OrderMessageService orderMessageService = context.getBean(OrderMessageService.class); + + public TimeDifferenceUtil() { + super(); + } + + public static int dValue(String lastDate) throws ParseException { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date lastTime = format.parse(lastDate); + long min = lastTime.getTime(); + Calendar calendar = Calendar.getInstance(); + long min1 = calendar.getTimeInMillis(); + long subtract = min1 - min; +// System.out.println("相减值: " + subtract/(1000*60)); + return (int) subtract / (1000 * 60); + } + +// public Boolean timeDifference(int overTime) { +// Date lastTime = orderMessageService.queryCloseChilledLastTime(); +// Date nowDate = new Date(); +// long a = (nowDate.getTime() - lastTime.getTime()) / (60 * 1000); +// if (a >= overTime) { +// return true; +// } else { +// return false; +// } +// } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/TimedTask2.java b/user-service/src/main/java/com/mh/user/utils/TimedTask2.java new file mode 100644 index 0000000..fe30c44 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/TimedTask2.java @@ -0,0 +1,120 @@ +package com.mh.user.utils; + +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.entity.DeviceInstallEntity; +import com.mh.user.entity.PumpSetEntity; +import com.mh.user.model.SerialPortModel; +import com.mh.user.serialport.SerialPortSingle; +import com.mh.user.service.DeviceInstallService; +import com.mh.user.service.PumpSetService; +import io.swagger.models.auth.In; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; + +import java.text.SimpleDateFormat; +import java.util.*; + +public class TimedTask2 { + + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + PumpSetService pumpSetService=context.getBean(PumpSetService.class); + DeviceInstallService deviceInstallService=context.getBean(DeviceInstallService.class); + + public void cronJobClose(int shi, int fen, int miao) { //定时关机 + Calendar cal = Calendar.getInstance(); + // 每天定点执行 + cal.set(Calendar.HOUR_OF_DAY, shi); + cal.set(Calendar.MINUTE, fen); + cal.set(Calendar.SECOND, miao); + + Timer timer = new Timer(); + timer.schedule(new TimerTask() { + + public void run() { + // 把run方法里的内容换成你要执行的内容 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + System.out.println("当前的系统时间为:" + sdf.format(new Date())); + SerialPortSingle serialPortSingle = new SerialPortSingle(); //发送接收类 + DeviceCodeParamEntity deviceCodeParam=new DeviceCodeParamEntity();//参数实体类 + List deviceList=deviceInstallService.selectDevicePump(); + if (deviceList.size()>0){ + for (DeviceInstallEntity deviceInstall :deviceList){ + deviceCodeParam.setDeviceAddr(deviceInstall.getDeviceAddr()); //传入通讯编号 + deviceCodeParam.setDeviceType(deviceInstall.getDeviceType()); + deviceCodeParam.setDataCom(deviceInstall.getDataCom()); + deviceCodeParam.setBaudrate(deviceInstall.getBaudRate()); + deviceCodeParam.setParity(deviceInstall.getParity()); + deviceCodeParam.setDataValue("0000");//传入相关参数值,关机 + deviceCodeParam.setBuildingId(deviceInstall.getBuildingId()); + deviceCodeParam.setBrand(deviceInstall.getBrand()); + deviceCodeParam.setRegisterAddr("0000"); //寄存器地址 + deviceCodeParam.setFunCode("06"); + serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 + } + } + } + }, cal.getTime(), 24 * 60 * 60 * 1000); + } + + public void cronJobStart(int shi, int fen, int miao) { //定时开机 + Calendar cal = Calendar.getInstance(); + // 每天定点执行 + cal.set(Calendar.HOUR_OF_DAY, shi); + cal.set(Calendar.MINUTE, fen); + cal.set(Calendar.SECOND, miao); + + Timer timer = new Timer(); + timer.schedule(new TimerTask() { + + public void run() { + // 把run方法里的内容换成你要执行的内容 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + System.out.println("当前的系统时间为:" + sdf.format(new Date())); +// SerialPortSingle serialPortSingle = new SerialPortSingle(); //发送接收类 +// DeviceCodeParamEntity deviceCodeParam=new DeviceCodeParamEntity();//参数实体类 +// List deviceList=deviceInstallService.selectDevicePump(); +// if (deviceList.size()>0){ +// for (DeviceInstallEntity deviceInstall :deviceList){ +// deviceCodeParam.setDeviceAddr(deviceInstall.getDeviceAddr()); //传入通讯编号 +// deviceCodeParam.setDeviceType(deviceInstall.getDeviceType()); +// deviceCodeParam.setDataCom(deviceInstall.getDataCom()); +// deviceCodeParam.setBaudrate(deviceInstall.getBaudRate()); +// deviceCodeParam.setParity(deviceInstall.getParity()); +// deviceCodeParam.setDataValue("0003");//传入相关参数值,制热 +// deviceCodeParam.setBuildingId(deviceInstall.getBuildingId()); +// deviceCodeParam.setBrand(deviceInstall.getBrand()); +// deviceCodeParam.setRegisterAddr("0000"); //寄存器地址 +// deviceCodeParam.setFunCode("06"); +// serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 +// } +// } + + } + }, cal.getTime(), 24 * 60 * 60 * 1000); + } + + public void cronJob(){ + PumpSetEntity pumpSet=pumpSetService.queryHandTime(); + if (pumpSet!=null){ + String HH=""; + String mm=""; + String startTime=pumpSet.getStartTime1(); + HH=startTime.substring(0,2); + mm=startTime.substring(3,5); +// cronJobStart(Integer.valueOf(HH), Integer.valueOf(mm), 00); + cronJobStart(16, 13, 00); + System.out.println("-----------小时:"+HH+",分钟:"+mm+"-----------"); +// String closeTime=pumpSet.getCloseTime1(); +// HH=closeTime.substring(0,2); +// mm=closeTime.substring(3,5); +// cronJobClose(Integer.valueOf(HH), Integer.valueOf(mm), 00); + System.out.println("-----------小时:"+HH+",分钟:"+mm+"-----------"); + } + } +// +// public static void main(String[] args) { +// cronJob(11, 46, 0); //24小时制 时分秒 +// } + + +} diff --git a/user-service/src/main/java/com/mh/user/vo/LoginBean.java b/user-service/src/main/java/com/mh/user/vo/LoginBean.java new file mode 100644 index 0000000..3d8b726 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/vo/LoginBean.java @@ -0,0 +1,19 @@ +package com.mh.user.vo; + +import lombok.Getter; +import lombok.Setter; + +/** + * 登录接口封装对象 + * @author Louis + * @date Oct 29, 2018 + */ +@Setter +@Getter +public class LoginBean { + + private String account; //账号 + private String password; //密码 + private String captcha; //验证码 + +} diff --git a/user-service/src/main/resources/application-dev.yml b/user-service/src/main/resources/application-dev.yml new file mode 100644 index 0000000..d6d9b78 --- /dev/null +++ b/user-service/src/main/resources/application-dev.yml @@ -0,0 +1,120 @@ +server: + port: 8761 #8761创新、8762广商、8763华厦、广州理工 +spring: + application: + name: user-service + datasource: + name: druidDataSource + type: com.alibaba.druid.pool.DruidDataSource + druid: + #添加allowMultiQueries=true 在批量更新时才不会出错 + # url: jdbc:sqlserver://192.168.1.108:2012;DatabaseName=FSBG;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: sa + # password: mh@803 + ## url: jdbc:sqlserver://120.25.220.177:32012;DatabaseName=M_CHWS;allowMultiQueries=true + #阿里云服务器-广州理工 + # url: jdbc:sqlserver://120.25.220.177:32012;DatabaseName=CHWS;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: test + # password: minghan123456@ + #华厦云服务器 + # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=CHWS;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: chws + # password: minghan123456@ + #创新服务器 + url: jdbc:sqlserver://119.29.33.133:2008;DatabaseName=chws_chx;allowMultiQueries=true + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + username: chws + password: mh@803 + #广商服务器 + # url: jdbc:sqlserver://119.29.33.133:2008;DatabaseName=chws_gsh;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: chws + # password: mh@803 + #本机 + # url: jdbc:sqlserver://127.0.0.1:9956;DatabaseName=CHWS;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: sa + # password: mh@803 + #家里电脑 + # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=CHWS;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: sa + # password: mh@803 + + filters: stat,wall,config + max-active: 100 + initial-size: 1 + max-wait: 60000 + min-idle: 1 + time-between-eviction-runs-millis: 60000 + min-evictable-idle-time-millis: 300000 + validation-query: select 'x' + test-while-idle: true + test-on-borrow: false + test-on-return: false + pool-prepared-statements: true + max-open-prepared-statements: 50 + max-pool-prepared-statement-per-connection-size: 50 + cloud: + config: + fail-fast: false + # 是否启用配置中心 + enabled: false + # 配置中心地址 +# uri: ${SPRING_CLOUD_CONFIG_URI:http://localhost:8763} +# redis: +# database: 0 +# host: 127.0.0.1 +# port: 6379 +# password: 123456 +# timeout: 3000 #链接超时时间 +# lettuce: +# pool: +# max-active: 8 #连接池最大连接数(使用负值没有限制) +# max-wait: -1 #最大等待时间,使用负值没有限制 +# max-idle: 8 #最大空闲连接,使用负值没有限制 +# min-idle: 0 #默认最小空闲连接 默认0 + +# redis配置 +# cloud: +# config: +# uri: http://localhost:8769 +# fail-fast: true +# profiles: +# active: pro +# consul: +# host: localhost +# port: 8500 +# discovery: +# service-name: ${spring.application.name} +# application: +# name: user-service +# 开放健康检查接口 +#management: +# endpoints: +# web: +# exposure: +# include: "*" +# endpoint: +# health: +# show-details: ALWAYS +#files: +# path: ${file-path:d:/files} + +#设置将SQL语句打印到控制台 level后面是 mybatis接口目录 +logging: + level: + com: + mh: + user: + mapper: DEBUG + file: + max-size: 30 + path: logs/${spring.application.name} + +##软件最后更新日期20230111 + + diff --git a/user-service/src/main/resources/application-prod.yml b/user-service/src/main/resources/application-prod.yml new file mode 100644 index 0000000..6ea6edf --- /dev/null +++ b/user-service/src/main/resources/application-prod.yml @@ -0,0 +1,124 @@ +server: + port: 8761 #8761创新、8762广商、8763华厦、广州理工 +spring: + datasource: + name: druidDataSource + type: com.alibaba.druid.pool.DruidDataSource + druid: + #添加allowMultiQueries=true 在批量更新时才不会出错 + # url: jdbc:sqlserver://192.168.1.108:2012;DatabaseName=FSBG;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: sa + # password: mh@803 + ## url: jdbc:sqlserver://120.25.220.177:32012;DatabaseName=M_CHWS;allowMultiQueries=true + #阿里云服务器-广州理工 + # url: jdbc:sqlserver://120.25.220.177:32012;DatabaseName=CHWS;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: test + # password: minghan123456@ + #华厦云服务器 + # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=CHWS;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: chws + # password: minghan123456@ + #创新服务器 + url: jdbc:sqlserver://119.29.33.133:2008;DatabaseName=chws_chx;allowMultiQueries=true + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + username: chws + password: mh@803 + #广商服务器 + # url: jdbc:sqlserver://119.29.33.133:2008;DatabaseName=chws_gsh;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: chws + # password: mh@803 + #本机 + # url: jdbc:sqlserver://127.0.0.1:9956;DatabaseName=CHWS;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: sa + # password: mh@803 + #家里电脑 + # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=CHWS;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: sa + # password: mh@803 + + filters: stat,wall,config + max-active: 100 + initial-size: 1 + max-wait: 60000 + min-idle: 1 + time-between-eviction-runs-millis: 60000 + min-evictable-idle-time-millis: 300000 + validation-query: select 'x' + test-while-idle: true + test-on-borrow: false + test-on-return: false + pool-prepared-statements: true + max-open-prepared-statements: 50 + max-pool-prepared-statement-per-connection-size: 50 + cloud: + config: + fail-fast: false + # 是否启用配置中心 + enabled: ${SPRING_CLOUD_CONFIG_ENABLED:false} + # 配置中心地址 + uri: ${SPRING_CLOUD_CONFIG_URI:http://localhost:8763} +# redis: +# database: 0 +# host: 127.0.0.1 +# port: 6379 +# password: 123456 +# timeout: 3000 #链接超时时间 +# lettuce: +# pool: +# max-active: 8 #连接池最大连接数(使用负值没有限制) +# max-wait: -1 #最大等待时间,使用负值没有限制 +# max-idle: 8 #最大空闲连接,使用负值没有限制 +# min-idle: 0 #默认最小空闲连接 默认0 + +# redis配置 +# cloud: +# config: +# uri: http://localhost:8769 +# fail-fast: true +# profiles: +# active: pro +# consul: +# host: localhost +# port: 8500 +# discovery: +# service-name: ${spring.application.name} +# application: +# name: user-service +# 开放健康检查接口 +#management: +# endpoints: +# web: +# exposure: +# include: "*" +# endpoint: +# health: +# show-details: ALWAYS +#files: +# path: ${file-path:d:/files} + +log: + level: + root: info + my: debug + file: + maxsize: 30MB + +#设置将SQL语句打印到控制台 level后面是 mybatis接口目录 +logging: + # level: + # com: + # mh: + # user: + # mapper: DEBUG + file: + max-size: 30 + +##软件最后更新日期20230111 + + diff --git a/user-service/src/main/resources/application-test.yml b/user-service/src/main/resources/application-test.yml new file mode 100644 index 0000000..6ea6edf --- /dev/null +++ b/user-service/src/main/resources/application-test.yml @@ -0,0 +1,124 @@ +server: + port: 8761 #8761创新、8762广商、8763华厦、广州理工 +spring: + datasource: + name: druidDataSource + type: com.alibaba.druid.pool.DruidDataSource + druid: + #添加allowMultiQueries=true 在批量更新时才不会出错 + # url: jdbc:sqlserver://192.168.1.108:2012;DatabaseName=FSBG;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: sa + # password: mh@803 + ## url: jdbc:sqlserver://120.25.220.177:32012;DatabaseName=M_CHWS;allowMultiQueries=true + #阿里云服务器-广州理工 + # url: jdbc:sqlserver://120.25.220.177:32012;DatabaseName=CHWS;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: test + # password: minghan123456@ + #华厦云服务器 + # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=CHWS;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: chws + # password: minghan123456@ + #创新服务器 + url: jdbc:sqlserver://119.29.33.133:2008;DatabaseName=chws_chx;allowMultiQueries=true + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + username: chws + password: mh@803 + #广商服务器 + # url: jdbc:sqlserver://119.29.33.133:2008;DatabaseName=chws_gsh;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: chws + # password: mh@803 + #本机 + # url: jdbc:sqlserver://127.0.0.1:9956;DatabaseName=CHWS;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: sa + # password: mh@803 + #家里电脑 + # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=CHWS;allowMultiQueries=true + # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # username: sa + # password: mh@803 + + filters: stat,wall,config + max-active: 100 + initial-size: 1 + max-wait: 60000 + min-idle: 1 + time-between-eviction-runs-millis: 60000 + min-evictable-idle-time-millis: 300000 + validation-query: select 'x' + test-while-idle: true + test-on-borrow: false + test-on-return: false + pool-prepared-statements: true + max-open-prepared-statements: 50 + max-pool-prepared-statement-per-connection-size: 50 + cloud: + config: + fail-fast: false + # 是否启用配置中心 + enabled: ${SPRING_CLOUD_CONFIG_ENABLED:false} + # 配置中心地址 + uri: ${SPRING_CLOUD_CONFIG_URI:http://localhost:8763} +# redis: +# database: 0 +# host: 127.0.0.1 +# port: 6379 +# password: 123456 +# timeout: 3000 #链接超时时间 +# lettuce: +# pool: +# max-active: 8 #连接池最大连接数(使用负值没有限制) +# max-wait: -1 #最大等待时间,使用负值没有限制 +# max-idle: 8 #最大空闲连接,使用负值没有限制 +# min-idle: 0 #默认最小空闲连接 默认0 + +# redis配置 +# cloud: +# config: +# uri: http://localhost:8769 +# fail-fast: true +# profiles: +# active: pro +# consul: +# host: localhost +# port: 8500 +# discovery: +# service-name: ${spring.application.name} +# application: +# name: user-service +# 开放健康检查接口 +#management: +# endpoints: +# web: +# exposure: +# include: "*" +# endpoint: +# health: +# show-details: ALWAYS +#files: +# path: ${file-path:d:/files} + +log: + level: + root: info + my: debug + file: + maxsize: 30MB + +#设置将SQL语句打印到控制台 level后面是 mybatis接口目录 +logging: + # level: + # com: + # mh: + # user: + # mapper: DEBUG + file: + max-size: 30 + +##软件最后更新日期20230111 + + diff --git a/user-service/src/main/resources/application.yml b/user-service/src/main/resources/application.yml new file mode 100644 index 0000000..3d7808a --- /dev/null +++ b/user-service/src/main/resources/application.yml @@ -0,0 +1,3 @@ +spring: + profiles: + active: dev diff --git a/user-service/src/main/resources/log4j.properties b/user-service/src/main/resources/log4j.properties new file mode 100644 index 0000000..dc92269 --- /dev/null +++ b/user-service/src/main/resources/log4j.properties @@ -0,0 +1,35 @@ +#### set log levels ### +#log4j.rootLogger = INFO,DEBUG, console, infoFile, errorFile +#LocationInfo=true +# +#log4j.appender.console = org.apache.log4j.ConsoleAppender +#log4j.appender.console.Target = System.out +#log4j.appender.console.layout = org.apache.log4j.PatternLayout +# +#log4j.appender.console.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p]:%m %x %n +# +#log4j.appender.infoFile = org.apache.log4j.DailyRollingFileAppender +#log4j.appender.infoFile.Threshold = INFO +##log4j.appender.infoFile.File = F:/ideaProjects/ESI/logs/log +##log4j.appender.infoFile.File = F:/GZUnivTownZhongDa/serverLog/info +#log4j.appender.infoFile.DatePattern = '.'yyyy-MM-dd'.log' +#log4j.appender.infoFile.Append=true +#log4j.appender.infoFile.layout = org.apache.log4j.PatternLayout +#log4j.appender.infoFile.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p]:%m %x %n +# +#log4j.appender.errorFile = org.apache.log4j.DailyRollingFileAppender +#log4j.appender.errorFile.Threshold = ERROR +##log4j.appender.errorFile.File = F:/ideaProjects/ESI/logs/error +##log4j.appender.errorFile.File = D://EEMS_ESI//logs/error +#log4j.appender.errorFile.DatePattern = '.'yyyy-MM-dd'.log' +#log4j.appender.errorFile.Append=true +#log4j.appender.errorFile.layout = org.apache.log4j.PatternLayout +#log4j.appender.errorFile.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p]:%m %x %n +# +##log4j.appender.debugfile = org.apache.log4j.DailyRollingFileAppender +##log4j.appender.debugfile.Threshold = DEBUG +##log4j.appender.debugfile.File = F:/GZUnivTownZhongDa/serverLog/info +##log4j.appender.debugfile.DatePattern = '.'yyyy-MM-dd'.log' +##log4j.appender.debugfile.Append=true +##log4j.appender.debugfile.layout = org.apache.log4j.PatternLayout +##log4j.appender.debugfile.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p]:%m %x %n \ No newline at end of file diff --git a/user-service/src/main/resources/logback-spring.xml b/user-service/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..01ece4a --- /dev/null +++ b/user-service/src/main/resources/logback-spring.xml @@ -0,0 +1,83 @@ + + + logs + + + + + + + + + + + + + ${log.colorPattern} + + + + + + + ${log.path}/info/info.%d{yyyy-MM-dd}.log + ${log.maxHistory} + + + ${log.pattern} + + + INFO + ACCEPT + DENY + + + + + + ${log.path}/error/error.%d{yyyy-MM-dd}.log + + + ${log.pattern} + + + ERROR + ACCEPT + DENY + + + + + + + ${log.path}/info/info.mapper.%d{yyyy-MM-dd}.log + ${log.maxHistory} + + + ${log.pattern} + + + trace + ACCEPT + DENY + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/user-service/src/main/resources/socket.yml b/user-service/src/main/resources/socket.yml new file mode 100644 index 0000000..b19cbb2 --- /dev/null +++ b/user-service/src/main/resources/socket.yml @@ -0,0 +1,14 @@ +#socket: +# IP: 192.168.2.200 +# port: 8001 +# overtime: 8 +# sanIP: 10.0.75.1 +# sanPort: 30003 +# sanOverTime: 8 +socket: + IP: 10.1.64.37 + port: 8001 + overtime: 8 + sanIP: 10.1.64.36 + sanPort: 30000 + sanOverTime: 8 diff --git a/user-service/src/test/java/com/mh/user/DealDataTest.java b/user-service/src/test/java/com/mh/user/DealDataTest.java new file mode 100644 index 0000000..cfef275 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/DealDataTest.java @@ -0,0 +1,44 @@ +package com.mh.user; + +import com.mh.user.entity.EnergyEntity; +import com.mh.user.mapper.EnergyMapper; +import com.mh.user.mapper.DealDataMapper; +import com.mh.user.service.NowDataService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-28 + * @throws : + */ +public class DealDataTest extends UserServiceApplicationTests { + + @Autowired + private DealDataMapper dealDataMapper; + @Autowired + private NowDataService nowDataService; + + @Autowired + private EnergyMapper energyMapper; + + @Test + public void dealChillersData() { +// dealDataMapper.dealChillersData(); + } + + @Test + public void testSetTemp(){ + nowDataService.upTempSet2("33","48","2"); + } + + @Test + public void getDataTest(){ + List list = energyMapper.queryEnergyMonth("2-3", "2023-03", "2023-03", 1, 10); + System.out.println(list); + } +} diff --git a/user-service/src/test/java/com/mh/user/ExceptionTest.java b/user-service/src/test/java/com/mh/user/ExceptionTest.java new file mode 100644 index 0000000..33fd7d8 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/ExceptionTest.java @@ -0,0 +1,44 @@ +package com.mh.user; + +import com.mh.user.entity.ExceptionEntity; +import com.mh.user.entity.ExceptionTableData; +import com.mh.user.service.ExceptionService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-31 + * @throws : + */ +public class ExceptionTest extends UserServiceApplicationTests { + + @Autowired + private ExceptionService exceptionService; + + @Test + public void queryException() { + ExceptionEntity exceptionEntity = new ExceptionEntity(); + exceptionEntity.setPage(1); + exceptionEntity.setLimit(10); + List exceptionTableDataList = exceptionService.queryException(exceptionEntity); + for (int i = 0; i < exceptionTableDataList.size(); i++) { + System.out.println(exceptionTableDataList.get(i).toString()); + } + } + + @Test + public void updateException() { + ExceptionTableData exceptionTableData = new ExceptionTableData(); + exceptionTableData.setDeviceId(1); + exceptionTableData.setProcess(1); + exceptionTableData.setRemark("test111"); + String result = exceptionService.updateException(exceptionTableData); + System.out.println("返回值: " + result); + } + +} diff --git a/user-service/src/test/java/com/mh/user/SysUserTest.java b/user-service/src/test/java/com/mh/user/SysUserTest.java new file mode 100644 index 0000000..5c61953 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/SysUserTest.java @@ -0,0 +1,31 @@ +package com.mh.user; + +import com.mh.common.page.PageRequest; +import com.mh.common.page.PageResult; +import com.mh.user.mapper.SysUserMapper; +import com.mh.user.model.SysUser; +import com.mh.user.service.SysUserService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-03-14 + * @throws : + */ +public class SysUserTest extends UserServiceApplicationTests { + + @Autowired + private SysUserService sysUserService; + + @Test + public void findByName(){ + SysUser sysUser = sysUserService.findByName("admin"); + System.out.println(sysUser.toString()); +// List sysUserList = sysUserMapper.findAllUser(1,10); +// System.out.println(sysUserList); + } + +} diff --git a/user-service/src/test/java/com/mh/user/TestJwtUtils.java b/user-service/src/test/java/com/mh/user/TestJwtUtils.java new file mode 100644 index 0000000..8a57372 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/TestJwtUtils.java @@ -0,0 +1,159 @@ +package com.mh.user; + +import com.mh.user.model.SysUser; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * @author ljf + * @title : + * @description : 测试jwt认证 + * @updateTime 2020-04-27 + * @throws : + */ +public class TestJwtUtils { + + public static final String TOKEN_HEADER = "Authorization"; + public static final String TOKEN_PREFIX = "Bearer "; + + public static final String SUBJECT = "congge"; + + public static final long EXPIRITION = 1000 * 24 * 60 * 60 * 7; + + public static final String APPSECRET_KEY = "congge_secret"; + + private static final String ROLE_CLAIMS = "rol"; + + public static String generateJsonWebToken(SysUser user) { + + if (user.getId() == null || user.getUserName() == null) { + return null; + } + + Map map = new HashMap<>(); + map.put(ROLE_CLAIMS, "rol"); + + String token = Jwts + .builder() + .setSubject(SUBJECT) + .setClaims(map) + .claim("id", user.getId()) + .claim("name", user.getUserName()) + .setIssuedAt(new Date()) + .setExpiration(new Date(System.currentTimeMillis() + EXPIRITION)) + .signWith(SignatureAlgorithm.HS256, APPSECRET_KEY).compact(); + return token; + } + + /** + * 生成token + * @param username + * @param role + * @return + */ + public static String createToken(String username,String role) { + + Map map = new HashMap<>(); + map.put(ROLE_CLAIMS, role); + + String token = Jwts + .builder() + .setSubject(username) + .setClaims(map) + .claim("username",username) + .setIssuedAt(new Date()) + .setExpiration(new Date(System.currentTimeMillis() + EXPIRITION)) + .signWith(SignatureAlgorithm.HS256, APPSECRET_KEY).compact(); + return token; + } + + public static Claims checkJWT(String token) { + try { + final Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody(); + return claims; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取用户名 + * @param token + * @return + */ + public static String getUsername(String token){ + Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody(); + return claims.get("username").toString(); + } + + /** + * 获取用户角色 + * @param token + * @return + */ + public static String getUserRole(String token){ + Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody(); + return claims.get("rol").toString(); + } + + /** + * 是否过期 + * @param token + * @return + */ + public static boolean isExpiration(String token){ + Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody(); + return claims.getExpiration().before(new Date()); + } + +// public static void main(String[] args) { +// String name = "admin"; +// String token = createToken(name,"admin"); +// System.out.println(token); +// +// Claims claims = checkJWT(token); +// System.out.println(claims.get("username")); +// +// System.out.println(getUsername(token)); +// System.out.println(getUserRole(token)); +// System.out.println(isExpiration(token)); +// +// } + + + /** + * eyJhbGciOiJIUzI1NiJ9. + * eyJzdWIiOiJjb25nZ2UiLCJpZCI6IjExMDExIiwibmFtZSI6Im51b3dlaXNpa2kiLCJpbWciOiJ3d3cudW9rby5jb20vMS5wbmciLCJpYXQiOjE1NTQ5OTI1NzksImV4cCI6MTU1NTU5NzM3OX0. + * 6DJ9En-UBcTiMRldZeevJq3e1NxJgOWryUyim4_-tEE + * + * @param args + */ + + public static void main(String[] args) { + + SysUser user = new SysUser(); + user.setId((long) 1); + user.setUserName("admin"); + String token = generateJsonWebToken(user); + + System.out.println(token); + + Claims claims = checkJWT(token); + if (claims != null) { + String id = claims.get("id").toString(); + String name = claims.get("name").toString(); + + System.out.println("id:" + id); + System.out.println("name:" + name); + + } + + } + +} diff --git a/user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java b/user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java new file mode 100644 index 0000000..f4b6098 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java @@ -0,0 +1,65 @@ +package com.mh.user; + +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.entity.GaugeEntity; +import com.mh.user.service.DeviceManageService; +import com.mh.user.service.GaugeService; +import com.mh.user.utils.AnalysisReceiveOrder485; +import com.mh.user.utils.GetReadOrder485; +import com.mh.user.utils.PasswordEncoder; +import com.mh.user.utils.PasswordUtils; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +@SpringBootTest +class UserServiceApplicationTests { + + @Test + void contextLoads() { + } + + @Test + public void encode() { + String s = PasswordUtils.encode("123456", "87e03afa1f0122531f729c9a7453f475"); + System.out.println(s); + System.out.println(new PasswordEncoder("87e03afa1f0122531f729c9a7453f475").matches(s, "123456")); + } + + @Autowired + private GaugeService gaugeService; + + @Test + public void getGaugeData() { + GaugeEntity gaugeEntity = gaugeService.getGaugeData("0", "1号冷水机"); + System.out.println(gaugeEntity.toString()); + } + + @Autowired + DeviceManageService deviceManageService; + + @Test + public void queryDevices() { + List deviceManageEntities = deviceManageService.queryDevicesByType(null); + for (DeviceManageEntity device : + deviceManageEntities) { + System.out.println(device.toString()); + } + } + + @Test + public void AnalysisTest() { + AnalysisReceiveOrder485 analysis=new AnalysisReceiveOrder485(); + GetReadOrder485 getReadOrder485=new GetReadOrder485(); +// analysis.analysisWtMeterOrder485("FEFEFE6810398710810000008116901F00006502002C006502002C0000000000000000FF3416"); + //0203020008FD82 +// analysis.analysisPumpOrder485("0203020008FD82","0641"); +// getReadOrder485.createOrderParam(); +// analysis.analysisRelayOrder485("220611000000013A220611000000023B220611000000033C220611000000043D220611000000053E220611000000063F22061100000007402206110000000841","0017","中凯"); + } + + + +} diff --git a/user-service/src/test/java/com/mh/user/chart/ChartTest.java b/user-service/src/test/java/com/mh/user/chart/ChartTest.java new file mode 100644 index 0000000..3ff1e39 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/chart/ChartTest.java @@ -0,0 +1,63 @@ +package com.mh.user.chart; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +public class ChartTest { + public static void main(String[] args) { + +// Set objects = new LinkedHashSet<>(); +// objects.add("test"); +// objects.add("test1"); +// objects.add("test"); +// objects.add("test1"); +// for (Object object : +// objects) { +// System.out.println(object); +// } + +// Title title = new Title(false, "COP"); +// +// Feature feature = new Feature( +// new boolean[]{false, false, false, false}, +// new String[]{"温度", "湿度", "千瓦", "千帕"}, +// new String[]{"温度", "湿度", "千瓦", "千帕"}, +// new String[]{"温度", "湿度", "千瓦", "千帕"}, +// new String[]{"温度", "湿度", "千瓦", "千帕"}); +// +// Legend legend = new Legend( +// new String[]{"COP"}, +// 200, +// new int[]{25}); +// +// XAxis xAxis = new XAxis(new String[]{"前3周","前2周","前1周","本周"}); +// +// List yAxisList = new ArrayList<>(); +// yAxisList.add(new YAxis("value", +// "COP", +// new SplitLine(false), +// new AxisLine(false,new LineStyle("#FFF")), +// true)); +// +// List seriesList = new ArrayList<>(); +// seriesList.add(new Series("COP", +// "bar", +// 0, +// new Double[]{4.7, 5.8, 6.0, 5.3})); +// +// ChartEntity chartEntity = new ChartEntity(title,feature,legend,xAxis,yAxisList,seriesList); +// List chartEntities = new ArrayList<>(); +// chartEntities.add(chartEntity); +// String json = JSONArray.toJSONString(chartEntities); +// System.out.println(json); +// BigDecimal b1 = BigDecimal.valueOf(Math.PI / 2); +// double a = b1.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); +// System.out.println(a); + String s = "a9fec2c71f90ff03fc0000000100000200000300000400000500000600000700000800000900000a00000b00000c00000d00000e00000f00001000001100001200001300001400001500001600001700001800001900001a00001b00001c00001d00011e00001f00002000002100002200002300002400002500002600002700002800002900002a00002b00002c00002d00002e00002f000030000031000040a8"; + System.out.println("大小: " + s.length()); + } +} diff --git a/user-service/src/test/java/com/mh/user/device/CRC16Test.java b/user-service/src/test/java/com/mh/user/device/CRC16Test.java new file mode 100644 index 0000000..ef2ce3d --- /dev/null +++ b/user-service/src/test/java/com/mh/user/device/CRC16Test.java @@ -0,0 +1,77 @@ +package com.mh.user.device; + +import com.mh.user.utils.ExchangeStringUtil; + +import java.io.IOException; + +/** + * @Classname CRC16Test + * @Description TODO + * @Date 2020-06-03 14:08 + * @Created by LJF + */ +public class CRC16Test { + // CRC高字节值表 + static byte[] auchCRCHi = { + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41, + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40, + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41, + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41, + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40, + (byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40, + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40, + (byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40, + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41, + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41, + (byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40, + (byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41, + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40}; + + //CRC低位字节值表 + static byte[] auchCRCLo = { + (byte)0x00,(byte)0xC0,(byte)0xC1,(byte)0x01,(byte)0xC3,(byte)0x03,(byte)0x02,(byte)0xC2,(byte)0xC6,(byte)0x06,(byte)0x07,(byte)0xC7,(byte)0x05,(byte)0xC5,(byte)0xC4,(byte)0x04,(byte)0xCC,(byte)0x0C,(byte)0x0D,(byte)0xCD, + (byte)0x0F,(byte)0xCF,(byte)0xCE,(byte)0x0E,(byte)0x0A,(byte)0xCA,(byte)0xCB,(byte)0x0B,(byte)0xC9,(byte)0x09,(byte)0x08,(byte)0xC8,(byte)0xD8,(byte)0x18,(byte)0x19,(byte)0xD9,(byte)0x1B,(byte)0xDB,(byte)0xDA,(byte)0x1A, + (byte)0x1E,(byte)0xDE,(byte)0xDF,(byte)0x1F,(byte)0xDD,(byte)0x1D,(byte)0x1C,(byte)0xDC,(byte)0x14,(byte)0xD4,(byte)0xD5,(byte)0x15,(byte)0xD7,(byte)0x17,(byte)0x16,(byte)0xD6,(byte)0xD2,(byte)0x12,(byte)0x13,(byte)0xD3, + (byte)0x11,(byte)0xD1,(byte)0xD0,(byte)0x10,(byte)0xF0,(byte)0x30,(byte)0x31,(byte)0xF1,(byte)0x33,(byte)0xF3,(byte)0xF2,(byte)0x32,(byte)0x36,(byte)0xF6,(byte)0xF7,(byte)0x37,(byte)0xF5,(byte)0x35,(byte)0x34,(byte)0xF4, + (byte)0x3C,(byte)0xFC,(byte)0xFD,(byte)0x3D,(byte)0xFF,(byte)0x3F,(byte)0x3E,(byte)0xFE,(byte)0xFA,(byte)0x3A,(byte)0x3B,(byte)0xFB,(byte)0x39,(byte)0xF9,(byte)0xF8,(byte)0x38,(byte)0x28,(byte)0xE8,(byte)0xE9,(byte)0x29, + (byte)0xEB,(byte)0x2B,(byte)0x2A,(byte)0xEA,(byte)0xEE,(byte)0x2E,(byte)0x2F,(byte)0xEF,(byte)0x2D,(byte)0xED,(byte)0xEC,(byte)0x2C,(byte)0xE4,(byte)0x24,(byte)0x25,(byte)0xE5,(byte)0x27,(byte)0xE7,(byte)0xE6,(byte)0x26, + (byte)0x22,(byte)0xE2,(byte)0xE3,(byte)0x23,(byte)0xE1,(byte)0x21,(byte)0x20,(byte)0xE0,(byte)0xA0,(byte)0x60,(byte)0x61,(byte)0xA1,(byte)0x63,(byte)0xA3,(byte)0xA2,(byte)0x62,(byte)0x66,(byte)0xA6,(byte)0xA7,(byte)0x67, + (byte)0xA5,(byte)0x65,(byte)0x64,(byte)0xA4,(byte)0x6C,(byte)0xAC,(byte)0xAD,(byte)0x6D,(byte)0xAF,(byte)0x6F,(byte)0x6E,(byte)0xAE,(byte)0xAA,(byte)0x6A,(byte)0x6B,(byte)0xAB,(byte)0x69,(byte)0xA9,(byte)0xA8,(byte)0x68, + (byte)0x78,(byte)0xB8,(byte)0xB9,(byte)0x79,(byte)0xBB,(byte)0x7B,(byte)0x7A,(byte)0xBA,(byte)0xBE,(byte)0x7E,(byte)0x7F,(byte)0xBF,(byte)0x7D,(byte)0xBD,(byte)0xBC,(byte)0x7C,(byte)0xB4,(byte)0x74,(byte)0x75,(byte)0xB5, + (byte)0x77,(byte)0xB7,(byte)0xB6,(byte)0x76,(byte)0x72,(byte)0xB2,(byte)0xB3,(byte)0x73,(byte)0xB1,(byte)0x71,(byte)0x70,(byte)0xB0,(byte)0x50,(byte)0x90,(byte)0x91,(byte)0x51,(byte)0x93,(byte)0x53,(byte)0x52,(byte)0x92, + (byte)0x96,(byte)0x56,(byte)0x57,(byte)0x97,(byte)0x55,(byte)0x95,(byte)0x94,(byte)0x54,(byte)0x9C,(byte)0x5C,(byte)0x5D,(byte)0x9D,(byte)0x5F,(byte)0x9F,(byte)0x9E,(byte)0x5E,(byte)0x5A,(byte)0x9A,(byte)0x9B,(byte)0x5B, + (byte)0x99,(byte)0x59,(byte)0x58,(byte)0x98,(byte)0x88,(byte)0x48,(byte)0x49,(byte)0x89,(byte)0x4B,(byte)0x8B,(byte)0x8A,(byte)0x4A,(byte)0x4E,(byte)0x8E,(byte)0x8F,(byte)0x4F,(byte)0x8D,(byte)0x4D,(byte)0x4C,(byte)0x8C, + (byte)0x44,(byte)0x84,(byte)0x85,(byte)0x45,(byte)0x87,(byte)0x47,(byte)0x46,(byte)0x86,(byte)0x82,(byte)0x42,(byte)0x43,(byte)0x83,(byte)0x41,(byte)0x81,(byte)0x80,(byte)0x40 + }; + + /** + * 计算CRC16校验 + * @Description: + * @param data 需要计算的数组 + * @param len 长度 + * @return CRC16校验值 + */ + private static int calcCrc16(byte[] data, int len) { + int uchCRCHi = 0xff; + int uchCRCLo = 0xff; + int uIndex; + + for(int i=0;i displayBoxDataDTOList = deviceDisplayService.deviceDisplayBoxData("host",String.valueOf(0)); + for (DisplayBoxDataDTO displayBoxDataDTO : + displayBoxDataDTOList) { + log.info(displayBoxDataDTO.toString()); + } + } + + // 查询设备状态 + @Test + public void queryDeviceState() { + List deviceMessageList = deviceDisplayService.queryDeviceStatus("host"); + for (DeviceMessageDTO deviceMessage: + deviceMessageList){ + log.info(deviceMessage.toString()); + } + } + + + @Test + public void queryDeviceByOthers() { + List deviceManageEntityList = deviceManageService.queryDeviceByOther(1,10, "88"); + for (DeviceManageEntity deviceManage : + deviceManageEntityList) { + log.info(deviceManage.toString()); + } +// for (int i = 0; i < deviceManageEntityList.size(); i++) { +// if (deviceManageEntityList.get(i).getDeviceType().equalsIgnoreCase("1")) { // 1 代表广仪电表 +// // 生成电表指令 +// String meterOrderStr = GetReadOrder485.createMeterOrder("169.254.194.199","8080","2",deviceManageEntityList.get(i).getCollectionNum(),"1"); +// log.info("电表指令------" + meterOrderStr); +// } else if (deviceManageEntityList.get(i).getDeviceType().equalsIgnoreCase("3")) { // 3 代表冷量计 +// // 生成电表指令 +// String meterOrderStr = GetReadOrder485.createCloudOrder(deviceManageEntityList.get(i).getCollectionNum(),"34"); +// log.info("冷量计指令------" + meterOrderStr); +// } +// } + int count = deviceManageService.queryDeviceByOtherCount("88"); + log.info("总数: " + count); + } + + + @Autowired + DeviceManageMapper deviceManageMapper; + + @Test + public void queryByTest() { + List deviceManageEntityList = deviceManageMapper.queryDevicesByType1("manage"); + for (DeviceManageEntity deviceManage : + deviceManageEntityList) { + log.info(deviceManage.toString()); + } + } + +} diff --git a/user-service/src/test/java/com/mh/user/param/ParamTest.java b/user-service/src/test/java/com/mh/user/param/ParamTest.java new file mode 100644 index 0000000..a5a112c --- /dev/null +++ b/user-service/src/test/java/com/mh/user/param/ParamTest.java @@ -0,0 +1,41 @@ +package com.mh.user.param; + +import com.mh.user.constants.SocketMessage; +import com.mh.user.utils.TimeDifferenceUtil; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-21 + * @throws : + */ +@SpringBootTest +public class ParamTest { + + @Autowired + private SocketMessage socketMessage; + + @Test + public void getSocketMessage() { + System.out.println(socketMessage.getIP()); + } + + // 查询最近关闭冷却塔的时间 + + public static void main(String[] args) { + String str = "/192.168.1.222:8080"; + String regex = ":" + "(.*)" + ""; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(str); + while (matcher.find()) { + System.out.println(matcher.group(1)); + } + } +} diff --git a/user-service/src/test/java/com/mh/user/receive/AnalysisReceiveOrder485.java b/user-service/src/test/java/com/mh/user/receive/AnalysisReceiveOrder485.java new file mode 100644 index 0000000..d7bda0e --- /dev/null +++ b/user-service/src/test/java/com/mh/user/receive/AnalysisReceiveOrder485.java @@ -0,0 +1,292 @@ +package com.mh.user.receive; + +import com.mh.user.entity.ChillersEntity; +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.utils.CRC16; +import com.mh.user.utils.ExchangeStringUtil; +import com.mh.user.utils.SpringBeanUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 解析485接收的数据 + * @updateTime 2020-04-23 + * @throws : + */ +@Slf4j +public class AnalysisReceiveOrder485 { + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + + public void analysisCloudOrder485(String receiveData){ + + // 去掉空格 + receiveData = receiveData.replace(" ",""); + + // 检验报文 + String checkStr = receiveData.substring(0,receiveData.length()-4); + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); + + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length()-4))) { + + log.info("报文检验成功: " + receiveData); + + // IP地址 + String ip = checkStr.substring(0, 8); + // 端口号 + String port = checkStr.substring(8, 12); + // COM口 + String dataCom = checkStr.substring(12, 14); + // 数据 + String dataStr1 = checkStr.substring(14); + + // 检验报文 + String checkStr1 = dataStr1.substring(0, dataStr1.length() - 4); + byte[] strOrder1 = ExchangeStringUtil.hexStrToBinaryStr(checkStr1); + int checkNum1 = CRC16.CRC16_MODBUS(strOrder1); + String checkWord1 = ExchangeStringUtil.decToHex(String.valueOf(checkNum1)); + checkWord1 = checkWord1.substring(2, 4) + checkWord1.substring(0, 2); + if (checkWord1.equalsIgnoreCase(dataStr1.substring(dataStr1.length() - 4))) { + + // 时间 + //创建SimpleDateFormat对象,指定样式 2019-05-13 22:39:30 + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + log.info("时间: " + dateStr); + + // 表号 + String cloudId = ExchangeStringUtil.hexToDec(dataStr1.substring(0, 2)); + log.info("冷量计ID: " + cloudId); + + // 读数 + String data = dataStr1.substring(dataStr1.length() - 8, dataStr1.length() - 6) + + dataStr1.substring(dataStr1.length() - 6, dataStr1.length() - 4) + + dataStr1.substring(dataStr1.length() - 12, dataStr1.length() - 10) + + dataStr1.substring(dataStr1.length() - 10, dataStr1.length() - 8); + data = ExchangeStringUtil.hexToDec(data); + log.info("冷量计读数: " + data); + + try { + DeviceManageEntity deviceManageEntity = new DeviceManageEntity(); + deviceManageEntity.setDeviceNum(cloudId); + deviceManageEntity.setDeviceCode(cloudId); + deviceManageEntity.setLastValue(data); + deviceManageEntity.setLastDate(new Date()); + + } catch (Exception e) { + e.printStackTrace(); + } + + } + } + + } + + /** + * 解析电表返回的数据 + * @param receiveData + */ + public void analysisMeterOrder485(String receiveData){ + + // 返回值全部变成大写 + receiveData = receiveData.toUpperCase(); + // 去掉空格 + receiveData = receiveData.replace(" ",""); + + // 校验 + // 检验报文 + String checkStr1 = receiveData.substring(0, receiveData.length() - 4); + byte[] strOrder1 = ExchangeStringUtil.hexStrToBinaryStr(checkStr1); + int checkNum1 = CRC16.CRC16_MODBUS(strOrder1); + String checkWord1 = ExchangeStringUtil.decToHex(String.valueOf(checkNum1)); + checkWord1 = checkWord1.substring(2, 4) + checkWord1.substring(0, 2); + if (checkWord1.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { + + // IP地址 + String ip = receiveData.substring(0, 8); + // 端口号 + String port = receiveData.substring(8, 12); + // COM口 + String dataCom = receiveData.substring(12, 14); + // 数据 + String dataStr1 = receiveData.substring(14, receiveData.length() - 4); + + // 截取去掉FE + dataStr1 = dataStr1.replace("FE", ""); + + if (dataStr1.length() == 36 || dataStr1.length() == 40) { + + // 检验报文 + String checkStr = dataStr1.substring(0, dataStr1.length() - 4); + String checkNum = ExchangeStringUtil.makeChecksum(checkStr); + + if (checkNum.equalsIgnoreCase(dataStr1.substring(dataStr1.length() - 4, dataStr1.length() - 2))) { + + log.info("报文检验成功: " + dataStr1); + + // 时间 + //创建SimpleDateFormat对象,指定样式 2019-05-13 22:39:30 + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + log.info("时间: " + dateStr); + + String dataStr = checkStr; + // 表号 + String meterId = dataStr.substring(12, 14) + dataStr.substring(10, 12) + dataStr.substring(8, 10) + + dataStr.substring(6, 8) + dataStr.substring(4, 6) + dataStr.substring(2, 4); + meterId = String.format("%012d", Long.parseLong(meterId)); + log.info("电表表号: " + meterId); + + // 读数 + String data = ""; + for (int i = 0; i < 4; i++) { + String data1 = dataStr.substring(dataStr.length() - 2 * (i + 1), dataStr.length() - 2 * i); + data = data + data1; + } + data = ExchangeStringUtil.cutThree(data); + // 0 代表前面补充0 + // 4 代表长度为4 + // d 代表参数为正数型 + data = String.format("%08d", Long.parseLong(data)); + data = data.substring(0, 6) + "." + data.substring(6, 8); + log.info("电表读数: " + data); + + try { + DeviceManageEntity deviceManageEntity = new DeviceManageEntity(); + deviceManageEntity.setDeviceNum(meterId); + deviceManageEntity.setDeviceCode(meterId); + deviceManageEntity.setLastValue(data); + deviceManageEntity.setLastDate(new Date()); + + } catch (Exception e) { + e.printStackTrace(); + } + + } + } + } + + } + + /** + * 解析冷水机组返回的数据,返回值没有带寄存器地址,只有冷水机组地址 + * @param receiveData + */ + public void analysisChillerOrder485(String receiveData, ChillersEntity chillersEntity) { + + // 去掉空格 + receiveData = receiveData.replace(" ",""); + + // 检验报文 + String checkStr = receiveData.substring(0,receiveData.length()-4); + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); + + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length()-4))){ + + log.info("报文检验成功: " + receiveData); + + // IP地址 + String ip = checkStr.substring(0,8); + // 端口号 + String port = checkStr.substring(8,12); + // COM口 + String dataCom = checkStr.substring(12,14); + // 数据 + String dataStr1 = checkStr.substring(14,receiveData.length()-4); + // 校验采集回来的数据 + // 检验报文 + String checkStr1 = dataStr1.substring(0,dataStr1.length()-4); + byte[] strOrder1 = ExchangeStringUtil.hexStrToBinaryStr(checkStr1); + int checkNum1 = CRC16.CRC16_MODBUS(strOrder1); + String checkWord1 = ExchangeStringUtil.decToHex(String.valueOf(checkNum1)); + checkWord1 = checkWord1.substring(2,4) + checkWord1.substring(0,2); + +// String checkWord1 = ExchangeStringUtil.getCRCStr(dataStr1); + if (checkWord1.equalsIgnoreCase(dataStr1.substring(dataStr1.length()-4))) { + // 时间 + //创建SimpleDateFormat对象,指定样式 2019-05-13 22:39:30 + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + + String dataStr = dataStr1.substring(0,dataStr1.length()-4);; + + // 冷水机组的地址 + String chillerAddr = ExchangeStringUtil.hexToDec(dataStr.substring(0, 2)); + + String data = ""; + if (dataStr.substring(2, 4).equalsIgnoreCase("01")) { // 读取状态 + if (dataStr.length() == 8) { + + // 状态 + data = ExchangeStringUtil.hexToDec(dataStr.substring(6, 8)); + + log.info("时间: " + dateStr + ",冷水机组ID: " + chillerAddr + ",状态: " + data); + } + } else if (dataStr.substring(2, 4).equalsIgnoreCase("03") || dataStr.substring(2, 4).equalsIgnoreCase("04")) { + if (dataStr.length() == 10) { + + if (chillersEntity.getDigit() == 1) { + // 数据 + data = Double.toString(Integer.parseInt(ExchangeStringUtil.hexToDec(dataStr.substring(6, 10))) * 0.1); + } else { + // 数据 + data = ExchangeStringUtil.hexToDec(dataStr.substring(6, 10)); + } + log.info("时间: " + dateStr + ",冷水机组ID: " + chillerAddr + ",数值: " + data); + } + } + + // 赋值给ChillersEntity + chillersEntity.setDeviceNum(chillerAddr); + chillersEntity.setDeviceCode(chillerAddr); + chillersEntity.setCollectionNum(chillerAddr); + chillersEntity.setLastTime(dateStr); + chillersEntity.setLastValue(data); + + } + + } + + } + + + // 判断是否存在寄存器地址 + public Boolean queryRegisterAddr(List stringList, String registerAddr){ + boolean flag = false; + for (int i = 0; i < stringList.size(); i++) { + if (stringList.get(i).equalsIgnoreCase(registerAddr)) { + flag = true; + break; + } + } + return flag; + } + + public static void main(String[] args) { +// analysisMeterOrder485("FEFEFEFE6825110040010868810643C3443B3333C116"); +// analysisCloudOrder485("58 03 04 86 9F 00 01 EB 90"); + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); +// String readStr = "c0a8020a1f90ff02fd0000000100000200000300000400000500000600000700000800010900000a007d0b00010c90e50d00000e00000f0000100000110022120000132d1e140000150000160000170001182c381900001a01a61b00001c00001d00011e00011f25d120000121b7b12200002300002400002500002600712700002834202900002a00002b00002c00002d00402e00002f03632f88"; +// analysisReceiveOrder485.analysisChillersDDC(readStr); +// String readStr = "c0a8020a1f9002fefefefe6880025007000068810643c38c3433335c161fff"; +// analysisReceiveOrder485.analysisMeterOrder485(readStr); + String chillersStr = "A9 FE C2 C7 1F 90 01 01 03 02 00 00 B8 44 0F 49"; + analysisReceiveOrder485.analysisChillerOrder485(chillersStr,new ChillersEntity()); + } + +} diff --git a/user-service/src/test/java/com/mh/user/receive/receiveTest.java b/user-service/src/test/java/com/mh/user/receive/receiveTest.java new file mode 100644 index 0000000..a3d6610 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/receive/receiveTest.java @@ -0,0 +1,40 @@ +package com.mh.user.receive; + +import com.mh.user.entity.ChillersEntity; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +/** + * @Classname receiveTest + * @Description TODO + * @Date 2020-06-11 15:08 + * @Created by LJF + */ +@Slf4j +@SpringBootTest +public class receiveTest { + + @Test + public void receiveStr() { + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); +// String readStr = "c0a8020a1f90ff02fd0000000100000200000300000400000500000600000700000800010900000a007d0b00010c90e50d00000e00000f0000100000110022120000132d1e140000150000160000170001182c381900001a01a61b00001c00001d00011e00011f25d120000121b7b12200002300002400002500002600712700002834202900002a00002b00002c00002d00402e00002f03632f88"; +// String readStr = "c0a8020a1f90ff0ef100000001000002000003000004000005002906000007000008000e0900000a040d0b00000c00000d02380e00000f000010000311000012008c1300001400001502391600001700001800091900001a03e24e01"; +// String readStr = "c0a8020a1f9002fefefefe6880025007000068810643c38c3433335c161fff"; +// String readStr = "a9fec2c71f9002fefefefe6839025007000068810643c3b4446c338616c577"; + String readStr = "A9 FE C2 C7 1F 90 01 58 03 04 4A 30 00 53 65 1C C4 06"; + analysisReceiveOrder485.analysisCloudOrder485(readStr); + } + + @Test + public void testEntity() { + ChillersEntity chillersEntity = new ChillersEntity(); + chillersEntity.setDataCom("COM1111"); + test(chillersEntity); + } + + public void test(ChillersEntity chillersEntity) { + chillersEntity.setDdcAddr("123333"); + log.info(chillersEntity.toString()); + } +} diff --git a/user-service/src/test/java/com/mh/user/socket/BIOServer.java b/user-service/src/test/java/com/mh/user/socket/BIOServer.java new file mode 100644 index 0000000..91812eb --- /dev/null +++ b/user-service/src/test/java/com/mh/user/socket/BIOServer.java @@ -0,0 +1,86 @@ +package com.mh.user.socket; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * @author ljf + * @title : + * @description : 阻塞式编程 + * @updateTime 2020-04-20 + * @throws : + */ +public class BIOServer { + + // 引用线程池 + private static ExecutorService threadPool = Executors.newCachedThreadPool(); + + public static void main(String[] args) throws Exception { + ServerSocket sc = new ServerSocket(9093); + System.out.println("服务器启动成功!"); + while (!sc.isClosed()) { + Socket request = sc.accept(); // 阻塞 + System.out.println("收到新连接:" + request.toString()); + + // 引用线程池 + threadPool.execute(() -> { + try { + InputStream is = request.getInputStream(); // net+i/o + BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8")); + String msg; + while ((msg = reader.readLine()) != null) { // 没有数据会阻塞 + if (msg.length() == 0) { + break; + } + System.out.println(msg); + } + System.out.println("收到数据,来自:" + request.toString()); + + // 响应http结果 + // 响应结果 + OutputStream outputStream = request.getOutputStream(); + outputStream.write("HTTP/1.1 200 ok\r\n".getBytes()); + outputStream.write("Content-Length: 40\r\n\r\n".getBytes()); + outputStream.write("".getBytes()); + } catch (Exception e) { + // TODO: handle exception + } finally { + try { + request.close(); + } catch (Exception e2) { + // TODO: handle exception + } + } + }); + +// try { +// InputStream is = request.getInputStream(); // net+i/o +// BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8")); +// String msg; +// while ((msg = reader.readLine()) != null) { // 没有数据会阻塞 +// if (msg.length() == 0) { +// break; +// } +// System.out.println(msg); +// } +// System.out.println("收到数据,来自:" + request.toString()); +// } catch (Exception e) { +// // TODO: handle exception +// } finally { +// try { +// request.close(); +// } catch (Exception e2) { +// // TODO: handle exception +// } +// } + + } + } + +} diff --git a/user-service/src/test/java/com/mh/user/socket/NIOServer.java b/user-service/src/test/java/com/mh/user/socket/NIOServer.java new file mode 100644 index 0000000..06dc293 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/socket/NIOServer.java @@ -0,0 +1,246 @@ +package com.mh.user.socket; + +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Set; + +/** + * @author ljf + * @title : NIO 非阻塞式编程 + * @description : + * @updateTime 2020-04-20 + * @throws : + */ +@Slf4j +public class NIOServer { + + /** + * 已经建立连接的集合 + */ + private static ArrayList channels = new ArrayList<>(); + + public static void main(String[] args) throws IOException { + log.info("test"); + NIOServer nioServer = new NIOServer(); + // 缓冲测试 +// nioServer.BufferTest(); + // 通道测试 +// nioServer.ChannelTest(); + // Selector单线程操作 + nioServer.SelectorSingleTest(); + } + + // 缓冲区使用 + public void BufferTest(){ +// // 构建一个堆内字节缓冲区 +// ByteBuffer byteBuffer = ByteBuffer.allocate(4); + // 构建一个堆外字节缓冲区 + ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4); + // 默认写入模式,查看三个重要的指标 + log.info(String.format("初始化:capacity容量:%s, position位置:%s, limit限制:%s", byteBuffer.capacity(), + byteBuffer.position(), byteBuffer.limit())); + // 写入字节 + byteBuffer.put((byte) 1); + byteBuffer.put((byte) 2); + byteBuffer.put((byte) 3); + // 查看占用多少 + log.info(String.format("初始化:capacity容量:%s, position位置:%s, limit限制:%s", byteBuffer.capacity(), + byteBuffer.position(), byteBuffer.limit())); + + // 转换为读取方式(如果不调用buffer.flip方式,读取的顺序不对) + byteBuffer.flip(); + // 读取 + byte a = byteBuffer.get(); + log.info(""+a); + byte b = byteBuffer.get(); + log.info(""+b); + // 查看占用多少 + log.info(String.format("读取后的结果:capacity容量:%s, position位置:%s, limit限制:%s", byteBuffer.capacity(), + byteBuffer.position(), byteBuffer.limit())); + // 继续写入3字节,此时读模式下,limit=3,position=2.继续写入只能覆盖写入一条数据 + // clear()方法清除整个缓冲区。compact()方法仅清除已阅读的数据。转为写入模式 + byteBuffer.compact(); // buffer内部还残留1个数据,还可以写3个数据 + byteBuffer.put((byte) 3); + byteBuffer.put((byte) 4); + byteBuffer.put((byte) 5); + // 查看占用多少 + log.info(String.format("最终的结果:capacity容量:%s, position位置:%s, limit限制:%s", byteBuffer.capacity(), + byteBuffer.position(), byteBuffer.limit())); + } + + // Channel通道测试, 基于非阻塞式 + public void ChannelTest() throws IOException { + // 创建网络服务端 + ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); + // 设置成非阻塞式 + serverSocketChannel.configureBlocking(false); + // 绑定端口号 + serverSocketChannel.socket().bind(new InetSocketAddress(9093)); + log.info("启动成功"); + while(true){ + // 获取新tcp连接通道 + SocketChannel socketChannel = serverSocketChannel.accept(); +// // tcp 请求、响应 +// if (socketChannel != null){ +// log.info("收到新连接:"+serverSocketChannel.getLocalAddress()); +// // 设置非阻塞式 +// serverSocketChannel.configureBlocking(false); +// try { +// ByteBuffer requestBuffer = ByteBuffer.allocate(1024); +// while (socketChannel.isOpen() && socketChannel.read(requestBuffer) != -1) { +// // 长连接情况下,需要手动判断数据有没有读取结束 (此处做一个简单的判断: 超过0字节就认为请求结束了) +// if (requestBuffer.position() > 0) +// break; +// } +// if (requestBuffer.position() == 0) +// continue; // 如果没数据了, 则不继续后面的处理 +// requestBuffer.flip(); +// byte[] content = new byte[requestBuffer.limit()]; +// requestBuffer.get(content); +// log.info(new String(content)); +// log.info("收到数据,来自:" + socketChannel.getRemoteAddress()); +// +// // 响应结果 200 +// String response = "HTTP/1.1 200 OK\r\n" + "Content-Length: 11\r\n\r\n" + "Hello World"; +// ByteBuffer buffer = ByteBuffer.wrap(response.getBytes()); +// while (buffer.hasRemaining()) { +// socketChannel.write(buffer);// 非阻塞 +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } + // tcp请求 读取/响应 + if (socketChannel != null) { + log.info("收到新连接 : " + socketChannel.getRemoteAddress()); + socketChannel.configureBlocking(false); // 默认是阻塞的,一定要设置为非阻塞 + channels.add(socketChannel); + } else { + // 没有新连接的情况下,就去处理现有连接的数据,处理完的就删除掉 + Iterator iterator = channels.iterator(); + while (iterator.hasNext()) { + SocketChannel ch = iterator.next(); + try { + ByteBuffer requestBuffer = ByteBuffer.allocate(1024); + // 如果通道里没有数据,就没必要再继续下面的循环读取了 + if (ch.read(requestBuffer) == 0) { + // 等于0,代表这个通道没有数据需要处理,那就待会再处理 + continue; + } + while (ch.isOpen() && ch.read(requestBuffer) != -1) { + // 长连接情况下,需要手动判断数据有没有读取结束 (此处做一个简单的判断: 超过0字节就认为请求结束了) + if (requestBuffer.position() > 0) + break; + } + if (requestBuffer.position() == 0) + continue; // 如果没数据了, 则不继续后面的处理 + requestBuffer.flip(); + byte[] content = new byte[requestBuffer.limit()]; + requestBuffer.get(content); + log.info(new String(content)); + log.info("收到数据,来自:" + ch.getRemoteAddress()); + + // 响应结果 200 + String response = "HTTP/1.1 200 OK\r\n" + "Content-Length: 11\r\n\r\n" + "Hello World"; + ByteBuffer buffer = ByteBuffer.wrap(response.getBytes()); + while (buffer.hasRemaining()) { + ch.write(buffer); + } + iterator.remove(); + } catch (IOException e) { + e.printStackTrace(); + iterator.remove(); + } + } + } + } + } + + /** + * Selector多路复用器(单线程方式) 结合Selector实现的非阻塞服务端(放弃对channel的轮询,借助消息通知机制) + */ + public void SelectorSingleTest() throws IOException { + // 1、创建网络服务端ServerSocketChannel + ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); + // 设置为非阻塞模式 + serverSocketChannel.configureBlocking(false); + + // 2、创建一个Selector选择器,并将channel注册上去 + Selector selector = Selector.open(); + SelectionKey selectionKey = serverSocketChannel.register(selector,0,serverSocketChannel); // 注册 + selectionKey.interestOps(SelectionKey.OP_ACCEPT); // 对serverSocketChannel上面的accept事件感兴趣(serverSocketChannel只能支持accept操作) + + // 3、绑定端口 + serverSocketChannel.socket().bind(new InetSocketAddress(9093)); + + log.info("启动Selector程序成功"); + + while(true){ + // 不使用轮询通道的方式,使用.select方式阻塞效果,知道有通知才会有返回 + selector.select(); + // 获取事件 + Set selectionKeys = selector.selectedKeys(); + // 遍历查询结果 + Iterator iterator = selectionKeys.iterator(); + while (iterator.hasNext()){ + // 被封装的查询结果 + SelectionKey key = iterator.next(); + iterator.remove(); + // 关注Read和Accept事件 + if (key.isAcceptable()){ + ServerSocketChannel serverSocketChannel1 = (ServerSocketChannel) key.attachment(); + // 将拿到的客户端连接通信,注册到selector上面 + SocketChannel clientSocketChannel = serverSocketChannel1.accept(); // mainReactor轮询accept + clientSocketChannel.configureBlocking(false); // 设置非阻塞 + clientSocketChannel.register(selector,SelectionKey.OP_READ,clientSocketChannel); + log.info("收到新连接:"+clientSocketChannel.getRemoteAddress()); + } + // 读取数据 + if (key.isReadable()){ + SocketChannel socketChannel = (SocketChannel) key.attachment(); + try{ + ByteBuffer requestBuffer = ByteBuffer.allocate(1024); + while (socketChannel.isOpen() && socketChannel.read(requestBuffer) != -1){ + // 长时间连接情况下,需要手动进行数据判断,有没有读取结束,超过0字节就是请求结束 + if (requestBuffer.position() > 0){ + break; + } + if (requestBuffer.position() == 0) + continue; + requestBuffer.flip(); + byte[] content = new byte[requestBuffer.limit()]; + requestBuffer.get(content); + log.info(new String(content)); + log.info("收到数据,来自:"+socketChannel.getRemoteAddress()); + // 进行业务操作 + + //进行相应 + String response = "HTTP/1.1 200 OK\r\n" + + "Content-Length: 11\r\n\r\n" + + "Hello World"; + ByteBuffer buffer = ByteBuffer.wrap(response.getBytes()); + while (buffer.hasRemaining()) { + socketChannel.write(buffer); + } + } + }catch (IOException e){ + key.cancel();//取消消息订阅 + } + } + } + selector.selectNow(); + } + // 问题: 此处一个selector监听所有事件,一个线程处理所有请求事件. 会成为瓶颈! 要有多线程的运用 + } + +} + diff --git a/user-service/src/test/java/com/mh/user/socket/NIOServer2.java b/user-service/src/test/java/com/mh/user/socket/NIOServer2.java new file mode 100644 index 0000000..35af2e1 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/socket/NIOServer2.java @@ -0,0 +1,96 @@ +package com.mh.user.socket; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-04-20 + * @throws : + */ + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.Iterator; +import java.util.Set; + +/** + * 结合Selector实现的非阻塞服务端(放弃对channel的轮询,借助消息通知机制) + */ +public class NIOServer2 { + + public static void main(String[] args) throws Exception { + // 1. 创建网络服务端ServerSocketChannel + ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); + serverSocketChannel.configureBlocking(false); // 设置为非阻塞模式 + + // 2. 构建一个Selector选择器,并且将channel注册上去 + Selector selector = Selector.open(); + SelectionKey selectionKey = serverSocketChannel.register(selector, 0, serverSocketChannel);// 将serverSocketChannel注册到selector + selectionKey.interestOps(SelectionKey.OP_ACCEPT); // 对serverSocketChannel上面的accept事件感兴趣(serverSocketChannel只能支持accept操作) + + // 3. 绑定端口 + serverSocketChannel.socket().bind(new InetSocketAddress(8080)); + + System.out.println("启动成功"); + + while (true) { + // 不再轮询通道,改用下面轮询事件的方式.select方法有阻塞效果,直到有事件通知才会有返回 + selector.select(); + // 获取事件 + Set selectionKeys = selector.selectedKeys(); + // 遍历查询结果e + Iterator iter = selectionKeys.iterator(); + while (iter.hasNext()) { + // 被封装的查询结果 + SelectionKey key = iter.next(); + iter.remove(); + // 关注 Read 和 Accept两个事件 + if (key.isAcceptable()) { + ServerSocketChannel server = (ServerSocketChannel) key.attachment(); + // 将拿到的客户端连接通道,注册到selector上面 + SocketChannel clientSocketChannel = server.accept(); // mainReactor 轮询accept + clientSocketChannel.configureBlocking(false); + clientSocketChannel.register(selector, SelectionKey.OP_READ, clientSocketChannel); + System.out.println("收到新连接 : " + clientSocketChannel.getRemoteAddress()); + } + + if (key.isReadable()) { + SocketChannel socketChannel = (SocketChannel) key.attachment(); + try { + ByteBuffer requestBuffer = ByteBuffer.allocate(1024); + while (socketChannel.isOpen() && socketChannel.read(requestBuffer) != -1) { + // 长连接情况下,需要手动判断数据有没有读取结束 (此处做一个简单的判断: 超过0字节就认为请求结束了) + if (requestBuffer.position() > 0) break; + } + if(requestBuffer.position() == 0) continue; // 如果没数据了, 则不继续后面的处理 + requestBuffer.flip(); + byte[] content = new byte[requestBuffer.limit()]; + requestBuffer.get(content); + System.out.println(new String(content)); + System.out.println("收到数据,来自:" + socketChannel.getRemoteAddress()); + // TODO 业务操作 数据库 接口调用等等 + + // 响应结果 200 + String response = "HTTP/1.1 200 OK\r\n" + + "Content-Length: 11\r\n\r\n" + + "Hello World"; + ByteBuffer buffer = ByteBuffer.wrap(response.getBytes()); + while (buffer.hasRemaining()) { + socketChannel.write(buffer); + } + } catch (IOException e) { + // e.printStackTrace(); + key.cancel(); // 取消事件订阅 + } + } + } + selector.selectNow(); + } + // 问题: 此处一个selector监听所有事件,一个线程处理所有请求事件. 会成为瓶颈! 要有多线程的运用 + } +} diff --git a/user-service/src/test/java/com/mh/user/socket/NIOServerV3.java b/user-service/src/test/java/com/mh/user/socket/NIOServerV3.java new file mode 100644 index 0000000..74c103a --- /dev/null +++ b/user-service/src/test/java/com/mh/user/socket/NIOServerV3.java @@ -0,0 +1,204 @@ +package com.mh.user.socket; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.*; +import java.util.Iterator; +import java.util.Random; +import java.util.Set; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.FutureTask; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * NIO selector 多路复用reactor线程模型 + */ +public class NIOServerV3 { + /** 处理业务操作的线程 */ + private static ExecutorService workPool = Executors.newCachedThreadPool(); + + /** + * 封装了selector.select()等事件轮询的代码 + */ + abstract class ReactorThread extends Thread { + + Selector selector; + LinkedBlockingQueue taskQueue = new LinkedBlockingQueue<>(); + + /** + * Selector监听到有事件后,调用这个方法 + */ + public abstract void handler(SelectableChannel channel) throws Exception; + + private ReactorThread() throws IOException { + selector = Selector.open(); + } + + volatile boolean running = false; + + @Override + public void run() { + // 轮询Selector事件 + while (running) { + try { + // 执行队列中的任务 + Runnable task; + while ((task = taskQueue.poll()) != null) { + task.run(); + } + selector.select(1000); + + // 获取查询结果 + Set selected = selector.selectedKeys(); + // 遍历查询结果 + Iterator iter = selected.iterator(); + while (iter.hasNext()) { + // 被封装的查询结果 + SelectionKey key = iter.next(); + iter.remove(); + int readyOps = key.readyOps(); + // 关注 Read 和 Accept两个事件 + if ((readyOps & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0 || readyOps == 0) { + try { + SelectableChannel channel = (SelectableChannel) key.attachment(); + channel.configureBlocking(false); + handler(channel); + if (!channel.isOpen()) { + key.cancel(); // 如果关闭了,就取消这个KEY的订阅 + } + } catch (Exception ex) { + key.cancel(); // 如果有异常,就取消这个KEY的订阅 + } + } + } + selector.selectNow(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private SelectionKey register(SelectableChannel channel) throws Exception { + // 为什么register要以任务提交的形式,让reactor线程去处理? + // 因为线程在执行channel注册到selector的过程中,会和调用selector.select()方法的线程争用同一把锁 + // 而select()方法实在eventLoop中通过while循环调用的,争抢的可能性很高,为了让register能更快的执行,就放到同一个线程来处理 + FutureTask futureTask = new FutureTask<>(() -> channel.register(selector, 0, channel)); + taskQueue.add(futureTask); + return futureTask.get(); + } + + private void doStart() { + if (!running) { + running = true; + start(); + } + } + } + + private ServerSocketChannel serverSocketChannel; + // 1、创建多个线程 - accept处理reactor线程 (accept线程) + private ReactorThread[] mainReactorThreads = new ReactorThread[1]; + // 2、创建多个线程 - io处理reactor线程 (I/O线程) + private ReactorThread[] subReactorThreads = new ReactorThread[8]; + + /** + * 初始化线程组 + */ + private void newGroup() throws IOException { + // 创建IO线程,负责处理客户端连接以后socketChannel的IO读写 + for (int i = 0; i < subReactorThreads.length; i++) { + subReactorThreads[i] = new ReactorThread() { + @Override + public void handler(SelectableChannel channel) throws IOException { + // work线程只负责处理IO处理,不处理accept事件 + SocketChannel ch = (SocketChannel) channel; + ByteBuffer requestBuffer = ByteBuffer.allocate(1024); + while (ch.isOpen() && ch.read(requestBuffer) != -1) { + // 长连接情况下,需要手动判断数据有没有读取结束 (此处做一个简单的判断: 超过0字节就认为请求结束了) + if (requestBuffer.position() > 0) break; + } + if (requestBuffer.position() == 0) return; // 如果没数据了, 则不继续后面的处理 + requestBuffer.flip(); + byte[] content = new byte[requestBuffer.limit()]; + requestBuffer.get(content); + System.out.println(new String(content)); + System.out.println(Thread.currentThread().getName() + "收到数据,来自:" + ch.getRemoteAddress()); + + // TODO 业务操作 数据库、接口... + workPool.submit(() -> { + }); + + // 响应结果 200 + String response = "HTTP/1.1 200 OK\r\n" + + "Content-Length: 11\r\n\r\n" + + "Hello World"; + ByteBuffer buffer = ByteBuffer.wrap(response.getBytes()); + while (buffer.hasRemaining()) { + ch.write(buffer); + } + } + }; + } + + // 创建mainReactor线程, 只负责处理serverSocketChannel + for (int i = 0; i < mainReactorThreads.length; i++) { + mainReactorThreads[i] = new ReactorThread() { + AtomicInteger incr = new AtomicInteger(0); + + @Override + public void handler(SelectableChannel channel) throws Exception { + // 只做请求分发,不做具体的数据读取 + ServerSocketChannel ch = (ServerSocketChannel) channel; + SocketChannel socketChannel = ch.accept(); + socketChannel.configureBlocking(false); + // 收到连接建立的通知之后,分发给I/O线程继续去读取数据 + int index = incr.getAndIncrement() % subReactorThreads.length; + ReactorThread workEventLoop = subReactorThreads[index]; + workEventLoop.doStart(); + SelectionKey selectionKey = workEventLoop.register(socketChannel); + selectionKey.interestOps(SelectionKey.OP_READ); + System.out.println(Thread.currentThread().getName() + "收到新连接 : " + socketChannel.getRemoteAddress()); + } + }; + } + + + } + + /** + * 初始化channel,并且绑定一个eventLoop线程 + * + * @throws IOException IO异常 + */ + private void initAndRegister() throws Exception { + // 1、 创建ServerSocketChannel + serverSocketChannel = ServerSocketChannel.open(); + serverSocketChannel.configureBlocking(false); + // 2、 将serverSocketChannel注册到selector + int index = new Random().nextInt(mainReactorThreads.length); + mainReactorThreads[index].doStart(); + SelectionKey selectionKey = mainReactorThreads[index].register(serverSocketChannel); + selectionKey.interestOps(SelectionKey.OP_ACCEPT); + } + + /** + * 绑定端口 + * + * @throws IOException IO异常 + */ + private void bind() throws IOException { + // 1、 正式绑定端口,对外服务 + serverSocketChannel.bind(new InetSocketAddress(9093)); + System.out.println("启动完成,端口9093"); + } + + public static void main(String[] args) throws Exception { + NIOServerV3 nioServerV3 = new NIOServerV3(); + nioServerV3.newGroup(); // 1、 创建main和sub两组线程 + nioServerV3.initAndRegister(); // 2、 创建serverSocketChannel,注册到mainReactor线程上的selector上 + nioServerV3.bind(); // 3、 为serverSocketChannel绑定端口 + } +} \ No newline at end of file diff --git a/user-service/src/test/java/com/mh/user/socket/NettyClientTest.java b/user-service/src/test/java/com/mh/user/socket/NettyClientTest.java new file mode 100644 index 0000000..fdbc7c7 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/socket/NettyClientTest.java @@ -0,0 +1,44 @@ +package com.mh.user.socket; + +import com.mh.user.netty.NettyClient; +import com.mh.user.netty.NettyMeterClient; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +@SpringBootTest +public class NettyClientTest { + + @Test + void Test() throws InterruptedException { + NettyClient nettyClient = new NettyClient(); + nettyClient.connect(1008,"192.168.1.222"); +// Thread.sleep(5000); +// nettyClient.connect(10100,"192.168.1.222"); + } + + @Test + void Test1() throws InterruptedException { + NettyClient nettyClient = new NettyClient(); + nettyClient.connect(8080,"192.168.2.10"); +// Thread.sleep(5000); +// nettyClient.connect(10100,"192.168.1.222"); + } + + + @Test + void testMeterChillers() throws InterruptedException { + NettyMeterClient nettyMeterClient = new NettyMeterClient(); + nettyMeterClient.connect(8080,"192.168.2.10"); +// nettyMeterClient.connect(9000,"192.168.2.54"); + } + +} diff --git a/user-service/src/test/java/com/mh/user/socket/NettyEchoServer.java b/user-service/src/test/java/com/mh/user/socket/NettyEchoServer.java new file mode 100644 index 0000000..d7b285b --- /dev/null +++ b/user-service/src/test/java/com/mh/user/socket/NettyEchoServer.java @@ -0,0 +1,182 @@ +package com.mh.user.socket; + +import com.mh.user.utils.ExchangeStringUtil; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StringUtils; + +import java.io.IOException; +import java.net.InetSocketAddress; + + +/** + * @author ljf + * @title :Netty + * @description :netty 使用 + * @updateTime 2020-04-21 + * @throws : + */ +@Slf4j +public class NettyEchoServer { + + public void bind(int port) throws Exception { + // accept线程组,用来接收连接 + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + // IO 线程组,用来处理业务逻辑 + EventLoopGroup workerGroup = new NioEventLoopGroup(1); + + try { + // 服务端启动引导 + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap.group(bossGroup,workerGroup) // 绑定两个线程 + .channel(NioServerSocketChannel.class) // 指定通道类型 + .option(ChannelOption.SO_BACKLOG, 1024) // 设置TCP连接的缓冲区 + .handler(new LoggingHandler(LogLevel.INFO)) // 设置日志级别 + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + ChannelPipeline pipeline = socketChannel.pipeline(); // 获取处理器链 + pipeline.addLast(new EchoServerHandler()); // 添加新的事件处理器 + } + }); + // 通过bind启动服务 + ChannelFuture f = serverBootstrap.bind(port).sync(); + // 阻塞主线程,知道网络服务被关闭 + f.channel().closeFuture().sync(); + } catch (Exception e){ + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } + + static class EchoServerHandler extends ChannelHandlerAdapter { + + // 每当从客户端收到新的数据时,这个方法会在收到消息时被调用 + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + try { + ByteBuf buf = (ByteBuf)msg; + byte [] bytes = new byte[buf.readableBytes()]; + buf.readBytes(bytes);//复制内容到字节数组bytes + String receiveStr = ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 + log.info("接收到的数据: "+ receiveStr); + //返回16进制到客户端 + writeToClient(receiveStr,ctx,"测试"); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } +// ctx.write(Unpooled.wrappedBuffer("Server message".getBytes())); +// ctx.fireChannelRead(msg); + } + + // 数据读取完后被调用 + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + ctx.flush(); + } + + // 当Netty由于IO错误或者处理器在处理事件时抛出的异常时被调用 + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } + + /** + * 客户端与服务端第一次建立连接时 执行 + * + * @param ctx + * @throws Exception + */ + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception, IOException + { + super.channelActive(ctx); + ctx.channel().read(); + InetSocketAddress ifsock = (InetSocketAddress) ctx.channel().remoteAddress(); + String clientIp = ifsock.getAddress().getHostAddress(); + //此处不能使用ctx.close(),否则客户端始终无法与服务端建立连接 + log.info("channelActive: "+clientIp + ctx.name()); + } + + /** + * 客户端与服务端 断连时 执行 + * + * @param ctx + * @throws Exception + */ + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception, IOException + { + super.channelInactive(ctx); + InetSocketAddress ifsock = (InetSocketAddress) ctx.channel().remoteAddress(); + String clientIp = ifsock.getAddress().getHostAddress(); + ctx.close(); //断开连接时,必须关闭,否则造成资源浪费,并发量很大情况下可能造成宕机 + System.out.println("channelInactive:"+clientIp); + } + + /** + * 服务端当read超时, 会调用这个方法 + * + * @param ctx + * @param evt + * @throws Exception + */ + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception, IOException + { + super.userEventTriggered(ctx, evt); + InetSocketAddress ifsock = (InetSocketAddress) ctx.channel().remoteAddress(); + String clientIp = ifsock.getAddress().getHostAddress(); + ctx.close();//超时时断开连接 + System.out.println("userEventTriggered:"+clientIp); + } + + + /** + * 公用回写数据到客户端的方法 + * @param channel + * @param mark 用于打印/log的输出 + *
//channel.writeAndFlush(msg);//不行 + *
//channel.writeAndFlush(receiveStr.getBytes());//不行 + *
在netty里,进出的都是ByteBuf,楼主应确定服务端是否有对应的编码器,将字符串转化为ByteBuf + */ + private void writeToClient(final String receiveStr, ChannelHandlerContext channel, final String mark) { + try { + ByteBuf buff = Unpooled.buffer();//netty需要用ByteBuf传输 + buff.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(receiveStr));//对接需要16进制 + channel.writeAndFlush(buff).addListener(new ChannelFutureListener() { + @Override + public void operationComplete(ChannelFuture future) throws Exception { + StringBuilder sb = new StringBuilder(""); + if(!StringUtils.isEmpty(mark)){ + sb.append("【").append(mark).append("】"); + } + if (future.isSuccess()) { + System.out.println(sb.toString()+"回写成功"+receiveStr); + log.info(sb.toString()+"回写成功"+receiveStr); + } else { + System.out.println(sb.toString()+"回写失败"+receiveStr); + log.error(sb.toString()+"回写失败"+receiveStr); + } + } + }); + } catch (Exception e) { + e.printStackTrace(); + System.out.println("调用通用writeToClient()异常"+e.getMessage()); + log.error("调用通用writeToClient()异常:",e); + } + } + } +}