联动控制箱解析\报警器修复\设备安装记录\设备浓度列表\部门\角色等权限修复\pdf下载

master
小鱼干 2 months ago
parent 5c9559de51
commit 24971d96a4

@ -43,7 +43,7 @@ public class UserInfo extends TenantModel implements Id<Long>, Serializable {
public static final int USER_TYPE_CLIENT = 1; public static final int USER_TYPE_CLIENT = 1;
private Long id; private Long id;
private Long tenantId;
/** /**
* *
*/ */
@ -82,7 +82,7 @@ public class UserInfo extends TenantModel implements Id<Long>, Serializable {
* Id * Id
*/ */
private String currHomeId; private String currHomeId;
private Long deptAreaId;
/** /**
* *
* 0: * 0:
@ -108,5 +108,5 @@ public class UserInfo extends TenantModel implements Id<Long>, Serializable {
* :Constants.THIRD_PLAT * :Constants.THIRD_PLAT
*/ */
private List<String> usePlatforms = new ArrayList<>(); private List<String> usePlatforms = new ArrayList<>();
private List<Long> deptAreaIds = new ArrayList<>();
} }

@ -83,5 +83,6 @@ public class AlertConfig extends TenantModel implements Owned<Long> {
* 012,, * 012,,
*/ */
private String messagePush; private String messagePush;
private String messagePushIpone;
private String deviceName;
} }

@ -72,11 +72,13 @@ public class AlertRecord extends TenantModel implements Owned<Long> {
* *
*/ */
private String details; private String details;
private Long tenantId;
private Long deptAreaId;
/** /**
* *
*/ */
private Boolean readFlg; private Boolean readFlg;
private Boolean statusFlg = false;
/* @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") /* @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
public Date getAlertTime() { public Date getAlertTime() {
return new Date(this.alertTime); return new Date(this.alertTime);

@ -0,0 +1,75 @@
/*
*
* * | Licensed OPENIITA
* * +----------------------------------------------------------------------
* * | Author: xw2sy@163.com
* * +----------------------------------------------------------------------
*
* Copyright [2024] [OPENIITA]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package cc.iotkit.model.device;
import cc.iotkit.model.Owned;
import cc.iotkit.model.TenantModel;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.*;
import org.hibernate.annotations.Filter;
import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.ParamDef;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class DeviceDetectorInfo extends TenantModel implements Owned<String>,Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String deviceId;
private String productKey;
private String deviceName;
private String uid;
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createTime;
private Long createAt;
/**
*
*/
private Long tenantId;
private String node;
private String gasTypeKey;
private String dataDetectorValue;
}

@ -45,9 +45,15 @@ public class DeviceInfo extends TenantModel implements Owned<String> {
private String deviceId; private String deviceId;
private String site; private String site;
private String name; private String name;
private Long deptAreaId; private String signalStrength;
private String deviceVersion;
private Long deptAreaId;
private Long tenantId;
//设备状态0正常1故障2报警3离线
private Integer deviceStatus;
/** /**
* key * key
*/ */
@ -55,12 +61,12 @@ public class DeviceInfo extends TenantModel implements Owned<String> {
private String productName; private String productName;
private String deviceName; private String deviceName;
private String tenantName;
/** /**
* *
*/ */
private String model; private String model;
private boolean flag;
/** /**
* *
*/ */
@ -72,6 +78,23 @@ public class DeviceInfo extends TenantModel implements Owned<String> {
* ID * ID
*/ */
private String uid; private String uid;
//安装信息
private DeviceInstallInfo deviceInstallInfo;
private String nodeOne;
private String nodeTwo;
private String nodeThree;
private String nodeFour;
private String nodeFive;
private String nodeOneStatus;
private String nodeTwoStatus;
private String nodeThreeStatus;
private String nodeFourStatus;
private String nodeFiveStatus;
private String nodeOneDevice;
private String nodeTwoDevice;
private String nodeThreeDevice;
private String nodeFourDevice;
private String nodeFiveDevice;
/** /**
* ID * ID

@ -0,0 +1,97 @@
/*
*
* * | Licensed OPENIITA
* * +----------------------------------------------------------------------
* * | Author: xw2sy@163.com
* * +----------------------------------------------------------------------
*
* Copyright [2024] [OPENIITA]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package cc.iotkit.model.device;
import cc.iotkit.model.Owned;
import cc.iotkit.model.TenantModel;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class DeviceInstallInfo extends TenantModel implements Owned<String>,Serializable {
private static final long serialVersionUID = 1L;
private String id;
// @ApiModelProperty(value = "设备名称(报警器编号)")
private String deviceName;
// @ApiModelProperty(value = "公司名称")
private String corporateName;
// @ApiModelProperty(value = "申请时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date proposerTime;
// @ApiModelProperty(value = "申请人")
private String proposer;
// @ApiModelProperty(value = "申请班组")
private String proposerTeam;
// @ApiModelProperty(value = "小区名称")
private String communityName;
// @ApiModelProperty(value = "用户名称")
private String userName;
// @ApiModelProperty(value = "用户电话")
private String userIpone;
// @ApiModelProperty(value = "楼栋单元号")
private String buildingUnit;
// @ApiModelProperty(value = "房间号")
private String roomNo;
// @ApiModelProperty(value = "切断阀编号")
private String shutValueNumber;
// @ApiModelProperty(value = "燃气表号")
private String gasMeterNumber;
// @ApiModelProperty(value = "备注")
private String remarks;
// @ApiModelProperty(value = "安装前图片")
private String beforeInstallationImage;
// @ApiModelProperty(value = "装完成探测器工作图片")
private String workingOfTheDetectorImage;
// @ApiModelProperty(value = "测漏图片")
private String sideLeakageImage;
// @ApiModelProperty(value = "点火图片")
private String ignitionPictureImage;
// @ApiModelProperty(value = "装完成全景图片")
private String installThePanoramicImage;
// @ApiModelProperty(value = "燃气表图片")
private String ofGasMeterImage;
//@ApiModelProperty(value = "工单图片")
private String workOrderImage;
//@ApiModelProperty(value = "打孔图片")
private String punchingImage;
// @ApiModelProperty(value = "用户id")
private String uid;
// @ApiModelProperty(value = "租户编号")
private Long tenantId;
// @ApiModelProperty(value = "装电源线照片")
private String fiexImage;
private Integer state;
}

@ -0,0 +1,25 @@
package cc.iotkit.model.device;
import lombok.Data;
@Data
public class InstallationRecord {
private String teamName; // 班组名称
private String installer; // 安装人
private String community; // 小区名称
private String buildingNo; // 楼栋号
private String unitNo; // 单元号
private String roomNo; // 房号
private String userName; // 用户姓名
private String userPhone; // 用户电话
private String stoveType; // 灶具类型
private String installDate; // 安装时间
// 材料使用相关字段
private int ballValve; // 球阀
private int drilling; // 打孔
private String pipeType; // 管子使用类型及尺寸
private int nonFixedPipe; // 非定尺管
private int nut; // 螺母
private int quickConnect; // 插入式快接
}

@ -26,6 +26,9 @@ import cc.iotkit.model.Id;
import cc.iotkit.model.TenantModel; import cc.iotkit.model.TenantModel;
import lombok.Data; import lombok.Data;
import javax.persistence.Column;
import java.util.Date;
@Data @Data
public class Category extends TenantModel implements Id<String> { public class Category extends TenantModel implements Id<String> {
@ -34,5 +37,7 @@ public class Category extends TenantModel implements Id<String> {
private String name; private String name;
private Long createAt; private Long createAt;
@Column(name = "create_time", updatable = false)
private Date createTime;
} }

@ -60,7 +60,8 @@ public class RuleInfo implements Owned<String> {
private String desc; private String desc;
private Long createAt; private Long createAt;
private Long tenantId;
private String tenantName;
public List<FilterConfig> getListeners() { public List<FilterConfig> getListeners() {
return listeners == null ? new ArrayList<>() : listeners; return listeners == null ? new ArrayList<>() : listeners;
} }

@ -0,0 +1,52 @@
/*
*
* * | Licensed OPENIITA
* * +----------------------------------------------------------------------
* * | Author: xw2sy@163.com
* * +----------------------------------------------------------------------
*
* Copyright [2024] [OPENIITA]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package cc.iotkit.model.stats;
import cc.iotkit.common.api.BaseDto;
import cc.iotkit.model.system.SysDept;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* sys_dept
*
* @author Michelle.Chung
*/
@Data
public class SysDeptDto {
/**
* (0,1)
*/
private Integer areaType;
private Long normalCount;
private Long faultCount;
private Long alarmCount;
private Long onlineCount;
private Long expireCount;
}

@ -25,6 +25,7 @@ package cc.iotkit.model.system;
import cc.iotkit.model.BaseModel; import cc.iotkit.model.BaseModel;
import cc.iotkit.model.Id; import cc.iotkit.model.Id;
import cc.iotkit.model.TenantModel;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -38,7 +39,7 @@ import java.util.Date;
*/ */
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
public class SysDept extends BaseModel implements Id<Long>, Serializable { public class SysDept extends TenantModel implements Id<Long>, Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
@ -105,4 +106,8 @@ public class SysDept extends BaseModel implements Id<Long>, Serializable {
* (0,1) * (0,1)
*/ */
private Integer areaType; private Integer areaType;
private String latitude;
private String longitude;
private String site;
} }

@ -46,7 +46,7 @@ public class SysRole extends TenantModel implements Id<Long>,Serializable {
* ID * ID
*/ */
private Long id; private Long id;
private Long tenantId;
/** /**
* *
*/ */

@ -148,4 +148,5 @@ public class SysUser extends TenantModel implements Id<Long>, Serializable {
private Long roleId; private Long roleId;
private Long deptAreaId; private Long deptAreaId;
private boolean flag;
} }

@ -33,5 +33,7 @@ import java.util.List;
public interface IAlertConfigData extends ICommonData<AlertConfig, Long> { public interface IAlertConfigData extends ICommonData<AlertConfig, Long> {
List<AlertConfig> findByUidAndRuleInfoId(String uid, String ruleInfoId); List<AlertConfig> findByUidAndRuleInfoId(String uid, String ruleInfoId);
List<AlertConfig> findByUidAndRuleInfoIdAndDeviceName(String uid, String ruleInfoId,String deviceName);
Paging<AlertConfig> selectAlertConfigPage(PageRequest<AlertConfig> request); Paging<AlertConfig> selectAlertConfigPage(PageRequest<AlertConfig> request);
} }

@ -31,6 +31,6 @@ import java.util.List;
public interface IDIccidRecordData extends ICommonData<DIccidRecordDO, Long> { public interface IDIccidRecordData extends ICommonData<DIccidRecordDO, Long> {
DIccidRecordDO findByImei(String Imei);
} }

@ -0,0 +1,35 @@
/*
*
* * | Licensed OPENIITA
* * +----------------------------------------------------------------------
* * | Author: xw2sy@163.com
* * +----------------------------------------------------------------------
*
* Copyright [2024] [OPENIITA]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package cc.iotkit.data.manager;
import cc.iotkit.data.ICommonData;
import cc.iotkit.data.IOwnedData;
import cc.iotkit.model.device.DeviceDetectorInfo;
import cc.iotkit.model.iccid.DIccidRecordDO;
public interface IDeviceDetectorInfoData extends IOwnedData<DeviceDetectorInfo, String> {
}

@ -29,6 +29,7 @@ import cc.iotkit.model.device.message.DevicePropertyCache;
import cc.iotkit.model.stats.AlertStatDTO; import cc.iotkit.model.stats.AlertStatDTO;
import cc.iotkit.model.stats.DataItem; import cc.iotkit.model.stats.DataItem;
import cc.iotkit.model.stats.ProductKeyCountDTO; import cc.iotkit.model.stats.ProductKeyCountDTO;
import cc.iotkit.model.stats.SysDeptDto;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -50,7 +51,7 @@ public interface IDeviceInfoData extends IOwnedData<DeviceInfo, String> {
* @param deviceId id * @param deviceId id
*/ */
Map<String, DevicePropertyCache> getProperties(String deviceId); Map<String, DevicePropertyCache> getProperties(String deviceId);
SysDeptDto getStatsCount(Long deptAreaId);
/** /**
* *
* *
@ -88,6 +89,7 @@ public interface IDeviceInfoData extends IOwnedData<DeviceInfo, String> {
*/ */
List<DeviceInfo> findByParentId(String parentId); List<DeviceInfo> findByParentId(String parentId);
public List<DeviceInfo> findByConditionsList(String productKey); public List<DeviceInfo> findByConditionsList(String productKey);
public List<DeviceInfo> findByConditionsList(String productKey,Boolean flag);
/** /**
* IDID * IDID
* *
@ -99,7 +101,7 @@ public interface IDeviceInfoData extends IOwnedData<DeviceInfo, String> {
* deviceName * deviceName
*/ */
DeviceInfo findByDeviceName(String deviceName); DeviceInfo findByDeviceName(String deviceName);
List<DeviceInfo> findByDeptAreaIdAndProductKey(Long areaDeptId,String productKey);
/** /**
* *
* *
@ -115,7 +117,9 @@ public interface IDeviceInfoData extends IOwnedData<DeviceInfo, String> {
Paging<DeviceInfo> findByConditions(String name,String uid, String subUid, String productKey, Paging<DeviceInfo> findByConditions(String name,String uid, String subUid, String productKey,
String groupId, Boolean online, String keyword, String groupId, Boolean online, String keyword,
int page, int size,Long areaDepeId); int page, int size,Long areaDepeId);
Paging<DeviceInfo> findByConditions1(String name,String uid, String subUid, String productKey,
String groupId, Boolean online, String keyword,
int page, int size,Long areaDepeId);
/** /**
* *
* *
@ -134,6 +138,7 @@ public interface IDeviceInfoData extends IOwnedData<DeviceInfo, String> {
*/ */
long countByGroupId(String groupId); long countByGroupId(String groupId);
long countByUidAndState(String uid,String state);
/** /**
* *
* *

@ -0,0 +1,36 @@
/*
*
* * | Licensed OPENIITA
* * +----------------------------------------------------------------------
* * | Author: xw2sy@163.com
* * +----------------------------------------------------------------------
*
* Copyright [2024] [OPENIITA]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package cc.iotkit.data.manager;
import cc.iotkit.data.IOwnedData;
import cc.iotkit.model.device.DeviceDetectorInfo;
import cc.iotkit.model.device.DeviceInstallInfo;
public interface IDeviceInstallInfoData extends IOwnedData<DeviceInstallInfo, String> {
DeviceInstallInfo findByDeviceNameAndUid(String deviceName,String uid);
DeviceInstallInfo findByDeviceNameAndUidAndState(String deviceName,String uid,Integer state);
}

@ -22,6 +22,8 @@
*/ */
package cc.iotkit.data.manager; package cc.iotkit.data.manager;
import cc.iotkit.common.api.PageRequest;
import cc.iotkit.common.api.Paging;
import cc.iotkit.data.ICommonData; import cc.iotkit.data.ICommonData;
import cc.iotkit.model.UserInfo; import cc.iotkit.model.UserInfo;
@ -30,6 +32,8 @@ import java.util.List;
public interface IUserInfoData extends ICommonData<UserInfo, Long> { public interface IUserInfoData extends ICommonData<UserInfo, Long> {
UserInfo findByUid(String uid); UserInfo findByUid(String uid);
UserInfo findByUidAndUserName(String uid,String userName);
UserInfo findByUserName(String userName);
List<UserInfo> findByType(int type); List<UserInfo> findByType(int type);
Paging<UserInfo> findAll(PageRequest<UserInfo> pageRequest);
} }

@ -47,6 +47,7 @@ public interface ISysDeptData extends ICommonData<SysDept, Long> {
*/ */
List<SysDept> findDepts(SysDept dept); List<SysDept> findDepts(SysDept dept);
/** /**
* ID * ID
* *
@ -70,7 +71,7 @@ public interface ISysDeptData extends ICommonData<SysDept, Long> {
* @return * @return
*/ */
List<SysDept> findByDeptId(Long deptId); List<SysDept> findByDeptId(Long deptId);
List<SysDept> findByTenantId(Long tenantId);
boolean checkDeptNameUnique(String deptName, Long parentId, Long deptId); boolean checkDeptNameUnique(String deptName, Long parentId, Long deptId);

@ -28,6 +28,8 @@ import cc.iotkit.common.api.Paging;
import cc.iotkit.data.ICommonData; import cc.iotkit.data.ICommonData;
import cc.iotkit.model.system.SysUser; import cc.iotkit.model.system.SysUser;
import java.util.List;
/** /**
* *
* *
@ -74,4 +76,6 @@ public interface ISysUserData extends ICommonData<SysUser, Long> {
Paging<SysUser> selectUnallocatedList(PageRequest<SysUser> to); Paging<SysUser> selectUnallocatedList(PageRequest<SysUser> to);
SysUser findByPhonenumber(String phonenumber); SysUser findByPhonenumber(String phonenumber);
List<SysUser> findByTenantId(Long tenantId);
} }

@ -44,6 +44,10 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId> <artifactId>spring-boot-starter-cache</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
</dependencies> </dependencies>

@ -26,17 +26,18 @@ package cc.iotkit.data.service;
import cc.iotkit.common.api.PageRequest; import cc.iotkit.common.api.PageRequest;
import cc.iotkit.common.api.Paging; import cc.iotkit.common.api.Paging;
import cc.iotkit.common.constant.Constants; import cc.iotkit.common.constant.Constants;
import cc.iotkit.common.utils.MapstructUtils;
import cc.iotkit.data.cache.CategoryCacheEvict; import cc.iotkit.data.cache.CategoryCacheEvict;
import cc.iotkit.data.manager.ICategoryData; import cc.iotkit.data.manager.ICategoryData;
import cc.iotkit.model.product.Category; import cc.iotkit.model.product.Category;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Collection; import java.util.*;
import java.util.Collections; import java.util.stream.Collectors;
import java.util.List;
@Service @Service
@Qualifier("categoryDataCache") @Qualifier("categoryDataCache")
@ -92,6 +93,9 @@ public class CategoryDataCache implements ICategoryData {
@Override @Override
public Paging<Category> findAll(PageRequest<Category> pageRequest) { public Paging<Category> findAll(PageRequest<Category> pageRequest) {
pageRequest.setSortMap(new HashMap<>());
pageRequest.getSortMap().put("createTime", "desc");
return categoryData.findAll(pageRequest); return categoryData.findAll(pageRequest);
} }

@ -34,6 +34,7 @@ import cc.iotkit.model.device.message.DevicePropertyCache;
import cc.iotkit.model.stats.AlertStatDTO; import cc.iotkit.model.stats.AlertStatDTO;
import cc.iotkit.model.stats.DataItem; import cc.iotkit.model.stats.DataItem;
import cc.iotkit.model.stats.ProductKeyCountDTO; import cc.iotkit.model.stats.ProductKeyCountDTO;
import cc.iotkit.model.stats.SysDeptDto;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
@ -137,6 +138,12 @@ public class DeviceInfoDataCache implements IDeviceInfoData, SmartInitializingSi
public Map<String, DevicePropertyCache> getProperties(String deviceId) { public Map<String, DevicePropertyCache> getProperties(String deviceId) {
return getPropertyCacheInfo(deviceId).getProperties(); return getPropertyCacheInfo(deviceId).getProperties();
} }
@Override
public SysDeptDto getStatsCount(Long deptAreaId) {
return deviceInfoData.getStatsCount(deptAreaId);
}
@Override @Override
public List<ProductKeyCountDTO> getProductDevice(Long deptAreaId,String startDate, String endDate){ public List<ProductKeyCountDTO> getProductDevice(Long deptAreaId,String startDate, String endDate){
@ -181,6 +188,11 @@ public class DeviceInfoDataCache implements IDeviceInfoData, SmartInitializingSi
public DeviceInfo findByDeviceName(String deviceName) { public DeviceInfo findByDeviceName(String deviceName) {
return deviceInfoData.findByDeviceName(deviceName); return deviceInfoData.findByDeviceName(deviceName);
} }
@Override
// @Cacheable(value = Constants.CACHE_DEVICE_INFO, key = "#root.method.name+#deviceName", unless = "#result == null")
public List<DeviceInfo> findByDeptAreaIdAndProductKey(Long deviceId, String productKey) {
return deviceInfoData.findByDeptAreaIdAndProductKey(deviceId,productKey);
}
@Override @Override
public List<DeviceInfo> findByParentId(String parentId) { public List<DeviceInfo> findByParentId(String parentId) {
@ -192,6 +204,11 @@ public class DeviceInfoDataCache implements IDeviceInfoData, SmartInitializingSi
return deviceInfoData.findByConditionsList(productKey); return deviceInfoData.findByConditionsList(productKey);
} }
@Override
public List<DeviceInfo> findByConditionsList(String productKey, Boolean flag) {
return deviceInfoData.findByConditionsList(productKey,flag);
}
@Override @Override
public List<DeviceInfo> findByProductNodeType(String uid) { public List<DeviceInfo> findByProductNodeType(String uid) {
return deviceInfoData.findByProductNodeType(uid); return deviceInfoData.findByProductNodeType(uid);
@ -217,7 +234,10 @@ public class DeviceInfoDataCache implements IDeviceInfoData, SmartInitializingSi
String groupId, Boolean state, String keyword, int page, int size,Long deptAreaId) { String groupId, Boolean state, String keyword, int page, int size,Long deptAreaId) {
return deviceInfoData.findByConditions(name,uid, subUid, productKey, groupId, state, keyword, page, size,deptAreaId); return deviceInfoData.findByConditions(name,uid, subUid, productKey, groupId, state, keyword, page, size,deptAreaId);
} }
public Paging<DeviceInfo> findByConditions1(String name,String uid, String subUid, String productKey,
String groupId, Boolean state, String keyword, int page, int size,Long deptAreaId) {
return deviceInfoData.findByConditions1(name,uid, subUid, productKey, groupId, state, keyword, page, size,deptAreaId);
}
@Override @Override
public void updateTag(String deviceId, DeviceInfo.Tag tag) { public void updateTag(String deviceId, DeviceInfo.Tag tag) {
deviceInfoData.updateTag(deviceId, tag); deviceInfoData.updateTag(deviceId, tag);
@ -235,6 +255,10 @@ public class DeviceInfoDataCache implements IDeviceInfoData, SmartInitializingSi
public long countByGroupId(String groupId) { public long countByGroupId(String groupId) {
return deviceInfoData.countByGroupId(groupId); return deviceInfoData.countByGroupId(groupId);
} }
@Override
public long countByUidAndState(String uid,String state) {
return deviceInfoData.countByUidAndState(uid,state);
}
@Override @Override
public void addToGroup(String deviceId, DeviceInfo.Group group) { public void addToGroup(String deviceId, DeviceInfo.Group group) {

@ -30,6 +30,7 @@ import cc.iotkit.model.device.message.DevicePropertyCache;
import cc.iotkit.model.stats.AlertStatDTO; import cc.iotkit.model.stats.AlertStatDTO;
import cc.iotkit.model.stats.DataItem; import cc.iotkit.model.stats.DataItem;
import cc.iotkit.model.stats.ProductKeyCountDTO; import cc.iotkit.model.stats.ProductKeyCountDTO;
import cc.iotkit.model.stats.SysDeptDto;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -58,6 +59,12 @@ public class DeviceInfoPropertyDataCache implements IDeviceInfoData {
public List<DeviceInfo> findByConditionsList(String productKey){ public List<DeviceInfo> findByConditionsList(String productKey){
return deviceInfoData.findByConditionsList(productKey); return deviceInfoData.findByConditionsList(productKey);
} }
@Override
public List<DeviceInfo> findByConditionsList(String productKey, Boolean flag) {
return deviceInfoData.findByConditionsList(productKey,flag);
}
@Override @Override
public List<DeviceInfo> findByIds(Collection<String> id) { public List<DeviceInfo> findByIds(Collection<String> id) {
return null; return null;
@ -118,6 +125,11 @@ public class DeviceInfoPropertyDataCache implements IDeviceInfoData {
return deviceInfoData.getProperties(deviceId); return deviceInfoData.getProperties(deviceId);
} }
@Override
public SysDeptDto getStatsCount(Long deptAreaId) {
return deviceInfoData.getStatsCount(deptAreaId);
}
@Override @Override
public long getPropertyUpdateTime(String deviceId) { public long getPropertyUpdateTime(String deviceId) {
return deviceInfoData.getPropertyUpdateTime(deviceId); return deviceInfoData.getPropertyUpdateTime(deviceId);
@ -149,6 +161,17 @@ public class DeviceInfoPropertyDataCache implements IDeviceInfoData {
deviceInfo.setProperty(getProperties(deviceInfo.getDeviceId())); deviceInfo.setProperty(getProperties(deviceInfo.getDeviceId()));
return deviceInfo; return deviceInfo;
} }
@Override
public List<DeviceInfo> findByDeptAreaIdAndProductKey(Long areaDeptId, String productKey) {
List<DeviceInfo> deviceInfo = deviceInfoData.findByDeptAreaIdAndProductKey(areaDeptId, productKey);
if (deviceInfo == null) {
return null;
}
deviceInfo.forEach(deviceInfo1 -> deviceInfo1.setProperty(getProperties(deviceInfo1.getDeviceId())));
// deviceInfo.setProperty(getProperties(deviceInfo.getDeviceId()));
return deviceInfo;
}
@Override @Override
public List<AlertStatDTO> getDeviceRecord() { public List<AlertStatDTO> getDeviceRecord() {
return deviceInfoData.getDeviceRecord(); return deviceInfoData.getDeviceRecord();
@ -167,7 +190,10 @@ public class DeviceInfoPropertyDataCache implements IDeviceInfoData {
public Paging<DeviceInfo> findByConditions(String name,String uid, String subUid, String productKey, String groupId, Boolean online, String keyword, int page, int size,Long deptAreaId) { public Paging<DeviceInfo> findByConditions(String name,String uid, String subUid, String productKey, String groupId, Boolean online, String keyword, int page, int size,Long deptAreaId) {
return deviceInfoData.findByConditions(name,uid, subUid, productKey, groupId, online, keyword, page, size,deptAreaId); return deviceInfoData.findByConditions(name,uid, subUid, productKey, groupId, online, keyword, page, size,deptAreaId);
} }
@Override
public Paging<DeviceInfo> findByConditions1(String name,String uid, String subUid, String productKey, String groupId, Boolean online, String keyword, int page, int size,Long deptAreaId) {
return deviceInfoData.findByConditions(name,uid, subUid, productKey, groupId, online, keyword, page, size,deptAreaId);
}
@Override @Override
public void updateTag(String deviceId, DeviceInfo.Tag tag) { public void updateTag(String deviceId, DeviceInfo.Tag tag) {
deviceInfoData.updateTag(deviceId, tag); deviceInfoData.updateTag(deviceId, tag);
@ -182,6 +208,11 @@ public class DeviceInfoPropertyDataCache implements IDeviceInfoData {
public long countByGroupId(String groupId) { public long countByGroupId(String groupId) {
return deviceInfoData.countByGroupId(groupId); return deviceInfoData.countByGroupId(groupId);
} }
@Override
public long countByUidAndState(String uid,String state) {
return deviceInfoData.countByUidAndState(uid,state);
}
@Override @Override
public void addToGroup(String deviceId, DeviceInfo.Group group) { public void addToGroup(String deviceId, DeviceInfo.Group group) {

@ -135,7 +135,7 @@ public class ProductDataCache implements IProductData {
@Override @Override
public List<Product> findAllByCondition(Product data) { public List<Product> findAllByCondition(Product data) {
return null; return productData.findAll();
} }
@Override @Override

@ -29,9 +29,13 @@ import cc.iotkit.common.constant.Constants;
import cc.iotkit.data.cache.UserInfoCacheEvict; import cc.iotkit.data.cache.UserInfoCacheEvict;
import cc.iotkit.data.manager.IUserInfoData; import cc.iotkit.data.manager.IUserInfoData;
import cc.iotkit.model.UserInfo; import cc.iotkit.model.UserInfo;
import cc.iotkit.model.system.SysUser;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Collection; import java.util.Collection;
@ -61,6 +65,15 @@ public class UserInfoDataCache implements IUserInfoData {
public UserInfo findById(Long s) { public UserInfo findById(Long s) {
return userInfoData.findById(s); return userInfoData.findById(s);
} }
@Override
public UserInfo findByUidAndUserName(String uid,String userName) {
return userInfoData.findByUidAndUserName(uid,userName);
}
@Override
public UserInfo findByUserName(String userName) {
return userInfoData.findByUserName(userName);
}
@Override @Override
public List<UserInfo> findByIds(Collection<Long> id) { public List<UserInfo> findByIds(Collection<Long> id) {
@ -103,6 +116,7 @@ public class UserInfoDataCache implements IUserInfoData {
@Override @Override
public Paging<UserInfo> findAll(PageRequest<UserInfo> pageRequest) { public Paging<UserInfo> findAll(PageRequest<UserInfo> pageRequest) {
return userInfoData.findAll(pageRequest); return userInfoData.findAll(pageRequest);
// return userInfoData.findAll(pageRequest);
} }
@Override @Override

@ -107,11 +107,38 @@
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
<exclusions>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>5.1.1</version>
<exclusions>
<exclusion>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>-->
<!-- <dependency>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId> <artifactId>poi</artifactId>
<version>5.2.3</version> <version>5.2.3</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>-->
</dependencies> </dependencies>

@ -1,7 +1,10 @@
package cc.iotkit.data.config; package cc.iotkit.data.config;
import cc.iotkit.common.redis.utils.RedisUtils;
import cc.iotkit.common.satoken.utils.LoginHelper; import cc.iotkit.common.satoken.utils.LoginHelper;
import cc.iotkit.common.tenant.helper.TenantHelper;
import cc.iotkit.common.utils.StringUtils; import cc.iotkit.common.utils.StringUtils;
import cn.hutool.core.util.ObjectUtil;
import com.querydsl.core.types.Predicate; import com.querydsl.core.types.Predicate;
import org.aspectj.lang.JoinPoint; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.ProceedingJoinPoint;
@ -30,6 +33,7 @@ import static cn.dev33.satoken.SaManager.log;
public class TenantAspect { public class TenantAspect {
@PersistenceContext @PersistenceContext
private EntityManager entityManager; private EntityManager entityManager;
/** /**
* request * request
* *
@ -70,23 +74,30 @@ public class TenantAspect {
}*/ }*/
@Around("execution(* org.springframework.data.jpa.repository.JpaRepository+.*(..)) || " + @Around("execution(* org.springframework.data.jpa.repository.JpaRepository+.*(..)) || " +
"execution(* org.springframework.data.repository.query.QueryByExampleExecutor+.*(..))") "execution(* org.springframework.data.repository.query.QueryByExampleExecutor+.*(..)) ||" +
"execution(* org.springframework.data.querydsl.QuerydslPredicateExecutor+.*(..))" )
public Object applyTenantFilter(ProceedingJoinPoint pjp) throws Throwable { public Object applyTenantFilter(ProceedingJoinPoint pjp) throws Throwable {
// System.out.println("111111111111Thread" + TenantContext.isFilterDisabled()); // System.out.println("111111111111Thread" + TenantHelper.getTenantId());
if(LoginHelper.isSuperAdmin()){ // System.out.println("222222222Thread" + LoginHelper.getTenantId());
// System.out.println("33333333333Thread" + TenantHelper.getDynamic());
try {
// System.out.println("进入切面了~~~~~~~~~~~" + LoginHelper.isSuperAdmin());
// System.out.println("进入切面了1~~~~~~~~~~~" + ObjectUtil.isNull(TenantHelper.getTenantId()));
if (LoginHelper.isSuperAdmin() && (ObjectUtil.isNull(TenantHelper.getTenantId()) || TenantHelper.getTenantId() == 0)) {
return pjp.proceed(); // 跳过租户过滤 return pjp.proceed(); // 跳过租户过滤
// TenantContext.disableTenantFilter(); // TenantContext.disableTenantFilter();
} }
if(TenantContext.isFilterDisabled()) { if (TenantContext.isFilterDisabled()) {
return pjp.proceed(); // 跳过租户过滤 return pjp.proceed(); // 跳过租户过滤
} }
//放开租户 //放开租户
Long tenantId= LoginHelper.getTenantId(); Long tenantId = TenantHelper.getTenantId();
// Long tenantId = 0L; // 实现租户ID获取逻辑 // Long tenantId = 0L; // 实现租户ID获取逻辑
if(ObjectUtils.isEmpty(tenantId)){ if (ObjectUtils.isEmpty(tenantId)) {
tenantId = 0L; return pjp.proceed(); // 跳过租户过滤
} }
try {
entityManager.unwrap(Session.class) entityManager.unwrap(Session.class)
.enableFilter("tenantFilter") .enableFilter("tenantFilter")
.setParameter("tenantId", tenantId); .setParameter("tenantId", tenantId);

@ -29,11 +29,14 @@ import com.querydsl.core.types.Predicate;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.querydsl.QuerydslPredicateExecutor; import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.data.repository.query.Param;
import java.util.List; import java.util.List;
public interface AlertConfigRepository extends JpaRepository<TbAlertConfig, Long>, QuerydslPredicateExecutor<TbAlertConfig> { public interface AlertConfigRepository extends JpaRepository<TbAlertConfig, Long>, QuerydslPredicateExecutor<TbAlertConfig> {
List<AlertConfig> findByUidAndRuleInfoId(String uid, String ruleInfoId); List<TbAlertConfig> findByUidAndRuleInfoId(String uid, String ruleInfoId);
List<TbAlertConfig> findByUidAndRuleInfoIdAndDeviceName(String uid, String ruleInfoId,String deviceName);
} }

@ -23,8 +23,10 @@
package cc.iotkit.data.dao; package cc.iotkit.data.dao;
import cc.iotkit.data.model.TbCategory; import cc.iotkit.data.model.TbCategory;
import cc.iotkit.data.model.TbDeviceInfo;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
public interface CategoryRepository extends JpaRepository<TbCategory, String> { public interface CategoryRepository extends JpaRepository<TbCategory, String>, QuerydslPredicateExecutor<TbCategory> {
} }

@ -36,4 +36,5 @@ public interface DeviceGroupMappingRepository extends JpaRepository<TbDeviceGrou
long countByGroupId(String groupId); long countByGroupId(String groupId);
} }

@ -0,0 +1,42 @@
/*
*
* * | Licensed OPENIITA
* * +----------------------------------------------------------------------
* * | Author: xw2sy@163.com
* * +----------------------------------------------------------------------
*
* Copyright [2024] [OPENIITA]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package cc.iotkit.data.dao;
import cc.iotkit.data.model.TbDeviceDetectorInfo;
import cc.iotkit.data.model.TbDeviceInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import java.util.List;
public interface DeviceIDetectornfoRepository extends JpaRepository<TbDeviceDetectorInfo, String>, QuerydslPredicateExecutor<TbDeviceDetectorInfo> {
/*TbDeviceInfo findByDeviceId(String deviceId);
List<TbDeviceInfo> findByParentId(String parentId);
TbDeviceInfo findByDeviceName(String deviceName);
long countByUid(String uid);
long countByUidAndState(String uid,String state);*/
}

@ -36,5 +36,7 @@ public interface DeviceInfoRepository extends JpaRepository<TbDeviceInfo, String
List<TbDeviceInfo> findByParentId(String parentId); List<TbDeviceInfo> findByParentId(String parentId);
TbDeviceInfo findByDeviceName(String deviceName); TbDeviceInfo findByDeviceName(String deviceName);
List<TbDeviceInfo> findByDeptAreaIdAndProductKey(Long deptAreaId,String productKey);
long countByUid(String uid); long countByUid(String uid);
long countByUidAndState(String uid,String state);
} }

@ -0,0 +1,45 @@
/*
*
* * | Licensed OPENIITA
* * +----------------------------------------------------------------------
* * | Author: xw2sy@163.com
* * +----------------------------------------------------------------------
*
* Copyright [2024] [OPENIITA]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package cc.iotkit.data.dao;
import cc.iotkit.data.model.TbDeviceDetectorInfo;
import cc.iotkit.data.model.TbDeviceInfo;
import cc.iotkit.data.model.TbDeviceInstallInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
public interface DeviceInstallInfoRepository extends JpaRepository<TbDeviceInstallInfo, String>, QuerydslPredicateExecutor<TbDeviceInstallInfo> {
/*TbDeviceInfo findByDeviceId(String deviceId);
List<TbDeviceInfo> findByParentId(String parentId);
TbDeviceInfo findByDeviceName(String deviceName);
long countByUid(String uid);
long countByUidAndState(String uid,String state);*/
TbDeviceInstallInfo findByDeviceNameAndUid(String deviceName,String uid);
TbDeviceInstallInfo findByDeviceNameAndUidAndState(String deviceName,String uid,Integer state);
}

@ -23,11 +23,13 @@
package cc.iotkit.data.dao; package cc.iotkit.data.dao;
import cc.iotkit.data.model.TbDIccidRecordDO; import cc.iotkit.data.model.TbDIccidRecordDO;
import cc.iotkit.data.model.TbWorderDO;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import java.util.List; import java.util.List;
public interface DiccidRecordRepository extends JpaRepository<TbDIccidRecordDO, Long> { public interface DiccidRecordRepository extends JpaRepository<TbDIccidRecordDO, Long>, QuerydslPredicateExecutor<TbDIccidRecordDO> {
@ -36,5 +38,5 @@ public interface DiccidRecordRepository extends JpaRepository<TbDIccidRecordDO,
long count(); long count();
List<TbDIccidRecordDO> findAll(); List<TbDIccidRecordDO> findAll();
TbDIccidRecordDO findByImei(String imei);
} }

@ -22,14 +22,16 @@
*/ */
package cc.iotkit.data.dao; package cc.iotkit.data.dao;
import cc.iotkit.data.model.TbDeviceDetectorInfo;
import cc.iotkit.data.model.TbRuleInfo; import cc.iotkit.data.model.TbRuleInfo;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import java.util.List; import java.util.List;
public interface RuleInfoRepository extends JpaRepository<TbRuleInfo, String> { public interface RuleInfoRepository extends JpaRepository<TbRuleInfo, String>, QuerydslPredicateExecutor<TbRuleInfo> {
List<TbRuleInfo> findByUid(String uid); List<TbRuleInfo> findByUid(String uid);

@ -30,5 +30,6 @@ import java.util.Optional;
public interface SysConfigRepository extends JpaRepository<TbSysConfig, Long>, QuerydslPredicateExecutor<TbSysConfig> { public interface SysConfigRepository extends JpaRepository<TbSysConfig, Long>, QuerydslPredicateExecutor<TbSysConfig> {
Optional<TbSysConfig> findByConfigKeyAndTenantId(String configKey, Long tenantId);
Optional<TbSysConfig> findByConfigKey(String configKey); Optional<TbSysConfig> findByConfigKey(String configKey);
} }

@ -26,6 +26,8 @@ import cc.iotkit.data.model.TbSysDept;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor; import org.springframework.data.querydsl.QuerydslPredicateExecutor;
public interface SysDeptRepository extends JpaRepository<TbSysDept, Long>, QuerydslPredicateExecutor<TbSysDept> { import java.util.List;
public interface SysDeptRepository extends JpaRepository<TbSysDept, Long>, QuerydslPredicateExecutor<TbSysDept> {
List<TbSysDept> findByTenantId(Long tenantId);
} }

@ -26,6 +26,8 @@ import cc.iotkit.data.model.TbSysUser;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor; import org.springframework.data.querydsl.QuerydslPredicateExecutor;
public interface SysUserRepository extends JpaRepository<TbSysUser, Long>, QuerydslPredicateExecutor<TbSysUser> { import java.util.List;
public interface SysUserRepository extends JpaRepository<TbSysUser, Long>, QuerydslPredicateExecutor<TbSysUser> {
List<TbSysUser> findByTenantId(Long tenantId);
} }

@ -22,14 +22,18 @@
*/ */
package cc.iotkit.data.dao; package cc.iotkit.data.dao;
import cc.iotkit.data.model.TbSysDept;
import cc.iotkit.data.model.TbUserInfo; import cc.iotkit.data.model.TbUserInfo;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import java.util.List; import java.util.List;
public interface UserInfoRepository extends JpaRepository<TbUserInfo, String> { public interface UserInfoRepository extends JpaRepository<TbUserInfo, String>, QuerydslPredicateExecutor<TbUserInfo> {
TbUserInfo findByUid(String uid); TbUserInfo findByUid(String uid);
TbUserInfo findByUidAndUserName(String uid,String userName);
TbUserInfo findByUserName(String userName);
List<TbUserInfo> findByType(int type); List<TbUserInfo> findByType(int type);

@ -105,4 +105,6 @@ public class TbAlertConfig extends BaseEntity implements TenantAware {
* 012,, * 012,,
*/ */
private String messagePush; private String messagePush;
private String messagePushIpone;
private String deviceName;
} }

@ -89,4 +89,6 @@ public class TbAlertRecord extends BaseEntity implements TenantAware {
private Boolean readFlg; private Boolean readFlg;
private Long tenantId; private Long tenantId;
private Long deptAreaId;
} }

@ -0,0 +1,77 @@
/*
*
* * | Licensed OPENIITA
* * +----------------------------------------------------------------------
* * | Author: xw2sy@163.com
* * +----------------------------------------------------------------------
*
* Copyright [2024] [OPENIITA]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package cc.iotkit.data.model;
import cc.iotkit.common.tenant.dao.TenantAware;
import cc.iotkit.common.tenant.listener.TenantListener;
import cc.iotkit.model.device.DeviceDetectorInfo;
import cc.iotkit.model.device.DeviceInfo;
import io.github.linpeilie.annotations.AutoMapper;
import io.github.linpeilie.annotations.AutoMapping;
import io.github.linpeilie.annotations.ReverseAutoMapping;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.annotations.Filter;
import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.ParamDef;
import javax.persistence.*;
@Data
@Entity
@Table(name = "device_detector_info")
@ApiModel(value = "设备浓度信息")
@AutoMapper(target = DeviceDetectorInfo.class)
@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "long")})
@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
@EntityListeners(TenantListener.class)
public class TbDeviceDetectorInfo extends BaseEntity implements TenantAware {
@Id
@GeneratedValue(generator = "SnowflakeIdGenerator")
@GenericGenerator(name = "SnowflakeIdGenerator", strategy = "cc.iotkit.data.config.id.SnowflakeIdGenerator")
private String id;
@ApiModelProperty(value = "设备id")
private String deviceId;
@ApiModelProperty(value = "产品key")
private String productKey;
@ApiModelProperty(value = "设备名称")
private String deviceName;
@ApiModelProperty(value = "用户id")
private String uid;
@ApiModelProperty(value = "创建时间")
private Long createAt;
/**
*
*/
@ApiModelProperty(value = "租户编号")
private Long tenantId;
private String node;
private String gasTypeKey;
private String dataDetectorValue;
}

@ -104,4 +104,22 @@ public class TbDeviceInfo extends BaseEntity implements TenantAware {
@ApiModelProperty(value = "区域id") @ApiModelProperty(value = "区域id")
private Long deptAreaId; private Long deptAreaId;
private String name; private String name;
private String signalStrength;
private String deviceVersion;
private Integer deviceStatus;
private String nodeOne;
private String nodeTwo;
private String nodeThree;
private String nodeFour;
private String nodeFive;
private String nodeOneStatus;
private String nodeTwoStatus;
private String nodeThreeStatus;
private String nodeFourStatus;
private String nodeFiveStatus;
private String nodeOneDevice;
private String nodeTwoDevice;
private String nodeThreeDevice;
private String nodeFourDevice;
private String nodeFiveDevice;
} }

@ -0,0 +1,108 @@
/*
*
* * | Licensed OPENIITA
* * +----------------------------------------------------------------------
* * | Author: xw2sy@163.com
* * +----------------------------------------------------------------------
*
* Copyright [2024] [OPENIITA]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package cc.iotkit.data.model;
import cc.iotkit.common.tenant.dao.TenantAware;
import cc.iotkit.common.tenant.listener.TenantListener;
import cc.iotkit.model.device.DeviceDetectorInfo;
import cc.iotkit.model.device.DeviceInstallInfo;
import io.github.linpeilie.annotations.AutoMapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.annotations.Filter;
import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.ParamDef;
import javax.persistence.*;
import java.util.Date;
@Data
@Entity
@Table(name = "device_install_info")
@ApiModel(value = "设备安装信息")
@AutoMapper(target = DeviceInstallInfo.class)
@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "long")})
@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
@EntityListeners(TenantListener.class)
public class TbDeviceInstallInfo extends BaseEntity implements TenantAware {
@Id
@GeneratedValue(generator = "SnowflakeIdGenerator")
@GenericGenerator(name = "SnowflakeIdGenerator", strategy = "cc.iotkit.data.config.id.SnowflakeIdGenerator")
private String id;
@ApiModelProperty(value = "设备名称(报警器编号)")
private String deviceName;
@ApiModelProperty(value = "公司名称")
private String corporateName;
@ApiModelProperty(value = "申请时间")
private Date proposerTime;
@ApiModelProperty(value = "申请人")
private String proposer;
@ApiModelProperty(value = "申请班组")
private String proposerTeam;
@ApiModelProperty(value = "小区名称")
private String communityName;
@ApiModelProperty(value = "用户名称")
private String userName;
@ApiModelProperty(value = "用户电话")
private String userIpone;
@ApiModelProperty(value = "楼栋单元号")
private String buildingUnit;
@ApiModelProperty(value = "房间号")
private String roomNo;
@ApiModelProperty(value = "切断阀编号")
private String shutValueNumber;
@ApiModelProperty(value = "燃气表号")
private String gasMeterNumber;
@ApiModelProperty(value = "备注")
private String remarks;
@ApiModelProperty(value = "安装前图片")
private String beforeInstallationImage;
@ApiModelProperty(value = "装完成探测器工作图片")
private String workingOfTheDetectorImage;
@ApiModelProperty(value = "测漏图片")
private String sideLeakageImage;
@ApiModelProperty(value = "点火图片")
private String ignitionPictureImage;
@ApiModelProperty(value = "装完成全景图片")
private String installThePanoramicImage;
@ApiModelProperty(value = "燃气表图片")
private String ofGasMeterImage;
@ApiModelProperty(value = "工单图片")
private String workOrderImage;
@ApiModelProperty(value = "打孔图片")
private String punchingImage;
@ApiModelProperty(value = "装电源线照片")
private String fiexImage;
@ApiModelProperty(value = "用户id")
private String uid;
@ApiModelProperty(value = "租户编号")
private Long tenantId;
@ApiModelProperty(value = "0绑定1解绑")
private Integer state;
}

@ -93,4 +93,5 @@ public class TbRuleInfo extends BaseEntity implements TenantAware {
private Long createAt; private Long createAt;
private Long tenantId; private Long tenantId;
} }

@ -70,7 +70,6 @@ public class TbSysDept extends BaseEntity implements TenantAware {
* *
*/ */
@ApiModelProperty(value = "租户ID") @ApiModelProperty(value = "租户ID")
@Column(name = "tenant_id")
private Long tenantId; private Long tenantId;
/** /**
@ -128,5 +127,7 @@ public class TbSysDept extends BaseEntity implements TenantAware {
private String ancestors; private String ancestors;
@ApiModelProperty(value = "0部门1区域") @ApiModelProperty(value = "0部门1区域")
private Integer areaType; private Integer areaType;
private String latitude;
private String longitude;
private String site;
} }

@ -38,6 +38,7 @@ import cc.iotkit.model.alert.AlertConfig;
import cc.iotkit.model.system.SysDictData; import cc.iotkit.model.system.SysDictData;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.querydsl.core.types.Predicate; import com.querydsl.core.types.Predicate;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
@ -57,7 +58,8 @@ public class AlertConfigDataImpl implements IAlertConfigData, IJPACommData<Alert
@Autowired @Autowired
private AlertConfigRepository alertConfigRepository; private AlertConfigRepository alertConfigRepository;
@Autowired
private JPAQueryFactory jpaQueryFactory;
@Override @Override
public JpaRepository getBaseRepository() { public JpaRepository getBaseRepository() {
return alertConfigRepository; return alertConfigRepository;
@ -82,9 +84,15 @@ public class AlertConfigDataImpl implements IAlertConfigData, IJPACommData<Alert
} }
@Override @Override
public List<AlertConfig> findByUidAndRuleInfoId(String uid, String ruleInfoId) { public List<AlertConfig> findByUidAndRuleInfoId(String uid, String ruleInfoId) {
return alertConfigRepository.findByUidAndRuleInfoId(uid, ruleInfoId); return MapstructUtils.convert(alertConfigRepository.findByUidAndRuleInfoId(uid, ruleInfoId), AlertConfig.class);
// return new Paging<>(alertConfigPage.getTotalElements(), MapstructUtils.convert(alertConfigPage.getContent(), AlertConfig.class));
}
@Override
public List<AlertConfig> findByUidAndRuleInfoIdAndDeviceName(String uid, String ruleInfoId, String deviceName) {
return MapstructUtils.convert(alertConfigRepository.findByUidAndRuleInfoIdAndDeviceName(uid, ruleInfoId,deviceName), AlertConfig.class);
// return new Paging<>(alertConfigPage.getTotalElements(), MapstructUtils.convert(alertConfigPage.getContent(), AlertConfig.class)); // return new Paging<>(alertConfigPage.getTotalElements(), MapstructUtils.convert(alertConfigPage.getContent(), AlertConfig.class));
} }
private Predicate buildQueryCondition(AlertConfig dictData) { private Predicate buildQueryCondition(AlertConfig dictData) {
return PredicateBuilder.instance() return PredicateBuilder.instance()
.and(dictData.getUid() != null, () -> tbAlertConfig.uid.eq(AuthUtil.getUserId())).build(); .and(dictData.getUid() != null, () -> tbAlertConfig.uid.eq(AuthUtil.getUserId())).build();

@ -27,6 +27,7 @@ import cc.iotkit.common.api.PageRequest;
import cc.iotkit.common.api.Paging; import cc.iotkit.common.api.Paging;
import cc.iotkit.common.satoken.utils.AuthUtil; import cc.iotkit.common.satoken.utils.AuthUtil;
import cc.iotkit.common.satoken.utils.LoginHelper; import cc.iotkit.common.satoken.utils.LoginHelper;
import cc.iotkit.common.tenant.helper.TenantHelper;
import cc.iotkit.common.utils.MapstructUtils; import cc.iotkit.common.utils.MapstructUtils;
import cc.iotkit.common.utils.StringUtils; import cc.iotkit.common.utils.StringUtils;
import cc.iotkit.data.dao.AlertRecordRepository; import cc.iotkit.data.dao.AlertRecordRepository;
@ -57,6 +58,7 @@ import org.springframework.stereotype.Service;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.List; import java.util.List;
@ -95,30 +97,62 @@ public class AlertRecordDataImpl implements IAlertRecordData, IJPACommData<Alert
if(ObjectUtils.isNotEmpty(data.getParams()) && !"".equals(data.getParams().get("endTime"))){ if(ObjectUtils.isNotEmpty(data.getParams()) && !"".equals(data.getParams().get("endTime"))){
flag = true; flag = true;
} }
if(!LoginHelper.isSuperAdmin()){ if(!data.getStatusFlg()) {
if (!LoginHelper.isSuperAdmin() && ObjectUtil.isNotNull(LoginHelper.getUserId())) {
String uid = AuthUtil.getUserId(); String uid = AuthUtil.getUserId();
data.setUid(uid); data.setUid(uid);
} }
}
if(ObjectUtils.isNotEmpty(data)) { if(ObjectUtils.isNotEmpty(data)) {
if(!LoginHelper.isSuperAdmin()) {
return PredicateBuilder.instance() return PredicateBuilder.instance()
.and(StringUtils.isNotBlank(data.getName()), () -> tbAlertRecord.name.like(data.getName())) .and(StringUtils.isNotBlank(data.getName()), () -> tbAlertRecord.name.like("%" + data.getName() + "%"))
.and(StringUtils.isNotBlank(data.getLevel()), () -> tbAlertRecord.level.eq(data.getLevel())) .and(StringUtils.isNotBlank(data.getLevel()), () -> tbAlertRecord.level.eq(data.getLevel()))
.and(StringUtils.isNotBlank(data.getUid()), () -> tbAlertRecord.uid.eq(data.getUid())) .and(StringUtils.isNotBlank(data.getUid()), () -> tbAlertRecord.uid.eq(data.getUid()))
.and(ObjectUtil.isNotEmpty(TenantHelper.getTenantId()), () -> tbAlertRecord.tenantId.eq(TenantHelper.getTenantId()))
.and(flag, () -> (BooleanExpression) genTimePredicate(data.getParams())) .and(flag, () -> (BooleanExpression) genTimePredicate(data.getParams()))
.build(); .build();
}else{
if(TenantHelper.getTenantId() != 0) {
return PredicateBuilder.instance()
.and(StringUtils.isNotBlank(data.getName()), () -> tbAlertRecord.name.like("%" + data.getName() + "%"))
.and(StringUtils.isNotBlank(data.getLevel()), () -> tbAlertRecord.level.eq(data.getLevel()))
.and(StringUtils.isNotBlank(data.getUid()), () -> tbAlertRecord.uid.eq(data.getUid()))
.and(ObjectUtil.isNotEmpty(TenantHelper.getTenantId()), () -> tbAlertRecord.tenantId.eq(TenantHelper.getTenantId()))
.and(flag, () -> (BooleanExpression) genTimePredicate(data.getParams()))
.build();
}else{
return PredicateBuilder.instance()
.and(StringUtils.isNotBlank(data.getName()), () -> tbAlertRecord.name.like("%" + data.getName() + "%"))
.and(StringUtils.isNotBlank(data.getLevel()), () -> tbAlertRecord.level.eq(data.getLevel()))
.and(StringUtils.isNotBlank(data.getUid()), () -> tbAlertRecord.uid.eq(data.getUid()))
// .and(ObjectUtil.isNotEmpty(TenantHelper.getTenantId()), () -> tbAlertRecord.tenantId.eq(TenantHelper.getTenantId()))
.and(flag, () -> (BooleanExpression) genTimePredicate(data.getParams()))
.build();
}
}
}else{ }else{
if(!LoginHelper.isSuperAdmin()){ if(!LoginHelper.isSuperAdmin()){
return PredicateBuilder.instance() return PredicateBuilder.instance()
.and(StringUtils.isNotBlank(data.getUid()), () -> tbAlertRecord.uid.eq(data.getUid())) .and(StringUtils.isNotBlank(data.getUid()), () -> tbAlertRecord.uid.eq(data.getUid()))
.and(ObjectUtil.isNotEmpty(TenantHelper.getTenantId()), () -> tbAlertRecord.tenantId.eq(TenantHelper.getTenantId()))
//.and(data != null && StringUtils.isNotBlank(data.getLevel()), () -> tbAlertRecord.level.eq(data.getLevel())) //.and(data != null && StringUtils.isNotBlank(data.getLevel()), () -> tbAlertRecord.level.eq(data.getLevel()))
.build(); .build();
} }else {
if(TenantHelper.getTenantId() != 0) {
return PredicateBuilder.instance()
.and(ObjectUtil.isNotEmpty(TenantHelper.getTenantId()), () -> tbAlertRecord.tenantId.eq(TenantHelper.getTenantId()))
//.and(data != null && StringUtils.isNotBlank(data.getLevel()), () -> tbAlertRecord.level.eq(data.getLevel()))
.build();
}else{
return PredicateBuilder.instance() return PredicateBuilder.instance()
// .and(ObjectUtil.isNotEmpty(TenantHelper.getTenantId()), () -> tbAlertRecord.tenantId.eq(TenantHelper.getTenantId()))
//.and(data != null && StringUtils.isNotBlank(data.getLevel()), () -> tbAlertRecord.level.eq(data.getLevel())) //.and(data != null && StringUtils.isNotBlank(data.getLevel()), () -> tbAlertRecord.level.eq(data.getLevel()))
.build(); .build();
} }
} }
}
}
@Override @Override
public Paging<AlertRecord> selectAlertConfigPage(PageRequest<AlertRecord> request) { public Paging<AlertRecord> selectAlertConfigPage(PageRequest<AlertRecord> request) {
@ -138,7 +172,7 @@ public class AlertRecordDataImpl implements IAlertRecordData, IJPACommData<Alert
} }
private static Predicate genTimePredicate(Map params) { private static Predicate genTimePredicate(Map params) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); /* DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate beginDate = LocalDate.parse(params.get("beginTime").toString(), formatter); LocalDate beginDate = LocalDate.parse(params.get("beginTime").toString(), formatter);
LocalDate endDate = LocalDate.parse(params.get("endTime").toString(), formatter); LocalDate endDate = LocalDate.parse(params.get("endTime").toString(), formatter);
@ -146,10 +180,21 @@ public class AlertRecordDataImpl implements IAlertRecordData, IJPACommData<Alert
.toEpochSecond() * 1000; .toEpochSecond() * 1000;
long endSec = endDate.atTime(23, 59, 59) long endSec = endDate.atTime(23, 59, 59)
.atZone(ZoneId.systemDefault()) .atZone(ZoneId.systemDefault())
.toEpochSecond()* 1000; .toEpochSecond()* 1000;*/
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 假设params是Map<String, Object>
String beginTime = params.get("beginTime").toString();
String endTime = params.get("endTime").toString();
LocalDateTime beginDateTime = LocalDateTime.parse(beginTime, formatter);
LocalDateTime endDateTime = LocalDateTime.parse(endTime, formatter);
long beginMillis = beginDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
long endMillis = endDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
/*return PredicateBuilder.instance() /*return PredicateBuilder.instance()
.and(tbAlertRecord.alertTime.between(beginSec, endSec));*/ .and(tbAlertRecord.alertTime.between(beginSec, endSec));*/
return tbAlertRecord.alertTime.between(beginSec, endSec); return tbAlertRecord.alertTime.between(beginMillis, endMillis);
} }
@Override @Override
@ -181,6 +226,8 @@ public class AlertRecordDataImpl implements IAlertRecordData, IJPACommData<Alert
) )
.fetch(); .fetch();
} }
@Override @Override
public long countByUid(String uid) { public long countByUid(String uid) {

@ -35,6 +35,7 @@ import org.springframework.stereotype.Service;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -90,6 +91,7 @@ public class CategoryDataImpl implements ICategoryData, IJPACommData<Category, S
public List<Category> findAll() { public List<Category> findAll() {
return categoryRepository.findAll().stream() return categoryRepository.findAll().stream()
.map(c -> MapstructUtils.convert(c, Category.class)) .map(c -> MapstructUtils.convert(c, Category.class))
.sorted(Comparator.comparing(Category::getCreateTime).reversed())
.collect(Collectors.toList()); .collect(Collectors.toList());
} }

@ -31,8 +31,10 @@ import cc.iotkit.data.dao.IJPACommData;
import cc.iotkit.data.manager.IDIccidRecordData; import cc.iotkit.data.manager.IDIccidRecordData;
import cc.iotkit.data.manager.IHomeData; import cc.iotkit.data.manager.IHomeData;
import cc.iotkit.data.model.TbDIccidRecordDO; import cc.iotkit.data.model.TbDIccidRecordDO;
import cc.iotkit.data.model.TbDeviceInfo;
import cc.iotkit.data.model.TbHome; import cc.iotkit.data.model.TbHome;
import cc.iotkit.data.util.PredicateBuilder; import cc.iotkit.data.util.PredicateBuilder;
import cc.iotkit.model.device.DeviceInfo;
import cc.iotkit.model.iccid.DIccidRecordDO; import cc.iotkit.model.iccid.DIccidRecordDO;
import cc.iotkit.model.space.Home; import cc.iotkit.model.space.Home;
import com.querydsl.jpa.impl.JPAQueryFactory; import com.querydsl.jpa.impl.JPAQueryFactory;
@ -73,6 +75,10 @@ public class DIccidRecordDataImpl implements IDIccidRecordData, IJPACommData<DIc
} }
@Override
public DIccidRecordDO findByImei(String Imei) {
TbDIccidRecordDO tbDIccidRecordDO = homeRepository.findByImei(Imei);
DIccidRecordDO dto = MapstructUtils.convert(tbDIccidRecordDO, DIccidRecordDO.class);
return dto;
}
} }

