Browse Source

Merge remote-tracking branch 'origin/demo_' into demo_

2 years ago
parent
commit
4556a0446a
18 changed files with 310 additions and 112 deletions
  1. 13 0
      platform-common/src/main/java/com/platform/common/constant/RedisKeyConstants.java
  2. 33 0
      platform-dao/src/main/java/com/platform/dao/vo/export/remote/ExportRemoteOpcLogOneDayVO.java
  3. 5 41
      platform-dao/src/main/java/com/platform/dao/vo/export/remote/ExportRemoteOpcVO.java
  4. 9 0
      platform-dao/src/main/java/com/platform/dao/vo/query/remote/RemoteOpcLogVO.java
  5. 4 0
      platform-dao/src/main/java/com/platform/dao/vo/query/remote/RemoteOpcVO.java
  6. 2 15
      platform-dao/src/main/resources/mapper/remote/RemoteOpcLogMapper.xml
  7. 13 10
      platform-opc/src/main/java/com/platform/opc/servie/OpcInit.java
  8. 14 13
      platform-opc/src/main/java/com/platform/opc/servie/OpcService.java
  9. 3 2
      platform-opc/src/main/java/com/platform/opc/servie/OpcTask.java
  10. 11 15
      platform-opc/src/main/java/com/platform/opc/util/OpcDAClient.java
  11. 2 2
      platform-opc/src/main/java/org/openscada/opc/lib/da/Group.java
  12. 20 0
      platform-rest/src/main/java/com/platform/rest/controller/remote/RemoteOpcController.java
  13. 41 2
      platform-rest/src/main/java/com/platform/rest/controller/remote/RemoteOpcLogController.java
  14. 1 1
      platform-service/src/main/java/com/platform/service/big/impl/BigScreenSbInfoServiceImpl.java
  15. 30 11
      platform-service/src/main/java/com/platform/service/remote/RemoteOpcLogService.java
  16. 8 0
      platform-service/src/main/java/com/platform/service/remote/RemoteOpcService.java
  17. 83 0
      platform-service/src/main/java/com/platform/service/remote/impl/RemoteOpcLogServiceImpl.java
  18. 18 0
      platform-service/src/main/java/com/platform/service/remote/impl/RemoteOpcServiceImpl.java

+ 13 - 0
platform-common/src/main/java/com/platform/common/constant/RedisKeyConstants.java

@@ -73,4 +73,17 @@ public class RedisKeyConstants {
      */
     public static final String EXPIRE_BUSINESS_KEY_REPAIR_OVERTIME_STEP_THIRD = EXPIRE_BUSINESS_KEY_REPAIR_OVERTIME_PREFIX + "_third";
 
+
+    /**
+     * DCS数据存储前缀
+     */
+    public static final String DCS_PREFIX = "redis_opc_";
+
+    public static String redis_ok = "redis_ok";
+    public static String redis_opc_update_flag = "redis_opc_update_flag";
+    // 待采集点位列表
+    public static String redis_opc_wait_add_list = "redis_opc_wait_add_list";
+    // 待撤销点位列表
+    public static String redis_opc_wait_remove_list = "redis_opc_wait_remove_list";
+
 }

+ 33 - 0
platform-dao/src/main/java/com/platform/dao/vo/export/remote/ExportRemoteOpcLogOneDayVO.java

@@ -0,0 +1,33 @@
+package com.platform.dao.vo.export.remote;
+
+import com.platform.office.annotation.Excel;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @Description 设备电度记录表导出VO
+ * @Author xc
+ * @Date 2022-09-13 14:14:35
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+@Data
+@Accessors(chain = true)
+public class ExportRemoteOpcLogOneDayVO implements Serializable {
+
+    /**
+     * 时间
+     */
+    @Excel(name = "时间", orderNum = "1")
+    private String time;
+
+    /**
+     * 值
+     */
+    @Excel(name = "数值", orderNum = "2")
+    private String value;
+
+}

+ 5 - 41
platform-dao/src/main/java/com/platform/dao/vo/export/remote/ExportRemoteOpcVO.java

