Просмотр исходного кода

报警生成工单限制,一个设备只能存在一个处理中的工单
报警恢复时,删除未处理的工单

wangli 4 лет назад
Родитель
Сommit
7850b177c2

+ 25 - 0
operation_manager/src/main/java/com/huaxu/order/controller/WorkOrderManageController.java

@@ -511,6 +511,31 @@ public class WorkOrderManageController {
         return workOrderManageService.batchInsertByAlarms(workOrderManages);
     }
 
+    @RequestMapping(value = "findWorkOrderByDeviceIds", method = RequestMethod.POST)
+    @ApiOperation(value = "根据设备id查询工单信息(报警)")
+    public List<WorkOrderManageByAlarmDto> findWorkOrderByDeviceIds(
+            @ApiParam(value = "设备id", required = true) @RequestParam List<Long> deviceIds){
+        return workOrderManageService.findWorkOrderByDeviceIds(deviceIds);
+    }
+
+    @RequestMapping(value = "updateByAlarms", method = RequestMethod.POST)
+    @ApiOperation(value = "修改工单信息(报警生成的)")
+    public void updateByAlarms(
+            @ApiParam(value = "工单信息", required = true) @RequestBody List<WorkOrderManageByAlarmDto> workOrderManages){
+            workOrderManageService.updateByAlarms(workOrderManages);
+    }
+
+    /**
+     * 报警恢复时,删除未派单的工单
+     */
+    @RequestMapping(value = "batchDeleteByAlarms", method = RequestMethod.POST)
+    @ApiOperation(value = "报警恢复时,删除未派单的工单")
+    public Integer batchDeleteByAlarms(
+            @ApiParam(value = "设备id", required = true) @RequestParam List<Long> deviceIds){
+
+        return workOrderManageService.batchDeleteByAlarms(deviceIds);
+    }
+
     @GetMapping("/selectOrderPower")
     @ApiOperation(value = "获取工单派单权限")
     public  AjaxMessage<Map<String,Object>> selectOrderPower(

+ 6 - 0
operation_manager/src/main/java/com/huaxu/order/dao/WorkOrderManageMapper.java

@@ -35,6 +35,12 @@ public interface WorkOrderManageMapper {
 
     int batchInsertByAlarms(@Param("workOrderManages")List<WorkOrderManageByAlarmDto> workOrderManages);
 
+    int batchDeleteByAlarms(@Param("deviceIds")List<Long> deviceIds);
+
+    List<WorkOrderManageByAlarmDto> findWorkOrderByDeviceIds(@Param("deviceIds")List<Long> deviceIds);
+
+    int updateByAlarms(@Param("workOrderManage")WorkOrderManageByAlarmDto workOrderManage);
+
     Page<WorkOrderManageDto> findPage(IPage<WorkOrderManageDto> page, @Param("order") WorkOrderManageDto workOrderManageDto);
 
     List<WorkOrderManage> selectByPId(Map<String,Object> map);

+ 13 - 1
operation_manager/src/main/java/com/huaxu/order/dto/WorkOrderManageByAlarmDto.java

@@ -12,9 +12,21 @@ public class WorkOrderManageByAlarmDto implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    @ApiModelProperty(value = "报警信息id")
+    @ApiModelProperty(value = "主键id")
     private Long id;
 
+    @ApiModelProperty(value = "一级场景名称")
+    private Integer parentSceneId;
+
+    @ApiModelProperty(value = "一级场景名称")
+    private String parentSceneName;
+
+    @ApiModelProperty(value = "设备id")
+    private Long deviceId;
+
+    @ApiModelProperty(value = "设备名称")
+    private String deviceName;
+
     @ApiModelProperty(value = "租户id")
     private String tenantId;
 

+ 5 - 0
operation_manager/src/main/java/com/huaxu/order/service/WorkOrderManageService.java

@@ -46,6 +46,11 @@ public interface WorkOrderManageService {
      */
     Integer batchInsertByAlarms(List<WorkOrderManageByAlarmDto> workOrderManages);
 
+    Integer batchDeleteByAlarms(List<Long> deviceIds);
+
+    List<WorkOrderManageByAlarmDto> findWorkOrderByDeviceIds(List<Long> deviceIds);
+
+    void updateByAlarms(List<WorkOrderManageByAlarmDto> workOrderManages);
 
     int updateByPrimaryKeySelective(WorkOrderManage record);
 

+ 20 - 0
operation_manager/src/main/java/com/huaxu/order/service/impl/WorkOrderManageServiceImpl.java

@@ -87,6 +87,26 @@ public class WorkOrderManageServiceImpl implements WorkOrderManageService {
         }
         return 0;
     }
+    /**
+     * 报警恢复时,删除未派单的工单
+     */
+    @Override
+    public Integer batchDeleteByAlarms(List<Long> deviceIds) {
+        if(deviceIds.size()>0){
+            return workOrderManageMapper.batchDeleteByAlarms(deviceIds);
+        }
+        return 0;
+    }
+
+    public List<WorkOrderManageByAlarmDto> findWorkOrderByDeviceIds(List<Long> deviceIds){
+        return workOrderManageMapper.findWorkOrderByDeviceIds(deviceIds);
+    }
+
+    public void updateByAlarms(List<WorkOrderManageByAlarmDto> workOrderManages){
+        for(WorkOrderManageByAlarmDto workOrderManage :workOrderManages){
+            workOrderManageMapper.updateByAlarms(workOrderManage);
+        }
+    }
 
     @Override
     public Page<WorkOrderManageDto> selectPage(IPage<WorkOrderManageDto> page, WorkOrderManageDto workOrderManageDto) {

+ 31 - 7
operation_manager/src/main/resources/mapper/order/WorkOrderManageMapper.xml

@@ -89,7 +89,7 @@
     create_by, date_create, update_by, date_update, geo,videos,pictures
   </sql>
   <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
-    select 
+    select
     <include refid="Base_Column_List" />
     from sc_work_order_manage
     where id = #{id,jdbcType=INTEGER}
@@ -505,14 +505,38 @@
     order by t1.order_pid
   </select>
 
-  <insert id="batchInsertByAlarms" parameterType="com.huaxu.order.dto.WorkOrderManageByAlarmDto" keyProperty="id" useGeneratedKeys="true">
-  insert into sc_work_order_manage( task_no, task_desc, address, order_time, company_org_id, department_org_id, order_status, event_type, order_pid, tenant_id, current_task_name,  date_create, date_update, geo)
- values
-  <foreach collection="workOrderManages" item="item" index="index" separator=",">
-    (#{item.taskNo} , #{item.taskDesc}, #{item.address}, #{item.orderTime}, #{item.companyOrgId}, #{item.departmentOrgId}, 0, 3, 0, #{item.tenantId}, '设备报警工单',  now(),  now(), #{item.geo})
-  </foreach>
+  <insert id="batchInsertByAlarms" >
+    insert into sc_work_order_manage( task_no, task_desc, address, order_time, company_org_id, department_org_id, order_status, event_type, order_pid, tenant_id, current_task_name,  date_create, date_update, geo,scenes_id,scenes_name,device_id,device_name)
+    values
+    <foreach collection="workOrderManages" item="item" index="index" separator=",">
+      (#{item.taskNo} , #{item.taskDesc}, #{item.address}, #{item.orderTime}, #{item.companyOrgId}, #{item.departmentOrgId}, 0, 3, 0, #{item.tenantId}, '设备报警工单',  now(),  now(), #{item.geo}, #{item.parentSceneId}, #{item.parentSceneName}, #{item.deviceId}, #{item.deviceName})
+    </foreach>
   </insert>
 
+  <delete id="batchDeleteByAlarms" >
+    delete from sc_work_order_manage
+    where  order_status = 0 and  device_id in
+    <foreach collection="deviceIds" item="item" open="(" close=")" index="index" separator=",">
+      #{item}
+    </foreach>
+  </delete>
+
+  <select id="findWorkOrderByDeviceIds" resultType="com.huaxu.order.dto.WorkOrderManageByAlarmDto">
+    select
+    id
+    ,device_id as "deviceId"
+    , task_desc as "taskDesc"
+    from sc_work_order_manage
+    where (order_status = 0 or order_status = 1)
+    and device_id in
+    <foreach collection="deviceIds" item="item" open="(" close=")" index="index" separator=",">
+      #{item}
+    </foreach>
+  </select>
+  <update id="updateByAlarms">
+        update sc_work_order_manage set task_desc =#{workOrderManage.taskDesc} ,date_update = now() where id=#{workOrderManage.id}
+  </update>
+
   <!--分页查询-->
   <select id="findPage" resultMap="OrderResultMap">
     select

+ 12 - 1
sms_water/src/main/java/com/huaxu/client/OperationManagerClient.java

@@ -4,6 +4,8 @@ import com.huaxu.config.FeignConfig;
 import com.huaxu.dto.WorkOrderManageByAlarmDto;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
@@ -21,7 +23,16 @@ public interface OperationManagerClient {
      * @return
      */
     @PostMapping("/order/workOrderManage/saveByAlarms")
-    Integer saveByAlarms(List<WorkOrderManageByAlarmDto> workOrderManages);
+    Integer saveByAlarms(@RequestBody List<WorkOrderManageByAlarmDto> workOrderManages);
+
+    @PostMapping("/order/workOrderManage/batchDeleteByAlarms")
+    Integer batchDeleteByAlarms(@RequestParam List<Long> deviceIds);
+
+    @PostMapping("/order/workOrderManage/updateByAlarms")
+    void updateByAlarms(@RequestBody List<WorkOrderManageByAlarmDto> workOrderManages);
+
+    @PostMapping("/order/workOrderManage/findWorkOrderByDeviceIds")
+    List<WorkOrderManageByAlarmDto> findWorkOrderByDeviceIds(@RequestParam List<Long> deviceIds);
 
 
 }

+ 6 - 2
sms_water/src/main/java/com/huaxu/dto/DeviceAlarmInfoForOrder.java

@@ -15,8 +15,12 @@ public class DeviceAlarmInfoForOrder implements Serializable {
     @ApiModelProperty(value = "报警id")
     private Long alarmId;
 
-    @ApiModelProperty(value = "场景名称")
-    private String sceneName;
+    @ApiModelProperty(value = "一级场景名称")
+    private Integer parentSceneId;
+
+    @ApiModelProperty(value = "一级场景名称")
+    private String parentSceneName;
+
 
     @ApiModelProperty(value = "报警类型:状态报警,参数报警")
     private String alarmType;

+ 13 - 1
sms_water/src/main/java/com/huaxu/dto/WorkOrderManageByAlarmDto.java

@@ -12,9 +12,21 @@ public class WorkOrderManageByAlarmDto implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    @ApiModelProperty(value = "报警信息id")
+    @ApiModelProperty(value = "主键id")
     private Long id;
 
+    @ApiModelProperty(value = "一级场景名称")
+    private Integer parentSceneId;
+
+    @ApiModelProperty(value = "一级场景名称")
+    private String parentSceneName;
+
+    @ApiModelProperty(value = "设备id")
+    private Long deviceId;
+
+    @ApiModelProperty(value = "设备名称")
+    private String deviceName;
+
     @ApiModelProperty(value = "租户id")
     private String tenantId;
 

+ 19 - 2
sms_water/src/main/java/com/huaxu/rabbitmq/ReceiveData.java

@@ -7,6 +7,7 @@ package com.huaxu.rabbitmq;
  */
 
 import com.alibaba.fastjson.JSONObject;
+import com.huaxu.client.OperationManagerClient;
 import com.huaxu.client.UserCenterClient;
 import com.huaxu.common.CalcUtil;
 import com.huaxu.common.StringUtils;
@@ -56,6 +57,9 @@ public class ReceiveData {
 
     @Autowired
     private MonitorDataService monitorDataService;
+
+    @Autowired
+    private OperationManagerClient operationManagerClient;
     /**
      * 先注入,然后再通过SPEL取值
      * @return
@@ -143,6 +147,7 @@ public class ReceiveData {
                Map<Integer,AlarmDetailsDto> alarmDetailsDtoMap = alarmDetailsDtos.stream().collect(Collectors.toMap(AlarmDetailsDto::getAlarmSettingId, a -> a,(k1, k2)->k1));
 
                List<AlarmDetailsEntity> insert =new ArrayList<>();
+               List<AlarmDetailsEntity> update =new ArrayList<>();
 
                //校验各参数异常情况
                for(DeviceCheckAlarmDto deviceCheckAlarmDto:deviceCheckAlarmDtos){
@@ -160,6 +165,7 @@ public class ReceiveData {
 //                                   update.add(alarmDetailsDto);
                            alarmDetailsDto.setDateUpdate( new Date());
                            alarmDetailMapper.update(alarmDetailsDto);
+                           update.add(alarmDetailsDto);
                            //已存在的修改后从集合移除
                            alarmDetailsDtoMap.remove(deviceCheckAlarmDto.getAlarmSettingId());
                        }else{
@@ -198,14 +204,14 @@ public class ReceiveData {
                            jsonContent.put("场景名称",deviceCheckAlarmDto.getSceneName());
                            jsonContent.put("设备名称",deviceCheckAlarmDto.getDeviceName());
                            jsonContent.put("报警字段",deviceCheckAlarmDto.getAttributeName());
-                           message.setMessageContent(jsonObject.toJSONString());  //消息内容,如果需要动态使用,配合模板使用{key:value}
+                           message.setMessageContent(jsonContent.toJSONString());  //消息内容,如果需要动态使用,配合模板使用{key:value}
                            message.setMessageType(1); //消息类型
                            message.setMessageTemplateId(1);   //模板id
                            message.setChannel(0);   //渠道
                            Integer companyOrgId = deviceCheckAlarmDto.getCompanyOrgId();
                            Integer departmentOrgId = deviceCheckAlarmDto.getDeptOrgId();
-                           List<Integer> taskUsers = userCenterClient.findUserIdsByPermissonOrg(deviceCheckAlarmDto.getTenantId(),companyOrgId,departmentOrgId);
                            try{
+                               List<Integer> taskUsers = userCenterClient.findUserIdsByPermissonOrg(deviceCheckAlarmDto.getTenantId(),companyOrgId,departmentOrgId);
                                if(taskUsers!=null){
                                    taskUsers.forEach(id->{
                                        message.setUserId(id);
@@ -232,6 +238,17 @@ public class ReceiveData {
                if(insert.size()>0){
                 alarmDetailMapper.batchInsert(insert);
                }
+
+               //报警恢复的删除工单
+               Map<Integer,AlarmDetailsEntity> AlarmDtoNewsMap =  insert.stream().collect(Collectors.toMap(AlarmDetailsEntity::getDeviceId, a -> a,(k1, k2)->k1));
+               Map<Integer,AlarmDetailsEntity> AlarmDtoOldsMap =  update.stream().collect(Collectors.toMap(AlarmDetailsEntity::getDeviceId, a -> a,(k1, k2)->k1));
+               Set<Long> deviceIds = alarmDetailsDtoMap.values().stream()
+                       .filter(a -> !(AlarmDtoNewsMap.containsKey(a.getDeviceId())||AlarmDtoOldsMap.containsKey(a.getDeviceId())))
+                       .map(a -> a.getDeviceId().longValue())
+                       .collect(Collectors.toSet());
+               if(deviceIds.size()>0){
+                operationManagerClient.batchDeleteByAlarms(new ArrayList<>(deviceIds));
+               }
            }
 
         }

+ 39 - 5
sms_water/src/main/java/com/huaxu/service/impl/AlarmDetailsServiceImpl.java

@@ -20,6 +20,7 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -228,7 +229,7 @@ public class AlarmDetailsServiceImpl implements AlarmDetailsService {
         }
 
         //需要更新的
-        List<AlarmDetailsEntity>  DeviceStateAlarmDtoOlds =alarmlist.stream()
+        List<AlarmDetailsEntity>  deviceStateAlarmDtoOlds =alarmlist.stream()
                 .filter(deviceCheckAlarmDto -> alarmDetailsDtoMap.containsKey(deviceCheckAlarmDto.getAlarmSettingId()))
                 .map(d ->{
                     AlarmDetailsDto alarmDetailsDto = alarmDetailsDtoMap.get(d.getAlarmSettingId());
@@ -252,19 +253,47 @@ public class AlarmDetailsServiceImpl implements AlarmDetailsService {
             alarmDetailsDto.setState(0);
             alarmDetailMapper.update(alarmDetailsDto);//直接更新
         }
+
+        //报警恢复的删除工单
+        Map<Integer,AlarmDetailsEntity> AlarmDtoNewsMap =  deviceStateAlarmDtoNews.stream().collect(Collectors.toMap(AlarmDetailsEntity::getDeviceId, a -> a,(k1, k2)->k1));
+        Map<Integer,AlarmDetailsEntity> AlarmDtoOldsMap =  deviceStateAlarmDtoOlds.stream().collect(Collectors.toMap(AlarmDetailsEntity::getDeviceId, a -> a,(k1, k2)->k1));
+        Set<Long> deviceIds = alarmDetailsDtoMap.values().stream()
+                .filter(a -> !(AlarmDtoNewsMap.containsKey(a.getDeviceId())||AlarmDtoOldsMap.containsKey(a.getDeviceId())))
+                .map(a -> a.getDeviceId().longValue())
+                .collect(Collectors.toSet());
+        if(deviceIds.size()>0){
+            operationManagerClient.batchDeleteByAlarms(new ArrayList<>(deviceIds));
+        }
     }
 
    public void saveWorkOrderManageInfo(){
        List<DeviceAlarmInfoForOrder> deviceAlarmInfoForOrders = alarmDetailMapper.getAlarmInfoForWorkOrderManage();
        if(deviceAlarmInfoForOrders.size()>0){
+
+           //获取已经存在的设备工单
+           Set<Long> deviceIdSet = deviceAlarmInfoForOrders.stream().map(DeviceAlarmInfoForOrder::getDeviceId).collect(Collectors.toSet());
+           List<WorkOrderManageByAlarmDto> workOrders = operationManagerClient.findWorkOrderByDeviceIds(new ArrayList<>(deviceIdSet));
+           Map<Long,WorkOrderManageByAlarmDto> workOrderMap = workOrders.stream().collect(Collectors.toMap(WorkOrderManageByAlarmDto::getDeviceId, Function.identity(), (key1, key2) -> key2));
+
            List<WorkOrderManageByAlarmDto> workOrderManageByAlarms = new ArrayList<>();
+           List<WorkOrderManageByAlarmDto> updates = new ArrayList<>();
            List<DeviceAlarmInfoForOrder> errData= new ArrayList<>();
 
            //组合工单,并发送消息
            for(DeviceAlarmInfoForOrder deviceAlarmInfoForOrder : deviceAlarmInfoForOrders){
+               if(workOrderMap.containsKey(deviceAlarmInfoForOrder.getDeviceId()) && workOrderMap.get(deviceAlarmInfoForOrder.getDeviceId()) != null){
+                   WorkOrderManageByAlarmDto orderManageByAlarmDto = workOrderMap.get(deviceAlarmInfoForOrder.getDeviceId());
+                   orderManageByAlarmDto.setTaskDesc(orderManageByAlarmDto.getTaskDesc()+";"+deviceAlarmInfoForOrder.getTaskDesc());
+                   updates.add(orderManageByAlarmDto);
+                   continue;
+               }
                WorkOrderManageByAlarmDto workOrderManageByAlarm = new WorkOrderManageByAlarmDto();
                workOrderManageByAlarm.setTaskNo(DatesUtil.formatDate(new Date(),"yyyyMMddHHmmssSSS")+((int) (Math.random()*(9999-1000)+1000)));
                workOrderManageByAlarm.setTenantId(deviceAlarmInfoForOrder.getTenantId());
+               workOrderManageByAlarm.setParentSceneId(deviceAlarmInfoForOrder.getParentSceneId());
+               workOrderManageByAlarm.setParentSceneName(deviceAlarmInfoForOrder.getParentSceneName());
+               workOrderManageByAlarm.setDeviceId(deviceAlarmInfoForOrder.getDeviceId());
+               workOrderManageByAlarm.setDeviceName(deviceAlarmInfoForOrder.getDeviceName());
                workOrderManageByAlarm.setCompanyOrgId(deviceAlarmInfoForOrder.getCompanyOrgId());
                workOrderManageByAlarm.setDepartmentOrgId(deviceAlarmInfoForOrder.getDepartmentOrgId());
                workOrderManageByAlarm.setAddress(deviceAlarmInfoForOrder.getAddress());
@@ -278,7 +307,7 @@ public class AlarmDetailsServiceImpl implements AlarmDetailsService {
                message.setTenantId(deviceAlarmInfoForOrder.getTenantId());
                message.setMessageId(UUID.randomUUID().toString());
                JSONObject jsonObject = new JSONObject();
-               jsonObject.put("工单类型","");
+               jsonObject.put("工单类型"," ");
                jsonObject.put("工单编号",workOrderManageByAlarm.getTaskNo());
                message.setMessageContent(jsonObject.toJSONString());  //消息内容,如果需要动态使用,配合模板使用{key:value}
                message.setMessageType(7); //消息类型
@@ -311,9 +340,14 @@ public class AlarmDetailsServiceImpl implements AlarmDetailsService {
                deviceAlarmInfoForOrders.removeAll(errData);
            }
            //保存工单
-           Integer resut = operationManagerClient.saveByAlarms(workOrderManageByAlarms);
-
-           if(resut > 0) {
+           if(workOrderManageByAlarms.size()>0){
+                operationManagerClient.saveByAlarms(workOrderManageByAlarms);
+           }
+           if(updates.size()>0){
+                operationManagerClient.updateByAlarms(updates);
+           }
+           if(deviceAlarmInfoForOrders.size()>0){
+               //标记报警已生成工单
                alarmDetailMapper.updateAlarmSendMessageState(deviceAlarmInfoForOrders);
            }
        }

+ 2 - 2
sms_water/src/main/resources/mapper/AlarmDetailMapper.xml

@@ -677,8 +677,8 @@
     <select id="getAlarmInfoForWorkOrderManage" resultType="com.huaxu.dto.DeviceAlarmInfoForOrder">
         select
             ad.id as "alarmId"
-
-            ,ad.SCENE_NAME as "sceneName"
+            ,ad.PARENT_SCENE_ID as "parentSceneId"
+            ,ad.PARENT_SCENE_NAME as "parentSceneName"
             ,ad.ALARM_TYPE as "alarmType"
             ,d.DEVICE_NAME as "deviceName"
             ,da.NAME as "attributeName"