@ -0,0 +1,64 @@
/*
*
* * | Licensed OPENIITA
* * +----------------------------------------------------------------------
* * | Author: xw2sy@163.com
* * +----------------------------------------------------------------------
*
* Copyright [2024] [OPENIITA]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package cc.iotkit.data.service;
import cc.iotkit.data.dao.DeviceIDetectornfoRepository;
import cc.iotkit.data.dao.IJPACommData;
import cc.iotkit.data.manager.IDeviceDetectorInfoData;
import cc.iotkit.data.model.TbDeviceDetectorInfo;
import cc.iotkit.model.device.DeviceDetectorInfo;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;
@Primary
@Service
@RequiredArgsConstructor
public class DeviceDetectorInfoDataImpl implements IDeviceDetectorInfoData, IJPACommData<DeviceDetectorInfo,String> {
@Autowired
private DeviceIDetectornfoRepository homeRepository;
private final JPAQueryFactory jpaQueryFactory;
@Override
public JpaRepository getBaseRepository() {
return homeRepository;
}
@Override
public Class getJpaRepositoryClass() {
return TbDeviceDetectorInfo.class;
}
@Override
public Class getTClass() {
return DeviceDetectorInfo.class;
}
}

@ -25,7 +25,9 @@ package cc.iotkit.data.service;
import cc.iotkit.common.api.PageRequest; import cc.iotkit.common.api.PageRequest;
import cc.iotkit.common.api.Paging; import cc.iotkit.common.api.Paging;
import cc.iotkit.common.enums.UserType;
import cc.iotkit.common.satoken.utils.LoginHelper; import cc.iotkit.common.satoken.utils.LoginHelper;
import cc.iotkit.common.tenant.helper.TenantHelper;
import cc.iotkit.common.utils.MapstructUtils; import cc.iotkit.common.utils.MapstructUtils;
import cc.iotkit.common.utils.ReflectUtil; import cc.iotkit.common.utils.ReflectUtil;
import cc.iotkit.common.utils.StreamUtils; import cc.iotkit.common.utils.StreamUtils;
@ -35,6 +37,8 @@ import cc.iotkit.data.manager.IDeviceInfoData;
import cc.iotkit.data.manager.IProductData; import cc.iotkit.data.manager.IProductData;
import cc.iotkit.data.model.*; import cc.iotkit.data.model.*;
import cc.iotkit.data.system.ISysDeptData; import cc.iotkit.data.system.ISysDeptData;
import cc.iotkit.data.system.ISysTenantData;
import cc.iotkit.data.system.ISysUserData;
import cc.iotkit.data.util.PageBuilder; import cc.iotkit.data.util.PageBuilder;
import cc.iotkit.data.util.PredicateBuilder; import cc.iotkit.data.util.PredicateBuilder;
import cc.iotkit.model.alert.AlertRecord; import cc.iotkit.model.alert.AlertRecord;
@ -42,12 +46,12 @@ import cc.iotkit.model.device.DeviceInfo;
import cc.iotkit.model.device.message.DevicePropertyCache; import cc.iotkit.model.device.message.DevicePropertyCache;
import cc.iotkit.model.product.Category; import cc.iotkit.model.product.Category;
import cc.iotkit.model.product.Product; import cc.iotkit.model.product.Product;
import cc.iotkit.model.stats.AlertStatDTO; import cc.iotkit.model.stats.*;
import cc.iotkit.model.stats.DataItem;
import cc.iotkit.model.stats.DeviceProduckDTO;
import cc.iotkit.model.stats.ProductKeyCountDTO;
import cc.iotkit.model.system.SysDept; import cc.iotkit.model.system.SysDept;
import cc.iotkit.model.system.SysTenant;
import cc.iotkit.model.system.SysUser;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.querydsl.core.Tuple;
import com.querydsl.core.types.Predicate; import com.querydsl.core.types.Predicate;
import com.querydsl.core.types.Projections; import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.BooleanExpression;
@ -57,6 +61,7 @@ import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
@ -77,6 +82,7 @@ import static cc.iotkit.data.model.QTbDeviceGroupMapping.tbDeviceGroupMapping;
import static cc.iotkit.data.model.QTbDeviceInfo.tbDeviceInfo; import static cc.iotkit.data.model.QTbDeviceInfo.tbDeviceInfo;
import static cc.iotkit.data.model.QTbDeviceSubUser.tbDeviceSubUser; import static cc.iotkit.data.model.QTbDeviceSubUser.tbDeviceSubUser;
import static cc.iotkit.data.model.QTbProduct.tbProduct; import static cc.iotkit.data.model.QTbProduct.tbProduct;
import static cc.iotkit.data.model.QTbSysTenant.tbSysTenant;
import static cc.iotkit.data.model.QTbSysUser.tbSysUser; import static cc.iotkit.data.model.QTbSysUser.tbSysUser;
@Primary @Primary
@ -84,7 +90,9 @@ import static cc.iotkit.data.model.QTbSysUser.tbSysUser;
@RequiredArgsConstructor @RequiredArgsConstructor
public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceInfo, String> { public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceInfo, String> {
private final ISysUserData isSysUserData;
private final ISysDeptData sysDeptData; private final ISysDeptData sysDeptData;
private final ISysTenantData isSysTenantData;
private final DeviceInfoRepository deviceInfoRepository; private final DeviceInfoRepository deviceInfoRepository;
private final DeviceSubUserRepository deviceSubUserRepository; private final DeviceSubUserRepository deviceSubUserRepository;
@ -127,6 +135,101 @@ public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceI
return new HashMap<>(); return new HashMap<>();
} }
public SysDeptDto getStatsCount(Long deptAreaId){
SysDeptDto statistics = new SysDeptDto();
List<Long> areaIds = null;
List<Tuple> results = null;
if (ObjectUtil.isNotNull(deptAreaId)) {
// if (Objects.nonNull(user) && Objects.nonNull(user.getDeptAreaId())) {
Long areaId = deptAreaId;
List<SysDept> depts = sysDeptData.findByDeptId(areaId);
areaIds = StreamUtils.toList(depts, SysDept::getId);
areaIds.add(areaId);
/* if (ObjectUtil.isNotEmpty(areaIds)) {
query.where(tbDeviceInfo.deptAreaId.in(areaIds));
}*/
}else{
if(!LoginHelper.isSuperAdmin()) {
SysUser user = isSysUserData.findById(LoginHelper.getUserId());
if (ObjectUtil.isNotNull(user)) {
if(ObjectUtil.isNotNull(user.getDeptAreaId())) {
// if (Objects.nonNull(user) && Objects.nonNull(user.getDeptAreaId())) {
Long areaId = user.getDeptAreaId();
List<SysDept> depts = sysDeptData.findByDeptId(areaId);
areaIds = StreamUtils.toList(depts, SysDept::getId);
areaIds.add(areaId);
}
/* if (ObjectUtil.isNotEmpty(areaIds)) {
query.where(tbDeviceInfo.deptAreaId.in(areaIds));
}
}else{
//没有绑定区域查不到设备
query.where(tbDeviceInfo.id.eq("0"));
}*/
}
}
}
//JPAQuery<TbDeviceInfo> query = jpaQueryFactory.selectFrom(tbDeviceInfo);
if(ObjectUtil.isNotEmpty(areaIds)) {
results = jpaQueryFactory
.select(
tbDeviceInfo.deviceStatus,
tbDeviceInfo.count()
)
.from(tbDeviceInfo)
.where(tbDeviceInfo.deptAreaId.in(areaIds))
.groupBy(tbDeviceInfo.deviceStatus)
.fetch();
}else{
if(LoginHelper.isSuperAdmin()) {
results = jpaQueryFactory
.select(
tbDeviceInfo.deviceStatus,
tbDeviceInfo.count()
)
.from(tbDeviceInfo)
// .where(tbDeviceInfo.deptAreaId.in(areaIds))
.groupBy(tbDeviceInfo.deviceStatus)
.fetch();
}
}
for (Tuple tuple : results) {
Integer status = ObjectUtil.isNotNull(tuple.get(tbDeviceInfo.deviceStatus)) ?tuple.get(tbDeviceInfo.deviceStatus) :0;
Long count = tuple.get(tbDeviceInfo.count());
switch (status) {
case 0:
statistics.setNormalCount(count);
//设备状态0:正常
break;
case 1:
statistics.setFaultCount( count);
//设备状态1:故障
break;
case 2:
statistics.setAlarmCount( count);
//设备状态2:告警
break;
case 3:
statistics.setOnlineCount( count);
//设备状态3:离线
break;
case 4:
statistics.setExpireCount( count);
//设备状态:到期
break;
default:
break;
}
System.out.println(status + ": " + count);
}
return statistics;
};
@Override @Override
public long getPropertyUpdateTime(String deviceId) { public long getPropertyUpdateTime(String deviceId) {
return 0; return 0;
@ -182,12 +285,59 @@ public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceI
tagMap.put(tag.getCode(), new DeviceInfo.Tag(tag.getCode(), tag.getName(), tag.getValue())); tagMap.put(tag.getCode(), new DeviceInfo.Tag(tag.getCode(), tag.getName(), tag.getValue()));
} }
dto.setTag(tagMap); dto.setTag(tagMap);
if (ObjectUtil.isNotNull(vo.getTenantId())) {
SysTenant sysTenant = new SysTenant();
sysTenant.setTenantId(vo.getTenantId());
SysTenant sysTenant1 = isSysTenantData.findOneByCondition(sysTenant);
if (sysTenant1 != null) {
dto.setTenantName(sysTenant1.getCompanyName());
}
}
//将设备状态从vo转为dto的 //将设备状态从vo转为dto的
parseStateToDto(vo, dto); parseStateToDto(vo, dto);
return dto; return dto;
} }
private DeviceInfo fillDeviceInfo1(String deviceId, TbDeviceInfo vo, DeviceInfo dto) {
if (vo == null || dto == null) {
return null;
}
//取子关联用户
/* dto.setSubUid(deviceSubUserRepository.findByDeviceId(deviceId).stream()
.map(TbDeviceSubUser::getUid).collect(Collectors.toList()));
//取设备所属分组
List<TbDeviceGroupMapping> groupMappings = deviceGroupMappingRepository.findByDeviceId(deviceId);
Map<String, DeviceInfo.Group> groups = new HashMap<>();
for (TbDeviceGroupMapping mapping : groupMappings) {
TbDeviceGroup deviceGroup = deviceGroupRepository.findById(mapping.getGroupId()).orElse(null);
if (deviceGroup == null) {
continue;
}
groups.put(deviceGroup.getId(), new DeviceInfo.Group(deviceGroup.getId(), deviceGroup.getName()));
}
dto.setGroup(groups);
//取设备标签
List<TbDeviceTag> deviceTags = deviceTagRepository.findByDeviceId(deviceId);
Map<String, DeviceInfo.Tag> tagMap = new HashMap<>();
for (TbDeviceTag tag : deviceTags) {
tagMap.put(tag.getCode(), new DeviceInfo.Tag(tag.getCode(), tag.getName(), tag.getValue()));
}
dto.setTag(tagMap);
if (ObjectUtil.isNotNull(vo.getTenantId())) {
SysTenant sysTenant = new SysTenant();
sysTenant.setTenantId(vo.getTenantId());
SysTenant sysTenant1 = isSysTenantData.findOneByCondition(sysTenant);
if (sysTenant1 != null) {
dto.setTenantName(sysTenant1.getCompanyName());
}
}*/
//将设备状态从vo转为dto的
parseStateToDto(vo, dto);
return dto;
}
/** /**
* vodto * vodto
*/ */
@ -240,6 +390,10 @@ public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceI
public DeviceInfo findByDeviceName(String deviceName) { public DeviceInfo findByDeviceName(String deviceName) {
return parseVoToDto(deviceInfoRepository.findByDeviceName(deviceName)); return parseVoToDto(deviceInfoRepository.findByDeviceName(deviceName));
} }
@Override
public List<DeviceInfo> findByDeptAreaIdAndProductKey(Long deptAreaId, String productKey) {
return parseVoToDto(deviceInfoRepository.findByDeptAreaIdAndProductKey(deptAreaId, productKey));
}
@Override @Override
public List<DeviceInfo> findByParentId(String parentId) { public List<DeviceInfo> findByParentId(String parentId) {
@ -268,13 +422,21 @@ public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceI
public List<DeviceInfo> findNeverUsedDevices() { public List<DeviceInfo> findNeverUsedDevices() {
JPAQuery<TbDeviceInfo> query = jpaQueryFactory.selectFrom(tbDeviceInfo); JPAQuery<TbDeviceInfo> query = jpaQueryFactory.selectFrom(tbDeviceInfo);
query.where(tbDeviceInfo.onlineTime.isNull()); query.where(tbDeviceInfo.onlineTime.isNull());
if(ObjectUtil.isNotNull(TenantHelper.getTenantId())) {
if (!LoginHelper.isSuperAdmin()) {
query.where(tbDeviceInfo.tenantId.eq(TenantHelper.getTenantId()));
} else if (LoginHelper.isSuperAdmin() && TenantHelper.getTenantId() != 0) {
query.where(tbDeviceInfo.tenantId.eq(TenantHelper.getTenantId()));
}
}
List<TbDeviceInfo> devices = query.fetch(); List<TbDeviceInfo> devices = query.fetch();
return MapstructUtils.convert(devices, DeviceInfo.class); return MapstructUtils.convert(devices, DeviceInfo.class);
} }
@Override @Override
public List<AlertStatDTO> getDeviceRecord() { public List<AlertStatDTO> getDeviceRecord() {
QTbDeviceInfo device = QTbDeviceInfo.tbDeviceInfo; QTbDeviceInfo device = tbDeviceInfo;
QTbProduct product = QTbProduct.tbProduct; QTbProduct product = tbProduct;
// 在线设备统计 // 在线设备统计
List<DeviceProduckDTO> onlineStats = jpaQueryFactory List<DeviceProduckDTO> onlineStats = jpaQueryFactory
.select(Projections.constructor( .select(Projections.constructor(
@ -340,15 +502,16 @@ public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceI
query.where(tbDeviceGroupMapping.groupId.eq(groupId)); query.where(tbDeviceGroupMapping.groupId.eq(groupId));
} }
if (StringUtils.isNotBlank(uid)) { if (StringUtils.isNotBlank(uid)) {
query.where(tbDeviceInfo.uid.eq(uid)); query.where(tbDeviceInfo.uid.eq(uid));
} }
if (StringUtils.isNotBlank(name)) { if (StringUtils.isNotBlank(name)) {
query.where(tbDeviceInfo.name.like("%" + name + "%")); query.where(tbDeviceInfo.name.like("%" + name + "%"));
} }
System.out.println(TenantHelper.getTenantId());
if (ObjectUtil.isNotNull(LoginHelper.getTenantId()) && !LoginHelper.isSuperAdmin()) { if (ObjectUtil.isNotNull(TenantHelper.getTenantId()) && (!LoginHelper.isSuperAdmin() || TenantHelper.getTenantId()!=0)) {
query.where(tbDeviceInfo.tenantId.eq(LoginHelper.getTenantId())); query.where(tbDeviceInfo.tenantId.eq(TenantHelper.getTenantId()));
} }
if (ObjectUtil.isNotNull(deptAreaId)) { if (ObjectUtil.isNotNull(deptAreaId)) {
List<Long> areaIds; List<Long> areaIds;
@ -360,6 +523,32 @@ public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceI
if (ObjectUtil.isNotEmpty(areaIds)) { if (ObjectUtil.isNotEmpty(areaIds)) {
query.where(tbDeviceInfo.deptAreaId.in(areaIds)); query.where(tbDeviceInfo.deptAreaId.in(areaIds));
} }
}else{
if(!LoginHelper.isSuperAdmin()) {
if(ObjectUtil.isNotEmpty(LoginHelper.getUserId())) {
SysUser user = isSysUserData.findById(LoginHelper.getUserId());
if (ObjectUtil.isNotNull(user)) {
if (ObjectUtil.isNotNull(user.getDeptAreaId())) {
List<Long> areaIds;
// if (Objects.nonNull(user) && Objects.nonNull(user.getDeptAreaId())) {
Long areaId = user.getDeptAreaId();
List<SysDept> depts = sysDeptData.findByDeptId(areaId);
areaIds = StreamUtils.toList(depts, SysDept::getId);
areaIds.add(areaId);
if (ObjectUtil.isNotEmpty(areaIds)) {
query.where(tbDeviceInfo.deptAreaId.in(areaIds));
}
} else {
if(ObjectUtil.isNotEmpty(LoginHelper.getUserType()) && !LoginHelper.getUserType().equals(UserType.APP_USER)) {
//没有绑定区域查不到设备
query.where(tbDeviceInfo.id.eq("0"));
}
}
}
}
}
} }
if (StringUtils.isNotBlank(subUid)) { if (StringUtils.isNotBlank(subUid)) {
query.join(tbDeviceSubUser).on(tbDeviceSubUser.deviceId.eq(tbDeviceInfo.deviceId)); query.join(tbDeviceSubUser).on(tbDeviceSubUser.deviceId.eq(tbDeviceInfo.deviceId));
@ -392,7 +581,81 @@ public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceI
} }
return new Paging<>(total, deviceInfos); return new Paging<>(total, deviceInfos);
} }
@Override
public Paging<DeviceInfo> findByConditions1(String name, String uid, String subUid,
String productKey, String groupId,
Boolean online, String keyword,
int page, int size, Long deptAreaId) {
JPAQuery<TbDeviceInfo> query = jpaQueryFactory.selectFrom(tbDeviceInfo);
// 根据groupId, 如果groupId存在则关联查询TbDeviceGroupMapping, 根据groupId,查询对应的devices
if (StringUtils.isNotBlank(groupId)) {
query.join(tbDeviceGroupMapping).on(tbDeviceGroupMapping.deviceId.eq(tbDeviceInfo.deviceId));
query.where(tbDeviceGroupMapping.groupId.eq(groupId));
}
if (StringUtils.isNotBlank(uid)) {
query.where(tbDeviceInfo.uid.eq(uid));
}
if (StringUtils.isNotBlank(name)) {
query.where(tbDeviceInfo.name.like("%" + name + "%"));
}
System.out.println(TenantHelper.getTenantId());
if (ObjectUtil.isNotNull(TenantHelper.getTenantId()) && (!LoginHelper.isSuperAdmin() || TenantHelper.getTenantId()!=0)) {
query.where(tbDeviceInfo.tenantId.eq(TenantHelper.getTenantId()));
}
if (ObjectUtil.isNotNull(deptAreaId)) {
query.where(tbDeviceInfo.deptAreaId.eq(deptAreaId));
}else{
if(!LoginHelper.isSuperAdmin()) {
if(ObjectUtil.isNotEmpty(LoginHelper.getUserId())) {
SysUser user = isSysUserData.findById(LoginHelper.getUserId());
if (ObjectUtil.isNotNull(user)) {
if (ObjectUtil.isNotNull(user.getDeptAreaId())) {
query.where(tbDeviceInfo.deptAreaId.eq(user.getDeptAreaId()));
} else {
if(ObjectUtil.isNotEmpty(LoginHelper.getUserType()) && !LoginHelper.getUserType().equals(UserType.APP_USER)) {
//没有绑定区域查不到设备
query.where(tbDeviceInfo.id.eq("0"));
}
}
}
}
}
}
if (StringUtils.isNotBlank(subUid)) {
query.join(tbDeviceSubUser).on(tbDeviceSubUser.deviceId.eq(tbDeviceInfo.deviceId));
query.where(tbDeviceSubUser.uid.eq(subUid));
}
if (StringUtils.isNotBlank(productKey)) {
query.where(tbDeviceInfo.productKey.eq(productKey));
}
if (online != null) {
query.where(tbDeviceInfo.state.eq(online ? "online" : "offline"));
}
if (StringUtils.isNotBlank(keyword)) {
query.where(tbDeviceInfo.deviceId.like("%" + keyword + "%")
.or(tbDeviceInfo.deviceName.like("%" + keyword + "%")));
}
query.orderBy(tbDeviceInfo.createAt.desc());
query.offset((page - 1) * size).limit(size);
List<TbDeviceInfo> tbDeviceInfos = query.fetch();
long total = query.fetchCount();
List<DeviceInfo> deviceInfos = new ArrayList<>(tbDeviceInfos.size());
for (TbDeviceInfo tbDeviceInfo : tbDeviceInfos) {
DeviceInfo deviceInfo = MapstructUtils.convert(tbDeviceInfo, DeviceInfo.class);
fillDeviceInfo(tbDeviceInfo.getDeviceId(), tbDeviceInfo, deviceInfo);
deviceInfos.add(deviceInfo);
}
return new Paging<>(total, deviceInfos);
}
@Override @Override
public List<DeviceInfo> findByConditionsList(String productKey) { public List<DeviceInfo> findByConditionsList(String productKey) {
JPAQuery<TbDeviceInfo> query = jpaQueryFactory.selectFrom(tbDeviceInfo); JPAQuery<TbDeviceInfo> query = jpaQueryFactory.selectFrom(tbDeviceInfo);
@ -441,7 +704,30 @@ public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceI
} }
return deviceInfos; return deviceInfos;
} }
@Override
public List<DeviceInfo> findByConditionsList(String productKey,Boolean flag) {
JPAQuery<TbDeviceInfo> query = jpaQueryFactory.selectFrom(tbDeviceInfo);
if (flag) {
query.where(tbDeviceInfo.latitude.isNotNull());
}
if (StringUtils.isNotBlank(productKey)) {
query.where(tbDeviceInfo.productKey.eq(productKey));
}
query.orderBy(tbDeviceInfo.createAt.desc());
// query.offset((page - 1) * size).limit(size);
List<TbDeviceInfo> tbDeviceInfos = query.fetch();
long total = query.fetchCount();
List<DeviceInfo> deviceInfos = new ArrayList<>(tbDeviceInfos.size());
for (TbDeviceInfo tbDeviceInfo : tbDeviceInfos) {
DeviceInfo deviceInfo = MapstructUtils.convert(tbDeviceInfo, DeviceInfo.class);
fillDeviceInfo1(tbDeviceInfo.getDeviceId(), tbDeviceInfo, deviceInfo);
deviceInfos.add(deviceInfo);
}
return deviceInfos;
}
@Override @Override
public void updateTag(String deviceId, DeviceInfo.Tag tag) { public void updateTag(String deviceId, DeviceInfo.Tag tag) {
TbDeviceTag deviceTag = deviceTagRepository.findByDeviceIdAndCode(deviceId, tag.getId()); TbDeviceTag deviceTag = deviceTagRepository.findByDeviceIdAndCode(deviceId, tag.getId());
@ -502,6 +788,11 @@ public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceI
public long countByGroupId(String groupId) { public long countByGroupId(String groupId) {
return deviceGroupMappingRepository.countByGroupId(groupId); return deviceGroupMappingRepository.countByGroupId(groupId);
} }
@Override
public long countByUidAndState(String uid,String state) {
return deviceInfoRepository.countByUidAndState(uid,state);
}
private static Predicate genPredicate(List<Long> deptAreaId,String startDate, String endDate) { private static Predicate genPredicate(List<Long> deptAreaId,String startDate, String endDate) {
boolean hasValidConditions = false; boolean hasValidConditions = false;
PredicateBuilder builder = PredicateBuilder.instance(); PredicateBuilder builder = PredicateBuilder.instance();
@ -509,7 +800,10 @@ public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceI
hasValidConditions = true; hasValidConditions = true;
builder.and(ObjectUtil.isNotEmpty(deptAreaId), () -> tbDeviceInfo.deptAreaId.in(deptAreaId)); builder.and(ObjectUtil.isNotEmpty(deptAreaId), () -> tbDeviceInfo.deptAreaId.in(deptAreaId));
} }
if (ObjectUtil.isNotNull(endDate)) { if(!LoginHelper.isSuperAdmin()) {
builder.and(ObjectUtil.isNotEmpty(TenantHelper.getTenantId()), () -> tbDeviceInfo.tenantId.eq(TenantHelper.getTenantId()));
hasValidConditions = true;
} if (ObjectUtil.isNotNull(endDate)) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
Date beginDate = Date.from(LocalDate.parse(startDate).atStartOfDay(ZoneId.systemDefault()).toInstant()); Date beginDate = Date.from(LocalDate.parse(startDate).atStartOfDay(ZoneId.systemDefault()).toInstant());
@ -539,8 +833,8 @@ public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceI
} }
@Override @Override
public List<ProductKeyCountDTO> getProductDevice(Long deptAreaId,String startDate, String endDate) { public List<ProductKeyCountDTO> getProductDevice(Long deptAreaId,String startDate, String endDate) {
QTbDeviceInfo record = QTbDeviceInfo.tbDeviceInfo; QTbDeviceInfo record = tbDeviceInfo;
QTbProduct product = QTbProduct.tbProduct; QTbProduct product = tbProduct;
List<Long> areaIds = new ArrayList<>(); List<Long> areaIds = new ArrayList<>();
if (ObjectUtil.isNotNull(deptAreaId)) { if (ObjectUtil.isNotNull(deptAreaId)) {
// if (Objects.nonNull(user) && Objects.nonNull(user.getDeptAreaId())) { // if (Objects.nonNull(user) && Objects.nonNull(user.getDeptAreaId())) {
@ -551,6 +845,22 @@ public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceI
/* if (ObjectUtil.isNotEmpty(areaIds)) { /* if (ObjectUtil.isNotEmpty(areaIds)) {
query.where(tbDeviceInfo.deptAreaId.in(areaIds)); query.where(tbDeviceInfo.deptAreaId.in(areaIds));
}*/ }*/
}else{
if(!LoginHelper.isSuperAdmin()) {
if(ObjectUtil.isNotNull(LoginHelper.getUserId())){
SysUser sysUser = isSysUserData.findById(LoginHelper.getUserId());
if (ObjectUtil.isNotNull(sysUser) && ObjectUtil.isNotNull(sysUser.getDeptAreaId())) {
List<SysDept> depts = sysDeptData.findByDeptId(sysUser.getDeptAreaId());
areaIds = StreamUtils.toList(depts, SysDept::getId);
areaIds.add(sysUser.getDeptAreaId());
}
}
}
}
if(ObjectUtil.isNull(deptAreaId) && LoginHelper.isSuperAdmin() && ObjectUtil.isNotNull(TenantHelper.getTenantId()) && TenantHelper.getTenantId() != 0) {
List<SysDept> depts = sysDeptData.findByTenantId(TenantHelper.getTenantId());
areaIds = StreamUtils.toList(depts, SysDept::getId);
//areaIds.add(sysUser.getDeptAreaId());
} }
return jpaQueryFactory return jpaQueryFactory
@ -572,7 +882,7 @@ public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceI
@Transactional @Transactional
public void addToGroup(String deviceId, DeviceInfo.Group group) { public void addToGroup(String deviceId, DeviceInfo.Group group) {
String groupId = UUID.randomUUID().toString(); String groupId = UUID.randomUUID().toString();
deviceGroupMappingRepository.save(new TbDeviceGroupMapping(groupId, deviceId, group.getId(), LoginHelper.getTenantId())); deviceGroupMappingRepository.save(new TbDeviceGroupMapping(groupId, deviceId, group.getId(), TenantHelper.getTenantId()));
//更新设备数量 //更新设备数量
updateGroupDeviceCount(groupId); updateGroupDeviceCount(groupId);
@ -668,7 +978,7 @@ public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceI
UUID.randomUUID().toString(), UUID.randomUUID().toString(),
data.getDeviceId(), data.getDeviceId(),
id, id,
LoginHelper.getTenantId() TenantHelper.getTenantId()
)); ));
} }
}); });
@ -721,7 +1031,7 @@ public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceI
private List<DeviceInfo> buildQuery(Predicate predicate) { private List<DeviceInfo> buildQuery(Predicate predicate) {
List<TbDeviceInfo> devices = jpaQueryFactory.select(Projections.bean(TbDeviceInfo.class, tbDeviceInfo.uid, List<TbDeviceInfo> devices = jpaQueryFactory.select(Projections.bean(TbDeviceInfo.class, tbDeviceInfo.uid,
tbDeviceInfo.deviceId, tbDeviceInfo.productKey, tbDeviceInfo.deviceName, tbDeviceInfo.state, tbDeviceInfo.createAt, tbDeviceInfo.deviceId, tbDeviceInfo.productKey, tbDeviceInfo.deviceName, tbDeviceInfo.state, tbDeviceInfo.createAt,
tbDeviceInfo.id, tbDeviceInfo.onlineTime, tbDeviceInfo.parentId, tbDeviceInfo.latitude, tbDeviceInfo.longitude, tbDeviceInfo.model, tbDeviceInfo.id, tbDeviceInfo.onlineTime, tbDeviceInfo.parentId, tbDeviceInfo.tenantId, tbDeviceInfo.deptAreaId,tbDeviceInfo.latitude, tbDeviceInfo.longitude, tbDeviceInfo.model,
tbDeviceInfo.offlineTime, tbDeviceInfo.secret)) tbDeviceInfo.offlineTime, tbDeviceInfo.secret))
.from(tbDeviceInfo) .from(tbDeviceInfo)
.where(predicate).fetch(); .where(predicate).fetch();
@ -729,11 +1039,30 @@ public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceI
} }
private Predicate buildQueryCondition(DeviceInfo device) { private Predicate buildQueryCondition(DeviceInfo device) {
if(LoginHelper.isSuperAdmin() && TenantHelper.getTenantId() !=0) {
return PredicateBuilder.instance()
.and(ObjectUtil.isNotNull(device.getId()), () -> tbDeviceInfo.id.eq(device.getId()))
.and(ObjectUtil.isNotNull(TenantHelper.getTenantId()), () -> tbDeviceInfo.tenantId.eq(TenantHelper.getTenantId()))
.and(ObjectUtil.isNotNull(device.getDeviceName()), () -> tbDeviceInfo.deviceName.eq(device.getDeviceName()))
.and(ObjectUtil.isNotNull(device.getState()), () -> tbDeviceInfo.state.eq(device.getState().isOnline() ? "online" : "offline"))
//.and(device.isFlag(), tbDeviceInfo.latitude::isNotNull)
.build();
}else if(LoginHelper.isSuperAdmin()) {
return PredicateBuilder.instance() return PredicateBuilder.instance()
.and(ObjectUtil.isNotNull(device.getId()), () -> tbDeviceInfo.id.eq(device.getId())) .and(ObjectUtil.isNotNull(device.getId()), () -> tbDeviceInfo.id.eq(device.getId()))
.and(ObjectUtil.isNotNull(device.getDeviceName()), () -> tbDeviceInfo.deviceName.eq(device.getDeviceName())) .and(ObjectUtil.isNotNull(device.getDeviceName()), () -> tbDeviceInfo.deviceName.eq(device.getDeviceName()))
.and(ObjectUtil.isNotNull(device.getState()), () -> tbDeviceInfo.state.eq(device.getState().isOnline() ? "online" : "offline")) .and(ObjectUtil.isNotNull(device.getState()), () -> tbDeviceInfo.state.eq(device.getState().isOnline() ? "online" : "offline"))
// .and(device.isFlag(), tbDeviceInfo.latitude::isNotNull)
.build(); .build();
} else{
return PredicateBuilder.instance()
.and(ObjectUtil.isNotNull(device.getId()), () -> tbDeviceInfo.id.eq(device.getId()))
.and(ObjectUtil.isNotNull(TenantHelper.getTenantId()), () -> tbDeviceInfo.tenantId.eq(TenantHelper.getTenantId()))
.and(ObjectUtil.isNotNull(device.getDeviceName()), () -> tbDeviceInfo.deviceName.eq(device.getDeviceName()))
.and(ObjectUtil.isNotNull(device.getState()), () -> tbDeviceInfo.state.eq(device.getState().isOnline() ? "online" : "offline"))
// .and(device.isFlag(), tbDeviceInfo.latitude::isNotNull)
.build();
}
} }
} }