@@ -22,31 +22,25 @@ public class ExportRemoteOpcVO implements Serializable {
      * id
      */
     @Excel(name = "id")
-    private Integer id;
-
-    /**
-     * id
-     */
-    @Excel(name = "id")
-    private String sbId;
+    private String id;
 
     /**
      * 名称
      */
-    @Excel(name = "名称")
+    @Excel(name = "点位名称")
     private String sbName;
 
     /**
      * 点位
      */
     @Excel(name = "点位")
-    private Integer positionNum;
+    private String positionNum;
 
     /**
-     * 线路
+     * 车间
      */
     @Excel(name = "车间")
-    private Integer line;
+    private String positionName;
 
     /**
      * 类型
@@ -59,12 +53,6 @@ public class ExportRemoteOpcVO implements Serializable {
     @Excel(name = "描述")
     private String description;
 
-    /**
-     * 实时数值
-     */
-    @Excel(name = "实时数值")
-    private BigDecimal result;
-
     /**
      * 系数
      */
@@ -169,29 +157,5 @@ public class ExportRemoteOpcVO implements Serializable {
     @Excel(name = "备注")
     private String remark;
 
-    /**
-     * 创建人
-     */
-    @Excel(name = "创建人")
-    private String createdUserId;
-
-    /**
-     * 更新人
-     */
-    @Excel(name = "更新人")
-    private String updateUserId;
-
-    /**
-     * 创建日期
-     */
-    @Excel(name = "创建日期")
-    private LocalDateTime createdTime;
-
-    /**
-     * 更新日期
-     */
-    @Excel(name = "更新日期")
-    private LocalDateTime updateTime;
-
 
 }

+ 9 - 0
platform-dao/src/main/java/com/platform/dao/vo/query/remote/RemoteOpcLogVO.java

@@ -109,4 +109,13 @@ public class RemoteOpcLogVO extends BaseVO implements Serializable {
      */
     private String line;
 
+    /**
+     * 每日数据的json数组[{time:12:03,
+     *              data:20.0},
+     *            {time:12:03,
+     *              data:20.0}
+     *              *              ]
+     */
+    private String dataJsonStr;
+
 }

+ 4 - 0
platform-dao/src/main/java/com/platform/dao/vo/query/remote/RemoteOpcVO.java

@@ -163,6 +163,10 @@ public class RemoteOpcVO extends BaseVO implements Serializable {
      * 更新人
      */
     private String updateUserId;
+    /**
+     * 更新人
+     */
+    private String time;
     /**
      * 创建日期
      */

+ 2 - 15
platform-dao/src/main/resources/mapper/remote/RemoteOpcLogMapper.xml

@@ -108,28 +108,15 @@
             and opc_log.update_time = #{updateTime}
         </if>
         <if test="keyword != null and keyword != ''">
-            and (
-                opc.sb_name like concat(concat('%',#{keyword}),'%')
-                or opc_log.position_num like concat(concat('%',#{keyword}),'%')
-            )
-        </if>
-        <if test="sbName != null and sbName != ''">
-            and opc.sb_name like concat(concat('%',#{sbName}),'%')
-        </if>
-        <if test="line != null">
-            and opc.line = #{line}
+            and opc_log.position_num like concat(concat('%',#{keyword}),'%')
         </if>
     </sql>
     <select id="selectList" parameterType="com.platform.dao.dto.remote.RemoteOpcLogDTO"
             resultType="com.platform.dao.vo.query.remote.RemoteOpcLogVO">
-        select opc_log.*, opc.sb_name sbName, opc.line line, opc.type
+        select opc_log.*
         from t_remote_opc_log as opc_log
-        left join t_remote_opc opc on opc_log.position_num = opc.position_num
         <where>
             <include refid="List_Condition"/>
-            <if test="line != null">
-                and opc.line = #{line}
-            </if>
         </where>
     </select>
 

+ 13 - 10
platform-opc/src/main/java/com/platform/opc/servie/OpcInit.java

@@ -1,5 +1,6 @@
 package com.platform.opc.servie;
 
+import com.platform.common.constant.RedisKeyConstants;
 import com.platform.common.util.RedisUtils;
 import com.platform.dao.entity.remote.RemoteOpc;
 import com.platform.dao.enums.YesNoEnum;
@@ -44,7 +45,7 @@ public class OpcInit {
      */
     @PostConstruct
     public void initAddAllItem() {
-        RedisUtils.del(OpcDAClient.redis_ok);
+        RedisUtils.del(RedisKeyConstants.redis_ok);
         log.info("开始初始化分组");
         addGroupAndItems(findAllItems(true, null));
     }
@@ -52,12 +53,12 @@ public class OpcInit {
     /**
      * 立即新增点位:在新增点位后,点击立即生效按钮,这个时间不能再执行上面的addItems()方法
      * 立即取消点位:在点位,点击取消采集按钮
-     * 每10秒*
+     * 每100秒*
      */
-    @Scheduled(fixedDelay = 10000)
+    @Scheduled(fixedDelay = 100000)
     public void addAndDelItems() {
-        RedisUtils.setString(OpcDAClient.redis_opc_update_flag, "1");
-        List<String> list = RedisUtils.getList(OpcDAClient.redis_opc_wait_add_list, 0, -1);
+        RedisUtils.setString(RedisKeyConstants.redis_opc_update_flag, "1");
+        List<String> list = RedisUtils.getList(RedisKeyConstants.redis_opc_wait_add_list, 0, -1);
         if (!CollectionUtils.isEmpty(list)) {
             List<String> uniqueStr = list.stream().distinct().collect(Collectors.toList());
             if (!CollectionUtils.isEmpty(uniqueStr)) {
@@ -65,9 +66,9 @@ public class OpcInit {
                 log.info("开始添加新点位:");
             }
         }
-        RedisUtils.del(OpcDAClient.redis_opc_wait_add_list);
+        RedisUtils.del(RedisKeyConstants.redis_opc_wait_add_list);
 
-        List<String> removeList = RedisUtils.getList(OpcDAClient.redis_opc_wait_remove_list, 0, -1);
+        List<String> removeList = RedisUtils.getList(RedisKeyConstants.redis_opc_wait_remove_list, 0, -1);
         if (!CollectionUtils.isEmpty(removeList)) {
             List<RemoteOpc> remoteOpcList = findAllItems(false, removeList);
             if (!CollectionUtils.isEmpty(remoteOpcList)) {
@@ -78,8 +79,8 @@ public class OpcInit {
                 }
             }
         }
-        RedisUtils.del(OpcDAClient.redis_opc_wait_remove_list);
-        RedisUtils.del(OpcDAClient.redis_opc_update_flag);
+        RedisUtils.del(RedisKeyConstants.redis_opc_wait_remove_list);
+        RedisUtils.del(RedisKeyConstants.redis_opc_update_flag);
     }
 
     /**
@@ -119,7 +120,9 @@ public class OpcInit {
         List<RemoteOpc> remoteOpcFailList = new ArrayList<>();
         AddFailedException exception = OpcDAClient.addGroupList(listMap);
         if (exception != null) {
-            RedisUtils.setString(OpcDAClient.redis_ok, "0");
+            // 如果报错要清空这2个,不然获取数据和保存数据不动
+            RedisUtils.setString(RedisKeyConstants.redis_ok, "0");
+            RedisUtils.del(RedisKeyConstants.redis_opc_update_flag);
             Map<String, Integer> failedItems = exception.getErrors();
             Map<String, Item> addItems = exception.getItems();
             if (failedItems != null) {// 有不存在的item,需要更新对应的点位信息

+ 14 - 13
platform-opc/src/main/java/com/platform/opc/servie/OpcService.java

@@ -1,12 +1,14 @@
 package com.platform.opc.servie;
 
 import com.alibaba.fastjson.JSON;
+import com.platform.common.constant.RedisKeyConstants;
 import com.platform.common.util.DateUtils;
 import com.platform.common.util.RedisUtils;
 import com.platform.common.util.StringUtils;
 import com.platform.dao.entity.remote.RemoteOpcLog;
 import com.platform.dao.mapper.remote.RemoteOpcLogMapper;
 import com.platform.dao.mapper.remote.RemoteOpcMapper;
+import com.platform.dao.vo.query.remote.RemoteOpcVO;
 import com.platform.opc.entity.OpcResult;
 import com.platform.opc.util.OpcDAClient;
 import lombok.AllArgsConstructor;
@@ -45,35 +47,34 @@ public class OpcService {
     public void getValue(Group group) throws JIException {
         log.info("拉取-" + group.getName());
         log.info(Thread.currentThread().getName() + "-线程-" + group.getName() + new Date());
-        List<OpcResult> resultList = OpcDAClient.getItemValuesList(group);
-        RedisUtils.setString("opc-id-" + group.getName(), JSON.toJSONString(resultList));
+        List<RemoteOpcVO> resultList = OpcDAClient.getItemValuesList(group);
+        RedisUtils.setString(RedisKeyConstants.DCS_PREFIX + group.getName(), JSON.toJSONString(resultList));
         log.info("结束拉取" + group.getName());
     }
 
     /**
-     *
+     * 保存的不能异步,因为要写入数据库,必须同步执行
      */
-    @Async
     public void saveValue(String id) {
-        log.info("保存-" + id);
-        String jsonStr = RedisUtils.getString(id);
+        String jsonStr = RedisUtils.getString(RedisKeyConstants.DCS_PREFIX + id);
         if (StringUtils.isNotBlank(jsonStr)) {
-            List<OpcResult> resultList = JSON.parseArray(jsonStr, OpcResult.class);
+            log.info("保存-" + id);
+            List<RemoteOpcVO> resultList = JSON.parseArray(jsonStr, RemoteOpcVO.class);
             List<RemoteOpcLog> addOpcLogList = new ArrayList<>();
             List<RemoteOpcLog> updateRemoteOpcLogList = new ArrayList<>();
             Weekend<RemoteOpcLog> weekend = new Weekend<>(RemoteOpcLog.class);
             WeekendCriteria<RemoteOpcLog, Object> weekendCriteria = weekend.weekendCriteria();
             // 查询当天是否已经存在了,存在则追加,否则更新
             LocalDateTime time = LocalDateTime.now();
-            weekendCriteria.andIn(RemoteOpcLog::getPositionNum, resultList.stream().map(OpcResult::getId).collect(Collectors.toList()));
+            weekendCriteria.andIn(RemoteOpcLog::getPositionNum, resultList.stream().map(RemoteOpcVO::getPositionNum).collect(Collectors.toList()));
             weekendCriteria.andEqualTo(RemoteOpcLog::getYear, time.getYear());
             weekendCriteria.andEqualTo(RemoteOpcLog::getMonth, time.getMonthValue());
             weekendCriteria.andEqualTo(RemoteOpcLog::getDay, time.getDayOfMonth());
             List<RemoteOpcLog> checkList = remoteOpcLogMapper.selectByExample(weekend);
-            for (OpcResult result : resultList) {
+            for (RemoteOpcVO result : resultList) {
                 RemoteOpcLog remoteOpcLog = new RemoteOpcLog();
-                remoteOpcLog.setPositionNum(result.getId());
-                remoteOpcLog.setResult(new BigDecimal(result.getValue()));
+                remoteOpcLog.setPositionNum(result.getPositionNum());
+                remoteOpcLog.setResult(result.getResult());
                 LocalDateTime localDateTime = DateUtils.strToLocalDateTime(result.getTime(), DateUtils.PATTERN_YMD_HMS);
                 remoteOpcLog.setCreatedTime(localDateTime);
                 remoteOpcLog.setYear(localDateTime.getYear());
@@ -81,8 +82,8 @@ public class OpcService {
                 remoteOpcLog.setDay(localDateTime.getDayOfMonth());
                 // remoteOpcLog.setHour(localDateTime.getHour());
                 // remoteOpcLog.setMinute(localDateTime.getMinute());
-                remoteOpcLog.setRemark(result.getTime().split(" ")[1] + "," + result.getValue() + ";");
-                List<RemoteOpcLog> findItemList = checkList.stream().filter(remoteOpcLog1 -> remoteOpcLog1.getPositionNum().equals(result.getId())).collect(Collectors.toList());
+                remoteOpcLog.setRemark(result.getTime().split(" ")[1] + "," + result.getResult() + ";");
+                List<RemoteOpcLog> findItemList = checkList.stream().filter(remoteOpcLog1 -> remoteOpcLog1.getPositionNum().equals(result.getPositionNum())).collect(Collectors.toList());
                 if (!CollectionUtils.isEmpty(findItemList) && findItemList.size() > 0) {
                     updateRemoteOpcLogList.add(remoteOpcLog);
                 } else {

+ 3 - 2
platform-opc/src/main/java/com/platform/opc/servie/OpcTask.java

@@ -1,5 +1,6 @@
 package com.platform.opc.servie;
 
+import com.platform.common.constant.RedisKeyConstants;
 import com.platform.common.util.RedisUtils;
 import com.platform.common.util.StringUtils;
 import com.platform.dao.mapper.remote.RemoteOpcLogMapper;
@@ -29,7 +30,7 @@ public class OpcTask {
      */
     @Scheduled(fixedDelay = 2000)  //间隔2秒
     public void getValue() throws JIException {
-        String key = RedisUtils.getString(OpcDAClient.redis_opc_update_flag);
+        String key = RedisUtils.getString(RedisKeyConstants.redis_opc_update_flag);
         if(StringUtils.isBlank(key)){
             for (int i = 0; i < OpcDAClient.groupList.size(); i++) {
                 Group group = OpcDAClient.groupList.get(i);
@@ -47,7 +48,7 @@ public class OpcTask {
      */
     @Scheduled(fixedDelay = 300000)  //间隔300秒,5分钟保存一次数据到数据库,确保每天不超过700万数据
     public void saveValue() throws JIException {
-        String key = RedisUtils.getString(OpcDAClient.redis_opc_update_flag);
+        String key = RedisUtils.getString(RedisKeyConstants.redis_opc_update_flag);
         if(StringUtils.isBlank(key)){
             for (int i = 0; i < OpcDAClient.groupList.size(); i++) {
                 Group group = OpcDAClient.groupList.get(i);

+ 11 - 15
platform-opc/src/main/java/com/platform/opc/util/OpcDAClient.java

@@ -3,6 +3,7 @@ package com.platform.opc.util;
 import com.platform.common.util.BigDecimalUtil;
 import com.platform.common.util.DateUtils;
 import com.platform.dao.entity.remote.RemoteOpc;
+import com.platform.dao.vo.query.remote.RemoteOpcVO;
 import com.platform.opc.entity.OpcResult;
 import lombok.extern.slf4j.Slf4j;
 import org.jinterop.dcom.common.JIErrorCodes;
@@ -16,6 +17,7 @@ import org.openscada.opc.lib.da.*;
 import org.openscada.opc.lib.da.browser.FlatBrowser;
 import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
 import java.net.UnknownHostException;
 import java.util.*;
 import java.util.concurrent.Executors;
@@ -29,13 +31,6 @@ import java.util.stream.Collectors;
 @Slf4j
 public class OpcDAClient {
 
-    public static String redis_ok = "redis_ok";
-    public static String redis_opc_item_values = "redis_opc_item_values";
-    public static String redis_opc_update_flag = "redis_opc_update_flag";
-    // 待采集点位列表
-    public static String redis_opc_wait_add_list = "redis_opc_wait_add_list";
-    // 待撤销点位列表
-    public static String redis_opc_wait_remove_list = "redis_opc_wait_remove_list";
     public static String host = "192.168.108.108";
     public static String user = "Administrator";
     public static String password = "Hollysys";
@@ -151,10 +146,12 @@ public class OpcDAClient {
                         }
                     }
                     if (group == null) {
+                        log.info("追加分组line id: " + entry.getKey() + "");
                         group = server.addGroup(entry.getKey() + "");
                         groupList.add(group);
                     }
                 } else {
+                    log.info("新增分组line id: " + entry.getKey() + "");
                     group = server.addGroup(entry.getKey() + "");
                     groupList.add(group);
                 }
@@ -178,14 +175,13 @@ public class OpcDAClient {
                     itemArrList.put(entry.getKey() + "", oldList);
                 }
                 log.info("组建完成,开始查询数据...,组key:" + group.getName() + ", 组数量:" + itemArrList.get(entry.getKey() + "").size());
-
             }
         } catch (AddFailedException e) {
-            e.printStackTrace();
+            // e.printStackTrace();
             // 将不存在的点位信息保存到数据库,
             Map<String, Integer> errorsItemMap = e.getErrors();
             // e.printStackTrace();
-            log.error("添加点位出错,有不存在的点位,等待下次启动添加", e);
+            log.error("添加点位出错,有不存在的点位,等待下次启动添加");
             groupList = new ArrayList<>();
             itemArrList = new HashMap<>();
             return e;
@@ -297,8 +293,8 @@ public class OpcDAClient {
      * @param group:
      * @return
      */
-    public static List<OpcResult> getItemValuesList(Group group) {
-        List<OpcResult> resultList = new ArrayList<>();
+    public static List<RemoteOpcVO> getItemValuesList(Group group) {
+        List<RemoteOpcVO> resultList = new ArrayList<>();
         try {
             log.info("获取分组的数据: 组名:" + group.getName());
             Item[] items = itemArrList.get(group.getName()).toArray(new Item[0]);
@@ -306,11 +302,11 @@ public class OpcDAClient {
             Map<Item, ItemState> resultMap = group.read(true, items);
             //log.info("数据获取完成。数量:", resultMap.size() + ", 组序号:" + i);
             for (Item item : resultMap.keySet()) {
-                OpcResult result = new OpcResult();
+                RemoteOpcVO result = new RemoteOpcVO();
                 ItemState itemMap = resultMap.get(item);
                 String value = getVal(itemMap.getValue());
-                result.setId(item.getId());
-                result.setValue(value);
+                result.setPositionNum(item.getId());
+                result.setResult(new BigDecimal(value));
                 result.setTime(DateUtils.dateToString(itemMap.getTimestamp().getTime()));
                 // log.info("id: " + item.getId() + ", value: " + value + ", timestamp: " + itemMap.getTimestamp());
                 resultList.add(result);

+ 2 - 2
platform-opc/src/main/java/org/openscada/opc/lib/da/Group.java

@@ -194,10 +194,10 @@ public class Group {
 
         // if we have failed items then throw an exception with the result
         if (failedItems.size() != 0) {
-            log.error("错误点位数量: " + failedItems.size());
+            /*log.error("错误点位数量: " + failedItems.size());
             for (Map.Entry<String, Integer> entry : failedItems.entrySet()) {
                 log.error("key: " + entry.getKey() + ", value: " + entry.getValue());
-            }
+            }*/
             throw new AddFailedException(failedItems, findItems(foundItems));
         }
 

+ 20 - 0
platform-rest/src/main/java/com/platform/rest/controller/remote/RemoteOpcController.java

@@ -1,9 +1,12 @@
 package com.platform.rest.controller.remote;
 
+import com.alibaba.fastjson.JSON;
 import com.platform.common.bean.AbstractPageResultBean;
+import com.platform.common.constant.RedisKeyConstants;
 import com.platform.common.util.BeanConverterUtil;
 import com.platform.common.util.R;
 import com.platform.common.util.RedisUtils;
+import com.platform.common.util.StringUtils;
 import com.platform.common.validation.group.AddGroup;
 import com.platform.common.validation.group.UpdateGroup;
 import com.platform.dao.dto.remote.RemoteOpcDTO;
@@ -182,6 +185,23 @@ public class RemoteOpcController {
         return new R<>(remoteMeasureService.selectList(remoteMeasureDTO));
     }
 
+
+    /**
+     * 获取实时数据列表,从redis里面获取
+     *
+     * @param remoteMeasureDTO opc点位对应表DTO
+     * @return R
+     */
+    @GetMapping("/redis")
+    public R queryFromRedis(RemoteOpcDTO remoteMeasureDTO) {
+        String jsonStr = RedisUtils.getString(RedisKeyConstants.DCS_PREFIX + remoteMeasureDTO.getLine());
+        if (StringUtils.isNotBlank(jsonStr)) {
+            List<RemoteOpcVO> resultList = JSON.parseArray(jsonStr, RemoteOpcVO.class);
+            return new R<>(resultList);
+        }
+        return new R<>(remoteMeasureService.selectList(remoteMeasureDTO));
+    }
+
     /**
      * opc点位对应表导出
      *

+ 41 - 2
platform-rest/src/main/java/com/platform/rest/controller/remote/RemoteOpcLogController.java

@@ -1,5 +1,7 @@
 package com.platform.rest.controller.remote;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.platform.common.bean.AbstractPageResultBean;
 import com.platform.common.util.BeanConverterUtil;
 import com.platform.common.util.R;
@@ -8,6 +10,7 @@ import com.platform.common.validation.group.UpdateGroup;
 import com.platform.dao.dto.remote.RemoteOpcLogDTO;
 import com.platform.dao.entity.remote.RemoteOpcLog;
 import com.platform.dao.util.ExcelUtil;
+import com.platform.dao.vo.export.remote.ExportRemoteOpcLogOneDayVO;
 import com.platform.dao.vo.export.remote.ExportRemoteOpcLogVO;
 import com.platform.dao.vo.query.remote.RemoteOpcLogVO;
 import com.platform.rest.log.annotation.SysLog;
@@ -18,6 +21,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -40,8 +44,19 @@ public class RemoteOpcLogController {
      * @return R
      */
     @GetMapping("/{id}")
-    public R<RemoteOpcLog> getById(@PathVariable("id") String id) {
-        return new R<>(remoteOpcLogService.getModelById(id));
+    public R getById(@PathVariable("id") String id) {
+        return new R(remoteOpcLogService.getVOById(id));
+    }
+
+    /**
+     * 通过点位,日期查询单条记录
+     *
+     * @param remoteOpcLogDTO 主键
+     * @return R
+     */
+    @GetMapping("/dto")
+    public R getByDTO(RemoteOpcLogDTO remoteOpcLogDTO) {
+        return new R(remoteOpcLogService.getVOByDTO(remoteOpcLogDTO));
     }
 
     /**
@@ -137,6 +152,30 @@ public class RemoteOpcLogController {
         ExcelUtil.exportResponseDict(response, ExportRemoteOpcLogVO.class, BeanConverterUtil.copyListProperties(list, ExportRemoteOpcLogVO.class), "opc记录表");
     }
 
+    /**
+     * opc记录表导出-导出某个点位的某天数据
+     *
+     * @param remoteOpcLogDTO opc记录表DTO
+     * @return R
+     */
+    @GetMapping("/export/oneDay")
+    @SysLog("opc导出某个点位的某天数据")
+    @PreAuthorize("@pms.hasPermission('remote-opc-logs-export')")
+    public void exportOneDay(HttpServletResponse response, RemoteOpcLogDTO remoteOpcLogDTO) {
+        RemoteOpcLogVO vo = remoteOpcLogService.getVOById(remoteOpcLogDTO.getId().toString());
+        String str = vo.getDataJsonStr();
+        JSONArray array = JSONArray.parseArray(str);
+        List<ExportRemoteOpcLogOneDayVO> list = new ArrayList<>();
+        for (int i = 0; i < array.size(); i++) {
+            JSONObject jsonObject = array.getJSONObject(i);
+            ExportRemoteOpcLogOneDayVO data = new ExportRemoteOpcLogOneDayVO();
+            data.setTime(jsonObject.getString("time"));
+            data.setValue(jsonObject.getString("value"));
+            list.add(data);
+        }
+        ExcelUtil.exportResponseDict(response, ExportRemoteOpcLogOneDayVO.class, list, vo.getSbName() + "-" + vo.getYear() + "年" +  vo.getMonth() + "月" +vo.getDay() + "日");
+    }
+
     /**
      * 查询某个点位当日的实时数据,最多300多个点
      * @param RemoteOpcLogDTO opc记录表DTO

+ 1 - 1
platform-service/src/main/java/com/platform/service/big/impl/BigScreenSbInfoServiceImpl.java

@@ -290,7 +290,7 @@ public class BigScreenSbInfoServiceImpl extends BaseServiceImpl<SbInfoMapper, Sb
             }
         } else {// 月:统计每天的:需要当天0点减去前天0点的:注意23号0点减去22号0点,是22号的
             LocalDate localDate = LocalDate.of(record.getYear(), record.getMonth(), 1);
-            int nowDay = localDate.getDayOfMonth();
+            int nowDay = LocalDate.now().getDayOfMonth();
             int days = localDate.lengthOfMonth();
 
             // 找到下个月1号晚上0点的,用来计算这个月最后一天的耗电量

+ 30 - 11
platform-service/src/main/java/com/platform/service/remote/RemoteOpcLogService.java

@@ -17,16 +17,33 @@ import java.util.List;
  */
 public interface RemoteOpcLogService extends IBaseService<RemoteOpcLog, RemoteOpcLogDTO> {
 
-   /**
-    * 批量删除
-    *
-    * @param ids :
-    * @return :
-    */
+    /**
+     * 获取明细
+     *
+     * @param id
+     * @return
+     */
+    RemoteOpcLogVO getVOById(String id);
+
+    /**
+     * 获取明细
+     *
+     * @param record
+     * @return
+     */
+    RemoteOpcLogVO getVOByDTO(RemoteOpcLogDTO record);
+
+    /**
+     * 批量删除
+     *
+     * @param ids :
+     * @return :
+     */
     int batchDelete(List<String> ids);
 
     /**
      * 分页查询
+     *
      * @param record
      * @param pageNum
      * @param pageSize
@@ -36,15 +53,17 @@ public interface RemoteOpcLogService extends IBaseService<RemoteOpcLog, RemoteOp
 
     /**
      * 分页查询
+     *
      * @param record
      * @return
      */
     List<RemoteOpcLogVO> selectList(RemoteOpcLogDTO record);
 
- /**
-  * 分页查询
-  * @param remoteOpcLogDTO
-  * @return
-  */
+    /**
+     * 分页查询
+     *
+     * @param remoteOpcLogDTO
+     * @return
+     */
     List<RemoteOpcLogHistoryVO> selectListHistory(RemoteOpcLogDTO remoteOpcLogDTO);
 }

+ 8 - 0
platform-service/src/main/java/com/platform/service/remote/RemoteOpcService.java

@@ -25,6 +25,14 @@ public interface RemoteOpcService extends IBaseService<RemoteOpc, RemoteOpcDTO>
      */
     int batchDelete(List<String> ids);
 
+    /**
+     * 批量删除
+     *
+     * @param positionNum :
+     * @return :
+     */
+    RemoteOpc selectByPositionNum(String positionNum);
+
     /**
      * 分页查询
      *

+ 83 - 0
platform-service/src/main/java/com/platform/service/remote/impl/RemoteOpcLogServiceImpl.java

@@ -1,12 +1,16 @@
 package com.platform.service.remote.impl;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.platform.common.bean.AbstractPageResultBean;
 import com.platform.common.exception.BusinessException;
+import com.platform.common.util.BeanConverterUtil;
 import com.platform.common.util.DateUtils;
 import com.platform.common.util.IdGeneratorUtils;
 import com.platform.dao.bean.MyPage;
 import com.platform.dao.dto.remote.RemoteOpcLogDTO;
+import com.platform.dao.entity.remote.RemoteOpc;
 import com.platform.dao.entity.remote.RemoteOpcLog;
 import com.platform.dao.mapper.remote.RemoteOpcLogMapper;
 import com.platform.dao.mapper.upms.SysDictMapper;
@@ -14,9 +18,12 @@ import com.platform.dao.vo.query.remote.RemoteOpcLogHistoryVO;
 import com.platform.dao.vo.query.remote.RemoteOpcLogVO;
 import com.platform.service.base.impl.BaseServiceImpl;
 import com.platform.service.remote.RemoteOpcLogService;
+import com.platform.service.remote.RemoteOpcService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+import sun.swing.StringUIClientPropertyKey;
 import tk.mybatis.mapper.weekend.Weekend;
 import tk.mybatis.mapper.weekend.WeekendCriteria;
 
@@ -36,6 +43,82 @@ import java.util.List;
 @Service("remoteOpcLogService")
 public class RemoteOpcLogServiceImpl extends BaseServiceImpl<RemoteOpcLogMapper, RemoteOpcLog, RemoteOpcLogDTO> implements RemoteOpcLogService {
 
+    private final RemoteOpcService remoteOpcService;
+
+    @Override
+    public RemoteOpcLogVO getVOById(String id) {
+        RemoteOpcLog log = mapper.selectByPrimaryKey(id);
+        RemoteOpc remoteOpc = remoteOpcService.selectByPositionNum(log.getPositionNum());
+        log.setSbId(remoteOpc.getId());
+        log.setSbName(remoteOpc.getSbName());
+        log.setUnit(remoteOpc.getUnit());
+        log.setRatio(remoteOpc.getRatio());
+        log.setType(remoteOpc.getType());
+        log.setDescription(remoteOpc.getDescription());
+        RemoteOpcLogVO vo = BeanConverterUtil.copyObjectProperties(log, RemoteOpcLogVO.class);
+        if(!StringUtils.isEmpty(log.getRemark())){
+            String[] remarks = log.getRemark().split(";");
+            JSONArray array = new JSONArray();
+            for(String remark:remarks){
+                String[] data = remark.split(",");
+                JSONObject object = new JSONObject();
+                object.put("time",data[0] );
+                object.put("value",data[1] + "");
+                array.add(object);
+            }
+            vo.setDataJsonStr(array.toJSONString());
+        }
+        return vo;
+    }
+
+    /**
+     * 默认查询当天
+     * *
+     * @param record
+     * @return
+     */
+    @Override
+    public RemoteOpcLogVO getVOByDTO(RemoteOpcLogDTO record) {
+        if(record.getYear() == null){
+            LocalDateTime localDateTime = LocalDateTime.now();
+            record.setYear(localDateTime.getYear());
+            record.setMonth(localDateTime.getMonthValue());
+            record.setDay(localDateTime.getDayOfMonth());
+        }
+        Weekend<RemoteOpcLog> weekend = new Weekend<>(RemoteOpcLog.class);
+        WeekendCriteria<RemoteOpcLog, Object> weekendCriteria = weekend.weekendCriteria();
+        weekendCriteria.andEqualTo(RemoteOpcLog::getPositionNum, record.getPositionNum())
+                .andEqualTo(RemoteOpcLog::getYear, record.getYear())
+                .andEqualTo(RemoteOpcLog::getMonth, record.getMonth())
+                .andEqualTo(RemoteOpcLog::getDay, record.getDay());
+        RemoteOpcLog log = mapper.selectOneByExample(weekend);
+        RemoteOpc remoteOpc = remoteOpcService.selectByPositionNum(record.getPositionNum());
+        if(log == null){
+            log = new RemoteOpcLog();
+            log.setPositionNum(record.getPositionNum());
+        }
+        log.setSbId(remoteOpc.getId());
+        log.setSbName(remoteOpc.getSbName());
+        log.setUnit(remoteOpc.getUnit());
+        log.setRatio(remoteOpc.getRatio());
+        log.setType(remoteOpc.getType());
+        log.setDescription(remoteOpc.getDescription());
+        RemoteOpcLogVO vo = BeanConverterUtil.copyObjectProperties(log, RemoteOpcLogVO.class);
+        if(!StringUtils.isEmpty(log.getRemark())){
+            String[] remarks = log.getRemark().split(";");
+            JSONArray array = new JSONArray();
+            for(String remark:remarks){
+                String[] data = remark.split(",");
+                JSONObject object = new JSONObject();
+                object.put("time",data[0] );
+                object.put("value",data[1] + "");
+                array.add(object);
+            }
+            vo.setDataJsonStr(array.toJSONString());
+        }
+        return vo;
+    }
+
     @Override
     public int batchDelete(List<String> ids) {
         Weekend<RemoteOpcLog> weekend = new Weekend<>(RemoteOpcLog.class);

+ 18 - 0
platform-service/src/main/java/com/platform/service/remote/impl/RemoteOpcServiceImpl.java

@@ -123,6 +123,24 @@ public class RemoteOpcServiceImpl extends BaseServiceImpl<RemoteOpcMapper, Remot
         return 1;
     }
 
+    /**
+     * *
+     * @param positionNum :
+     * @return
+     */
+    @Override
+    public RemoteOpc selectByPositionNum(String positionNum) {
+        Weekend<RemoteOpc> weekend = new Weekend<>(RemoteOpc.class);
+        WeekendCriteria<RemoteOpc, Object> weekendCriteria = weekend.weekendCriteria();
+        weekendCriteria.andEqualTo(RemoteOpc::getPositionNum, positionNum);
+        // 同一个点位会存在多个点位值,不同车间绑定了同一个点位,在发起分组的时候,要按照分组来获取数据?
+        List<RemoteOpc> remoteOpcList = mapper.selectByExample(weekend);
+        if(!CollectionUtils.isEmpty(remoteOpcList)){
+            return remoteOpcList.get(0);
+        }
+        return null;
+    }
+
     @Override
     public AbstractPageResultBean<RemoteOpcVO> selectPageList(RemoteOpcDTO record, int pageNum, int pageSize) {
         PageHelper.startPage(pageNum, pageSize);