From 2a6e0d70ed75ba561d0415edc5182f1f0b993219 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期五, 23 八月 2024 17:10:02 +0800
Subject: [PATCH] 固定点1

---
 collect/src/main/java/com/qianwen/mdc/collect/dto/WorkstationDTO.java                  |  156 +++
 collect/src/main/resources/application.yml                                             |    2 
 mvnw                                                                                   |  310 +++++++
 collect/src/main/java/com/qianwen/mdc/collect/utils/redis/RedisUtil.java               |    2 
 collect/src/main/java/com/qianwen/mdc/collect/utils/LocalDateTimeUtils.java            |  139 +++
 collect/src/main/java/com/qianwen/mdc/collect/config/MqttConfig.java                   |    2 
 collect/src/main/java/com/qianwen/mdc/collect/handler/DeviceStatusDataHandler.java     |   10 
 pom.xml                                                                                |    6 
 collect/src/main/resources/com/qianwen/mdc/collect/mapper/iotdb/OutputMapper.xml       |    0 
 collect/src/main/java/com/qianwen/mdc/collect/mapper/mgr/WorkstationMapper.java        |    7 
 collect/src/main/resources/com/qianwen/mdc/collect/mapper/mgr/CalendarMapper.xml       |  105 ++
 collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.java     |    6 
 collect/src/main/java/com/qianwen/mdc/collect/runner/InitRunner.java                   |   64 +
 collect/src/main/java/com/qianwen/mdc/collect/MdcTansApplication.java                  |    6 
 collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/DeviceStateMapper.java      |   32 
 collect/src/main/java/com/qianwen/mdc/collect/entity/mgr/ProductionCalendar.java       |  138 +++
 collect/src/main/java/com/qianwen/mdc/collect/service/IOTMqttReceiveService.java       |    5 
 collect/src/test/java/com/qianwen/mdc/collect/service/CollectDataServiceTest.java      |   11 
 collect/src/main/resources/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.xml |    0 
 collect/src/main/java/com/qianwen/mdc/collect/entity/mgr/Workstation.java              |  272 ++++++
 collect/src/main/java/com/qianwen/mdc/collect/constants/CommonConstant.java            |   28 
 collect/pom.xml                                                                        |   24 
 collect/src/main/java/com/qianwen/mdc/collect/service/WorkstationService.java          |   81 +
 collect/src/main/java/com/qianwen/mdc/collect/entity/iotdb/DeviceState.java            |    6 
 collect/src/main/java/com/qianwen/mdc/collect/mapper/mgr/CalendarMapper.java           |   16 
 collect/src/main/java/com/qianwen/mdc/collect/controller/MqttController.java           |    2 
 collect/src/main/java/com/qianwen/mdc/collect/enums/FeedbackTimePointEnum.java         |   15 
 collect/src/main/java/com/qianwen/mdc/collect/controller/CollectTestController.java    |   26 
 mvnw.cmd                                                                               |  185 ++++
 .mvn/wrapper/maven-wrapper.properties                                                  |    2 
 collect/src/main/java/com/qianwen/mdc/collect/config/RedisConfig.java                  |   13 
 collect/src/main/java/com/qianwen/mdc/collect/service/DeviceStateFixPointService.java  |  249 +++++
 /dev/null                                                                              |    0 
 collect/src/main/java/com/qianwen/mdc/collect/service/CollectDataService.java          |  121 ++
 collect/src/main/java/com/qianwen/mdc/collect/dto/CalendarShiftInfoDTO.java            |  255 +++++
 collect/src/main/java/com/qianwen/mdc/collect/cache/WorkstationCache.java              |   70 +
 .mvn/wrapper/MavenWrapperDownloader.java                                               |  117 ++
 collect/src/main/java/com/qianwen/mdc/collect/job/StateFixPointJob.java                |   43 +
 38 files changed, 2,449 insertions(+), 77 deletions(-)

diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100644
index 0000000..c32394f
--- /dev/null
+++ b/.mvn/wrapper/MavenWrapperDownloader.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+    private static final String WRAPPER_VERSION = "0.5.5";
+    /**
+     * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+     */
+    private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+        + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+    /**
+     * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+     * use instead of the default one.
+     */
+    private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+            ".mvn/wrapper/maven-wrapper.properties";
+
+    /**
+     * Path where the maven-wrapper.jar will be saved to.
+     */
+    private static final String MAVEN_WRAPPER_JAR_PATH =
+            ".mvn/wrapper/maven-wrapper.jar";
+
+    /**
+     * Name of the property which should be used to override the default download url for the wrapper.
+     */
+    private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+    public static void main(String args[]) {
+        System.out.println("- Downloader started");
+        File baseDirectory = new File(args[0]);
+        System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+        // If the maven-wrapper.properties exists, read it and check if it contains a custom
+        // wrapperUrl parameter.
+        File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+        String url = DEFAULT_DOWNLOAD_URL;
+        if(mavenWrapperPropertyFile.exists()) {
+            FileInputStream mavenWrapperPropertyFileInputStream = null;
+            try {
+                mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+                Properties mavenWrapperProperties = new Properties();
+                mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+                url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+            } catch (IOException e) {
+                System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+            } finally {
+                try {
+                    if(mavenWrapperPropertyFileInputStream != null) {
+                        mavenWrapperPropertyFileInputStream.close();
+                    }
+                } catch (IOException e) {
+                    // Ignore ...
+                }
+            }
+        }
+        System.out.println("- Downloading from: " + url);
+
+        File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+        if(!outputFile.getParentFile().exists()) {
+            if(!outputFile.getParentFile().mkdirs()) {
+                System.out.println(
+                        "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+            }
+        }
+        System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+        try {
+            downloadFileFromURL(url, outputFile);
+            System.out.println("Done");
+            System.exit(0);
+        } catch (Throwable e) {
+            System.out.println("- Error downloading");
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+
+    private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+        if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+            String username = System.getenv("MVNW_USERNAME");
+            char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+            Authenticator.setDefault(new Authenticator() {
+                @Override
+                protected PasswordAuthentication getPasswordAuthentication() {
+                    return new PasswordAuthentication(username, password);
+                }
+            });
+        }
+        URL website = new URL(urlString);
+        ReadableByteChannel rbc;
+        rbc = Channels.newChannel(website.openStream());
+        FileOutputStream fos = new FileOutputStream(destination);
+        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+        fos.close();
+        rbc.close();
+    }
+
+}
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..395a20c
--- /dev/null
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,2 @@
+distributionUrl=https://mirrors.huaweicloud.com/repository/maven//org/apache/maven/apache-maven/3.9.8/apache-maven-3.9.8-bin.zip
+wrapperUrl=https://mirrors.huaweicloud.com/repository/maven//io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar
diff --git a/collect/pom.xml b/collect/pom.xml
index 4913698..af61281 100644
--- a/collect/pom.xml
+++ b/collect/pom.xml
@@ -100,6 +100,21 @@
 		    <groupId>io.github.lmlx66</groupId>
 		    <artifactId>yitter-idgenerator-spring-boot-starter</artifactId>
 		</dependency>
+		
+		<dependency>
+		    <groupId>com.qianwen</groupId>
+		    <artifactId>smart-starter-tenant</artifactId>
+		    <version>1.0.0</version>
+		</dependency>
+		
+		<dependency>
+		    <groupId>com.qianwen</groupId>
+		    <artifactId>smart-starter-mybatis</artifactId>
+		    <version>1.0.0</version>
+		</dependency>
+  
+  
+
        
 		<!-- <dependency>
 		    <groupId>org.opcfoundation</groupId>
@@ -136,12 +151,13 @@
 		    <version>1.3.2</version>
 		</dependency>
 		
-		<!--  tdengine 椹卞姩 -->
+		<!--  xxl-job -->
         <dependency>
-            <groupId>com.taosdata.jdbc</groupId>
-            <artifactId>taos-jdbcdriver</artifactId>
-            <version>${tdengine.version}</version>
+            <groupId>com.xuxueli</groupId>
+            <artifactId>xxl-job-core</artifactId>
+			<version>2.1.2</version>
         </dependency>
+		
 
     </dependencies>
 
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/MdcTansApplication.java b/collect/src/main/java/com/qianwen/mdc/collect/MdcTansApplication.java
index 8d480d8..5274538 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/MdcTansApplication.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/MdcTansApplication.java
@@ -9,9 +9,11 @@
 import org.springframework.scheduling.annotation.EnableScheduling;
 
 
-@ServletComponentScan(basePackages = {"com.qianwen.mdc.listener"})
+//@ServletComponentScan(basePackages = {"com.qianwen.mdc.listener"})
 @SpringBootApplication
-@MapperScan(value = {"com.qianwen.mdc.collect.mapper", "com.qianwen.mdc.collect.mapper.rdbms"})
+
+//@MapperScan(value = {"com.qianwen.mdc.collect.mapper", "com.qianwen.mdc.collect.mapper.mgr"})
+//mapperscan浣跨敤starter-mybatis涓殑
 @EnableScheduling
 public class MdcTansApplication {
     private static final Logger logger = LoggerFactory.getLogger(MdcTansApplication.class);
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/cache/WorkstationCache.java b/collect/src/main/java/com/qianwen/mdc/collect/cache/WorkstationCache.java
index 82748cd..7310b0d 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/cache/WorkstationCache.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/cache/WorkstationCache.java
@@ -2,8 +2,10 @@
 
 import java.time.Duration;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 
@@ -14,12 +16,16 @@
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 //import com.qianwen.core.redis.cache.BladeRedis;
-
+import com.qianwen.mdc.collect.dto.WorkstationDTO;
 import com.qianwen.mdc.collect.entity.mgr.GlobalWcsOfRps;
+import com.qianwen.mdc.collect.entity.mgr.Workstation;
 import com.qianwen.mdc.collect.mapper.mgr.GlobalWcsOfRpsMapper;
+import com.qianwen.mdc.collect.service.WorkstationService;
 import com.qianwen.mdc.collect.utils.redis.RedisUtil;
+
+import cn.hutool.core.util.ObjectUtil;
 //import com.qianwen.posting.convert.WorkstationConvert;
-//import com.qianwen.posting.dto.WorkStationDTO;
+
 //import com.qianwen.posting.entity.mysql.EmployeeOnOffWork;
 
 //import com.qianwen.posting.entity.mysql.Workstation;
@@ -41,32 +47,64 @@
     //private static final IWorkstationService workStationService = (IWorkstationService) SpringUtil.getBean(IWorkstationService.class);
     @Autowired
     private GlobalWcsOfRpsMapper globalWcsOfRpsMapper;
+    @Autowired
+    private WorkstationService workStationService;
     //private static final EmployeeOnOffWorkMapper employeeOnOffWorkMapper = (EmployeeOnOffWorkMapper) SpringUtil.getBean(EmployeeOnOffWorkMapper.class);
 
-    /*
+    
 
-    public static Map<String, WorkStationDTO> getWorkStations() {
+    public Map<Long, WorkstationDTO> getWorkStations() {
         String redisKey = "posting:workstation".concat("::").concat(WORKSTATION_ALL);
-        Map<String, WorkStationDTO> map = bladeRedis.hGetAll(redisKey);
+        /*Map<String, WorkstationDTO> map = bladeRedis.hGetAll(redisKey);
+       
+        
         if (Func.isEmpty(map)) {
             map = setWorkStations();
         }
         return map;
-    }
+        */
+        Map<Long, WorkstationDTO> map = convertMap(redisUtil.hmget(redisKey));
+       
+        if (ObjectUtil.isEmpty(map)) {
+            map = setWorkStations();
+        }
 
-    private static Map<String, WorkStationDTO> setWorkStations() {
+        return map;
+        
+    }
+    
+    private Map<Long, WorkstationDTO> setWorkStations() {
         List<Workstation> list = workStationService.list();
         String redisKey = "posting:workstation".concat("::").concat(WORKSTATION_ALL);
-        if (Func.isNotEmpty(list)) {
-            list.forEach(workStation -> {
-                WorkStationDTO workStationDTO = WorkstationConvert.INSTANCE.convertDTO(workStation);
-                bladeRedis.hSet(redisKey, workStation.getId(), workStationDTO);
-            });
-            bladeRedis.expire(redisKey, 259200L);
-        }
-        return bladeRedis.hGetAll(redisKey);
+       
+        list.forEach(ws -> {
+        	/*
+            WorkStationDTO workStationDTO = WorkstationConvert.INSTANCE.convertDTO(workStation);
+            bladeRedis.hSet(redisKey, workStation.getId(), workStationDTO);
+            */
+        	WorkstationDTO dto = new WorkstationDTO();
+        	dto.setCalendarCode(ws.getCalendarCode());
+        	dto.setCode(ws.getCode());
+        	dto.setId(ws.getId());
+        	dto.setName(ws.getName());
+            redisUtil.hset(redisKey, ws.getId(), dto);
+        });
+       
+        //bladeRedis.expire(redisKey, 259200L);
+        redisUtil.expire(redisKey, 259200L);
+        //return bladeRedis.hGetAll(redisKey);
+        
+        return convertMap(redisUtil.hmget(redisKey));
     }
-
+    
+    static <K,V> Map<K,V> convertMap(Map<?,?> map){
+    	Map<K,V> result = new HashMap<>();
+    	for(Map.Entry<?,?> entry : map.entrySet()) {
+    		result.put((K)entry.getKey(), (V)entry.getValue());
+    	}
+    	return result;
+    }
+    /*
     public static Boolean clearWorkStationCache() {
         String redisKey = "posting:workstation".concat("::").concat(WORKSTATION_ALL);
         return bladeRedis.del(redisKey);
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/config/MqttConfig.java b/collect/src/main/java/com/qianwen/mdc/collect/config/MqttConfig.java
index 3aabd8c..0a3f1d9 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/config/MqttConfig.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/config/MqttConfig.java
@@ -19,7 +19,7 @@
 import com.qianwen.mdc.collect.service.IOTMqttReceiveService;
 
 @Configuration
-public class MqttConfig extends CachingConfigurerSupport {
+public class MqttConfig {
 	
 	@Autowired
 	private IOTMqttReceiveService recService;
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/config/RedisConfig.java b/collect/src/main/java/com/qianwen/mdc/collect/config/RedisConfig.java
index 2312efc..24c2cd3 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/config/RedisConfig.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/config/RedisConfig.java
@@ -18,6 +18,7 @@
 import org.springframework.data.redis.core.ValueOperations;
 import org.springframework.data.redis.core.ZSetOperations;
 import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
 import org.springframework.data.redis.serializer.RedisSerializer;
 import org.springframework.data.redis.serializer.StringRedisSerializer;
 
@@ -32,14 +33,20 @@
 		//Jackson2JsonRedisSerializer<Object> jacksonSeial = new Jackson2JsonRedisSerializer<>(Object.class);
 		ObjectMapper om = new ObjectMapper();
 		om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
-		om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
-		
+		//om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+		om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
 		//om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL,JsonTypeInfo.As.WRAPPER_ARRAY);
 		
 		jacksonSeial.setObjectMapper(om);
 		template.setValueSerializer(jacksonSeial);
 		template.setKeySerializer(new StringRedisSerializer());
-		template.setHashKeySerializer(new StringRedisSerializer());
+		
+        //new JdkSerializationRedisSerializer(classLoader);
+        
+		//template.setHashKeySerializer(new StringRedisSerializer());
+		
+		ClassLoader classLoader = getClass().getClassLoader();
+        template.setHashKeySerializer(new JdkSerializationRedisSerializer(classLoader));
 		template.setHashValueSerializer(jacksonSeial);
 		template.afterPropertiesSet();
 		return template;
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/constants/CommonConstant.java b/collect/src/main/java/com/qianwen/mdc/collect/constants/CommonConstant.java
new file mode 100644
index 0000000..33437fa
--- /dev/null
+++ b/collect/src/main/java/com/qianwen/mdc/collect/constants/CommonConstant.java
@@ -0,0 +1,28 @@
+package com.qianwen.mdc.collect.constants;
+
+public interface CommonConstant {
+    public static final String APPLICATION_NAME = "posting";
+    public static final String ALARM_CODE = "code";
+    public static final String ALARM_TIME = "timestamp";
+    public static final String ALARM_MSG = "msg";
+    public static final String ALARM_LEVEL = "level";
+    public static final String ALARM_ARRAY = "AlarmArray";
+    public static final String OUTPUT = "output";
+    public static final String STATE = "state";
+    public static final String BIZ_SPLIT = "::";
+    public static final String DEFAULT_CODE = "#default#";
+    public static final String GLOBAL_WORKSTATION_FEEDBACK_ANALYSE_LOCK = "lock:posting:state:{}";
+    public static final long WAIT_TIME = 10;
+    public static final long REDIS_LOCK_LEASE_TIME = 240;
+    public static final Integer DEFAULT_SHIFT_INDEX = 1;
+    public static final Integer DEFAULT_SHIFT_TYPE = 1;
+    public static final Integer IOT_STATE_START = 1;
+    public static final Integer IOT_STATE_END = 5;
+    public static final Long DEFAULT_SYNC_MESSAGE_TIME_OUT = 30000L;
+    public static final Boolean ISSYNC = true;
+    public static final Boolean ISNOTSYNC = false;
+    public static final Integer ENABLE = 1;
+    public static final Integer DIS_ENABLE = 0;
+    public static final Integer MINUTE_STOP = 1439;
+    public static final Integer MAX_RECORDS_FOR_SQL_LENGTH = 1000;
+}
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/controller/CollectTestController.java b/collect/src/main/java/com/qianwen/mdc/collect/controller/CollectTestController.java
index 478fa7b..a88977d 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/controller/CollectTestController.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/controller/CollectTestController.java
@@ -1,4 +1,5 @@
 package com.qianwen.mdc.collect.controller;
+import java.util.Arrays;
 import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -7,15 +8,22 @@
 
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.qianwen.mdc.collect.config.IotDBSessionConfig;
+import com.qianwen.mdc.collect.dto.CalendarShiftInfoDTO;
 import com.qianwen.mdc.collect.entity.iotdb.Output;
 import com.qianwen.mdc.collect.entity.iotdb.ProcessParam;
 import com.qianwen.mdc.collect.mapper.iotdb.OutputMapper;
 import com.qianwen.mdc.collect.mapper.iotdb.ProcessParamMapper;
+import com.qianwen.mdc.collect.mapper.mgr.CalendarMapper;
 import com.qianwen.mdc.collect.mqtt.MqttMessageSender;
+import com.qianwen.mdc.collect.service.DeviceStateFixPointService;
 import com.qianwen.mdc.collect.service.IOTMqttReceiveService;
 import com.qianwen.mdc.collect.service.IotDBCommonService;
 import com.qianwen.mdc.collect.service.OutputAggregateService;
 import com.qianwen.mdc.collect.utils.redis.RedisUtil;
+
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 
 @RestController
 public class CollectTestController {
@@ -37,6 +45,11 @@
 	private OutputMapper outmapper;
 	@Autowired
 	private  RedisUtil redisUtil;
+	@Autowired
+	private DeviceStateFixPointService fpService;
+	
+	@Autowired
+	private CalendarMapper calendarMapper;
 	
     @GetMapping("/last")
     public Object last() {
@@ -56,4 +69,17 @@
     	redisUtil.hset("workstation-appid-map", "174", 1656819188967653378L);
     	return 1;
     }
+    
+    @GetMapping("/fixpoint")
+    public Object fixpoint() {
+    	//DateTime dateTime = DateTime.now().offset(DateField.DAY_OF_MONTH, 1);//+1澶╋紝鍗虫槑澶╃殑鏁版嵁
+    	DateTime dateTime = DateTime.now();
+    	fpService.deviceStateFixPoint(dateTime, null);
+    	return 1;
+    }
+    @GetMapping("/shift")
+    public Object shift() {
+    	Long val = calendarMapper.t1();
+    	return val;
+    }
 }
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/controller/MqttController.java b/collect/src/main/java/com/qianwen/mdc/collect/controller/MqttController.java
index 8dbac9f..c6034a2 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/controller/MqttController.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/controller/MqttController.java
@@ -53,7 +53,7 @@
     public void testRec2() {
     	//鏁版嵁鏍煎紡锛歿"174":[{"values":{"d1":12},"ts":"1721978780449"}]} 174鏄簲鐢╥d
     	//澶氭潯鏍煎紡锛歿"174":[{"values":{"DeviceStatus":2},"ts":"1722478128278"},{"values":{"spindleSpeed":22},"ts":"1722478128281"}]}
-    	String payload = "{\"174\":[{\"values\":{\"DeviceStatus\":2,\"Output\":34},\"ts\":\"1721978780449\"}]}";
+    	String payload = "{\"174\":[{\"values\":{\"DeviceStatus\":2,\"Output\":34},\"ts\":\"1723709061525\"}]}";
     	//payload = "{\"174\":[{\"values\":{\"Output\":11},\"ts\":\"1722478128278\"},{\"values\":{\"SpindleSpeed\":22},\"ts\":\"1722478128281\"}]}";
     	recService.handle(payload);
     }
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/dto/CalendarShiftInfoDTO.java b/collect/src/main/java/com/qianwen/mdc/collect/dto/CalendarShiftInfoDTO.java
new file mode 100644
index 0000000..15571e5
--- /dev/null
+++ b/collect/src/main/java/com/qianwen/mdc/collect/dto/CalendarShiftInfoDTO.java
@@ -0,0 +1,255 @@
+package com.qianwen.mdc.collect.dto;
+
+import java.util.Date;
+
+public class CalendarShiftInfoDTO {
+    private Long workstationId;
+    private String code;
+    private Integer factoryYear;
+    private Integer factoryMonth;
+    private Integer factoryWeek;
+    private String factoryDate;
+    private Date startTime;
+    private Date endTime;
+    private String calendarDay;
+    private Integer shiftIndex;
+    private Integer shiftTimeType;
+
+    public CalendarShiftInfoDTO setWorkstationId(final Long workstationId) {
+        this.workstationId = workstationId;
+        return this;
+    }
+
+    public CalendarShiftInfoDTO setCode(final String code) {
+        this.code = code;
+        return this;
+    }
+
+    public CalendarShiftInfoDTO setFactoryYear(final Integer factoryYear) {
+        this.factoryYear = factoryYear;
+        return this;
+    }
+
+    public CalendarShiftInfoDTO setFactoryMonth(final Integer factoryMonth) {
+        this.factoryMonth = factoryMonth;
+        return this;
+    }
+
+    public CalendarShiftInfoDTO setFactoryWeek(final Integer factoryWeek) {
+        this.factoryWeek = factoryWeek;
+        return this;
+    }
+
+    public CalendarShiftInfoDTO setFactoryDate(final String factoryDate) {
+        this.factoryDate = factoryDate;
+        return this;
+    }
+
+    public CalendarShiftInfoDTO setStartTime(final Date startTime) {
+        this.startTime = startTime;
+        return this;
+    }
+
+    public CalendarShiftInfoDTO setEndTime(final Date endTime) {
+        this.endTime = endTime;
+        return this;
+    }
+
+    public CalendarShiftInfoDTO setCalendarDay(final String calendarDay) {
+        this.calendarDay = calendarDay;
+        return this;
+    }
+
+    public CalendarShiftInfoDTO setShiftIndex(final Integer shiftIndex) {
+        this.shiftIndex = shiftIndex;
+        return this;
+    }
+
+    public CalendarShiftInfoDTO setShiftTimeType(final Integer shiftTimeType) {
+        this.shiftTimeType = shiftTimeType;
+        return this;
+    }
+
+    public boolean equals(final Object o) {
+        if (o == this) {
+            return true;
+        }
+        if (o instanceof CalendarShiftInfoDTO) {
+            CalendarShiftInfoDTO other = (CalendarShiftInfoDTO) o;
+            if (other.canEqual(this)) {
+                Object this$workStationId = getWorkstationId();
+                Object other$workStationId = other.getWorkstationId();
+                if (this$workStationId == null) {
+                    if (other$workStationId != null) {
+                        return false;
+                    }
+                } else if (!this$workStationId.equals(other$workStationId)) {
+                    return false;
+                }
+                Object this$factoryYear = getFactoryYear();
+                Object other$factoryYear = other.getFactoryYear();
+                if (this$factoryYear == null) {
+                    if (other$factoryYear != null) {
+                        return false;
+                    }
+                } else if (!this$factoryYear.equals(other$factoryYear)) {
+                    return false;
+                }
+                Object this$factoryMonth = getFactoryMonth();
+                Object other$factoryMonth = other.getFactoryMonth();
+                if (this$factoryMonth == null) {
+                    if (other$factoryMonth != null) {
+                        return false;
+                    }
+                } else if (!this$factoryMonth.equals(other$factoryMonth)) {
+                    return false;
+                }
+                Object this$factoryWeek = getFactoryWeek();
+                Object other$factoryWeek = other.getFactoryWeek();
+                if (this$factoryWeek == null) {
+                    if (other$factoryWeek != null) {
+                        return false;
+                    }
+                } else if (!this$factoryWeek.equals(other$factoryWeek)) {
+                    return false;
+                }
+                Object this$shiftIndex = getShiftIndex();
+                Object other$shiftIndex = other.getShiftIndex();
+                if (this$shiftIndex == null) {
+                    if (other$shiftIndex != null) {
+                        return false;
+                    }
+                } else if (!this$shiftIndex.equals(other$shiftIndex)) {
+                    return false;
+                }
+                Object this$shiftTimeType = getShiftTimeType();
+                Object other$shiftTimeType = other.getShiftTimeType();
+                if (this$shiftTimeType == null) {
+                    if (other$shiftTimeType != null) {
+                        return false;
+                    }
+                } else if (!this$shiftTimeType.equals(other$shiftTimeType)) {
+                    return false;
+                }
+                Object this$code = getCode();
+                Object other$code = other.getCode();
+                if (this$code == null) {
+                    if (other$code != null) {
+                        return false;
+                    }
+                } else if (!this$code.equals(other$code)) {
+                    return false;
+                }
+                Object this$factoryDate = getFactoryDate();
+                Object other$factoryDate = other.getFactoryDate();
+                if (this$factoryDate == null) {
+                    if (other$factoryDate != null) {
+                        return false;
+                    }
+                } else if (!this$factoryDate.equals(other$factoryDate)) {
+                    return false;
+                }
+                Object this$startTime = getStartTime();
+                Object other$startTime = other.getStartTime();
+                if (this$startTime == null) {
+                    if (other$startTime != null) {
+                        return false;
+                    }
+                } else if (!this$startTime.equals(other$startTime)) {
+                    return false;
+                }
+                Object this$endTime = getEndTime();
+                Object other$endTime = other.getEndTime();
+                if (this$endTime == null) {
+                    if (other$endTime != null) {
+                        return false;
+                    }
+                } else if (!this$endTime.equals(other$endTime)) {
+                    return false;
+                }
+                Object this$calendarDay = getCalendarDay();
+                Object other$calendarDay = other.getCalendarDay();
+                return this$calendarDay == null ? other$calendarDay == null : this$calendarDay.equals(other$calendarDay);
+            }
+            return false;
+        }
+        return false;
+    }
+
+    protected boolean canEqual(final Object other) {
+        return other instanceof CalendarShiftInfoDTO;
+    }
+
+    public int hashCode() {
+        Object $workStationId = getWorkstationId();
+        int result = (1 * 59) + ($workStationId == null ? 43 : $workStationId.hashCode());
+        Object $factoryYear = getFactoryYear();
+        int result2 = (result * 59) + ($factoryYear == null ? 43 : $factoryYear.hashCode());
+        Object $factoryMonth = getFactoryMonth();
+        int result3 = (result2 * 59) + ($factoryMonth == null ? 43 : $factoryMonth.hashCode());
+        Object $factoryWeek = getFactoryWeek();
+        int result4 = (result3 * 59) + ($factoryWeek == null ? 43 : $factoryWeek.hashCode());
+        Object $shiftIndex = getShiftIndex();
+        int result5 = (result4 * 59) + ($shiftIndex == null ? 43 : $shiftIndex.hashCode());
+        Object $shiftTimeType = getShiftTimeType();
+        int result6 = (result5 * 59) + ($shiftTimeType == null ? 43 : $shiftTimeType.hashCode());
+        Object $code = getCode();
+        int result7 = (result6 * 59) + ($code == null ? 43 : $code.hashCode());
+        Object $factoryDate = getFactoryDate();
+        int result8 = (result7 * 59) + ($factoryDate == null ? 43 : $factoryDate.hashCode());
+        Object $startTime = getStartTime();
+        int result9 = (result8 * 59) + ($startTime == null ? 43 : $startTime.hashCode());
+        Object $endTime = getEndTime();
+        int result10 = (result9 * 59) + ($endTime == null ? 43 : $endTime.hashCode());
+        Object $calendarDay = getCalendarDay();
+        return (result10 * 59) + ($calendarDay == null ? 43 : $calendarDay.hashCode());
+    }
+
+    public String toString() {
+        return "CalendarShiftInfoDTO(workStationId=" + getWorkstationId() + ", code=" + getCode() + ", factoryYear=" + getFactoryYear() + ", factoryMonth=" + getFactoryMonth() + ", factoryWeek=" + getFactoryWeek() + ", factoryDate=" + getFactoryDate() + ", startTime=" + getStartTime() + ", endTime=" + getEndTime() + ", calendarDay=" + getCalendarDay() + ", shiftIndex=" + getShiftIndex() + ", shiftTimeType=" + getShiftTimeType() + ")";
+    }
+
+    public Long getWorkstationId() {
+        return this.workstationId;
+    }
+
+    public String getCode() {
+        return this.code;
+    }
+
+    public Integer getFactoryYear() {
+        return this.factoryYear;
+    }
+
+    public Integer getFactoryMonth() {
+        return this.factoryMonth;
+    }
+
+    public Integer getFactoryWeek() {
+        return this.factoryWeek;
+    }
+
+    public String getFactoryDate() {
+        return this.factoryDate;
+    }
+
+    public Date getStartTime() {
+        return this.startTime;
+    }
+
+    public Date getEndTime() {
+        return this.endTime;
+    }
+
+    public String getCalendarDay() {
+        return this.calendarDay;
+    }
+
+    public Integer getShiftIndex() {
+        return this.shiftIndex;
+    }
+
+    public Integer getShiftTimeType() {
+        return this.shiftTimeType;
+    }
+}
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/dto/WorkstationDTO.java b/collect/src/main/java/com/qianwen/mdc/collect/dto/WorkstationDTO.java
new file mode 100644
index 0000000..103ef22
--- /dev/null
+++ b/collect/src/main/java/com/qianwen/mdc/collect/dto/WorkstationDTO.java
@@ -0,0 +1,156 @@
+package com.qianwen.mdc.collect.dto;
+
+import java.io.Serializable;
+
+public class WorkstationDTO implements Serializable {
+    private Long id;
+    private String code;
+    private String name;
+    private String calendarCode;
+
+    public static class WorkStationDTOBuilder {
+        private Long id;
+        private String code;
+        private String name;
+        private String calendarCode;
+
+        WorkStationDTOBuilder() {
+        }
+
+        public WorkStationDTOBuilder id(final Long id) {
+            this.id = id;
+            return this;
+        }
+
+        public WorkStationDTOBuilder code(final String code) {
+            this.code = code;
+            return this;
+        }
+
+        public WorkStationDTOBuilder name(final String name) {
+            this.name = name;
+            return this;
+        }
+
+        public WorkStationDTOBuilder calendarCode(final String calendarCode) {
+            this.calendarCode = calendarCode;
+            return this;
+        }
+
+        public WorkstationDTO build() {
+            return new WorkstationDTO(this.id, this.code, this.name, this.calendarCode);
+        }
+
+        public String toString() {
+            return "WorkStationDTO.WorkStationDTOBuilder(id=" + this.id + ", code=" + this.code + ", name=" + this.name + ", calendarCode=" + this.calendarCode + ")";
+        }
+    }
+
+    public void setId(final Long id) {
+        this.id = id;
+    }
+
+    public void setCode(final String code) {
+        this.code = code;
+    }
+
+    public void setName(final String name) {
+        this.name = name;
+    }
+
+    public void setCalendarCode(final String calendarCode) {
+        this.calendarCode = calendarCode;
+    }
+
+    public boolean equals(final Object o) {
+        if (o == this) {
+            return true;
+        }
+        if (o instanceof WorkstationDTO) {
+            WorkstationDTO other = (WorkstationDTO) o;
+            if (other.canEqual(this)) {
+                Object this$id = getId();
+                Object other$id = other.getId();
+                if (this$id == null) {
+                    if (other$id != null) {
+                        return false;
+                    }
+                } else if (!this$id.equals(other$id)) {
+                    return false;
+                }
+                Object this$code = getCode();
+                Object other$code = other.getCode();
+                if (this$code == null) {
+                    if (other$code != null) {
+                        return false;
+                    }
+                } else if (!this$code.equals(other$code)) {
+                    return false;
+                }
+                Object this$name = getName();
+                Object other$name = other.getName();
+                if (this$name == null) {
+                    if (other$name != null) {
+                        return false;
+                    }
+                } else if (!this$name.equals(other$name)) {
+                    return false;
+                }
+                Object this$calendarCode = getCalendarCode();
+                Object other$calendarCode = other.getCalendarCode();
+                return this$calendarCode == null ? other$calendarCode == null : this$calendarCode.equals(other$calendarCode);
+            }
+            return false;
+        }
+        return false;
+    }
+
+    protected boolean canEqual(final Object other) {
+        return other instanceof WorkstationDTO;
+    }
+
+    public int hashCode() {
+        Object $id = getId();
+        int result = (1 * 59) + ($id == null ? 43 : $id.hashCode());
+        Object $code = getCode();
+        int result2 = (result * 59) + ($code == null ? 43 : $code.hashCode());
+        Object $name = getName();
+        int result3 = (result2 * 59) + ($name == null ? 43 : $name.hashCode());
+        Object $calendarCode = getCalendarCode();
+        return (result3 * 59) + ($calendarCode == null ? 43 : $calendarCode.hashCode());
+    }
+
+    public String toString() {
+        return "WorkStationDTO(id=" + getId() + ", code=" + getCode() + ", name=" + getName() + ", calendarCode=" + getCalendarCode() + ")";
+    }
+
+    public static WorkStationDTOBuilder builder() {
+        return new WorkStationDTOBuilder();
+    }
+
+    public WorkstationDTO(final Long id, final String code, final String name, final String calendarCode) {
+        this.id = id;
+        this.code = code;
+        this.name = name;
+        this.calendarCode = calendarCode;
+    }
+
+    public WorkstationDTO() {
+    }
+
+    public Long getId() {
+        return this.id;
+    }
+
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public String getCalendarCode() {
+        return this.calendarCode;
+    }
+}
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/entity/iotdb/State.java b/collect/src/main/java/com/qianwen/mdc/collect/entity/iotdb/DeviceState.java
similarity index 97%
rename from collect/src/main/java/com/qianwen/mdc/collect/entity/iotdb/State.java
rename to collect/src/main/java/com/qianwen/mdc/collect/entity/iotdb/DeviceState.java
index db7ed50..35429c2 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/entity/iotdb/State.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/entity/iotdb/DeviceState.java
@@ -4,7 +4,7 @@
 /**
  * 璁惧鐘舵��
  */
-public class State {
+public class DeviceState {
     private Long time;
     private Long workstationId;
     private Integer valueCollect;
@@ -76,7 +76,7 @@
     
 
     protected boolean canEqual(final Object other) {
-        return other instanceof State;
+        return other instanceof DeviceState;
     }
 
     
@@ -84,7 +84,7 @@
         return ToStringBuilder.reflectionToString(this);
     }
 
-    public State() {
+    public DeviceState() {
     }
 
     public Long getTime() {
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/entity/mgr/ProductionCalendar.java b/collect/src/main/java/com/qianwen/mdc/collect/entity/mgr/ProductionCalendar.java
new file mode 100644
index 0000000..864fc15
--- /dev/null
+++ b/collect/src/main/java/com/qianwen/mdc/collect/entity/mgr/ProductionCalendar.java
@@ -0,0 +1,138 @@
+package com.qianwen.mdc.collect.entity.mgr;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.qianwen.core.mp.base.BaseEntity;
+
+@ApiModel(value = "鐢熶骇鏃ュ巻鍩虹淇℃伅entity", description = "鐢熶骇鏃ュ巻鍩虹淇℃伅entity")
+@TableName("blade_production_calendar")
+public class ProductionCalendar extends BaseEntity {
+    private static final long serialVersionUID = -899603875425492916L;
+    @TableField("code")
+    @ApiModelProperty("鏃ュ巻缂栧彿")
+    private String code;
+    @TableField("name")
+    @ApiModelProperty("鏃ュ巻鍚嶇О")
+    private String name;
+    @TableField("year")
+    @ApiModelProperty("搴旂敤骞翠唤")
+    private Integer year;
+    @TableField("status")
+    @ApiModelProperty("鍚敤绂佺敤")
+    private Integer status;
+    @TableField("tenant_id")
+    @ApiModelProperty("绉熸埛id")
+    private String tenantId;
+
+    public static class ProductionCalendarBuilder {
+        private String code;
+        private String name;
+        private Integer year;
+        private Integer status;
+        private String tenantId;
+
+        ProductionCalendarBuilder() {
+        }
+
+        public ProductionCalendarBuilder code(final String code) {
+            this.code = code;
+            return this;
+        }
+
+        public ProductionCalendarBuilder name(final String name) {
+            this.name = name;
+            return this;
+        }
+
+        public ProductionCalendarBuilder year(final Integer year) {
+            this.year = year;
+            return this;
+        }
+
+        public ProductionCalendarBuilder status(final Integer status) {
+            this.status = status;
+            return this;
+        }
+
+        public ProductionCalendarBuilder tenantId(final String tenantId) {
+            this.tenantId = tenantId;
+            return this;
+        }
+
+        public ProductionCalendar build() {
+            return new ProductionCalendar(this.code, this.name, this.year, this.status, this.tenantId);
+        }
+
+        public String toString() {
+            return "ProductionCalendar.ProductionCalendarBuilder(code=" + this.code + ", name=" + this.name + ", year=" + this.year + ", status=" + this.status + ", tenantId=" + this.tenantId + ")";
+        }
+    }
+
+    public void setCode(final String code) {
+        this.code = code;
+    }
+
+    public void setName(final String name) {
+        this.name = name;
+    }
+
+    public void setYear(final Integer year) {
+        this.year = year;
+    }
+
+    public void setStatus(final Integer status) {
+        this.status = status;
+    }
+
+    public void setTenantId(final String tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String toString() {
+        return "ProductionCalendar(code=" + getCode() + ", name=" + getName() + ", year=" + getYear() + ", status=" + getStatus() + ", tenantId=" + getTenantId() + ")";
+    }
+
+    public static ProductionCalendarBuilder builder() {
+        return new ProductionCalendarBuilder();
+    }
+
+    public ProductionCalendar() {
+    }
+
+    public ProductionCalendar(final String code, final String name, final Integer year, final Integer status, final String tenantId) {
+        this.code = code;
+        this.name = name;
+        this.year = year;
+        this.status = status;
+        this.tenantId = tenantId;
+    }
+
+    
+
+    protected boolean canEqual(final Object other) {
+        return other instanceof ProductionCalendar;
+    }
+
+
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public Integer getYear() {
+        return this.year;
+    }
+
+    public Integer getStatus() {
+        return this.status;
+    }
+
+    public String getTenantId() {
+        return this.tenantId;
+    }
+}
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/entity/mgr/Workstation.java b/collect/src/main/java/com/qianwen/mdc/collect/entity/mgr/Workstation.java
new file mode 100644
index 0000000..3764159
--- /dev/null
+++ b/collect/src/main/java/com/qianwen/mdc/collect/entity/mgr/Workstation.java
@@ -0,0 +1,272 @@
+package com.qianwen.mdc.collect.entity.mgr;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.math.BigDecimal;
+import com.qianwen.core.tenant.mp.TenantEntity;
+
+@TableName("blade_workstation")
+public class Workstation  extends TenantEntity{// 鏆傛椂涓嶈绉熸埛浜嗭紝灏变竴涓猼enantid
+    private static final long serialVersionUID = -883848031177958203L;
+    private String avatar;
+    private String code;
+    private String name;
+    private Integer type;
+    @TableField("calendar_code")
+    private String calendarCode;
+    @TableField("calendar_code_waiting")
+    private String calendarCodeWaiting;
+    @TableField("standard_efficiency")
+    private BigDecimal standardEfficiency;
+    private Long productionCapacityGroup;
+
+    public void setAvatar(final String avatar) {
+        this.avatar = avatar;
+    }
+
+    public void setCode(final String code) {
+        this.code = code;
+    }
+
+    public void setName(final String name) {
+        this.name = name;
+    }
+
+    public void setType(final Integer type) {
+        this.type = type;
+    }
+
+    public void setCalendarCode(final String calendarCode) {
+        this.calendarCode = calendarCode;
+    }
+
+    public void setCalendarCodeWaiting(final String calendarCodeWaiting) {
+        this.calendarCodeWaiting = calendarCodeWaiting;
+    }
+
+    public void setStandardEfficiency(final BigDecimal standardEfficiency) {
+        this.standardEfficiency = standardEfficiency;
+    }
+
+    public void setProductionCapacityGroup(final Long productionCapacityGroup) {
+        this.productionCapacityGroup = productionCapacityGroup;
+    }
+
+    public boolean equals(final Object o) {
+        if (o == this) {
+            return true;
+        }
+        if (o instanceof Workstation) {
+            Workstation other = (Workstation) o;
+            if (other.canEqual(this)) {
+                Object this$type = getType();
+                Object other$type = other.getType();
+                if (this$type == null) {
+                    if (other$type != null) {
+                        return false;
+                    }
+                } else if (!this$type.equals(other$type)) {
+                    return false;
+                }
+                Object this$productionCapacityGroup = getProductionCapacityGroup();
+                Object other$productionCapacityGroup = other.getProductionCapacityGroup();
+                if (this$productionCapacityGroup == null) {
+                    if (other$productionCapacityGroup != null) {
+                        return false;
+                    }
+                } else if (!this$productionCapacityGroup.equals(other$productionCapacityGroup)) {
+                    return false;
+                }
+                Object this$avatar = getAvatar();
+                Object other$avatar = other.getAvatar();
+                if (this$avatar == null) {
+                    if (other$avatar != null) {
+                        return false;
+                    }
+                } else if (!this$avatar.equals(other$avatar)) {
+                    return false;
+                }
+                Object this$code = getCode();
+                Object other$code = other.getCode();
+                if (this$code == null) {
+                    if (other$code != null) {
+                        return false;
+                    }
+                } else if (!this$code.equals(other$code)) {
+                    return false;
+                }
+                Object this$name = getName();
+                Object other$name = other.getName();
+                if (this$name == null) {
+                    if (other$name != null) {
+                        return false;
+                    }
+                } else if (!this$name.equals(other$name)) {
+                    return false;
+                }
+                Object this$calendarCode = getCalendarCode();
+                Object other$calendarCode = other.getCalendarCode();
+                if (this$calendarCode == null) {
+                    if (other$calendarCode != null) {
+                        return false;
+                    }
+                } else if (!this$calendarCode.equals(other$calendarCode)) {
+                    return false;
+                }
+                Object this$calendarCodeWaiting = getCalendarCodeWaiting();
+                Object other$calendarCodeWaiting = other.getCalendarCodeWaiting();
+                if (this$calendarCodeWaiting == null) {
+                    if (other$calendarCodeWaiting != null) {
+                        return false;
+                    }
+                } else if (!this$calendarCodeWaiting.equals(other$calendarCodeWaiting)) {
+                    return false;
+                }
+                Object this$standardEfficiency = getStandardEfficiency();
+                Object other$standardEfficiency = other.getStandardEfficiency();
+                return this$standardEfficiency == null ? other$standardEfficiency == null : this$standardEfficiency.equals(other$standardEfficiency);
+            }
+            return false;
+        }
+        return false;
+    }
+
+    protected boolean canEqual(final Object other) {
+        return other instanceof Workstation;
+    }
+
+    public int hashCode() {
+        Object $type = getType();
+        int result = (1 * 59) + ($type == null ? 43 : $type.hashCode());
+        Object $productionCapacityGroup = getProductionCapacityGroup();
+        int result2 = (result * 59) + ($productionCapacityGroup == null ? 43 : $productionCapacityGroup.hashCode());
+        Object $avatar = getAvatar();
+        int result3 = (result2 * 59) + ($avatar == null ? 43 : $avatar.hashCode());
+        Object $code = getCode();
+        int result4 = (result3 * 59) + ($code == null ? 43 : $code.hashCode());
+        Object $name = getName();
+        int result5 = (result4 * 59) + ($name == null ? 43 : $name.hashCode());
+        Object $calendarCode = getCalendarCode();
+        int result6 = (result5 * 59) + ($calendarCode == null ? 43 : $calendarCode.hashCode());
+        Object $calendarCodeWaiting = getCalendarCodeWaiting();
+        int result7 = (result6 * 59) + ($calendarCodeWaiting == null ? 43 : $calendarCodeWaiting.hashCode());
+        Object $standardEfficiency = getStandardEfficiency();
+        return (result7 * 59) + ($standardEfficiency == null ? 43 : $standardEfficiency.hashCode());
+    }
+
+    public String toString() {
+        return "Workstation(avatar=" + getAvatar() + ", code=" + getCode() + ", name=" + getName() + ", type=" + getType() + ", calendarCode=" + getCalendarCode() + ", calendarCodeWaiting=" + getCalendarCodeWaiting() + ", standardEfficiency=" + getStandardEfficiency() + ", productionCapacityGroup=" + getProductionCapacityGroup() + ")";
+    }
+
+    public static class WorkstationBuilder {
+        private String avatar;
+        private String code;
+        private String name;
+        private Integer type;
+        private String calendarCode;
+        private String calendarCodeWaiting;
+        private BigDecimal standardEfficiency;
+        private Long productionCapacityGroup;
+
+        WorkstationBuilder() {
+        }
+
+        public WorkstationBuilder avatar(final String avatar) {
+            this.avatar = avatar;
+            return this;
+        }
+
+        public WorkstationBuilder code(final String code) {
+            this.code = code;
+            return this;
+        }
+
+        public WorkstationBuilder name(final String name) {
+            this.name = name;
+            return this;
+        }
+
+        public WorkstationBuilder type(final Integer type) {
+            this.type = type;
+            return this;
+        }
+
+        public WorkstationBuilder calendarCode(final String calendarCode) {
+            this.calendarCode = calendarCode;
+            return this;
+        }
+
+        public WorkstationBuilder calendarCodeWaiting(final String calendarCodeWaiting) {
+            this.calendarCodeWaiting = calendarCodeWaiting;
+            return this;
+        }
+
+        public WorkstationBuilder standardEfficiency(final BigDecimal standardEfficiency) {
+            this.standardEfficiency = standardEfficiency;
+            return this;
+        }
+
+        public WorkstationBuilder productionCapacityGroup(final Long productionCapacityGroup) {
+            this.productionCapacityGroup = productionCapacityGroup;
+            return this;
+        }
+
+        public Workstation build() {
+            return new Workstation(this.avatar, this.code, this.name, this.type, this.calendarCode, this.calendarCodeWaiting, this.standardEfficiency, this.productionCapacityGroup);
+        }
+
+        public String toString() {
+            return "Workstation.WorkstationBuilder(avatar=" + this.avatar + ", code=" + this.code + ", name=" + this.name + ", type=" + this.type + ", calendarCode=" + this.calendarCode + ", calendarCodeWaiting=" + this.calendarCodeWaiting + ", standardEfficiency=" + this.standardEfficiency + ", productionCapacityGroup=" + this.productionCapacityGroup + ")";
+        }
+    }
+
+    public static WorkstationBuilder builder() {
+        return new WorkstationBuilder();
+    }
+
+    public Workstation(final String avatar, final String code, final String name, final Integer type, final String calendarCode, final String calendarCodeWaiting, final BigDecimal standardEfficiency, final Long productionCapacityGroup) {
+        this.avatar = avatar;
+        this.code = code;
+        this.name = name;
+        this.type = type;
+        this.calendarCode = calendarCode;
+        this.calendarCodeWaiting = calendarCodeWaiting;
+        this.standardEfficiency = standardEfficiency;
+        this.productionCapacityGroup = productionCapacityGroup;
+    }
+
+    public Workstation() {
+    }
+
+    public String getAvatar() {
+        return this.avatar;
+    }
+
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public Integer getType() {
+        return this.type;
+    }
+
+    public String getCalendarCode() {
+        return this.calendarCode;
+    }
+
+    public String getCalendarCodeWaiting() {
+        return this.calendarCodeWaiting;
+    }
+
+    public BigDecimal getStandardEfficiency() {
+        return this.standardEfficiency;
+    }
+
+    public Long getProductionCapacityGroup() {
+        return this.productionCapacityGroup;
+    }
+}
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/enums/FeedbackTimePointEnum.java b/collect/src/main/java/com/qianwen/mdc/collect/enums/FeedbackTimePointEnum.java
index e4e7091..bafac0b 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/enums/FeedbackTimePointEnum.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/enums/FeedbackTimePointEnum.java
@@ -1,9 +1,24 @@
 package com.qianwen.mdc.collect.enums;
 
+/**
+ * 鍙嶉鏃堕棿鐐圭被鍨嬫灇涓�
+ */
 public enum FeedbackTimePointEnum {
+	/**
+	 * 0,闈炲弽棣堢偣(鏅�氱殑閲囬泦鐐�/鍥哄畾鐐癸紝涓嶆槸浜哄伐鍙嶉鐨勭偣)
+	 */
     NO_FEED_BACK_POINT(0, "闈炲弽棣堢偣"),
+    /**
+     * 1,寮�濮嬫椂闂寸偣锛堜汉宸ュ弽棣堬級
+     */
     START_POINT(1, "寮�濮嬫椂闂寸偣"),
+    /**
+     * 2, 缁撴潫鏃堕棿鐐癸紙浜哄伐鍙嶉锛�
+     */
     END_POINT(2, "缁撴潫鏃堕棿鐐�"),
+    /**
+     * 3, 浜ゅ弶鏃堕棿鐐癸紙浜哄伐鍙嶉锛�
+     */
     CROSS_POINT(3, "浜ゅ弶鏃堕棿鐐�");
     
     private final Integer value;
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/handler/DeviceStatusDataHandler.java b/collect/src/main/java/com/qianwen/mdc/collect/handler/DeviceStatusDataHandler.java
index 34451a0..a58d4db 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/handler/DeviceStatusDataHandler.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/handler/DeviceStatusDataHandler.java
@@ -15,7 +15,7 @@
 import com.qianwen.mdc.collect.config.IotDBSessionConfig;
 import com.qianwen.mdc.collect.constants.IOTDBConstant;
 import com.qianwen.mdc.collect.dto.PackedTelemetryData;
-import com.qianwen.mdc.collect.entity.iotdb.State;
+import com.qianwen.mdc.collect.entity.iotdb.DeviceState;
 import com.qianwen.mdc.collect.entity.mgr.GlobalWcsOfRps;
 import com.qianwen.mdc.collect.enums.FeedbackTimePointEnum;
 import com.qianwen.mdc.collect.service.IotDBCommonService;
@@ -31,7 +31,7 @@
     private IotDBCommonService iotDBCommonService;
     @Override
     public void handleData(PackedTelemetryData data) {
-    	State state = new State();
+    	DeviceState state = new DeviceState();
     	state.setTime(data.getTime());
     	state.setCalendarCode(data.getCalendarCode());
     	
@@ -47,7 +47,7 @@
     	//WorkstationState propertyData = (WorkstationState) Objects.requireNonNull(BeanUtil.copy(entity, WorkstationState.class));
     	state.setValueCollect(Integer.valueOf(data.getValue()));
     	state.setWcs(state.getValueCollect());
-
+    	state.setWorkstationId(data.getWorkstationId());
         fillWorkStationCondition(data, state);
        
         insertState(state);
@@ -55,7 +55,7 @@
         log.info("鐘舵�佽仛鍚堣仛鍚堝畬鎴�:鏁版嵁");
     }
     
-    private void fillWorkStationCondition(PackedTelemetryData data, State state) {
+    private void fillWorkStationCondition(PackedTelemetryData data, DeviceState state) {
         GlobalWcsOfRps wcsOfRps = workstationCache.getWorkstationWcsSetting(data.getWorkstationId(), data.getValue());
         log.info("宸ュ喌浠ュ強缁╂晥淇℃伅锛歿}" ,wcsOfRps);
 
@@ -65,7 +65,7 @@
        
     }
     
-    void insertState(State state){
+    void insertState(DeviceState state){
     	String deviceId = IOTDBConstant.DB_PREFIX+IOTDBConstant.TEMPLATE_STATE+"_"+state.getWorkstationId();
     	try {
     		iotDBCommonService.setTemmplateIsNotSet(IOTDBConstant.TEMPLATE_STATE, deviceId);
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/job/StateFixPointJob.java b/collect/src/main/java/com/qianwen/mdc/collect/job/StateFixPointJob.java
new file mode 100644
index 0000000..5de06b9
--- /dev/null
+++ b/collect/src/main/java/com/qianwen/mdc/collect/job/StateFixPointJob.java
@@ -0,0 +1,43 @@
+package com.qianwen.mdc.collect.job;
+
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import com.xxl.job.core.log.XxlJobLogger;
+
+import java.util.Collections;
+
+import javax.annotation.Resource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import com.qianwen.core.tool.utils.Func;
+import com.qianwen.mdc.collect.service.DeviceStateFixPointService;
+
+import org.springframework.stereotype.Component;
+/*
+ * xxlJob 鏋勫缓宸ヤ綅鐘舵�佹槑鏃ュ浐瀹氱偣锛堟瘡灏忔椂涓�涓偣锛夛紝澶栧姞鏍规嵁鐝埗鍜岀敓浜ф棩鍘嗙殑鏃堕棿鍔犲叆鍥哄畾鐐�
+ */
+@Component
+public class StateFixPointJob {
+    private static final Logger log = LoggerFactory.getLogger(StateFixPointJob.class);
+    @Resource
+    private DeviceStateFixPointService stateFixPointService;
+
+    @XxlJob("stateFixPointJobHandler")
+    public ReturnT<String> stateFixPointJobHandler(String param) throws Exception {
+        DateTime dateTime = DateTime.now().offset(DateField.DAY_OF_MONTH, 1);//+1澶╋紝鍗虫槑澶╃殑鏁版嵁
+        if (Func.isNotEmpty(param)) {
+            dateTime = new DateTime(DateUtil.parse(param));
+        }
+        try {
+            XxlJobLogger.log("璁剧疆鍥哄畾鐐瑰紑濮�", new Object[]{dateTime.toString()});
+            this.stateFixPointService.deviceStateFixPoint(dateTime, Collections.emptyList());
+            XxlJobLogger.log("璁剧疆鍥哄畾鐐圭粨鏉�", new Object[]{dateTime.toString()});
+        } catch (Exception ex) {
+            log.info("鍥哄畾鎵撶偣鍙戠敓寮傚父" + ex);
+        }
+        return ReturnT.SUCCESS;
+    }
+}
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/DeviceStateMapper.java b/collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/DeviceStateMapper.java
new file mode 100644
index 0000000..af19677
--- /dev/null
+++ b/collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/DeviceStateMapper.java
@@ -0,0 +1,32 @@
+package com.qianwen.mdc.collect.mapper.iotdb;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qianwen.mdc.collect.entity.iotdb.DeviceState;
+
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+@DS("iotdb")
+@InterceptorIgnore(tenantLine = "true")
+public interface DeviceStateMapper extends BaseMapper<DeviceState> {
+    void createSuperTable();
+
+    //void createTable(Long workstationId);
+
+    //int insert(WorkstationState deviceState);
+
+    //int batchInsert(List<WorkstationState> deviceStateList);
+
+    //int batchSave(@Param("workstationId") Long workstationId, @Param("list") List<WorkstationState> list);
+
+    List<DeviceState> getProcessingFeedbackState(@Param("workstationId") Long workstationId);
+
+    DeviceState getLastIsSyncNoFixPointState(@Param("workstationId") Long workstationId);
+
+    DeviceState getLastWorkstationState(@Param("ew") Wrapper query);
+
+    DeviceState getFirstWorkstationState(@Param("ew") Wrapper query);
+}
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.java b/collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.java
index fe12663..f0ac7cc 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.java
@@ -5,14 +5,10 @@
 import org.apache.ibatis.annotations.Param;
 
 import com.baomidou.dynamic.datasource.annotation.DS;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.qianwen.mdc.collect.entity.iotdb.CollectData;
-import com.qianwen.mdc.collect.entity.iotdb.Output;
 import com.qianwen.mdc.collect.entity.iotdb.ProcessParam;
-import com.qianwen.mdc.domain.Machine;
 
 @DS("iotdb")
-public interface ProcessParamMapper {//com.qianwen.mdc.collect.mapper.iotdb.OutputMapper
+public interface ProcessParamMapper {
 
 	
 	List<ProcessParam> mylist(@Param("workstationId") Long workstationId);
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/mapper/mgr/CalendarMapper.java b/collect/src/main/java/com/qianwen/mdc/collect/mapper/mgr/CalendarMapper.java
new file mode 100644
index 0000000..d5dc072
--- /dev/null
+++ b/collect/src/main/java/com/qianwen/mdc/collect/mapper/mgr/CalendarMapper.java
@@ -0,0 +1,16 @@
+package com.qianwen.mdc.collect.mapper.mgr;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import com.qianwen.mdc.collect.dto.CalendarShiftInfoDTO;
+import com.qianwen.mdc.collect.entity.mgr.ProductionCalendar;
+
+public interface CalendarMapper extends BaseMapper<ProductionCalendar> {
+    //String getShiftIndexNameByCodeAndYear(@Param("calendarCode") String calendarCode, @Param("year") Integer year, @Param("shiftIndex") Integer shiftIndex, @Param("tenantId") String tenantId);
+	Long t1();
+	
+    List<CalendarShiftInfoDTO> getCalendarShiftInfo(@Param("calendarCodeList") List<String> calendarCodeList, @Param("year") int year, @Param("dateTime") String dateTime);
+
+    List<CalendarShiftInfoDTO> getCalendarShiftInfoToday(@Param("calendarCode") String calendarCode, @Param("dateTime") String dateTime);
+}
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/mapper/mgr/WorkstationMapper.java b/collect/src/main/java/com/qianwen/mdc/collect/mapper/mgr/WorkstationMapper.java
new file mode 100644
index 0000000..59344ac
--- /dev/null
+++ b/collect/src/main/java/com/qianwen/mdc/collect/mapper/mgr/WorkstationMapper.java
@@ -0,0 +1,7 @@
+package com.qianwen.mdc.collect.mapper.mgr;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qianwen.mdc.collect.entity.mgr.Workstation;
+
+public interface WorkstationMapper extends BaseMapper<Workstation> {
+}
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/runner/InitRunner.java b/collect/src/main/java/com/qianwen/mdc/collect/runner/InitRunner.java
new file mode 100644
index 0000000..7a07f9f
--- /dev/null
+++ b/collect/src/main/java/com/qianwen/mdc/collect/runner/InitRunner.java
@@ -0,0 +1,64 @@
+package com.qianwen.mdc.collect.runner;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.google.common.collect.Sets;
+import java.lang.invoke.SerializedLambda;
+import java.time.LocalDate;
+import javax.annotation.Resource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.qianwen.mdc.collect.service.DeviceStateFixPointService;
+/*
+import com.qianwen.core.redis.lock.RedisLock;
+import com.qianwen.posting.cache.TimeSliceCache;
+import com.qianwen.posting.dto.CacheBuildDTO;
+import com.qianwen.posting.entity.tdengine.WorkstationState;
+import com.qianwen.posting.mapper.tdengine.WorkstationStateMapper;
+import com.qianwen.posting.service.IWorkstationStateFixPointService;
+*/
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+public class InitRunner implements ApplicationRunner {
+    private static final Logger log = LoggerFactory.getLogger(InitRunner.class);
+    @Resource
+    private DeviceStateFixPointService stateFixPointService;
+    //@Resource
+    //private WorkstationStateMapper workstationStateMapper;
+
+
+    public void run(ApplicationArguments args) throws Exception {
+    	/*
+        CacheBuildDTO cacheBuildDTO = CacheBuildDTO.builder().tenantIds(Sets.newHashSet(new String[]{"000000"})).targetDate(LocalDate.now()).build();
+        TimeSliceCache.build(cacheBuildDTO);
+        checkNeedStateFixPoint();
+        */
+    }
+
+    //@RedisLock("posting:lock:initStateFixPoint")
+    public void checkNeedStateFixPoint() {
+        DateTime dateTime = DateTime.now();
+        log.info("杩涘叆绋嬪簭鍚姩鏍¢獙鏄惁瀛樺湪宸ヤ綅鎵撹繃鍥哄畾鐐�....... ");
+       
+        /*
+        Long result = this.workstationStateMapper.selectCount(Wrappers.<WorkstationState>lambdaQuery()
+                .eq(WorkstationState::getFactoryDate, Integer.valueOf(DatePattern.PURE_DATE_FORMAT.format(dateTime)))
+                .eq(WorkstationState::getIsFixPoint, Boolean.TRUE));
+                */
+        Long result = 1L;
+        if (result == null || result.longValue() <= 0) {
+            log.info("宸ヤ綅鏈墦杩囧浐瀹氱偣....... ");
+            //this.workStationStateFixPointService.workStationStateFixPoint(dateTime, null);
+            stateFixPointService.deviceStateFixPoint(dateTime, null);
+            return;
+        }
+        log.info("宸ヤ綅宸插瓨鍦ㄥ浐瀹氱偣");
+    }
+}
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/service/CollectDataService.java b/collect/src/main/java/com/qianwen/mdc/collect/service/CollectDataService.java
index f62c473..36df400 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/service/CollectDataService.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/service/CollectDataService.java
@@ -4,13 +4,14 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
+import java.util.Random;
 import java.util.stream.Collectors;
 
-import org.apache.commons.lang3.tuple.Pair;
+import org.apache.iotdb.isession.pool.SessionDataSetWrapper;
 import org.apache.iotdb.rpc.IoTDBConnectionException;
 import org.apache.iotdb.rpc.StatementExecutionException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.common.RowRecord;
 import org.apache.iotdb.tsfile.write.record.Tablet;
 import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 import org.slf4j.Logger;
@@ -18,10 +19,10 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.qianwen.mdc.collect.config.IotDBSessionConfig;
 import com.qianwen.mdc.collect.domain.TelemetryData;
 import com.qianwen.mdc.collect.domain.TelemetryDataItem;
-import com.qianwen.mdc.collect.entity.iotdb.CollectData;
 import com.qianwen.mdc.collect.utils.redis.RedisUtil;
 
 /**
@@ -90,7 +91,7 @@
 			List<TypedTelemetryData> typeList = processParamsMap.get(name);
 			
 			deviceId = generateDeviceId(dt.getWorkstationId(),name);
-			System.out.println("deivcdid="+deviceId);
+			//System.out.println("deivcdid="+deviceId);
 			iotDBCommonService.setTemmplateIsNotSet(TEMPLATE_NAME, deviceId);
 			Tablet tablet = new Tablet(deviceId, schemas);
 			for(TypedTelemetryData tdata : typeList) {
@@ -103,41 +104,101 @@
 			
 			try {
 				iotdbConfig.getSessionPool().insertAlignedTablet(tablet);
+				
+				updateLastParam(dt.getWorkstationId(),typeList);
 			} catch (Exception e) {
 				log.error("IOTDB鍏ュ簱澶辫触",e);
 				e.printStackTrace();
 			}
 			//System.out.println(typeList);
 		}
-		/*
-		for (TelemetryDataItem dataItem : dt.getDataItems()) {
-
-			for (Map<String, String> point : dataItem.getDataPoints()) {
-		        
-		        String[] keys = point.keySet().toArray(new String[0]);
-		        for(int i=0;i<keys.length;i++) {
-		        	rowIndex = tablet.rowSize++;
-		        	tablet.addTimestamp(rowIndex, dataItem.getTime());
-		        	tablet.addValue("workstation_id",rowIndex,new Long(dt.getWorkstationId()));
-		        	propertyName = keys[i];
-		        	deviceId = generateDeviceId(dt.getWorkstationId(),propertyName);//DB_PREFIX+TEMPLATE_NAME + "_" + dt.getWorkstationId()+"_"+propertyName;
-		        	tablet.addValue("n",rowIndex,propertyName);
-		        	tablet.addValue("v",rowIndex,point.get(propertyName));
-		        }
-		  
-			}
-			
-			try {
-				iotdbConfig.getSessionPool().insertAlignedTablet(tablet);
-			} catch (Exception e) {
-				log.error("IOTDB鍏ュ簱澶辫触",e);
-				e.printStackTrace();
-			}
-		}
-		*/
+		
 
 	}
 	
+	/**
+	 * 濉厖鏈�鏂板弬鏁扮殑鏁版嵁
+	 * @param typeList
+	 * @throws StatementExecutionException 
+	 * @throws IoTDBConnectionException 
+	 */
+	void updateLastParam(long workstationId,List<TypedTelemetryData> typeList) throws IoTDBConnectionException, StatementExecutionException {
+		if(typeList.isEmpty()){
+			return;
+		}
+		long updateTime = typeList.get(0).getTime();
+		List<MeasurementSchema> schemas = new ArrayList<>();
+		
+		schemas.add(new MeasurementSchema("update_time", TSDataType.INT64));
+		schemas.add(new MeasurementSchema("workstation_id", TSDataType.INT64));
+		schemas.add(new MeasurementSchema("param_json", TSDataType.TEXT));
+		
+		Tablet tablet = new Tablet("root.f2.last_process_param", schemas);
+		for(TypedTelemetryData tdata: typeList) {
+			
+		}
+	
+		
+		String sql = "select update_time,workstation_id,param_json from root.f2.last_process_param where workstation_id="+workstationId;
+		SessionDataSetWrapper dsw = iotdbConfig.getSessionPool().executeQueryStatement(sql);
+		
+		if(dsw.hasNext()) {
+			RowRecord rec = dsw.next();
+			long time = rec.getTimestamp();
+			
+			String paramJsonStr = rec.getFields().get(2).getStringValue();
+			
+			tablet.rowSize = 1;
+			tablet.addTimestamp(0, time);
+			tablet.addValue("update_time", 0, updateTime);
+			tablet.addValue("workstation_id", 0, workstationId);
+			JSONObject paramObj = JSONObject.parseObject(paramJsonStr);
+			for(TypedTelemetryData tdata: typeList) {
+				
+				if(paramObj.containsKey(tdata.getName())) {
+					JSONObject itemObj = paramObj.getJSONObject(tdata.getName());
+					itemObj.put("value", tdata.getValue());
+					itemObj.put("time", tdata.getTime());//閲囬泦鏃堕棿
+					paramObj.put(tdata.getName(), itemObj);
+				}else {
+					JSONObject itemObj = new JSONObject();
+					itemObj.put("value", tdata.getValue());
+					itemObj.put("time", tdata.getTime());//閲囬泦鏃堕棿
+					paramObj.put(tdata.getName(), itemObj);
+					
+				}
+			}
+			tablet.addValue("param_json", 0, paramObj.toJSONString());
+			
+			this.iotdbConfig.getSessionPool().insertAlignedTablet(tablet);
+
+		}else {
+			//娌℃暟鎹紝鏂板姞鍏ヤ竴鏉�
+			tablet.rowSize = 1;
+			
+			tablet.addTimestamp(0, updateTime);
+			tablet.addValue("update_time", 0, updateTime);
+			tablet.addValue("workstation_id", 0, workstationId);
+			
+			JSONObject paramObj = new JSONObject();
+			for(TypedTelemetryData tdata: typeList) {
+				JSONObject itemObj = new JSONObject();
+				itemObj.put("value", tdata.getValue());
+				itemObj.put("time", tdata.getTime());//閲囬泦鏃堕棿
+				paramObj.put(tdata.getName(), itemObj);
+			}
+
+			tablet.addValue("param_json", 0,paramObj.toJSONString());
+			this.iotdbConfig.getSessionPool().insertAlignedTablet(tablet);
+		}
+		
+	}
+	
+	/**
+	 * 瑙f瀽鏁版嵁锛屽舰鎴恘ame - value瀵圭被鍨嬬殑鏁版嵁鍒楄〃锛屽苟鐢╪ame杩涜鍒嗙粍
+	 * @param dt
+	 * @return 鎸塶ame鍒嗙粍鍚庣殑鏁版嵁
+	 */
 	Map<String, List<TypedTelemetryData>> parseTelemetryToTypedMapList(TelemetryData dt){
 		List<TypedTelemetryData> list = new ArrayList<>();
 		
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/service/DeviceStateFixPointService.java b/collect/src/main/java/com/qianwen/mdc/collect/service/DeviceStateFixPointService.java
new file mode 100644
index 0000000..4656b9c
--- /dev/null
+++ b/collect/src/main/java/com/qianwen/mdc/collect/service/DeviceStateFixPointService.java
@@ -0,0 +1,249 @@
+package com.qianwen.mdc.collect.service;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+
+import com.google.common.collect.Lists;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import com.qianwen.core.tool.utils.Func;
+import com.qianwen.core.tool.utils.SpringUtil;
+import com.qianwen.mdc.collect.cache.WorkstationCache;
+import com.qianwen.mdc.collect.constants.CommonConstant;
+import com.qianwen.mdc.collect.dto.CalendarShiftInfoDTO;
+import com.qianwen.mdc.collect.dto.WorkstationDTO;
+import com.qianwen.mdc.collect.entity.iotdb.DeviceState;
+import com.qianwen.mdc.collect.enums.FeedbackTimePointEnum;
+import com.qianwen.mdc.collect.mapper.iotdb.DeviceStateMapper;
+import com.qianwen.mdc.collect.mapper.mgr.CalendarMapper;
+import com.qianwen.mdc.collect.utils.LocalDateTimeUtils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DeviceStateFixPointService{
+    private static final Logger log = LoggerFactory.getLogger(DeviceStateFixPointService.class);
+    @Autowired
+    private DeviceStateMapper deviceStateMapper;
+    @Autowired
+    private CalendarMapper calendarMapper;
+    @Autowired
+    private WorkstationCache workstationCache;
+    
+    /**
+     * 鍔犲叆鍥哄畾鐐�,鍘焪orkStationStateFixPoint
+     * @param dateTime
+     * @param includeWorkstationIds
+     */
+    public void deviceStateFixPoint(DateTime dateTime, List<String> includeWorkstationIds) {
+        List<DeviceState> result;
+        //CalendarMapper calendarMapper = SpringUtil.getBean(CalendarMapper.class);
+        Map<Long, WorkstationDTO> workStations = workstationCache.getWorkStations();
+        if (ObjectUtil.isEmpty(workStations)) {
+            return;
+        }
+        Collection<WorkstationDTO> values = workStations.values();
+        //boolean b = ObjectUtil.isAllNotEmpty(includeWorkstationIds);//yys
+        //boolean b2 = Func.isNotEmpty(includeWorkstationIds);
+        if (ObjectUtil.isNotEmpty(includeWorkstationIds)) {
+        	/*
+            values = (Collection) values.stream().filter(item -> {
+                return includeWorkstationIds.contains(item.getId().toString());
+            }).collect(Collectors.toList());*/
+            
+            values = values.stream().filter(item -> includeWorkstationIds.contains(item.getId().toString())).collect(Collectors.toList());
+        }
+        List<String> calendarCodeList = workStations.values().stream().map(WorkstationDTO::getCalendarCode).distinct().filter(Func::isNotEmpty).collect(Collectors.toList());
+        /*
+        List<String> calendarCodeList = (List) workStations.values().stream().map((v0) -> {
+            return v0.getCalendarCode();
+        }).distinct().filter((v0) -> {
+            return Func.isNotEmpty(v0);
+        }).collect(Collectors.toList());*/
+        Map<String, List<CalendarShiftInfoDTO>> map = new HashMap<>(32);
+        String formatDateTime = DateUtil.formatDate(dateTime);
+        if (Func.isNotEmpty(calendarCodeList)) {
+        	/*
+            List<CalendarShiftInfoDTO> calendarShiftInfoDTOList = calendarMapper.getCalendarShiftInfo(calendarCodeList, DateUtil.year(dateTime), formatDateTime);
+            map = (Map) calendarShiftInfoDTOList.stream().collect(Collectors.groupingBy((v0) -> {
+                return v0.getCode();
+            }));*/
+        	List<CalendarShiftInfoDTO> calendarShiftInfoDTOList = calendarMapper.getCalendarShiftInfo(calendarCodeList, DateUtil.year(dateTime), formatDateTime);
+            map = calendarShiftInfoDTOList.stream().collect(Collectors.groupingBy(CalendarShiftInfoDTO::getCode));
+        }
+        List<DeviceState> res = Lists.newArrayList();
+        for (WorkstationDTO workstationDTO : values) {
+        	
+        	result = Lists.newArrayList();
+            List<CalendarShiftInfoDTO> list = map.getOrDefault(workstationDTO.getCalendarCode(), Collections.singletonList(new CalendarShiftInfoDTO().setCode("0").setCalendarDay(formatDateTime).setFactoryYear(Integer.valueOf(DateUtil.year(dateTime))).setFactoryWeek(LocalDateTimeUtils.getWeek(dateTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate())).setFactoryMonth(Integer.valueOf(DateUtil.month(dateTime) + 1)).setFactoryDate(formatDateTime).setStartTime(DateUtil.beginOfDay(dateTime)).setShiftIndex(CommonConstant.DEFAULT_SHIFT_INDEX).setShiftTimeType(CommonConstant.DEFAULT_SHIFT_TYPE)));
+            if (map.containsKey(workstationDTO.getCalendarCode())) {
+                result = getNoDefaultShift24HourPointDTOS(workstationDTO.getId(), workstationDTO.getCalendarCode(), dateTime);
+            } else {
+                result = getDefaultShift24HourPointDTOS(workstationDTO.getId(), workstationDTO.getCalendarCode(), list.get(0));
+            }
+            
+            //灏嗙敓浜ф棩鍘嗕腑鐨勬椂闂磋妭鐐瑰姞鍏ュ浐瀹氱偣
+            for (int i = 0; i < list.size(); i++) {
+            	//DeviceState workstationState = WorkstationStateConvert.INSTANCE.convert(list.get(i));
+            	CalendarShiftInfoDTO calendarShiftDTO = list.get(i);
+            	
+            	DeviceState workstationState = new DeviceState();
+            	
+                workstationState.setIsSync(false);
+                workstationState.setIsFixPoint(true);
+                workstationState.setValueCollect(0);
+                workstationState.setRps(0);
+                workstationState.setWcs(0);
+                workstationState.setWorkstationId(workstationDTO.getId());
+                workstationState.setTime(Long.valueOf(calendarShiftDTO.getStartTime().getTime()));
+                workstationState.setIsDeleted(Boolean.FALSE);
+                workstationState.setFeedbackPointType(FeedbackTimePointEnum.NO_FEED_BACK_POINT.getValue());
+                workstationState.setCalendarCode(workstationDTO.getCalendarCode());
+                
+                String factoryDate = calendarShiftDTO.getFactoryDate();
+                String[] split = Func.split(factoryDate, "-");
+                workstationState.setFactoryDate(Integer.valueOf(String.join("", split)));
+                workstationState.setFactoryYear(calendarShiftDTO.getFactoryYear());
+                workstationState.setFactoryMonth(calendarShiftDTO.getFactoryMonth());
+                workstationState.setFactoryWeek(calendarShiftDTO.getFactoryWeek());
+                
+                workstationState.setShiftIndex(calendarShiftDTO.getShiftIndex());
+                workstationState.setShiftTimeType(calendarShiftDTO.getShiftTimeType());
+                
+        
+               // buildDefaultFactoryDay(dateTime, workstationState);
+                
+                result.add(workstationState);
+            }
+            res.addAll(result);
+        }
+        
+        /*
+        Map<Long, List<DeviceState>> collect = res.stream().distinct().collect(Collectors.groupingBy(DeviceState::getWorkstationId));
+        
+        collect.forEach((k, v) -> this.workstationStateMapper.batchSave(k, v));
+        */
+        //res.stream().distinct().collect(Collectors.toList())
+        saveDeviceStates(res);
+    }
+
+    
+    void saveDeviceStates(List<DeviceState> stateList) {
+    	
+    }
+    private List<DeviceState> getDefaultShift24HourPointDTOS(Long workStationId, String calendarCode, CalendarShiftInfoDTO shift) {
+        List<DeviceState> default24HourPointDTO = new ArrayList<>();
+        String factoryDate = shift.getFactoryDate();
+        String[] split = Func.split(factoryDate, "-");
+        int year = Integer.parseInt(split[0]);
+        int month = Integer.parseInt(split[1]);
+        int day = Integer.parseInt(split[2]);
+        for (int i = 1; i < 24; i++) {
+            LocalDateTime time = LocalDateTime.of(year, month, day, i, 0, 0);
+            //WorkstationState state = WorkstationStateConvert.INSTANCE.convert(shift);
+            
+            DeviceState state = new DeviceState();
+            state.setIsSync(false);
+            state.setIsFixPoint(true);
+            state.setValueCollect(0);
+            state.setRps(0);
+            state.setWcs(0);
+            state.setWorkstationId(workStationId);
+            state.setTime(Long.valueOf(time.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()));
+            state.setCalendarCode(calendarCode);
+            
+            state.setFeedbackPointType(FeedbackTimePointEnum.NO_FEED_BACK_POINT.getValue());
+            
+            state.setFactoryDate(Integer.valueOf(String.join("", Func.split(shift.getFactoryDate(), "-"))));
+            state.setFactoryYear(shift.getFactoryYear());
+            state.setFactoryMonth(shift.getFactoryMonth());
+           	state.setFactoryWeek(shift.getFactoryWeek());
+            state.setShiftIndex(shift.getShiftIndex());
+            state.setShiftTimeType(shift.getShiftTimeType());
+            //workstationState.setShiftIndex(calendarShiftDTO.getShiftIndex());
+            
+            state.setIsDeleted(Boolean.FALSE);
+            default24HourPointDTO.add(state);
+        }
+        return default24HourPointDTO;
+    }
+
+    private List<DeviceState> getNoDefaultShift24HourPointDTOS(Long workStationId, String calendarCode, DateTime dateTime) {
+        List<DeviceState> default24HourPointDTO = new ArrayList<>();
+        CalendarMapper calendarMapper = (CalendarMapper) SpringUtil.getBean(CalendarMapper.class);
+        try {
+            List<CalendarShiftInfoDTO> calendarShiftList = calendarMapper.getCalendarShiftInfoToday(calendarCode, DateUtil.formatDate(dateTime));
+            for (int i = 0; i < 24; i++) {
+                LocalDateTime time = LocalDateTime.of(dateTime.year(), dateTime.month() + 1, dateTime.dayOfMonth(), i, 0, 0);//姣忓皬鏃�0鍒�0绉�
+                DeviceState state = new DeviceState();
+                state.setIsSync(false);
+                state.setIsFixPoint(true);
+                state.setValueCollect(0);
+                state.setRps(0);
+                state.setWcs(0);
+                state.setWorkstationId(workStationId);
+                state.setTime(Long.valueOf(time.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()));
+                state.setCalendarCode(calendarCode);
+                state.setFeedbackPointType(FeedbackTimePointEnum.NO_FEED_BACK_POINT.getValue());
+                state.setIsDeleted(Boolean.FALSE);
+                
+              //濡傛灉state.ts鍦╟alendarShiftList鍖洪棿鍐咃紝鍒欏~鍏呯彮鍒跺拰鐢熶骇鏃ュ巻淇℃伅锛屽苟灏唖tate鍔犲叆鍒癲efault24HourPointDTO涓�
+                packCalendarShiftInfoForTimePoint(calendarShiftList, default24HourPointDTO, state);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return default24HourPointDTO;
+    }
+
+    private void packCalendarShiftInfoForTimePoint(List<CalendarShiftInfoDTO> calendarShiftList, List<DeviceState> default24HourPointDTO, DeviceState state) {
+        if (Func.isNotEmpty(calendarShiftList)) {
+            CalendarShiftInfoDTO relatedShift = calendarShiftList.stream().filter(item -> {
+                return item.getStartTime().getTime() <= state.getTime().longValue() && item.getEndTime().getTime() > state.getTime().longValue();
+            }).findFirst().orElse(null);
+            if (Func.isNotEmpty(relatedShift)) {
+                state.setShiftIndex(relatedShift.getShiftIndex());
+                state.setShiftTimeType(relatedShift.getShiftTimeType());
+                state.setFactoryYear(relatedShift.getFactoryYear());
+                state.setFactoryMonth(relatedShift.getFactoryMonth());
+                state.setFactoryWeek(relatedShift.getFactoryWeek());
+                String factoryDate = relatedShift.getFactoryDate();
+                String[] split = Func.split(factoryDate, "-");
+                state.setFactoryDate(Integer.valueOf(String.join("", split)));
+                state.setIsDeleted(Boolean.FALSE);
+                default24HourPointDTO.add(state);
+                return;
+            }
+            log.error("宸ヤ綅{} 鏃ュ巻{} 娌℃湁鏁寸偣寰楃彮娆′俊鎭�", state.getWorkstationId(), state.getCalendarCode());
+            return;
+        }
+        log.error("宸ヤ綅{} 鏃ュ巻{} 娌℃湁鑷劧澶﹞}寰楃彮娆′俊鎭�", new Object[]{state.getWorkstationId(), state.getCalendarCode(), state.getTime()});
+    }
+
+    //涓嶄竴瀹氳兘鐢ㄤ笂
+    private void buildDefaultFactoryDay(DateTime dateTime, DeviceState workstationState) {
+        if ("#default#".equals(workstationState.getCalendarCode()) && Func.isEmpty(workstationState.getFactoryMonth())) {
+            workstationState.setFactoryYear(Integer.valueOf(DateUtil.year(dateTime)));
+            workstationState.setFactoryWeek(LocalDateTimeUtils.getWeek(dateTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate()));
+            workstationState.setFactoryMonth(Integer.valueOf(DateUtil.month(dateTime) + 1));
+            workstationState.setFactoryDate(Integer.valueOf(DatePattern.PURE_DATE_FORMAT.format(dateTime)));
+            workstationState.setTime(Long.valueOf(DateUtil.beginOfDay(dateTime).getTime()));
+            workstationState.setShiftIndex(CommonConstant.DEFAULT_SHIFT_INDEX);
+            workstationState.setShiftTimeType(CommonConstant.DEFAULT_SHIFT_TYPE);
+            workstationState.setFeedbackPointType(FeedbackTimePointEnum.NO_FEED_BACK_POINT.getValue());
+            workstationState.setIsDeleted(Boolean.FALSE);
+        }
+    }
+}
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/service/IOTMqttReceiveService.java b/collect/src/main/java/com/qianwen/mdc/collect/service/IOTMqttReceiveService.java
index 9937d15..7e6925a 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/service/IOTMqttReceiveService.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/service/IOTMqttReceiveService.java
@@ -87,10 +87,7 @@
 	}
 	
 	public long getWorkstationIdByAppId(String appId) {
-		/**
-		 * 1656818952295661569 461
-1656819188967653378  462
-		 */
+
 		Object wid = redisUtil.hget("workstation-appid-map", appId);
 		String workstationId = String.valueOf(Optional.ofNullable(wid).orElse("-1"));
 	
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/service/WorkstationService.java b/collect/src/main/java/com/qianwen/mdc/collect/service/WorkstationService.java
new file mode 100644
index 0000000..5358533
--- /dev/null
+++ b/collect/src/main/java/com/qianwen/mdc/collect/service/WorkstationService.java
@@ -0,0 +1,81 @@
+package com.qianwen.mdc.collect.service;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import java.lang.invoke.SerializedLambda;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneOffset;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import com.qianwen.core.mp.base.BaseServiceImpl;
+import com.qianwen.core.tool.utils.Func;
+import com.qianwen.mdc.collect.entity.mgr.Workstation;
+import com.qianwen.mdc.collect.mapper.mgr.WorkstationMapper;
+
+/*
+import com.qianwen.posting.cache.WorkstationCache;
+import com.qianwen.posting.constant.CommonConstant;
+import com.qianwen.posting.dto.CalendarShiftInfoDTO;
+import com.qianwen.posting.entity.mysql.Workstation;
+import com.qianwen.posting.mapper.mysql.CalendarMapper;
+import com.qianwen.posting.mapper.mysql.WorkstationMapper;
+import com.qianwen.posting.service.IWorkstationService;
+import com.qianwen.posting.utils.LocalDateTimeUtils;
+*/
+import org.springframework.stereotype.Service;
+
+@Service
+public class WorkstationService extends BaseServiceImpl<WorkstationMapper, Workstation>{
+    //private final CalendarMapper calendarMapper;
+	//BaseEntity a;
+    /*
+
+    @Override
+    public void updateWorkStationCalendar() {
+        List<Workstation> list = list((Wrapper) new QueryWrapper().lambda().isNotNull((v0) -> {
+            return v0.getCalendarCodeWaiting();
+        }));
+        List<Workstation> workstationList = new ArrayList<>();
+        if (Func.isNotEmpty(list)) {
+            list.stream().filter(workStation -> {
+                return Func.isNotEmpty(workStation.getCalendarCodeWaiting());
+            }).forEach(workStation2 -> {
+                workStation2.setCalendarCode(workStation2.getCalendarCodeWaiting());
+                workStation2.setCalendarCodeWaiting("");
+                workstationList.add(workStation2);
+            });
+        }
+        updateBatchById(workstationList);
+        WorkstationCache.clearWorkStationCache();
+    }
+
+    @Override
+    public CalendarShiftInfoDTO getCalendarShiftInfoForWorkstation(Long workstationId, Date date) {
+        Workstation workstationInfo = (Workstation) getById(workstationId);
+        CalendarShiftInfoDTO result = null;
+        if (Func.isNotEmpty(workstationInfo) && !"#default#".equals(workstationInfo.getCalendarCode())) {
+            List<CalendarShiftInfoDTO> calendarShiftInfoDTOList = this.calendarMapper.getCalendarShiftInfoToday(workstationInfo.getCalendarCode(), DateUtil.formatDate(date));
+            if (Func.isNotEmpty(calendarShiftInfoDTOList)) {
+                CalendarShiftInfoDTO relatedShift = calendarShiftInfoDTOList.stream().filter(x -> {
+                    return x.getStartTime().getTime() <= date.getTime() && x.getEndTime().getTime() >= date.getTime();
+                }).findFirst().orElse(null);
+                if (Func.isNotEmpty(relatedShift)) {
+                    result.setCode(relatedShift.getCode());
+                    result.setFactoryDate(relatedShift.getFactoryDate()).setFactoryYear(relatedShift.getFactoryYear()).setFactoryWeek(relatedShift.getFactoryWeek()).setFactoryMonth(relatedShift.getFactoryMonth()).setShiftIndex(relatedShift.getShiftIndex()).setShiftTimeType(result.getShiftTimeType());
+                }
+            }
+        }
+        if (Func.isEmpty((Object) null)) {
+            result = new CalendarShiftInfoDTO();
+            LocalDate localDate = Instant.ofEpochMilli(date.getTime()).atZone(ZoneOffset.systemDefault()).toLocalDate();
+            result.setCode("#default#");
+            result.setFactoryDate(DatePattern.PURE_DATE_FORMAT.format(date)).setFactoryYear(Integer.valueOf(DateUtil.year(date))).setFactoryWeek(LocalDateTimeUtils.getWeek(localDate)).setFactoryMonth(Integer.valueOf(DateUtil.month(date) + 1)).setShiftIndex(CommonConstant.DEFAULT_SHIFT_INDEX).setShiftTimeType(CommonConstant.DEFAULT_SHIFT_TYPE);
+        }
+        return result;
+    }
+    */
+}
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/utils/LocalDateTimeUtils.java b/collect/src/main/java/com/qianwen/mdc/collect/utils/LocalDateTimeUtils.java
new file mode 100644
index 0000000..0bd4edd
--- /dev/null
+++ b/collect/src/main/java/com/qianwen/mdc/collect/utils/LocalDateTimeUtils.java
@@ -0,0 +1,139 @@
+package com.qianwen.mdc.collect.utils;
+
+import java.time.DayOfWeek;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.Period;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalAccessor;
+import java.time.temporal.TemporalAdjusters;
+import java.time.temporal.TemporalUnit;
+import java.time.temporal.WeekFields;
+import java.util.Date;
+
+public class LocalDateTimeUtils {
+    public static String pattern = "yyyy-MM-dd";
+
+    public static Long getSecondsByTime(LocalDateTime time) {
+        return Long.valueOf(time.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond());
+    }
+
+    public static String formatTime(LocalDateTime time, String pattern2) {
+        return time.format(DateTimeFormatter.ofPattern(pattern2));
+    }
+
+    public static String formatTimeLocalDate(LocalDate date, String pattern2) {
+        return date.format(DateTimeFormatter.ofPattern(pattern2));
+    }
+
+    public static String formatNow(String pattern2) {
+        return formatTime(LocalDateTime.now(), pattern2);
+    }
+
+    public static LocalDateTime plus(LocalDate localDate, long number, TemporalUnit field) {
+        return localDate.atStartOfDay().plus(number, field);
+    }
+
+    public static Integer getWeek(LocalDate time) {
+        WeekFields weekFields = WeekFields.of(DayOfWeek.MONDAY, 1);
+        return Integer.valueOf(time.get(weekFields.weekOfYear()));
+    }
+
+    public static Integer getMonth(LocalDate time) {
+        return Integer.valueOf(time.getMonth().getValue());
+    }
+
+    public static Integer getYear(LocalDate time) {
+        return Integer.valueOf(time.getYear());
+    }
+
+    public static long betweenTwoTime(LocalDateTime startTime, LocalDateTime endTime, ChronoUnit field) {
+        Period period = Period.between(LocalDate.from((TemporalAccessor) startTime), LocalDate.from((TemporalAccessor) endTime));
+        if (field == ChronoUnit.YEARS) {
+            return period.getYears();
+        }
+        if (field == ChronoUnit.MONTHS) {
+            return (period.getYears() * 12) + period.getMonths();
+        }
+        return field.between(startTime, endTime);
+    }
+
+    public static LocalDateTime getDayStart(LocalDateTime time) {
+        return time.withHour(0).withMinute(0).withSecond(0).withNano(0);
+    }
+
+    public static LocalDateTime getDayEnd(LocalDateTime time) {
+        return time.withHour(23).withMinute(59).withSecond(59).withNano(999999999);
+    }
+
+    public static Integer getDayOfYear(Integer year) {
+        return Integer.valueOf(LocalDate.of(year.intValue(), 1, 1).isLeapYear() ? 366 : 365);
+    }
+
+    public static Integer getDifference(LocalDate startDate, LocalDate endDate) {
+        Long l = Long.valueOf(endDate.toEpochDay() - startDate.toEpochDay());
+        Integer difference = Integer.valueOf(Integer.parseInt(l.toString()));
+        return difference;
+    }
+
+    public static LocalDate getLastDayOfYear(LocalDate date) {
+        LocalDate lastDayOfYear = date.with(TemporalAdjusters.lastDayOfYear());
+        return lastDayOfYear;
+    }
+
+    public static Date LocalDateTimeToDate(LocalDateTime localDateTime) {
+        ZoneId zoneId = ZoneId.systemDefault();
+        ZonedDateTime zdt = localDateTime.atZone(zoneId);
+        Date date = Date.from(zdt.toInstant());
+        return date;
+    }
+
+    public static Date LocalDateToDate(LocalDate localDate) {
+        ZoneId zone = ZoneId.systemDefault();
+        Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
+        Date date = Date.from(instant);
+        return date;
+    }
+
+    public static Date LocalTimeToDate(LocalTime localTime) {
+        LocalDate localDate = LocalDate.now();
+        LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
+        ZoneId zone = ZoneId.systemDefault();
+        Instant instant = localDateTime.atZone(zone).toInstant();
+        Date date = Date.from(instant);
+        return date;
+    }
+
+    public static LocalDateTime DateToLocalDateTime(Date date) {
+        Instant instant = date.toInstant();
+        ZoneId zone = ZoneId.systemDefault();
+        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
+        return localDateTime;
+    }
+
+    public static LocalDate DateToLocalDate(Date date) {
+        Instant instant = date.toInstant();
+        ZoneId zone = ZoneId.systemDefault();
+        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
+        LocalDate localDate = localDateTime.toLocalDate();
+        return localDate;
+    }
+
+    public static LocalTime DateToLocalTime(Date date) {
+        Instant instant = date.toInstant();
+        ZoneId zone = ZoneId.systemDefault();
+        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
+        LocalTime localTime = localDateTime.toLocalTime();
+        return localTime;
+    }
+
+    public static LocalDateTime parseLocalDateTime(String time) {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        return LocalDateTime.of(LocalDate.parse(time, formatter), LocalTime.MIN);
+    }
+}
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/utils/SpringUtil.java b/collect/src/main/java/com/qianwen/mdc/collect/utils/SpringUtil.java
deleted file mode 100644
index df76d37..0000000
--- a/collect/src/main/java/com/qianwen/mdc/collect/utils/SpringUtil.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*    */ package com.qianwen.mdc.collect.utils;
-/*    */ 
-/*    */ import org.springframework.beans.BeansException;
-/*    */ import org.springframework.context.ApplicationContext;
-/*    */ import org.springframework.context.ApplicationContextAware;
-/*    */ import org.springframework.stereotype.Component;
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ @Component
-/*    */ public class SpringUtil
-/*    */   implements ApplicationContextAware
-/*    */ {
-/*    */   private static ApplicationContext applicationContext;
-/*    */   
-/*    */   public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
-/* 24 */     com.qianwen.mdc.collect.utils.SpringUtil.applicationContext = applicationContext;
-/*    */   }
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */   
-/*    */   public static ApplicationContext getApplicationContext() {
-/* 35 */     return applicationContext;
-/*    */   }
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */   
-/*    */   public static Object getBean(String name) {
-/* 46 */     return applicationContext.getBean(name);
-/*    */   }
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */   
-/*    */   public static <T> T getBean(Class<T> clazz) {
-/* 57 */     return (T)getApplicationContext().getBean(clazz);
-/*    */   }
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */ 
-/*    */   
-/*    */   public static <T> T getBean(String name, Class<T> clazz) {
-/* 69 */     return (T)getApplicationContext().getBean(name, clazz);
-/*    */   }
-/*    */ }
-
-
-/* Location:              D:\yangys\mdm\鑰佷唬鐮乗mdcplugin\mdc-plugin-0.0.1-SNAPSHOT-鍒犻櫎lib.jar!\BOOT-INF\classes\cn\net\hx\md\\utils\SpringUtil.class
- * Java compiler version: 8 (52.0)
- * JD-Core Version:       1.1.3
- */
\ No newline at end of file
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/utils/redis/RedisUtil.java b/collect/src/main/java/com/qianwen/mdc/collect/utils/redis/RedisUtil.java
index 0c65ff6..3d2a264 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/utils/redis/RedisUtil.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/utils/redis/RedisUtil.java
@@ -212,7 +212,7 @@
      * @param value 鍊�
      * @return true 鎴愬姛 false澶辫触
      */
-    public boolean hset(String key, String item, Object value) {
+    public boolean hset(String key, Object item, Object value) {
         try {
             redisTemplate.opsForHash().put(key, item, value);
             return true;
diff --git a/collect/src/main/java/com/qianwen/mdc/collector/DataCollector.java b/collect/src/main/java/com/qianwen/mdc/collector/DataCollector.java
deleted file mode 100644
index 1e489a0..0000000
--- a/collect/src/main/java/com/qianwen/mdc/collector/DataCollector.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.qianwen.mdc.collector;
-
-import com.qianwen.mdc.domain.Machine;
-
-/**
- * 鏈哄簥鏁版嵁閲囬泦鍩虹鎺ュ彛
- */
-public interface DataCollector {
-
-	/**
-	 * 鎵ц鏁版嵁閲囬泦
-	 */
-	void collect(Machine machine);
-}
diff --git a/collect/src/main/java/com/qianwen/mdc/domain/Machine.java b/collect/src/main/java/com/qianwen/mdc/domain/Machine.java
deleted file mode 100644
index dce1b50..0000000
--- a/collect/src/main/java/com/qianwen/mdc/domain/Machine.java
+++ /dev/null
@@ -1,175 +0,0 @@
-package com.qianwen.mdc.domain;
-
-import java.io.Serializable;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-@JsonIgnoreProperties(ignoreUnknown = true)
-@TableName( "machine")
-public class Machine implements Serializable {
-	//public static final String STATE_FLAG_NORMAL = "NORMAL";
-	//public static final String STATE_FLAG_REMOVED = "REMOVED";
-	
-    /**
-     * id,涓庡彴璐︿腑鐨刴achine_id鐩稿悓
-     */
-    @TableId(type=IdType.INPUT)
-    private Long id;
-
-
-
-    /**
-     * IP鍦板潃
-     */
-    private String ip;
-
-    /**
-     * 閲囬泦绔彛
-     */
-    private Integer port;
-
-
-
-    /**
-     * 閲囬泦鏁版嵁浣跨敤鐨勫崗璁甶d
-     */
-    //@Column(name = "protocol_id")
-    @TableField("protocol_id")
-    private Integer protocolId;
-    
-
-    /**
-     * user id
-     */
-    //@Column(name = "user_id")
-    //private Integer userId;
-
-
-    /**
-     * 鐘舵�佹爣蹇楋紝NORMAL 姝e父锛汻EMOVED 绉婚櫎锛堟殏鏃剁Щ闄よ溅闂达紝涓嶇户缁噰闆嗭紝浣嗕繚瀛樺凡鏈夋暟鎹紝浣嗗彲鎭㈠涓烘甯革級;
-     */
-    
-    public Integer getIsCollect() {
-        return isCollect;
-    }
-
-    public void setIsCollect(Integer isCollect) {
-		this.isCollect = isCollect;
-	}
-
-    public static long getSerialVersionUID() {
-        return serialVersionUID;
-    }
-
-    /**
-     * collect flag
-     */
-    //@Column(name = "is_collect")
-    private Integer isCollect;
-
-    
-    /**
-     * shift type
-     */
-    //@Column(name = "shift_type")
-    private Integer shiftType;
-
-    /**
-     * machine name in dnc
-     */
-    //@Column(name = "dnc_name")
-    private String dncName;
-
-    /**
-     * 鏈哄簥鏁版嵁浼犺緭妯″紡锛�0. com; 1. share; 2. net
-     */
-    //@Column(name = "trans_mode")
-    private int transMode;
-
-	/**
-     * 鍏虫敞鐘舵�侊紙0.涓嶅叧娉紱1.鍏虫敞锛夐粯璁や负0
-     */
-    private Integer concern;
-
-	public Integer getConcern() {
-		return concern;
-	}
-
-	public void setConcern(Integer concern) {
-		this.concern = concern;
-	}
-
-	/**
-	 * 鏄惁鍏虫敞
-	 * @return
-	 */
-	public boolean isConcerned() {
-		return this.concern != null && this.concern == 1;
-	}
-	private static final long serialVersionUID = 1L;
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public String getIp() {
-        return ip;
-    }
-
-   
-    public void setIp(String ip) {
-        this.ip = ip;
-    }
-
-    public Integer getPort() {
-        return port;
-    }
-
-    public void setPort(Integer port) {
-        this.port = port;
-    }
-
-    public Integer getProtocolId() {
-		return protocolId;
-	}
-
-	public void setProtocolId(Integer protocolId) {
-		this.protocolId = protocolId;
-	}
-
-
-    public Integer getShiftType() {
-        return shiftType;
-    }
-
-    public void setShiftType(Integer shiftType) {
-        this.shiftType = shiftType;
-    }
-
-    public String getDncName() {
-        return dncName;
-    }
-
-    public void setDncName(String dncName) {
-        this.dncName = dncName;
-    }
-
-    public int getTransMode() {
-        return transMode;
-    }
-
-    public void setTransMode(int transMode) {
-        this.transMode = transMode;
-    }
-
-	
-
-}
\ No newline at end of file
diff --git a/collect/src/main/resources/application.yml b/collect/src/main/resources/application.yml
index a3ddb80..0293241 100644
--- a/collect/src/main/resources/application.yml
+++ b/collect/src/main/resources/application.yml
@@ -2,6 +2,8 @@
   port: 8099
 
 spring:
+  application:
+    name: qwcollect
   profiles:
     active: dev
   datasource:
diff --git a/collect/src/main/resources/mapper/OutputMapper.xml b/collect/src/main/resources/com/qianwen/mdc/collect/mapper/iotdb/OutputMapper.xml
similarity index 100%
rename from collect/src/main/resources/mapper/OutputMapper.xml
rename to collect/src/main/resources/com/qianwen/mdc/collect/mapper/iotdb/OutputMapper.xml
diff --git a/collect/src/main/resources/mapper/ProcessParamMapper.xml b/collect/src/main/resources/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.xml
similarity index 100%
rename from collect/src/main/resources/mapper/ProcessParamMapper.xml
rename to collect/src/main/resources/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.xml
diff --git a/collect/src/main/resources/com/qianwen/mdc/collect/mapper/mgr/CalendarMapper.xml b/collect/src/main/resources/com/qianwen/mdc/collect/mapper/mgr/CalendarMapper.xml
new file mode 100644
index 0000000..dbe9550
--- /dev/null
+++ b/collect/src/main/resources/com/qianwen/mdc/collect/mapper/mgr/CalendarMapper.xml
@@ -0,0 +1,105 @@
+<?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.qianwen.mdc.collect.mapper.mgr.CalendarMapper">
+
+    <select id="getCalendarShiftInfo" resultType="com.qianwen.mdc.collect.dto.CalendarShiftInfoDTO">
+        SELECT pc.CODE AS code,
+        pcd.YEAR AS factoryYear,
+        pcd.WEEK AS factoryWeek,
+        pcd.MONTH AS factoryMonth,
+        pcd.calendar_date AS factoryDate,
+        pcd.start_time AS startTime,
+        pcd.end_time AS endTime,
+        DATE_FORMAT(pcd.start_time, '%Y-%m-%d') AS calendarDay,
+        pcd.shift_index AS shiftIndex,
+        pcd.shift_type AS shiftTimeType
+        FROM blade_production_calendar pc
+        INNER JOIN blade_production_calendar_daytime pcd ON pc.id = pcd.calendar_id
+        WHERE pc.YEAR = #{year}
+        and DATE_FORMAT(pcd.start_time, '%Y-%m-%d') = #{dateTime}
+        and pc.is_deleted = 0
+        and code in
+        <foreach collection="calendarCodeList" item="code" open="(" separator="," close=")">
+            #{code}
+        </foreach>
+    </select>
+	<!-- 
+    <select id="getCalendarShiftInfo" resultType="com.qianwen.mdc.collect.dto.CalendarShiftInfoDTO" databaseId="oracle">
+        SELECT pc.CODE AS code,
+        pcd.YEAR AS factoryYear,
+        pcd.WEEK AS factoryWeek,
+        pcd.MONTH AS factoryMonth,
+        to_char(pcd.calendar_date,'yyyy-mm-dd') AS factoryDate,
+        pcd.start_time AS startTime,
+        pcd.end_time AS endTime,
+        to_char(pcd.start_time, 'yyyy-mm-dd') AS calendarDay,
+        pcd.shift_index AS shiftIndex,
+        pcd.shift_type AS shiftTimeType
+        FROM blade_production_calendar pc
+        INNER JOIN prod_calendar_daytime pcd ON pc.id = pcd.calendar_id
+        WHERE pc.YEAR = #{year}
+        and to_char(pcd.start_time, 'yyyy-mm-dd') = #{dateTime}
+        and pc.is_deleted = 0
+        and code in
+        <foreach collection="calendarCodeList" item="code" open="(" separator="," close=")">
+            #{code}
+        </foreach>
+    </select>
+ -->
+	<!-- 
+    <select id="getShiftIndexNameByCodeAndYear" resultType="java.lang.String">
+        SELECT distinct pc.id, pc.CODE, sd.index_name
+        FROM blade_production_calendar pc
+                 LEFT JOIN blade_production_calendar_day pdc ON pc.id = pdc.calendar_id AND pdc.is_deleted = 0
+                 LEFT JOIN blade_shift_detail sd on pdc.model_id = sd.model_id
+        WHERE pc.CODE = #{calendarCode}
+          AND pc.YEAR = #{year}
+          AND pc.tenant_id = #{tenantId}
+          AND sd.shift_index = #{shiftIndex}
+          AND pc.is_deleted = 0
+    </select>
+ -->
+	<select id="t1" resultType="java.lang.Long" >
+        SELECT 1 from dual
+    </select>
+    
+    <select id="getCalendarShiftInfoToday" resultType="com.qianwen.mdc.collect.dto.CalendarShiftInfoDTO" >
+        SELECT pc.CODE AS code,
+               pcd.YEAR AS factoryYear,
+               pcd.WEEK AS factoryWeek,
+               pcd.MONTH AS factoryMonth,
+               pcd.calendar_date AS factoryDate,
+               pcd.start_time AS startTime,
+               pcd.end_time AS endTime,
+               DATE_FORMAT(pcd.start_time, '%Y-%m-%d') AS calendarDay,
+               pcd.shift_index AS shiftIndex,
+               pcd.shift_type AS shiftTimeType
+        FROM blade_production_calendar pc
+                 INNER JOIN blade_production_calendar_daytime pcd ON pc.id = pcd.calendar_id
+        WHERE
+            (DATE_FORMAT(pcd.start_time,'%Y-%m-%d')=#{dateTime} or DATE_FORMAT(pcd.end_time,'%Y-%m-%d')=#{dateTime})
+          and pc.is_deleted = 0
+          and code =#{calendarCode}
+    </select>
+	<!-- 
+    <select id="getCalendarShiftInfoToday" resultType="com.qianwen.mdc.collect.dto.CalendarShiftInfoDTO"  databaseId="oracle">
+        SELECT pc.CODE AS code,
+               pcd.YEAR AS factoryYear,
+               pcd.WEEK AS factoryWeek,
+               pcd.MONTH AS factoryMonth,
+               to_char(pcd.calendar_date,'yyyy-mm-dd') AS factoryDate,
+               pcd.start_time AS startTime,
+               pcd.end_time AS endTime,
+               to_char(pcd.start_time, 'yyyy-mm-dd') AS calendarDay,
+               pcd.shift_index AS shiftIndex,
+               pcd.shift_type AS shiftTimeType
+        FROM blade_production_calendar pc
+                 INNER JOIN blade_production_calendar_daytime pcd ON pc.id = pcd.calendar_id
+        WHERE
+            (to_char(pcd.start_time, 'yyyy-mm-dd') = #{dateTime} or  to_char(pcd.end_time, 'yyyy-mm-dd') = #{dateTime})
+          and pc.is_deleted = 0
+          and code =#{calendarCode}
+    </select>
+ -->
+</mapper>
+
diff --git a/collect/src/main/resources/mapper/MachineMapper.xml b/collect/src/main/resources/mapper/MachineMapper.xml
deleted file mode 100644
index 9ea704c..0000000
--- a/collect/src/main/resources/mapper/MachineMapper.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?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.qianwen.mdc.mapper.MachineMapper">
-  <resultMap id="BaseResultMap" type="com.qianwen.mdc.domain.Machine">
-
-    <id column="id" jdbcType="INTEGER" property="id" />
-    <result column="machine_id" jdbcType="INTEGER" property="machineId" />
-    <result column="ip" jdbcType="VARCHAR" property="ip" />
-    <result column="port" jdbcType="INTEGER" property="port" />
-    
-    <result column="protocol_id" jdbcType="INTEGER" property="protocolId" />
-    <result column="workshop_id" jdbcType="INTEGER" property="workshopId" />
-    <result column="section_id" jdbcType="INTEGER" property="sectionId" />
-    <result column="concern_flag" jdbcType="INTEGER" property="concernFlag" />
-   
-    <result column="is_collect" jdbcType="INTEGER" property="isCollect" />
-    <result column="shift_type" jdbcType="INTEGER" property="shiftType" />
-    <result column="dnc_name" jdbcType="VARCHAR" property="dncName" />
-    <result column="trans_mode" jdbcType="INTEGER" property="transMode" />
-    
-  </resultMap>
-
-	<select id="collectableMachines" resultMap="BaseResultMap">
-  	select id,ip,port,protocol_id,is_collect,shift_type,dnc_name,trans_mode
-  	 from machine where ip is not null and port is not null and protocol_id is not null and is_collect=1
-  </select>
-
-</mapper>
\ No newline at end of file
diff --git a/collect/src/main/resources/nativelib/focas/Fwlib32.dll b/collect/src/main/resources/nativelib/focas/Fwlib32.dll
deleted file mode 100644
index b938c5e..0000000
--- a/collect/src/main/resources/nativelib/focas/Fwlib32.dll
+++ /dev/null
Binary files differ
diff --git a/collect/src/main/resources/nativelib/focas/Fwlib64.dll b/collect/src/main/resources/nativelib/focas/Fwlib64.dll
deleted file mode 100644
index 01a8daf..0000000
--- a/collect/src/main/resources/nativelib/focas/Fwlib64.dll
+++ /dev/null
Binary files differ
diff --git a/collect/src/main/resources/nativelib/focas/HxFocasApi.dll b/collect/src/main/resources/nativelib/focas/HxFocasApi.dll
deleted file mode 100644
index 06774c5..0000000
--- a/collect/src/main/resources/nativelib/focas/HxFocasApi.dll
+++ /dev/null
Binary files differ
diff --git a/collect/src/main/resources/nativelib/focas/HxFocasApi.lib b/collect/src/main/resources/nativelib/focas/HxFocasApi.lib
deleted file mode 100644
index a535232..0000000
--- a/collect/src/main/resources/nativelib/focas/HxFocasApi.lib
+++ /dev/null
Binary files differ
diff --git a/collect/src/main/resources/nativelib/focas/fwlibe1.dll b/collect/src/main/resources/nativelib/focas/fwlibe1.dll
deleted file mode 100644
index 5675aca..0000000
--- a/collect/src/main/resources/nativelib/focas/fwlibe1.dll
+++ /dev/null
Binary files differ
diff --git a/collect/src/main/resources/nativelib/focas/fwlibe64.dll b/collect/src/main/resources/nativelib/focas/fwlibe64.dll
deleted file mode 100644
index 56371bc..0000000
--- a/collect/src/main/resources/nativelib/focas/fwlibe64.dll
+++ /dev/null
Binary files differ
diff --git a/collect/src/test/java/com/qianwen/mdc/collect/service/CollectDataServiceTest.java b/collect/src/test/java/com/qianwen/mdc/collect/service/CollectDataServiceTest.java
new file mode 100644
index 0000000..23ab2cd
--- /dev/null
+++ b/collect/src/test/java/com/qianwen/mdc/collect/service/CollectDataServiceTest.java
@@ -0,0 +1,11 @@
+package com.qianwen.mdc.collect.service;
+
+import org.junit.jupiter.api.Test;
+
+public class CollectDataServiceTest {
+
+	@Test
+	public void t1() {
+		System.out.println(System.currentTimeMillis());
+	}
+}
diff --git a/mvnw b/mvnw
new file mode 100644
index 0000000..d2f0ea3
--- /dev/null
+++ b/mvnw
@@ -0,0 +1,310 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven2 Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`which java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Found .mvn/wrapper/maven-wrapper.jar"
+    fi
+else
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+    fi
+    if [ -n "$MVNW_REPOURL" ]; then
+      jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
+    else
+      jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
+    fi
+    while IFS="=" read key value; do
+      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+      esac
+    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Downloading from: $jarUrl"
+    fi
+    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+    if $cygwin; then
+      wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+    fi
+
+    if command -v wget > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found wget ... using wget"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            wget "$jarUrl" -O "$wrapperJarPath"
+        else
+            wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
+        fi
+    elif command -v curl > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found curl ... using curl"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            curl -o "$wrapperJarPath" "$jarUrl" -f
+        else
+            curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+        fi
+        
+    else
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Falling back to using Java to download"
+        fi
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+        # For Cygwin, switch paths to Windows format before running javac
+        if $cygwin; then
+          javaClass=`cygpath --path --windows "$javaClass"`
+        fi
+        if [ -e "$javaClass" ]; then
+            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Compiling MavenWrapperDownloader.java ..."
+                fi
+                # Compiling the Java class
+                ("$JAVA_HOME/bin/javac" "$javaClass")
+            fi
+            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                # Running the downloader
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Running MavenWrapperDownloader.java ..."
+                fi
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+            fi
+        fi
+    fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+  echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/mvnw.cmd b/mvnw.cmd
new file mode 100644
index 0000000..4a12bb7
--- /dev/null
+++ b/mvnw.cmd
@@ -0,0 +1,185 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven2 Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+set MAVEN_OPTS=-Dmaven.repo.local=D:/m2/repository
+
+set JAVA_HOME=D:\Java\jdk1.8.0_221
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
+
+FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+    IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Found %WRAPPER_JAR%
+    )
+) else (
+    if not "%MVNW_REPOURL%" == "" (
+        SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
+    )
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Couldn't find %WRAPPER_JAR%, downloading it ...
+        echo Downloading from: %DOWNLOAD_URL%
+    )
+
+    powershell -Command "&{"^
+		"$webclient = new-object System.Net.WebClient;"^
+		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+		"}"^
+		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+		"}"
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Finished downloading %WRAPPER_JAR%
+    )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/pom.xml b/pom.xml
index 334b085..2479744 100644
--- a/pom.xml
+++ b/pom.xml
@@ -8,7 +8,7 @@
   <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>2.7.18</version>
+        <version>2.3.12.RELEASE</version>
         <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <modules>
@@ -37,7 +37,9 @@
 		<dependency>
 		    <groupId>com.baomidou</groupId>
 		    <artifactId>mybatis-plus-boot-starter</artifactId>
-		    <version>3.5.5</version>
+		    <version>3.5.1</version>
+		    <!--
+		    <version>3.5.5</version>-->
 		</dependency>
 	  <!--mysql-->
         <dependency>

--
Gitblit v1.9.3