@ -0,0 +1,80 @@
/*
*
* * | Licensed OPENIITA
* * +----------------------------------------------------------------------
* * | Author: xw2sy@163.com
* * +----------------------------------------------------------------------
*
* Copyright [2024] [OPENIITA]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package cc.iotkit.data.service;
import cc.iotkit.common.utils.MapstructUtils;
import cc.iotkit.data.dao.DeviceIDetectornfoRepository;
import cc.iotkit.data.dao.DeviceInstallInfoRepository;
import cc.iotkit.data.dao.IJPACommData;
import cc.iotkit.data.manager.IDeviceDetectorInfoData;
import cc.iotkit.data.manager.IDeviceInstallInfoData;
import cc.iotkit.data.model.TbDeviceDetectorInfo;
import cc.iotkit.data.model.TbDeviceInstallInfo;
import cc.iotkit.model.device.DeviceConfig;
import cc.iotkit.model.device.DeviceDetectorInfo;
import cc.iotkit.model.device.DeviceInstallInfo;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;
@Primary
@Service
@RequiredArgsConstructor
public class DeviceInstallInfoDataImpl implements IDeviceInstallInfoData, IJPACommData<DeviceInstallInfo,String> {
@Autowired
private DeviceInstallInfoRepository homeRepository;
private final JPAQueryFactory jpaQueryFactory;
@Override
public JpaRepository getBaseRepository() {
return homeRepository;
}
@Override
public Class getJpaRepositoryClass() {
return TbDeviceInstallInfo.class;
}
@Override
public Class getTClass() {
return DeviceInstallInfo.class;
}
@Override
public DeviceInstallInfo findByDeviceNameAndUid(String deviceName,String uid) {
return MapstructUtils.convert(homeRepository.findByDeviceNameAndUid(deviceName,uid), DeviceInstallInfo.class);
// return homeRepository.findByDeviceName(deviceName);
}
@Override
public DeviceInstallInfo findByDeviceNameAndUidAndState(String deviceName, String uid, Integer state) {
return MapstructUtils.convert(homeRepository.findByDeviceNameAndUidAndState(deviceName,uid,state), DeviceInstallInfo.class);
}
}

@ -31,10 +31,13 @@ import cc.iotkit.data.dao.RuleInfoRepository;
import cc.iotkit.data.model.TbRuleInfo; import cc.iotkit.data.model.TbRuleInfo;
import cc.iotkit.common.api.Paging; import cc.iotkit.common.api.Paging;
import cc.iotkit.data.model.TbTaskInfo; import cc.iotkit.data.model.TbTaskInfo;
import cc.iotkit.data.system.ISysTenantData;
import cc.iotkit.data.util.PageBuilder; import cc.iotkit.data.util.PageBuilder;
import cc.iotkit.model.rule.FilterConfig; import cc.iotkit.model.rule.FilterConfig;
import cc.iotkit.model.rule.RuleAction; import cc.iotkit.model.rule.RuleAction;
import cc.iotkit.model.rule.RuleInfo; import cc.iotkit.model.rule.RuleInfo;
import cc.iotkit.model.system.SysTenant;
import cn.hutool.core.util.ObjectUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
@ -55,7 +58,8 @@ public class RuleInfoDataImpl implements IRuleInfoData, IJPACommData<RuleInfo, S
@Autowired @Autowired
private RuleInfoRepository ruleInfoRepository; private RuleInfoRepository ruleInfoRepository;
@Autowired
private ISysTenantData isSysTenantData;
@Override @Override
public JpaRepository getBaseRepository() { public JpaRepository getBaseRepository() {
return ruleInfoRepository; return ruleInfoRepository;
@ -89,8 +93,21 @@ public class RuleInfoDataImpl implements IRuleInfoData, IJPACommData<RuleInfo, S
public Paging<RuleInfo> findByType(String type, int page, int size) { public Paging<RuleInfo> findByType(String type, int page, int size) {
Page<TbRuleInfo> paged = ruleInfoRepository.findByType(type, Page<TbRuleInfo> paged = ruleInfoRepository.findByType(type,
Pageable.ofSize(size).withPage(page - 1)); Pageable.ofSize(size).withPage(page - 1));
List<RuleInfo> ruleInfoList = fromTb(paged.getContent());
for (RuleInfo tbRule :ruleInfoList) {
if (ObjectUtil.isNotNull(tbRule.getTenantId())) {
SysTenant sysTenant = new SysTenant();
sysTenant.setTenantId(tbRule.getTenantId());
SysTenant sysTenant1 = isSysTenantData.findOneByCondition(sysTenant);
if (sysTenant1 != null) {
tbRule.setTenantName(sysTenant1.getCompanyName());
}
}
}
return new Paging<>(paged.getTotalElements(), return new Paging<>(paged.getTotalElements(),
fromTb(paged.getContent())); ruleInfoList);
} }
@Override @Override

@ -28,6 +28,7 @@ import cc.iotkit.common.api.PageRequest;
import cc.iotkit.common.api.Paging; import cc.iotkit.common.api.Paging;
import cc.iotkit.common.enums.ErrCode; import cc.iotkit.common.enums.ErrCode;
import cc.iotkit.common.exception.BizException; import cc.iotkit.common.exception.BizException;
import cc.iotkit.common.tenant.helper.TenantHelper;
import cc.iotkit.common.utils.MapstructUtils; import cc.iotkit.common.utils.MapstructUtils;
import cc.iotkit.common.utils.StringUtils; import cc.iotkit.common.utils.StringUtils;
import cc.iotkit.data.dao.IJPACommData; import cc.iotkit.data.dao.IJPACommData;
@ -107,9 +108,9 @@ public class SysConfigDataImpl implements ISysConfigData, IJPACommData<SysConfig
public Paging<SysConfig> findAll(PageRequest<SysConfig> pageRequest) { public Paging<SysConfig> findAll(PageRequest<SysConfig> pageRequest) {
SysConfig query = pageRequest.getData(); SysConfig query = pageRequest.getData();
Predicate predicate = PredicateBuilder.instance() Predicate predicate = PredicateBuilder.instance()
.and(StringUtils.isNotEmpty(query.getConfigName()), () -> tbSysConfig.configName.like(query.getConfigName())) .and(StringUtils.isNotEmpty(query.getConfigName()), () -> tbSysConfig.configName.like("%"+query.getConfigName()+"%"))
.and(StringUtils.isNotEmpty(query.getConfigType()), () -> tbSysConfig.configType.eq(query.getConfigType())) .and(StringUtils.isNotEmpty(query.getConfigType()), () -> tbSysConfig.configType.eq(query.getConfigType()))
.and(StringUtils.isNotEmpty(query.getConfigKey()), () -> tbSysConfig.configKey.like(query.getConfigKey())) .and(StringUtils.isNotEmpty(query.getConfigKey()), () -> tbSysConfig.configKey.like("%"+query.getConfigKey()+"%"))
.build(); .build();
Page<TbSysConfig> all = baseRepository.findAll(predicate, PageBuilder.toPageable(pageRequest)); Page<TbSysConfig> all = baseRepository.findAll(predicate, PageBuilder.toPageable(pageRequest));
return PageBuilder.toPaging(all, SysConfig.class); return PageBuilder.toPaging(all, SysConfig.class);
@ -140,7 +141,7 @@ public class SysConfigDataImpl implements ISysConfigData, IJPACommData<SysConfig
@Override @Override
public SysConfig findByConfigKey(String configKey) { public SysConfig findByConfigKey(String configKey) {
TbSysConfig tbSysConfig = baseRepository.findByConfigKey(configKey).orElse(null); TbSysConfig tbSysConfig = baseRepository.findByConfigKeyAndTenantId(configKey,TenantHelper.getTenantId()).orElse(null);
if(Objects.isNull(tbSysConfig)){ if(Objects.isNull(tbSysConfig)){
return null; return null;
} }
@ -159,7 +160,7 @@ public class SysConfigDataImpl implements ISysConfigData, IJPACommData<SysConfig
private Predicate buildPredicate(SysConfig data) { private Predicate buildPredicate(SysConfig data) {
return PredicateBuilder.instance() return PredicateBuilder.instance()
.and(StringUtils.isNotEmpty(data.getConfigKey()), () -> tbSysConfig.configKey.eq(data.getConfigKey())) .and(StringUtils.isNotEmpty(data.getConfigKey()), () -> tbSysConfig.configKey.eq(data.getConfigKey()))
.and(StringUtils.isNotEmpty(data.getConfigName()), () -> tbSysConfig.configName.like(data.getConfigName())) .and(StringUtils.isNotEmpty(data.getConfigName()), () -> tbSysConfig.configName.like("%"+data.getConfigName()+"%"))
.and(StringUtils.isNotEmpty(data.getConfigType()), () -> tbSysConfig.configType.eq(data.getConfigType())) .and(StringUtils.isNotEmpty(data.getConfigType()), () -> tbSysConfig.configType.eq(data.getConfigType()))
.build(); .build();
} }

@ -24,14 +24,21 @@
package cc.iotkit.data.service; package cc.iotkit.data.service;
import cc.iotkit.common.constant.UserConstants; import cc.iotkit.common.constant.UserConstants;
import cc.iotkit.common.enums.UserType;
import cc.iotkit.common.satoken.utils.LoginHelper;
import cc.iotkit.common.tenant.helper.TenantHelper;
import cc.iotkit.common.utils.MapstructUtils; import cc.iotkit.common.utils.MapstructUtils;
import cc.iotkit.common.utils.StreamUtils;
import cc.iotkit.common.utils.StringUtils; import cc.iotkit.common.utils.StringUtils;
import cc.iotkit.data.dao.IJPACommData; import cc.iotkit.data.dao.IJPACommData;
import cc.iotkit.data.dao.SysDeptRepository; import cc.iotkit.data.dao.SysDeptRepository;
import cc.iotkit.data.dao.SysUserRepository;
import cc.iotkit.data.model.TbSysDept; import cc.iotkit.data.model.TbSysDept;
import cc.iotkit.data.model.TbSysUser;
import cc.iotkit.data.system.ISysDeptData; import cc.iotkit.data.system.ISysDeptData;
import cc.iotkit.data.util.PredicateBuilder; import cc.iotkit.data.util.PredicateBuilder;
import cc.iotkit.model.system.SysDept; import cc.iotkit.model.system.SysDept;
import cc.iotkit.model.system.SysUser;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.querydsl.jpa.impl.JPAQueryFactory; import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -41,6 +48,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.StreamSupport; import java.util.stream.StreamSupport;
@ -58,6 +66,8 @@ public class SysDeptDataImpl implements ISysDeptData, IJPACommData<SysDept, Long
@Autowired @Autowired
private SysDeptRepository deptRepository; private SysDeptRepository deptRepository;
@Autowired
private SysUserRepository sysUserData;
private final JPAQueryFactory jpaQueryFactory; private final JPAQueryFactory jpaQueryFactory;
@ -82,16 +92,74 @@ public class SysDeptDataImpl implements ISysDeptData, IJPACommData<SysDept, Long
public List<SysDept> findDepts(SysDept dept) { public List<SysDept> findDepts(SysDept dept) {
PredicateBuilder predicateBuilder = PredicateBuilder.instance() PredicateBuilder predicateBuilder = PredicateBuilder.instance()
.and(ObjectUtil.isNotNull(dept.getId()), () -> tbSysDept.id.eq(dept.getId())) .and(ObjectUtil.isNotNull(dept.getId()), () -> tbSysDept.id.eq(dept.getId()))
.and(StringUtils.isNotEmpty(dept.getDeptName()), () -> tbSysDept.deptName.like(dept.getDeptName())) .and(StringUtils.isNotEmpty(dept.getDeptName()), () -> tbSysDept.deptName.like("%" + dept.getDeptName() + "%"))
.and(ObjectUtil.isNotNull(dept.getParentId()), () -> tbSysDept.parentId.eq(dept.getParentId())) .and(ObjectUtil.isNotNull(dept.getParentId()), () -> tbSysDept.parentId.eq(dept.getParentId()))
.and(StringUtils.isNotEmpty(dept.getStatus()), () -> tbSysDept.status.eq(dept.getStatus())); .and(StringUtils.isNotEmpty(dept.getStatus()), () -> tbSysDept.status.eq(dept.getStatus()));
if(ObjectUtil.isNotNull(dept.getAreaType()) && dept.getAreaType() == 1){ if (ObjectUtil.isNotNull(dept.getAreaType()) && dept.getAreaType() == 1) {
//查询区域(需要查询parentId为0的顶级部门) //查询区域(需要查询parentId为0的顶级部门)
predicateBuilder.and(ObjectUtil.isNotNull(dept.getAreaType()), () -> tbSysDept.areaType.eq(dept.getAreaType()).or(tbSysDept.parentId.eq(0L))); predicateBuilder.and(ObjectUtil.isNotNull(dept.getAreaType()), () -> tbSysDept.areaType.eq(dept.getAreaType()).or(tbSysDept.parentId.eq(0L)));
}else if(ObjectUtil.isNotNull(dept.getAreaType()) && dept.getAreaType() == 0){ } else if (ObjectUtil.isNotNull(dept.getAreaType()) && dept.getAreaType() == 0) {
//查询部门 //查询部门
predicateBuilder.and(ObjectUtil.isNotNull(dept.getAreaType()), () -> tbSysDept.areaType.eq(dept.getAreaType())); predicateBuilder.and(ObjectUtil.isNotNull(dept.getAreaType()), () -> tbSysDept.areaType.eq(dept.getAreaType()));
} else {
// if(ObjectUtil.isNull(dept.getFlag())) {
//查询部门
predicateBuilder.and(tbSysDept.areaType.eq(0));
// }
}
/* if(ObjectUtil.isNull(dept.getAreaType()) && ObjectUtil.isNull(dept.getParentId())){
predicateBuilder.or(tbSysDept.parentId.eq(0L));
}*/
if (!LoginHelper.isSuperAdmin()) {
predicateBuilder.and(ObjectUtil.isNotNull(dept.getTenantId()), () -> tbSysDept.tenantId.eq(dept.getTenantId()));
Optional<TbSysUser> tbSysUser = sysUserData.findById(LoginHelper.getUserId());
List<Long> areaIds;
// if (Objects.nonNull(user) && Objects.nonNull(user.getDeptAreaId())) {
if (ObjectUtil.isNotEmpty(tbSysUser) && ObjectUtil.isNotEmpty(LoginHelper.getUserType()) && !LoginHelper.getUserType().equals(UserType.APP_USER)) {
if (ObjectUtil.isNotNull(dept.getAreaType()) && dept.getAreaType() == 1) {
//查询区域
Long areaId = tbSysUser.get().getDeptAreaId();
List<SysDept> depts = this.findByDeptId(areaId);
List<Long> filteredIds = depts.stream()
.filter(dept1 -> dept1.getAreaType() == 1)
.map(SysDept::getId)
.collect(Collectors.toList());
filteredIds.add(areaId);
//areaIds = StreamUtils.toList(depts, SysDept::getId);
// areaIds.add(areaId);
predicateBuilder.and(ObjectUtil.isNotNull(tbSysUser.get().getDeptAreaId()), () -> tbSysDept.id.in(filteredIds));
} else {
/* Long areaId = tbSysUser.get().getDeptId();
List<SysDept> depts = iSysDeptData.findByDeptId(areaId);
areaIds = StreamUtils.toList(depts, SysDept::getId);
areaIds.add(areaId);*/
// if(ObjectUtil.isNull(dept.getFlag())) {
Long areaId = tbSysUser.get().getDeptId();
List<SysDept> depts = this.findByDeptId(areaId);
List<Long> filteredIds = depts.stream()
.filter(dept1 -> dept1.getAreaType() == 0)
.map(SysDept::getId)
.collect(Collectors.toList());
filteredIds.add(areaId);
predicateBuilder.and(ObjectUtil.isNotNull(tbSysUser.get().getDeptId()), () -> tbSysDept.id.in(filteredIds));
// }
}
predicateBuilder.and(ObjectUtil.isNotNull(TenantHelper.getTenantId()), () -> tbSysDept.tenantId.eq(TenantHelper.getTenantId()));
}
}/*else{
if (ObjectUtil.isNotNull(dept.getAreaType()) && dept.getAreaType() == 1) {
}
}*/
if (LoginHelper.isSuperAdmin() && TenantHelper.getTenantId() != 0) {
predicateBuilder.and(ObjectUtil.isNotNull(TenantHelper.getTenantId()), () -> tbSysDept.tenantId.eq(TenantHelper.getTenantId()));
} }
return MapstructUtils.convert(StreamSupport.stream(deptRepository.findAll(predicateBuilder.build()).spliterator(), false).collect(Collectors.toList()), SysDept.class); return MapstructUtils.convert(StreamSupport.stream(deptRepository.findAll(predicateBuilder.build()).spliterator(), false).collect(Collectors.toList()), SysDept.class);
} }
@ -114,6 +182,11 @@ public class SysDeptDataImpl implements ISysDeptData, IJPACommData<SysDept, Long
.collect(Collectors.toList()), SysDept.class); .collect(Collectors.toList()), SysDept.class);
} }
@Override
public List<SysDept> findByTenantId(Long tenantId) {
return MapstructUtils.convert(deptRepository.findByTenantId(tenantId), SysDept.class);
}
@Override @Override
public boolean checkDeptNameUnique(String deptName, Long parentId, Long deptId) { public boolean checkDeptNameUnique(String deptName, Long parentId, Long deptId) {
PredicateBuilder predicateBuilder = PredicateBuilder.instance().and(tbSysDept.deptName.eq(deptName)) PredicateBuilder predicateBuilder = PredicateBuilder.instance().and(tbSysDept.deptName.eq(deptName))

@ -116,7 +116,7 @@ public class SysDictDataImpl implements ISysDictData, IJPACommData<SysDictData,
private Predicate buildQueryCondition(SysDictData dictData) { private Predicate buildQueryCondition(SysDictData dictData) {
return PredicateBuilder.instance() return PredicateBuilder.instance()
.and(dictData.getDictSort() != null, () -> tbSysDictData.dictSort.eq(dictData.getDictSort())) .and(dictData.getDictSort() != null, () -> tbSysDictData.dictSort.eq(dictData.getDictSort()))
.and(StringUtils.isNotEmpty(dictData.getDictLabel()), () -> tbSysDictData.dictLabel.like(dictData.getDictLabel())) .and(StringUtils.isNotEmpty(dictData.getDictLabel()), () -> tbSysDictData.dictLabel.like("%"+dictData.getDictLabel()+"%"))
.and(StringUtils.isNotEmpty(dictData.getDictType()), () -> tbSysDictData.dictType.eq(dictData.getDictType())) .and(StringUtils.isNotEmpty(dictData.getDictType()), () -> tbSysDictData.dictType.eq(dictData.getDictType()))
.and(StringUtils.isNotEmpty(dictData.getStatus()), () -> tbSysDictData.status.eq(dictData.getStatus())) .and(StringUtils.isNotEmpty(dictData.getStatus()), () -> tbSysDictData.status.eq(dictData.getStatus()))
.and(ObjectUtil.isNotNull(dictData.getTenantId()), () -> tbSysDictData.tenantId.eq(dictData.getTenantId())).build(); .and(ObjectUtil.isNotNull(dictData.getTenantId()), () -> tbSysDictData.tenantId.eq(dictData.getTenantId())).build();

@ -119,8 +119,8 @@ public class SysDictTypeDataImpl implements ISysDictTypeData, IJPACommData<SysDi
private Predicate buildQueryCondition(SysDictType dictType) { private Predicate buildQueryCondition(SysDictType dictType) {
return PredicateBuilder.instance() return PredicateBuilder.instance()
.and(StringUtils.isNotEmpty(dictType.getDictName()), () -> tbSysDictType.dictName.like(dictType.getDictName())) .and(StringUtils.isNotEmpty(dictType.getDictName()), () -> tbSysDictType.dictName.like("%"+dictType.getDictName()+"%"))
.and(StringUtils.isNotEmpty(dictType.getDictType()), () -> tbSysDictType.dictType.like(dictType.getDictType())) .and(StringUtils.isNotEmpty(dictType.getDictType()), () -> tbSysDictType.dictType.like("%"+dictType.getDictType()+"%"))
.and(StringUtils.isNotEmpty(dictType.getStatus()), () -> tbSysDictType.status.eq(dictType.getStatus())) .and(StringUtils.isNotEmpty(dictType.getStatus()), () -> tbSysDictType.status.eq(dictType.getStatus()))
.and(ObjectUtil.isNotNull(dictType.getTenantId()), () -> tbSysDictType.tenantId.eq(dictType.getTenantId())).build(); .and(ObjectUtil.isNotNull(dictType.getTenantId()), () -> tbSysDictType.tenantId.eq(dictType.getTenantId())).build();
} }

@ -90,9 +90,9 @@ public class SysLogininfoDataImpl implements ISysLogininforData, IJPACommData<Sy
private static Predicate genPredicate(SysLoginInfo data) { private static Predicate genPredicate(SysLoginInfo data) {
return PredicateBuilder.instance() return PredicateBuilder.instance()
.and(StringUtils.isNotBlank(data.getIpaddr()), () -> tbSysLogininfor.ipaddr.like(data.getIpaddr())) .and(StringUtils.isNotBlank(data.getIpaddr()), () -> tbSysLogininfor.ipaddr.like("%"+data.getIpaddr()+"%"))
.and(StringUtils.isNotBlank(data.getStatus()), () -> tbSysLogininfor.status.eq(data.getStatus())) .and(StringUtils.isNotBlank(data.getStatus()), () -> tbSysLogininfor.status.eq(data.getStatus()))
.and(StringUtils.isNotBlank(data.getUserName()), () -> tbSysLogininfor.userName.like(data.getUserName())) .and(StringUtils.isNotBlank(data.getUserName()), () -> tbSysLogininfor.userName.like("%"+data.getUserName()+"%"))
.build(); .build();
} }

@ -126,7 +126,7 @@ public class SysMenuDataImpl implements ISysMenuData, IJPACommData<SysMenu, Long
public List<SysMenu> selectMenuList(SysMenu menu, Long userId, boolean isSuperAdmin) { public List<SysMenu> selectMenuList(SysMenu menu, Long userId, boolean isSuperAdmin) {
PredicateBuilder predicateBuilder = PredicateBuilder.instance() PredicateBuilder predicateBuilder = PredicateBuilder.instance()
.and(StringUtils.isNotBlank(menu.getMenuName()), () -> tbSysMenu.menuName.like(menu.getMenuName())) .and(StringUtils.isNotBlank(menu.getMenuName()), () -> tbSysMenu.menuName.like("%"+menu.getMenuName()+"%"))
.and(StringUtils.isNotBlank(menu.getVisible()), () -> tbSysMenu.visible.eq(menu.getVisible())) .and(StringUtils.isNotBlank(menu.getVisible()), () -> tbSysMenu.visible.eq(menu.getVisible()))
.and(StringUtils.isNotBlank(menu.getStatus()), () -> tbSysMenu.status.eq(menu.getStatus())); .and(StringUtils.isNotBlank(menu.getStatus()), () -> tbSysMenu.status.eq(menu.getStatus()));

@ -85,13 +85,13 @@ public class SysNoticeDataImpl implements ISysNoticeData, IJPACommData<SysNotice
private Predicate buildQueryCondition(SysNotice query) { private Predicate buildQueryCondition(SysNotice query) {
return PredicateBuilder.instance().and(StringUtils.isNotBlank(query.getNoticeTitle()), ()-> return PredicateBuilder.instance().and(StringUtils.isNotBlank(query.getNoticeTitle()), ()->
tbSysNotice.noticeTitle.like(query.getNoticeTitle())) tbSysNotice.noticeTitle.like("%"+query.getNoticeTitle()+"%"))
.and(StringUtils.isNotBlank(query.getNoticeType()), ()-> .and(StringUtils.isNotBlank(query.getNoticeType()), ()->
tbSysNotice.noticeType.eq(query.getNoticeType())) tbSysNotice.noticeType.eq(query.getNoticeType()))
.and(StringUtils.isNotBlank(query.getStatus()), ()-> .and(StringUtils.isNotBlank(query.getStatus()), ()->
tbSysNotice.status.eq(query.getStatus())) tbSysNotice.status.eq(query.getStatus()))
.and(StringUtils.isNotBlank(query.getCreateByName()), ()->( .and(StringUtils.isNotBlank(query.getCreateByName()), ()->(
tbSysNotice.createBy.like(query.getCreateByName()))) tbSysNotice.createBy.like("%"+query.getCreateByName()+"%")))
.build(); .build();
} }
} }

@ -110,11 +110,11 @@ public class SysOperLogDataImpl implements ISysOperLogData, IJPACommData<SysOper
private Predicate buildQueryCondition(SysOperLog data) { private Predicate buildQueryCondition(SysOperLog data) {
return PredicateBuilder.instance() return PredicateBuilder.instance()
.and(StringUtils.isNotBlank(data.getTitle()), () -> tbSysOperLog.title.like(data.getTitle())) .and(StringUtils.isNotBlank(data.getTitle()), () -> tbSysOperLog.title.like("%"+data.getTitle()+"%"))
.and(data.getBusinessType() != null && data.getBusinessType() > 0, () -> tbSysOperLog.businessType.eq(data.getBusinessType())) .and(data.getBusinessType() != null && data.getBusinessType() > 0, () -> tbSysOperLog.businessType.eq(data.getBusinessType()))
.and(ArrayUtil.isNotEmpty(data.getBusinessTypes()), () -> tbSysOperLog.businessType.in(Arrays.asList(data.getBusinessTypes()))) .and(ArrayUtil.isNotEmpty(data.getBusinessTypes()), () -> tbSysOperLog.businessType.in(Arrays.asList(data.getBusinessTypes())))
.and(data.getStatus() != null && data.getStatus() > 0, () -> tbSysOperLog.status.eq(data.getStatus())) .and(data.getStatus() != null && data.getStatus() > 0, () -> tbSysOperLog.status.eq(data.getStatus()))
.and(StringUtils.isNotBlank(data.getOperName()), () -> tbSysOperLog.operName.like(data.getOperName())) .and(StringUtils.isNotBlank(data.getOperName()), () -> tbSysOperLog.operName.like("%"+data.getOperName() +"%"))
.build(); .build();
} }
} }

@ -126,8 +126,8 @@ public class SysPostDataImpl implements ISysPostData, IJPACommData<SysPost, Long
private Predicate buildQueryCondition(SysPost post) { private Predicate buildQueryCondition(SysPost post) {
return PredicateBuilder.instance() return PredicateBuilder.instance()
.and(StringUtils.isNotBlank(post.getPostCode()), () -> tbSysPost.postCode.like(post.getPostCode())) .and(StringUtils.isNotBlank(post.getPostCode()), () -> tbSysPost.postCode.like("%"+post.getPostCode()+"%"))
.and(StringUtils.isNotBlank(post.getPostName()), () -> tbSysPost.postName.like(post.getPostName())) .and(StringUtils.isNotBlank(post.getPostName()), () -> tbSysPost.postName.like("%"+post.getPostName()+"%"))
.and(StringUtils.isNotBlank(post.getStatus()), () -> tbSysPost.status.eq(post.getStatus())).build(); .and(StringUtils.isNotBlank(post.getStatus()), () -> tbSysPost.status.eq(post.getStatus())).build();
} }
} }

