提交 a63357bc authored 作者: zjm's avatar zjm

feat(区块模块): 添加区块模块

添加区块模块
上级 a9c7512c
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>equip</artifactId>
<groupId>com.tykj</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dev-block</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.tykj.dev</groupId>
<artifactId>misc</artifactId>
</dependency>
<dependency>
<groupId>com.tykj.dev</groupId>
<artifactId>config</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.tykj.dev.device.block;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author huangxiahao
*/
@SpringBootApplication(scanBasePackages = {
"com.tykj.carrier.*"
})
public class BlockAtionpplication {
public static void main(String[] args) {
SpringApplication.run(BlockAtionpplication.class, args);
}
}
package com.tykj.dev.device.block.conf;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-11-02 10:45
**/
public class ApI {
/**
* 业务类型码注册
*/
public static String CO_REGISTER="/chainOffer/subRegister";
/**
* 文本上链接口(500kb)
*/
public static String CO_SEND_TEXT="/chainOffer/sendText";
/**
* hash上链接口
*/
public static String CO_SEND_HASH="/chainOffer/sendHash";
/**
* 记录查询
*/
public static String CO_FETCH_RECORD="/chainOffer/fetchRecord";
/**
* 文本追加更新
*/
public static String CO_APPEND_TEXT="/chainOffer/appendText";
/**
* 哈希追加更新
*/
public static String CO_APPEND_HASH="/chainOffer/appendHash";
/**
* 哈希防篡改校验
*/
public static String CO_VERIFY_HASH="/chainOffer/verifyHash";
/**
* 文本防篡改校验
*/
public static String CO_VERIFY_TEXT="/chainOffer/verifyText";
/**
* 查询记录在各节点上链状态
*/
public static String CO_DEPOSIT_STATUS="/chainOffer/depositStatus";
}
package com.tykj.dev.device.block.controller;
import com.tykj.dev.config.swagger.AutoDocument;
import com.tykj.dev.device.block.service.BlockDataService;
import com.tykj.dev.device.block.service.BlockService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-10-20 19:38
**/
@RestController
@RequestMapping(value = "/chainOffer")
@AutoDocument
@Api(tags = "区块链载体提供前端接口", description = "区块链载体提供前端接口")
@Slf4j
public class BlockController {
@Autowired
BlockService blockService;
@Autowired
BlockDataService blockDataService;
@ApiOperation(value = "test", notes = "区块链")
@GetMapping("/test")
public ResponseEntity test(){
//AffQaQ55FCuQNqF3bj6nsMytMqbGUDrHe8VDXqb1cPgd7K1yB8X
return ResponseEntity.ok(blockService.sendText(1,1004,"{text}"));
}
@ApiOperation(value = "查询最新的20条数据", notes = "区块大屏")
@GetMapping("/query20")
public ResponseEntity query20(){
return ResponseEntity.ok(blockDataService.query20());
}
}
package com.tykj.dev.device.block.dao;
import com.tykj.dev.device.block.entity.BlockAlarm;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import javax.transaction.Transactional;
import java.util.List;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-12-02 16:49
**/
public interface BlockAlarmDao extends JpaRepository<BlockAlarm,Integer>, JpaSpecificationExecutor<BlockAlarm> {
boolean existsByTypeAndBillId(Integer type,Integer billId);
@Transactional
@Modifying
@Query(value = "update BlockAlarm d set d.state = ?2 where d.id in ?1")
int updateBlockAlarm(List<Integer> ids,Integer state);
List<BlockAlarm> findAllByState(Integer state);
}
package com.tykj.dev.device.block.dao;
import com.tykj.dev.device.block.entity.BlockData;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-11-03 15:01
**/
public interface BlockDataDao extends JpaRepository<BlockData,Integer>, JpaSpecificationExecutor<BlockData> {
List<BlockData> findAllByBillTypeAndBillId(Integer billType, Integer billId);
@Query(value = "select b from BlockData as b order by b.createTime desc")
List<BlockData> queryCreateTimeLimit20(PageRequest pageRequest);
}
package com.tykj.dev.device.block.dao;
import com.tykj.dev.device.block.entity.BlockFillChainData;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-11-21 17:31
**/
public interface BlockFillChainDataDao extends JpaRepository<BlockFillChainData,Integer>, JpaSpecificationExecutor<BlockFillChainData> {
}
package com.tykj.dev.device.block.entity;
import com.tykj.dev.misc.base.BaseEntity;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Table;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-12-02 15:34
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@ApiModel("自动验证告警信息")
@EntityListeners(AuditingEntityListener.class)
@SQLDelete(sql = "update zt_block_alarm set delete_tag = 1 where id = ?")
@Where(clause = "delete_tag = 0")
@Table(name = "zt_block_alarm")
@Builder
public class BlockAlarm extends BaseEntity {
/**
* 业务类型名称
*/
private String name;
/**
* 业务类型
*/
private Integer type;
/**
* 业务id
*/
private Integer billId;
/**
* 状态 1.告警 2.忽略
*/
private Integer state = 1;
}
package com.tykj.dev.device.block.entity;
import com.tykj.dev.misc.base.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Table;
/**
* @program: carrier
* @description: todorecord
* @author: zjm
* @create: 2022-11-03 14:50
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@ApiModel("系统上链记录信息")
@EntityListeners(AuditingEntityListener.class)
@SQLDelete(sql = "update zt_block_data set delete_tag = 1 where id = ?")
@Where(clause = "delete_tag = 0")
@Table(name = "zt_block_bill_data")
@Builder
public class BlockData extends BaseEntity {
@ApiModelProperty(value = "业务类型")
private Integer billType;
@ApiModelProperty(value = "业务id")
private Integer billId;
@ApiModelProperty(value = "记录id")
private String recordID;
@ApiModelProperty(value = "发起单位名称")
private String unitName;
}
package com.tykj.dev.device.block.entity;
import com.tykj.dev.misc.base.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Table;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-11-21 17:19
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@ApiModel("系统上链记录信息")
@EntityListeners(AuditingEntityListener.class)
@SQLDelete(sql = "update zt_block_fill_chain_data set delete_tag = 1 where id = ?")
@Where(clause = "delete_tag = 0")
@Table(name = "zt_block_fill_chain_data")
@Builder
public class BlockFillChainData extends BaseEntity {
@ApiModelProperty(value = "系统id")
private Integer systemId;
@ApiModelProperty(value = "业务标识码")
private Integer subCode;
@ApiModelProperty(value = "上链数据")
@Column(name = "block_data",columnDefinition = "TEXT")
private String blockData;
@ApiModelProperty(value = "业务id")
private Integer billId;
@ApiModelProperty(value = "单位")
private String unitName;
@ApiModelProperty(value = "业务类型")
private String billType;
}
package com.tykj.dev.device.block.entity.bc;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-08-19
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class BcDeposit {
/**
* 结果状态码,成功为0
*/
private Integer code;
/**
* 结果状态文字描述
*/
private String info;
/**
* 接口返回结果
*/
private List<BcDepositData> data;
public BcDeposit toDate(){
return new BcDeposit();
}
}
package com.tykj.dev.device.block.entity.bc;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-10-31 17:54
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BcDepositData {
//节点编号
private Integer num;
//上链状态
private Integer status;
//节点名称
private String name;
}
package com.tykj.dev.device.block.entity.bc;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-08-19
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class BcHash {
/**
* 结果状态码,成功为0
*/
private Integer code;
/**
* 结果状态文字描述
*/
private String info;
/**
* 接口返回结果
*/
private BcHashData data;
public BcHash toDate(){
return new BcHash();
}
}
package com.tykj.dev.device.block.entity.bc;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-08-19
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BcHashData {
@JSONField(name = "recordID")
private String recordID;
}
package com.tykj.dev.device.block.entity.bc;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-08-19
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BcHistory {
/**
* 结果状态码,成功为0
*/
private Integer code;
/**
* 结果状态文字描述
*/
private String info;
/**
* 接口返回结果
*/
private BcHistoryData data;
}
package com.tykj.dev.device.block.entity.bc;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-08-19
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BcHistoryData {
/**
* 记录列表,数据项与“记录查询”一致
*/
private List<BcRecordData> records;
/**
* 游标,用于分页查询
*/
private String cursor;
}
package com.tykj.dev.device.block.entity.bc;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-08-19
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class BcInfo {
/**
* 结果状态码,成功为0
*/
private Integer code;
/**
* 结果状态文字描述
*/
private String info;
/**
* 接口返回结果
*/
private BcInfoData data;
public BcInfo toDate(){
return new BcInfo();
}
}
package com.tykj.dev.device.block.entity.bc;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-10-31 17:54
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BcInfoData {
//节点编号
private Integer num;
// 区块高度
private Long height;
//平均区块生成时间(秒)
private Long blockTimeAve;
//状态: 1: 正常; 0:异常
private Integer status;
//是否主节点: 1: 是; 0否
private Integer isLeader;
}
package com.tykj.dev.device.block.entity.bc;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-08-19
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class BcRecord {
/**
* 结果状态码,成功为0
*/
private Integer code;
/**
* 结果状态文字描述
*/
private String info;
/**
* 接口返回结果
*/
private BcRecordData data;
}
package com.tykj.dev.device.block.entity.bc;
import com.tykj.carrier.block.entity.vo.BlockTraceabilityParsing;
import com.tykj.carrier.misc.base.BeanHelper;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.modelmapper.ModelMapper;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-08-19
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BcRecordData {
/**
* 记录id
*/
private String recordID;
/**
* 记录类型,text/hash(文本或哈希)
*/
private String type;
/**
* 业务类型码,用于区分不同业务
*/
private String subCode;
/**
* 记录内容
*/
private String content;
/**
* 上链时间戳,精确到秒
*/
private String timestamp;
/**
* 区块高度
*/
private Long height;
/**
* 区块哈希
*/
private String hash;
/**
* 签名
*/
private String signature;
/**
* nonce
*/
private String nonce;
public BlockTraceabilityParsing toBlockTraceabilityParsing(){
ModelMapper modelMapper = BeanHelper.getUserMapper();
return modelMapper.map(this, BlockTraceabilityParsing.class);
}
}
package com.tykj.dev.device.block.entity.bc;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-08-18
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class BcRegister {
/**
* 结果状态码,成功为0
*/
private Integer code;
/**
* 结果状态文字描述
*/
private String info;
/**
* 接口返回结果
*/
private BcRegisterData data;
}
package com.tykj.dev.device.block.entity.bc;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-08-18
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BcRegisterData {
/**
* 业务名称
*/
private String subName;
/**
* 业务类型码
*/
private Integer subCode;
}
package com.tykj.dev.device.block.entity.bc;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-08-18
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class BcStatus {
/**
* 结果状态码,成功为0
*/
private Integer code;
/**
* 结果状态文字描述
*/
private String info;
/**
* 接口返回结果
*/
private BcStatusData data;
}
package com.tykj.dev.device.block.entity.bc;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-08-18
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BcStatusData {
/**
* 当前区块高度
*/
private String height;
/**
* 共识节点数量
*/
private Integer consensusNodeCount;
/**
* 业务节点数量
*/
private Integer serviceNodeCount;
}
package com.tykj.dev.device.block.entity.bc;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-08-19
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class BcSubject {
/**
* 结果状态码,成功为0
*/
private Integer code;
/**
* 结果状态文字描述
*/
private String info;
/**
* 接口返回结果
*/
private List<BcSubjectData> data;
public BcSubject toDate(){
return new BcSubject();
}
}
package com.tykj.dev.device.block.entity.bc;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-08-18
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BcSubjectData {
/**
* 业务代号
*/
private Integer subCode;
/**
* 业务名称
*/
private String subName;
}
package com.tykj.dev.device.block.entity.bc;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-08-18
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class BcText {
/**
* 结果状态码,成功为0
*/
private Integer code;
/**
* 结果状态文字描述
*/
private String info;
/**
* 接口返回结果
*/
private BcTextData data;
public BcText toData(){
return new BcText();
}
}
package com.tykj.dev.device.block.entity.bc;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-08-18
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BcTextData {
@JSONField(name = "recordID")
private String recordID;
}
package com.tykj.dev.device.block.entity.bc;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-11-05
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class BcVerify {
/**
* 结果状态码,成功为0
*/
private Integer code;
/**
* 结果状态文字描述
*/
private String info;
/**
* 接口返回结果
*/
private BcVerifyData data;
}
package com.tykj.dev.device.block.entity.bc;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author LJJ cnljj1995@gmail.com
* on 2020-11-05
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BcVerifyData {
/**
* 状态: ok: 正常; expired:已更新; tampered: 已篡改
*/
private String status;
}
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-11-02 11:13
**/
package com.tykj.dev.device.block.entity;
\ No newline at end of file
package com.tykj.dev.device.block.entity.vo;
import com.tykj.dev.misc.base.CustomPage;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-12-02 17:20
**/
@Data
//@NoArgsConstructor
@AllArgsConstructor
@ApiModel("告警列表查询Vo")
@Builder
public class BlockAlarmSelectVo extends CustomPage {
}
package com.tykj.dev.device.block.entity.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-11-04 11:06
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("溯源解析返回实体")
public class BlockTraceabilityParsing {
/**
* 记录id
*/
@ApiModelProperty(value = "记录id")
private String recordID;
/**
* 记录类型,text/hash(文本或哈希)
*/
@ApiModelProperty(value = "记录类型,text/hash(文本或哈希)")
private String type;
/**
* 业务类型码,用于区分不同业务
*/
@ApiModelProperty(value = "业务类型码,用于区分不同业务")
private String subCode;
/**
* 上链时间戳,精确到秒
*/
@ApiModelProperty(value = "上链时间戳,精确到秒")
private String timestamp;
/**
* 区块高度
*/
@ApiModelProperty(value = "区块高度")
private Long height;
/**
* 区块哈希
*/
@ApiModelProperty(value = "区块哈希")
private String hash;
/**
* 签名
*/
@ApiModelProperty(value = "签名")
private String signature;
/**
* nonce
*/
@ApiModelProperty(value = "nonce")
private String nonce;
@ApiModelProperty(value = "业务数据")
private TraceabilityParsingData businessTraceabilityParsingData;
@ApiModelProperty(value = "链上数据")
private TraceabilityParsingData blockTraceabilityParsingData;
@ApiModelProperty(value = "一对多使用 目前更换-递送、更换-更换")
private List<OneToTwoTraceabilityParsing> oneToTwoTraceabilityParsingList;
@ApiModelProperty(value = "当前数据")
private Object currentData;
@ApiModelProperty(value = "上链数据")
private Object blockData;
public String getRecordID() {
return recordID;
}
public void setRecordID(String recordID) {
this.recordID = recordID;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getSubCode() {
return subCode;
}
public void setSubCode(String subCode) {
this.subCode = subCode;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public Long getHeight() {
return height;
}
public void setHeight(Long height) {
this.height = height;
}
public String getHash() {
return hash;
}
public void setHash(String hash) {
this.hash = hash;
}
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
public String getNonce() {
return nonce;
}
public void setNonce(String nonce) {
this.nonce = nonce;
}
public TraceabilityParsingData getBusinessTraceabilityParsingData() {
return businessTraceabilityParsingData;
}
public void setBusinessTraceabilityParsingData(TraceabilityParsingData businessTraceabilityParsingData) {
this.businessTraceabilityParsingData = businessTraceabilityParsingData;
}
public TraceabilityParsingData getBlockTraceabilityParsingData() {
return blockTraceabilityParsingData;
}
public void setBlockTraceabilityParsingData(TraceabilityParsingData blockTraceabilityParsingData) {
this.blockTraceabilityParsingData = blockTraceabilityParsingData;
}
public Object getCurrentData() {
return currentData;
}
public void setCurrentData(Object currentData) {
this.currentData = currentData;
}
public Object getBlockData() {
return blockData;
}
public void setBlockData(Object blockData) {
this.blockData = blockData;
}
}
package com.tykj.dev.device.block.entity.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-11-28 15:32
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("溯源解析存储一对多的情况vo")
public class OneToTwoTraceabilityParsing {
@ApiModelProperty(value = "业务数据")
private TraceabilityParsingData businessTraceabilityParsingData;
@ApiModelProperty(value = "链上数据")
private TraceabilityParsingData blockTraceabilityParsingData;
}
package com.tykj.dev.device.block.entity.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-11-04 11:11
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("溯源解析系统数据vo")
@Builder
public class TraceabilityParsingData {
@ApiModelProperty(value = "业务类型")
private String billTypeName;
@ApiModelProperty(value = "业务单据编码")
private String documentNo;
@ApiModelProperty(value = "操作人")
private String operatorUserName;
@ApiModelProperty(value = "操作时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime operationTime;
@ApiModelProperty(value = "相关载体id")
private String carrierIds;
@ApiModelProperty(value = "单位名称")
private String unitName;
private String time;
}
package com.tykj.dev.device.block.service;
import com.tykj.dev.device.block.entity.BlockAlarm;
import com.tykj.dev.device.block.entity.vo.BlockAlarmSelectVo;
import org.springframework.data.domain.Page;
import java.util.List;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-12-02 16:50
**/
public interface BlockAlarmService {
/**
* 批量保存告警信息
*/
List<BlockAlarm> saveAll(List<BlockAlarm> blockAlarms);
/**
* 根据业务类型以及业务id判断是否存在
* @return
*/
boolean judgeBillTypeAndBillId(Integer billType,Integer billId);
/**
* 忽略告警
*/
void updateState(List<Integer> ids);
/**
* 根据相关条件查询分页告警数据
*/
Page<BlockAlarm> queryBlockAlarmSelectVo(BlockAlarmSelectVo blockAlarmSelectVo);
/**
* 查询告警数据列表
*/
List<BlockAlarm> queryBlockAlarmList();
/**
* 查询所有告警数据列表
*/
List<BlockAlarm> queryAll();
}
package com.tykj.dev.device.block.service;
import com.tykj.dev.device.block.entity.BlockData;
import com.tykj.dev.device.block.entity.vo.BlockTraceabilityParsing;
import java.util.List;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-11-03 15:13
**/
public interface BlockDataService {
/**
* 保存上链记录
* @param blockData 上链记录信息实体
*/
BlockData saveBlockData(BlockData blockData);
/**
* 根据业务id以及业务类型查询上链记录
*/
BlockData findBillTypeAndBillId(Integer billType,Integer billId);
List<BlockData> query20();
boolean contrast(BlockTraceabilityParsing blockTraceabilityParsing);
List<BlockData> findAll();
}
package com.tykj.dev.device.block.service;
import com.tykj.dev.device.block.entity.bc.*;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-11-02 11:11
**/
public interface BlockService {
/**
* 业务类型码注册
* @param subName 业务名称,可以是中英文
* @param systemId 系统id
*/
BcRegister subRegister(Integer systemId, String subName);
/**
* 文本上链
* @param subCode 业务代码编号
* @param content 文本 200k以内
*/
BcText sendText(Integer systemId, Integer subCode, String content);
/**
* hash 上链
* @param subCode 业务代码编号
* @param content 内容哈希,256bits hex编码。 方法可参考本模块HexUtil,方法内已转换,直接传入内容即可
*/
BcHash sendHash(Integer systemId, Integer subCode, String content);
/**
* 记录查询
* @param recordId 记录id
* @return fr
*/
BcRecord fetchRecord(Integer systemId, Integer subCode, String recordId);
/**
* 文本追加更新
* @param content 内容文本,上限为200KB
* @param recordId 本条记录上次上链或追加返回的记录id, 确保顺序追加
* @return bc
*/
BcText appendText(Integer systemId,Integer subCode,String content, String recordId);
/**
* 哈希追加更新
* @param content 内容哈希,256bits hex编码,方法内已转换,直接传入内容即可
* @param recordId 本条记录上次上链或追加返回的记录id, 确保顺序追加
* @return bc
*/
BcHash appendHash(Integer systemId,Integer subCode,String content, String recordId);
/**
* 哈希防篡改校验
* @param content 内容哈希,256bits hex编码,直接传内容即可
* @param recordId 记录id
* @return bc
*/
BcVerify verifyHash(Integer systemId, Integer subCode, String content, String recordId);
/**
* 文本防篡改校验
* @param content 内容文本,上限为200KB
* @param recordId 记录id
* @return bc
*/
BcVerify verifyText(Integer systemId,Integer subCode,String content, String recordId);
/**
* 查询记录在各节点上链状态
*/
BcDeposit depositStatus(Integer systemId,Integer subCode,String recordID);
}
package com.tykj.dev.device.block.service.impl;
import com.tykj.dev.device.block.dao.BlockAlarmDao;
import com.tykj.dev.device.block.entity.BlockAlarm;
import com.tykj.dev.device.block.entity.vo.BlockAlarmSelectVo;
import com.tykj.dev.device.block.service.BlockAlarmService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-12-02 17:43
**/
@Service
public class BlockAlarmServiceImpl implements BlockAlarmService {
@Autowired
BlockAlarmDao blockAlarmDao;
@Override
public List<BlockAlarm> saveAll(List<BlockAlarm> blockAlarms) {
return blockAlarmDao.saveAll(blockAlarms);
}
@Override
public boolean judgeBillTypeAndBillId(Integer billType, Integer billId) {
return blockAlarmDao.existsByTypeAndBillId(billType, billId);
}
@Override
public void updateState(List<Integer> ids) {
blockAlarmDao.updateBlockAlarm(ids,2);
}
@Override
public Page<BlockAlarm> queryBlockAlarmSelectVo(BlockAlarmSelectVo blockAlarmSelectVo) {
return blockAlarmDao.findAll(blockAlarmSelectVo.getPageable());
}
@Override
public List<BlockAlarm> queryBlockAlarmList() {
return blockAlarmDao.findAllByState(1);
}
@Override
public List<BlockAlarm> queryAll() {
return blockAlarmDao.findAll();
}
}
package com.tykj.dev.device.block.service.impl;
import com.tykj.dev.device.block.dao.BlockDataDao;
import com.tykj.dev.device.block.entity.BlockData;
import com.tykj.dev.device.block.entity.vo.BlockTraceabilityParsing;
import com.tykj.dev.device.block.entity.vo.TraceabilityParsingData;
import com.tykj.dev.device.block.service.BlockDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import java.time.format.DateTimeFormatter;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-11-03 16:14
**/
@Service
public class BlockDataServiceImpl implements BlockDataService {
@Autowired
BlockDataDao blockDataDao;
@Override
public BlockData saveBlockData(BlockData blockData) {
return blockDataDao.save(blockData);
}
@Override
public BlockData findBillTypeAndBillId(Integer billType, Integer billId) {
List<BlockData> allByBillTypeAndBillId = blockDataDao.findAllByBillTypeAndBillId(billType, billId).stream().sorted(Comparator.comparing(BlockData::getCreateTime).reversed()).collect(Collectors.toList());
if (allByBillTypeAndBillId.size()>0){
return allByBillTypeAndBillId.get(0);
}else {
return new BlockData();
}
}
@Override
public List<BlockData> query20() {
PageRequest pageRequest=PageRequest.of(0,20);
List<BlockData> blockData = blockDataDao.queryCreateTimeLimit20(pageRequest);
return blockData;
}
@Override
public boolean contrast(BlockTraceabilityParsing blockTraceabilityParsing) {
if (blockTraceabilityParsing.getOneToTwoTraceabilityParsingList()!=null&&blockTraceabilityParsing.getOneToTwoTraceabilityParsingList().size()>0) {
return blockTraceabilityParsing.getOneToTwoTraceabilityParsingList().stream().allMatch(oneToTwoTraceabilityParsing -> oneToTwoTraceabilityParsing.getBlockTraceabilityParsingData().equals(oneToTwoTraceabilityParsing.getBusinessTraceabilityParsingData()));
}else {
TraceabilityParsingData businessTraceabilityParsingData =blockTraceabilityParsing.getBusinessTraceabilityParsingData();
TraceabilityParsingData blockTraceabilityParsingData = blockTraceabilityParsing.getBlockTraceabilityParsingData();
return businessTraceabilityParsingData.equals(blockTraceabilityParsingData);
}
}
@Override
public List<BlockData> findAll() {
return blockDataDao.findAll();
}
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
private TraceabilityParsingData toLocalDateTime(TraceabilityParsingData traceabilityParsingData){
String localTime = df.format(traceabilityParsingData.getOperationTime());
traceabilityParsingData.setOperationTime(null);
traceabilityParsingData.setTime(localTime);
return traceabilityParsingData;
}
}
package com.tykj.dev.device.block.service.impl;
import com.tykj.dev.device.block.conf.ApI;
import com.tykj.dev.device.block.entity.bc.*;
import com.tykj.dev.device.block.service.BlockService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.util.SortedMap;
import java.util.TreeMap;
/**
* @program: carrier
* @description: todo
* @author: zjm
* @create: 2022-11-02 11:25
**/
@Service
public class BlockServiceImpl implements BlockService {
@Value("${block.carrier.ip}")
private String IP;
@Override
public BcRegister subRegister(Integer systemId, String subName) {
SortedMap<Object, Object> request = getRequest();
request.put("systemId", systemId);
request.put("subName", subName);
return new RestTemplate().postForObject(
IP + ApI.CO_REGISTER,
request,
BcRegister.class);
}
@Override
public BcText sendText(Integer systemId, Integer subCode, String content) {
SortedMap<Object, Object> request = getRequest();
request.put("systemId", systemId);
request.put("subCode", subCode);
request.put("content", content);
return new RestTemplate().postForObject(
IP + ApI.CO_SEND_TEXT,
request,
BcText.class);
}
@Override
public BcHash sendHash(Integer systemId, Integer subCode, String content) {
SortedMap<Object, Object> request = getRequest();
request.put("systemId", systemId);
request.put("subCode", subCode);
request.put("content", content);
return new RestTemplate().postForObject(
IP + ApI.CO_SEND_HASH,
request,
BcHash.class);
}
@Override
public BcRecord fetchRecord(Integer systemId, Integer subCode, String recordId) {
SortedMap<Object, Object> request = getRequest();
request.put("systemId", systemId);
request.put("subCode", subCode);
request.put("recordId", recordId);
return new RestTemplate().postForObject(
IP + ApI.CO_FETCH_RECORD,
request,
BcRecord.class);
}
@Override
public BcText appendText(Integer systemId, Integer subCode, String content, String recordId) {
SortedMap<Object, Object> request = getRequest();
request.put("systemId", systemId);
request.put("subCode", subCode);
request.put("content", content);
request.put("recordId", recordId);
return new RestTemplate().postForObject(
IP + ApI.CO_APPEND_TEXT,
request,
BcText.class);
}
@Override
public BcHash appendHash(Integer systemId, Integer subCode, String content, String recordId) {
SortedMap<Object, Object> request = getRequest();
request.put("systemId", systemId);
request.put("subCode", subCode);
request.put("content", content);
request.put("recordId", recordId);
return new RestTemplate().postForObject(
IP + ApI.CO_APPEND_HASH,
request,
BcHash.class);
}
@Override
public BcVerify verifyHash(Integer systemId, Integer subCode, String content, String recordId) {
SortedMap<Object, Object> request = getRequest();
request.put("systemId", systemId);
request.put("subCode", subCode);
request.put("content", content);
request.put("recordId", recordId);
return new RestTemplate().postForObject(
IP + ApI.CO_VERIFY_HASH,
request,
BcVerify.class);
}
@Override
public BcVerify verifyText(Integer systemId, Integer subCode, String content, String recordId) {
SortedMap<Object, Object> request = getRequest();
request.put("systemId", systemId);
request.put("subCode", subCode);
request.put("content", content);
request.put("recordId", recordId);
return new RestTemplate().postForObject(
IP + ApI.CO_VERIFY_TEXT,
request,
BcVerify.class);
}
@Override
public BcDeposit depositStatus(Integer systemId, Integer subCode, String recordID) {
SortedMap<Object, Object> request = getRequest();
request.put("systemId", systemId);
request.put("subCode", subCode);
request.put("recordId", recordID);
return new RestTemplate().postForObject(
IP + ApI.CO_DEPOSIT_STATUS,
request,
BcDeposit.class);
}
private SortedMap<Object, Object> getRequest() {
// long timestamp = System.currentTimeMillis() / 1000;
// String nonce = UUID.randomUUID().toString().trim().replaceAll("-", "");
SortedMap<Object, Object> request = new TreeMap<Object, Object>();
// request.put("timestamp", timestamp);
// request.put("nonce", nonce);
// request.put("secretID", SECRET_ID);
return request;
}
}
...@@ -52,7 +52,8 @@ ...@@ -52,7 +52,8 @@
<module>dev-zxing</module> <module>dev-zxing</module>
<module>dev-readmachine</module> <module>dev-readmachine</module>
<module>dev-screen</module> <module>dev-screen</module>
</modules> <module>dev-block</module>
</modules>
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论