hecheng %!s(int64=3) %!d(string=hai) anos
pai
achega
c52d7b1668
Modificáronse 16 ficheiros con 566 adicións e 26 borrados
  1. 3 0
      zd-common/zd-common-core/src/main/java/com/zd/common/core/web/domain/BaseBean.java
  2. 6 0
      zd-modules/zd-airbottle/src/main/java/com/zd/airbottle/service/IAlarmRecordService.java
  3. 2 2
      zd-modules/zd-bottle-parent/zd-bottle-api/src/main/java/com/zd/bottle/domain/AlarmRecord.java
  4. 13 4
      zd-modules/zd-bottle-parent/zd-bottle-api/src/main/java/com/zd/bottle/domain/BottleStorageError.java
  5. 1 1
      zd-modules/zd-bottle-parent/zd-bottle-api/src/main/java/com/zd/bottle/vo/AlarmRecordVo.java
  6. 100 0
      zd-modules/zd-bottle-parent/zd-bottle-api/src/main/java/com/zd/bottle/vo/BottleStorageErrorVo.java
  7. 33 9
      zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/controller/AlarmRecordController.java
  8. 76 2
      zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/controller/BottleStorageErrorController.java
  9. 1 1
      zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/controller/UseRecordController.java
  10. 26 0
      zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/service/AlarmRecordService.java
  11. 22 0
      zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/service/BottleStorageErrorService.java
  12. 183 0
      zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/service/impl/AlarmRecordServiceImpl.java
  13. 74 0
      zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/service/impl/BottleStorageErrorServiceImpl.java
  14. 2 2
      zd-modules/zd-bottle-parent/zd-bottle/src/main/resources/mapper/BottleStorageErrorMapper.xml
  15. 12 5
      zd-modules/zd-forward/src/main/java/com/zd/forward/controller/SignInCheckController.java
  16. 12 0
      zd-modules/zd-forward/src/main/java/com/zd/forward/serivce/FireImageService.java

+ 3 - 0
zd-common/zd-common-core/src/main/java/com/zd/common/core/web/domain/BaseBean.java

@@ -3,6 +3,8 @@ package com.zd.common.core.web.domain;
 import cn.hutool.core.date.CalendarUtil;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.zd.common.core.utils.IdGen;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -21,6 +23,7 @@ public class BaseBean implements Serializable {
     /**
      * 数据主键
      */
+    @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "${comment}")
     private Long id;
 

+ 6 - 0
zd-modules/zd-airbottle/src/main/java/com/zd/airbottle/service/IAlarmRecordService.java

@@ -10,6 +10,7 @@ import java.util.List;
 
 /**
  * 报警记录Service接口
+ * @author Administrator
  */
 public interface IAlarmRecordService {
     /**
@@ -51,5 +52,10 @@ public interface IAlarmRecordService {
      */
     void remoteAdd(InventoryTag tag);
 
+    /**
+     * 报警记录查询
+     * @param alarmRecord
+     * @return
+     */
     List<BottleStorageInfoVo> setMasterIds(AlarmRecord alarmRecord);
 }

+ 2 - 2
zd-modules/zd-bottle-parent/zd-bottle-api/src/main/java/com/zd/bottle/domain/AlarmRecord.java