@ -26,6 +26,8 @@ package cc.iotkit.data.service;
import cc.iotkit.common.api.PageRequest; import cc.iotkit.common.api.PageRequest;
import cc.iotkit.common.api.Paging; import cc.iotkit.common.api.Paging;
import cc.iotkit.common.constant.UserConstants; import cc.iotkit.common.constant.UserConstants;
import cc.iotkit.common.satoken.utils.LoginHelper;
import cc.iotkit.common.tenant.helper.TenantHelper;
import cc.iotkit.common.utils.MapstructUtils; import cc.iotkit.common.utils.MapstructUtils;
import cc.iotkit.data.dao.IJPACommData; import cc.iotkit.data.dao.IJPACommData;
import cc.iotkit.data.dao.SysRoleRepository; import cc.iotkit.data.dao.SysRoleRepository;
@ -129,21 +131,54 @@ public class SysRoleDataImpl implements ISysRoleData, IJPACommData<SysRole, Long
@Override @Override
public boolean checkRoleNameUnique(SysRole role) { public boolean checkRoleNameUnique(SysRole role) {
// Long tenantId;
if(ObjectUtil.isNull(role.getTenantId())){
role.setTenantId(TenantHelper.getTenantId());
}
// Long tenantId = role.getTenantId();
else if(TenantHelper.getTenantId() != 0 && ObjectUtil.isNotNull(role.getTenantId())){
role.setTenantId(TenantHelper.getTenantId());
}
/* if(TenantHelper.getTenantId() != 0){
tenantId = TenantHelper.getTenantId();
}else {
tenantId=null;
}*/
final TbSysRole tbSysRoleRes = jpaQueryFactory.select(tbSysRole).from(tbSysRole) final TbSysRole tbSysRoleRes = jpaQueryFactory.select(tbSysRole).from(tbSysRole)
.where(PredicateBuilder.instance() .where(PredicateBuilder.instance()
.and(tbSysRole.roleName.eq(role.getRoleName())) .and(tbSysRole.roleName.eq(role.getRoleName()))
.and(Objects.nonNull(role.getId()), () -> tbSysRole.id.ne(role.getId())) .and(Objects.nonNull(role.getId()), () -> tbSysRole.id.ne(role.getId()))
.and(Objects.nonNull(role.getTenantId()), () -> tbSysRole.tenantId.eq(role.getTenantId()))
.build()).fetchOne(); .build()).fetchOne();
/* if(ObjectUtil.isNotNull(tbSysRoleRes)){
if(tbSysRoleRes.getRoleName().equals(role.getRoleName())){
return true;
}
}*/
return Objects.isNull(tbSysRoleRes); return Objects.isNull(tbSysRoleRes);
} }
@Override @Override
public boolean checkRoleKeyUnique(SysRole role) { public boolean checkRoleKeyUnique(SysRole role) {
if(ObjectUtil.isNull(role.getTenantId())){
role.setTenantId(TenantHelper.getTenantId());
}
// Long tenantId = role.getTenantId();
else if(TenantHelper.getTenantId() != 0 && ObjectUtil.isNotNull(role.getTenantId())){
role.setTenantId(TenantHelper.getTenantId());
}
final TbSysRole tbSysRoleRes = jpaQueryFactory.select(tbSysRole).from(tbSysRole) final TbSysRole tbSysRoleRes = jpaQueryFactory.select(tbSysRole).from(tbSysRole)
.where(PredicateBuilder.instance() .where(PredicateBuilder.instance()
.and(tbSysRole.roleKey.eq(role.getRoleKey())) .and(tbSysRole.roleKey.eq(role.getRoleKey()))
.and(Objects.nonNull(role.getId()), () -> tbSysRole.id.ne(role.getId())) .and(Objects.nonNull(role.getId()), () -> tbSysRole.id.ne(role.getId()))
.and(Objects.nonNull(role.getTenantId()), () -> tbSysRole.tenantId.eq(role.getTenantId()))
.build()).fetchOne(); .build()).fetchOne();
/* if(ObjectUtil.isNotNull(tbSysRoleRes)){
if(tbSysRoleRes.getRoleKey().equals(role.getRoleKey())){
return true;
}
}*/
return Objects.isNull(tbSysRoleRes); return Objects.isNull(tbSysRoleRes);
} }
@ -174,6 +209,7 @@ public class SysRoleDataImpl implements ISysRoleData, IJPACommData<SysRole, Long
@Override @Override
public List<SysRole> selectRoleList(SysRole role) { public List<SysRole> selectRoleList(SysRole role) {
return buildQueryTitle(buildQueryWrapper(role)); return buildQueryTitle(buildQueryWrapper(role));
} }
@ -200,14 +236,39 @@ public class SysRoleDataImpl implements ISysRoleData, IJPACommData<SysRole, Long
} }
private Predicate buildQueryWrapper(SysRole role) { private Predicate buildQueryWrapper(SysRole role) {
if(LoginHelper.isSuperAdmin()) {
if(ObjectUtil.isNull(role.getTenantId())){
role.setTenantId(TenantHelper.getTenantId());
}
// Long tenantId = role.getTenantId();
else if(TenantHelper.getTenantId() != 0 && ObjectUtil.isNotNull(role.getTenantId())){
role.setTenantId(TenantHelper.getTenantId());
}
if(TenantHelper.getTenantId() == 0 && LoginHelper.isSuperAdmin()){
role.setTenantId(null);
}
return PredicateBuilder.instance()
.and(tbSysRole.delFlag.eq(UserConstants.ROLE_NORMAL))
.and(Objects.nonNull(role.getId()), () -> tbSysRole.id.eq(role.getId()))
.and(StringUtils.isNotBlank(role.getRoleName()), () -> tbSysRole.roleName.like("%"+role.getRoleName()+"%"))
.and(StringUtils.isNotBlank(role.getStatus()), () -> tbSysRole.roleName.eq(role.getStatus()))
.and(StringUtils.isNotBlank(role.getRoleKey()), () -> tbSysRole.roleKey.like("%"+role.getRoleKey()+"%"))
.and(ObjectUtil.isNotNull(role.getTenantId()), () -> tbSysRole.tenantId.eq(role.getTenantId()))
.build();
}else{
if(ObjectUtil.isNull(role.getTenantId())){
role.setTenantId(TenantHelper.getTenantId());
}
return PredicateBuilder.instance() return PredicateBuilder.instance()
.and(tbSysRole.delFlag.eq(UserConstants.ROLE_NORMAL)) .and(tbSysRole.delFlag.eq(UserConstants.ROLE_NORMAL))
.and(Objects.nonNull(role.getId()), () -> tbSysRole.id.eq(role.getId())) .and(Objects.nonNull(role.getId()), () -> tbSysRole.id.eq(role.getId()))
.and(StringUtils.isNotBlank(role.getRoleName()), () -> tbSysRole.roleName.like(role.getRoleName())) .and(StringUtils.isNotBlank(role.getRoleName()), () -> tbSysRole.roleName.like("%"+role.getRoleName()+"%"))
.and(StringUtils.isNotBlank(role.getStatus()), () -> tbSysRole.roleName.eq(role.getStatus())) .and(StringUtils.isNotBlank(role.getStatus()), () -> tbSysRole.roleName.eq(role.getStatus()))
.and(StringUtils.isNotBlank(role.getRoleKey()), () -> tbSysRole.roleKey.like(role.getRoleKey())) .and(StringUtils.isNotBlank(role.getRoleKey()), () -> tbSysRole.roleKey.like("%"+role.getRoleKey()+"%"))
.and(ObjectUtil.isNotNull(role.getTenantId()), () -> tbSysRole.tenantId.eq(role.getTenantId())) .and(ObjectUtil.isNotNull(role.getTenantId()), () -> tbSysRole.tenantId.eq(role.getTenantId()))
.build(); .build();
}
} }

@ -36,6 +36,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -89,6 +90,7 @@ public class SysRoleMenuDataImpl implements ISysRoleMenuData, IJPACommData<SysRo
} }
@Override @Override
@Transactional
public long deleteByRoleId(Collection<Long> ids) { public long deleteByRoleId(Collection<Long> ids) {
return jpaQueryFactory.delete(tbSysRoleMenu).where(tbSysRoleMenu.roleId.in(ids)).execute(); return jpaQueryFactory.delete(tbSysRoleMenu).where(tbSysRoleMenu.roleId.in(ids)).execute();
} }

