Browse Source

优化opc

hfxc226 2 years ago
parent
commit
0fb8ae2f25

+ 3 - 1
platform-common/src/main/java/com/platform/common/enums/DictTypeEnum.java

@@ -33,7 +33,9 @@ public enum DictTypeEnum {
     THIRD_PARTY_YONGYOU_OTHEROUT("OTHEROUT", "出库申请单"),
     REMOTE_MEASURE("REMOTE_MEASURE", "设备遥测"),
     REMOTE_DEGREE("REMOTE_DEGREE", "设备电度"),
-    REMOTE_LINE("REMOTE_LINE", "设备线路");
+    REMOTE_LINE("REMOTE_LINE", "设备线路"),
+    REMOTE_OPC("REMOTE_OPC", "设备OPC"),
+    REMOTE_OPC_LINE("REMOTE_OPC", "设备OPC对应车间");
     private final String type;
     private final String typeName;
 

+ 119 - 0
platform-dao/src/main/java/com/platform/dao/dto/remote/RemoteOpcDTO.java

@@ -0,0 +1,119 @@
+package com.platform.dao.dto.remote;
+
+import com.platform.common.bean.BaseDTO;
+import com.platform.common.validation.group.UpdateGroup;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @Description opc点位 对应表DTO
+ * @Author xc
+ * @Date 2022-09-13 14:15:40
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+public class RemoteOpcDTO extends BaseDTO implements Serializable {
+
+    /**
+     * 是否模拟量:0否1是
+     */
+    private Integer avFlag;
+    /**
+     * opc服务器上是否已经创建:0否1是
+     */
+    private Integer createdFlag;
+    /**
+     * json数据
+     */
+    private String info;
+    /**
+     * id
+     */
+    @NotNull(groups = {UpdateGroup.class}, message = "ID不能为空")
+    private String id;
+    /**
+     * 设备id
+     */
+    private String sbId;
+    /**
+     * 设备名称
+     */
+    private String sbName;
+    /**
+     * 点位
+     */
+    private String positionNum;
+    /**
+     * 线路
+     */
+    private Integer line;
+    /**
+     * 类型
+     */
+    private Integer type;
+    /**
+     * 描述
+     */
+    private String description;
+    /**
+     * 实时数值
+     */
+    private String result;
+    /**
+     * 系数
+     */
+    private BigDecimal ratio;
+    /**
+     * 单位
+     */
+    private String unit;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 创建人
+     */
+    private String createdUserId;
+    /**
+     * 更新人
+     */
+    private String updateUserId;
+    /**
+     * 创建日期
+     */
+    private LocalDateTime createdTime;
+    /**
+     * 创建日期开始
+     */
+    private LocalDateTime createdTimeStart;
+    /**
+     * 创建日期结束
+     */
+    private LocalDateTime createdTimeEnd;
+    /**
+     * 更新日期
+     */
+    private LocalDateTime updateTime;
+    /**
+     * 更新日期开始
+     */
+    private LocalDateTime updateTimeStart;
+    /**
+     * 更新日期结束
+     */
+    private LocalDateTime updateTimeEnd;
+    /**
+     * 关键字
+     */
+    private String keyword;
+
+}

+ 105 - 0
platform-dao/src/main/java/com/platform/dao/entity/remote/RemoteOpc.java

@@ -0,0 +1,105 @@
+package com.platform.dao.entity.remote;
+
+import com.platform.common.bean.DataScope;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @Description 设备遥测对应表实体类
+ * @Author xc
+ * @Date 2022-09-13 14:15:40
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+@Data
+@Accessors(chain = true)
+@Table(name = "t_remote_opc")
+public class RemoteOpc implements Serializable {
+
+    /**
+     * 是否模拟量:0否1是
+     */
+    private Integer avFlag;
+    /**
+     * opc服务器上是否已经创建:0否1是
+     */
+    private Integer createdFlag;
+    /**
+     * json数据
+     */
+    private String info;
+    /**
+     * id
+     */
+    @Id
+    private String id;
+    /**
+     * 设备id
+     */
+    private String sbId;
+    /**
+     * 设备名称
+     */
+    private String sbName;
+    /**
+     * 点位
+     */
+    private String positionNum;
+    /**
+     * 线路
+     */
+    private Integer line;
+    /**
+     * 类型
+     */
+    private Integer type;
+    /**
+     * 描述
+     */
+    private String description;
+    /**
+     * 实时数值
+     */
+    private String result;
+    /**
+     * 系数
+     */
+    private BigDecimal ratio;
+    /**
+     * 单位
+     */
+    private String unit;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 创建人
+     */
+    private String createdUserId;
+    /**
+     * 更新人
+     */
+    private String updateUserId;
+    /**
+     * 创建日期
+     */
+    private LocalDateTime createdTime;
+    /**
+     * 更新日期
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 数据权限
+     */
+    @Transient
+    private DataScope dataScope;
+
+}

+ 28 - 0
platform-dao/src/main/java/com/platform/dao/mapper/remote/RemoteOpcMapper.java

@@ -0,0 +1,28 @@
+package com.platform.dao.mapper.remote;
+
+import com.platform.dao.config.MyMapper;
+import com.platform.dao.dto.remote.RemoteOpcDTO;
+import com.platform.dao.entity.remote.RemoteOpc;
+import com.platform.dao.vo.query.remote.RemoteOpcVO;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+
+/**
+ * @Description 设备遥测对应表 mapper
+ * @Author xc
+ * @Date 2022-09-13 14:15:40
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+@Component
+public interface RemoteOpcMapper extends MyMapper<RemoteOpc> {
+    /**
+     * 分页查询
+     * @param dto
+     * @return
+     */
+    List<RemoteOpcVO> selectList(RemoteOpcDTO dto);
+
+    void updateBatch(List<RemoteOpc> updateMessage);
+}