@@ -33,10 +33,10 @@ public class AlarmRecord extends BaseBean{
     private String electronicTag;
 
     @ApiModelProperty("报警类型;1:出门,2:进门")
-    private Byte type;
+    private Integer type;
 
     @ApiModelProperty("产品类型;1:气瓶,2:其他")
-    private Byte productType;
+    private Integer productType;
 
     @ApiModelProperty("报警时间")
     private Date alarmTime;

+ 13 - 4
zd-modules/zd-bottle-parent/zd-bottle-api/src/main/java/com/zd/bottle/domain/BottleStorageError.java

@@ -30,11 +30,11 @@ public class BottleStorageError extends BaseBean {
     @ApiModelProperty("气瓶入库ID")
     private Long storageId;
 
-    @ApiModelProperty("实验地点")
-    private String location;
-
     @ApiModelProperty("实验室id")
-    private Long locationId;
+    private Long subjectId;
+
+    @ApiModelProperty("实验室名称")
+    private String subjectName;
 
     @ApiModelProperty("修改前")
     private BigDecimal beforeEdit;
@@ -47,4 +47,13 @@ public class BottleStorageError extends BaseBean {
 
     @ApiModelProperty("联系方式")
     private String phone;
+
+    /**
+     * 报警开始时间
+     */
+    private transient String startTime;
+    /**
+     * 报警结束时间
+     */
+    private transient String endTime;
 }

+ 1 - 1
zd-modules/zd-bottle-parent/zd-bottle-api/src/main/java/com/zd/bottle/vo/AlarmRecordVo.java

@@ -52,7 +52,7 @@ public class AlarmRecordVo {
     private String configName;
 
     @ApiModelProperty("产品类型;1:气瓶,2:其他")
-    private Byte productType;
+    private Integer productType;
 
     /**
      * 气瓶余量

+ 100 - 0
zd-modules/zd-bottle-parent/zd-bottle-api/src/main/java/com/zd/bottle/vo/BottleStorageErrorVo.java

@@ -0,0 +1,100 @@
+package com.zd.bottle.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zd.common.core.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+import org.hibernate.validator.constraints.Length;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author Administrator
+ */
+@ApiModel("气瓶异常记录视图类")
+@Data
+@Accessors(chain = true)
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = false)
+public class BottleStorageErrorVo {
+
+    /**
+     * 主键id,数据唯一标识
+     */
+    @ApiModelProperty(value = "${comment}")
+    private Long id;
+
+    @Excel(name = "操作人")
+    @ApiModelProperty(value = "操作人")
+    private String createBy;
+    /**
+     * 联系方式
+     */
+    @Excel(name = "联系方式")
+    @Length(message = "联系方式长度不能超过11")
+    @ApiModelProperty(value = "联系方式")
+    private String phone;
+
+
+    @ApiModelProperty("实验室id")
+    private Long subjectId;
+
+    @ApiModelProperty("实验室名称")
+    private String subjectName;
+
+    /**
+     * 气瓶入库ID
+     */
+    @ApiModelProperty(value = "气瓶入库ID")
+    private Long storageId;
+    @Excel(name = "气体名称")
+    @ApiModelProperty(value = "气体名称")
+    private String airName;
+    @Excel(name = "气体级别/规格")
+    @ApiModelProperty(value = "气瓶规格")
+    private String configName;
+    /**
+     * 修改前气压
+     */
+    @ApiModelProperty(value = "修改前气压")
+    private BigDecimal beforeEdit;
+
+    /**
+     * 修改前气压导出
+     */
+    @Excel(name = "修改前气压")
+    private String beforeEditValue;
+    /**
+     * 修改后气压
+     */
+    @ApiModelProperty(value = "修改后气压")
+    private BigDecimal afterEdit;
+    /**
+     * 修改后气压导出
+     */
+    @Excel(name = "修改后气压")
+    @ApiModelProperty(value = "修改后气压")
+    private String afterEditValue;
+    /**
+     * 操作时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "操作时间")
+    private Date opTime;
+
+    /** 气体组成(冗余字段) */
+    @ApiModelProperty(value = "气体组成")
+    private String airConstituents;
+    @ApiModelProperty(value = "气瓶编号")
+    private String airNumber;
+
+    private List<UseRecordVo> recordVos;
+
+}

+ 33 - 9
zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/controller/AlarmRecordController.java

@@ -1,17 +1,19 @@
 package com.zd.bottle.controller;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zd.bottle.domain.AlarmRecord;
 import com.zd.bottle.service.AlarmRecordService;
+import com.zd.bottle.vo.AlarmRecordVo;
 import com.zd.common.core.domain.R;
+import com.zd.common.core.utils.bean.TransferUtils;
+import com.zd.common.core.utils.poi.ExcelUtil;
 import com.zd.common.core.web.controller.BaseController;
 import com.zd.common.core.web.page.TableDataInfo;
 import com.zd.common.log.annotation.Log;
 import com.zd.common.log.enums.BusinessType;
-import com.zd.common.security.annotation.PreAuthorize;
 import com.zd.system.api.domain.InventoryTag;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -37,23 +39,46 @@ public class AlarmRecordController extends BaseController<AlarmRecord> {
 
     /**
      * 查询报警记录列表
+     * @param alarmRecord 参数
+     * @return TableDataInfo
      */
-    @PreAuthorize(hasPermi = "bottle:alarm:record:list")
+//    @PreAuthorize(hasPermi = "bottle:alarm:record:list")
     @GetMapping("/list")
     @ApiOperation(value = "查询报警记录列表")
-    public TableDataInfo<AlarmRecord> list(AlarmRecord alarmRecord) {
-        List<AlarmRecord> list = alarmRecordService.list(new LambdaQueryWrapper<>(alarmRecord));
-        return getDataTable(list);
+    public TableDataInfo<AlarmRecordVo> list(AlarmRecord alarmRecord) {
+        startPage("alarm_time","descending");
+        List<AlarmRecord> records = alarmRecordService.getList(alarmRecord);
+        TableDataInfo<AlarmRecord> dataTable = getDataTable(records);
+        List<AlarmRecordVo> recordVos = TransferUtils.transferList(records, AlarmRecordVo.class);
+        if (!recordVos.isEmpty()) {
+            alarmRecordService.getRecordInfo(recordVos);
+        }
+        TableDataInfo<AlarmRecordVo> dataInfo = new TableDataInfo<>();
+        BeanUtils.copyProperties(dataTable, dataInfo);
+        dataInfo.setRows(recordVos);
+        return dataInfo;
     }
 
     /**
      * 导出报警记录列表
+     * @param response 响应值
+     * @param alarmRecord 参数
+     * @throws IOException 异常
      */
     @ApiOperation(value = "导出报警记录列表")
-    @PreAuthorize(hasPermi = "bottle:alarm:record:export")
+//    @PreAuthorize(hasPermi = "bottle:alarm:record:export")
     @Log(title = "报警记录", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, AlarmRecord alarmRecord) throws IOException {
+        ExcelUtil<AlarmRecordVo> util = new ExcelUtil<>(AlarmRecordVo.class);
+        List<AlarmRecord> list = alarmRecordService.getList(alarmRecord);
+        List<AlarmRecordVo> recordVos = TransferUtils.transferList(list, AlarmRecordVo.class);
+        if (!recordVos.isEmpty()) {
+            alarmRecordService.getRecordInfo(recordVos);
+            recordVos.forEach(r -> r.setCurrentPressureValue(r.getCurrentPressure().toPlainString() + "MPa"));
+        }
+
+        util.exportExcel(response, recordVos, "报警记录数据");
     }
 
     /**
@@ -63,7 +88,6 @@ public class AlarmRecordController extends BaseController<AlarmRecord> {
     @Log(title = "识别器新增报警记录", businessType = BusinessType.INSERT)
     @PostMapping("remote/add")
     public R<Boolean> remoteAdd(@RequestBody InventoryTag tag) {
-
-        return R.ok();
+        return R.ok(alarmRecordService.remoteAdd(tag));
     }
 }

+ 76 - 2
zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/controller/BottleStorageErrorController.java

@@ -1,10 +1,26 @@
 package com.zd.bottle.controller;
 
 import com.zd.bottle.domain.BottleStorageError;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import com.zd.bottle.service.BottleStorageErrorService;
+import com.zd.bottle.vo.BottleStorageErrorVo;
+import com.zd.common.core.utils.bean.TransferUtils;
+import com.zd.common.core.utils.poi.ExcelUtil;
+import com.zd.common.core.web.page.TableDataInfo;
+import com.zd.common.log.annotation.Log;
+import com.zd.common.log.enums.BusinessType;
+import com.zd.common.response.ResultData;
+import com.zd.common.security.annotation.PreAuthorize;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
 import com.zd.common.core.web.controller.BaseController;
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
 /**
  * <p>
  * 气瓶异常记录表 前端控制器
@@ -17,4 +33,62 @@ import com.zd.common.core.web.controller.BaseController;
 @RequestMapping("/bottleStorageError")
 public class BottleStorageErrorController extends BaseController<BottleStorageError> {
 
+    @Resource
+    private BottleStorageErrorService storageErrorService;
+
+    /**
+     * 查询气瓶异常记录列表
+     */
+    @PreAuthorize(hasPermi = "airbottle:bottle:error:list")
+    @GetMapping("/list")
+    @ApiOperation(value = "查询气瓶异常记录列表")
+    public TableDataInfo<BottleStorageErrorVo> list(BottleStorageError bottleStorageError) {
+        startPage("op_time","descending");
+        List<BottleStorageError> list = storageErrorService.list(bottleStorageError);
+        TableDataInfo<BottleStorageError> dataTable = getDataTable(list);
+        List<BottleStorageErrorVo> storageErrorVos = TransferUtils.transferList(list, BottleStorageErrorVo.class);
+        if (!storageErrorVos.isEmpty()){
+            storageErrorService.getBottleInfo(storageErrorVos);
+        }
+        TableDataInfo<BottleStorageErrorVo> errorVoTableDataInfo=new TableDataInfo<>();
+        BeanUtils.copyProperties(dataTable,errorVoTableDataInfo);
+        errorVoTableDataInfo.setRows(storageErrorVos);
+        return errorVoTableDataInfo;
+    }
+
+    /**
+     * 导出气瓶异常记录列表
+     */
+    @ApiOperation(value = "导出气瓶异常记录列表")
+    @Log(title = "气瓶异常记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, BottleStorageError storageError) throws IOException {
+        List<BottleStorageError> list = storageErrorService.list(storageError);
+        List<BottleStorageErrorVo> storageErrorVos = TransferUtils.transferList(list, BottleStorageErrorVo.class);
+        if (!storageErrorVos.isEmpty()){
+            storageErrorService.getBottleInfo(storageErrorVos);
+            storageErrorVos.forEach(i-> i.setBeforeEditValue(i.getBeforeEdit().stripTrailingZeros().toPlainString() +"MPa").setAfterEditValue(i.getAfterEdit().stripTrailingZeros().toPlainString() +"MPa"));
+        }
+        ExcelUtil<BottleStorageErrorVo> util = new ExcelUtil<>(BottleStorageErrorVo.class);
+        util.exportExcel(response, storageErrorVos, "气瓶异常记录数据");
+    }
+
+    /**
+     * 获取气瓶异常记录详细信息
+     */
+    @ApiOperation(value = "获取气瓶异常记录详细信息")
+    @GetMapping(value = "/{id}")
+    public ResultData<BottleStorageErrorVo> getInfo(@PathVariable("id") Long id) {
+        return ResultData.success(storageErrorService.getStorageErrorInfo(id));
+    }
+
+    /**
+     * 新增气瓶异常记录
+     */
+    @ApiOperation(value = "新增气瓶异常记录")
+    @Log(title = "气瓶异常记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public ResultData<Boolean> add(@RequestBody BottleStorageError qpBottleStorageError) {
+        return ResultData.result(storageErrorService.save(qpBottleStorageError));
+    }
 }

+ 1 - 1
zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/controller/UseRecordController.java

@@ -49,7 +49,7 @@ public class UseRecordController extends BaseController<UseRecord> {
     /**
      * 查询使用记录列表
      */
-    @PreAuthorize(hasPermi = "airbottle:use:record:list")
+    @PreAuthorize(hasPermi = "bottle:use:record:list")
     @GetMapping("/list")
     @ApiOperation(value = "查询使用记录列表")
     public TableDataInfo<UseRecordVo> list(UseRecord useRecord) {

+ 26 - 0
zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/service/AlarmRecordService.java

@@ -2,6 +2,12 @@ package com.zd.bottle.service;
 
 import com.zd.bottle.domain.AlarmRecord;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zd.bottle.domain.BottleStorage;
+import com.zd.bottle.vo.AlarmRecordVo;
+import com.zd.bottle.vo.BottleStorageVo;
+import com.zd.system.api.domain.InventoryTag;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +19,24 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface AlarmRecordService extends IService<AlarmRecord> {
 
+    /**
+     * 获取拓展信息
+     *
+     * @param recordVos 数据源
+     */
+    void getRecordInfo(List<AlarmRecordVo> recordVos);
+
+    /**
+     * 根据条件查询数据
+     * @param alarmRecord 条件
+     * @return 结果
+     */
+    List<AlarmRecord> getList(AlarmRecord alarmRecord);
+
+    /**
+     * 远程调用信息报警记录
+     * @param tag 标签值
+     * @return 成功=1
+     */
+    boolean remoteAdd(InventoryTag tag);
 }

+ 22 - 0
zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/service/BottleStorageErrorService.java

@@ -2,6 +2,9 @@ package com.zd.bottle.service;
 
 import com.zd.bottle.domain.BottleStorageError;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zd.bottle.vo.BottleStorageErrorVo;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,23 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface BottleStorageErrorService extends IService<BottleStorageError> {
 
+    /**
+     * 条件查询
+     * @param bottleStorageError 条件
+     * @return 结果
+     */
+    List<BottleStorageError> list(BottleStorageError bottleStorageError);
+
+    /**
+     * 查询气瓶相关信息
+     * @param storageErrorVos 元数据
+     */
+    void getBottleInfo(List<BottleStorageErrorVo> storageErrorVos);
+
+    /**
+     * 查询气瓶相关信息
+     * @param id 异常ID
+     * @return 结果
+     */
+    BottleStorageErrorVo getStorageErrorInfo(Long id);
 }

+ 183 - 0
zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/service/impl/AlarmRecordServiceImpl.java

@@ -1,10 +1,44 @@
 package com.zd.bottle.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.zd.bottle.domain.AlarmRecord;
+import com.zd.bottle.domain.BottleStorage;
 import com.zd.bottle.mapper.AlarmRecordMapper;
 import com.zd.bottle.service.AlarmRecordService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zd.bottle.service.BottleStorageService;
+import com.zd.bottle.vo.AlarmRecordVo;
+import com.zd.bottle.vo.BottleStorageVo;
+import com.zd.common.core.constant.HttpStatus;
+import com.zd.common.core.domain.R;
+import com.zd.common.core.web.domain.AjaxResult;
+import com.zd.common.redis.service.RedisService;
+import com.zd.system.api.RemoteUserService;
+import com.zd.system.api.alarm.RemoteAlarmService;
+import com.zd.system.api.alarm.domain.AlarmEntrty;
+import com.zd.system.api.alarm.domain.Routes;
+import com.zd.system.api.alarm.domain.SendTypes;
+import com.zd.system.api.domain.InventoryTag;
+import com.zd.system.api.laboratory.RemoteLaboratoryService;
+import com.zd.system.api.laboratory.RemoteSubQueryService;
+import com.zd.system.api.laboratory.domain.LabSubject;
+import com.zd.system.api.laboratory.domain.RemoteLabHardware;
+import com.zd.system.api.message.RemoteMessageService;
+import com.zd.system.api.netty.RemoteNettyService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.concurrent.BasicThreadFactory;
+import org.apache.poi.util.StringUtil;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -15,6 +49,155 @@ import org.springframework.stereotype.Service;
  * @since 2022-09-08
  */
 @Service
+@Slf4j
 public class AlarmRecordServiceImpl extends ServiceImpl<AlarmRecordMapper, AlarmRecord> implements AlarmRecordService {
 
+    @Resource
+    private BottleStorageService storageService;
+
+    private static final String FRID_CODE = "FRID:";
+    @Resource
+    private RemoteNettyService remoteNettyService;
+    @Resource
+    private RedisService redisService;
+    @Resource
+    private RemoteUserService userService;
+    @Resource
+    private RemoteLaboratoryService laboratoryService;
+    @Resource
+    private RemoteAlarmService remoteAlarmService;
+    @Resource
+    private RemoteSubQueryService remoteSubQueryService;
+
+    @Override
+    public void getRecordInfo(List<AlarmRecordVo> recordVos) {
+        List<Long> masterIds = recordVos.stream().filter(alarmRecordVo -> alarmRecordVo.getProductType() == 1).map(AlarmRecordVo::getMasterId).collect(Collectors.toList());
+        List<BottleStorage> storages = storageService.listByIds(masterIds);
+        Map<Long, BottleStorage> storageMap = storages.stream().collect(Collectors.toMap(BottleStorage::getId, s -> s));
+        recordVos.forEach(r -> {
+            Long masterId = r.getMasterId();
+            if (storageMap.containsKey(masterId)) {
+                BottleStorage storage = storageMap.get(masterId);
+                r.setCurrentPressure(storage.getCurrentPressure())
+                        .setAirName(storage.getAirName())
+                        .setConfigName(storage.getConfigName());
+            }
+        });
+    }
+
+    @Override
+    public List<AlarmRecord> getList(AlarmRecord alarmRecord) {
+        LambdaQueryWrapper<AlarmRecord> queryWrapper = Wrappers.lambdaQuery(AlarmRecord.class);
+        queryWrapper.between(AlarmRecord::getAlarmTime,alarmRecord.getStartTime(),alarmRecord.getEndTime());
+        String startTime = alarmRecord.getStartTime();
+        if (StringUtils.hasLength(startTime)){
+            queryWrapper.apply("DATE_FORMAT(alarm_time,'%Y-%m-%d') >="+alarmRecord.getStartTime());
+        }
+        String endTime = alarmRecord.getEndTime();
+        if (StringUtils.hasLength(endTime)){
+            queryWrapper.apply("DATE_FORMAT(alarm_time,'%Y-%m-%d') <="+alarmRecord.getEndTime());
+        }
+        return list(queryWrapper);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean remoteAdd(InventoryTag tag) {
+        String electronicTag = tag.getEpc();
+        RemoteLabHardware hardware = tag.getRemoteLabHardware();
+        LambdaQueryWrapper<BottleStorage> queryWrapper = Wrappers.lambdaQuery(BottleStorage.class);
+        queryWrapper.eq(BottleStorage::getElectronicTag,electronicTag);
+
+        BottleStorage bottleStorage = storageService.getOne(queryWrapper);
+        if (bottleStorage != null) {
+            if (hardware!=null){
+                //RFID设备报警
+                R<Boolean> alarm = remoteNettyService.alarm(hardware);
+                log.info("==================>{},{}",alarm.getCode(),alarm.getMsg());
+            }
+            Long id = bottleStorage.getId();
+            String key = FRID_CODE + electronicTag + id;
+            String frid = redisService.getCacheObject(key);
+            if (frid != null) {
+                return true;
+            }
+            // 发送报警消息
+            sendAlarm(bottleStorage);
+            redisService.setCacheObject(key, electronicTag, 300L, TimeUnit.SECONDS);
+            AlarmRecord alarmRecord=new AlarmRecord();
+            alarmRecord.setElectronicTag(electronicTag)
+                    .setAlarmTime(Calendar.getInstance().getTime())
+                    .setMasterId(id)
+                    .setType(1)
+                    .setProductType(1);
+            return save(alarmRecord);
+        }else {
+            if (hardware!=null){
+                log.info("==================>{},{}",electronicTag,"标签无数据");
+            }
+            return false;
+        }
+    }
+
+    private void sendAlarm(BottleStorage storage) {
+        Long subjectId = storage.getSubjectId();
+        R<List<LabSubject>> resultList = remoteSubQueryService.listByIds(Collections.singletonList(subjectId));
+        if (resultList.getCode() == HttpStatus.SUCCESS) {
+            List<LabSubject> data = resultList.getData();
+            if (data != null && !data.isEmpty()) {
+                LabSubject labSubject = data.get(0);
+                String subjectName = labSubject.getName();
+                //实验室负责人账号ID
+                Long adminId = labSubject.getAdminId();
+                //安全责任人ID
+                String safeUserId = labSubject.getSafeUserId();
+                //触发声光报警
+                sendHardware(labSubject, subjectName);
+                //发送电话警报
+                sendPhone(storage, subjectName, adminId, safeUserId);
+            }
+        }
+    }
+
+    private void sendHardware(LabSubject labSubject, String subjectName) {
+        RemoteLabHardware remoteLabHardware = new RemoteLabHardware();
+        remoteLabHardware.setType(8);
+        Long id = labSubject.getId();
+        remoteLabHardware.setSubjectId(id);
+        R<List<RemoteLabHardware>> hardwareResult = laboratoryService.remoteList(remoteLabHardware);
+        if (hardwareResult.getCode() == HttpStatus.SUCCESS) {
+            List<RemoteLabHardware> hardwareList = hardwareResult.getData();
+            if (!hardwareList.isEmpty()) {
+                RemoteLabHardware hardware = hardwareList.get(0);
+                laboratoryService.controlByInside(hardware.getId(), "01");
+                // 控制响铃时长
+                if (hardware.getRingTime() != null) {
+                    ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1, new BasicThreadFactory.Builder().namingPattern("alarm-pool-%d").daemon(true).build());
+                    executorService.schedule(() -> laboratoryService.controlByInside(hardware.getId(), "00"), hardware.getRingTime(), TimeUnit.SECONDS);
+                }
+            } else {
+                log.error("实验室【" + subjectName + "】ID" + id + "未设置或启用声光报警器!");
+            }
+        }
+    }
+
+    private void sendPhone(BottleStorage storage, String subjectName, Long adminId, String safeUserId) {
+        List<String> phones = new ArrayList<>();
+        R<List<String>> listR = userService.getPhoneByUserIDS(adminId + "," + safeUserId);
+        if (listR.getCode() == HttpStatus.SUCCESS && !listR.getData().isEmpty()) {
+            phones.addAll(listR.getData());
+        }
+        String airName = storage.getAirName();
+        //电话报警
+        AlarmEntrty alarmEntrty = new AlarmEntrty();
+        alarmEntrty.setRoute(Routes.NoticePush);
+        alarmEntrty.setType(SendTypes.Call + "");
+        alarmEntrty.setTo(phones.toArray(new String[]{}));
+        alarmEntrty.setText(subjectName + airName + "气瓶被违规带离,请尽快确认");
+        AjaxResult result = remoteAlarmService.send(alarmEntrty);
+        if (!result.get(AjaxResult.CODE_TAG).equals(HttpStatus.SUCCESS)){
+            log.error("电话报警异常:发送实验室【{}】,实验室ID【{}】,接收用户手机号【{}】",subjectName,storage.getSubjectId(), phones);
+        }
+    }
+
 }

+ 74 - 0
zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/service/impl/BottleStorageErrorServiceImpl.java

@@ -1,10 +1,26 @@
 package com.zd.bottle.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.zd.bottle.domain.BottleStorage;
 import com.zd.bottle.domain.BottleStorageError;
+import com.zd.bottle.domain.UseRecord;
 import com.zd.bottle.mapper.BottleStorageErrorMapper;
 import com.zd.bottle.service.BottleStorageErrorService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zd.bottle.service.BottleStorageService;
+import com.zd.bottle.service.UseRecordService;
+import com.zd.bottle.vo.BottleStorageErrorVo;
+import com.zd.bottle.vo.UseRecordVo;
+import com.zd.common.core.utils.bean.TransferUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -17,4 +33,62 @@ import org.springframework.stereotype.Service;
 @Service
 public class BottleStorageErrorServiceImpl extends ServiceImpl<BottleStorageErrorMapper, BottleStorageError> implements BottleStorageErrorService {
 
+    @Resource
+    private BottleStorageService storageService;
+    @Resource
+    private UseRecordService useRecordService;
+    @Override
+    public List<BottleStorageError> list(BottleStorageError bottleStorageError) {
+        LambdaQueryWrapper<BottleStorageError> queryWrapper = Wrappers.lambdaQuery(BottleStorageError.class);
+        String startTime = bottleStorageError.getStartTime();
+        if (StringUtils.hasLength(startTime)){
+            queryWrapper.apply("DATE_FORMAT(op_time,'%Y-%m-%d') >="+startTime);
+        }
+        String endTime = bottleStorageError.getEndTime();
+        if (StringUtils.hasLength(endTime)){
+            queryWrapper.apply("DATE_FORMAT(op_time,'%Y-%m-%d') <="+endTime);
+        }
+        String searchValue = bottleStorageError.getSearchValue();
+        if (StringUtils.hasLength(searchValue)) {
+            queryWrapper.like(BottleStorageError::getCreateBy, searchValue)
+                    .or()
+                    .like(BottleStorageError::getPhone, searchValue);
+        }
+        return list(queryWrapper);
+    }
+
+    @Override
+    public void getBottleInfo(List<BottleStorageErrorVo> storageErrorVos) {
+        Map<Long, BottleStorage> storageMap = getStorageMap(storageErrorVos);
+        storageErrorVos.forEach(se->{
+            Long storageId = se.getStorageId();
+            if (storageMap.containsKey(storageId)){
+                BottleStorage storage = storageMap.get(storageId);
+                se.setAirName(storage.getAirName())
+                        .setConfigName(storage.getConfigName());
+            }
+        });
+    }
+
+    @Override
+    public BottleStorageErrorVo getStorageErrorInfo(Long id) {
+        BottleStorageError storageError = getById(id);
+        BottleStorageErrorVo storageErrorVo=new BottleStorageErrorVo();
+        BeanUtils.copyProperties(storageError,storageErrorVo);
+        BottleStorage bottleStorage = storageService.getById(storageError.getStorageId());
+        storageErrorVo.setAirName(bottleStorage.getAirName())
+                .setConfigName(bottleStorage.getConfigName())
+                .setAirConstituents(bottleStorage.getAirComponent())
+                .setAirNumber(bottleStorage.getAirNumber());
+        List<UseRecord> useRecords = useRecordService.getByStorageId(storageError.getStorageId());
+        List<UseRecordVo> recordVos = TransferUtils.transferList(useRecords, UseRecordVo.class);
+        storageErrorVo.setRecordVos(recordVos);
+        return storageErrorVo;
+    }
+
+    private Map<Long, BottleStorage> getStorageMap(List<BottleStorageErrorVo> storageErrorVos) {
+        List<Long> storageIds = storageErrorVos.stream().map(BottleStorageErrorVo::getStorageId).collect(Collectors.toList());
+        List<BottleStorage> storages = storageService.listByIds(storageIds);
+        return storages.stream().collect(Collectors.toMap(BottleStorage::getId, s -> s));
+    }
 }

+ 2 - 2
zd-modules/zd-bottle-parent/zd-bottle/src/main/resources/mapper/BottleStorageErrorMapper.xml

@@ -7,8 +7,8 @@
         <result column="id" property="id" />
         <result column="create_by" property="createBy" />
         <result column="storage_id" property="storageId" />
-        <result column="location" property="location" />
-        <result column="location_id" property="locationId" />
+        <result column="subject_name" property="subjectName" />
+        <result column="subject_id" property="subjectId" />
         <result column="before_edit" property="beforeEdit" />
         <result column="after_edit" property="afterEdit" />
         <result column="op_time" property="opTime" />

+ 12 - 5
zd-modules/zd-forward/src/main/java/com/zd/forward/controller/SignInCheckController.java

@@ -10,10 +10,7 @@ import com.zd.common.redis.service.RedisService;
 import com.zd.common.swagger.config.Knife4jConfiguration;
 import com.zd.forward.config.AlgorithmYml;
 import com.zd.forward.domain.VideoRequestData;
-import com.zd.forward.serivce.CheckService;
-import com.zd.forward.serivce.LoginService;
-import com.zd.forward.serivce.SendSginAccessLogService;
-import com.zd.forward.serivce.VideoCheckResultValidImpl;
+import com.zd.forward.serivce.*;
 import com.zd.system.api.domain.Algorithm;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -56,7 +53,7 @@ public class SignInCheckController {
     AlgorithmYml algorithmYml;
 
     @Resource
-    LoginService loginService;
+    private FireImageService fireImageService;
 
     /**
      * 进入项验证
@@ -154,4 +151,14 @@ public class SignInCheckController {
         sendSginAccessLogService.saveAlgorithmResult(algorithm);
         return R.ok(aa);
     }
+
+    /**
+     * 火焰算法验证
+     * @param file 带验证图片
+     */
+    @ApiOperation(value = "进入项验证:合并,codes格式:1,2,3")
+    @PostMapping("/checkFire")
+    public R checkFire(@ApiParam("图片文件") @RequestParam("file") MultipartFile file) {
+        return R.ok(fireImageService.catchImage(file));
+    }
 }

+ 12 - 0
zd-modules/zd-forward/src/main/java/com/zd/forward/serivce/FireImageService.java

@@ -17,6 +17,7 @@ import org.springframework.http.HttpEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.imageio.ImageIO;
@@ -29,6 +30,7 @@ import java.util.Map;
 import java.util.Optional;
 
 import static com.zd.forward.utils.HttpUtils.getHttpEntityMap;
+import static com.zd.forward.utils.HttpUtils.multipartFileToFile;
 
 /**
  * 火焰图片抓拍处理
@@ -86,6 +88,16 @@ public class FireImageService {
         }
     }
 
+    public boolean catchImage(MultipartFile file) {
+        try {
+            File toFile = multipartFileToFile(file);
+            send(toFile);
+            return true;
+        } catch (IOException e) {
+            throw new ServiceException(e.getMessage());
+        }
+    }
+
     private void send(File file) {
         if (fireProperties.getAlgoId() == null) {
             throw new ServiceException("未配置火焰算法ID");