@ -82,13 +82,13 @@ public class SysTenantDataImpl implements ISysTenantData, IJPACommData<SysTenant
public List<SysTenant> findAllByCondition(SysTenant data) { public List<SysTenant> findAllByCondition(SysTenant data) {
List<TbSysTenant> ret=jpaQueryFactory.selectFrom(tbSysTenant).where(PredicateBuilder.instance() List<TbSysTenant> ret=jpaQueryFactory.selectFrom(tbSysTenant).where(PredicateBuilder.instance()
.and(StringUtils.isNotBlank(data.getContactUserName()),()->tbSysTenant.contactUserName.like(data.getContactUserName())) .and(StringUtils.isNotBlank(data.getContactUserName()),()->tbSysTenant.contactUserName.like("%"+data.getContactUserName()+"%"))
.and(StringUtils.isNotBlank(data.getContactPhone()),()->tbSysTenant.contactPhone.eq(data.getContactPhone())) .and(StringUtils.isNotBlank(data.getContactPhone()),()->tbSysTenant.contactPhone.eq(data.getContactPhone()))
.and(StringUtils.isNotBlank(data.getCompanyName()),()->tbSysTenant.companyName.like(data.getCompanyName())) .and(StringUtils.isNotBlank(data.getCompanyName()),()->tbSysTenant.companyName.like("%"+data.getCompanyName()+"%"))
.and(StringUtils.isNotBlank(data.getLicenseNumber()),()->tbSysTenant.licenseNumber.eq(data.getLicenseNumber())) .and(StringUtils.isNotBlank(data.getLicenseNumber()),()->tbSysTenant.licenseNumber.eq(data.getLicenseNumber()))
.and(StringUtils.isNotBlank(data.getAddress()),()->tbSysTenant.address.eq(data.getAddress())) .and(StringUtils.isNotBlank(data.getAddress()),()->tbSysTenant.address.eq(data.getAddress()))
.and(StringUtils.isNotBlank(data.getIntro()),()->tbSysTenant.intro.eq(data.getIntro())) .and(StringUtils.isNotBlank(data.getIntro()),()->tbSysTenant.intro.eq(data.getIntro()))
.and(StringUtils.isNotBlank(data.getDomain()),()->tbSysTenant.domain.like(data.getDomain())) .and(StringUtils.isNotBlank(data.getDomain()),()->tbSysTenant.domain.like("%"+data.getDomain()+"%"))
.and(data.getPackageId() != null,()->tbSysTenant.packageId.eq(data.getPackageId())) .and(data.getPackageId() != null,()->tbSysTenant.packageId.eq(data.getPackageId()))
.and(data.getExpireTime() != null,()->tbSysTenant.expireTime.eq(data.getExpireTime())) .and(data.getExpireTime() != null,()->tbSysTenant.expireTime.eq(data.getExpireTime()))
.and(data.getAccountCount() != null,()->tbSysTenant.accountCount.eq(data.getAccountCount())) .and(data.getAccountCount() != null,()->tbSysTenant.accountCount.eq(data.getAccountCount()))

@ -26,12 +26,14 @@ package cc.iotkit.data.service;
import cc.iotkit.common.api.PageRequest; import cc.iotkit.common.api.PageRequest;
import cc.iotkit.common.api.Paging; import cc.iotkit.common.api.Paging;
import cc.iotkit.common.constant.UserConstants; import cc.iotkit.common.constant.UserConstants;
import cc.iotkit.common.satoken.utils.LoginHelper;
import cc.iotkit.common.tenant.helper.TenantHelper; import cc.iotkit.common.tenant.helper.TenantHelper;
import cc.iotkit.common.utils.MapstructUtils; import cc.iotkit.common.utils.MapstructUtils;
import cc.iotkit.common.utils.StreamUtils; import cc.iotkit.common.utils.StreamUtils;
import cc.iotkit.common.utils.StringUtils; import cc.iotkit.common.utils.StringUtils;
import cc.iotkit.data.dao.IJPACommData; import cc.iotkit.data.dao.IJPACommData;
import cc.iotkit.data.dao.SysUserRepository; import cc.iotkit.data.dao.SysUserRepository;
import cc.iotkit.data.model.QTbSysUser;
import cc.iotkit.data.model.TbSysPost; import cc.iotkit.data.model.TbSysPost;
import cc.iotkit.data.model.TbSysRole; import cc.iotkit.data.model.TbSysRole;
import cc.iotkit.data.model.TbSysUser; import cc.iotkit.data.model.TbSysUser;
@ -54,6 +56,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.sql.Date; import java.sql.Date;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
@ -257,8 +260,8 @@ public class SysUserDataImpl implements ISysUserData, IJPACommData<SysUser, Long
SysUser data = to.getData(); SysUser data = to.getData();
PredicateBuilder builder = PredicateBuilder.instance() PredicateBuilder builder = PredicateBuilder.instance()
.and(StringUtils.isNotBlank(data.getPhonenumber()), () -> tbSysUser.phonenumber.like(data.getPhonenumber())) .and(StringUtils.isNotBlank(data.getPhonenumber()), () -> tbSysUser.phonenumber.like("%"+data.getPhonenumber()+"%"))
.and(StringUtils.isNotBlank(data.getUserName()), () -> tbSysUser.userName.like(data.getUserName())) .and(StringUtils.isNotBlank(data.getUserName()), () -> tbSysUser.userName.like("%"+data.getUserName()+"%"))
.and(StringUtils.isNotBlank(data.getStatus()), () -> tbSysUser.status.eq(data.getStatus())) .and(StringUtils.isNotBlank(data.getStatus()), () -> tbSysUser.status.eq(data.getStatus()))
.and(Objects.nonNull(data.getDeptId()), () -> tbSysUser.deptId.eq(data.getDeptId())) .and(Objects.nonNull(data.getDeptId()), () -> tbSysUser.deptId.eq(data.getDeptId()))
.and(tbSysUser.delFlag.eq(UserConstants.ROLE_NORMAL)) .and(tbSysUser.delFlag.eq(UserConstants.ROLE_NORMAL))
@ -300,13 +303,15 @@ public class SysUserDataImpl implements ISysUserData, IJPACommData<SysUser, Long
SysUser data = to.getData(); SysUser data = to.getData();
PredicateBuilder builder = PredicateBuilder.instance(); PredicateBuilder builder = PredicateBuilder.instance();
if (Objects.nonNull(data)) { if (Objects.nonNull(data)) {
builder.and(StringUtils.isNotBlank(data.getPhonenumber()), () -> tbSysUser.phonenumber.like(data.getPhonenumber())) builder.and(StringUtils.isNotBlank(data.getPhonenumber()), () -> tbSysUser.phonenumber.like("%"+data.getPhonenumber()+"%"))
.and(StringUtils.isNotBlank(data.getUserName()), () -> tbSysUser.userName.like(data.getUserName())) .and(StringUtils.isNotBlank(data.getUserName()), () -> tbSysUser.userName.like("%"+data.getUserName()+"%"))
.and(StringUtils.isNotBlank(data.getStatus()), () -> tbSysUser.status.eq(data.getStatus())) .and(StringUtils.isNotBlank(data.getStatus()), () -> tbSysUser.status.eq(data.getStatus()))
.and(Objects.nonNull(data.getDeptId()), () -> tbSysUser.deptId.eq(data.getDeptId())) .and(Objects.nonNull(data.getDeptId()), () -> tbSysUser.deptId.eq(data.getDeptId()))
.and(tbSysUser.delFlag.eq(UserConstants.ROLE_NORMAL)); .and(tbSysUser.delFlag.eq(UserConstants.ROLE_NORMAL));
} }
if(!LoginHelper.isSuperAdmin()) {
builder.and(tbSysUser.tenantId.eq(TenantHelper.getTenantId()));
}
QueryResults<SysUser> sysUserQueryResults = jpaQueryFactory.select(Projections.bean(SysUser.class, tbSysUser.id, tbSysUser.deptId, tbSysUser.userName, QueryResults<SysUser> sysUserQueryResults = jpaQueryFactory.select(Projections.bean(SysUser.class, tbSysUser.id, tbSysUser.deptId, tbSysUser.userName,
tbSysUser.nickName, tbSysUser.email, tbSysUser.phonenumber, tbSysUser.createTime)).from(tbSysUser) tbSysUser.nickName, tbSysUser.email, tbSysUser.phonenumber, tbSysUser.createTime)).from(tbSysUser)
.leftJoin(tbSysDept).on(tbSysUser.deptId.eq(tbSysDept.id)) .leftJoin(tbSysDept).on(tbSysUser.deptId.eq(tbSysDept.id))
@ -324,6 +329,12 @@ public class SysUserDataImpl implements ISysUserData, IJPACommData<SysUser, Long
.build()).fetchOne(); .build()).fetchOne();
return MapstructUtils.convert(user, SysUser.class); return MapstructUtils.convert(user, SysUser.class);
} }
@Override
public List<SysUser> findByTenantId(Long tenantId) {
return MapstructUtils.convert(userRepository.findByTenantId(tenantId), SysUser.class);
}
@Override @Override
public Paging<SysUser> findAll(PageRequest<SysUser> pageRequest) { public Paging<SysUser> findAll(PageRequest<SysUser> pageRequest) {
@ -359,8 +370,12 @@ public class SysUserDataImpl implements ISysUserData, IJPACommData<SysUser, Long
List<Long> areaIds; List<Long> areaIds;
if (Objects.nonNull(user) && Objects.nonNull(user.getDeptAreaId())) { if (Objects.nonNull(user) && Objects.nonNull(user.getDeptAreaId())) {
Long deptId = user.getDeptAreaId(); Long deptId = user.getDeptAreaId();
if(!user.isFlag()) {
List<SysDept> depts = sysDeptData.findByDeptId(deptId); List<SysDept> depts = sysDeptData.findByDeptId(deptId);
areaIds = StreamUtils.toList(depts, SysDept::getId); areaIds = StreamUtils.toList(depts, SysDept::getId);
} else {
areaIds = new ArrayList<>();
}
areaIds.add(deptId); areaIds.add(deptId);
} else { } else {
areaIds = null; areaIds = null;

@ -22,19 +22,42 @@
*/ */
package cc.iotkit.data.service; package cc.iotkit.data.service;
import cc.iotkit.common.api.PageRequest;
import cc.iotkit.common.api.Paging;
import cc.iotkit.common.satoken.utils.LoginHelper;
import cc.iotkit.common.tenant.helper.TenantHelper;
import cc.iotkit.common.utils.MapstructUtils; import cc.iotkit.common.utils.MapstructUtils;
import cc.iotkit.common.utils.StringUtils;
import cc.iotkit.data.dao.IJPACommData; import cc.iotkit.data.dao.IJPACommData;
import cc.iotkit.data.dao.UserInfoRepository; import cc.iotkit.data.dao.UserInfoRepository;
import cc.iotkit.data.manager.IUserInfoData; import cc.iotkit.data.manager.IUserInfoData;
import cc.iotkit.data.model.TbUserInfo; import cc.iotkit.data.model.TbUserInfo;
import cc.iotkit.data.util.PageBuilder;
import cc.iotkit.data.util.PredicateBuilder;
import cc.iotkit.model.UserInfo; import cc.iotkit.model.UserInfo;
import cn.hutool.core.util.ObjectUtil;
import com.querydsl.core.types.Predicate;
import com.querydsl.core.types.dsl.Expressions;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.Page;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.QueryHints;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.persistence.QueryHint;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects;
import static cc.iotkit.data.model.QTbSysDept.tbSysDept;
import static cc.iotkit.data.model.QTbUserInfo.tbUserInfo;
@Primary @Primary
@Service @Service
@ -48,12 +71,40 @@ public class UserInfoDataImpl implements IUserInfoData, IJPACommData<UserInfo, L
public UserInfo findByUid(String uid) { public UserInfo findByUid(String uid) {
return MapstructUtils.convert(userInfoRepository.findByUid(uid), UserInfo.class); return MapstructUtils.convert(userInfoRepository.findByUid(uid), UserInfo.class);
} }
@Override
public UserInfo findByUidAndUserName(String uid,String userName) {
return MapstructUtils.convert(userInfoRepository.findByUidAndUserName(uid,userName), UserInfo.class);
}
@Override
public UserInfo findByUserName(String userName) {
return MapstructUtils.convert(userInfoRepository.findByUserName(userName), UserInfo.class);
}
@Override @Override
public List<UserInfo> findByType(int type) { public List<UserInfo> findByType(int type) {
return MapstructUtils.convert(userInfoRepository.findByType(type), UserInfo.class); return MapstructUtils.convert(userInfoRepository.findByType(type), UserInfo.class);
} }
@Override
@QueryHints(@QueryHint(name = "org.hibernate.fetchSize", value = "1000"))
public Paging<UserInfo> findAll(PageRequest<UserInfo> pageRequest) {
// PredicateBuilder predicateBuilder = new PredicateBuilder(tbUserInfo.id.isNotNull());
PredicateBuilder predicateBuilder = PredicateBuilder.instance();
predicateBuilder.and(ObjectUtil.isNotNull(pageRequest.getData().getUserName()), () -> tbUserInfo.userName.like("%"+pageRequest.getData().getUserName() +"%"));
predicateBuilder.and(ObjectUtil.isNotNull(pageRequest.getData().getNickName()), () -> tbUserInfo.nickName.like("%"+pageRequest.getData().getNickName()+"%"));
predicateBuilder.and(ObjectUtil.isNotNull(pageRequest.getData().getEmail()), () -> tbUserInfo.email.like("%"+pageRequest.getData().getEmail()+"%"));
predicateBuilder.and(ObjectUtil.isNotNull(pageRequest.getData().getType()), () -> tbUserInfo.type.eq(pageRequest.getData().getType()));
predicateBuilder.and(ObjectUtil.isNotEmpty(pageRequest.getData().getDeptAreaIds()), () -> tbUserInfo.deptAreaId.in(pageRequest.getData().getDeptAreaIds()));
if(!LoginHelper.isSuperAdmin()){
predicateBuilder.and(ObjectUtil.isNotNull(pageRequest.getData().getTenantId()), () -> tbUserInfo.tenantId.eq(pageRequest.getData().getTenantId()));
}
if(LoginHelper.isSuperAdmin() && TenantHelper.getTenantId() != 0) {
predicateBuilder.and(ObjectUtil.isNotNull(TenantHelper.getTenantId()), () -> tbUserInfo.tenantId.eq(TenantHelper.getTenantId()));
}
/* if(LoginHelper.isSuperAdmin()){
predicateBuilder.or(ObjectUtil.isNotNull(pageRequest.getData().getType()), () ->tbUserInfo.id.ne(1L) );
}*/
return PageBuilder.toPaging(userInfoRepository.findAll(predicateBuilder.build(), PageBuilder.toPageable(pageRequest)), UserInfo.class);
}
@Override @Override
public JpaRepository getBaseRepository() { public JpaRepository getBaseRepository() {
return userInfoRepository; return userInfoRepository;

@ -23,6 +23,7 @@
package cc.iotkit.data.service; package cc.iotkit.data.service;
import cc.iotkit.common.satoken.utils.LoginHelper; import cc.iotkit.common.satoken.utils.LoginHelper;
import cc.iotkit.common.tenant.helper.TenantHelper;
import cc.iotkit.data.dao.IJPACommData; import cc.iotkit.data.dao.IJPACommData;
import cc.iotkit.data.manager.IVirtualDeviceData; import cc.iotkit.data.manager.IVirtualDeviceData;
import cc.iotkit.data.dao.VirtualDeviceMappingRepository; import cc.iotkit.data.dao.VirtualDeviceMappingRepository;
@ -131,7 +132,7 @@ public class VirtualDeviceDataImpl implements IVirtualDeviceData, IJPACommData<V
data.getDevices().stream().map(d -> new TbVirtualDeviceMapping( data.getDevices().stream().map(d -> new TbVirtualDeviceMapping(
IdUtil.simpleUUID(), IdUtil.simpleUUID(),
data.getId(), data.getId(),
d, LoginHelper.getTenantId() d, TenantHelper.getTenantId()
)).collect(Collectors.toList()) )).collect(Collectors.toList())
); );
return data; return data;

@ -23,6 +23,35 @@
<groupId>cc.iotkit</groupId> <groupId>cc.iotkit</groupId>
<artifactId>iot-common-core</artifactId> <artifactId>iot-common-core</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.27</version>
</dependency>
<!-- 核心聚合包含基础API -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.2.5</version>
<type>pom</type>
</dependency>
<!-- 必须显式添加表格支持模块 -->
<!-- <dependency>
<groupId>com.itextpdf</groupId>
<artifactId>layout</artifactId>
<version>7.2.5</version>
</dependency>
&lt;!&ndash; 中文支持(按需添加) &ndash;&gt;
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>font-asian</artifactId>
<version>7.2.5</version>
</dependency>-->
<dependency> <dependency>
<groupId>cc.iotkit</groupId> <groupId>cc.iotkit</groupId>
@ -107,6 +136,14 @@
</dependencies> </dependencies>
<build> <build>
<resources>
<resource>
<directory>src/main/java/cc/fonts</directory>
<includes>
<include>fonts/*.ttf</include>
</includes>
</resource>
</resources>
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>

@ -0,0 +1,291 @@
package cc.iotkit.manager.config;
import cc.iotkit.model.device.DeviceInstallInfo;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
public class GasInstallationPDFGenerator {
private static final float IMAGE_MARGIN = 50f;
private static final float TITLE_HEIGHT = 600f;
public static void main(String[] args) {
File fontFile = new File("D:\\simsun.ttf");
if(fontFile.exists()) {
System.out.println("Actual font path: " + fontFile.getAbsolutePath());
}
}
/* private static void drawTable(PDPageContentStream contentStream, PDType0Font font,
float startX, float startY,
String[][] data, float[] columnWidths) throws IOException {
contentStream.setFont(font, 12);
float rowHeight = 20f;
float tableWidth = 0;
for (float width : columnWidths) {
tableWidth += width;
}
// 绘制表格边框
contentStream.setLineWidth(1f);
contentStream.addRect(startX, startY - rowHeight * data.length, tableWidth, rowHeight * data.length);
contentStream.stroke();
// 绘制单元格
float nextX = startX;
for (int i = 0; i < data.length; i++) {
nextX = startX;
for (int j = 0; j < data[i].length; j++) {
// 绘制垂直线
if (j > 0) {
contentStream.moveTo(nextX, startY - rowHeight * i);
contentStream.lineTo(nextX, startY - rowHeight * (i + 1));
contentStream.stroke();
}
// 写入文本
contentStream.beginText();
contentStream.newLineAtOffset(nextX + 5, startY - rowHeight * (i + 1) + 5);
contentStream.showText(data[i][j]);
contentStream.endText();
nextX += columnWidths[j];
}
}
}*/
/* private static void drawTable(PDPageContentStream cs, PDType0Font font,
float x, float y, String[][] data, float[] colWidths) throws IOException {
float rowHeight = 20f;
float tableWidth = 0;
for (float width : colWidths) {
tableWidth += width;
}
// 绘制表格线
cs.setLineWidth(1f);
cs.addRect(x, y - rowHeight * data.length, tableWidth, rowHeight * data.length);
cs.stroke();
// 绘制单元格内容
for (int i = 0; i < data.length; i++) {
float nextX = x;
for (int j = 0; j < data[i].length; j++) {
if (j > 0) {
cs.moveTo(nextX, y - rowHeight * i);
cs.lineTo(nextX, y - rowHeight * (i + 1));
cs.stroke();
}
drawText(cs, data[i][j], nextX + 5, y - rowHeight * i + 5);
nextX += colWidths[j];
}
}
}*/
/**
PDF
@param cs PDF
@param font
@param x X
@param y Y
@param data
@param colWidths
*/
private static void drawTable(PDPageContentStream cs, PDType0Font font,
float x, float y, String[][] data, float[] colWidths) throws IOException {
// 修改后的表格绘制代码
if (data == null || data.length == 0 || colWidths == null) return;
final float ROW_HEIGHT = 35f; // 增大行高以适应更大字体
final float FONT_SIZE = 14f; // 增大字体大小
final float PADDING = 5f;
// 计算表格总宽度
float tableWidth = 0;
for (float width : colWidths) {
tableWidth += width;
}
// 绘制表格边框和分隔线(保持不变)
cs.setLineWidth(1f);
cs.addRect(x, y - ROW_HEIGHT * data.length, tableWidth, ROW_HEIGHT * data.length);
cs.stroke();
// 绘制列分隔线
float currentX = x;
for (int i = 1; i < colWidths.length; i++) {
currentX += colWidths[i-1];
cs.moveTo(currentX, y);
cs.lineTo(currentX, y - ROW_HEIGHT * data.length);
cs.stroke();
}
// 绘制行分隔线
for (int i = 1; i <= data.length; i++) {
cs.moveTo(x, y - ROW_HEIGHT * i);
cs.lineTo(x + tableWidth, y - ROW_HEIGHT * i);
cs.stroke();
}
// 填写表格内容(关键修改部分)
cs.setFont(font, FONT_SIZE);
for (int row = 0; row < data.length; row++) {
currentX = x;
for (int col = 0; col < data[row].length; col++) {
String text = data[row][col] != null ? data[row][col] : "";
// 计算文本宽度
float textWidth = font.getStringWidth(text) / 1000 * FONT_SIZE;
float centerOffset = (colWidths[col] - textWidth) / 2;
// 修正垂直居中计算(关键修改)
float baselineOffset = (ROW_HEIGHT - FONT_SIZE) / 3; // 更精确的基线计算
cs.beginText();
cs.newLineAtOffset(
currentX + centerOffset,
y - (ROW_HEIGHT * row) - FONT_SIZE - baselineOffset // 修正垂直位置
);
cs.showText(text);
cs.endText();
currentX += colWidths[col];
}
}
}
public static void generateInstallationPDF(DeviceInstallInfo entity, OutputStream outputPath) throws IOException {
try (PDDocument document = new PDDocument()) {
// 创建第一页 - 基本信息
PDPage page1 = new PDPage(PDRectangle.A4);
document.addPage(page1);
try (PDPageContentStream contentStream = new PDPageContentStream(document, page1)) {
File fontFile = new File("D:/simsun.ttf");
PDType0Font yaHeiFont = PDType0Font.load(document, fontFile);
// 绘制标题(居中)
contentStream.setFont(yaHeiFont, 26f);
float titleWidth = yaHeiFont.getStringWidth("贵阳户内安装信息录入表") / 1000 * 26f;
contentStream.beginText();
contentStream.newLineAtOffset((PDRectangle.A4.getWidth() - titleWidth)/2, 750);
contentStream.showText("贵阳户内安装信息录入表");
contentStream.endText();
// 基本信息表格
String[][] baseInfo = {
{"安装班组", entity.getProposerTeam()},
{"安装人", entity.getProposer()},
{"安装时间", entity.getProposerTime().toString()},
{"小区名称", entity.getCommunityName()},
{"楼栋号", entity.getBuildingUnit()},
{"单元号", entity.getBuildingUnit() != null ? entity.getBuildingUnit().split("-")[0] : ""},
{"房号", entity.getRoomNo()},
{"用户姓名", entity.getUserName()},
{"联系方式", entity.getUserIpone()},
{"灶具类型", entity.getDeviceName() != null ?
(entity.getDeviceName().contains("台式") ? "台式灶" : "嵌入式灶") : ""}
};
drawTable(contentStream, yaHeiFont, 100, 700, baseInfo, new float[]{80f, 300f});
} catch (Exception e) {
throw new RuntimeException(e);
}
// 创建后续页面 - 图片部分
addImagePages(document, entity);
// 保存到D盘
document.save("D:/output.pdf");
document.save(outputPath);
PDRectangle mediaBox = page1.getMediaBox();
System.out.printf("页面尺寸: %.1f x %.1f%n", mediaBox.getWidth(), mediaBox.getHeight());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private static void addImagePages(PDDocument document, DeviceInstallInfo entity) throws IOException {
// 安装前图片页
if (entity.getBeforeInstallationImage() != null) {
addImagePage(document, "安装前图片(拍清晰、无遮挡)",
entity.getBeforeInstallationImage());
}
// 安装后图片页
if (entity.getInstallThePanoramicImage() != null) {
addImagePage(document, "安装后图片(拍清晰、无遮挡)",
entity.getInstallThePanoramicImage());
}
// 测漏图片页
if (entity.getSideLeakageImage() != null) {
addImagePage(document, "灶具接口测漏图片(拍清晰、无遮挡)",
entity.getSideLeakageImage());
}
// 点火图片页
if (entity.getIgnitionPictureImage() != null) {
addImagePage(document, "安装后点火图片(拍清晰、无遮挡)",
entity.getIgnitionPictureImage());
}
// 工单签字页
if (entity.getWorkOrderImage() != null) {
addImagePage(document, "工单用户签字图片(拍清晰、无遮挡)",
entity.getWorkOrderImage());
}
// 打孔图片页
if (entity.getPunchingImage() != null) {
addImagePage(document, "打孔图片(拍清晰、无遮挡)",
entity.getPunchingImage());
}
}
private static void addImagePage(PDDocument document, String title, String imagePath) throws IOException {
PDPage page = new PDPage(PDRectangle.A4);
document.addPage(page);
// PDPage page = document.getPage(document.getNumberOfPages()-1);
// 创建表格样式
float margin = 50;
float yPosition = 700;
float tableWidth = 380;
float rowHeight = 40;
try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
File fontFile = new File("D:/simsun.ttf");
PDType0Font yaHeiFont = PDType0Font.load(document, fontFile);
// 左侧标题列
// 绘制表格边框
// 绘制表格边框
contentStream.setFont(yaHeiFont, 14);
contentStream.setLineWidth(1f);
contentStream.addRect(margin, yPosition - rowHeight, tableWidth, rowHeight);
contentStream.stroke();
// 居中显示标题
float titleWidth = yaHeiFont.getStringWidth(title) / 1000 * 14;
float titleX = margin + (tableWidth - titleWidth) / 2;
float titleY = yPosition - rowHeight / 2 - 5; // 垂直居中微调
contentStream.beginText();
contentStream.newLineAtOffset(titleX, titleY);
contentStream.showText(title);
contentStream.endText();
// 计算图片位置(表格下方)
float imageY = yPosition - rowHeight - 20;
// 添加图片(居中显示)
URL imageUrl = new URL(imagePath);
PDImageXObject image = PDImageXObject.createFromByteArray(document,
imageUrl.openStream().readAllBytes(),"minio-image");
float scale = calculateScale(image, page);
float imageX = (page.getMediaBox().getWidth() - image.getWidth()*scale) / 2;
contentStream.drawImage(image, imageX, imageY - image.getHeight()*scale,
image.getWidth()*scale, image.getHeight()*scale);
}
}
private static float calculateScale(PDImageXObject image, PDPage page) {
float pageWidth = page.getMediaBox().getWidth() - 2*IMAGE_MARGIN;
return Math.min(1f, pageWidth / image.getWidth());
}
}

@ -0,0 +1,708 @@
package cc.iotkit.manager.config;
import cc.iotkit.model.device.DeviceInstallInfo;
import cn.hutool.core.util.ObjectUtil;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import java.util.*;
import java.util.stream.Collectors;
import static cc.iotkit.manager.config.PDFUtils.drawAlignedText;
public class PDFGenerator {
// 1. 表格参数配置
// 参数配置(优化后)
private static final float FONT_SIZE = 11f;
private static final float ROW_HEIGHT = 35f;
private static final float TABLE_MARGIN = 50f;
private static final float LEFT_COL_WIDTH = 130f;
private static final float RIGHT_COL_WIDTH = 350f;
private static final float LINE_HEIGHT = FONT_SIZE * 1.2f;
private static final float CELL_PADDING = 5;
private static final float[] COLUMN_WIDTHS = {LEFT_COL_WIDTH, RIGHT_COL_WIDTH};
private static final float MIN_IMAGE_HEIGHT = 50;
public static void generateInstallationPDF(DeviceInstallInfo entity, OutputStream outputStream) throws IOException {
try (PDDocument document = new PDDocument()) {
// 加载字体(需替换实际路径)
//PDType0Font font = PDType0Font.load(document, new File("D:\\simsun.ttf"));
PDType0Font font = PDType0Font.load(document, new File("/ttf/simsun.ttf"));
// 初始化第一页
PDPage currentPage = new PDPage(PDRectangle.A4);
document.addPage(currentPage);
PDPageContentStream cs = new PDPageContentStream(document, currentPage);
float currentY = PDRectangle.A4.getHeight() - TABLE_MARGIN;
try {
// 1. 绘制标题(居中)
drawCenteredText(cs, font, FONT_SIZE+10,
"安装信息录入表",
PDRectangle.A4.getWidth()/2, currentY);
currentY -= ROW_HEIGHT * 1.5f;
// 2. 绘制基本信息表格
String[][] baseData = {
// {"公司名称", entity.getCorporateName()},
{"申请时间", entity.getProposerTime().toString()},
{"申请人", entity.getProposer()},
{"申请人班组", entity.getProposerTeam()},
{"小区名字", entity.getCommunityName()},
{"用户姓名", entity.getUserName()},
{"电话", entity.getUserIpone()},
{"楼栋单元号", entity.getBuildingUnit()},
{"房间号", entity.getRoomNo()},
{"报警器编号", entity.getDeviceName()},
{"切断阀编号", entity.getShutValueNumber()},
{"燃气表号", entity.getGasMeterNumber()},
{"备注", entity.getBuildingUnit()}
};
drawTable(cs, font, TABLE_MARGIN, currentY, baseData, COLUMN_WIDTHS);
currentY -= (ROW_HEIGHT * baseData.length) + 20f;
// @ApiModelProperty(value = "安装前图片")
// 创建后续页面 - 图片部分
// 图片处理(带自动分页)
// 图片处理(带自动分页)
List<String[]> imageGroups = Arrays.asList(
new String[]{entity.getBeforeInstallationImage(), "安装前图片"},
new String[]{entity.getWorkingOfTheDetectorImage(), "安装完成探测器工作图片"},
new String[]{entity.getSideLeakageImage(), "测漏图片"},
new String[]{entity.getIgnitionPictureImage(), "点火图片"},
new String[]{entity.getInstallThePanoramicImage(), "安装完成全景图片"},
new String[]{entity.getOfGasMeterImage(), "燃气表图片"},
new String[]{entity.getWorkOrderImage(), "工单图片"},
new String[]{entity.getPunchingImage(), "打孔图片"},
new String[]{entity.getFiexImage(), "安装电源线图片"}
);
for (String[] group : imageGroups) {
String urls = group[0];
String title = group[1];
if (urls != null && !urls.trim().isEmpty()) {
List<String> validUrls = Arrays.stream(urls.split(","))
.map(String::trim)
.filter(url -> !url.isEmpty() && url.startsWith("http"))
.collect(Collectors.toList());
if (!validUrls.isEmpty()) {
// float totalHeight = calculateTotalHeight(validUrls);
List<String> wrappedTitleLines = wrapText(title,LEFT_COL_WIDTH - 2 * CELL_PADDING);
float titleHeight = wrappedTitleLines.size() * LINE_HEIGHT;
// 计算图片组的自适应高度
float imagesHeight = calculateAdjustedImagesHeight(document, validUrls,
RIGHT_COL_WIDTH - 2 * CELL_PADDING,
PDRectangle.A4.getHeight() - 2 * TABLE_MARGIN - titleHeight);
float totalHeight = Math.max(imagesHeight, titleHeight);
if (currentY < TABLE_MARGIN + Math.max(totalHeight, titleHeight)) {
cs.close();
currentPage = new PDPage(PDRectangle.A4);
document.addPage(currentPage);
cs = new PDPageContentStream(document, currentPage);
currentY = PDRectangle.A4.getHeight() - TABLE_MARGIN;
}
drawImageGroup(cs, document, font, wrappedTitleLines, validUrls, currentY,
Math.max(totalHeight, titleHeight));
currentY -= Math.max(totalHeight, titleHeight);
}
}
}
} finally {
cs.close();
}
// document.save("D:/output.pdf");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
document.save(baos);
outputStream.flush();
baos.writeTo(outputStream);
// document.save(outputStream);
}
}
private static List<String> wrapText(String text, float maxWidth) {
List<String> lines = new ArrayList<>();
int maxCharsPerLine = (int)(maxWidth / (FONT_SIZE * 0.5f)); // 中文字符估算
StringBuilder currentLine = new StringBuilder();
for (String word : text.split("")) {
if (currentLine.length() + word.length() <= maxCharsPerLine) {
currentLine.append(word);
} else {
lines.add(currentLine.toString());
currentLine = new StringBuilder(word);
}
}
if (currentLine.length() > 0) {
lines.add(currentLine.toString());
}
return lines;
}
private static float calculateTotalHeight(List<String> imageUrls) throws IOException {
float totalHeight = 0;
for (String url : imageUrls) {
totalHeight += estimateImageHeight(url, RIGHT_COL_WIDTH - 10) + 10;
}
return totalHeight;
}
/* private static float calculateAdjustedImagesHeight(PDDocument doc, List<String> imageUrls,
float maxWidth, float maxHeight) throws IOException {
if (imageUrls.isEmpty()) return 0;
// 1. 预加载所有图片并收集尺寸信息
List<PDImageXObject> images = new ArrayList<>();
for (String url : imageUrls) {
try {
PDImageXObject image = PDImageXObject.createFromByteArray(doc,
new URL(url).openStream().readAllBytes(), "embedded-image");
images.add(image);
} catch (IOException e) {
// 跳过加载失败的图片
continue;
}
}
// 2. 计算统一缩放比例
float uniformScale = Float.MAX_VALUE;
int validImageCount = images.size();
float availableHeightPerImage = (maxHeight - (validImageCount-1)*10f) / validImageCount; // 10为图片间距
for (PDImageXObject image : images) {
// 计算当前图片的最大允许缩放比例
float widthScale = maxWidth / image.getWidth();
float heightScale = availableHeightPerImage / image.getHeight();
float minScale = Math.min(widthScale, heightScale);
// 取所有图片中最小的缩放比例作为统一比例
uniformScale = Math.min(uniformScale, minScale);
}
// 3. 应用最小高度限制
uniformScale = Math.max(uniformScale, MIN_IMAGE_HEIGHT /
images.stream().map(img -> (float)img.getHeight()).max(Float::compare).orElse(1f));
// images.stream().mapToFloat(PDImageXObject::getHeight).max().orElse(1f));
// 4. 计算总高度(所有图片统一缩放后的高度 + 间距)
float totalHeight = 0;
for (PDImageXObject image : images) {
float scaledHeight = image.getHeight() * uniformScale;
totalHeight += scaledHeight + 10; // 10为图片间距
if (totalHeight > maxHeight) {
totalHeight -= scaledHeight + 10; // 移除超出的部分
break;
}
}
return totalHeight;
}*/
private static float calculateAdjustedImagesHeight(PDDocument doc, List<String> imageUrls,
float maxWidth, float maxHeight) throws IOException {
float totalHeight = 0;
float remainingHeight = maxHeight;
for (String url : imageUrls) {
PDImageXObject image = PDImageXObject.createFromByteArray(doc,
new URL(url).openStream().readAllBytes(), "embedded-image");
// 计算图片的缩放比例
float scale = Math.min(
maxWidth / image.getWidth(),
remainingHeight / image.getHeight()
);
// 确保图片高度不小于最小值
float scaledHeight = Math.max(
image.getHeight() * scale,
MIN_IMAGE_HEIGHT
);
totalHeight += scaledHeight + 10; // 10是图片间距
remainingHeight -= scaledHeight + 10;
if (remainingHeight <= 0) {
break; // 超出可用高度则停止添加图片
}
}
return totalHeight;
}
private static void drawImageGroup(PDPageContentStream cs, PDDocument doc, PDType0Font font,
List<String> titleLines, List<String> imageUrls,
float startY, float totalHeight) throws IOException {
// float currentImageY = startY - CELL_PADDING;
// 绘制单元格边框
cs.setLineWidth(0.5f);
cs.addRect(TABLE_MARGIN, startY - totalHeight, LEFT_COL_WIDTH, totalHeight);
cs.addRect(TABLE_MARGIN + LEFT_COL_WIDTH, startY - totalHeight, RIGHT_COL_WIDTH, totalHeight);
cs.stroke();
// 计算文本总高度
float textHeight = titleLines.size() * LINE_HEIGHT;
float textStartY = startY - (totalHeight / 2) + (textHeight / 2);
// 在左侧单元格绘制标题(带自动换行)
cs.beginText();
cs.setFont(font, FONT_SIZE);
for (String line : titleLines) {
// 检查文本是否超出单元格宽度
/* float textWidth = font.getStringWidth(line) / 1000 * FONT_SIZE;
if (textWidth > LEFT_COL_WIDTH - 2*CELL_PADDING) {
line = TextUtils.truncateWithEllipsis(line, font,LEFT_COL_WIDTH - 2*CELL_PADDING);
}*/
cs.newLineAtOffset(TABLE_MARGIN + CELL_PADDING, textStartY);
cs.showText(line);
textStartY -= LINE_HEIGHT;
}
cs.endText();
float availableWidth = RIGHT_COL_WIDTH - 2 * CELL_PADDING;
float remainingHeight = totalHeight - 2 * CELL_PADDING;
// 在右侧单元格绘制图片
float currentImageY = startY - 10;
for (String url : imageUrls) {
PDImageXObject image = PDImageXObject.createFromByteArray(doc,
new URL(url).openStream().readAllBytes(), "embedded-image");
// 计算图片的缩放比例
float scale = Math.min(
availableWidth / image.getWidth(),
remainingHeight / image.getHeight()
);
// 确保图片高度不小于最小值
float scaledHeight = Math.max(
image.getHeight() * scale,
MIN_IMAGE_HEIGHT
);
float scaledWidth = image.getWidth() * scale;
cs.drawImage(image,
TABLE_MARGIN + LEFT_COL_WIDTH + CELL_PADDING,
currentImageY - scaledHeight,
scaledWidth, scaledHeight);
currentImageY -= scaledHeight + CELL_PADDING;
remainingHeight -= scaledHeight + CELL_PADDING;
if (remainingHeight <= 0) {
break; // 超出可用高度则停止绘制
}
/* float imageWidth = RIGHT_COL_WIDTH - 10;
float height = imageWidth * image.getHeight() / image.getWidth();
cs.drawImage(image,
TABLE_MARGIN + LEFT_COL_WIDTH + 5,
currentImageY - height,
imageWidth, height);
currentImageY -= height + 10;*/
}
}
// 截断超长文本
private static String truncateText(PDType0Font font,String text, float maxWidth) throws IOException {
// PDType0Font font = ...; // 获取字体对象
StringBuilder sb = new StringBuilder();
float currentWidth = 0;
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
float charWidth = font.getStringWidth(String.valueOf(c)) / 1000 * FONT_SIZE;
if (currentWidth + charWidth > maxWidth) {
break;
}
sb.append(c);
currentWidth += charWidth;
}
return sb.toString();
}
// 新增方法:计算文本高度(考虑换行)
private static float getTextHeight(String text, float maxWidth, PDType0Font font, float fontSize) throws IOException {
if (text == null || text.isEmpty()) {
return 0;
}
// 简单估算:假设每个中文字符宽度等于字体大小
int charsPerLine = (int)(maxWidth / fontSize);
int lineCount = (int)Math.ceil((double)text.length() / charsPerLine);
return lineCount * fontSize * 1.2f; // 行间距1.2倍
}
// 改进方法:绘制自动换行文本
private static void drawWrappedText(PDPageContentStream cs, PDType0Font font,
float fontSize, String text,
float startX, float startY, float maxWidth) throws IOException {
cs.setFont(font, fontSize);
cs.setLeading(fontSize * 1.2f); // 行间距
// 简单换行实现
int charsPerLine = (int)(maxWidth / (fontSize * 0.8)); // 中文字符估算
int pos = 0;
float currentY = startY;
while (pos < text.length()) {
int endPos = Math.min(pos + charsPerLine, text.length());
String line = text.substring(pos, endPos);
cs.beginText();
cs.newLineAtOffset(startX, currentY);
cs.showText(line);
cs.endText();
pos = endPos;
currentY -= fontSize * 1.2f;
}
}
// 图片高度预估方法
private static float estimateImageHeight(String imageUrl, float targetWidth) throws IOException {
try (InputStream is = new URL(imageUrl).openStream()) {
BufferedImage img = ImageIO.read(is);
return img.getHeight() * (targetWidth / img.getWidth());
}
}
/* public static void generateInstallationPDF(DeviceInstallInfo entity, OutputStream outputStream) throws IOException {
try (PDDocument document = new PDDocument()) {
// 加载中文字体需确保D:/simsun.ttc存在
PDType0Font font = PDType0Font.load(document, new File("D:\\simsun.ttf"));
// 创建单页文档
PDPage page = new PDPage(PDRectangle.A4);
document.addPage(page);
PDPageContentStream cs = new PDPageContentStream(document, page);
float currentY = PDRectangle.A4.getHeight() - TABLE_MARGIN;
// 3. 绘制标题(居中)
drawCenteredText(cs, font, FONT_SIZE + 6,
"贵阳户内安装信息录入表",
PDRectangle.A4.getWidth() / 2, currentY);
currentY -= ROW_HEIGHT * 1.5f;
// 4. 基本信息表格
String[][] baseData = {
{"安装班组", entity.getProposerTeam()},
{"安装人", entity.getProposer()},
{"安装时间", entity.getProposerTime().toString()},
{"小区名称", entity.getCommunityName()},
{"楼栋号", entity.getBuildingUnit()},
{"单元号", entity.getBuildingUnit() != null ?
entity.getBuildingUnit().split("-")[0] : ""},
{"房号", entity.getRoomNo()},
{"用户姓名", entity.getUserName()},
{"联系方式", entity.getUserIpone()},
{"灶具类型", entity.getDeviceName() != null ?
(entity.getDeviceName().contains("台式") ? "台式灶" : "嵌入式灶") : ""}
};
drawTable(cs, font, TABLE_MARGIN, currentY, baseData,
new float[]{COLUMN_LEFT_WIDTH, COLUMN_WIDTH});
currentY -= (ROW_HEIGHT * baseData.length) + 20f;
// 5. 图片处理(内嵌到表格)
if (entity.getBeforeInstallationImage() != null) {
if (currentY < TABLE_MARGIN + 150) {
cs.close();
page = new PDPage(PDRectangle.A4);
document.addPage(page);
cs = new PDPageContentStream(document, page);
currentY = PDRectangle.A4.getHeight() - TABLE_MARGIN;
}
//page = new PDPage(PDRectangle.A4);
// document.addPage(page);
currentY = addImageRow(cs, document, font, "安装前图片",
entity.getBeforeInstallationImage(), TABLE_MARGIN, currentY);
// currentY -= ROW_HEIGHT * 3; // 图片行高是普通行的3倍
}
// 其他图片处理同理...
document.save("D:/output.pdf");
document.save(outputStream);
}
}*/
/* private static void drawTable(PDPageContentStream cs, PDType0Font font,
float x, float y, String[][] data, float[] colWidths) throws IOException {
// 计算表格总宽度
float tableWidth = 0;
for (float width : colWidths) tableWidth += width;
// 绘制外边框
cs.setLineWidth(1.5f);
cs.addRect(x, y - ROW_HEIGHT * data.length, tableWidth, ROW_HEIGHT * data.length);
cs.stroke();
// 绘制列线
float currentX = x;
for (int i = 0; i < colWidths.length - 1; i++) {
currentX += colWidths[i];
cs.moveTo(currentX, y);
cs.lineTo(currentX, y - ROW_HEIGHT * data.length);
cs.stroke();
}
// 绘制行线
for (int i = 1; i < data.length; i++) {
cs.moveTo(x, y - ROW_HEIGHT * i);
cs.lineTo(x + tableWidth, y - ROW_HEIGHT * i);
cs.stroke();
}
// 改进的文本定位
for (int row = 0; row < data.length; row++) {
for (int col = 0; col < data[row].length; col++) {
// 方案1手动求和推荐
float sum = 0;
for (int i = 0; i < col; i++) {
sum += colWidths[i];
}
String text = data[row][col] != null ? data[row][col] : "";
float textWidth = font.getStringWidth(text) / 1000 * FONT_SIZE;
float textX = x + sum
+ (colWidths[col] - textWidth)/2;
float textY = y - (row * ROW_HEIGHT) - (ROW_HEIGHT/2 - FONT_SIZE/4);
cs.beginText();
cs.newLineAtOffset(textX, textY);
cs.showText(text);
cs.endText();
}
}*/
// 填写内容(严格居中)
/* for (int row = 0; row < data.length; row++) {
currentX = x;
for (int col = 0; col < data[row].length; col++) {
String text = data[row][col] != null ? data[row][col] : "";
float textWidth = font.getStringWidth(text) / 1000 * FONT_SIZE;
cs.beginText();
cs.newLineAtOffset(
currentX + (colWidths[col] - textWidth) / 2,
y - (ROW_HEIGHT * row) - (ROW_HEIGHT / 2 + FONT_SIZE / 3)
);
cs.showText(text);
cs.endText();
currentX += colWidths[col];
}
}*/
private static void drawTable(PDPageContentStream cs, PDType0Font font,
float x, float y, String[][] data, float[] colWidths) throws IOException {
// 修改后的表格绘制代码
if (data == null || data.length == 0 || colWidths == null) return;
final float ROW_HEIGHT = 35f; // 增大行高以适应更大字体
final float FONT_SIZE = 14f; // 增大字体大小
final float PADDING = 5f;
// 计算表格总宽度
float tableWidth = 0;
for (float width : colWidths) {
tableWidth += width;
}
// 绘制表格边框和分隔线(保持不变)
cs.setLineWidth(1f);
cs.addRect(x, y - ROW_HEIGHT * data.length, tableWidth, ROW_HEIGHT * data.length);
cs.stroke();
// 绘制列分隔线
float currentX = x;
for (int i = 1; i < colWidths.length; i++) {
currentX += colWidths[i-1];
cs.moveTo(currentX, y);
cs.lineTo(currentX, y - ROW_HEIGHT * data.length);
cs.stroke();
}
// 绘制行分隔线
for (int i = 1; i <= data.length; i++) {
cs.moveTo(x, y - ROW_HEIGHT * i);
cs.lineTo(x + tableWidth, y - ROW_HEIGHT * i);
cs.stroke();
}
// 填写表格内容(关键修改部分)
cs.setFont(font, FONT_SIZE);
for (int row = 0; row < data.length; row++) {
currentX = x;
for (int col = 0; col < data[row].length; col++) {
String text = data[row][col] != null ? data[row][col] : "";
// 计算文本宽度
float textWidth = font.getStringWidth(text) / 1000 * FONT_SIZE;
float centerOffset = (colWidths[col] - textWidth) / 2;
// 修正垂直居中计算(关键修改)
float baselineOffset = (ROW_HEIGHT - FONT_SIZE) / 3; // 更精确的基线计算
cs.beginText();
cs.newLineAtOffset(
currentX + centerOffset,
y - (ROW_HEIGHT * row) - FONT_SIZE - baselineOffset // 修正垂直位置
);
cs.showText(text);
cs.endText();
currentX += colWidths[col];
}
}
}
private static float addImageRow(PDPageContentStream cs, PDDocument doc,
PDType0Font font, String title, String imageUrl,
float startX, float startY) throws IOException {
// 加载图片
PDImageXObject image = PDImageXObject.createFromByteArray(doc,
new URL(imageUrl).openStream().readAllBytes(), "embedded-image");
// 动态计算尺寸
float imageWidth = RIGHT_COL_WIDTH - 10;
float scale = imageWidth / image.getWidth();
float imageHeight = image.getHeight() * scale;
float rowHeight = imageHeight + 20;
// 绘制单元格边框
cs.setLineWidth(0.5f);
cs.addRect(startX, startY - rowHeight, LEFT_COL_WIDTH, rowHeight);
cs.addRect(startX + LEFT_COL_WIDTH, startY - rowHeight, RIGHT_COL_WIDTH, rowHeight);
cs.stroke();
// 垂直居中文本(改进算法)
float textY = startY - rowHeight/2 + FONT_SIZE/2;
//String title = "安装完成探测器工作图片\n检测时间2025-08-14";
/* if(title.contains("\n")){
String[] lines = title.split("\n");
textY = startY - rowHeight/2 + FONT_SIZE/2 + (lines.length-1)*FONT_SIZE/2;
}*/
drawCenteredText(cs, font, FONT_SIZE, title,
startX + LEFT_COL_WIDTH/2, textY);
// 绘制图片带5pt边距
cs.drawImage(image,
startX + LEFT_COL_WIDTH + 5,
startY - rowHeight + 10,
imageWidth, imageHeight);
return startY - rowHeight - 10;
/*// 计算图片尺寸(保持比例)
float imageWidth = RIGHT_COL_WIDTH - 10;
float scale = imageWidth / image.getWidth();
float imageHeight = image.getHeight() * scale;
// 动态计算行高(图片高度+上下边距20
float dynamicRowHeight = imageHeight + 20;
// 绘制左侧标题单元格
cs.setLineWidth(0.5f);
cs.addRect(TABLE_MARGIN, startY - dynamicRowHeight, LEFT_COL_WIDTH, dynamicRowHeight);
// 绘制右侧图片单元格(高度与左侧同步)
cs.addRect(TABLE_MARGIN + LEFT_COL_WIDTH, startY - dynamicRowHeight, RIGHT_COL_WIDTH, dynamicRowHeight);
cs.stroke();
// 居中绘制标题文本
float titleWidth = font.getStringWidth(title) / 1000 * FONT_SIZE;
float titleX = TABLE_MARGIN + (LEFT_COL_WIDTH - titleWidth) / 2;
float titleY = startY - (dynamicRowHeight / 2) - (FONT_SIZE / 3);
cs.beginText();
cs.setFont(font, FONT_SIZE);
cs.newLineAtOffset(titleX, titleY);
cs.showText(title);
cs.endText();
// 居中绘制图片
float imageX = TABLE_MARGIN + LEFT_COL_WIDTH + 5;
float imageY = startY - dynamicRowHeight + 10;
cs.drawImage(image, imageX, imageY, imageWidth, imageHeight);
// 返回新的Y坐标当前位置减去行高和间距
return startY - dynamicRowHeight - 10;*/
}
/* private static float addImageRow(PDPageContentStream cs, PDDocument doc,
PDType0Font font, String title, String imageUrl, float x, float y) throws IOException {
// 绘制标题行
// 加载并绘制图片(居中)
PDImageXObject image = PDImageXObject.createFromByteArray(doc,
new URL(imageUrl).openStream().readAllBytes(), "embedded-image");
// 计算图片尺寸(保持比例)
// 加载并绘制图片
// 计算图片缩放比例
float imageWidth = RIGHT_COL_WIDTH - 10;
float scale = imageWidth / image.getWidth();
float imageHeight = image.getHeight() * scale;
float rowHeight = Math.max(ROW_HEIGHT, imageHeight + 10);
// 绘制图片行边框
cs.setLineWidth(0.5f);
cs.addRect(TABLE_MARGIN, y - rowHeight, LEFT_COL_WIDTH, rowHeight);
cs.addRect(TABLE_MARGIN + LEFT_COL_WIDTH, y - rowHeight, RIGHT_COL_WIDTH, rowHeight);
cs.stroke();
String[][] titleData = {{title, ""}};
// drawTable(cs, font, x, y, titleData, new float[]{COLUMN_LEFT_WIDTH, COLUMN_WIDTH});
// 写入标题文本
// 新代码(居中显示)
float titleWidth = font.getStringWidth(title) / 1000 * 20; // 计算文本宽度
float centerX = TABLE_MARGIN + (LEFT_COL_WIDTH - titleWidth) / 2; // 计算居中位置
cs.beginText();
cs.setFont(font, 20);
cs.newLineAtOffset(centerX, y - 15); // 使用计算出的居中位置
cs.showText(title);
cs.endText();
// 绘制图片(居中显示)
float imageY = y - (rowHeight/2) - (imageHeight/2);
cs.drawImage(image, TABLE_MARGIN + LEFT_COL_WIDTH + 5, imageY, imageWidth, imageHeight);
y -= rowHeight + 10;
return y - rowHeight - 10; // 返回新的Y坐标
}*/
private static void drawCenteredText(PDPageContentStream cs, PDType0Font font,
float fontSize, String text, float centerX, float baselineY) throws IOException {
float textWidth = font.getStringWidth(text) / 1000 * fontSize;
cs.setFont(font, fontSize);
cs.beginText();
// 原始调用改进为
cs.newLineAtOffset(centerX - textWidth / 2, baselineY);
cs.showText(text);
cs.endText();
}
}

@ -0,0 +1,474 @@
package cc.iotkit.manager.config;
import cc.iotkit.model.device.DeviceInstallInfo;
import cn.hutool.core.util.ObjectUtil;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
public class PDFGenerator11 {
// 1. 表格参数配置
// 参数配置(优化后)
private static final float FONT_SIZE = 14f;
private static final float ROW_HEIGHT = 35f;
private static final float TABLE_MARGIN = 50f;
private static final float LEFT_COL_WIDTH = 130f;
private static final float RIGHT_COL_WIDTH = 350f;
private static final float[] COLUMN_WIDTHS = {LEFT_COL_WIDTH, RIGHT_COL_WIDTH};
public static void generateInstallationPDF(DeviceInstallInfo entity, OutputStream outputStream) throws IOException {
try (PDDocument document = new PDDocument()) {
// 加载字体(需替换实际路径)
// PDType0Font font = PDType0Font.load(document, new File("D:\\simsun.ttf"));
PDType0Font font = PDType0Font.load(document, new File("/ttf/simsun.ttf"));
// 初始化第一页
PDPage currentPage = new PDPage(PDRectangle.A4);
document.addPage(currentPage);
PDPageContentStream cs = new PDPageContentStream(document, currentPage);
float currentY = PDRectangle.A4.getHeight() - TABLE_MARGIN;
try {
// 1. 绘制标题(居中)
drawCenteredText(cs, font, FONT_SIZE+10,
"安装信息录入表",
PDRectangle.A4.getWidth()/2, currentY);
currentY -= ROW_HEIGHT * 1.5f;
// 2. 绘制基本信息表格
String[][] baseData = {
// {"公司名称", entity.getCorporateName()},
{"申请时间", entity.getProposerTime().toString()},
{"申请人", entity.getProposer()},
{"申请人班组", entity.getProposerTeam()},
{"小区名字", entity.getCommunityName()},
{"用户姓名", entity.getUserName()},
{"电话", entity.getUserIpone()},
{"楼栋单元号", entity.getBuildingUnit()},
{"房间号", entity.getRoomNo()},
{"报警器编号", entity.getDeviceName()},
{"切断阀编号", entity.getShutValueNumber()},
{"燃气表号", entity.getGasMeterNumber()},
{"备注", entity.getBuildingUnit()}
};
drawTable(cs, font, TABLE_MARGIN, currentY, baseData, COLUMN_WIDTHS);
currentY -= (ROW_HEIGHT * baseData.length) + 20f;
// @ApiModelProperty(value = "安装前图片")
// 创建后续页面 - 图片部分
// 3. 图片处理(带自动分页)
List<String> imageUrls = Arrays.asList(
entity.getBeforeInstallationImage(),
entity.getWorkingOfTheDetectorImage(),
entity.getSideLeakageImage(),
entity.getIgnitionPictureImage(),
entity.getInstallThePanoramicImage(),
entity.getOfGasMeterImage(),
entity.getWorkOrderImage(),
entity.getPunchingImage(),
entity.getFiexImage()
).stream().filter(Objects::nonNull).collect(Collectors.toList());
for (String url : imageUrls) {
// 空间检查(动态计算所需高度)
if (ObjectUtil.isNotNull(url) && !"".equals(url) && url.startsWith("http")) {
float requiredHeight = estimateImageHeight(url, RIGHT_COL_WIDTH - 10) + 30;
if (currentY < TABLE_MARGIN + requiredHeight) {
cs.close();
currentPage = new PDPage(PDRectangle.A4);
document.addPage(currentPage);
cs = new PDPageContentStream(document, currentPage);
currentY = PDRectangle.A4.getHeight() - TABLE_MARGIN;
}
String title = "";
// 安装前图片页
if (entity.getBeforeInstallationImage() != null && entity.getBeforeInstallationImage().equals(url)) {
title = "安装前图片";
} else if (entity.getWorkingOfTheDetectorImage() != null && entity.getWorkingOfTheDetectorImage().equals(url)) {
title = "安装完成探测器工作图片";
}
// 测漏图片页
else if (entity.getSideLeakageImage() != null && entity.getSideLeakageImage().equals(url)) {
title = "测漏图片";
}
// 点火图片页
else if (entity.getIgnitionPictureImage() != null && entity.getIgnitionPictureImage().equals(url)) {
title = "点火图片";
} else if (entity.getInstallThePanoramicImage() != null && entity.getInstallThePanoramicImage().equals(url)) {
title = "安装完成全景图片";
} else if (entity.getOfGasMeterImage() != null && entity.getOfGasMeterImage().equals(url)) {
title = "燃气表图片";
}
// 工单签字页
else if (entity.getWorkOrderImage() != null && entity.getWorkOrderImage().equals(url)) {
title = "工单图片";
}
// 打孔图片页
else if (entity.getPunchingImage() != null && entity.getPunchingImage().equals(url)) {
title = "打孔图片";
} else if (entity.getFiexImage() != null && entity.getFiexImage().equals(url)) {
title = "安装电源线图片";
}
if (ObjectUtil.isNotNull(title) && !"".equals(title))
currentY = addImageRow(cs, document, font, title, url, TABLE_MARGIN, currentY);
}
}
} finally {
cs.close();
}
// document.save("D:/output.pdf");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
document.save(baos);
outputStream.flush();
baos.writeTo(outputStream);
// document.save(outputStream);
}
}
// 图片高度预估方法
private static float estimateImageHeight(String imageUrl, float targetWidth) throws IOException {
try (InputStream is = new URL(imageUrl).openStream()) {
BufferedImage img = ImageIO.read(is);
return img.getHeight() * (targetWidth / img.getWidth());
}
}
/* public static void generateInstallationPDF(DeviceInstallInfo entity, OutputStream outputStream) throws IOException {
try (PDDocument document = new PDDocument()) {
// 加载中文字体需确保D:/simsun.ttc存在
PDType0Font font = PDType0Font.load(document, new File("D:\\simsun.ttf"));
// 创建单页文档
PDPage page = new PDPage(PDRectangle.A4);
document.addPage(page);
PDPageContentStream cs = new PDPageContentStream(document, page);
float currentY = PDRectangle.A4.getHeight() - TABLE_MARGIN;
// 3. 绘制标题(居中)
drawCenteredText(cs, font, FONT_SIZE + 6,
"贵阳户内安装信息录入表",
PDRectangle.A4.getWidth() / 2, currentY);
currentY -= ROW_HEIGHT * 1.5f;
// 4. 基本信息表格
String[][] baseData = {
{"安装班组", entity.getProposerTeam()},
{"安装人", entity.getProposer()},
{"安装时间", entity.getProposerTime().toString()},
{"小区名称", entity.getCommunityName()},
{"楼栋号", entity.getBuildingUnit()},
{"单元号", entity.getBuildingUnit() != null ?
entity.getBuildingUnit().split("-")[0] : ""},
{"房号", entity.getRoomNo()},
{"用户姓名", entity.getUserName()},
{"联系方式", entity.getUserIpone()},
{"灶具类型", entity.getDeviceName() != null ?
(entity.getDeviceName().contains("台式") ? "台式灶" : "嵌入式灶") : ""}
};
drawTable(cs, font, TABLE_MARGIN, currentY, baseData,
new float[]{COLUMN_LEFT_WIDTH, COLUMN_WIDTH});
currentY -= (ROW_HEIGHT * baseData.length) + 20f;
// 5. 图片处理(内嵌到表格)
if (entity.getBeforeInstallationImage() != null) {
if (currentY < TABLE_MARGIN + 150) {
cs.close();
page = new PDPage(PDRectangle.A4);
document.addPage(page);
cs = new PDPageContentStream(document, page);
currentY = PDRectangle.A4.getHeight() - TABLE_MARGIN;
}
//page = new PDPage(PDRectangle.A4);
// document.addPage(page);
currentY = addImageRow(cs, document, font, "安装前图片",
entity.getBeforeInstallationImage(), TABLE_MARGIN, currentY);
// currentY -= ROW_HEIGHT * 3; // 图片行高是普通行的3倍
}
// 其他图片处理同理...
document.save("D:/output.pdf");
document.save(outputStream);
}
}*/
/* private static void drawTable(PDPageContentStream cs, PDType0Font font,
float x, float y, String[][] data, float[] colWidths) throws IOException {
// 计算表格总宽度
float tableWidth = 0;
for (float width : colWidths) tableWidth += width;
// 绘制外边框
cs.setLineWidth(1.5f);
cs.addRect(x, y - ROW_HEIGHT * data.length, tableWidth, ROW_HEIGHT * data.length);
cs.stroke();
// 绘制列线
float currentX = x;
for (int i = 0; i < colWidths.length - 1; i++) {
currentX += colWidths[i];
cs.moveTo(currentX, y);
cs.lineTo(currentX, y - ROW_HEIGHT * data.length);
cs.stroke();
}
// 绘制行线
for (int i = 1; i < data.length; i++) {
cs.moveTo(x, y - ROW_HEIGHT * i);
cs.lineTo(x + tableWidth, y - ROW_HEIGHT * i);
cs.stroke();
}
// 改进的文本定位
for (int row = 0; row < data.length; row++) {
for (int col = 0; col < data[row].length; col++) {
// 方案1手动求和推荐
float sum = 0;
for (int i = 0; i < col; i++) {
sum += colWidths[i];
}
String text = data[row][col] != null ? data[row][col] : "";
float textWidth = font.getStringWidth(text) / 1000 * FONT_SIZE;
float textX = x + sum
+ (colWidths[col] - textWidth)/2;
float textY = y - (row * ROW_HEIGHT) - (ROW_HEIGHT/2 - FONT_SIZE/4);
cs.beginText();
cs.newLineAtOffset(textX, textY);
cs.showText(text);
cs.endText();
}
}*/
// 填写内容(严格居中)
/* for (int row = 0; row < data.length; row++) {
currentX = x;
for (int col = 0; col < data[row].length; col++) {
String text = data[row][col] != null ? data[row][col] : "";
float textWidth = font.getStringWidth(text) / 1000 * FONT_SIZE;
cs.beginText();
cs.newLineAtOffset(
currentX + (colWidths[col] - textWidth) / 2,
y - (ROW_HEIGHT * row) - (ROW_HEIGHT / 2 + FONT_SIZE / 3)
);
cs.showText(text);
cs.endText();
currentX += colWidths[col];
}
}*/
private static void drawTable(PDPageContentStream cs, PDType0Font font,
float x, float y, String[][] data, float[] colWidths) throws IOException {
// 修改后的表格绘制代码
if (data == null || data.length == 0 || colWidths == null) return;
final float ROW_HEIGHT = 35f; // 增大行高以适应更大字体
final float FONT_SIZE = 14f; // 增大字体大小
final float PADDING = 5f;
// 计算表格总宽度
float tableWidth = 0;
for (float width : colWidths) {
tableWidth += width;
}
// 绘制表格边框和分隔线(保持不变)
cs.setLineWidth(1f);
cs.addRect(x, y - ROW_HEIGHT * data.length, tableWidth, ROW_HEIGHT * data.length);
cs.stroke();
// 绘制列分隔线
float currentX = x;
for (int i = 1; i < colWidths.length; i++) {
currentX += colWidths[i-1];
cs.moveTo(currentX, y);
cs.lineTo(currentX, y - ROW_HEIGHT * data.length);
cs.stroke();
}
// 绘制行分隔线
for (int i = 1; i <= data.length; i++) {
cs.moveTo(x, y - ROW_HEIGHT * i);
cs.lineTo(x + tableWidth, y - ROW_HEIGHT * i);
cs.stroke();
}
// 填写表格内容(关键修改部分)
cs.setFont(font, FONT_SIZE);
for (int row = 0; row < data.length; row++) {
currentX = x;
for (int col = 0; col < data[row].length; col++) {
String text = data[row][col] != null ? data[row][col] : "";
// 计算文本宽度
float textWidth = font.getStringWidth(text) / 1000 * FONT_SIZE;
float centerOffset = (colWidths[col] - textWidth) / 2;
// 修正垂直居中计算(关键修改)
float baselineOffset = (ROW_HEIGHT - FONT_SIZE) / 3; // 更精确的基线计算
cs.beginText();
cs.newLineAtOffset(
currentX + centerOffset,
y - (ROW_HEIGHT * row) - FONT_SIZE - baselineOffset // 修正垂直位置
);
cs.showText(text);
cs.endText();
currentX += colWidths[col];
}
}
}
private static float addImageRow(PDPageContentStream cs, PDDocument doc,
PDType0Font font, String title, String imageUrl,
float startX, float startY) throws IOException {
// 加载图片
PDImageXObject image = PDImageXObject.createFromByteArray(doc,
new URL(imageUrl).openStream().readAllBytes(), "embedded-image");
// 动态计算尺寸
float imageWidth = RIGHT_COL_WIDTH - 10;
float scale = imageWidth / image.getWidth();
float imageHeight = image.getHeight() * scale;
float rowHeight = imageHeight + 20;
// 绘制单元格边框
cs.setLineWidth(0.5f);
cs.addRect(startX, startY - rowHeight, LEFT_COL_WIDTH, rowHeight);
cs.addRect(startX + LEFT_COL_WIDTH, startY - rowHeight, RIGHT_COL_WIDTH, rowHeight);
cs.stroke();
// 垂直居中文本(改进算法)
float textY = startY - rowHeight/2 + FONT_SIZE/2;
//String title = "安装完成探测器工作图片\n检测时间2025-08-14";
/* if(title.contains("\n")){
String[] lines = title.split("\n");
textY = startY - rowHeight/2 + FONT_SIZE/2 + (lines.length-1)*FONT_SIZE/2;
}*/
drawCenteredText(cs, font, FONT_SIZE, title,
startX + LEFT_COL_WIDTH/2, textY);
// 绘制图片带5pt边距
cs.drawImage(image,
startX + LEFT_COL_WIDTH + 5,
startY - rowHeight + 10,
imageWidth, imageHeight);
return startY - rowHeight - 10;
/*// 计算图片尺寸(保持比例)
float imageWidth = RIGHT_COL_WIDTH - 10;
float scale = imageWidth / image.getWidth();
float imageHeight = image.getHeight() * scale;
// 动态计算行高(图片高度+上下边距20
float dynamicRowHeight = imageHeight + 20;
// 绘制左侧标题单元格
cs.setLineWidth(0.5f);
cs.addRect(TABLE_MARGIN, startY - dynamicRowHeight, LEFT_COL_WIDTH, dynamicRowHeight);
// 绘制右侧图片单元格(高度与左侧同步)
cs.addRect(TABLE_MARGIN + LEFT_COL_WIDTH, startY - dynamicRowHeight, RIGHT_COL_WIDTH, dynamicRowHeight);
cs.stroke();
// 居中绘制标题文本
float titleWidth = font.getStringWidth(title) / 1000 * FONT_SIZE;
float titleX = TABLE_MARGIN + (LEFT_COL_WIDTH - titleWidth) / 2;
float titleY = startY - (dynamicRowHeight / 2) - (FONT_SIZE / 3);
cs.beginText();
cs.setFont(font, FONT_SIZE);
cs.newLineAtOffset(titleX, titleY);
cs.showText(title);
cs.endText();
// 居中绘制图片
float imageX = TABLE_MARGIN + LEFT_COL_WIDTH + 5;
float imageY = startY - dynamicRowHeight + 10;
cs.drawImage(image, imageX, imageY, imageWidth, imageHeight);
// 返回新的Y坐标当前位置减去行高和间距
return startY - dynamicRowHeight - 10;*/
}
/* private static float addImageRow(PDPageContentStream cs, PDDocument doc,
PDType0Font font, String title, String imageUrl, float x, float y) throws IOException {
// 绘制标题行
// 加载并绘制图片(居中)
PDImageXObject image = PDImageXObject.createFromByteArray(doc,
new URL(imageUrl).openStream().readAllBytes(), "embedded-image");
// 计算图片尺寸(保持比例)
// 加载并绘制图片
// 计算图片缩放比例
float imageWidth = RIGHT_COL_WIDTH - 10;
float scale = imageWidth / image.getWidth();
float imageHeight = image.getHeight() * scale;
float rowHeight = Math.max(ROW_HEIGHT, imageHeight + 10);
// 绘制图片行边框
cs.setLineWidth(0.5f);
cs.addRect(TABLE_MARGIN, y - rowHeight, LEFT_COL_WIDTH, rowHeight);
cs.addRect(TABLE_MARGIN + LEFT_COL_WIDTH, y - rowHeight, RIGHT_COL_WIDTH, rowHeight);
cs.stroke();
String[][] titleData = {{title, ""}};
// drawTable(cs, font, x, y, titleData, new float[]{COLUMN_LEFT_WIDTH, COLUMN_WIDTH});
// 写入标题文本
// 新代码(居中显示)
float titleWidth = font.getStringWidth(title) / 1000 * 20; // 计算文本宽度
float centerX = TABLE_MARGIN + (LEFT_COL_WIDTH - titleWidth) / 2; // 计算居中位置
cs.beginText();
cs.setFont(font, 20);
cs.newLineAtOffset(centerX, y - 15); // 使用计算出的居中位置
cs.showText(title);
cs.endText();
// 绘制图片(居中显示)
float imageY = y - (rowHeight/2) - (imageHeight/2);
cs.drawImage(image, TABLE_MARGIN + LEFT_COL_WIDTH + 5, imageY, imageWidth, imageHeight);
y -= rowHeight + 10;
return y - rowHeight - 10; // 返回新的Y坐标
}*/
private static void drawCenteredText(PDPageContentStream cs, PDType0Font font,
float fontSize, String text, float centerX, float baselineY) throws IOException {
float textWidth = font.getStringWidth(text) / 1000 * fontSize;
cs.setFont(font, fontSize);
cs.beginText();
// 原始调用改进为
cs.newLineAtOffset(centerX - textWidth / 2, baselineY);
cs.showText(text);
cs.endText();
}
}

@ -0,0 +1,52 @@
package cc.iotkit.manager.config;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import java.io.IOException;
public class PDFUtils {
// 计算文本居中位置(水平+垂直)
public static float[] calculateCenterPosition(
PDType0Font font,
float fontSize,
String text,
float rectX, float rectY,
float rectWidth, float rectHeight
) {
try {
// 计算文本宽度
float textWidth = font.getStringWidth(text) / 1000 * fontSize;
// 计算垂直偏移(考虑字体基线)
float ascent = font.getFontDescriptor().getAscent() / 1000 * fontSize;
float descent = font.getFontDescriptor().getDescent() / 1000 * fontSize;
float textHeight = ascent - descent;
return new float[]{
rectX + (rectWidth - textWidth) / 2, // 水平居中X
rectY + (rectHeight + textHeight) / 2 - descent // 垂直居中Y
};
} catch (IOException e) {
return new float[]{rectX, rectY};
}
}
// 绘制对齐文本(封装方法)
public static void drawAlignedText(
PDPageContentStream cs,
PDType0Font font,
float fontSize,
String text,
float x, float y,
float width, float height
) throws IOException {
float[] pos = calculateCenterPosition(font, fontSize, text, x, y, width, height);
cs.setFont(font, fontSize);
cs.beginText();
cs.newLineAtOffset(pos[0], pos[1]);
cs.showText(text);
cs.endText();
}
}

@ -28,6 +28,7 @@ import cc.iotkit.common.api.Request;
import cc.iotkit.common.exception.BizException; import cc.iotkit.common.exception.BizException;
import cc.iotkit.common.satoken.utils.AuthUtil; import cc.iotkit.common.satoken.utils.AuthUtil;
import cc.iotkit.common.satoken.utils.LoginHelper; import cc.iotkit.common.satoken.utils.LoginHelper;
import cc.iotkit.manager.dto.bo.device.DeviceInfoBo;
import cc.iotkit.manager.service.AlertService; import cc.iotkit.manager.service.AlertService;
import cc.iotkit.model.alert.AlertConfig; import cc.iotkit.model.alert.AlertConfig;
import cc.iotkit.model.alert.AlertRecord; import cc.iotkit.model.alert.AlertRecord;
@ -64,9 +65,9 @@ public class AlertController {
String uid = AuthUtil.getUserId(); String uid = AuthUtil.getUserId();
request.getData().setUid(uid); request.getData().setUid(uid);
} }
if(ObjectUtils.isNotEmpty( alertService.getAlertConfig(request.getData()))){ /* if(ObjectUtils.isNotEmpty( alertService.getAlertConfig(request.getData()))){
throw new BizException("该规则模版已存在"); throw new BizException("该规则模版已存在");
} }*/
return alertService.createAlertConfig(request.getData()); return alertService.createAlertConfig(request.getData());
} }
@ -78,14 +79,14 @@ public class AlertController {
String uid = AuthUtil.getUserId(); String uid = AuthUtil.getUserId();
request.getData().setUid(uid); request.getData().setUid(uid);
} }
List<AlertConfig> list= alertService.getAlertConfig(request.getData()); /* List<AlertConfig> list= alertService.getAlertConfig(request.getData());
if(ObjectUtils.isNotEmpty(list)){ if(ObjectUtils.isNotEmpty(list)){
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
if(!list.get(i).getRuleInfoId().equals(request.getData().getRuleInfoId())){ if(!list.get(i).getRuleInfoId().equals(request.getData().getRuleInfoId())){
throw new BizException("该规则模版已存在"); throw new BizException("该规则模版已存在");
} }
} }
} }*/
return alertService.updateAlertConfig(request.getData()); return alertService.updateAlertConfig(request.getData());
} }
@ -105,11 +106,18 @@ public class AlertController {
@ApiOperation("查询告警消息分页") @ApiOperation("查询告警消息分页")
@SaCheckPermission("iot:alert:query") // @SaCheckPermission("iot:alert:query")
@PostMapping("/selectAlertRecordPage") @PostMapping("/selectAlertRecordPage")
public Paging<AlertRecord> selectAlertRecordPage(@RequestBody @Validated PageRequest<AlertRecord> request) { public Paging<AlertRecord> selectAlertRecordPage(@RequestBody @Validated PageRequest<AlertRecord> request) {
request.getData().setStatusFlg(true);
return alertService.selectAlertRecordPage(request); return alertService.selectAlertRecordPage(request);
} }
@ApiOperation("查询告警消息已读未读")
// @SaCheckPermission("iot:alert:query")
@PostMapping("/saveAlertRecord")
public void saveAlertRecord(@RequestBody @Validated Request<AlertRecord> bo) {
alertService.save(bo.getData());
// return alertService.selectAlertRecordPage(request);
}
} }

