Explorar o código

feature: 智能控制V2版本 第二版(轮灌组)

Jayhaw hai 1 mes
pai
achega
8e37385567
Modificáronse 58 ficheiros con 1035 adicións e 169 borrados
  1. 0 1
      pom.xml
  2. 7 4
      src/main/java/cn/sciento/farm/automationv2/WfEquipmentAutomationV2Application.java
  3. 1 1
      src/main/java/cn/sciento/farm/automationv2/api/controller/ExecutionMonitorController.java
  4. 86 0
      src/main/java/cn/sciento/farm/automationv2/api/controller/IrrigationGroupController.java
  5. 2 2
      src/main/java/cn/sciento/farm/automationv2/api/controller/IrrigationTaskController.java
  6. 42 0
      src/main/java/cn/sciento/farm/automationv2/api/dto/BallValuesDTO.java
  7. 67 0
      src/main/java/cn/sciento/farm/automationv2/api/dto/IrrigationGroupDTO.java
  8. 1 1
      src/main/java/cn/sciento/farm/automationv2/app/service/AlarmNotificationService.java
  9. 2 3
      src/main/java/cn/sciento/farm/automationv2/app/service/AlarmRecordService.java
  10. 1 1
      src/main/java/cn/sciento/farm/automationv2/app/service/LinkageRuleEngine.java
  11. 1 1
      src/main/java/cn/sciento/farm/automationv2/app/service/QuartzManagementService.java
  12. 1 2
      src/main/java/cn/sciento/farm/automationv2/app/service/RetryManager.java
  13. 1 1
      src/main/java/cn/sciento/farm/automationv2/app/service/SafeShutdownService.java
  14. 2 3
      src/main/java/cn/sciento/farm/automationv2/app/service/TaskExecutionEngine.java
  15. 5 5
      src/main/java/cn/sciento/farm/automationv2/app/service/TaskTriggerService.java
  16. 2 4
      src/main/java/cn/sciento/farm/automationv2/app/service/WatchdogService.java
  17. 63 0
      src/main/java/cn/sciento/farm/automationv2/app/service/irrigationGroup/IrrigationGroupService.java
  18. 119 0
      src/main/java/cn/sciento/farm/automationv2/app/service/irrigationGroup/impl/IrrigationGroupServiceImpl.java
  19. 0 15
      src/main/java/cn/sciento/farm/automationv2/config/MyBatisConfig.java
  20. 8 0
      src/main/java/cn/sciento/farm/automationv2/domain/entity/AlarmRecord.java
  21. 5 13
      src/main/java/cn/sciento/farm/automationv2/domain/entity/IrrigationGroup.java
  22. 8 5
      src/main/java/cn/sciento/farm/automationv2/domain/entity/IrrigationTask.java
  23. 8 0
      src/main/java/cn/sciento/farm/automationv2/domain/entity/LinkageRule.java
  24. 12 0
      src/main/java/cn/sciento/farm/automationv2/domain/entity/TaskExecution.java
  25. 8 0
      src/main/java/cn/sciento/farm/automationv2/domain/entity/TaskGroupConfig.java
  26. 18 0
      src/main/java/cn/sciento/farm/automationv2/domain/repository/AlarmRecordRepository.java
  27. 24 0
      src/main/java/cn/sciento/farm/automationv2/domain/repository/IrrigationGroupRepository.java
  28. 16 0
      src/main/java/cn/sciento/farm/automationv2/domain/repository/IrrigationTaskRepository.java
  29. 16 0
      src/main/java/cn/sciento/farm/automationv2/domain/repository/LinkageRuleRepository.java
  30. 17 0
      src/main/java/cn/sciento/farm/automationv2/domain/repository/TaskExecutionRepository.java
  31. 17 0
      src/main/java/cn/sciento/farm/automationv2/domain/repository/TaskGroupConfigRepository.java
  32. 24 0
      src/main/java/cn/sciento/farm/automationv2/infra/constant/BaseConstant.java
  33. 4 3
      src/main/java/cn/sciento/farm/automationv2/infra/mapper/AlarmRecordMapper.java
  34. 6 4
      src/main/java/cn/sciento/farm/automationv2/infra/mapper/IrrigationGroupMapper.java
  35. 4 3
      src/main/java/cn/sciento/farm/automationv2/infra/mapper/IrrigationTaskMapper.java
  36. 4 3
      src/main/java/cn/sciento/farm/automationv2/infra/mapper/LinkageRuleMapper.java
  37. 4 3
      src/main/java/cn/sciento/farm/automationv2/infra/mapper/TaskExecutionMapper.java
  38. 4 3
      src/main/java/cn/sciento/farm/automationv2/infra/mapper/TaskGroupConfigMapper.java
  39. 21 0
      src/main/java/cn/sciento/farm/automationv2/infra/repository/impl/AlarmRecordRepositoryImpl.java
  40. 26 0
      src/main/java/cn/sciento/farm/automationv2/infra/repository/impl/IrrigationGroupRepositoryImpl.java
  41. 19 0
      src/main/java/cn/sciento/farm/automationv2/infra/repository/impl/IrrigationTaskRepositoryImpl.java
  42. 19 0
      src/main/java/cn/sciento/farm/automationv2/infra/repository/impl/LinkageRuleRepositoryImpl.java
  43. 19 0
      src/main/java/cn/sciento/farm/automationv2/infra/repository/impl/TaskExecutionRepositoryImpl.java
  44. 19 0
      src/main/java/cn/sciento/farm/automationv2/infra/repository/impl/TaskGroupConfigRepositoryImpl.java
  45. 19 0
      src/main/java/cn/sciento/farm/automationv2/infra/typehandler/ExecutionPlanTypeHandler.java
  46. 70 0
      src/main/java/cn/sciento/farm/automationv2/infra/typehandler/JsonTypeHandler.java
  47. 85 0
      src/main/java/cn/sciento/farm/automationv2/infra/utils/BeanCopyUtils.java
  48. 46 76
      src/main/resources/application.yml
  49. 22 0
      src/main/resources/banner.txt
  50. 26 0
      src/main/resources/bootstrap.yml
  51. 1 1
      src/main/resources/mapper/AlarmRecordMapper.xml
  52. 2 2
      src/main/resources/mapper/IrrigationGroupMapper.xml
  53. 1 1
      src/main/resources/mapper/IrrigationTaskMapper.xml
  54. 1 1
      src/main/resources/mapper/LinkageRuleMapper.xml
  55. 6 6
      src/main/resources/mapper/TaskExecutionMapper.xml
  56. 1 1
      src/main/resources/mapper/TaskGroupConfigMapper.xml
  57. 11 0
      src/main/resources/messages/messages_wfautoV2_en_US.properties
  58. 11 0
      src/main/resources/messages/messages_wfautoV2_zh_CN.properties

+ 0 - 1
pom.xml

@@ -129,7 +129,6 @@
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
-            <version>1.18.30</version>
             <optional>true</optional>
         </dependency>
 

+ 7 - 4
src/main/java/cn/sciento/farm/automationv2/WfEquipmentAutomationV2Application.java

@@ -1,13 +1,16 @@
 package cn.sciento.farm.automationv2;
 
+import cn.sciento.farm.autoconfigure.EnableWfAutomationV2;
+import cn.sciento.resource.annoation.EnableSTongResourceServer;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.cloud.openfeign.EnableFeignClients;
-import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 
+
+@EnableWfAutomationV2
+@EnableDiscoveryClient
 @SpringBootApplication
