blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/equipment/controller/EquipmentController.java
@@ -32,6 +32,7 @@ import org.springblade.jfpt.catalog.service.catalogService; import org.springblade.jfpt.deploy.service.IDeployService; import org.springblade.jfpt.equipment.entity.Equipment; import org.springblade.jfpt.equipment.entity.EquipmentPlayInfo; import org.springblade.jfpt.equipment.feign.DeptFeignApi; import org.springblade.jfpt.equipment.feign.RegionFeignApi; import org.springblade.jfpt.equipment.service.IEquipmentService; @@ -569,4 +570,31 @@ return R.data(equipmentService.selEqTypeSum()); } /** * 获取设备视频播放的信息 * @param equipmentPlayInfo 视频播放地址对象,只需包含设备编号,以及视频播放格式即可 * @param response 响应域,设置跨域 * @return */ @GetMapping("/selectEquimentPlayInfo") public R selectEquimentPlayInfo(EquipmentPlayInfo equipmentPlayInfo,HttpServletResponse response){ response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Allow-Credentials", "true"); //返回 return R.data(equipmentService.selectEquimentPlayInfo(equipmentPlayInfo)); } /** * 新增或修改设备视频播放的信息 * @param equipmentPlayInfo 视频播放地址对象 * @return */ @PostMapping("/submitEquimentPlayInfo") public R submitEquimentPlayInfo(EquipmentPlayInfo equipmentPlayInfo){ return R.status(equipmentService.saveOrUpdateEquipmentPlayInfo(equipmentPlayInfo)); } } blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/equipment/entity/EquipmentPlayInfo.java
New file @@ -0,0 +1,57 @@ package org.springblade.jfpt.equipment.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.io.Serializable; import java.util.Date; /** * 设备播放地址管理实体 * @author zhongrj * @time 2021-05-21 */ @Data @TableName("equipment_play_info") public class EquipmentPlayInfo implements Serializable { /** * 主键id */ @TableId(value = "id",type = IdType.AUTO) private Integer id; /** * 设备编号 */ private String number; /** * 设备序列号 */ @TableField("serial_number") private String serialNumber; /** * 设备厂商名称 */ private String manufacturer; /** * 视频播放格式 */ private String bmp; /** * 视频播放地址 */ private String address; /** * 创建时间 */ @TableField("create_time") private Date createTime; } blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/equipment/feign/OneNetStudioApi.java
New file @@ -0,0 +1,25 @@ package org.springblade.jfpt.equipment.feign; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @FeignClient("blade-onenetstudio") public interface OneNetStudioApi { /** * 去上线 * @param equipmentListz 设备 id 集合 */ @PostMapping("/onenet/equipmentUp") void equipmentUp(@RequestBody List<Long> equipmentListz); /** * 去下线 * @param equipmentListl 设备 id 集合 */ @PostMapping("/onenet/equipmentDown") void equipmentDown(@RequestBody List<Long> equipmentListl); } blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/equipment/mapper/EquipmentMapper.java
@@ -21,6 +21,7 @@ import org.apache.ibatis.annotations.Param; import org.springblade.jfpt.alarm.vo.AlarmVO; import org.springblade.jfpt.equipment.entity.Equipment; import org.springblade.jfpt.equipment.entity.EquipmentPlayInfo; import org.springblade.jfpt.equipment.vo.EquipmentVO; import org.springblade.jfpt.equipment.vo.EquipmentVOS; @@ -110,4 +111,30 @@ */ void updateEqListl(@Param("equipmentListl") List<Long> equipmentListl); /** * 查询在线设备数量 * @return */ Integer selectOnlineEqNum(); /** * 获取设备视频播放的信息 * @param equipmentPlayInfo 视频播放地址对象,只需包含设备编号,以及视频播放格式即可 * @return */ EquipmentPlayInfo selectEquimentPlayInfo(EquipmentPlayInfo equipmentPlayInfo); /** * 新增设备视频播放的信息 * @param equipmentPlayInfo 视频播放地址对象 * @return */ int saveEquipmentPlayInfo(EquipmentPlayInfo equipmentPlayInfo); /** * 修改设备视频播放的信息 * @param equipmentPlayInfo 视频播放地址对象 * @return */ int updateEquipmentPlayInfo(EquipmentPlayInfo equipmentPlayInfo); } blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/equipment/mapper/EquipmentMapper.xml
@@ -202,7 +202,10 @@ and heartbeat >= DATE_SUB(NOW(),INTERVAL 1 DAY) and dtype=2 </if> <if test="dxtype!=null and dxtype == 3"> and heartbeat >= DATE_SUB(NOW(),INTERVAL 1 DAY) and dtype=3 and dtype=3 </if> <if test="dxtype!=null and dxtype == 4"> and dtype!=0 </if> <if test="pid!=null and pid!=''"> and deptId like concat('%',#{pid},'%') @@ -412,9 +415,9 @@ dept.id, dept.deviceName, dept.deviceNumber, dept.deviceType, dept.serialNumber, dept.serialNumber, dept.channelNumber, dept.deviceType, dept.ownership, dept.ownerId, dept.devicestate, @@ -482,7 +485,7 @@ <!--查询设故障数量--> <select id="selectEqCg" resultType="Integer"> select COUNT(*) from sys_equipment where heartbeat >= DATE_SUB(NOW(),INTERVAL 1 DAY) and dtype=3 select COUNT(*) from sys_equipment where dtype=3 </select> <!--查询所有的设备,不包含故障和警情状态--> @@ -510,4 +513,40 @@ </foreach> </update> <!--查询在线设备数量--> <select id="selectOnlineEqNum" resultType="java.lang.Integer"> select COUNT(*) from sys_equipment where dtype=1 or dtype=2 or dtype=3 </select> <!--获取设备视频播放的信息--> <select id="selectEquimentPlayInfo" resultType="org.springblade.jfpt.equipment.entity.EquipmentPlayInfo"> select * from equipment_play_info where bmp=#{bmp} and number=#{number} and manufacturer =#{manufacturer} </select> <!-- select id,number,serial_number serialNumber,bmp,address from equipment_play_info--> <!--新增设备视频播放的信息--> <insert id="saveEquipmentPlayInfo"> INSERT INTO equipment_play_info (number, serial_number, manufacturer, bmp, address, create_time) VALUES (#{number}, #{serialNumber}, #{manufacturer}, #{bmp}, #{address}, #{createTime}); </insert> <!--修改设备视频播放的信息--> <update id="updateEquipmentPlayInfo"> update equipment_play_info set bmp=#{bmp},address=#{address} where id=#{id} </update> </mapper> blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/equipment/service/IEquipmentService.java
@@ -20,6 +20,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import org.springblade.jfpt.alarm.vo.AlarmVO; import org.springblade.jfpt.equipment.entity.Equipment; import org.springblade.jfpt.equipment.entity.EquipmentPlayInfo; import org.springblade.jfpt.equipment.vo.EquipmentVO; import org.springblade.jfpt.equipment.vo.EquipmentVOS; import org.springblade.jfpt.parcel.vo.ConditionVo; @@ -105,4 +106,18 @@ * 更新设备状态 */ void updateEquipmentDtype(); /** * 获取设备视频播放的信息 * @param equipmentPlayInfo 视频播放地址对象,只需包含设备编号,以及视频播放格式即可 * @return */ EquipmentPlayInfo selectEquimentPlayInfo(EquipmentPlayInfo equipmentPlayInfo); /** * 新增或修改设备视频播放的信息 * @param equipmentPlayInfo 视频播放地址对象 * @return */ boolean saveOrUpdateEquipmentPlayInfo(EquipmentPlayInfo equipmentPlayInfo); } blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/equipment/service/impl/EquipmentServiceImpl.java
@@ -16,25 +16,24 @@ */ package org.springblade.jfpt.equipment.service.impl; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springblade.core.tool.node.ForestNodeMerger; import org.springblade.core.tool.utils.Func; import org.springblade.jfpt.alarm.service.IAlarmService; import org.springblade.jfpt.alarm.vo.AlarmVO; import org.springblade.jfpt.equipment.entity.Equipment; import org.springblade.jfpt.equipment.entity.EquipmentPlayInfo; import org.springblade.jfpt.equipment.feign.OneNetStudioApi; import org.springblade.jfpt.equipment.mapper.EquipmentMapper; import org.springblade.jfpt.equipment.service.IEquipmentService; import org.springblade.jfpt.equipment.vo.EquipmentVO; import org.springblade.jfpt.equipment.vo.EquipmentVOS; import org.springblade.jfpt.parcel.vo.ConditionVo; import org.springblade.system.cache.SysCache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; @@ -51,6 +50,9 @@ //时间差 private long TIME_DIFFERENCE = 150*1000; @Resource private OneNetStudioApi oneNetStudioApi; @Autowired private IAlarmService iAlarmService; @@ -158,30 +160,8 @@ public Integer selectEquipmentCount(ConditionVo conditionVo) { //更新设备状态 updateEquipmentDtype(); //先查询所有的设备 Integer equipmentCount = baseMapper.selectEqCz(); System.out.println("equipmentCount = " + equipmentCount); // long time = new Date().getTime(); // long hearbeat = 0; // //遍历集合数据,对比心跳时间,得出在线的设备数量 // int status =0; // if (status==0 && equipmentVOS.size()>0){ // for (EquipmentVO e:equipmentVOS) { // try { // if(null!=e.getHeartbeat()) { // hearbeat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(e.getHeartbeat()).getTime(); // } // } catch (ParseException parseException) { // parseException.printStackTrace(); // } // //对比心跳时间 // if (null!=e.getDtype()) { // if (time - hearbeat < TIME_DIFFERENCE && e.getDtype()!="2" && e.getDtype()!="3") { // equipmentCount += 1; // } // } // } // } //查询在线设备数量 Integer equipmentCount = baseMapper.selectOnlineEqNum(); //返回数据 return equipmentCount; } @@ -271,7 +251,7 @@ public void updateEquipmentDtype() { //查询所有的设备,不包含故障和警情状态 List<Equipment> equipment = baseMapper.selAllEq(); long time = new Date().getTime(); long time = System.currentTimeMillis(); long hearbeat = 0; List<Long> equipmentListz = new ArrayList<>(); List<Long> equipmentListl = new ArrayList<>(); @@ -284,14 +264,16 @@ parseException.printStackTrace(); } //对比心跳时间,在线 if (time-hearbeat<TIME_DIFFERENCE){ if (null==e.getDtype() || e.getDtype()!="1"){ if (time-hearbeat< TIME_DIFFERENCE){ if (null==e.getDtype() || !e.getDtype().equals("1")){ //需要修改为上线 equipmentListz.add(e.getId()); } } //不在线 if (time-hearbeat>=TIME_DIFFERENCE){ if (null==e.getDtype() || e.getDtype()!="0"){ if (null==e.getDtype() || !e.getDtype().equals("0")){ //需要修改为下线 equipmentListl.add(e.getId()); } } @@ -299,9 +281,39 @@ //批量更新数据 if (equipmentListz.size()>0){ baseMapper.updateEqListz(equipmentListz); // 在 onenet 平台上线 oneNetStudioApi.equipmentUp(equipmentListz); } if (equipmentListl.size()>0){ baseMapper.updateEqListl(equipmentListl); //去 onenet 平台下线 oneNetStudioApi.equipmentDown(equipmentListl); } } /** * 获取设备视频播放的信息 * @param equipmentPlayInfo 视频播放地址对象,只需包含设备编号,以及视频播放格式即可 * @return */ @Override public EquipmentPlayInfo selectEquimentPlayInfo(EquipmentPlayInfo equipmentPlayInfo) { return baseMapper.selectEquimentPlayInfo(equipmentPlayInfo); } /** * 新增或修改设备视频播放的信息 * @param equipmentPlayInfo 视频播放地址对象 * @return */ @Override @Transactional(rollbackFor = Exception.class) public boolean saveOrUpdateEquipmentPlayInfo(EquipmentPlayInfo equipmentPlayInfo) { equipmentPlayInfo.setCreateTime(new Date()); //新增或修改 int result = null==equipmentPlayInfo.getId()? baseMapper.saveEquipmentPlayInfo(equipmentPlayInfo) :baseMapper.updateEquipmentPlayInfo(equipmentPlayInfo); //返回 return result>0? true:false; } } blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/riskreporting/controller/RiskReportingController.java
New file @@ -0,0 +1,45 @@ package org.springblade.jfpt.riskreporting.controller; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.tool.api.R; import org.springblade.jfpt.riskreporting.entity.RiskReporting; import org.springblade.jfpt.riskreporting.service.RiskReportingService; import org.springblade.jfpt.visitrecord.entity.Visitrecord; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; import java.util.Date; /** * 风险记录控制层 * @author zhongrj * @time 2021-05-26 */ @RestController @AllArgsConstructor @RequestMapping("/riskReporting") public class RiskReportingController extends BladeController { private final RiskReportingService riskReportingService; /** * 新增风险记录信息 * @param riskReporting 风险记录对象 */ @PostMapping("/save") @ApiOperationSupport(order = 4) @ApiOperation(value = "新增", notes = "传入riskReporting") public R save(@Valid @RequestBody RiskReporting riskReporting) { //设置信息 riskReporting.setCreateTime(new Date()); //请求新增并返回 return R.status(riskReportingService.insert(riskReporting)); } } blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/riskreporting/entity/RiskReporting.java
New file @@ -0,0 +1,97 @@ package org.springblade.jfpt.riskreporting.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.io.Serializable; import java.util.Date; /** * 风险记录实体类 */ @Data @TableName("tb_risk_reporting") public class RiskReporting implements Serializable { private static final long serialVersionUID = 1L; /** * 主键id */ @TableId(value = "id",type = IdType.AUTO) private Long id; /** * 租户主键id */ @TableField(value = "tenant_id") private String tenantId; /** * 客户名称 */ @TableField(value = "tenant_name") private String tenantName; /** * 客户地址 */ private String address; /** * 联系人 */ private String linkman; /** * 联系电话 */ @TableField(value = "contact_number") private String contactNumber; /** * 上报人编号 */ @TableField(value = "risk_number") private String riskNumber; /** * 上报人名称 */ @TableField(value = "risk_person") private String riskPerson; /** * 风险等级 */ @TableField(value = "risk_class") private String riskClass; /** * 风险描述 */ @TableField(value = "risk_describe") private String riskDescribe; /** * 上报时间 */ @TableField(value = "risk_time") @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") private Date riskTime; /** * 创建时间 */ @TableField(value = "create_time") private Date createTime; /** * 备注信息 */ @TableField(value = "desc_info") private String descInfo; } blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/riskreporting/mapper/RiskReportingMapper.java
New file @@ -0,0 +1,14 @@ package org.springblade.jfpt.riskreporting.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.springblade.jfpt.riskreporting.entity.RiskReporting; public interface RiskReportingMapper extends BaseMapper<RiskReporting> { /** * 新增 * @param riskReporting * @return */ int insertRis(RiskReporting riskReporting); } blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/riskreporting/mapper/RiskReportingMapper.xml
New file @@ -0,0 +1,15 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.springblade.jfpt.riskreporting.mapper.RiskReportingMapper"> <!--查询是否存在安保人员位置--> <insert id="insertRis"> insert into jfpth0.tb_risk_reporting (tenant_id,tenant_name,address,linkman,contact_number,risk_number, risk_person,risk_class,risk_describe,risk_time,create_time,desc_info) VALUES (#{tenantId},#{tenantName},#{address},#{linkman},#{contactNumber},#{riskNumber}, #{riskPerson},#{riskClass},#{riskDescribe},#{riskTime},#{createTime},#{descInfo}) </insert> </mapper> blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/riskreporting/service/RiskReportingService.java
New file @@ -0,0 +1,14 @@ package org.springblade.jfpt.riskreporting.service; import com.baomidou.mybatisplus.extension.service.IService; import org.springblade.jfpt.riskreporting.entity.RiskReporting; public interface RiskReportingService extends IService<RiskReporting> { /** * 新增 * @param riskReporting * @return */ boolean insert(RiskReporting riskReporting); } blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/riskreporting/service/impl/RiskReportingServiceImpl.java
New file @@ -0,0 +1,20 @@ package org.springblade.jfpt.riskreporting.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springblade.jfpt.riskreporting.entity.RiskReporting; import org.springblade.jfpt.riskreporting.mapper.RiskReportingMapper; import org.springblade.jfpt.riskreporting.service.RiskReportingService; import org.springframework.stereotype.Service; @Service public class RiskReportingServiceImpl extends ServiceImpl<RiskReportingMapper, RiskReporting> implements RiskReportingService { /** * 新增风险上报信息 * @param riskReporting * @return */ @Override public boolean insert(RiskReporting riskReporting) { return baseMapper.insertRis(riskReporting)>0?true:false; } } blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/visitrecord/entity/Visitrecord.java
@@ -19,12 +19,14 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.time.LocalDateTime; import java.util.Date; /** * 实体类 @@ -55,7 +57,8 @@ * 拜访时间 */ @ApiModelProperty(value = "拜访时间") private LocalDateTime vistime; @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") private Date vistime; /** * 业主编号 */ blade-service/blade-system/src/main/java/org/springblade/system/service/ITenantService.java
@@ -50,6 +50,13 @@ Tenant getByTenantId(String tenantId); /** * 新增租户信息 * @param tenant 租户对象信息 * @return */ boolean insert(Tenant tenant); /** * 新增 * * @param tenant blade-service/blade-system/src/main/java/org/springblade/system/service/impl/TenantServiceImpl.java
@@ -160,6 +160,95 @@ } } /** * 新增租户信息 * @param tenant 租户对象信息 * @return */ @Override public boolean insert(Tenant tenant) { CacheUtil.clear(SYS_CACHE); if (Func.isEmpty(tenant.getId())) { List<Tenant> tenants = baseMapper.selectList(Wrappers.<Tenant>query().lambda().eq(Tenant::getIsDeleted, BladeConstant.DB_NOT_DELETED)); List<String> codes = tenants.stream().map(Tenant::getTenantId).collect(Collectors.toList()); String tenantId = getTenantId(codes); tenant.setTenantId(tenantId); // 获取参数配置的账号额度 int accountNumber = Func.toInt(ParamCache.getValue(ACCOUNT_NUMBER_KEY), DEFAULT_ACCOUNT_NUMBER); tenant.setAccountNumber(accountNumber); // 新建租户对应的默认角色 Role role = new Role(); role.setTenantId(tenantId); role.setParentId(BladeConstant.TOP_PARENT_ID); role.setRoleName("管理员"); role.setRoleAlias("admin"); role.setSort(2); role.setIsDeleted(BladeConstant.DB_NOT_DELETED); roleService.save(role); // 新建租户对应的角色菜单权限 LinkedList<Menu> userMenus = new LinkedList<>(); // 获取参数配置的默认菜单集合,逗号隔开 List<String> menuCodes = Func.toStrList(ParamCache.getValue(ACCOUNT_MENU_CODE_KEY)); List<Menu> menus = getMenus((menuCodes.size() > 0 ? menuCodes : MENU_CODES), userMenus); List<RoleMenu> roleMenus = new ArrayList<>(); menus.forEach(menu -> { RoleMenu roleMenu = new RoleMenu(); roleMenu.setMenuId(menu.getId()); roleMenu.setRoleId(role.getId()); roleMenus.add(roleMenu); }); roleMenuService.saveBatch(roleMenus); // 新建租户对应的默认部门 Dept dept = new Dept(); dept.setTenantId(tenantId); dept.setParentId(BladeConstant.TOP_PARENT_ID); dept.setAncestors(String.valueOf(BladeConstant.TOP_PARENT_ID)); dept.setDeptName(tenant.getTenantName()); dept.setFullName(tenant.getTenantName()); dept.setDeptCategory(1); dept.setSort(2); dept.setIsDeleted(BladeConstant.DB_NOT_DELETED); deptService.save(dept); // 新建租户对应的默认岗位 Post post = new Post(); post.setTenantId(tenantId); post.setCategory(1); post.setPostCode("ceo"); post.setPostName("首席执行官"); post.setSort(1); postService.save(post); // 新建租户对应的默认业务字典 // LinkedList<DictBiz> dictBizs = new LinkedList<>(); // List<DictBiz> dictBizList = getDictBizs(tenantId, dictBizs); // dictBizService.saveBatch(dictBizList); // 新建租户对应的默认管理用户 User user = new User(); user.setTenantId(tenantId); user.setName("admin"); user.setRealName("admin"); user.setAccount("admin"); // 获取参数配置的密码 String password = Func.toStr(ParamCache.getValue(PASSWORD_KEY), DEFAULT_PASSWORD); user.setPassword(password); user.setRoleId(String.valueOf(role.getId())); user.setDeptId(String.valueOf(dept.getId())); user.setPostId(String.valueOf(post.getId())); user.setBirthday(new Date()); user.setSex(1); user.setUserType(UserEnum.WEB.getCategory()); user.setIsDeleted(BladeConstant.DB_NOT_DELETED); boolean temp = super.saveOrUpdate(tenant); R<Boolean> result = userClient.saveUser(user); System.out.println("result = " + result); if (!result.isSuccess()) { throw new ServiceException(result.getMsg()); } return temp; } else { return super.saveOrUpdate(tenant); } } @Override @Transactional(rollbackFor = Exception.class) public boolean removeTenant(List<Long> ids) {