@ -27,7 +27,12 @@ import cc.iotkit.common.api.Paging;
import cc.iotkit.common.api.Request; import cc.iotkit.common.api.Request;
import cc.iotkit.common.api.Response; import cc.iotkit.common.api.Response;
import cc.iotkit.common.excel.utils.ExcelUtil; import cc.iotkit.common.excel.utils.ExcelUtil;
import cc.iotkit.common.log.annotation.Log;
import cc.iotkit.common.log.enums.BusinessType;
import cc.iotkit.common.satoken.utils.LoginHelper;
import cc.iotkit.common.tenant.helper.TenantHelper;
import cc.iotkit.common.thing.ThingModelMessage; import cc.iotkit.common.thing.ThingModelMessage;
import cc.iotkit.common.utils.MapstructUtils;
import cc.iotkit.common.validate.QueryGroup; import cc.iotkit.common.validate.QueryGroup;
import cc.iotkit.manager.dto.bo.device.*; import cc.iotkit.manager.dto.bo.device.*;
import cc.iotkit.manager.dto.bo.deviceconfig.DeviceConfigAddBo; import cc.iotkit.manager.dto.bo.deviceconfig.DeviceConfigAddBo;
@ -37,6 +42,7 @@ import cc.iotkit.manager.dto.bo.thingmodel.ThingModelMessageBo;
import cc.iotkit.manager.dto.vo.deviceconfig.DeviceConfigVo; import cc.iotkit.manager.dto.vo.deviceconfig.DeviceConfigVo;
import cc.iotkit.manager.dto.vo.devicegroup.DeviceGroupImportVo; import cc.iotkit.manager.dto.vo.devicegroup.DeviceGroupImportVo;
import cc.iotkit.manager.dto.vo.devicegroup.DeviceGroupVo; import cc.iotkit.manager.dto.vo.devicegroup.DeviceGroupVo;
import cc.iotkit.manager.dto.vo.deviceinfo.DeviceInfoExpordVo;
import cc.iotkit.manager.dto.vo.deviceinfo.DeviceInfoImportVo; import cc.iotkit.manager.dto.vo.deviceinfo.DeviceInfoImportVo;
import cc.iotkit.manager.dto.vo.deviceinfo.DeviceInfoVo; import cc.iotkit.manager.dto.vo.deviceinfo.DeviceInfoVo;
import cc.iotkit.manager.dto.vo.deviceinfo.ParentDeviceVo; import cc.iotkit.manager.dto.vo.deviceinfo.ParentDeviceVo;
@ -51,6 +57,7 @@ import cc.iotkit.model.device.DeviceInfo;
import cc.iotkit.model.device.message.DeviceProperty; import cc.iotkit.model.device.message.DeviceProperty;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -64,6 +71,8 @@ import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static cc.iotkit.common.web.core.BaseController.fail;
@Api(tags = {"设备"}) @Api(tags = {"设备"})
@Slf4j @Slf4j
@RestController @RestController
@ -107,7 +116,12 @@ public class DeviceController {
public Paging<DeviceInfoVo> getDevices(@Validated @RequestBody PageRequest<DeviceQueryBo> pageRequest) { public Paging<DeviceInfoVo> getDevices(@Validated @RequestBody PageRequest<DeviceQueryBo> pageRequest) {
return deviceServiceImpl.getDevices(pageRequest); return deviceServiceImpl.getDevices(pageRequest);
} }
@ApiOperation(value = "联动设备列表", notes = "设备列表", httpMethod = "POST")
//@SaCheckPermission("iot:device:query")
@PostMapping("/listNode")
public Paging<DeviceInfoVo> getDevices1(@Validated @RequestBody PageRequest<DeviceQueryBo> pageRequest) {
return deviceServiceImpl.getDevices1(pageRequest);
}
@ApiOperation(value = "创建设备") @ApiOperation(value = "创建设备")
@SaCheckPermission("iot:device:add") @SaCheckPermission("iot:device:add")
@PostMapping("/add") @PostMapping("/add")
@ -182,13 +196,33 @@ public class DeviceController {
@ApiOperation("下载设备模板") @ApiOperation("下载设备模板")
@PostMapping("/exportData") @PostMapping("/exportData")
public void exportDeviceTemplate(HttpServletResponse response) { public void exportDeviceTemplate(HttpServletResponse response) {
//System.setProperty("org.apache.poi.util.POILogger", "org.apache.poi.util.NullLogger");
ExcelUtil.exportExcel(new ArrayList<>(), "设备分组", DeviceInfoImportVo.class, response); ExcelUtil.exportExcel(new ArrayList<>(), "设备分组", DeviceInfoImportVo.class, response);
} }
@ApiOperation("导出设备列表")
@Log(title = "设备管理", businessType = BusinessType.EXPORT)
// @SaCheckPermission("system:user:export")@RequestBody Request<ProductBo>
@PostMapping("/export")
public void export(DeviceQueryBo deviceQueryBo,
HttpServletResponse response) {
if(ObjectUtil.isEmpty(deviceQueryBo)){
if(LoginHelper.isSuperAdmin() && TenantHelper.getTenantId() == 0){
deviceQueryBo.setTenantId(null);
}else{
deviceQueryBo.setTenantId(TenantHelper.getTenantId());
}
}
List<DeviceInfoVo> list = deviceServiceImpl.getDevicess(deviceQueryBo);
List<DeviceInfoExpordVo> listVo = MapstructUtils.convert(list, DeviceInfoExpordVo.class);
ExcelUtil.exportExcel(listVo, "设备数据", DeviceInfoExpordVo.class, response);
}
@ApiOperation("设备物模型日志") @ApiOperation("设备物模型日志")
@SaCheckPermission("iot:deviceLog:query") @SaCheckPermission("iot:deviceLog:query")
@PostMapping("/deviceLogs/list") @PostMapping("/deviceLogs/list")
public Paging<ThingModelMessage> logs(@Validated(QueryGroup.class) @RequestBody PageRequest<DeviceLogQueryBo> request) { public Paging<ThingModelMessage> logs(@Validated(QueryGroup.class) @RequestBody PageRequest<DeviceLogQueryBo> request) {
Paging<ThingModelMessage> summary = deviceServiceImpl.logs(request);
return deviceServiceImpl.logs(request); return deviceServiceImpl.logs(request);
} }
@ -205,13 +239,18 @@ public class DeviceController {
return deviceServiceImpl.getPropertyHistory(deviceId, name, start, end, 10000); return deviceServiceImpl.getPropertyHistory(deviceId, name, start, end, 10000);
} }
@ApiOperation("设备解绑") @ApiOperation("设备解绑(子设备)")
@SaCheckPermission("iot:device:edit") @SaCheckPermission("iot:device:edit")
@PostMapping("/unbind") @PostMapping("/unbind")
public boolean unbindDevice(@Validated @RequestBody Request<String> request) { public boolean unbindDevice(@Validated @RequestBody Request<String> request) {
return deviceServiceImpl.unbindDevice(request.getData()); return deviceServiceImpl.unbindDevice(request.getData());
} }
@ApiOperation(value = "设备解绑(解绑客户)")
@SaCheckPermission("iot:device:unbind")
@PostMapping("/unbindUser")
public boolean unbindDevice1(@Validated @RequestBody Request<String> request) {
return deviceServiceImpl.unbindDeviceXcx(request.getData());
}
@ApiOperation("获取设备物模型") @ApiOperation("获取设备物模型")
@SaCheckPermission("iot:thingModel:query") @SaCheckPermission("iot:thingModel:query")
@PostMapping("/getThingModel") @PostMapping("/getThingModel")
@ -377,5 +416,14 @@ public class DeviceController {
String deviceId = bo.getData(); String deviceId = bo.getData();
return new InvokeResult(deviceCtrlService.sendConfig(deviceId)); return new InvokeResult(deviceCtrlService.sendConfig(deviceId));
} }
@ApiOperation(value = "配置获取", notes = "属性获取", httpMethod = "POST")
//@SaCheckPermission("iot:device:ctrl")
@PostMapping("/service/config/get")
public InvokeResult getConfig1(@RequestBody @Validated Request<String> bo) {
String deviceId = bo.getData();
if(ObjectUtil.isNull(deviceId)){
fail("设备id不能为null");
}
return new InvokeResult(deviceCtrlService.getConfig(deviceId));
}
} }