-@EnableFeignClients
-@EnableScheduling
+@EnableSTongResourceServer
 public class WfEquipmentAutomationV2Application {
 
     public static void main(String[] args) {

+ 1 - 1
src/main/java/cn/sciento/farm/automationv2/api/controller/ExecutionMonitorController.java

@@ -5,7 +5,7 @@ import cn.sciento.farm.automationv2.api.dto.Result;
 import cn.sciento.farm.automationv2.app.service.SafeShutdownService;
 import cn.sciento.farm.automationv2.domain.entity.TaskExecution;
 import cn.sciento.farm.automationv2.domain.enums.ExecutionStatus;
-import cn.sciento.farm.automationv2.infra.repository.TaskExecutionMapper;
+import cn.sciento.farm.automationv2.infra.mapper.TaskExecutionMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;

+ 86 - 0
src/main/java/cn/sciento/farm/automationv2/api/controller/IrrigationGroupController.java

@@ -0,0 +1,86 @@
+package cn.sciento.farm.automationv2.api.controller;
+
+import cn.sciento.core.domain.Page;
+import cn.sciento.core.exception.CommonException;
+import cn.sciento.core.iam.ResourceLevel;
+import cn.sciento.core.util.Results;
+import cn.sciento.farm.automationv2.api.dto.IrrigationGroupDTO;
+import cn.sciento.farm.automationv2.app.service.irrigationGroup.IrrigationGroupService;
+import cn.sciento.farm.automationv2.domain.entity.IrrigationGroup;
+import cn.sciento.swagger.annotation.Permission;
+import io.choerodon.mybatis.pagehelper.annotation.PageableDefault;
+import io.choerodon.mybatis.pagehelper.domain.PageRequest;
+import io.choerodon.mybatis.pagehelper.domain.Sort;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * @author Jayhaw
+ * @description
+ * @date 2021/4/10 10:51
+ */
+@RestController
+@Api("灌溉组接口")
+@RequestMapping("/v2/{tenantId}/irrigation-group")
+public class IrrigationGroupController {
+
+    private IrrigationGroupService service;
+
+    public IrrigationGroupController(IrrigationGroupService service) {
+        this.service = service;
+    }
+
+    @ApiOperation("添加信息")
+    @Permission(level = ResourceLevel.ORGANIZATION)
+    @PostMapping
+    public ResponseEntity<IrrigationGroup> create(@PathVariable Long tenantId, @RequestBody IrrigationGroupDTO dto){
+        dto.setTenantId(tenantId);
+        return Results.success(service.create(dto));
+    }
+
+    @ApiOperation("修改信息")
+    @Permission(level = ResourceLevel.ORGANIZATION)
+    @PutMapping
+    public ResponseEntity<IrrigationGroup> update(@PathVariable Long tenantId, @RequestBody IrrigationGroupDTO dto){
+        if (dto.getId() == null){
+            throw new CommonException("wfautoV2.parameter.incomplete");
+        }
+        dto.setTenantId(tenantId);
+        return Results.success(service.update(dto));
+    }
+
+    @ApiOperation("获取信息详情")
+    @Permission(level = ResourceLevel.ORGANIZATION)
+    @GetMapping("/{planId}")
+    public ResponseEntity<IrrigationGroupDTO> get(@PathVariable Long tenantId, @PathVariable Long planId){
+        return Results.success(service.queryByDetail(tenantId,planId));
+    }
+
+    @ApiOperation("通过id删除信息")
+    @Permission(level = ResourceLevel.ORGANIZATION)
+    @DeleteMapping
+    public ResponseEntity<Integer> delete(@PathVariable Long tenantId, @RequestBody IrrigationGroup irrigationGroup){
+//        SecurityTokenHelper.validToken(irrigationGroup);
+        if(irrigationGroup.getId() == null || irrigationGroup.getId() < 0){
+            throw new CommonException("wfautoV2.parameter.incomplete");
+        }
+        irrigationGroup.setTenantId(tenantId);
+        return Results.success(service.delete(irrigationGroup));
+    }
+
+
+    @ApiOperation("分页获取信息列表")
+    @Permission(level = ResourceLevel.ORGANIZATION)
+    @GetMapping("/page")
+    public ResponseEntity<Page<IrrigationGroup>> page(@PathVariable Long tenantId,
+                                               IrrigationGroup irrigationGroup,
+                                               @PageableDefault(page = 1,size = 20,sort = {"creation_date"}, direction = Sort.Direction.DESC) PageRequest pageRequest){
+        irrigationGroup.setTenantId(tenantId);
+        return Results.success(service.page(irrigationGroup,pageRequest));
+    }
+
+
+}

+ 2 - 2
src/main/java/cn/sciento/farm/automationv2/api/controller/IrrigationTaskController.java

@@ -8,8 +8,8 @@ import cn.sciento.farm.automationv2.app.service.TaskTriggerService;
 import cn.sciento.farm.automationv2.domain.entity.IrrigationTask;
 import cn.sciento.farm.automationv2.domain.entity.TaskGroupConfig;
 import cn.sciento.farm.automationv2.domain.enums.*;
-import cn.sciento.farm.automationv2.infra.repository.IrrigationTaskMapper;
-import cn.sciento.farm.automationv2.infra.repository.TaskGroupConfigMapper;
+import cn.sciento.farm.automationv2.infra.mapper.IrrigationTaskMapper;
+import cn.sciento.farm.automationv2.infra.mapper.TaskGroupConfigMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;

+ 42 - 0
src/main/java/cn/sciento/farm/automationv2/api/dto/BallValuesDTO.java

@@ -0,0 +1,42 @@
+package cn.sciento.farm.automationv2.api.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 轮罐组 - 球阀DTO
+ */
+@Data
+public class BallValuesDTO {
+
+    /**
+     * 设备Id
+     */
+    @NotNull(message = "设备不能为空")
+    private Long deviceId;
+
+    /**
+     * 设备名称
+     */
+    @NotBlank(message = "设备名称不能为空")
+    private String deviceName;
+
+    /**
+     * 控制方向
+     */
+    @NotNull(message = "阀口方向不能为空")
+    private Integer sw;
+
+    /**
+     * 目标开度
+     */
+    private Integer targetAngle;
+
+    /**
+     * 目标压力
+     */
+    private Integer targetPressureKpa;
+
+}

+ 67 - 0
src/main/java/cn/sciento/farm/automationv2/api/dto/IrrigationGroupDTO.java

@@ -0,0 +1,67 @@
+package cn.sciento.farm.automationv2.api.dto;
+
+import cn.sciento.farm.automationv2.domain.entity.IrrigationGroup;
+import cn.sciento.farm.automationv2.infra.utils.BeanCopyUtils;
+import com.alibaba.fastjson.JSON;
+import lombok.Data;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * 轮罐组DTO
+ */
+@Data
+public class IrrigationGroupDTO {
+
+    /**
+     * 灌溉组ID
+     */
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    /**
+     * 灌溉组名称
+     */
+    private String groupName;
+
+    /**
+     * 灌区目标压力(bar)
+     * 仅在任务压力模式为 PUMP_ZONE 时生效,灌区切换时系统自动下发新压力值
+     */
+    private Integer zonePressureKpa;
+
+    /**
+     * 是否启用:1启用 0禁用
+     */
+    private Integer enabledFlag;
+
+    /**
+     * 租户ID
+     */
+    private Long tenantId;
+
+    /**
+     * 基地ID
+     */
+    @NotNull(message = "所属基地不能为空")
+    private Long organizationId;
+
+    /**
+     * 球阀列表
+     */
+    private List<BallValuesDTO> ballValuesDTOS;
+
+    public IrrigationGroup build(){
+        IrrigationGroup group = new IrrigationGroup();
+        BeanCopyUtils.copyProperties(this,group);
+        if (ballValuesDTOS != null){
+            group.setBallValves(JSON.toJSONString(ballValuesDTOS));
+        }
+        return group;
+    }
+
+}

+ 1 - 1
src/main/java/cn/sciento/farm/automationv2/app/service/AlarmNotificationService.java

@@ -3,7 +3,7 @@ package cn.sciento.farm.automationv2.app.service;
 import cn.sciento.farm.automationv2.domain.entity.AlarmRecord;
 import cn.sciento.farm.automationv2.domain.enums.AlarmType;
 import cn.sciento.farm.automationv2.infra.feign.SmsServiceClient;
-import cn.sciento.farm.automationv2.infra.repository.AlarmRecordMapper;
+import cn.sciento.farm.automationv2.infra.mapper.AlarmRecordMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;

+ 2 - 3
src/main/java/cn/sciento/farm/automationv2/app/service/AlarmRecordService.java

@@ -4,9 +4,8 @@ import cn.sciento.farm.automationv2.domain.entity.AlarmRecord;
 import cn.sciento.farm.automationv2.domain.entity.TaskExecution;
 import cn.sciento.farm.automationv2.domain.enums.AlarmType;
 import cn.sciento.farm.automationv2.domain.valueobject.DeviceInfo;
-import cn.sciento.farm.automationv2.domain.valueobject.ExecutionNode;
-import cn.sciento.farm.automationv2.infra.repository.AlarmRecordMapper;
-import cn.sciento.farm.automationv2.infra.repository.TaskExecutionMapper;
+import cn.sciento.farm.automationv2.infra.mapper.AlarmRecordMapper;
+import cn.sciento.farm.automationv2.infra.mapper.TaskExecutionMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;

+ 1 - 1
src/main/java/cn/sciento/farm/automationv2/app/service/LinkageRuleEngine.java

@@ -1,7 +1,7 @@
 package cn.sciento.farm.automationv2.app.service;
 
 import cn.sciento.farm.automationv2.domain.entity.LinkageRule;
-import cn.sciento.farm.automationv2.infra.repository.LinkageRuleMapper;
+import cn.sciento.farm.automationv2.infra.mapper.LinkageRuleMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.redis.core.StringRedisTemplate;

+ 1 - 1
src/main/java/cn/sciento/farm/automationv2/app/service/QuartzManagementService.java

@@ -2,7 +2,7 @@ package cn.sciento.farm.automationv2.app.service;
 
 import cn.sciento.farm.automationv2.app.job.IrrigationScheduledJob;
 import cn.sciento.farm.automationv2.domain.entity.IrrigationTask;
-import cn.sciento.farm.automationv2.infra.repository.IrrigationTaskMapper;
+import cn.sciento.farm.automationv2.infra.mapper.IrrigationTaskMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.quartz.*;

+ 1 - 2
src/main/java/cn/sciento/farm/automationv2/app/service/RetryManager.java

@@ -1,11 +1,10 @@
 package cn.sciento.farm.automationv2.app.service;
 
 import cn.sciento.farm.automationv2.domain.entity.TaskExecution;
-import cn.sciento.farm.automationv2.domain.enums.NodeStatus;
 import cn.sciento.farm.automationv2.domain.valueobject.DeviceInfo;
 import cn.sciento.farm.automationv2.domain.valueobject.ExecutionNode;
 import cn.sciento.farm.automationv2.infra.mq.producer.FlowControlProducer;
-import cn.sciento.farm.automationv2.infra.repository.TaskExecutionMapper;
+import cn.sciento.farm.automationv2.infra.mapper.TaskExecutionMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;

+ 1 - 1
src/main/java/cn/sciento/farm/automationv2/app/service/SafeShutdownService.java

@@ -7,7 +7,7 @@ import cn.sciento.farm.automationv2.domain.valueobject.ExecutionNode;
 import cn.sciento.farm.automationv2.domain.valueobject.ExecutionPlan;
 import cn.sciento.farm.automationv2.infra.mq.producer.DeviceCommandProducer;
 import cn.sciento.farm.automationv2.infra.redis.AckManager;
-import cn.sciento.farm.automationv2.infra.repository.TaskExecutionMapper;
+import cn.sciento.farm.automationv2.infra.mapper.TaskExecutionMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;

+ 2 - 3
src/main/java/cn/sciento/farm/automationv2/app/service/TaskExecutionEngine.java

@@ -9,13 +9,12 @@ import cn.sciento.farm.automationv2.domain.enums.AckStatus;
 import cn.sciento.farm.automationv2.domain.enums.ExecutionStatus;
 import cn.sciento.farm.automationv2.domain.enums.NodeStatus;
 import cn.sciento.farm.automationv2.domain.enums.NodeType;
-import cn.sciento.farm.automationv2.domain.valueobject.DeviceInfo;
 import cn.sciento.farm.automationv2.domain.valueobject.ExecutionNode;
 import cn.sciento.farm.automationv2.infra.mq.producer.FlowControlProducer;
 import cn.sciento.farm.automationv2.infra.redis.AckManager;
 import cn.sciento.farm.automationv2.infra.redis.IdempotencyManager;
-import cn.sciento.farm.automationv2.infra.repository.IrrigationTaskMapper;
-import cn.sciento.farm.automationv2.infra.repository.TaskExecutionMapper;
+import cn.sciento.farm.automationv2.infra.mapper.IrrigationTaskMapper;
+import cn.sciento.farm.automationv2.infra.mapper.TaskExecutionMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;

+ 5 - 5
src/main/java/cn/sciento/farm/automationv2/app/service/TaskTriggerService.java

@@ -10,10 +10,10 @@ import cn.sciento.farm.automationv2.domain.service.ExecutionPlanGenerator;
 import cn.sciento.farm.automationv2.domain.valueobject.ExecutionPlan;
 import cn.sciento.farm.automationv2.domain.valueobject.ZoneConfigView;
 import cn.sciento.farm.automationv2.infra.mq.producer.FlowControlProducer;
-import cn.sciento.farm.automationv2.infra.repository.IrrigationGroupMapper;
-import cn.sciento.farm.automationv2.infra.repository.IrrigationTaskMapper;
-import cn.sciento.farm.automationv2.infra.repository.TaskExecutionMapper;
-import cn.sciento.farm.automationv2.infra.repository.TaskGroupConfigMapper;
+import cn.sciento.farm.automationv2.infra.mapper.IrrigationGroupMapper;
+import cn.sciento.farm.automationv2.infra.mapper.IrrigationTaskMapper;
+import cn.sciento.farm.automationv2.infra.mapper.TaskExecutionMapper;
+import cn.sciento.farm.automationv2.infra.mapper.TaskGroupConfigMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -83,7 +83,7 @@ public class TaskTriggerService {
         List<Long> groupIds = groupConfigs.stream()
                 .map(TaskGroupConfig::getGroupId)
                 .collect(Collectors.toList());
-        List<IrrigationGroup> groups = irrigationGroupMapper.selectByIds(groupIds);
+        List<IrrigationGroup> groups = irrigationGroupMapper.selectByIdsList(groupIds);
 
         Map<Long, IrrigationGroup> groupMap = groups.stream()
                 .collect(Collectors.toMap(IrrigationGroup::getId, g -> g));

+ 2 - 4
src/main/java/cn/sciento/farm/automationv2/app/service/WatchdogService.java

@@ -1,16 +1,14 @@
 package cn.sciento.farm.automationv2.app.service;
 
 import cn.sciento.farm.automationv2.domain.entity.TaskExecution;
-import cn.sciento.farm.automationv2.domain.enums.ExecutionStatus;
 import cn.sciento.farm.automationv2.infra.mq.producer.FlowControlProducer;
-import cn.sciento.farm.automationv2.infra.repository.TaskExecutionMapper;
+import cn.sciento.farm.automationv2.infra.mapper.TaskExecutionMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
-import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -42,7 +40,7 @@ public class WatchdogService {
     /**
      * 是否启用看门狗
      */
-    @Value("${watchdog.enabled:true}")
+    @Value("${watchdog.enabled:false}")
     private boolean enabled;
 
     /**

+ 63 - 0
src/main/java/cn/sciento/farm/automationv2/app/service/irrigationGroup/IrrigationGroupService.java

@@ -0,0 +1,63 @@
+package cn.sciento.farm.automationv2.app.service.irrigationGroup;
+
+
+import cn.sciento.core.domain.Page;
+
+import cn.sciento.farm.automationv2.api.dto.IrrigationGroupDTO;
+import cn.sciento.farm.automationv2.domain.entity.IrrigationGroup;
+import io.choerodon.mybatis.pagehelper.domain.PageRequest;
+
+/**
+ * @author Jayhaw
+ * @description
+ * @date 2021/4/10 11:13
+ */
+public interface IrrigationGroupService {
+    /**
+     * 添加信息
+     * @param irrigationGroup
+     * @return irrigationGroup
+     */
+    IrrigationGroup create(IrrigationGroupDTO dto);
+
+    /**
+     * 修改信息
+     * @param dto
+     * @return
+     */
+    IrrigationGroup update(IrrigationGroupDTO dto);
+
+    /**
+     * 通过ID获取信息
+     * @param tenantId,Id
+     * @return
+     */
+    IrrigationGroup queryById(Long tenantId, Long id);
+
+    /**
+     * 详情
+     * @param tenantId
+     * @param id
+     * @return
+     */
+    IrrigationGroupDTO queryByDetail(Long tenantId, Long id);
+
+    /**
+     *删除
+     * @param irrigationGroup
+     * @return
+     */
+    Integer delete(IrrigationGroup irrigationGroup);
+
+
+
+    /**
+     *获取page
+     * @param irrigationGroup
+     * @return
+     */
+    Page<IrrigationGroup> page(IrrigationGroup irrigationGroup,PageRequest pageRequest);
+
+
+
+}

+ 119 - 0
src/main/java/cn/sciento/farm/automationv2/app/service/irrigationGroup/impl/IrrigationGroupServiceImpl.java

@@ -0,0 +1,119 @@
+package cn.sciento.farm.automationv2.app.service.irrigationGroup.impl;
+
+
+
+import cn.sciento.core.domain.Page;
+import cn.sciento.core.exception.CommonException;
+import cn.sciento.core.util.ValidUtils;
+import cn.sciento.farm.automationv2.api.dto.BallValuesDTO;
+import cn.sciento.farm.automationv2.api.dto.IrrigationGroupDTO;
+import cn.sciento.farm.automationv2.app.service.irrigationGroup.IrrigationGroupService;
+
+import cn.sciento.farm.automationv2.domain.entity.IrrigationGroup;
+import cn.sciento.farm.automationv2.domain.repository.IrrigationGroupRepository;
+import cn.sciento.farm.automationv2.infra.constant.BaseConstant;
+import cn.sciento.farm.automationv2.infra.utils.BeanCopyUtils;
+import cn.sciento.mybatis.domian.Condition;
+import cn.sciento.mybatis.util.Sqls;
+import com.alibaba.fastjson.JSON;
+import io.choerodon.mybatis.pagehelper.PageHelper;
+import io.choerodon.mybatis.pagehelper.domain.PageRequest;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.validation.Validator;
+import java.util.List;
+
+
+/**
+ * @author Jayhaw
+ * @description
+ * @date 2021/1/18 15:51
+ */
+@Transactional(rollbackFor = Exception.class)
+@Service
+public class IrrigationGroupServiceImpl implements IrrigationGroupService {
+
+    private IrrigationGroupRepository irrigationGroupRepository;
+
+    private Validator validator;
+
+    public IrrigationGroupServiceImpl(IrrigationGroupRepository irrigationGroupRepository,
+                                      Validator validator) {
+        this.irrigationGroupRepository = irrigationGroupRepository;
+        this.validator = validator;
+    }
+
+    @Override
+    public IrrigationGroup create(IrrigationGroupDTO dto) {
+        validDTO(dto);
+        IrrigationGroup group = dto.build();
+        Integer result = irrigationGroupRepository.insertSelective(group);
+        return result>0?group:null;
+    }
+
+    private void validDTO(IrrigationGroupDTO dto) {
+        ValidUtils.valid(validator, dto);
+        if (dto.getBallValuesDTOS() != null) {
+            ValidUtils.valid(validator, dto.getBallValuesDTOS());
+        }
+    }
+
+
+    @Override
+    public IrrigationGroup update(IrrigationGroupDTO dto) {
+        IrrigationGroup resultIrrigationGroup = queryById(dto.getTenantId(), dto.getId());
+        if (resultIrrigationGroup == null) {
+            throw new CommonException("wfautoV2.parameter.error");
+        }
+        validDTO(dto);
+        IrrigationGroup group = dto.build();
+        Integer result = irrigationGroupRepository.updateByPrimaryKeySelective(group);
+        return result>0?group:null;
+    }
+
+    @Override
+    public IrrigationGroup queryById(Long tenantId, Long id) {
+        if( id == null || id < 0){
+            throw new CommonException("wfautoV2.parameter.incomplete");
+        }
+        return irrigationGroupRepository.queryByTenantIdAndId(tenantId,id);
+    }
+
+    @Override
+    public IrrigationGroupDTO queryByDetail(Long tenantId, Long id) {
+        IrrigationGroup group = queryById(tenantId, id);
+        IrrigationGroupDTO dto = new IrrigationGroupDTO();
+        if (group != null){
+            BeanCopyUtils.copyProperties(group,dto);
+            dto.setBallValuesDTOS(JSON.parseArray(group.getBallValves(), BallValuesDTO.class));
+        }
+        return dto;
+    }
+
+    @Override
+    public Integer delete(IrrigationGroup irrigationGroup) {
+        IrrigationGroup resultIrrigationGroup = queryById(irrigationGroup.getTenantId(), irrigationGroup.getId());
+        if (resultIrrigationGroup == null) {
+            throw new CommonException("wfautoV2.parameter.error");
+        }
+        resultIrrigationGroup.setEnabledFlag(BaseConstant.ENABLE);
+        return irrigationGroupRepository.updateByPrimaryKeySelective(resultIrrigationGroup);
+    }
+
+
+    @Override
+    public Page<IrrigationGroup> page(IrrigationGroup irrigationGroup,PageRequest pageRequest) {
+        return PageHelper.doPageAndSort(pageRequest,() -> {
+            return irrigationGroupRepository.selectByCondition(Condition.builder(IrrigationGroup.class)
+                    .where(Sqls.custom()
+                            .andEqualTo(BaseConstant.TENANT_ID,irrigationGroup.getTenantId())
+                            .andEqualTo(BaseConstant.ORGANIZATION_ID,irrigationGroup.getOrganizationId())
+                            .andLike(BaseConstant.IRRIGATION_GROUP_NAME,irrigationGroup.getGroupName(),true)
+                            .andEqualTo(BaseConstant.ENABLED_FLAG,irrigationGroup.getEnabledFlag(),true)
+                    )
+                    .build());
+        });
+
+    }
+}

+ 0 - 15
src/main/java/cn/sciento/farm/automationv2/config/MyBatisConfig.java

@@ -1,15 +0,0 @@
-package cn.sciento.farm.automationv2.config;
-
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * MyBatis 配置类
- */
-@Configuration
-@MapperScan("cn.sciento.farm.automationv2.infra.repository")
-public class MyBatisConfig {
-
-    // MyBatis配置已在application.yml中配置
-    // 本类主要用于扫描Mapper接口
-}

+ 8 - 0
src/main/java/cn/sciento/farm/automationv2/domain/entity/AlarmRecord.java

@@ -2,11 +2,15 @@ package cn.sciento.farm.automationv2.domain.entity;
 
 import cn.sciento.farm.automationv2.domain.enums.AlarmType;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
 import java.time.LocalDateTime;
 
 /**
@@ -14,6 +18,8 @@ import java.time.LocalDateTime;
  * 对应数据库表:alarm_record
  */
 @Data
+@Table(name = "wfauto_v2_alarm_record")
+@ApiModel("报警记录实体")
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
@@ -22,6 +28,8 @@ public class AlarmRecord {
     /**
      * 报警记录唯一ID
      */
+    @Id
+    @GeneratedValue
     private Long id;
 
     /**

+ 5 - 13
src/main/java/cn/sciento/farm/automationv2/domain/entity/IrrigationGroup.java

@@ -13,6 +13,7 @@ import lombok.NoArgsConstructor;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
 import java.time.LocalDateTime;
 
 /**
@@ -41,12 +42,7 @@ public class IrrigationGroup extends AuditDomain {
     private String groupName;
 
     /**
-     * 灌溉组编码
-     */
-    private String groupCode;
-
-    /**
-     * 分区压力(kPa)
+     * 灌区目标压力(bar)
      * 仅在任务压力模式为 PUMP_ZONE 时生效,灌区切换时系统自动下发新压力值
      */
     private Integer zonePressureKpa;
@@ -67,7 +63,7 @@ public class IrrigationGroup extends AuditDomain {
     /**
      * 是否启用:1启用 0禁用
      */
-    private Integer enabled;
+    private Integer enabledFlag;
 
     /**
      * 租户ID
@@ -77,10 +73,6 @@ public class IrrigationGroup extends AuditDomain {
     /**
      * 基地ID
      */
-    private Long areaId;
-
-    /**
-     * 逻辑删除:0未删除 1已删除
-     */
-    private Integer deleted;
+    @NotNull(message = "所属基地不能为空")
+    private Long organizationId;
 }

+ 8 - 5
src/main/java/cn/sciento/farm/automationv2/domain/entity/IrrigationTask.java

@@ -2,11 +2,15 @@ package cn.sciento.farm.automationv2.domain.entity;
 
 import cn.sciento.farm.automationv2.domain.enums.*;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
 import java.time.LocalDateTime;
 
 /**
@@ -14,6 +18,8 @@ import java.time.LocalDateTime;
  * 对应数据库表:irrigation_task
  */
 @Data
+@Table(name = "wfauto_v2_irrigation_task")
+@ApiModel("轮灌任务配置")
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
@@ -22,6 +28,8 @@ public class IrrigationTask {
     /**
      * 任务ID
      */
+    @Id
+    @GeneratedValue
     private Long id;
 
     /**
@@ -30,11 +38,6 @@ public class IrrigationTask {
     private String taskName;
 
     /**
-     * 任务编码(唯一)
-     */
-    private String taskCode;
-
-    /**
      * 触发类型:SCHEDULED / LINKAGE / MANUAL
      */
     private TriggerType triggerType;

+ 8 - 0
src/main/java/cn/sciento/farm/automationv2/domain/entity/LinkageRule.java

@@ -1,11 +1,15 @@
 package cn.sciento.farm.automationv2.domain.entity;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
@@ -14,6 +18,8 @@ import java.time.LocalDateTime;
  * 对应数据库表:linkage_rule
  */
 @Data
+@Table(name = "wfauto_v2_link_rule")
+@ApiModel("传感器联动规则")
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
@@ -22,6 +28,8 @@ public class LinkageRule {
     /**
      * 规则ID
      */
+    @Id
+    @GeneratedValue
     private Long id;
 
     /**

+ 12 - 0
src/main/java/cn/sciento/farm/automationv2/domain/entity/TaskExecution.java

@@ -4,12 +4,19 @@ import cn.sciento.farm.automationv2.domain.enums.ExecutionStatus;
 import cn.sciento.farm.automationv2.domain.enums.TriggerType;
 import cn.sciento.farm.automationv2.domain.valueobject.ExecutionNode;
 import cn.sciento.farm.automationv2.domain.valueobject.ExecutionPlan;
+import cn.sciento.mybatis.handler.JSONHandler;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import io.choerodon.mybatis.annotation.ColumnType;
+import io.swagger.annotations.ApiModel;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.apache.ibatis.type.JdbcType;
 
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
 import java.time.LocalDateTime;
 
 /**
@@ -17,6 +24,8 @@ import java.time.LocalDateTime;
  * 对应数据库表:task_execution
  */
 @Data
+@Table(name = "wfauto_v2_task_execution")
+@ApiModel("任务执行实例")
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
@@ -25,6 +34,8 @@ public class TaskExecution {
     /**
      * 执行实例唯一ID
      */
+    @Id
+    @GeneratedValue
     private Long id;
 
     /**
@@ -46,6 +57,7 @@ public class TaskExecution {
      * 执行计划(核心字段:预生成的完整有序节点列表)
      * 数据库中存储为JSON格式
      */
+    @ColumnType(jdbcType = JdbcType.VARCHAR, typeHandler = JSONHandler.class)
     private ExecutionPlan executionPlan;
 
     /**

+ 8 - 0
src/main/java/cn/sciento/farm/automationv2/domain/entity/TaskGroupConfig.java

@@ -1,11 +1,15 @@
 package cn.sciento.farm.automationv2.domain.entity;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
 import java.time.LocalDateTime;
 
 /**
@@ -14,6 +18,8 @@ import java.time.LocalDateTime;
  * 对应数据库表:task_group_config
  */
 @Data
+@Table(name = "wfauto_v2_task_group_config")
+@ApiModel("任务灌区配置")
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
@@ -22,6 +28,8 @@ public class TaskGroupConfig {
     /**
      * 配置ID
      */
+    @Id
+    @GeneratedValue
     private Long id;
 
     /**

+ 18 - 0
src/main/java/cn/sciento/farm/automationv2/domain/repository/AlarmRecordRepository.java

@@ -0,0 +1,18 @@
+package cn.sciento.farm.automationv2.domain.repository;
+
+import cn.sciento.farm.automationv2.domain.entity.AlarmRecord;
+import cn.sciento.mybatis.base.BaseRepository;
+
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author JayHaw
+ * @since 2026/02/27
+ */
+public interface AlarmRecordRepository extends BaseRepository<AlarmRecord> {
+
+}

+ 24 - 0
src/main/java/cn/sciento/farm/automationv2/domain/repository/IrrigationGroupRepository.java

@@ -0,0 +1,24 @@
+package cn.sciento.farm.automationv2.domain.repository;
+
+import cn.sciento.farm.automationv2.domain.entity.IrrigationGroup;
+import cn.sciento.mybatis.base.BaseRepository;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author JayHaw
+ * @since 2026/02/27
+ */
+public interface IrrigationGroupRepository extends BaseRepository<IrrigationGroup> {
+
+    /**
+     * 查询
+     * @param tenantId
+     * @param Id
+     * @return
+     */
+    IrrigationGroup queryByTenantIdAndId(Long tenantId,Long id);
+
+}

+ 16 - 0
src/main/java/cn/sciento/farm/automationv2/domain/repository/IrrigationTaskRepository.java

@@ -0,0 +1,16 @@
+package cn.sciento.farm.automationv2.domain.repository;
+
+import cn.sciento.farm.automationv2.domain.entity.IrrigationTask;
+import cn.sciento.mybatis.base.BaseRepository;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author JayHaw
+ * @since 2026/02/27
+ */
+public interface IrrigationTaskRepository extends BaseRepository<IrrigationTask> {
+
+}

+ 16 - 0
src/main/java/cn/sciento/farm/automationv2/domain/repository/LinkageRuleRepository.java

@@ -0,0 +1,16 @@
+package cn.sciento.farm.automationv2.domain.repository;
+
+import cn.sciento.farm.automationv2.domain.entity.LinkageRule;
+import cn.sciento.mybatis.base.BaseRepository;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author JayHaw
+ * @since 2026/02/27
+ */
+public interface LinkageRuleRepository extends BaseRepository<LinkageRule> {
+
+}

+ 17 - 0
src/main/java/cn/sciento/farm/automationv2/domain/repository/TaskExecutionRepository.java

@@ -0,0 +1,17 @@
+package cn.sciento.farm.automationv2.domain.repository;
+
+
+import cn.sciento.farm.automationv2.domain.entity.TaskExecution;
+import cn.sciento.mybatis.base.BaseRepository;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author JayHaw
+ * @since 2026/02/27
+ */
+public interface TaskExecutionRepository extends BaseRepository<TaskExecution> {
+
+}

+ 17 - 0
src/main/java/cn/sciento/farm/automationv2/domain/repository/TaskGroupConfigRepository.java

@@ -0,0 +1,17 @@
+package cn.sciento.farm.automationv2.domain.repository;
+
+
+import cn.sciento.farm.automationv2.domain.entity.TaskGroupConfig;
+import cn.sciento.mybatis.base.BaseRepository;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author JayHaw
+ * @since 2026/02/27
+ */
+public interface TaskGroupConfigRepository extends BaseRepository<TaskGroupConfig> {
+
+}

+ 24 - 0
src/main/java/cn/sciento/farm/automationv2/infra/constant/BaseConstant.java

@@ -0,0 +1,24 @@
+package cn.sciento.farm.automationv2.infra.constant;
+
+/**
+ * @Date 2026年02月28日 16:05
+ * @Author Jayhaw
+ * @Description 公共字段
+ * @Verion 1.0
+ */
+public interface BaseConstant {
+
+    String TENANT_ID = "tenantId";
+
+    /** 基地Id */
+    String ORGANIZATION_ID = "organizationId";
+
+    /** 灌溉组名称 */
+    String IRRIGATION_GROUP_NAME = "groupName";
+
+    /** 是否可用 */
+    String ENABLED_FLAG = "enabledFlag";
+
+    Integer ENABLE = 1;
+
+}

+ 4 - 3
src/main/java/cn/sciento/farm/automationv2/infra/repository/AlarmRecordMapper.java → src/main/java/cn/sciento/farm/automationv2/infra/mapper/AlarmRecordMapper.java

@@ -1,6 +1,7 @@
-package cn.sciento.farm.automationv2.infra.repository;
+package cn.sciento.farm.automationv2.infra.mapper;
 
 import cn.sciento.farm.automationv2.domain.entity.AlarmRecord;
+import io.choerodon.mybatis.common.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -9,8 +10,8 @@ import java.util.List;
 /**
  * 报警记录 Mapper
  */
-@Mapper
-public interface AlarmRecordMapper {
+
+public interface AlarmRecordMapper extends BaseMapper<AlarmRecord> {
 
     /**
      * 插入报警记录

+ 6 - 4
src/main/java/cn/sciento/farm/automationv2/infra/repository/IrrigationGroupMapper.java → src/main/java/cn/sciento/farm/automationv2/infra/mapper/IrrigationGroupMapper.java

@@ -1,6 +1,8 @@
-package cn.sciento.farm.automationv2.infra.repository;
+package cn.sciento.farm.automationv2.infra.mapper;
 
+import cn.sciento.farm.automationv2.domain.entity.AlarmRecord;
 import cn.sciento.farm.automationv2.domain.entity.IrrigationGroup;
+import io.choerodon.mybatis.common.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -9,8 +11,8 @@ import java.util.List;
 /**
  * 灌溉组 Mapper
  */
-@Mapper
-public interface IrrigationGroupMapper {
+
+public interface IrrigationGroupMapper extends BaseMapper<IrrigationGroup> {
 
     /**
      * 插入灌溉组
@@ -30,7 +32,7 @@ public interface IrrigationGroupMapper {
     /**
      * 根据ID列表批量查询
      */
-    List<IrrigationGroup> selectByIds(@Param("ids") List<Long> ids);
+    List<IrrigationGroup> selectByIdsList(@Param("ids") List<Long> ids);
 
     /**
      * 根据任务ID查询所有灌溉组(按sortOrder排序)

+ 4 - 3
src/main/java/cn/sciento/farm/automationv2/infra/repository/IrrigationTaskMapper.java → src/main/java/cn/sciento/farm/automationv2/infra/mapper/IrrigationTaskMapper.java

@@ -1,6 +1,7 @@
-package cn.sciento.farm.automationv2.infra.repository;
+package cn.sciento.farm.automationv2.infra.mapper;
 
 import cn.sciento.farm.automationv2.domain.entity.IrrigationTask;
+import io.choerodon.mybatis.common.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -9,8 +10,8 @@ import java.util.List;
 /**
  * 轮灌任务 Mapper
  */
-@Mapper
-public interface IrrigationTaskMapper {
+
+public interface IrrigationTaskMapper extends BaseMapper<IrrigationTask> {
 
     /**
      * 插入任务

+ 4 - 3
src/main/java/cn/sciento/farm/automationv2/infra/repository/LinkageRuleMapper.java → src/main/java/cn/sciento/farm/automationv2/infra/mapper/LinkageRuleMapper.java

@@ -1,6 +1,7 @@
-package cn.sciento.farm.automationv2.infra.repository;
+package cn.sciento.farm.automationv2.infra.mapper;
 
 import cn.sciento.farm.automationv2.domain.entity.LinkageRule;
+import io.choerodon.mybatis.common.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -9,8 +10,8 @@ import java.util.List;
 /**
  * 联动规则 Mapper
  */
-@Mapper
-public interface LinkageRuleMapper {
+
+public interface LinkageRuleMapper extends BaseMapper<LinkageRule> {
 
     /**
      * 插入规则

+ 4 - 3
src/main/java/cn/sciento/farm/automationv2/infra/repository/TaskExecutionMapper.java → src/main/java/cn/sciento/farm/automationv2/infra/mapper/TaskExecutionMapper.java

@@ -1,7 +1,8 @@
-package cn.sciento.farm.automationv2.infra.repository;
+package cn.sciento.farm.automationv2.infra.mapper;
 
 import cn.sciento.farm.automationv2.domain.entity.TaskExecution;
 import cn.sciento.farm.automationv2.domain.enums.ExecutionStatus;
+import io.choerodon.mybatis.common.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -11,8 +12,8 @@ import java.util.List;
 /**
  * 任务执行实例 Mapper
  */
-@Mapper
-public interface TaskExecutionMapper {
+
+public interface TaskExecutionMapper extends BaseMapper<TaskExecution> {
 
     /**
      * 插入执行实例

+ 4 - 3
src/main/java/cn/sciento/farm/automationv2/infra/repository/TaskGroupConfigMapper.java → src/main/java/cn/sciento/farm/automationv2/infra/mapper/TaskGroupConfigMapper.java

@@ -1,6 +1,7 @@
-package cn.sciento.farm.automationv2.infra.repository;
+package cn.sciento.farm.automationv2.infra.mapper;
 
 import cn.sciento.farm.automationv2.domain.entity.TaskGroupConfig;
+import io.choerodon.mybatis.common.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -9,8 +10,8 @@ import java.util.List;
 /**
  * 任务灌区配置 Mapper
  */
-@Mapper
-public interface TaskGroupConfigMapper {
+
+public interface TaskGroupConfigMapper extends BaseMapper<TaskGroupConfig> {
 
     /**
      * 插入任务灌区配置

+ 21 - 0
src/main/java/cn/sciento/farm/automationv2/infra/repository/impl/AlarmRecordRepositoryImpl.java

@@ -0,0 +1,21 @@
+package cn.sciento.farm.automationv2.infra.repository.impl;
+
+import cn.sciento.farm.automationv2.domain.entity.AlarmRecord;
+import cn.sciento.farm.automationv2.domain.repository.AlarmRecordRepository;
+import cn.sciento.mybatis.base.impl.BaseRepositoryImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ *       数据层
+ * </p>
+ *
+ * @author JayHaw
+ * @since 2026/02/27
+ */
+@Service
+public class AlarmRecordRepositoryImpl extends BaseRepositoryImpl<AlarmRecord> implements AlarmRecordRepository {
+
+}

+ 26 - 0
src/main/java/cn/sciento/farm/automationv2/infra/repository/impl/IrrigationGroupRepositoryImpl.java

@@ -0,0 +1,26 @@
+package cn.sciento.farm.automationv2.infra.repository.impl;
+
+import cn.sciento.farm.automationv2.domain.entity.IrrigationGroup;
+import cn.sciento.farm.automationv2.domain.repository.IrrigationGroupRepository;
+import cn.sciento.mybatis.base.impl.BaseRepositoryImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *       数据层
+ * </p>
+ *
+ * @author JayHaw
+ * @since 2026/02/27
+ */
+@Service
+public class IrrigationGroupRepositoryImpl extends BaseRepositoryImpl<IrrigationGroup> implements IrrigationGroupRepository {
+
+    @Override
+    public IrrigationGroup queryByTenantIdAndId(Long tenantId, Long id) {
+        IrrigationGroup group = new IrrigationGroup();
+        group.setTenantId(tenantId);
+        group.setId(id);
+        return selectOne(group);
+    }
+}

+ 19 - 0
src/main/java/cn/sciento/farm/automationv2/infra/repository/impl/IrrigationTaskRepositoryImpl.java

@@ -0,0 +1,19 @@
+package cn.sciento.farm.automationv2.infra.repository.impl;
+
+import cn.sciento.farm.automationv2.domain.entity.IrrigationTask;
+import cn.sciento.farm.automationv2.domain.repository.IrrigationTaskRepository;
+import cn.sciento.mybatis.base.impl.BaseRepositoryImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *       数据层
+ * </p>
+ *
+ * @author JayHaw
+ * @since 2026/02/27
+ */
+@Service
+public class IrrigationTaskRepositoryImpl extends BaseRepositoryImpl<IrrigationTask> implements IrrigationTaskRepository {
+
+}

+ 19 - 0
src/main/java/cn/sciento/farm/automationv2/infra/repository/impl/LinkageRuleRepositoryImpl.java

@@ -0,0 +1,19 @@
+package cn.sciento.farm.automationv2.infra.repository.impl;
+
+import cn.sciento.farm.automationv2.domain.entity.LinkageRule;
+import cn.sciento.farm.automationv2.domain.repository.LinkageRuleRepository;
+import cn.sciento.mybatis.base.impl.BaseRepositoryImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *       数据层
+ * </p>
+ *
+ * @author JayHaw
+ * @since 2026/02/27
+ */
+@Service
+public class LinkageRuleRepositoryImpl extends BaseRepositoryImpl<LinkageRule> implements LinkageRuleRepository {
+
+}

+ 19 - 0
src/main/java/cn/sciento/farm/automationv2/infra/repository/impl/TaskExecutionRepositoryImpl.java

@@ -0,0 +1,19 @@
+package cn.sciento.farm.automationv2.infra.repository.impl;
+
+import cn.sciento.farm.automationv2.domain.entity.TaskExecution;
+import cn.sciento.farm.automationv2.domain.repository.TaskExecutionRepository;
+import cn.sciento.mybatis.base.impl.BaseRepositoryImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *       数据层
+ * </p>
+ *
+ * @author JayHaw
+ * @since 2026/02/27
+ */
+@Service
+public class TaskExecutionRepositoryImpl extends BaseRepositoryImpl<TaskExecution> implements TaskExecutionRepository {
+
+}

+ 19 - 0
src/main/java/cn/sciento/farm/automationv2/infra/repository/impl/TaskGroupConfigRepositoryImpl.java

@@ -0,0 +1,19 @@
+package cn.sciento.farm.automationv2.infra.repository.impl;
+
+import cn.sciento.farm.automationv2.domain.entity.TaskGroupConfig;
+import cn.sciento.farm.automationv2.domain.repository.TaskGroupConfigRepository;
+import cn.sciento.mybatis.base.impl.BaseRepositoryImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *       数据层
+ * </p>
+ *
+ * @author JayHaw
+ * @since 2026/02/27
+ */
+@Service
+public class TaskGroupConfigRepositoryImpl extends BaseRepositoryImpl<TaskGroupConfig> implements TaskGroupConfigRepository {
+
+}

+ 19 - 0
src/main/java/cn/sciento/farm/automationv2/infra/typehandler/ExecutionPlanTypeHandler.java

@@ -0,0 +1,19 @@
+package cn.sciento.farm.automationv2.infra.typehandler;
+
+import cn.sciento.farm.automationv2.domain.valueobject.ExecutionPlan;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedJdbcTypes;
+import org.apache.ibatis.type.MappedTypes;
+
+/**
+ * ExecutionPlan类型处理器
+ * 用于处理ExecutionPlan对象与数据库JSON字段之间的转换
+ */
+@MappedTypes(ExecutionPlan.class)
+@MappedJdbcTypes(JdbcType.VARCHAR)
+public class ExecutionPlanTypeHandler extends JsonTypeHandler<ExecutionPlan> {
+
+    public ExecutionPlanTypeHandler() {
+        super(ExecutionPlan.class);
+    }
+}

+ 70 - 0
src/main/java/cn/sciento/farm/automationv2/infra/typehandler/JsonTypeHandler.java

@@ -0,0 +1,70 @@
+package cn.sciento.farm.automationv2.infra.typehandler;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedTypes;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * JSON类型处理器
+ * 用于处理Java对象与数据库JSON字段之间的转换
+ *
+ * @param <T> 要转换的对象类型
+ */
+@MappedTypes({Object.class})
+public class JsonTypeHandler<T> extends BaseTypeHandler<T> {
+
+    private static final ObjectMapper objectMapper = new ObjectMapper();
+    private final Class<T> type;
+
+    public JsonTypeHandler(Class<T> type) {
+        if (type == null) {
+            throw new IllegalArgumentException("Type argument cannot be null");
+        }
+        this.type = type;
+    }
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
+        try {
+            ps.setString(i, objectMapper.writeValueAsString(parameter));
+        } catch (JsonProcessingException e) {
+            throw new SQLException("Error converting object to JSON string", e);
+        }
+    }
+
+    @Override
+    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        String json = rs.getString(columnName);
+        return parseJson(json);
+    }
+
+    @Override
+    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        String json = rs.getString(columnIndex);
+        return parseJson(json);
+    }
+
+    @Override
+    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        String json = cs.getString(columnIndex);
+        return parseJson(json);
+    }
+
+    private T parseJson(String json) throws SQLException {
+        if (json == null || json.trim().isEmpty()) {
+            return null;
+        }
+        try {
+            return objectMapper.readValue(json, type);
+        } catch (JsonProcessingException e) {
+            throw new SQLException("Error converting JSON string to object", e);
+        }
+    }
+}

+ 85 - 0
src/main/java/cn/sciento/farm/automationv2/infra/utils/BeanCopyUtils.java

@@ -0,0 +1,85 @@
+package cn.sciento.farm.automationv2.infra.utils;
+
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.FatalBeanException;
+import org.springframework.util.Assert;
+import org.springframework.util.ClassUtils;
+
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
+/**
+ * @author walton
+ * @description
+ * @date 2021/1/26 14:33
+ */
+public class BeanCopyUtils extends BeanUtils {
+
+    /**
+     * 可以对象拷贝忽略为null的属性值
+     * */
+    public static void copyProperties(Object source, Object target) throws BeansException {
+
+
+        Assert.notNull(source, "Source must not be null");
+        Assert.notNull(target, "Target must not be null");
+        Class<?> actualEditable = target.getClass();
+
+        PropertyDescriptor[] targetPds = getPropertyDescriptors(actualEditable);
+        PropertyDescriptor[] var1 = targetPds;
+        int var2 = targetPds.length;
+
+        for (int var3 = 0; var3 < var2; ++var3) {
+            PropertyDescriptor targetPd = var1[var3];
+            Method writeMethod = targetPd.getWriteMethod();
+            if (writeMethod != null) {
+                PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName());
+                if (sourcePd != null) {
+                    Method readMethod = sourcePd.getReadMethod();
+                    if (readMethod != null && ClassUtils.isAssignable(writeMethod.getParameterTypes()[0], readMethod.getReturnType())) {
+                        try {
+                            if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {
+                                readMethod.setAccessible(true);
+                            }
+                            Object value = readMethod.invoke(source);
+                            // 判断value是否为空
+                            if (value != null) {
+                                if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {
+                                    writeMethod.setAccessible(true);
+                                }
+                                writeMethod.invoke(target, value);
+                            }
+                        } catch (Throwable var4) {
+                            throw new FatalBeanException("Could not copy property '" + targetPd.getName() + "' from source to target", var4);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+//    /**
+//     * 可以对象拷贝忽略为null的属性值
+//     */
+//    public static void copyProperties(Object src, Object target){
+//        BeanUtils.copyProperties(src, target, getNullPropertyNames(src));
+//    }
+//
+//    public static String[] getNullPropertyNames (Object source) {
+//        final BeanWrapper src = new BeanWrapperImpl(source);
+//        java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
+//
+//        Set<String> emptyNames = new HashSet<>();
+//        for(java.beans.PropertyDescriptor pd : pds) {
+//            Object srcValue = src.getPropertyValue(pd.getName());
+//            if (srcValue == null) {
+//                emptyNames.add(pd.getName());
+//            }
+//        }
+//        String[] result = new String[emptyNames.size()];
+//        return emptyNames.toArray(result);
+//    }
+
+}

+ 46 - 76
src/main/resources/application.yml

@@ -2,46 +2,51 @@
 spring:
   application:
     name: wf-equipment-automation-V2
-
-  profiles:
-    active: dev
-
+  liquibase:
+    enabled: false
+  data:
+    mongodb:
+      host: 192.168.10.18
+      port: 27017
+      database: stong-history
+      username: stong
+      password: stong
   # 数据源配置
   datasource:
-    driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://localhost:3306/irrigation_automation?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
+    url:  jdbc:mysql://192.168.10.18:3306/wf_platform_equipment?characterEncoding=UTF-8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8
     username: root
-    password: root
-    type: com.alibaba.druid.pool.DruidDataSource
-    druid:
-      initial-size: 5
-      min-idle: 5
-      max-active: 20
-      max-wait: 60000
-      validation-query: SELECT 1
-      test-while-idle: true
-      test-on-borrow: false
-      test-on-return: false
-
-  # Redis 配置
+    password: 666Stkj!
+    driverClassName: com.mysql.cj.jdbc.Driver
+    max-active: 20
+    max-idle: 8
+    min-idle: 8m
+    initial-size: 10
+  main:
+    allow-bean-definition-overriding: true
+  servlet:
+    multipart:
+      # 单个文件上传最大
+      maxFileSize: ${SPRING_SERVLET_MULTIPART_MAX_FILE_SIZE:100MB}
+      # 上传请求最大限制
+      maxRequestSize: ${SPRING_SERVLET_MULTIPART_MAX_REQUEST_SIZE:100MB}
   redis:
-    host: localhost
-    port: 6379
-    password:
-    database: 0
-    timeout: 5000
-    jedis:
+    #    host: ${SPRING_REDIS_HOST:192.168.100.11}
+    host: ${SPRING_REDIS_HOST:192.168.10.18}
+    port: ${SPRING_REDIS_PORT:6379}
+    database: ${SPRING_REDIS_DATABASE:3}
+    lettuce:
       pool:
-        max-active: 20
-        max-idle: 10
-        min-idle: 5
-        max-wait: 2000
+        # 资源池中最大连接数
+        # 默认8,-1表示无限制;可根据服务并发redis情况及服务端的支持上限调整
+        max-active: ${SPRING_REDIS_POOL_MAX_ACTIVE:50}
+        # 资源池运行最大空闲的连接数
+        # 默认8,-1表示无限制;可根据服务并发redis情况及服务端的支持上限调整,一般建议和max-active保持一致,避免资源伸缩带来的开销
+        max-idle: ${SPRING_REDIS_POOL_MAX_IDLE:50}
+        # 当资源池连接用尽后,调用者的最大等待时间(单位为毫秒)
+        # 默认 -1 表示永不超时,设置5秒
+        max-wait: ${SPRING_REDIS_POOL_MAX_WAIT:5000}
+
 
-  # Liquibase 数据库迁移
-  liquibase:
-    enabled: true
-    change-log: classpath:db/changelog/db.changelog-master.xml
-    drop-first: false
 
   # Quartz 调度器配置(集群模式)
   quartz:
@@ -69,7 +74,7 @@ spring:
 
 # RocketMQ 配置
 rocketmq:
-  name-server: localhost:9876
+  name-server: 192.168.10.18:9876
   producer:
     group: irrigation-producer-group
     send-message-timeout: 3000
@@ -86,40 +91,19 @@ rocketmq:
 
 # MyBatis 配置
 mybatis:
-  mapper-locations: classpath:mapper/*.xml
-  type-aliases-package: cn.sciento.farm.automationv2.domain.entity
+  mapperLocations: classpath*:/mapper/*.xml
   configuration:
     map-underscore-to-camel-case: true
-    cache-enabled: true
-    lazy-loading-enabled: true
-    aggressive-lazy-loading: false
-    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
-
-# Nacos 服务注册与发现
-cloud:
-  nacos:
-    discovery:
-      server-addr: localhost:8848
-      namespace: public
-      group: DEFAULT_GROUP
-      enabled: true
-      register-enabled: true
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 
-# 服务端口
-server:
-  port: 8080
-  servlet:
-    context-path: /irrigation
 
 # 日志配置
 logging:
   level:
-    root: INFO
-    cn.sciento.farm.automationv2: DEBUG
-    org.apache.rocketmq: WARN
-    org.quartz: WARN
-  pattern:
-    console: '%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n'
+    org.apache.ibatis: ${LOG_LEVEL:info}
+    io.choerodon: ${LOG_LEVEL:info}
+    cn.sciento: ${LOG_LEVEL:info}
+    cn.sciento.boot.admin: ${LOG_LEVEL:false} # 注册到admin出错不打印
 
 # 业务配置
 irrigation:
@@ -157,17 +141,3 @@ alarm:
     phone-numbers: 13800138000,13900139000
     sms:
       enabled: true
-
-# Actuator 监控端点
-management:
-  endpoints:
-    web:
-      exposure:
-        include: health,info,metrics,prometheus
-  endpoint:
-    health:
-      show-details: always
-  metrics:
-    export:
-      prometheus:
-        enabled: true

+ 22 - 0
src/main/resources/banner.txt

@@ -0,0 +1,22 @@
+          _____                    _____
+         /\    \                  /\    \
+        /::\____\                /::\    \
+       /:::/    /               /::::\    \
+      /:::/   _/___            /::::::\    \
+     /:::/   /\    \          /:::/\:::\    \
+    /:::/   /::\____\        /:::/__\:::\    \
+   /:::/   /:::/    /       /::::\   \:::\    \
+  /:::/   /:::/   _/___    /::::::\   \:::\    \
+ /:::/___/:::/   /\    \  /:::/\:::\   \:::\    \
+|:::|   /:::/   /::\____\/:::/  \:::\   \:::\____\
+|:::|__/:::/   /:::/    /\::/    \:::\   \::/    /
+ \:::\/:::/   /:::/    /  \/____/ \:::\   \/____/
+  \::::::/   /:::/    /            \:::\    \
+   \::::/___/:::/    /              \:::\____\
+    \:::\__/:::/    /                \::/    /
+     \::::::::/    /                  \/____/
+      \::::::/    /
+       \::::/    /
+        \::/____/
+         ~~
+:: ${spring.application.name} ::

+ 26 - 0
src/main/resources/bootstrap.yml

@@ -0,0 +1,26 @@
+server:
+  port: 8330
+  servlet:
+    context-path: /wfauto
+management:
+  server:
+    port: 8331
+  endpoints:
+    web:
+      exposure:
+        include: '*'
+
+
+spring:
+  profiles:
+    active: ${SPRING_PROFILES_ACTIVE:default}
+  cloud:
+    nacos:
+      config:
+        server-addr: 192.168.10.18:8848
+        namespace: stong-test-train
+      discovery:
+        server-addr: 192.168.10.18:8848
+        namespace: stong-test-train
+        metadata:
+          VERSION: 1.0.0

+ 1 - 1
src/main/resources/mapper/AlarmRecordMapper.xml

@@ -1,6 +1,6 @@
 <?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="cn.sciento.farm.automationv2.infra.repository.AlarmRecordMapper">
+<mapper namespace="cn.sciento.farm.automationv2.infra.mapper.AlarmRecordMapper">
 
     <resultMap id="BaseResultMap" type="cn.sciento.farm.automationv2.domain.entity.AlarmRecord">
         <id column="id" property="id"/>

+ 2 - 2
src/main/resources/mapper/IrrigationGroupMapper.xml

@@ -1,6 +1,6 @@
 <?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="cn.sciento.farm.automationv2.infra.repository.IrrigationGroupMapper">
+<mapper namespace="cn.sciento.farm.automationv2.infra.mapper.IrrigationGroupMapper">
 
     <resultMap id="BaseResultMap" type="cn.sciento.farm.automationv2.domain.entity.IrrigationGroup">
         <id column="id" property="id"/>
@@ -43,7 +43,7 @@
         SELECT * FROM irrigation_group WHERE id = #{id} AND deleted = 0
     </select>
 
-    <select id="selectByIds" resultMap="BaseResultMap">
+    <select id="selectByIdsList" resultMap="BaseResultMap">
         SELECT * FROM irrigation_group
         WHERE id IN
         <foreach collection="ids" item="id" open="(" separator="," close=")">

+ 1 - 1
src/main/resources/mapper/IrrigationTaskMapper.xml

@@ -1,6 +1,6 @@
 <?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="cn.sciento.farm.automationv2.infra.repository.IrrigationTaskMapper">
+<mapper namespace="cn.sciento.farm.automationv2.infra.mapper.IrrigationTaskMapper">
 
     <!-- ResultMap -->
     <resultMap id="BaseResultMap" type="cn.sciento.farm.automationv2.domain.entity.IrrigationTask">

+ 1 - 1
src/main/resources/mapper/LinkageRuleMapper.xml

@@ -1,6 +1,6 @@
 <?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="cn.sciento.farm.automationv2.infra.repository.LinkageRuleMapper">
+<mapper namespace="cn.sciento.farm.automationv2.infra.mapper.LinkageRuleMapper">
 
     <resultMap id="BaseResultMap" type="cn.sciento.farm.automationv2.domain.entity.LinkageRule">
         <id column="id" property="id"/>

+ 6 - 6
src/main/resources/mapper/TaskExecutionMapper.xml

@@ -1,6 +1,6 @@
 <?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="cn.sciento.farm.automationv2.infra.repository.TaskExecutionMapper">
+<mapper namespace="cn.sciento.farm.automationv2.infra.mapper.TaskExecutionMapper">
 
     <!-- ResultMap -->
     <resultMap id="BaseResultMap" type="cn.sciento.farm.automationv2.domain.entity.TaskExecution">
@@ -8,7 +8,7 @@
         <result column="task_id" property="taskId"/>
         <result column="task_name" property="taskName"/>
         <result column="trigger_type" property="triggerType" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
-        <result column="execution_plan" property="executionPlan" typeHandler="com.fasterxml.jackson.databind.ObjectMapper"/>
+        <result column="execution_plan" property="executionPlan" typeHandler="cn.sciento.mybatis.handler.JSONHandler" jdbcType="VARCHAR"/>
         <result column="current_index" property="currentIndex"/>
         <result column="status" property="status" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
         <result column="version" property="version"/>
@@ -31,7 +31,7 @@
             status, version, started_at, expected_finish_at, last_heartbeat_at,
             tenant_id, created_at
         ) VALUES (
-            #{taskId}, #{taskName}, #{triggerType}, #{executionPlan,typeHandler=com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter}, #{currentIndex},
+            #{taskId}, #{taskName}, #{triggerType}, #{executionPlan,typeHandler=cn.sciento.farm.automationv2.infra.typehandler.ExecutionPlanTypeHandler}, #{currentIndex},
             #{status}, #{version}, #{startedAt}, #{expectedFinishAt}, #{lastHeartbeatAt},
             #{tenantId}, NOW()
         )
@@ -64,7 +64,7 @@
     <update id="updateById">
         UPDATE task_execution
         <set>
-            <if test="executionPlan != null">execution_plan = #{executionPlan,typeHandler=com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter},</if>
+            <if test="executionPlan != null">execution_plan = #{executionPlan,typeHandler=cn.sciento.farm.automationv2.infra.typehandler.ExecutionPlanTypeHandler},</if>
             <if test="currentIndex != null">current_index = #{currentIndex},</if>
             <if test="status != null">status = #{status},</if>
             <if test="startedAt != null">started_at = #{startedAt},</if>
@@ -83,7 +83,7 @@
     <update id="updateByVersion">
         UPDATE task_execution
         <set>
-            <if test="executionPlan != null">execution_plan = #{executionPlan,typeHandler=com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter},</if>
+            <if test="executionPlan != null">execution_plan = #{executionPlan,typeHandler=cn.sciento.farm.automationv2.infra.typehandler.ExecutionPlanTypeHandler},</if>
             <if test="currentIndex != null">current_index = #{currentIndex},</if>
             <if test="status != null">status = #{status},</if>
             <if test="startedAt != null">started_at = #{startedAt},</if>
@@ -109,7 +109,7 @@
     <!-- 更新execution_plan(乐观锁) -->
     <update id="updateExecutionPlan">
         UPDATE task_execution
-        SET execution_plan = #{executionPlan},
+        SET execution_plan = #{executionPlan,typeHandler=cn.sciento.farm.automationv2.infra.typehandler.ExecutionPlanTypeHandler},
             version = version + 1,
             updated_at = NOW()
         WHERE id = #{id} AND version = #{version}

+ 1 - 1
src/main/resources/mapper/TaskGroupConfigMapper.xml

@@ -1,6 +1,6 @@
 <?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="cn.sciento.farm.automationv2.infra.repository.TaskGroupConfigMapper">
+<mapper namespace="cn.sciento.farm.automationv2.infra.mapper.TaskGroupConfigMapper">
 
     <!-- ResultMap -->
     <resultMap id="BaseResultMap" type="cn.sciento.farm.automationv2.domain.entity.TaskGroupConfig">

+ 11 - 0
src/main/resources/messages/messages_wfautoV2_en_US.properties

@@ -0,0 +1,11 @@
+# tenant-database
+wfautoV2.tenant.createContext.incomplete=Incomplete create context
+wfautoV2.tenantDatabase.notFound=TenantDatabase not found
+
+wfautoV2.feign.error=feign error
+
+wfautoV2.bean.createError=Failed to create
+wfautoV2.bean.updateError=Failed to update
+
+wfautoV2.parameter.incomplete=Incomplete parameter
+wfautoV2.parameter.error=error parameter

+ 11 - 0
src/main/resources/messages/messages_wfautoV2_zh_CN.properties

@@ -0,0 +1,11 @@
+# tenant-database
+wfautoV2.tenant.createContext.incomplete=\u79DF\u5BA2\u521B\u5EFA\u4E0A\u4E0B\u95EE\u4FE1\u606F\u4E0D\u5B8C\u6574
+wfautoV2.tenantDatabase.notFound=\u79DF\u5BA2\u6570\u636E\u5E93\u4FE1\u606F\u4E0D\u5B58\u5728
+
+wfautoV2.feign.error=\u8FDC\u7A0B\u6D4B\u8BD5\u8C03\u7528\u670D\u52A1\u964D\u7EA7
+
+wfautoV2.bean.createError=\u521B\u5EFA\u5931\u8D25
+wfautoV2.bean.updateError=\u66F4\u65B0\u5931\u8D25
+
+wfautoV2.parameter.incomplete=\u53C2\u6570\u4E0D\u5B8C\u6574
+wfautoV2.parameter.error=\u53C2\u6570\u9519\u8BEF