+ 60 - 0
platform-dao/src/main/java/com/platform/dao/util/CustomExcelImportUtil.java

@@ -11,6 +11,7 @@ import com.platform.dao.entity.part.PartInfo;
 import com.platform.dao.entity.purchase.*;
 import com.platform.dao.entity.remote.RemoteDegree;
 import com.platform.dao.entity.remote.RemoteMeasure;
+import com.platform.dao.entity.remote.RemoteOpc;
 import com.platform.dao.entity.sb.SbInfo;
 import com.platform.dao.entity.sb.SbModel;
 import com.platform.dao.entity.sqarepartmanage.SparePartInfo;
@@ -1071,6 +1072,65 @@ public class CustomExcelImportUtil {
         return result;
     }
 
+    /**
+     * 导入opc点位对应表-新增
+     * @param inputstream
+     * @return
+     * @throws IOException
+     * @throws InvalidFormatException
+     */
+    public static List<RemoteOpc> importRemoteOpcList(InputStream inputstream) throws IOException, InvalidFormatException {
+        if (inputstream == null) {
+            return Collections.emptyList();
+        }
+        Workbook book = null;
+        if (!(inputstream.markSupported())) {
+            inputstream = new PushbackInputStream(inputstream, 8);
+        }
+        if (POIFSFileSystem.hasPOIFSHeader(inputstream)) {
+            book = new HSSFWorkbook(inputstream);
+        } else if (POIXMLDocument.hasOOXMLHeader(inputstream)) {
+            book = new XSSFWorkbook(OPCPackage.open(inputstream));
+        }
+        Sheet sheet = book.getSheetAt(0);
+        int rowCounts = sheet.getLastRowNum();
+        List<RemoteOpc> result = new ArrayList<>(rowCounts);
+        RemoteOpc record = null;
+
+        StringBuffer error = new StringBuffer();
+        for (int i = 1; i <= rowCounts; i++) {
+            record = new RemoteOpc();
+            Row row = sheet.getRow(i);
+            if(isRowEmpty(row)){
+                continue;
+            }
+
+            String index = getCellValue(row.getCell(0)) + "";
+            try {
+                //i,j i:行 j:列
+                record.setId(IdGeneratorUtils.getObjectId());
+                record.setPositionNum(getCellValue(row.getCell(0)));
+                if(StringUtils.isBlank(record.getPositionNum())){
+                    continue;
+                }
+                record.setSbName(getCellValue(row.getCell(1)));
+                record.setRemark(getCellValue(row.getCell(2)));
+                record.setDescription(getCellValue(row.getCell(3)));
+                record.setUnit(getCellValue(row.getCell(4)).trim());
+            } catch (Exception e) {
+                e.printStackTrace();
+                error.append(index).append("错误地址:第"+i+"行");
+            }
+            result.add(record);
+        }
+
+        String errorStr = error.toString();
+        if (StringUtils.isNotEmpty(errorStr)) {
+            throw new BusinessException(String.format("导入异常,以下行数据有问题:%s", errorStr.substring(0, errorStr.length())));
+        }
+        return result;
+    }
+
     public static List<SbInfoVO> importSbInfoListStandard(InputStream inputstream) throws IOException, InvalidFormatException {
         if (inputstream == null) {
             return Collections.emptyList();

+ 112 - 0
platform-dao/src/main/java/com/platform/dao/vo/export/remote/ExportRemoteOpcVO.java

@@ -0,0 +1,112 @@
+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:15:40
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+@Data
+@Accessors(chain = true)
+public class ExportRemoteOpcVO implements Serializable {
+
+    /**
+     * id
+     */
+    @Excel(name = "id")
+    private String id;
+
+    /**
+     * 设备id
+     */
+    @Excel(name = "设备id")
+    private String sbId;
+
+    /**
+     * 设备名称
+     */
+    @Excel(name = "设备名称")
+    private String sbName;
+
+    /**
+     * 点位
+     */
+    @Excel(name = "点位")
+    private Integer positionNum;
+
+    /**
+     * 线路
+     */
+    @Excel(name = "线路")
+    private Integer line;
+
+    /**
+     * 类型
+     */
+    @Excel(name = "类型", dicCode="REMOTE_MEASURE")
+    private Integer type;
+
+    /**
+     * 描述
+     */
+    @Excel(name = "描述")
+    private String description;
+
+    /**
+     * 实时数值
+     */
+    @Excel(name = "实时数值")
+    private String value;
+
+    /**
+     * 系数
+     */
+    @Excel(name = "系数")
+    private BigDecimal ratio;
+
+    /**
+     * 单位
+     */
+    @Excel(name = "单位")
+    private String unit;
+
+    /**
+     * 备注
+     */
+    @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;
+
+
+}

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

@@ -0,0 +1,97 @@
+package com.platform.dao.vo.query.remote;
+
+import com.platform.common.bean.BaseVO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+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:15:40
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+public class RemoteOpcVO extends BaseVO implements Serializable {
+
+    /**
+     * 是否模拟量:0否1是
+     */
+    private Integer avFlag;
+    /**
+     * opc服务器上是否已经创建:0否1是
+     */
+    private Integer createdFlag;
+    /**
+     * json数据
+     */
+    private String info;
+    /**
+     * id
+     */
+    private String id;
+    /**
+     * 设备id
+     */
+    private String sbId;
+    /**
+     * 设备名称
+     */
+    private String sbName;
+    /**
+     * 点位
+     */
+    private String positionNum;
+    /**
+     * 线路
+     */
+    private Integer line;
+    /**
+     * 类型
+     */
+    private Integer type;
+    /**
+     * 描述
+     */
+    private String description;
+    /**
+     * 实时数值
+     */
+    private String result;
+    /**
+     * 系数
+     */
+    private BigDecimal ratio;
+    /**
+     * 单位
+     */
+    private String unit;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 创建人
+     */
+    private String createdUserId;
+    /**
+     * 更新人
+     */
+    private String updateUserId;
+    /**
+     * 创建日期
+     */
+    private LocalDateTime createdTime;
+    /**
+     * 更新日期
+     */
+    private LocalDateTime updateTime;
+
+
+}

+ 148 - 0
platform-dao/src/main/resources/mapper/remote/RemoteOpcMapper.xml

@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.platform.dao.mapper.remote.RemoteOpcMapper">
+    <sql id="Base_Column_List">
+        opc
+        .
+        id
+        ,
+                                     opc.sb_id,
+                                     opc.sb_name,
+                                     opc.position_num,
+                                     opc.line,
+                                     opc.type,
+                                     opc.description,
+                                     opc.result,
+                                     opc.av_flag,
+                                     opc.created_flag,
+                                     opc.ratio,
+                                     opc.unit,
+                                     opc.info,
+                                     opc.remark,
+                                     opc.created_user_id,
+                                     opc.update_user_id,
+                                     opc.created_time,
+                                     opc.update_time
+    </sql>
+    <sql id="Ref_Column_List">
+        opc.sb_id,
+                                     opc.sb_name,
+                                     opc.position_num,
+                                     opc.line,
+                                     opc.type,
+                                     opc.info,
+                                     opc.description,
+                                     opc.result,
+                                     opc.av_flag,
+                                     opc.created_flag,
+                                     opc.ratio,
+                                     opc.unit,
+                                     opc.remark,
+    </sql>
+    <sql id="List_Condition">
+        <if test="id != null and id != ''">
+            and opc.id = #{id}
+        </if>
+        <if test="createdFlag != null and createdFlag != ''">
+            and opc.created_flag = #{createdFlag}
+        </if>
+        <if test="avFlag != null and avFlag != ''">
+            and opc.av_flag = #{avFlag}
+        </if>
+        <if test="sbId != null and sbId != ''">
+            and opc.sb_id = #{sbId}
+        </if>
+        <if test="sbName != null and sbName != ''">
+            and opc.sb_name = #{sbName}
+        </if>
+        <if test="positionNum != null">
+            and opc.position_num = #{positionNum}
+        </if>
+        <if test="line != null">
+            and opc.line = #{line}
+        </if>
+        <if test="type != null">
+            and opc.type = #{type}
+        </if>
+        <if test="description != null and description != ''">
+            and opc.description = #{description}
+        </if>
+        <if test="result != null and result != ''">
+            and opc.result = #{result}
+        </if>
+        <if test="ratio != null">
+            and opc.ratio = #{ratio}
+        </if>
+        <if test="unit != null and unit != ''">
+            and opc.unit = #{unit}
+        </if>
+        <if test="remark != null and remark != ''">
+            and opc.remark = #{remark}
+        </if>
+        <if test="createdUserId != null and createdUserId != ''">
+            and opc.created_user_id = #{createdUserId}
+        </if>
+        <if test="updateUserId != null and updateUserId != ''">
+            and opc.update_user_id = #{updateUserId}
+        </if>
+        <if test="createdTimeStart != null">
+            and opc.created_time <![CDATA[>=]]>; #{createdTimeStart}
+        </if>
+        <if test="createdTimeEnd != null">
+            and opc.created_time <![CDATA[<=]]> #{createdTimeEnd}
+        </if>
+        <if test="createdTime != null">
+            and opc.created_time = #{createdTime}
+        </if>
+        <if test="updateTimeStart != null">
+            and opc.update_time <![CDATA[>=]]>; #{updateTimeStart}
+        </if>
+        <if test="updateTimeEnd != null">
+            and opc.update_time <![CDATA[<=]]> #{updateTimeEnd}
+        </if>
+        <if test="updateTime != null">
+            and opc.update_time = #{updateTime}
+        </if>
+        <if test="keyword != null and keyword != ''">
+            and (
+            opc.id like concat(concat('%',#{keyword}),'%')
+            or opc.position_num like concat(concat('%',#{keyword}),'%')
+            )
+        </if>
+    </sql>
+    <select id="selectList" parameterType="com.platform.dao.dto.remote.RemoteOpcDTO"
+            resultType="com.platform.dao.vo.query.remote.RemoteOpcVO">
+        select opc.*
+        from t_remote_opc as opc
+        <where>
+            <include refid="List_Condition"/>
+        </where>
+    </select>
+
+    <update id="updateBatch" parameterType="java.util.List">
+        <foreach collection="list" item="item" index="index" open="" close="" separator=";">
+            update t_remote_opc
+            <set>
+                <if test="item.result != null and item.result != ''">
+                    result = #{item.result},
+                </if>
+                <if test="item.remark != null and item.remark != ''">
+                    remark = #{item.remark},
+                </if>
+                <if test="item.updateUserId != null">
+                    update_user_id = #{item.updateUserId},
+                </if>
+                <if test="item.updateTime != null">
+                    update_time = #{item.updateTime}
+                </if>
+                <if test="item.avFlag != null">
+                    av_flag = #{item.avFlag}
+                </if>
+                <if test="item.createdFlag != null">
+                    created_flag = #{item.createdFlag}
+                </if>
+            </set>
+            where position_num = #{item.positionNum}
+        </foreach>
+    </update>
+</mapper>

+ 7 - 5
platform-opc/pom.xml

@@ -18,16 +18,18 @@
 
     <dependencies>
 
+        <dependency>
+            <groupId>com.platform</groupId>
+            <artifactId>platform-dao</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>8.0.15</version>
         </dependency>
-        <dependency>
-            <groupId>com.platform</groupId>
-            <artifactId>platform-common</artifactId>
-            <version>1.0-SNAPSHOT</version>
-        </dependency>
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-aop</artifactId>

+ 5 - 3
platform-opc/src/main/java/com/platform/opc/OpcApplication.java

@@ -1,9 +1,12 @@
 package com.platform.opc;
 
+import com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration;
+import com.platform.opc.util.OpcDAClient;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.core.annotation.Order;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
@@ -15,9 +18,8 @@ import java.util.TimeZone;
  * @Date 2019/7/22
  * @Version Copyright (c) 2019,北京乾元坤和科技有限公司 All rights reserved.
  */
-@SpringBootApplication(scanBasePackages = {"com.platform.common", "com.platform.opc"})
-@EnableScheduling
-@Order(1)
+@SpringBootApplication(scanBasePackages = {"com.platform.common","com.platform.dao", "com.platform.opc"}, exclude = {
+        DataSourceAutoConfiguration.class, PageHelperAutoConfiguration.class})
 @Slf4j
 public class OpcApplication implements CommandLineRunner {
 

+ 65 - 7
platform-opc/src/main/java/com/platform/opc/servie/OpcService.java

@@ -3,12 +3,30 @@ package com.platform.opc.servie;
 import com.platform.common.constant.UpmsRedisKeyConstants;
 import com.platform.common.util.BeanUtils;
 import com.platform.common.util.RedisUtils;
+import com.platform.dao.entity.remote.RemoteOpc;
+import com.platform.dao.enums.YesNoEnum;
+import com.platform.dao.mapper.remote.RemoteOpcMapper;
+import com.platform.dao.mapper.upms.SysDictMapper;
+import com.platform.opc.util.OpcDAClient;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.openscada.opc.lib.da.AddFailedException;
+import org.openscada.opc.lib.da.Item;
 import org.springframework.context.annotation.DependsOn;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import tk.mybatis.mapper.weekend.Weekend;
+import tk.mybatis.mapper.weekend.WeekendCriteria;
 
 import javax.annotation.PostConstruct;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @Service("opcService")
 @DependsOn({"beanUtils", "redisTemplate"})
@@ -16,20 +34,60 @@ import javax.annotation.PostConstruct;
 @Slf4j
 public class OpcService {
 
+    private final SysDictMapper sysDictMapper;
+    private final RemoteOpcMapper remoteOpcMapper;
+
     /**
-     * 初始化redis和点位分组数据,
+     * 初始化redis和点位分组数据,并启动循环判断
      */
     @PostConstruct
     public void initClients() {
+        log.info("开始初始化");
         // 判断开发环境还是本地环境
-        /*if (BeanUtils.isDev() || BeanUtils.isTest()) {
-            Boolean has = RedisUtils.hasKey(UpmsRedisKeyConstants.CACHE_ALL_CLIENT);
-            if (has) {
-                return;
-            }
-        }*/
         log.info("测试redis");
+        // 启动分组,按照车间line分组,选择已经在opc server中配置的
+        Weekend<RemoteOpc> weekend = new Weekend<>(RemoteOpc.class);
+        WeekendCriteria<RemoteOpc, Object> weekendCriteria = weekend.weekendCriteria();
+        weekendCriteria.andEqualTo(RemoteOpc::getCreatedFlag, YesNoEnum.YES.getValue());
+        List<RemoteOpc> remoteOpcList = remoteOpcMapper.selectByExample(weekend);
+        log.info("remoteOpcList: " + remoteOpcList.size());
+        Map<Integer, List<RemoteOpc>> listMap = remoteOpcList.stream().collect(Collectors.groupingBy(RemoteOpc::getLine));
+        OpcDAClient.connect();
+        OpcDAClient.findAllItem();
+        AddFailedException exception = OpcDAClient.addGroupList(listMap);
+        Map<String, Integer> failedItems = exception.getErrors();
+        Map<String, Item> addItems = exception.getItems();
+        List<RemoteOpc> remoteOpcFailList = new ArrayList<>();
+        if (failedItems != null) {// 有不存在的item,需要更新对应的点位信息
+            for (Map.Entry<String, Integer> entry : failedItems.entrySet()) {
+                RemoteOpc remoteOpc = new RemoteOpc();
+                remoteOpc.setPositionNum(entry.getKey().split("_")[0]);
+                remoteOpc.setCreatedFlag(0);
+                remoteOpc.setRemark("opc server未找到改点位。可能原因1:AV/DV配置错误,2:opc server中未配置");
+                log.error("opc server未找到该点位。key: " + entry.getKey() + ", value: " + entry.getValue());
+                remoteOpcFailList.add(remoteOpc);
+            }
+        }
+        if (addItems != null) {// 有不存在的item,需要更新对应的点位信息
+            for (Map.Entry<String, Item> entry : addItems.entrySet()) {
+                RemoteOpc remoteOpc = new RemoteOpc();
+                remoteOpc.setPositionNum(entry.getKey().split("_")[0]);
+                remoteOpc.setCreatedFlag(1);
+                remoteOpc.setRemark("opc server已配置,AV/DV配置正确");
+                log.error("opc server已配置。key: " + entry.getKey() + ", value: " + entry.getValue());
+                remoteOpcFailList.add(remoteOpc);
+            }
+        }
+
+        if (!CollectionUtils.isEmpty(remoteOpcFailList)) {
+            remoteOpcMapper.updateBatch(remoteOpcFailList);
+        }
+        // 启动分组,按照车间line分组
         RedisUtils.set("test", 1);
     }
 
+    public static void main(String[] args) {
+        String ss = "FT10402B_AV";
+        System.out.println(ss.split("_")[0]);
+    }
 }

+ 35 - 0
platform-opc/src/main/java/com/platform/opc/servie/OpcTaskService.java

@@ -0,0 +1,35 @@
+package com.platform.opc.servie;
+
+import com.platform.common.constant.UpmsRedisKeyConstants;
+import com.platform.common.util.BeanUtils;
+import com.platform.common.util.RedisUtils;
+import com.platform.dao.entity.remote.RemoteOpc;
+import com.platform.dao.mapper.remote.RemoteOpcMapper;
+import com.platform.dao.mapper.upms.SysDictMapper;
+import com.platform.opc.util.OpcDAClient;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service("opcTaskService")
+@AllArgsConstructor
+@Slf4j
+@EnableScheduling   // 1.开启定时任务
+public class OpcTaskService {
+
+    @Scheduled(fixedDelay = 2000)  //间隔2秒
+    public void getValue(){
+        log.info("开始定时任务");
+        List<Map<String, Object>> resultList = OpcDAClient.getItemValuesList();
+        log.info("resultList:" + resultList.size());
+        log.info("结束定时任务");
+    }
+}

+ 121 - 7
platform-opc/src/main/java/com/platform/opc/util/OpcDAClient.java

@@ -1,6 +1,8 @@
 package com.platform.opc.util;
 
 import com.platform.common.util.RedisUtils;
+import com.platform.dao.entity.remote.RemoteOpc;
+import com.platform.dao.vo.SysUserVO;
 import lombok.extern.slf4j.Slf4j;
 import org.jinterop.dcom.common.JIErrorCodes;
 import org.jinterop.dcom.common.JIException;
@@ -8,11 +10,15 @@ import org.jinterop.dcom.core.JIVariant;
 import org.openscada.opc.dcom.da.OPCSERVERSTATE;
 import org.openscada.opc.lib.common.AlreadyConnectedException;
 import org.openscada.opc.lib.common.ConnectionInformation;
+import org.openscada.opc.lib.common.NotConnectedException;
 import org.openscada.opc.lib.da.*;
+import org.openscada.opc.lib.da.browser.FlatBrowser;
+import org.springframework.util.CollectionUtils;
 
 import java.net.UnknownHostException;
 import java.util.*;
 import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
 
 /**
  * @Auther: 熊
@@ -27,9 +33,11 @@ public class OpcDAClient {
     public static String clsId = "001AAAA6-FB54-4627-84B2-8777379E5868";
     public static String progId = "Hollysys.HOLLiASiComm.1";
     public static String tag_prefix = "Channel1.Device1.";
-    private Server server;
-    private Group group = null;
-    private Map<String, Item> groupItems = null;
+    private static Server server;
+    private static List<Group> groupList = new ArrayList<>();
+    private static List<Map<String, Item>> groupItemsList = new ArrayList<>();
+    private static List<Set> itemSetList = new ArrayList<>();
+    private static Item[][] itemArrList = new Item[][]{};
 
     /**
      * 初始化连接信息
@@ -40,7 +48,7 @@ public class OpcDAClient {
     /**
      * 创建连接
      */
-    public void connect() {
+    public static void connect() {
         if (server != null && server.getServerState() != null && server.getServerState().getServerState().equals(OPCSERVERSTATE.OPC_STATUS_RUNNING)) {
             return;
         }
@@ -75,6 +83,27 @@ public class OpcDAClient {
         log.info("OPC Server connect success...");
     }
 
+    public static List<String> findAllItem() {
+        FlatBrowser flatBrowser = server.getFlatBrowser();
+        List<String> list = new ArrayList<>();
+        if (flatBrowser == null) {
+            log.warn("读取空");
+        } else {
+            try {
+                Collection<String> collection = flatBrowser.browse();
+                for (String item : collection) {
+                    log.info("find item: " + item);
+                    list.add(item);
+                }
+            } catch (JIException e) {
+                log.error(e.getMessage());
+            } catch (UnknownHostException e) {
+                log.error("host主机IP错误 = " + e.getMessage());
+            }
+        }
+        return list;
+    }
+
     /**
      * 根据地址获取数据
      *
@@ -93,13 +122,69 @@ public class OpcDAClient {
         return null;
     }
 
+    /**
+     * 建组:根据车间分组建立
+     *
+     * @param listMap
+     * @return
+     */
+    public static AddFailedException addGroupList(Map<Integer, List<RemoteOpc>> listMap) {
+        Map<String, Object> result = new HashMap<>();
+        try {
+            if (CollectionUtils.isEmpty(groupItemsList) || CollectionUtils.isEmpty(groupList)) {
+                log.info("开始建组...");
+                int i = 0;
+                for (Map.Entry<Integer, List<RemoteOpc>> entry : listMap.entrySet()) {
+                    Group group = server.addGroup(entry.getKey()+"");
+                    List<RemoteOpc> list = entry.getValue();
+                    List<String> itemIdList = list.stream().distinct().map(t->{
+                        if(t.getAvFlag()==1){
+                            t.setPositionNum(t.getPositionNum()+"_AV");
+                        }else{
+                            t.setPositionNum(t.getPositionNum()+"_DV");
+                        }
+                        return t;
+                    }).map(RemoteOpc::getPositionNum).collect(Collectors.toList());
+                    log.info("itemIdList: " + itemIdList.size());
+                    String[] items = itemIdList.toArray(new String[]{});
+                    log.info("items: " + items.length);
+                    Map<String, Item> groupItems = group.addItems(items);
+                    Set itemSet = new HashSet(groupItems.values());
+                    Item[] itemArr = new Item[itemSet.size()];
+                    itemSet.toArray(itemArr);
+                    groupList.add(group);
+                    groupItemsList.add(groupItems);
+                    itemSetList.add(itemSet);
+                    itemArrList[i++] = itemArr;
+                }
+                log.info("组建完成,开始查询数据...,分组数量:" + i);
+            }
+        } catch (AddFailedException e) {
+            e.printStackTrace();
+            // 将不存在的点位信息保存到数据库,
+            Map<String, Integer> errorsItemMap = e.getErrors();
+            e.printStackTrace();
+            log.error("批量获取数据异常:", e);
+            return e;
+        } catch (DuplicateGroupException e) {
+            e.printStackTrace();
+        } catch (NotConnectedException e) {
+            e.printStackTrace();
+        } catch (UnknownHostException e) {
+            e.printStackTrace();
+        } catch (JIException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
     /**
      * 获取多组数据
      *
      * @param itemIdList
      * @return
      */
-    public Map<String, Object> getItemValues(List<String> itemIdList) {
+   /* public Map<String, Object> (List<String> itemIdList) {
         Map<String, Object> result = new HashMap<>();
         try {
             if (groupItems == null || group == null) {
@@ -123,6 +208,35 @@ public class OpcDAClient {
             log.error("批量获取数据异常:", e);
         }
         return result;
+    }*/
+
+    /**
+     * 获取多组数据
+     *
+     * @return
+     */
+    public static List<Map<String, Object>> getItemValuesList() {
+        List<Map<String, Object>> resultList = new ArrayList<>();
+        try {
+            if (!CollectionUtils.isEmpty(groupItemsList)) {
+                for (int i = 0; i < groupItemsList.size(); i++) {
+                    Map<Item, ItemState> resultMap = groupList.get(i).read(true, itemArrList[i]);
+                    log.info("数据获取完成:{}条", resultMap.size());
+                    Map<String, Object> result = new HashMap<>();
+                    for (Item item : resultMap.keySet()) {
+                        ItemState itemMap = resultMap.get(item);
+                        Object value = getVal(itemMap.getValue());
+                        result.put(item.getId(), value);
+                        log.info("id: " + item.getId() + ", value: " + value);
+                    }
+                    resultList.add(result);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("批量获取数据异常:", e);
+        }
+        return resultList;
     }
 
     /**
@@ -219,11 +333,11 @@ public class OpcDAClient {
         for (String tag : tagList) {
             itemList.add(tag_prefix + tag);
         }
-        Map<String, Object> stringObjectMap = opcDAClient.getItemValues(itemList);
+        /*Map<String, Object> stringObjectMap = opcDAClient.(itemList);
         for (String key : stringObjectMap.keySet()) {
             Object itemMap = stringObjectMap.get(key);
             System.out.println(key + " : " + itemMap);
-        }
+        }*/
     }
 }
 

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

@@ -13,6 +13,7 @@
 
 package org.openscada.opc.lib.da;
 
+import com.platform.dao.entity.remote.RemoteOpc;
 import lombok.extern.slf4j.Slf4j;
 import org.jinterop.dcom.common.JIException;
 import org.openscada.opc.dcom.common.*;
@@ -193,6 +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());
+            for (Map.Entry<String, Integer> entry : failedItems.entrySet()) {
+                log.error("key: " + entry.getKey() + ", value: " + entry.getValue());
+            }
             throw new AddFailedException(failedItems, findItems(foundItems));
         }
 

+ 1 - 1
platform-opc/src/main/resources/application.yml

@@ -1,5 +1,5 @@
 spring:
   profiles:
-    active: daoDev,serviceDev,dev
+    active: daoDev,dev
   main:
     web-application-type: none

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

@@ -0,0 +1,168 @@
+package com.platform.rest.controller.remote;
+
+import com.platform.common.bean.AbstractPageResultBean;
+import com.platform.common.util.BeanConverterUtil;
+import com.platform.common.util.R;
+import com.platform.common.validation.group.AddGroup;
+import com.platform.common.validation.group.UpdateGroup;
+import com.platform.dao.dto.remote.RemoteOpcDTO;
+import com.platform.dao.entity.remote.RemoteOpc;
+import com.platform.dao.util.ExcelUtil;
+import com.platform.dao.vo.export.remote.ExportRemoteOpcVO;
+import com.platform.dao.vo.query.remote.RemoteOpcVO;
+import com.platform.rest.log.annotation.SysLog;
+import com.platform.service.remote.RemoteOpcService;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * @Description opc点位对应表 控制器
+ * @Author xc
+ * @Date 2022-09-13 14:15:40
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/remote/opcs")
+public class RemoteOpcController {
+
+    private final RemoteOpcService remoteMeasureService;
+
+    /**
+     * 通过id查询单条记录
+     *
+     * @param id 主键
+     * @return R
+     */
+    @GetMapping("/{id}")
+    public R<RemoteOpc> getById(@PathVariable("id") String id) {
+        return new R<>(remoteMeasureService.getModelById(id));
+    }
+
+    /**
+     * 新增记录
+     *
+     * @param remoteMeasureDTO opc点位对应表DTO
+     * @return R
+     */
+    @SysLog("新增opc点位对应表")
+    @PostMapping
+    @PreAuthorize("@pms.hasPermission('remote-opcs-add')")
+    public R save(@Validated({AddGroup.class}) @RequestBody RemoteOpcDTO remoteMeasureDTO) {
+        return new R<>(remoteMeasureService.saveModelByDTO(remoteMeasureDTO));
+    }
+
+    /**
+     * 修改记录
+     *
+     * @param remoteMeasureDTO opc点位对应表DTO
+     * @return R
+     */
+    @SysLog("修改opc点位对应表")
+    @PutMapping("/{id}")
+    @PreAuthorize("@pms.hasPermission('remote-opcs-edit')")
+    public R update(@PathVariable("id") String id, @Validated({UpdateGroup.class}) @RequestBody RemoteOpcDTO remoteMeasureDTO) {
+        remoteMeasureService.modModelByDTO(remoteMeasureDTO);
+        return new R<>();
+    }
+
+    /**
+     * 批量记录
+     *
+     * @param ids 主键
+     * @return R
+     */
+    @SysLog("批量删除opc点位对应表")
+    @PutMapping("/update/batch/{updateType}/{value}")
+    @PreAuthorize("@pms.hasPermission('remote-opcs-del')")
+    public R updateIds(@RequestBody List<String> ids, @PathVariable("updateType") Integer updateType,@PathVariable("value") Integer value) {
+        remoteMeasureService.updateIds(ids, updateType, value);
+        return new R<>();
+    }
+
+    /**
+     * 通过id删除一条记录
+     *
+     * @param id 主键
+     * @return R
+     */
+    @SysLog("删除opc点位对应表")
+    @DeleteMapping("/{id}")
+    @PreAuthorize("@pms.hasPermission('remote-opcs-del')")
+    public R removeById(@PathVariable String id) {
+        remoteMeasureService.deleteByPrimaryKey(id);
+        return new R<>();
+    }
+
+    /**
+     * 批量记录
+     *
+     * @param ids 主键
+     * @return R
+     */
+    @SysLog("批量删除opc点位对应表")
+    @DeleteMapping("")
+    @PreAuthorize("@pms.hasPermission('remote-opcs-del')")
+    public R removeIds(@RequestBody List<String> ids) {
+        remoteMeasureService.batchDelete(ids);
+        return new R<>();
+    }
+
+    /**
+     * 获取分页
+     *
+     * @param pageNum          当前页码
+     * @param pageSize         每页条数
+     * @param remoteMeasureDTO opc点位对应表DTO
+     * @return R
+     */
+    @GetMapping("/page")
+    public R<AbstractPageResultBean<RemoteOpcVO>> query(RemoteOpcDTO remoteMeasureDTO, @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "20") int pageSize) {
+        return new R<>(remoteMeasureService.selectPageList(remoteMeasureDTO, pageNum, pageSize));
+    }
+
+    /**
+     * 获取列表
+     *
+     * @param remoteMeasureDTO opc点位对应表DTO
+     * @return R
+     */
+    @GetMapping("")
+    public R query(RemoteOpcDTO remoteMeasureDTO) {
+        return new R<>(remoteMeasureService.getModelListByDTO(remoteMeasureDTO));
+    }
+
+    /**
+     * opc点位对应表导出
+     *
+     * @param remoteMeasureDTO opc点位对应表DTO
+     * @return R
+     */
+    @GetMapping("/export")
+    @SysLog("opc点位对应表导出")
+    @PreAuthorize("@pms.hasPermission('remote-opcs-export')")
+    public void export(HttpServletResponse response, RemoteOpcDTO remoteMeasureDTO) {
+        List<RemoteOpc> list = remoteMeasureService.getModelListByDTO(remoteMeasureDTO);
+        ExcelUtil.exportResponseDict(response, ExportRemoteOpcVO.class, BeanConverterUtil.copyListProperties(list, ExportRemoteOpcVO.class), "opc点位对应表");
+    }
+
+    /**
+     * 新增导入
+     *
+     * @param file bom excel文件
+     * @return R
+     */
+    @SysLog("新增opc点位数据导入")
+    @PostMapping("/import")
+    public R importExcel(@RequestParam("file") MultipartFile file, Integer line) throws Exception {
+        String result = remoteMeasureService.importListByAdd(file, line);
+        return new R<>(result);
+    }
+
+}

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

@@ -0,0 +1,50 @@
+package com.platform.service.remote;
+
+import com.platform.common.bean.AbstractPageResultBean;
+import com.platform.dao.dto.remote.RemoteOpcDTO;
+import com.platform.dao.entity.remote.RemoteOpc;
+import com.platform.dao.vo.query.remote.RemoteOpcVO;
+import com.platform.service.base.IBaseService;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * @Description 设备遥测对应表 service
+ * @Author xc
+ * @Date 2022-09-13 14:15:40
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+public interface RemoteOpcService extends IBaseService<RemoteOpc, RemoteOpcDTO> {
+
+    /**
+     * 批量删除
+     *
+     * @param ids :
+     * @return :
+     */
+    int batchDelete(List<String> ids);
+
+    /**
+     * 分页查询
+     *
+     * @param record
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    AbstractPageResultBean<RemoteOpcVO> selectPageList(RemoteOpcDTO record, int pageNum, int pageSize);
+
+    /**
+     * 根据点位更新结果数据
+     *
+     * @param positionNum:
+     * @param result:
+     * @return :
+     */
+    void updateResultByPositionNum(Integer positionNum, String result);
+
+    String importListByAdd(MultipartFile file, Integer line);
+
+    void updateIds(List<String> ids, Integer updateType, Integer value);
+}

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

@@ -0,0 +1,142 @@
+package com.platform.service.remote.impl;
+
+import com.github.pagehelper.PageHelper;
+import com.platform.common.bean.AbstractPageResultBean;
+import com.platform.common.enums.DictTypeEnum;
+import com.platform.common.exception.BusinessException;
+import com.platform.dao.bean.MyPage;
+import com.platform.dao.dto.remote.RemoteOpcDTO;
+import com.platform.dao.entity.remote.RemoteOpc;
+import com.platform.dao.entity.sb.SbInfo;
+import com.platform.dao.entity.upms.SysDict;
+import com.platform.dao.mapper.remote.RemoteOpcMapper;
+import com.platform.dao.mapper.sb.SbInfoMapper;
+import com.platform.dao.mapper.upms.SysDictMapper;
+import com.platform.dao.util.CustomExcelImportUtil;
+import com.platform.dao.vo.query.remote.RemoteOpcVO;
+import com.platform.service.base.impl.BaseServiceImpl;
+import com.platform.service.remote.RemoteOpcService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
+import tk.mybatis.mapper.weekend.Weekend;
+import tk.mybatis.mapper.weekend.WeekendCriteria;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description 设备遥测对应表 service 实现类
+ * @Author xc
+ * @Date 2022-09-13 14:15:40
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+@AllArgsConstructor
+@Service("remoteOpcService")
+public class RemoteOpcServiceImpl extends BaseServiceImpl<RemoteOpcMapper, RemoteOpc, RemoteOpcDTO> implements RemoteOpcService {
+
+    private final SysDictMapper sysDictMapper;
+
+    @Override
+    public int batchDelete(List<String> ids) {
+        Weekend<RemoteOpc> weekend = new Weekend<>(RemoteOpc.class);
+        WeekendCriteria<RemoteOpc, Object> weekendCriteria = weekend.weekendCriteria();
+        weekendCriteria.andIn(RemoteOpc::getId, ids);
+        mapper.deleteByExample(weekend);
+        return 1;
+    }
+
+    @Override
+    public AbstractPageResultBean<RemoteOpcVO> selectPageList(RemoteOpcDTO record, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        return new MyPage(mapper.selectList(record));
+    }
+
+    @Override
+    public void updateResultByPositionNum(Integer positionNum, String result) {
+        Weekend<RemoteOpc> weekend = new Weekend<>(RemoteOpc.class);
+        WeekendCriteria<RemoteOpc, Object> weekendCriteria = weekend.weekendCriteria();
+        weekendCriteria.andEqualTo(RemoteOpc::getPositionNum, positionNum);
+
+        RemoteOpc remoteMeasure = new RemoteOpc();
+        remoteMeasure.setResult(result);
+        mapper.updateByExampleSelective(remoteMeasure, weekend);
+    }
+
+    @Override
+    public AbstractPageResultBean<RemoteOpc> selectPageInfo(RemoteOpcDTO record, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        return new MyPage(mapper.selectList(record));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String importListByAdd(MultipartFile file, Integer line) {
+        if(line == null){
+            line =1;
+        }
+        Weekend<SysDict> weekend = new Weekend<>(SysDict.class);
+        WeekendCriteria<SysDict, Object> weekendCriteria = weekend.weekendCriteria();
+        weekendCriteria.andEqualTo(SysDict::getType, DictTypeEnum.REMOTE_OPC);
+        List<SysDict> sysDictList = sysDictMapper.selectByExample(weekend);
+        try {
+            List<RemoteOpc> items = CustomExcelImportUtil.importRemoteOpcList(file.getInputStream());
+            if (!CollectionUtils.isEmpty(items)) {
+                // 设置设备新增
+                int i = 1;
+                for (RemoteOpc remoteOpc : items) {
+                    remoteOpc.setType(1);
+                    remoteOpc.setLine(line);
+                    remoteOpc.setAvFlag(1);
+                    remoteOpc.setCreatedFlag(0);
+                   /* boolean find = false;
+                    for (SysDict sysDict : sysDictList) {
+                        if (sysDict.getLabel().equals(remoteOpc.getRemark())) {
+                            remoteOpc.setType(Integer.valueOf(sysDict.getValue()));
+                            find = true;
+                            break;
+                        }
+                    }
+                    if (!find) {
+                        throw new BusinessException("opc数据类型未配置,请配置数据字典:" + remoteOpc.getRemark());
+                    }*/
+                }
+               // sbInfoMapper.insertListforComplex(addSbInfoList);
+                mapper.insertListforComplex(items);
+            }
+            return "总计新增导入:" + (items.size());
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new BusinessException(e.getMessage());
+        }
+    }
+
+    /**
+     * 批量更新
+     * updateType 1:更新模拟,其他:更新是否配置
+     * @param ids
+     * @param updateType
+     * @param value
+     */
+    @Override
+    public void updateIds(List<String> ids, Integer updateType, Integer value) {
+        Weekend<RemoteOpc> weekend = new Weekend<>(RemoteOpc.class);
+        WeekendCriteria<RemoteOpc, Object> weekendCriteria = weekend.weekendCriteria();
+        weekendCriteria.andIn(RemoteOpc::getId, ids);
+        RemoteOpc remoteOpc = new RemoteOpc();
+        if(updateType==1){
+            remoteOpc.setAvFlag(value);
+        }else{
+            remoteOpc.setCreatedFlag(value);
+        }
+        mapper.updateByExampleSelective(remoteOpc, weekend);
+    }
+
+    public static void main(String[] args) {
+        for(int i=0;i<100;i++){
+            System.out.println((int)((Math.random()*6)+1));
+        }
+    }
+}