@ -0,0 +1,98 @@
/*
*
* * | Licensed OPENIITA
* * +----------------------------------------------------------------------
* * | Author: xw2sy@163.com
* * +----------------------------------------------------------------------
*
* Copyright [2024] [OPENIITA]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package cc.iotkit.manager.controller;
import cc.iotkit.common.api.PageRequest;
import cc.iotkit.common.api.Paging;
import cc.iotkit.common.api.Request;
import cc.iotkit.common.api.Response;
import cc.iotkit.common.excel.utils.ExcelUtil;
import cc.iotkit.common.thing.ThingModelMessage;
import cc.iotkit.common.validate.QueryGroup;
import cc.iotkit.data.service.DeviceDetectorInfoDataImpl;
import cc.iotkit.manager.dto.bo.device.*;
import cc.iotkit.manager.dto.bo.deviceconfig.DeviceConfigAddBo;
import cc.iotkit.manager.dto.bo.devicegroup.DeviceAddGroupBo;
import cc.iotkit.manager.dto.bo.devicegroup.DeviceGroupBo;
import cc.iotkit.manager.dto.bo.thingmodel.ThingModelMessageBo;
import cc.iotkit.manager.dto.vo.deviceconfig.DeviceConfigVo;
import cc.iotkit.manager.dto.vo.devicegroup.DeviceGroupImportVo;
import cc.iotkit.manager.dto.vo.devicegroup.DeviceGroupVo;
import cc.iotkit.manager.dto.vo.deviceinfo.DeviceInfoImportVo;
import cc.iotkit.manager.dto.vo.deviceinfo.DeviceInfoVo;
import cc.iotkit.manager.dto.vo.deviceinfo.ParentDeviceVo;
import cc.iotkit.manager.dto.vo.thingmodel.ThingModelVo;
import cc.iotkit.manager.service.DeviceCtrlService;
import cc.iotkit.manager.service.IDeviceDetectorInfoService;
import cc.iotkit.manager.service.IDeviceManagerService;
import cc.iotkit.manager.service.IProductService;
import cc.iotkit.model.InvokeResult;
import cc.iotkit.model.device.DeviceConfig;
import cc.iotkit.model.device.DeviceDetectorInfo;
import cc.iotkit.model.device.DeviceGroup;
import cc.iotkit.model.device.DeviceInfo;
import cc.iotkit.model.device.message.DeviceProperty;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.ObjectUtil;
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.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.async.DeferredResult;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import static cc.iotkit.common.web.core.BaseController.fail;
@Api(tags = {"设备浓度变化"})
@Slf4j
@RestController
@RequestMapping("/deviceDetector")
public class DeviceDetectorController {
@Autowired
private IDeviceDetectorInfoService deviceServiceImpl;
@ApiOperation(value = "浓度列表", notes = "设备列表", httpMethod = "POST")
//@SaCheckPermission("iot:device:query")
@PostMapping("/page")
public Paging<DeviceDetectorInfo> getDevices(@Validated @RequestBody PageRequest<DeviceDetectorQueryBo> pageRequest) {
return deviceServiceImpl.getPage(pageRequest);
}
@ApiOperation(value = "浓度列表", notes = "设备列表", httpMethod = "POST")
//@SaCheckPermission("iot:device:query")
@PostMapping("/list")
public List<DeviceDetectorInfo> getDevices1(@Validated @RequestBody PageRequest<DeviceDetectorQueryBo> pageRequest) {
return deviceServiceImpl.getList(pageRequest);
}
}

@ -0,0 +1,458 @@
/*
*
* * | Licensed OPENIITA
* * +----------------------------------------------------------------------
* * | Author: xw2sy@163.com
* * +----------------------------------------------------------------------
*
* Copyright [2024] [OPENIITA]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package cc.iotkit.manager.controller;
import cc.iotkit.common.api.PageRequest;
import cc.iotkit.common.api.Paging;
import cc.iotkit.common.api.Request;
import cc.iotkit.common.constant.Constants;
import cc.iotkit.common.enums.ErrCode;
import cc.iotkit.common.exception.BizException;
import cc.iotkit.common.satoken.utils.LoginHelper;
import cc.iotkit.common.tenant.helper.TenantHelper;
import cc.iotkit.data.manager.IDeviceInstallInfoData;
import cc.iotkit.manager.config.GasInstallationPDFGenerator;
import cc.iotkit.manager.config.PDFGenerator;
import cc.iotkit.manager.dto.bo.device.DeviceDetectorQueryBo;
import cc.iotkit.manager.dto.bo.device.DeviceInstallInfoQueryBo;
import cc.iotkit.manager.service.IDeviceDetectorInfoService;
import cc.iotkit.manager.service.IDeviceInstallInfoService;
import cc.iotkit.model.UserInfo;
import cc.iotkit.model.device.DeviceDetectorInfo;
import cc.iotkit.model.device.DeviceInfo;
import cc.iotkit.model.device.DeviceInstallInfo;
import cc.iotkit.model.device.InstallationRecord;
import cc.iotkit.model.space.Home;
import cc.iotkit.model.space.Space;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ObjectUtil;
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.io.font.constants.StandardFonts;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.colors.DeviceRgb;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.*;
import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URISyntaxException;
import java.net.URL;
import com.itextpdf.layout.properties.AreaBreakType;
import com.itextpdf.layout.properties.HorizontalAlignment;
import com.itextpdf.layout.properties.TextAlignment;
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.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.security.SecureRandom;
import java.util.Collections;
import java.util.List;
import static cc.iotkit.data.model.QTbDeviceInstallInfo.tbDeviceInstallInfo;
import static com.itextpdf.kernel.pdf.PdfName.*;
@Api(tags = {"设备安装信息"})
@Slf4j
@RestController
@RequestMapping("/deviceInstallInfo")
public class DeviceInstallInfoController {
@Autowired
private IDeviceInstallInfoService deviceServiceImpl;
@Autowired
private IDeviceInstallInfoData iDeviceInstallInfoData;
@ApiOperation(value = "安装列表", notes = "设备列表", httpMethod = "POST")
//@SaCheckPermission("iot:device:query")
@PostMapping("/page")
public Paging<DeviceInstallInfo> getDevices(@Validated @RequestBody PageRequest<DeviceInstallInfoQueryBo> pageRequest) {
return deviceServiceImpl.getPage(pageRequest);
}
@PostMapping("/add")
@SaCheckPermission("device:install:add")
public void addClientUser(@RequestBody Request<DeviceInstallInfo> deviceInstallInfo) throws Exception {
/* user.getData().setType(UserInfo.USER_TYPE_CLIENT);
user.getData().setRoles(Collections.singletonList(Constants.ROLE_CLIENT));
user.getData().setSecret(null);*/
TenantHelper.enableIgnore();
if (ObjectUtil.isNull(deviceInstallInfo.getData()) || ObjectUtil.isNull(deviceInstallInfo.getData().getDeviceName())) {
throw new BizException(ErrCode.PARAMS_EXCEPTION);
}
DeviceInstallInfo deviceRepetition = iDeviceInstallInfoData.findByDeviceNameAndUid(deviceInstallInfo.getData().getDeviceName(), deviceInstallInfo.getData().getUid());
if (deviceRepetition != null) {
throw new BizException(ErrCode.MODEL_DEVICE_ALREADY);
}
if (LoginHelper.isSuperAdmin() && TenantHelper.getTenantId() != 0) {
deviceInstallInfo.getData().setTenantId(TenantHelper.getTenantId());
// query.where(tbDeviceInstallInfo.tenantId.eq(TenantHelper.getTenantId()));
}
/* if(!LoginHelper.isSuperAdmin() && ObjectUtil.isNotNull(pageReqVO.getData().getTenantId())){
query.where(tbDeviceInstallInfo.tenantId.eq(pageReqVO.getData().getTenantId()));
}*/
iDeviceInstallInfoData.save(deviceInstallInfo.getData());
/* if(LoginHelper.isSuperAdmin() && TenantHelper.getTenantId() != 0) {
userInfoData.save(user.getData());
}else{
user.getData().setTenantId(null);
userInfoData.save(user.getData());
}*/
}
@PostMapping("/edit")
@SaCheckPermission("device:install:edit")
public void editClientUser(@RequestBody Request<DeviceInstallInfo> deviceInstallInfo) throws Exception {
TenantHelper.enableIgnore();
if (ObjectUtil.isNull(deviceInstallInfo.getData()) || ObjectUtil.isNull(deviceInstallInfo.getData().getDeviceName()) || ObjectUtil.isNull(deviceInstallInfo.getData().getId())) {
throw new BizException(ErrCode.PARAMS_EXCEPTION);
}
if (LoginHelper.isSuperAdmin() && TenantHelper.getTenantId() != 0) {
deviceInstallInfo.getData().setTenantId(TenantHelper.getTenantId());
// query.where(tbDeviceInstallInfo.tenantId.eq(TenantHelper.getTenantId()));
}
iDeviceInstallInfoData.save(deviceInstallInfo.getData());
}
@PostMapping("/device/{id}/delete")
@SaCheckPermission("device:install:delete")
public void deleteClientUser(@PathVariable("id") String id) {
DeviceInstallInfo user = iDeviceInstallInfoData.findById(id);
if (user == null) {
throw new BizException(ErrCode.RECORD_NOT_FOUND);
}
iDeviceInstallInfoData.deleteById(id);
}
/* @PostMapping("/getDeviceInstallInfo")
public DeviceInstallInfo getUserInfo() {
return iDeviceInstallInfoData.findById(LoginHelper.getUserId());
}*/
@PostMapping("/getDetail")
@SaCheckPermission("device:install:query")
public DeviceInstallInfo getDetail(@Validated @RequestBody Request<String> request) {
return iDeviceInstallInfoData.findById(request.getData());
}
@PostMapping("/getPdf")
@SaCheckPermission("device:install:upload")
public void getPdf(@Validated @RequestBody Request<String> request, HttpServletResponse response) throws Exception {
DeviceInstallInfo data = iDeviceInstallInfoData.findById(request.getData());
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=\"installation_info.pdf\"");
// 生成PDF并写入响应流
PDFGenerator.generateInstallationPDF(data, response.getOutputStream());
}
// @PostMapping("/getPdf")
@SaCheckPermission("device:install:upload")
public void getPdf1(@Validated @RequestBody Request<String> request, HttpServletResponse response) throws Exception {
DeviceInstallInfo data = iDeviceInstallInfoData.findById(request.getData());
// 2. 创建PDF文档
// 1. 准备数据(实际应从数据库获取)
InstallationRecord record = new InstallationRecord();
record.setTeamName("徐峰伟班组");
record.setInstaller("梁立国");
record.setCommunity("二七路");
record.setBuildingNo("3");
record.setUnitNo("1");
record.setRoomNo("701");
record.setUserName("陈明珍");
record.setUserPhone("+86-13378574419");
record.setStoveType("台式灶");
record.setInstallDate("2025-07-07");
record.setBallValve(1);
record.setDrilling(0);
record.setPipeType("包覆管2米");
record.setNonFixedPipe(0);
record.setNut(0);
record.setQuickConnect(0);
// 2. 设置响应头
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=\"installation_record.pdf\"");
// 3. 生成并输出PDF
try (OutputStream out = response.getOutputStream()) {
byte[] pdfBytes = generateInstallationPdf(record);
out.write(pdfBytes);
out.flush();
}
/* response.setContentType("application/pdf");
response.setHeader("Cache-Control", "no-store");
response.setHeader("Pragma", "no-cache");
response.setHeader("Content-Disposition",
"attachment;filename=" + URLEncoder.encode("贵阳户内燃气安装信息表.pdf", "UTF-8"));
response.setDateHeader("Expires", 0);
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStream out = response.getOutputStream()) {
PdfDocument pdf = new PdfDocument(new PdfWriter(baos));
Document document = new Document(pdf, PageSize.A4.rotate());
// PdfFont font = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H");
PdfFont font = PdfFontFactory.createFont(StandardFonts.HELVETICA_BOLD);
document.setFont(font);
// 3. 添加标题
Paragraph title = new Paragraph("贵阳户内燃气安装信息表")
.setFontSize(18)
.setBold();
// .setTextAlignment(TextAlignment.CENTER);
document.add(title);*/
// 4. 创建信息表格
/* float[] columnWidths = {2, 3, 2, 3};
Table table = new Table(columnWidths);
// 基本信息行
table.addCell(createCell("安装班组", true));
table.addCell(createCell(data.getProposerTeam(), false));
table.addCell(createCell("安装人", true));
table.addCell(createCell(data.getProposer(), false));
// 用户信息行
table.addCell(createCell("用户姓名", true));
table.addCell(createCell(data.getUserName(), false));
table.addCell(createCell("联系电话", true));
table.addCell(createCell(data.getUserIpone(), false));
// 地址信息行
table.addCell(createCell("小区名称", true));
table.addCell(createCell(data.getCommunityName(), false));
table.addCell(createCell("详细地址", true));
table.addCell(createCell(data.getBuildingUnit() + data.getRoomNo(), false));
document.add(table);*/
/* document.close();
// 4. 输出到响应流
baos.writeTo(out);
out.flush();*/
// 5. 处理图片字段
/* addImageSection(document, "安装前图片", data.getBeforeInstallationImage());
addImageSection(document, "安装完成探测图片", data.getWorkingOfTheDetectorImage());
addImageSection(document, "测漏图片", data.getSideLeakageImage());
addImageSection(document, "点火图片", data.getIgnitionPictureImage());
IoUtil.write(response.getOutputStream(), false, content);*/
//document.close();
/*} catch (Exception e) {
try {
response.reset();
response.setContentType("application/json");
response.getWriter().write("{\"status\":500,\"message\":\"生成失败\"}");
} catch (IOException ioException) {
log.error("错误响应失败", ioException);
}
}*/
}
public byte[] generateInstallationPdf(InstallationRecord record) throws IOException, URISyntaxException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfDocument pdf = new PdfDocument(new PdfWriter(baos));
Document document = new Document(pdf);
// 加载字体文件
//String fontPath = getClass().getClassLoader().getResource("fonts/STSong-Light.ttf").toURI().getPath();
PdfFont font = PdfFontFactory.createFont(
"D:/SimsunExtG.ttf",
PdfEncodings.IDENTITY_H,
PdfFontFactory.EmbeddingStrategy.FORCE_EMBEDDED
);
// 设置中文字体
// PdfFont font = PdfFontFactory.createFont(StandardFonts.HELVETICA);
document.setFont(font);
System.out.println("Font embedded: " + font.isEmbedded());
// 添加标题
document.add(new Paragraph("贵阳户内安装信息录入表")
.setFontSize(18)
.setBold()
.setTextAlignment(TextAlignment.CENTER));
// 添加安装班组信息
document.add(new Paragraph("安装班组").setBold());
document.add(createInstallationInfoTable(record));
// 添加材料使用信息
document.add(new Paragraph("材料使用").setBold());
document.add(createMaterialUsageTable(record));
// 添加图片占位提示
for (int i = 1; i <= 4; i++) {
document.add(new Paragraph("第 " + i + " 页").setTextAlignment(TextAlignment.CENTER));
document.add(new Paragraph("(图片占位区域)").setItalic().setTextAlignment(TextAlignment.CENTER));
if (i < 4) {
document.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
}
}
document.close();
return baos.toByteArray();
}
private Table createInstallationInfoTable(InstallationRecord record) {
float[] columnWidths = {1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 2f, 1.5f};
Table table = new Table(columnWidths);
// 表头
table.addHeaderCell(createCell("安装人", true));
table.addHeaderCell(createCell("小区名称", true));
table.addHeaderCell(createCell("楼栋号", true));
table.addHeaderCell(createCell("单元号", true));
table.addHeaderCell(createCell("房号", true));
table.addHeaderCell(createCell("用户姓名", true));
table.addHeaderCell(createCell("用户电话", true));
table.addHeaderCell(createCell("灶具类型", true));
// 数据行
table.addCell(createCell(record.getInstaller(), false));
table.addCell(createCell(record.getCommunity(), false));
table.addCell(createCell(record.getBuildingNo(), false));
table.addCell(createCell(record.getUnitNo(), false));
table.addCell(createCell(record.getRoomNo(), false));
table.addCell(createCell(record.getUserName(), false));
table.addCell(createCell(record.getUserPhone(), false));
table.addCell(createCell(record.getStoveType(), false));
return table;
}
private Table createMaterialUsageTable(InstallationRecord record) {
float[] columnWidths = {1f, 1f, 2f, 1.5f, 1f, 1.5f};
Table table = new Table(columnWidths);
// 表头
table.addHeaderCell(createCell("序号", true));
table.addHeaderCell(createCell("球阀", true));
table.addHeaderCell(createCell("打孔", true));
table.addHeaderCell(createCell("管子使用类型及尺寸", true));
table.addHeaderCell(createCell("非定尺管", true));
table.addHeaderCell(createCell("螺母", true));
// 数据行
table.addCell(createCell("1", false));
table.addCell(createCell(String.valueOf(record.getBallValve()), false));
table.addCell(createCell(String.valueOf(record.getDrilling()), false));
table.addCell(createCell(record.getPipeType(), false));
table.addCell(createCell(String.valueOf(record.getNonFixedPipe()), false));
table.addCell(createCell(String.valueOf(record.getNut()), false));
return table;
}
private Cell createCell(String text, boolean isHeader) {
Paragraph p = new Paragraph(text);
Cell cell = new Cell().add(p);
if (isHeader) {
p.setBold();
cell.setBackgroundColor(new DeviceRgb(240, 240, 240));
}
cell.setPadding(5);
return cell;
}
/*private Cell createCell(String text, boolean isHeader) {
Paragraph p = new Paragraph(text);
Cell cell = new Cell().add(p);
if (isHeader) {
p.setBold();
cell.setBackgroundColor(new DeviceGray(0.9f));
}
cell.setPadding(5);
return cell;
}
private Cell createCell(String text, boolean isHeader) {
Cell cell = new Cell().add(new Paragraph(text));
if (isHeader) {
cell.setBackgroundColor(new DeviceRgb(240, 240, 240));
cell.setBold();
}
return cell;
}
private void addImageSection(Document doc, String title, String imageUrl) throws IOException {
if (imageUrl != null) {
try {
String im = imageUrl.replaceFirst("^https://", "http://");
URL url = new URL(im);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
if (conn.getResponseCode() != 200) {
throw new IOException("HTTP " + conn.getResponseCode());
}
ImageData imageData = ImageDataFactory.create(url.toString());
Image image = new Image(imageData).setAutoScale(true).setHorizontalAlignment(HorizontalAlignment.CENTER);
doc.add(new Paragraph(title).setBold().setMarginTop(10));
doc.add(image);
*//* ImageData imageData = ImageDataFactory.create(new URL(imageUrl));
Image image = new Image(imageData);
image.setAutoScale(true);
image.setHorizontalAlignment(HorizontalAlignment.CENTER);
doc.add(new Paragraph(title).setBold().setMarginTop(10));
doc.add(image);*//*
} catch (Exception e) {
doc.add(new Paragraph(title + "【图片加载失败】").setFontColor(ColorConstants.RED));
}
}
}*/
/* @ApiOperation(value = "浓度列表", notes = "设备列表", httpMethod = "POST")
//@SaCheckPermission("iot:device:query")
@PostMapping("/list")
public List<DeviceDetectorInfo> getDevices1(@Validated @RequestBody PageRequest<DeviceDetectorQueryBo> pageRequest) {
return deviceServiceImpl.getList(pageRequest);
}*/
}

@ -80,8 +80,8 @@ public class IccidRecordController {
@PostMapping("/list") @PostMapping("/list")
// @Operation(summary = "获得物联网卡分页") // @Operation(summary = "获得物联网卡分页")
public Paging<DIccidRecordRespVO> getDIccidRecordPage( @Validated @RequestBody PageRequest<DIccidRecordPageReqVO> pageReqVO) { public Paging<DIccidRecordDO> getDIccidRecordPage( @Validated @RequestBody PageRequest<DIccidRecordPageReqVO> pageReqVO) {
Paging<DIccidRecordRespVO> pageResult = dIccidRecordService.getDIccidRecordPage(pageReqVO); Paging<DIccidRecordDO> pageResult = dIccidRecordService.getDIccidRecordPage(pageReqVO);
return pageResult; return pageResult;
} }

@ -149,7 +149,7 @@ public class NotifyController {
} }
@ApiOperation("消息列表") @ApiOperation("消息列表")
@SaCheckPermission("iot:channelMsg:query") //@SaCheckPermission("iot:channelMsg:query")
@PostMapping("/message/getList") @PostMapping("/message/getList")
public Paging<NotifyMessage> messageList(@RequestBody @Validated(QueryGroup.class) PageRequest<NotifyMessage> request) { public Paging<NotifyMessage> messageList(@RequestBody @Validated(QueryGroup.class) PageRequest<NotifyMessage> request) {
return notifyService.getNotifyMessageList(request); return notifyService.getNotifyMessageList(request);

@ -25,18 +25,26 @@ package cc.iotkit.manager.controller;
import cc.iotkit.common.api.PageRequest; import cc.iotkit.common.api.PageRequest;
import cc.iotkit.common.api.Paging; import cc.iotkit.common.api.Paging;
import cc.iotkit.common.api.Request; import cc.iotkit.common.api.Request;
import cc.iotkit.common.excel.utils.ExcelUtil;
import cc.iotkit.common.log.annotation.Log; import cc.iotkit.common.log.annotation.Log;
import cc.iotkit.common.log.enums.BusinessType; import cc.iotkit.common.log.enums.BusinessType;
import cc.iotkit.common.satoken.utils.LoginHelper;
import cc.iotkit.common.tenant.helper.TenantHelper;
import cc.iotkit.common.utils.MapstructUtils;
import cc.iotkit.common.validate.AddGroup; import cc.iotkit.common.validate.AddGroup;
import cc.iotkit.common.validate.EditGroup; import cc.iotkit.common.validate.EditGroup;
import cc.iotkit.common.validate.QueryGroup; import cc.iotkit.common.validate.QueryGroup;
import cc.iotkit.data.config.TenantContext;
import cc.iotkit.manager.dto.bo.category.CategoryBo; import cc.iotkit.manager.dto.bo.category.CategoryBo;
import cc.iotkit.manager.dto.bo.device.DeviceQueryBo;
import cc.iotkit.manager.dto.bo.product.IconBo; import cc.iotkit.manager.dto.bo.product.IconBo;
import cc.iotkit.manager.dto.bo.product.IconTypeBo; import cc.iotkit.manager.dto.bo.product.IconTypeBo;
import cc.iotkit.manager.dto.bo.product.ProductBo; import cc.iotkit.manager.dto.bo.product.ProductBo;
import cc.iotkit.manager.dto.bo.productmodel.ProductModelBo; import cc.iotkit.manager.dto.bo.productmodel.ProductModelBo;
import cc.iotkit.manager.dto.bo.thingmodel.ThingModelBo; import cc.iotkit.manager.dto.bo.thingmodel.ThingModelBo;
import cc.iotkit.manager.dto.vo.category.CategoryVo; import cc.iotkit.manager.dto.vo.category.CategoryVo;
import cc.iotkit.manager.dto.vo.deviceinfo.DeviceInfoImportVo;
import cc.iotkit.manager.dto.vo.deviceinfo.DeviceInfoVo;
import cc.iotkit.manager.dto.vo.product.IconTypeVo; import cc.iotkit.manager.dto.vo.product.IconTypeVo;
import cc.iotkit.manager.dto.vo.product.IconVo; import cc.iotkit.manager.dto.vo.product.IconVo;
import cc.iotkit.manager.dto.vo.product.ProductVo; import cc.iotkit.manager.dto.vo.product.ProductVo;
@ -44,6 +52,7 @@ import cc.iotkit.manager.dto.vo.productmodel.ProductModelVo;
import cc.iotkit.manager.dto.vo.thingmodel.ThingModelVo; import cc.iotkit.manager.dto.vo.thingmodel.ThingModelVo;
import cc.iotkit.manager.service.IProductService; import cc.iotkit.manager.service.IProductService;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.ObjectUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -53,6 +62,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List; import java.util.List;
@Api(tags = {"产品"}) @Api(tags = {"产品"})
@ -70,9 +80,29 @@ public class ProductController {
@PostMapping("/list") @PostMapping("/list")
public Paging<ProductVo> getProducts(@Validated(QueryGroup.class) @RequestBody public Paging<ProductVo> getProducts(@Validated(QueryGroup.class) @RequestBody
PageRequest<ProductBo> request) { PageRequest<ProductBo> request) {
TenantContext.disableTenantFilter();
request.getData().setTenantId(null);
return productService.selectPageList(request); return productService.selectPageList(request);
} }
@ApiOperation("导出产品列表")
@Log(title = "产品管理", businessType = BusinessType.EXPORT)
// @SaCheckPermission("system:user:export")
@PostMapping("/export")
public void export(ProductBo productBo,
HttpServletResponse response) {
if(ObjectUtil.isEmpty(productBo)){
if(LoginHelper.isSuperAdmin() && TenantHelper.getTenantId() == 0){
productBo.setTenantId(null);
}else{
productBo.setTenantId(TenantHelper.getTenantId());
}
}
List<ProductVo> list = productService.selectPageList(productBo);
// List<ProductVo> listVo = MapstructUtils.convert(list, ProductVo.class);
ExcelUtil.exportExcel(list, "产品数据", ProductVo.class, response);
}
@ApiOperation("新建") @ApiOperation("新建")
@SaCheckPermission("iot:product:add") @SaCheckPermission("iot:product:add")
@PostMapping(value = "/add") @PostMapping(value = "/add")
@ -107,6 +137,7 @@ public class ProductController {
@SaCheckPermission("iot:iconType:query") @SaCheckPermission("iot:iconType:query")
@PostMapping("/icon/getAllIconType") @PostMapping("/icon/getAllIconType")
public List<IconTypeVo> getAllIconType() { public List<IconTypeVo> getAllIconType() {
TenantContext.disableTenantFilter();
return productService.selectIconTypeList(); return productService.selectIconTypeList();
} }
@ -128,6 +159,7 @@ public class ProductController {
@SaCheckPermission("iot:icon:query") @SaCheckPermission("iot:icon:query")
@PostMapping("/icon/getAllIcon") @PostMapping("/icon/getAllIcon")
public Paging<IconVo> getAllIcon(@Validated @RequestBody PageRequest<IconBo> request) { public Paging<IconVo> getAllIcon(@Validated @RequestBody PageRequest<IconBo> request) {
TenantContext.disableTenantFilter();
return productService.selectIconPageList(request); return productService.selectIconPageList(request);
} }
@ -171,6 +203,7 @@ public class ProductController {
@SaCheckPermission("iot:category:query") @SaCheckPermission("iot:category:query")
@PostMapping("/category/list") @PostMapping("/category/list")
public Paging<CategoryVo> getCategories(@Validated @RequestBody PageRequest<CategoryBo> request) { public Paging<CategoryVo> getCategories(@Validated @RequestBody PageRequest<CategoryBo> request) {
TenantContext.disableTenantFilter();
return productService.selectCategoryPageList(request); return productService.selectCategoryPageList(request);
} }
@ -178,16 +211,22 @@ public class ProductController {
@SaCheckPermission("iot:category:query") @SaCheckPermission("iot:category:query")
@PostMapping("/category/getAll") @PostMapping("/category/getAll")
public List<CategoryVo> getCategorieList() { public List<CategoryVo> getCategorieList() {
TenantContext.disableTenantFilter();
return productService.selectCategoryList(); return productService.selectCategoryList();
} }
@ApiOperation("品类编辑") @ApiOperation("品类编辑")
@SaCheckPermission("iot:category:edit") @SaCheckPermission("iot:category:edit")
@PostMapping("/category/edit") @PostMapping("/category/edit")
public boolean saveCategory(@Validated @RequestBody Request<CategoryBo> req) { public boolean editCategory(@Validated @RequestBody Request<CategoryBo> req) {
return productService.editCategory(req.getData()); return productService.editCategory(req.getData());
} }
@ApiOperation("品类添加")
@SaCheckPermission("iot:category:save")
@PostMapping("/category/save")
public boolean saveCategory(@Validated @RequestBody Request<CategoryBo> req) {
return productService.saveCategory(req.getData());
}
@ApiOperation("删除品类") @ApiOperation("删除品类")
@SaCheckPermission("iot:category:remove") @SaCheckPermission("iot:category:remove")
@PostMapping("/category/delete") @PostMapping("/category/delete")

@ -25,6 +25,8 @@ package cc.iotkit.manager.controller;
import cc.iotkit.common.api.PageRequest; import cc.iotkit.common.api.PageRequest;
import cc.iotkit.common.api.Paging; import cc.iotkit.common.api.Paging;
import cc.iotkit.common.api.Request; import cc.iotkit.common.api.Request;
import cc.iotkit.common.satoken.utils.LoginHelper;
import cc.iotkit.common.tenant.helper.TenantHelper;
import cc.iotkit.manager.dto.bo.ruleinfo.RuleInfoBo; import cc.iotkit.manager.dto.bo.ruleinfo.RuleInfoBo;
import cc.iotkit.manager.dto.bo.ruleinfo.RuleLogBo; import cc.iotkit.manager.dto.bo.ruleinfo.RuleLogBo;
import cc.iotkit.manager.dto.bo.taskinfo.TaskInfoBo; import cc.iotkit.manager.dto.bo.taskinfo.TaskInfoBo;
@ -35,6 +37,7 @@ import cc.iotkit.manager.dto.vo.taskinfo.TaskInfoVo;
import cc.iotkit.manager.dto.vo.taskinfo.TaskLogVo; import cc.iotkit.manager.dto.vo.taskinfo.TaskLogVo;
import cc.iotkit.manager.service.IRuleEngineService; import cc.iotkit.manager.service.IRuleEngineService;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.ObjectUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -68,21 +71,27 @@ public class RuleEngineController {
@SaCheckPermission("iot:rule:eidt") @SaCheckPermission("iot:rule:eidt")
@PostMapping("/edit") @PostMapping("/edit")
public boolean saveRule(@RequestBody @Validated Request<RuleInfoBo> ruleInfoBo) { public boolean saveRule(@RequestBody @Validated Request<RuleInfoBo> ruleInfoBo) {
TenantHelper.enableIgnore();
if (LoginHelper.isSuperAdmin() && ObjectUtil.isNotNull(TenantHelper.getTenantId()) && TenantHelper.getTenantId()!=0) {
ruleInfoBo.getData().setTenantId(TenantHelper.getTenantId());
}
return ruleEngineService.saveRule(ruleInfoBo.getData()); return ruleEngineService.saveRule(ruleInfoBo.getData());
} }
@ApiOperation("暂停规则") @ApiOperation("暂停规则")
@SaCheckPermission("iot:rule:edit") @SaCheckPermission("iot:rule:stop")
@PostMapping("/pause") @PostMapping("/pause")
public boolean pauseRule(@Validated @RequestBody Request<String> request) { public boolean pauseRule(@Validated @RequestBody Request<String> request) {
String ruleId = request.getData(); String ruleId = request.getData();
TenantHelper.enableIgnore();
return ruleEngineService.pauseRule(ruleId); return ruleEngineService.pauseRule(ruleId);
} }
@ApiOperation("恢复规则") @ApiOperation("恢复规则")
@SaCheckPermission("iot:rule:edit") @SaCheckPermission("iot:rule:start")
@PostMapping("/resume") @PostMapping("/resume")
public boolean resumeRule(@Validated @RequestBody Request<String> request) { public boolean resumeRule(@Validated @RequestBody Request<String> request) {
String ruleId = request.getData(); String ruleId = request.getData();
TenantHelper.enableIgnore();
return ruleEngineService.resumeRule(ruleId); return ruleEngineService.resumeRule(ruleId);
} }

@ -24,12 +24,18 @@ package cc.iotkit.manager.controller;
import cc.iotkit.common.api.PageRequest; import cc.iotkit.common.api.PageRequest;
import cc.iotkit.common.api.Paging; import cc.iotkit.common.api.Paging;
import cc.iotkit.common.api.Request;
import cc.iotkit.common.satoken.utils.AuthUtil; import cc.iotkit.common.satoken.utils.AuthUtil;
import cc.iotkit.common.satoken.utils.LoginHelper;
import cc.iotkit.common.utils.StreamUtils;
import cc.iotkit.data.config.TenantContext; import cc.iotkit.data.config.TenantContext;
import cc.iotkit.data.manager.IAlertRecordData; import cc.iotkit.data.manager.IAlertRecordData;
import cc.iotkit.data.manager.ICategoryData; import cc.iotkit.data.manager.ICategoryData;
import cc.iotkit.data.manager.IDeviceInfoData; import cc.iotkit.data.manager.IDeviceInfoData;
import cc.iotkit.data.manager.IProductData; import cc.iotkit.data.manager.IProductData;
import cc.iotkit.data.system.ISysDeptData;
import cc.iotkit.data.system.ISysUserData;
import cc.iotkit.manager.dto.bo.device.DeviceQueryBo; import cc.iotkit.manager.dto.bo.device.DeviceQueryBo;
import cc.iotkit.manager.dto.vo.deviceinfo.DeviceInfoVo; import cc.iotkit.manager.dto.vo.deviceinfo.DeviceInfoVo;
import cc.iotkit.manager.model.stats.MainStats; import cc.iotkit.manager.model.stats.MainStats;
@ -38,11 +44,16 @@ import cc.iotkit.manager.service.IDeviceManagerService;
import cc.iotkit.model.alert.AlertRecord; import cc.iotkit.model.alert.AlertRecord;
import cc.iotkit.model.device.DeviceInfo; import cc.iotkit.model.device.DeviceInfo;
import cc.iotkit.model.stats.AlertStatDTO; import cc.iotkit.model.stats.AlertStatDTO;
import cc.iotkit.model.stats.SysDeptDto;
import cc.iotkit.model.system.SysDept;
import cc.iotkit.model.system.SysUser;
import cc.iotkit.plugin.core.thing.actions.DeviceState;
import cc.iotkit.temporal.IThingModelMessageData; import cc.iotkit.temporal.IThingModelMessageData;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
@ -84,6 +95,13 @@ public class StatsController {
private AlertService alertService; private AlertService alertService;
@Autowired @Autowired
private IDeviceManagerService deviceServiceImpl; private IDeviceManagerService deviceServiceImpl;
@Autowired
private ISysDeptData isysDeptData;
@Autowired
private ISysUserData isSysUserData;
@PostMapping("/main") @PostMapping("/main")
public MainStats getMainStats() { public MainStats getMainStats() {
MainStats mainStats = new MainStats(); MainStats mainStats = new MainStats();
@ -93,8 +111,10 @@ public class StatsController {
TenantContext.isFilterDisabled()); TenantContext.isFilterDisabled());
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
if (AuthUtil.isAdmin()) { if (AuthUtil.isAdmin()) {
TenantContext.disableTenantFilter();
mainStats.setCategoryTotal(ICategoryData.count()); mainStats.setCategoryTotal(ICategoryData.count());
mainStats.setProductTotal(productData.count()); mainStats.setProductTotal(productData.count());
TenantContext.enableTenantFilter();
mainStats.setDeviceTotal(deviceInfoData.count()); mainStats.setDeviceTotal(deviceInfoData.count());
DeviceInfo condition = new DeviceInfo(); DeviceInfo condition = new DeviceInfo();
@ -118,9 +138,26 @@ public class StatsController {
//产品数量统计 //产品数量统计
mainStats.setDeviceStatsOfCategory(deviceInfoData.getDeviceStatsByCategory("")); mainStats.setDeviceStatsOfCategory(deviceInfoData.getDeviceStatsByCategory(""));
} else { } else {
TenantContext.disableTenantFilter();
//TenantContext.enableTenantFilter();
mainStats.setCategoryTotal(ICategoryData.count()); mainStats.setCategoryTotal(ICategoryData.count());
// mainStats.setProductTotal(productData.countByUid(uid)); mainStats.setProductTotal(productData.count());
mainStats.setDeviceTotal(deviceInfoData.countByUid(uid)); TenantContext.enableTenantFilter();
mainStats.setDeviceTotal(deviceInfoData.count());
DeviceInfo condition = new DeviceInfo();
DeviceInfo.State state = new DeviceInfo.State();
state.setOnline(true);
condition.setState(state);
mainStats.setOnlineTotal(deviceInfoData.findAllByCondition(condition).size());
state.setOnline(false);
condition.setState(state);
mainStats.setOfflineTotal(deviceInfoData.findAllByCondition(condition).size());
// 待激活设备
mainStats.setNeverOnlineTotal(deviceInfoData.findNeverUsedDevices().size());
// mainStats.setReportTotal(deviceReportRepository.countByUid(uid)); // mainStats.setReportTotal(deviceReportRepository.countByUid(uid));
//上报数据统计 //上报数据统计
mainStats.setReportDataStats(thingModelMessageData.getDeviceMessageStatsWithUid(uid, now - 48 * 3600 * 1000, now)); mainStats.setReportDataStats(thingModelMessageData.getDeviceMessageStatsWithUid(uid, now - 48 * 3600 * 1000, now));
@ -140,6 +177,7 @@ public class StatsController {
return JSONUtil.toJsonPrettyStr(list); return JSONUtil.toJsonPrettyStr(list);
// return list; // return list;
} }
@PostMapping("/deviceRecord") @PostMapping("/deviceRecord")
public String getDeviceRecord() { public String getDeviceRecord() {
List<AlertStatDTO> list = deviceInfoData.getDeviceRecord(); List<AlertStatDTO> list = deviceInfoData.getDeviceRecord();
@ -148,6 +186,7 @@ public class StatsController {
return JSONUtil.toJsonPrettyStr(list); return JSONUtil.toJsonPrettyStr(list);
// return list; // return list;
} }
@PostMapping("/mainTop") @PostMapping("/mainTop")
public String getMainTop() { public String getMainTop() {
//过滤租户开启 //过滤租户开启
@ -186,15 +225,16 @@ public class StatsController {
//告警总数 //告警总数
mainStats.setAlertCount(iAlertRecordData.count()); mainStats.setAlertCount(iAlertRecordData.count());
mainStats.setProductKeyCount(deviceInfoData.getProductDevice(null,null,null)); mainStats.setProductKeyCount(deviceInfoData.getProductDevice(null, null, null));
// jpaQueryFactory // jpaQueryFactory
// iAlertRecordData.findAll(); // iAlertRecordData.findAll();
//过滤租户关 //过滤租户关
//TenantContext.enableTenantFilter(); //TenantContext.enableTenantFilter();
return JSONUtil.toJsonPrettyStr(mainStats); return JSONUtil.toJsonPrettyStr(mainStats);
} }
@PostMapping("/mainListProduct") @PostMapping("/mainListProduct")
public String mainListProduct(Long deptAreaId,String startDate, String endDate) { public String mainListProduct(Long deptAreaId, String startDate, String endDate) {
//过滤租户开启 //过滤租户开启
TenantContext.disableTenantFilter(); TenantContext.disableTenantFilter();
@ -204,7 +244,7 @@ public class StatsController {
MainStats mainStats = new MainStats(); MainStats mainStats = new MainStats();
mainStats.setProductKeyCount(deviceInfoData.getProductDevice(deptAreaId,startDate,endDate)); mainStats.setProductKeyCount(deviceInfoData.getProductDevice(deptAreaId, startDate, endDate));
// jpaQueryFactory // jpaQueryFactory
// iAlertRecordData.findAll(); // iAlertRecordData.findAll();
//过滤租户关 //过滤租户关
@ -215,17 +255,20 @@ public class StatsController {
@ApiOperation(value = "设备列表", notes = "设备列表", httpMethod = "POST") @ApiOperation(value = "设备列表", notes = "设备列表", httpMethod = "POST")
//@SaCheckPermission("iot:device:query") //@SaCheckPermission("iot:device:query")
@PostMapping("/list") @PostMapping("/list")
public String getDevices(String productKey,Integer type) { public String getDevices(String productKey, Integer type) {
List<DeviceInfo> list = new ArrayList<>(); List<DeviceInfo> list = new ArrayList<>();
List<DeviceInfoVo> list1 = new ArrayList<>(); List<DeviceInfoVo> list1 = new ArrayList<>();
if(ObjectUtils.isNotEmpty(type) && type==0) { if (ObjectUtils.isNotEmpty(type) && type == 0) {
PageRequest<DeviceQueryBo> pageRequest = new PageRequest<>(20, 1, null); /* PageRequest<DeviceQueryBo> pageRequest = new PageRequest<>(-1, 1, null);
pageRequest.setData(new DeviceQueryBo()); // DeviceQueryBo pageRequest = new DeviceQueryBo();
pageRequest.getData().setProductKey(productKey); pageRequest.getData().setProductKey(productKey);
list1 = deviceServiceImpl.getDevices(pageRequest).getRows(); pageRequest.getData().setFlag(true);*/
//pageRequest.getData().setProductKey(productKey);
list1 = deviceServiceImpl.findByConditionsList(productKey, true);
for (DeviceInfoVo deviceInfoVo : list1) { for (DeviceInfoVo deviceInfoVo : list1) {
deviceInfoVo.setOnlineStatus(deviceInfoVo.getOnline()?"在线":"离线"); deviceInfoVo.setOnlineStatus(deviceInfoVo.getOnline() ? "在线" : "离线");
deviceInfoVo.setProductName(ObjectUtils.isNotEmpty(deviceInfoVo.getProduct().getName()) ? deviceInfoVo.getProduct().getName():""); deviceInfoVo.setProduct(productData.findByProductKey(deviceInfoVo.getProductKey()));
deviceInfoVo.setProductName(ObjectUtils.isNotEmpty(deviceInfoVo.getProduct().getName()) ? deviceInfoVo.getProduct().getName() : "");
} }
return JSONUtil.toJsonPrettyStr(list1); return JSONUtil.toJsonPrettyStr(list1);
} }
@ -234,6 +277,7 @@ public class StatsController {
}*/ }*/
return JSONUtil.toJsonPrettyStr(deviceInfoData.findByConditionsList(productKey)); return JSONUtil.toJsonPrettyStr(deviceInfoData.findByConditionsList(productKey));
} }
@ApiOperation("查询告警消息分页") @ApiOperation("查询告警消息分页")
// @SaCheckPermission("iot:alert:query") // @SaCheckPermission("iot:alert:query")
@PostMapping("/mainListAlert") @PostMapping("/mainListAlert")
@ -248,9 +292,77 @@ public class StatsController {
String formattedTime = Instant.ofEpochMilli(record.getAlertTime()).atZone(ZoneId.of("Asia/Shanghai")) String formattedTime = Instant.ofEpochMilli(record.getAlertTime()).atZone(ZoneId.of("Asia/Shanghai"))
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
//String formattedTime = zonedDateTime.format(formatter); //String formattedTime = zonedDateTime.format(formatter);
record.setAlertTimeStats(formattedTime record.setAlertTimeStats(formattedTime);
); record.setLevel(getSeverityLight(record.getLevel()));
// getSeverityLight
} }
return JSONUtil.toJsonPrettyStr(list); return JSONUtil.toJsonPrettyStr(list);
} }
public String getSeverityLight(String level) {
switch (level) {
case "1":
return "严重"; // 严重
case "2":
return "紧急"; // 紧急
case "3":
return "较重"; // 较重
case "4":
return "一般"; // 一般
case "5":
return "提示"; // 提示
default:
return "未知";
}
//return null;
}
@PostMapping("/webhook")
public void handleEvent(@RequestBody String payload) {
JSONObject data = new JSONObject(payload);
String event = data.get("event").toString(); // "client_connected"或"client_disconnected"
String clientId = data.get("clientid").toString();
boolean flag = false;
if ("client.connected".equals(event)) {
//链接
flag = true;
}/*else if("client_disconnected".equals(event)){
//断开
}*/
DeviceInfo deviceInfo = deviceInfoData.findByDeviceName(clientId);
if (ObjectUtils.isNotEmpty(deviceInfo)) {
Long onlineTime = System.currentTimeMillis();
Long offlineTime = System.currentTimeMillis();
deviceInfo.getState().setOnline(flag);
if (flag) {
deviceInfo.getState().setOnlineTime(onlineTime);
if (ObjectUtil.isNull(deviceInfo.getDeviceStatus())) {
deviceInfo.setDeviceStatus(0);
} else if (!deviceInfo.getDeviceStatus().equals(1) && !deviceInfo.getDeviceStatus().equals(2)) {
deviceInfo.setDeviceStatus(0);
}
} else {
//离线
deviceInfo.getState().setOfflineTime(offlineTime);
if (ObjectUtil.isNull(deviceInfo.getDeviceStatus())) {
deviceInfo.setDeviceStatus(0);
} else if (!deviceInfo.getDeviceStatus().equals(1) && !deviceInfo.getDeviceStatus().equals(2)) {
deviceInfo.setDeviceStatus(3);
}
}
deviceInfoData.save(deviceInfo);
}
System.out.println("设备状态变更: " + clientId + " -> " + event);
}
/**
*
*/
@PostMapping("/getAreaDept")
public SysDeptDto getAreaDept(@Validated @RequestBody PageRequest<Long> pageRequest) {
return deviceInfoData.getStatsCount(pageRequest.getData());
//long countByUid(String uid);
}
} }

@ -30,11 +30,16 @@ import cc.iotkit.common.enums.ErrCode;
import cc.iotkit.common.exception.BizException; import cc.iotkit.common.exception.BizException;
import cc.iotkit.common.satoken.utils.AuthUtil; import cc.iotkit.common.satoken.utils.AuthUtil;
import cc.iotkit.common.satoken.utils.LoginHelper; import cc.iotkit.common.satoken.utils.LoginHelper;
import cc.iotkit.common.tenant.helper.TenantHelper;
import cc.iotkit.common.utils.ReflectUtil; import cc.iotkit.common.utils.ReflectUtil;
import cc.iotkit.common.utils.StreamUtils;
import cc.iotkit.data.config.TenantContext;
import cc.iotkit.data.manager.IDeviceInfoData; import cc.iotkit.data.manager.IDeviceInfoData;
import cc.iotkit.data.manager.IHomeData; import cc.iotkit.data.manager.IHomeData;
import cc.iotkit.data.manager.ISpaceData; import cc.iotkit.data.manager.ISpaceData;
import cc.iotkit.data.manager.IUserInfoData; import cc.iotkit.data.manager.IUserInfoData;
import cc.iotkit.data.system.ISysDeptData;
import cc.iotkit.data.system.ISysUserData;
import cc.iotkit.manager.dto.vo.category.vo.DIccidRecordPageReqVO; import cc.iotkit.manager.dto.vo.category.vo.DIccidRecordPageReqVO;
import cc.iotkit.manager.dto.vo.product.ProductVo; import cc.iotkit.manager.dto.vo.product.ProductVo;
import cc.iotkit.manager.dto.vo.userInfo.UserInfoPageReqVO; import cc.iotkit.manager.dto.vo.userInfo.UserInfoPageReqVO;
@ -43,14 +48,18 @@ import cc.iotkit.model.UserInfo;
import cc.iotkit.model.device.DeviceInfo; import cc.iotkit.model.device.DeviceInfo;
import cc.iotkit.model.space.Home; import cc.iotkit.model.space.Home;
import cc.iotkit.model.space.Space; import cc.iotkit.model.space.Space;
import cc.iotkit.model.system.SysDept;
import cc.iotkit.model.system.SysUser;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Objects;
@Api(tags = {"用户"}) @Api(tags = {"用户"})
@RestController @RestController
@ -67,6 +76,10 @@ public class UserInfoController {
private IHomeData homeData; private IHomeData homeData;
@Autowired @Autowired
private ISpaceData spaceData; private ISpaceData spaceData;
@Autowired
private ISysDeptData sysDeptData;
@Autowired
private ISysUserData sysUserData;
/** /**
* *
@ -124,6 +137,18 @@ public class UserInfoController {
public Paging<UserInfo> clientUsersList( @Validated @RequestBody PageRequest<UserInfoPageReqVO> pageReqVO) { public Paging<UserInfo> clientUsersList( @Validated @RequestBody PageRequest<UserInfoPageReqVO> pageReqVO) {
pageReqVO.getData().setType(UserInfo.USER_TYPE_CLIENT); pageReqVO.getData().setType(UserInfo.USER_TYPE_CLIENT);
if (!LoginHelper.isSuperAdmin() && Objects.nonNull(LoginHelper.getUserId())) {
List<Long> areaIds = null;
SysUser user = sysUserData.findById(LoginHelper.getUserId());
Long deptId = user.getDeptAreaId();
// sysDeptData.findByTenantId()
List<SysDept> depts = sysDeptData.findByDeptId(deptId);
areaIds = StreamUtils.toList(depts, SysDept::getId);
areaIds.add(deptId);
if(ObjectUtil.isNotNull(areaIds)) {
pageReqVO.getData().setDeptAreaIds(areaIds);
}
}
Paging <UserInfo> Paging = userInfoData.findAll(pageReqVO.to(UserInfo.class)); Paging <UserInfo> Paging = userInfoData.findAll(pageReqVO.to(UserInfo.class));
@ -141,8 +166,15 @@ public class UserInfoController {
public void addClientUser(@RequestBody Request<UserInfo> user) throws Exception { public void addClientUser(@RequestBody Request<UserInfo> user) throws Exception {
user.getData().setType(UserInfo.USER_TYPE_CLIENT); user.getData().setType(UserInfo.USER_TYPE_CLIENT);
user.getData().setRoles(Collections.singletonList(Constants.ROLE_CLIENT)); user.getData().setRoles(Collections.singletonList(Constants.ROLE_CLIENT));
user.getData().setSecret(AuthUtil.enCryptPwd(Constants.PWD_CLIENT_USER)); user.getData().setSecret(null);
TenantHelper.enableIgnore();
userInfoData.save(user.getData());
/* if(LoginHelper.isSuperAdmin() && TenantHelper.getTenantId() != 0) {
userInfoData.save(user.getData()); userInfoData.save(user.getData());
}else{
user.getData().setTenantId(null);
userInfoData.save(user.getData());
}*/
//添加默认家庭 //添加默认家庭
Home home = homeData.save(Home.builder() Home home = homeData.save(Home.builder()
@ -166,7 +198,16 @@ public class UserInfoController {
/* user.getData().setType(UserInfo.USER_TYPE_CLIENT); /* user.getData().setType(UserInfo.USER_TYPE_CLIENT);
user.getData().setRoles(Collections.singletonList(Constants.ROLE_CLIENT)); user.getData().setRoles(Collections.singletonList(Constants.ROLE_CLIENT));
user.getData().setSecret(AuthUtil.enCryptPwd(Constants.PWD_CLIENT_USER));*/ user.getData().setSecret(AuthUtil.enCryptPwd(Constants.PWD_CLIENT_USER));*/
user.getData().setSecret(null);
TenantHelper.enableIgnore();
userInfoData.save(user.getData());
/* if(LoginHelper.isSuperAdmin() && TenantHelper.getTenantId() != 0) {
userInfoData.save(user.getData());
}else{
user.getData().setTenantId(null);
userInfoData.save(user.getData()); userInfoData.save(user.getData());
}*/
/* //添加默认家庭 /* //添加默认家庭
Home home = homeData.save(Home.builder() Home home = homeData.save(Home.builder()
.name("我的家庭") .name("我的家庭")
@ -220,7 +261,9 @@ public class UserInfoController {
if (user == null) { if (user == null) {
throw new BizException(ErrCode.USER_NOT_FOUND); throw new BizException(ErrCode.USER_NOT_FOUND);
} }
if (!AuthUtil.getUserId().equals(user.getId())) { System.out.println(AuthUtil.getUserId());
if (!AuthUtil.getUserId().equals(user.getId().toString())) {
throw new BizException(ErrCode.UNAUTHORIZED_EXCEPTION); throw new BizException(ErrCode.UNAUTHORIZED_EXCEPTION);
} }
@ -237,5 +280,32 @@ public class UserInfoController {
throw new BizException(ErrCode.UPDATE_PWD_ERROR, e); throw new BizException(ErrCode.UPDATE_PWD_ERROR, e);
} }
} }
/**
*
*/
@PostMapping("/{uid}/modifyPwdId")
public void modifyPwd(@PathVariable("uid") Long uid, String oldPwd, String newPwd) {
UserInfo user = userInfoData.findById(uid);
if (user == null) {
throw new BizException(ErrCode.USER_NOT_FOUND);
}
System.out.println(AuthUtil.getUserId());
if (!AuthUtil.getUserId().equals(user.getId().toString())) {
throw new BizException(ErrCode.UNAUTHORIZED_EXCEPTION);
}
try {
if (!AuthUtil.checkPwd(oldPwd, user.getSecret())) {
throw new BizException(ErrCode.PWD_ERROR);
}
user.setSecret(AuthUtil.enCryptPwd(newPwd));
userInfoData.save(user);
} catch (BizException e) {
throw e;
} catch (Throwable e) {
throw new BizException(ErrCode.UPDATE_PWD_ERROR, e);
}
}
} }

@ -28,11 +28,13 @@ import cc.iotkit.common.api.Request;
import cc.iotkit.common.exception.BizException; import cc.iotkit.common.exception.BizException;
import cc.iotkit.common.satoken.utils.AuthUtil; import cc.iotkit.common.satoken.utils.AuthUtil;
import cc.iotkit.common.satoken.utils.LoginHelper; import cc.iotkit.common.satoken.utils.LoginHelper;
import cc.iotkit.common.tenant.helper.TenantHelper;
import cc.iotkit.common.thing.ThingModelMessage; import cc.iotkit.common.thing.ThingModelMessage;
import cc.iotkit.common.validate.QueryGroup; import cc.iotkit.common.validate.QueryGroup;
import cc.iotkit.data.config.TenantContext; import cc.iotkit.data.config.TenantContext;
import cc.iotkit.data.manager.IAlertRecordData; import cc.iotkit.data.manager.IAlertRecordData;
import cc.iotkit.data.manager.IDeviceInfoData; import cc.iotkit.data.manager.IDeviceInfoData;
import cc.iotkit.data.manager.IDeviceInstallInfoData;
import cc.iotkit.data.manager.IProductData; import cc.iotkit.data.manager.IProductData;
import cc.iotkit.manager.dto.bo.channel.ChannelTemplateBo; import cc.iotkit.manager.dto.bo.channel.ChannelTemplateBo;
import cc.iotkit.manager.dto.bo.device.*; import cc.iotkit.manager.dto.bo.device.*;
@ -52,11 +54,14 @@ import cc.iotkit.model.InvokeResult;
import cc.iotkit.model.alert.AlertConfig; import cc.iotkit.model.alert.AlertConfig;
import cc.iotkit.model.device.DeviceConfig; import cc.iotkit.model.device.DeviceConfig;
import cc.iotkit.model.device.DeviceInfo; import cc.iotkit.model.device.DeviceInfo;
import cc.iotkit.model.device.DeviceInstallInfo;
import cc.iotkit.model.device.message.DeviceProperty; import cc.iotkit.model.device.message.DeviceProperty;
import cc.iotkit.model.product.Product; import cc.iotkit.model.product.Product;
import cc.iotkit.model.rule.RuleInfo;
import cc.iotkit.temporal.IThingModelMessageData; import cc.iotkit.temporal.IThingModelMessageData;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.util.ObjectUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -70,14 +75,20 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List; import java.util.List;
import static cc.iotkit.common.web.core.BaseController.fail;
@Api(tags = {"小程序-我的设备"}) @Api(tags = {"小程序-我的设备"})
@Slf4j @Slf4j
@RestController @RestController
@RequestMapping("/xcxDevice") @RequestMapping("/xcxDevice")
public class XcxDeviceController { public class XcxDeviceController {
// @Autowired
// private IDeviceInstallInfoService deviceServiceImpl;
@Autowired @Autowired
IProductService productService; IProductService productService;
@ -90,7 +101,8 @@ public class XcxDeviceController {
@Autowired @Autowired
private IProductData productData; private IProductData productData;
@Autowired
private IDeviceInstallInfoData iDeviceInstallInfoData;
@Resource @Resource
private NotifyService notifyService; private NotifyService notifyService;
@Autowired @Autowired
@ -114,20 +126,20 @@ public class XcxDeviceController {
String uid = AuthUtil.getUserId(); String uid = AuthUtil.getUserId();
pageRequest.getData().setUid(uid); pageRequest.getData().setUid(uid);
} }
Paging<DeviceInfoVo> d= deviceServiceImpl.getDevices(pageRequest); // Paging<DeviceInfoVo> d= deviceServiceImpl.getDevices(pageRequest);
return deviceServiceImpl.getDevices(pageRequest); return deviceServiceImpl.getDevices(pageRequest);
} }
/* @ApiOperation(value = "创建设备") @ApiOperation(value = "创建设备")
@SaCheckPermission("iot:device:add") // @SaCheckPermission("iot:device:add")
@PostMapping("/add") @PostMapping("/edit")
public boolean createDevice(@RequestBody @Validated Request<DeviceInfoBo> bo) { public boolean createDevice(@RequestBody @Validated Request<DeviceInfoBo> bo) {
return deviceServiceImpl.addDevice(bo.getData()); return deviceServiceImpl.saveDevice1(bo.getData());
}*/ }
@ApiOperation(value = "保存与绑定设备") @ApiOperation(value = "保存与绑定设备")
@PostMapping("/save") @PostMapping("/save")
public boolean saveDevice(@RequestBody @Validated Request<DeviceInfoBo> bo) { public Long saveDevice(@RequestBody @Validated Request<DeviceInfoBo> bo) {
return deviceServiceImpl.editBandDeviceInfo(bo.getData()); return deviceServiceImpl.editBandDeviceInfo(bo.getData());
} }
@ -135,7 +147,8 @@ public class XcxDeviceController {
// @SaCheckPermission("iot:device:edit") // @SaCheckPermission("iot:device:edit")
@PostMapping("/unbind") @PostMapping("/unbind")
public boolean unbindDevice(@Validated @RequestBody Request<String> request) { public boolean unbindDevice(@Validated @RequestBody Request<String> request) {
return deviceServiceImpl.unbindDevice(request.getData());
return deviceServiceImpl.unbindDeviceXcx(request.getData());
} }
@ApiOperation(value = "获取子设备", notes = "获取子设备") @ApiOperation(value = "获取子设备", notes = "获取子设备")
// @SaCheckPermission("iot:device:query") // @SaCheckPermission("iot:device:query")
@ -156,9 +169,18 @@ public class XcxDeviceController {
// @SaCheckPermission("iot:device:query") // @SaCheckPermission("iot:device:query")
@PostMapping("/detail") @PostMapping("/detail")
public DeviceInfo getDetail(@RequestBody @Validated Request<String> request) { public DeviceInfo getDetail(@RequestBody @Validated Request<String> request) {
if(ObjectUtil.isNull(request.getData())){
return null;
}
DeviceInfo deviceInfo = deviceServiceImpl.getDetail(request.getData()); DeviceInfo deviceInfo = deviceServiceImpl.getDetail(request.getData());
Product product= productData.findByProductKey(deviceInfo.getProductKey()); if(ObjectUtil.isNotEmpty(deviceInfo)) {
Product product = productData.findByProductKey(deviceInfo.getProductKey());
if(product!=null && ObjectUtil.isNotNull(product.getName())) {
deviceInfo.setProductName(product.getName()); deviceInfo.setProductName(product.getName());
}
}
DeviceInstallInfo deviceRepetition1 = iDeviceInstallInfoData.findByDeviceNameAndUidAndState(deviceInfo.getDeviceName(),deviceInfo.getUid(),0);
deviceInfo.setDeviceInstallInfo(deviceRepetition1);
return deviceInfo; return deviceInfo;
} }
@ -238,11 +260,11 @@ public class XcxDeviceController {
* **********************************************************************/ * **********************************************************************/
@ApiOperation("规则列表") @ApiOperation("规则列表")
@PostMapping("/rulelist") @PostMapping("/rulelist")
public Paging<RuleInfoVo> rules( public List<RuleInfo> rules(
@Validated @RequestBody @Validated @RequestBody
PageRequest<RuleInfoBo> request PageRequest<RuleInfoBo> request
) { ) {
return ruleEngineService.selectPageList(request); return ruleEngineService.selectPageList1(request);
} }
@ApiOperation("产品列表") @ApiOperation("产品列表")
//@SaCheckPermission("iot:product:query") //@SaCheckPermission("iot:product:query")
@ -261,17 +283,20 @@ public class XcxDeviceController {
@PostMapping("/pause") @PostMapping("/pause")
public boolean pauseRule(@Validated @RequestBody Request<String> request) { public boolean pauseRule(@Validated @RequestBody Request<String> request) {
String ruleId = request.getData(); String ruleId = request.getData();
TenantHelper.enableIgnore();
return ruleEngineService.pauseRule(ruleId); return ruleEngineService.pauseRule(ruleId);
} }
@ApiOperation("恢复规则") @ApiOperation("恢复规则")
@PostMapping("/resume") @PostMapping("/resume")
public boolean resumeRule(@Validated @RequestBody Request<String> request) { public boolean resumeRule(@Validated @RequestBody Request<String> request) {
String ruleId = request.getData(); String ruleId = request.getData();
TenantHelper.enableIgnore();
return ruleEngineService.resumeRule(ruleId); return ruleEngineService.resumeRule(ruleId);
} }
@ApiOperation("保存规则") @ApiOperation("保存规则")
@PostMapping("/ruleEdit") @PostMapping("/ruleEdit")
public boolean saveRule(@RequestBody @Validated Request<RuleInfoBo> ruleInfoBo) { public boolean saveRule(@RequestBody @Validated Request<RuleInfoBo> ruleInfoBo) {
TenantHelper.enableIgnore();
return ruleEngineService.saveRule(ruleInfoBo.getData()); return ruleEngineService.saveRule(ruleInfoBo.getData());
} }
@ApiOperation("删除规则") @ApiOperation("删除规则")
@ -286,6 +311,7 @@ public class XcxDeviceController {
@PostMapping("/channel/template/getList") @PostMapping("/channel/template/getList")
public Paging<ChannelTemplateVo> getChannelTemplateList(@RequestBody @Validated(QueryGroup.class) PageRequest<ChannelTemplateBo> request) { public Paging<ChannelTemplateVo> getChannelTemplateList(@RequestBody @Validated(QueryGroup.class) PageRequest<ChannelTemplateBo> request) {
//方案1 admin设置好之后,过滤租户id,所有租户都可以用该模版. //方案1 admin设置好之后,过滤租户id,所有租户都可以用该模版.
TenantContext.disableTenantFilter();
return notifyService.getChannelTemplateList(request); return notifyService.getChannelTemplateList(request);
} }
@ -297,15 +323,32 @@ public class XcxDeviceController {
String uid = AuthUtil.getUserId(); String uid = AuthUtil.getUserId();
request.getData().setUid(uid); request.getData().setUid(uid);
} }
List<AlertConfig> list= alertService.getAlertConfig(request.getData()); if(ObjectUtil.isNotNull(request.getData().getDeviceName())) {
String date= LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
request.getData().setName(request.getData().getDeviceName() + "_" + date);
}else{
request.getData().setName("imei_" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
/* List<AlertConfig> list= alertService.getAlertConfig(request.getData());
if(ObjectUtils.isNotEmpty(list)){ if(ObjectUtils.isNotEmpty(list)){
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
if(!list.get(i).getRuleInfoId().equals(request.getData().getRuleInfoId())){ if(!list.get(i).getRuleInfoId().equals(request.getData().getRuleInfoId())){
throw new BizException("该规则模版已存在"); // throw new BizException("该规则模版已存在");
fail("该规则模版已存在");
} }
} }
}*/
AlertConfig alertConfig = alertService.createAlertConfig(request.getData());
try {
if(ObjectUtils.isNotEmpty(request.getData().getRuleInfoId()) && !"".equals(request.getData().getRuleInfoId())) {
String ruleId = request.getData().getRuleInfoId();
TenantHelper.enableIgnore();
ruleEngineService.pauseRule(ruleId);
ruleEngineService.resumeRule(ruleId);
} }
return alertService.createAlertConfig(request.getData()); }catch (Exception e){
}
return alertConfig;
} }
@ApiOperation("查询告警中心配置分页") @ApiOperation("查询告警中心配置分页")
@ -329,4 +372,6 @@ public class XcxDeviceController {
public AlertConfig updateAlertConfig(@RequestBody @Validated Request<AlertConfig> request) { public AlertConfig updateAlertConfig(@RequestBody @Validated Request<AlertConfig> request) {
return alertService.updateAlertConfig(request.getData()); return alertService.updateAlertConfig(request.getData());
}*/ }*/
} }

@ -122,8 +122,9 @@ public class XcxIndexController {
condition.setState(state); condition.setState(state);
condition.setUid(uid); condition.setUid(uid);
mainStats.setOnlineTotal(deviceInfoData.findAllByCondition(condition).size()); mainStats.setOnlineTotal(deviceInfoData.countByUidAndState(uid, "online"));
mainStats.setAlertCount(iAlertRecordData.countByUid(uid)); mainStats.setAlertCount(iAlertRecordData.countByUid(uid));
//上报数据统计 //上报数据统计
/* mainStats.setReportDataStats(thingModelMessageData.getDeviceMessageStatsWithUid(uid, now - 48 * 3600 * 1000, now)); /* mainStats.setReportDataStats(thingModelMessageData.getDeviceMessageStatsWithUid(uid, now - 48 * 3600 * 1000, now));
//产品数量统计 //产品数量统计

@ -0,0 +1,88 @@
/*
*
* * | Licensed OPENIITA
* * +----------------------------------------------------------------------
* * | Author: xw2sy@163.com
* * +----------------------------------------------------------------------
*
* Copyright [2024] [OPENIITA]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package cc.iotkit.manager.dto.bo.device;
import cc.iotkit.common.api.BaseDto;
import io.github.linpeilie.annotations.AutoMapping;
import io.github.linpeilie.annotations.ReverseAutoMapping;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.Size;
import java.util.Date;
@ApiModel(value = "DeviceDetectorQueryBo")
@Data
@EqualsAndHashCode(callSuper = true)
public class DeviceDetectorQueryBo extends BaseDto {
/* @ApiModelProperty(value="关键字")
private String keyword;
@ApiModelProperty(value="分组")
@AutoMapping(ignore = true)
@ReverseAutoMapping(ignore = true)
private String group;
@ApiModelProperty(value="设备id")
@Size(max = 255, message = "设备id长度不正确")
private String deviceId;
@ApiModelProperty(value="设备名称特殊编码")
@Size(max = 255, message = "设备名称长度不正确")
private String deviceName;
@ApiModelProperty(value="设备类型")
@Size(max = 255, message = "设备类型长度不正确")
private String model;
@ApiModelProperty(value="父级id")
@Size(max = 255, message = "父级id长度不正确")
private String parentId;
@ApiModelProperty(value="产品key")
@Size(max = 255, message = "产品key长度不正确")
private String productKey;
@ApiModelProperty(value="设备状态")
@AutoMapping(ignore = true)
@ReverseAutoMapping(ignore = true)
private Boolean online;
@ApiModelProperty(value="用户id")
@Size(max = 255, message = "用户id长度不正确")
private String uid;
private Long deptAreaId;
private Long tenantId;
@ApiModelProperty(value="设备名称")
private String name;*/
@ApiModelProperty(value="设备名称")
private String startTime;
@ApiModelProperty(value="设备名称")
private String endTime;
private String deviceId;
}

@ -25,6 +25,7 @@ package cc.iotkit.manager.dto.bo.device;
import cc.iotkit.common.api.BaseDto; import cc.iotkit.common.api.BaseDto;
import cc.iotkit.model.device.DeviceInfo; import cc.iotkit.model.device.DeviceInfo;
import cc.iotkit.model.device.DeviceInstallInfo;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import io.github.linpeilie.annotations.AutoMapping; import io.github.linpeilie.annotations.AutoMapping;
import io.github.linpeilie.annotations.ReverseAutoMapping; import io.github.linpeilie.annotations.ReverseAutoMapping;
@ -35,6 +36,9 @@ import javax.validation.constraints.Size;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.util.HashMap;
import java.util.Map;
@ApiModel(value = "DeviceInfoBo") @ApiModel(value = "DeviceInfoBo")
@Data @Data
@ -93,5 +97,23 @@ public class DeviceInfoBo extends BaseDto {
@ApiModelProperty(value = "用户id") @ApiModelProperty(value = "用户id")
@Size(max = 255, message = "用户id长度不正确") @Size(max = 255, message = "用户id长度不正确")
private String uid; private String uid;
private Long tenantId;
private String groupId;
private DeviceInstallInfo deviceInstallInfo;
private String nodeOne;
private String nodeTwo;
private String nodeThree;
private String nodeFour;
private String nodeFive;
private String nodeOneStatus;
private String nodeTwoStatus;
private String nodeThreeStatus;
private String nodeFourStatus;
private String nodeFiveStatus;
private String nodeOneDevice;
private String nodeTwoDevice;
private String nodeThreeDevice;
private String nodeFourDevice;
private String nodeFiveDevice;
} }

@ -0,0 +1,105 @@
/*
*
* * | Licensed OPENIITA
* * +----------------------------------------------------------------------
* * | Author: xw2sy@163.com
* * +----------------------------------------------------------------------
*
* Copyright [2024] [OPENIITA]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package cc.iotkit.manager.dto.bo.device;
import cc.iotkit.common.api.BaseDto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@ApiModel(value = "DeviceInstallInfoQueryBo")
@Data
@EqualsAndHashCode(callSuper = true)
public class DeviceInstallInfoQueryBo extends BaseDto {
/* @ApiModelProperty(value="关键字")
private String keyword;
@ApiModelProperty(value="分组")
@AutoMapping(ignore = true)
@ReverseAutoMapping(ignore = true)
private String group;
@ApiModelProperty(value="设备id")
@Size(max = 255, message = "设备id长度不正确")
private String deviceId;
@ApiModelProperty(value="设备名称特殊编码")
@Size(max = 255, message = "设备名称长度不正确")
private String deviceName;
@ApiModelProperty(value="设备类型")
@Size(max = 255, message = "设备类型长度不正确")
private String model;
@ApiModelProperty(value="父级id")
@Size(max = 255, message = "父级id长度不正确")
private String parentId;
@ApiModelProperty(value="产品key")
@Size(max = 255, message = "产品key长度不正确")
private String productKey;
@ApiModelProperty(value="设备状态")
@AutoMapping(ignore = true)
@ReverseAutoMapping(ignore = true)
private Boolean online;
@ApiModelProperty(value="用户id")
@Size(max = 255, message = "用户id长度不正确")
private String uid;
private Long deptAreaId;
private Long tenantId;
@ApiModelProperty(value="设备名称")
private String name;*/
@ApiModelProperty(value = "设备名称")
private String startTime;
@ApiModelProperty(value = "设备名称")
private String endTime;
private String deviceName;
private String uid;
private Long tenantId;
// @ApiModelProperty(value = "公司名称")
private String corporateName;
// @ApiModelProperty(value = "申请时间")
// @ApiModelProperty(value = "申请人")
private String proposer;
// @ApiModelProperty(value = "申请班组")
private String proposerTeam;
// @ApiModelProperty(value = "小区名称")
private String communityName;
// @ApiModelProperty(value = "用户名称")
private String userName;
// @ApiModelProperty(value = "用户电话")
private String userIpone;
}

@ -24,6 +24,7 @@ package cc.iotkit.manager.dto.bo.device;
import cc.iotkit.common.api.BaseDto; import cc.iotkit.common.api.BaseDto;
import cc.iotkit.model.device.DeviceInfo; import cc.iotkit.model.device.DeviceInfo;
import cc.iotkit.model.system.SysApp;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import io.github.linpeilie.annotations.AutoMapping; import io.github.linpeilie.annotations.AutoMapping;
import io.github.linpeilie.annotations.ReverseAutoMapping; import io.github.linpeilie.annotations.ReverseAutoMapping;
@ -36,6 +37,7 @@ import lombok.EqualsAndHashCode;
@ApiModel(value = "DeviceQueryBo") @ApiModel(value = "DeviceQueryBo")
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@AutoMapper(target = DeviceInfo.class, reverseConvertGenerate = false)
public class DeviceQueryBo extends BaseDto { public class DeviceQueryBo extends BaseDto {
@ -77,7 +79,8 @@ public class DeviceQueryBo extends BaseDto {
@Size(max = 255, message = "用户id长度不正确") @Size(max = 255, message = "用户id长度不正确")
private String uid; private String uid;
private Long deptAreaId; private Long deptAreaId;
private Long tenantId;
@ApiModelProperty(value="设备名称") @ApiModelProperty(value="设备名称")
private String name; private String name;
private Boolean flag = false;
} }

@ -58,7 +58,7 @@ public class ProductBo extends BaseDto {
@ApiModelProperty(value = "创建时间") @ApiModelProperty(value = "创建时间")
private Long createAt; private Long createAt;
private Long tenantId;
@ApiModelProperty(value = "图片") @ApiModelProperty(value = "图片")
@Size(max = 255, message = "图片长度不正确") @Size(max = 255, message = "图片长度不正确")
private String img; private String img;

@ -78,5 +78,5 @@ public class RuleInfoBo extends BaseDto {
@ApiModelProperty(value = "用户id") @ApiModelProperty(value = "用户id")
@Size(max = 255, message = "用户id长度不正确") @Size(max = 255, message = "用户id长度不正确")
private String uid; private String uid;
private Long tenantId;
} }

@ -44,4 +44,5 @@ public class FeedBackEvaluationSaveReqVO {
// @Schema(description = "客户电话") // @Schema(description = "客户电话")
private String customerPhone; private String customerPhone;
private Long customerId; private Long customerId;
private Long tenantId;
} }

@ -16,6 +16,7 @@ import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Date;
//@Schema(description = "管理后台 - 物联网卡分页 Request VO") //@Schema(description = "管理后台 - 物联网卡分页 Request VO")
@ -71,4 +72,7 @@ public class DIccidRecordPageReqVO extends BaseDto implements Serializable {
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime expirationTime; private LocalDateTime expirationTime;
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime expirationTimeEnd;
} }

@ -75,5 +75,5 @@ public class DIccidRecordRespVO implements Serializable {
private Integer validDays; private Integer validDays;
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime expirationTime; private String expirationTime;
} }

@ -0,0 +1,59 @@
/*
*
* * | Licensed OPENIITA
* * +----------------------------------------------------------------------
* * | Author: xw2sy@163.com
* * +----------------------------------------------------------------------
*
* Copyright [2024] [OPENIITA]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package cc.iotkit.manager.dto.vo.deviceinfo;
import cc.iotkit.model.device.DeviceInfo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serializable;
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = DeviceInfoVo.class,convertGenerate = false)
public class DeviceInfoExpordVo implements Serializable {
private static final long serialVersionUID = -1L;
@ExcelProperty(value = "IMEI(设备编号)")
private String deviceName;
@ExcelProperty(value = "设备型号")
private String model;
@ExcelProperty(value = "父级id")
private String parentId;
@ExcelProperty(value = "产品key")
private String productKey;
// @ExcelProperty(value = "设备分组")
// private String deviceGroup;
@ExcelProperty(value = "租户编号")
private Long tenantId;
@ExcelProperty(value = "设备区域")
private Long deptAreaId;
}

@ -23,6 +23,7 @@
package cc.iotkit.manager.dto.vo.deviceinfo; package cc.iotkit.manager.dto.vo.deviceinfo;
import cc.iotkit.data.model.TbDeviceInfo;
import cc.iotkit.model.device.DeviceInfo; import cc.iotkit.model.device.DeviceInfo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
@ -38,7 +39,7 @@ import java.io.Serializable;
public class DeviceInfoImportVo implements Serializable { public class DeviceInfoImportVo implements Serializable {
private static final long serialVersionUID = -1L; private static final long serialVersionUID = -1L;
@ExcelProperty(value = "设备名称") @ExcelProperty(value = "IMEI(设备编号)")
private String deviceName; private String deviceName;
@ExcelProperty(value = "设备型号") @ExcelProperty(value = "设备型号")
@ -52,4 +53,8 @@ public class DeviceInfoImportVo implements Serializable {
@ExcelProperty(value = "设备分组") @ExcelProperty(value = "设备分组")
private String deviceGroup; private String deviceGroup;
@ExcelProperty(value = "租户编号")
private Long tenantId;
@ExcelProperty(value = "设备区域")
private Long deptAreaId;
} }

@ -111,4 +111,25 @@ public class DeviceInfoVo implements Serializable {
private String productName; private String productName;
private String site; private String site;
private String name; private String name;
private String uid;
private String signalStrength;
private String deviceVersion;
private String tenantName;
private String deviceStatus;
private Long tenantId;
private String nodeOne;
private String nodeTwo;
private String nodeThree;
private String nodeFour;
private String nodeFive;
private String nodeOneStatus;
private String nodeTwoStatus;
private String nodeThreeStatus;
private String nodeFourStatus;
private String nodeFiveStatus;
private String nodeOneDevice;
private String nodeTwoDevice;
private String nodeThreeDevice;
private String nodeFourDevice;
private String nodeFiveDevice;
} }

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save