diff --git a/nursing-unit-common/src/main/java/com/nu/dto/IotTqConfigMQDto.java b/nursing-unit-common/src/main/java/com/nu/dto/IotTqConfigMQDto.java
new file mode 100644
index 0000000..cfa36f8
--- /dev/null
+++ b/nursing-unit-common/src/main/java/com/nu/dto/IotTqConfigMQDto.java
@@ -0,0 +1,15 @@
+package com.nu.dto;
+
+import lombok.Data;
+
+@Data
+public class IotTqConfigMQDto {
+ private Integer id;
+ private String requestUrl; //后台系统地址
+ private String authCode; //授权码
+ private String randomCode; //随机字符串,签名时需要
+ private String notifyUrl; //通知地址
+ private String orgCode; //机构编码
+ private String updateDate; //更新时间
+ private String logId; //日志ID
+}
diff --git a/nursing-unit-common/src/main/java/com/nu/dto/IotTumsConfigMQDto.java b/nursing-unit-common/src/main/java/com/nu/dto/IotTumsConfigMQDto.java
new file mode 100644
index 0000000..e951fa5
--- /dev/null
+++ b/nursing-unit-common/src/main/java/com/nu/dto/IotTumsConfigMQDto.java
@@ -0,0 +1,18 @@
+package com.nu.dto;
+
+import lombok.Data;
+
+@Data
+public class IotTumsConfigMQDto {
+ private Integer id;
+ private String tumsUrl; //获取图门系统地址
+ private String tumsUsername; // 获取图门系统用户
+ private String tumsPassword; //获取图门系统密码
+ private String ftpIp; //回放视频转FTP上传IP
+ private String ftpPort; //回放视频转FTP上传端口
+ private String ftpUsername; //回放视频转FTP上传用户
+ private String ftpPassword; //回放视频转FTP上传密码
+ private String ftpUploadpath; //回放视频转FTP上传路径
+ private String updateDate; //更新时间
+ private String logId; //日志ID
+}
diff --git a/nursing-unit-common/src/main/java/com/nu/dto/IotYiweilianConfigMQDto.java b/nursing-unit-common/src/main/java/com/nu/dto/IotYiweilianConfigMQDto.java
new file mode 100644
index 0000000..6ee6e02
--- /dev/null
+++ b/nursing-unit-common/src/main/java/com/nu/dto/IotYiweilianConfigMQDto.java
@@ -0,0 +1,12 @@
+package com.nu.dto;
+
+import lombok.Data;
+
+@Data
+public class IotYiweilianConfigMQDto {
+ private Integer id;
+ private String requestUrl; //云平台系统地址
+ private String clientId; //识别用户的唯一标识
+ private String updateDate; //更新时间
+ private String logId; //日志ID
+}
diff --git a/nursing-unit-iot/nu-iot-biz/pom.xml b/nursing-unit-iot/nu-iot-biz/pom.xml
index 69094f3..ee0fb0f 100644
--- a/nursing-unit-iot/nu-iot-biz/pom.xml
+++ b/nursing-unit-iot/nu-iot-biz/pom.xml
@@ -15,6 +15,12 @@
nu-iot-local-api
${nursingunit.version}
+
+
+ com.nursingunit.boot
+ nursing-unit-common
+ ${nursingunit.version}
+
org.hibernate
hibernate-core
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/controller/TumsConfigController.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/controller/TumsConfigController.java
index 3167f0b..bb8f672 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/controller/TumsConfigController.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/controller/TumsConfigController.java
@@ -61,8 +61,7 @@ public class TumsConfigController extends JeecgController add(@RequestBody TumsConfig tumsConfig) {
- tumsConfig.setUpdateTime(DateUtils.formatDateTime());
- service.save(tumsConfig);
+ service.add(tumsConfig);
return Result.OK("添加成功!");
}
@@ -74,8 +73,7 @@ public class TumsConfigController extends JeecgController edit(@RequestBody TumsConfig tumsConfig) {
- tumsConfig.setUpdateTime(DateUtils.formatDateTime());
- service.updateById(tumsConfig);
+ service.edit(tumsConfig);
return Result.OK("编辑成功!");
}
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/entity/TumsConfig.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/entity/TumsConfig.java
index 7f81996..12be155 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/entity/TumsConfig.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/entity/TumsConfig.java
@@ -4,6 +4,7 @@ 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.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -42,5 +43,29 @@ public class TumsConfig implements Serializable {
private String ftpUsername; //回放视频转FTP上传用户
private String ftpPassword; //回放视频转FTP上传密码
private String ftpUploadpath; //回放视频转FTP上传路径
- private String updateTime; //更新时间
+ @JsonIgnore
+ private String updateDate; //更新时间
+
+ @JsonIgnore
+ @TableField(exist = false)
+ private String orgCode; //机构编码
+ @JsonIgnore
+ @TableField(exist = false)
+ private String orgName; //机构名称
+ @JsonIgnore
+ @TableField(exist = false)
+ private String logId;
+ @JsonIgnore
+ @TableField(exist = false)
+ private String content;
+ @JsonIgnore
+ @TableField(exist = false)
+ private String syncType;
+ @JsonIgnore
+ @TableField(exist = false)
+ private String status;
+ @JsonIgnore
+ @TableField(exist = false)
+ private String serverType;
+
}
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/mapper/TumsConfigMapper.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/mapper/TumsConfigMapper.java
index d6fce08..87ad076 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/mapper/TumsConfigMapper.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/mapper/TumsConfigMapper.java
@@ -7,6 +7,8 @@ import com.nu.modules.tplink.common.entity.TumsConfig;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
+import java.util.List;
+
/**
* @Description: 护理单元-物联管理-错误码
* @Author: jeecg-boot
@@ -17,4 +19,8 @@ import org.apache.ibatis.annotations.Param;
@Mapper
public interface TumsConfigMapper extends BaseMapper {
TumsConfig getByCode();
+
+ List getOrgList();
+ void addConfigLog(TumsConfig tumsConfig);
+ void updateConfigLog(TumsConfig tumsConfig);
}
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/mapper/xml/TumsConfigMapper.xml b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/mapper/xml/TumsConfigMapper.xml
index 239377f..1df7dd3 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/mapper/xml/TumsConfigMapper.xml
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/mapper/xml/TumsConfigMapper.xml
@@ -13,10 +13,49 @@
ftp_username as ftpUsername,
ftp_password as ftpPassword,
ftp_uploadpath as ftpUploadpath,
- update_time as updateTime
+ update_date as updateDate
from nu_iot_tplink_tums_base
order by id desc
limit 1
+
+
+
+ insert into nu_iot_config_sync_log (
+ log_id,
+ org_code,
+ org_name,
+ content,
+ sync_type,
+ status,
+ server_type,
+ create_time
+ )
+ values (
+ #{logId},
+ #{orgCode},
+ #{orgName},
+ #{content},
+ #{syncType},
+ #{status},
+ #{serverType},
+ now()
+ )
+
+
+
+ UPDATE nu_iot_config_sync_log
+ SET
+ status = #{status},
+ update_time = now()
+ where log_id = #{logId}
+
+
\ No newline at end of file
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/service/ITumsConfigService.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/service/ITumsConfigService.java
index 4ebd69c..7a8e045 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/service/ITumsConfigService.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/service/ITumsConfigService.java
@@ -14,4 +14,8 @@ import org.jeecg.common.api.vo.Result;
*/
public interface ITumsConfigService extends IService {
TumsConfig getByCode();
+
+ void add(TumsConfig tumsConfig);
+ void edit(TumsConfig tumsConfig);
+ void updateConfigLog(TumsConfig tumsConfig);
}
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/service/impl/TumsConfigServiceImpl.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/service/impl/TumsConfigServiceImpl.java
index 5478cf3..3285135 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/service/impl/TumsConfigServiceImpl.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/common/service/impl/TumsConfigServiceImpl.java
@@ -1,25 +1,78 @@
package com.nu.modules.tplink.common.service.impl;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.nu.dto.IotTumsConfigMQDto;
import com.nu.modules.tplink.common.entity.TumsConfig;
import com.nu.modules.tplink.common.mapper.TumsConfigMapper;
import com.nu.modules.tplink.common.service.ITumsConfigService;
-import org.jeecg.common.api.vo.Result;
+import me.zhyd.oauth.utils.UuidUtils;
+import org.jeecg.common.util.DateUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import com.nu.utils.RabbitMQUtil;
+import java.util.List;
/**
* @Description: TP-LINK图门系统配置信息
* @Author: caolei
- * @Date: 2025-08-06
+ * @Date: 2025-08-07
* @Version: V1.0
*/
@Service
public class TumsConfigServiceImpl extends ServiceImpl implements ITumsConfigService {
+ @Autowired
+ private RabbitMQUtil rabbitMQUtil;
+
@Override
public TumsConfig getByCode(){
return baseMapper.getByCode();
}
+
+ @Override
+ public void add(TumsConfig tumsConfig){
+ tumsConfig.setUpdateDate(DateUtils.formatDateTime());
+ this.save(tumsConfig);
+ syncMq(tumsConfig,"新增");
+ }
+
+ @Override
+ public void edit(TumsConfig tumsConfig){
+ tumsConfig.setUpdateDate(DateUtils.formatDateTime());
+ this.updateById(tumsConfig);
+ syncMq(tumsConfig,"编辑");
+ }
+
+ @Override
+ public void updateConfigLog(TumsConfig tumsConfig){
+ baseMapper.updateConfigLog(tumsConfig);
+ }
+
+ private void syncMq(TumsConfig tumsConfig,String type){
+ IotTumsConfigMQDto itc= new IotTumsConfigMQDto();
+ BeanUtils.copyProperties(tumsConfig, itc);
+ List orgList = baseMapper.getOrgList();
+ for(int i=0;i add(@RequestBody TqConfig tqConfig) {
- tqConfig.setUpdateTime(DateUtils.formatDateTime());
- service.save(tqConfig);
+ service.add(tqConfig);
return Result.OK("添加成功!");
}
@@ -75,8 +74,7 @@ public class TqConfigController extends JeecgController edit(@RequestBody TqConfig tqConfig) {
- tqConfig.setUpdateTime(DateUtils.formatDateTime());
- service.updateById(tqConfig);
+ service.edit(tqConfig);
return Result.OK("编辑成功!");
}
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/entity/TqConfig.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/entity/TqConfig.java
index 5130ef8..ee89eb8 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/entity/TqConfig.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/entity/TqConfig.java
@@ -4,6 +4,7 @@ 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.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -36,5 +37,25 @@ public class TqConfig implements Serializable {
private String notifyUrl; //通知地址
@Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "org_code")
private String orgCode; //机构编码
- private String updateTime; //通知地址
+ @JsonIgnore
+ private String updateDate; //更新时间
+
+ @JsonIgnore
+ @TableField(exist = false)
+ private String orgName; //机构名称
+ @JsonIgnore
+ @TableField(exist = false)
+ private String logId;
+ @JsonIgnore
+ @TableField(exist = false)
+ private String content;
+ @JsonIgnore
+ @TableField(exist = false)
+ private String syncType;
+ @JsonIgnore
+ @TableField(exist = false)
+ private String status;
+ @JsonIgnore
+ @TableField(exist = false)
+ private String serverType;
}
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/mapper/TqConfigMapper.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/mapper/TqConfigMapper.java
index d6d0d59..5ad7172 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/mapper/TqConfigMapper.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/mapper/TqConfigMapper.java
@@ -3,6 +3,8 @@ package com.nu.modules.tq.common.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.nu.modules.tq.common.entity.TqConfig;
import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
import java.util.Map;
/**
@@ -15,4 +17,7 @@ import java.util.Map;
@Mapper
public interface TqConfigMapper extends BaseMapper {
TqConfig getConfig();
+ List getAllConfigList();
+ void addConfigLog(TqConfig tqConfig);
+ void updateConfigLog(TqConfig tqConfig);
}
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/mapper/TqDeviceInfoMapper.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/mapper/TqDeviceInfoMapper.java
index 9f3ec1c..7987d79 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/mapper/TqDeviceInfoMapper.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/mapper/TqDeviceInfoMapper.java
@@ -14,6 +14,8 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface TqDeviceInfoMapper extends BaseMapper {
TqDeviceInfo getDeviceInfo(TqDeviceInfo tqDeviceInfo);
+ TqDeviceInfo getByCid(String cid);
int insert(TqDeviceInfo tqDeviceInfo);
int update(TqDeviceInfo tqDeviceInfo);
+ int deleteByCid(String cid);
}
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/mapper/xml/TqConfigMapper.xml b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/mapper/xml/TqConfigMapper.xml
index e3a3198..b707afb 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/mapper/xml/TqConfigMapper.xml
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/mapper/xml/TqConfigMapper.xml
@@ -8,10 +8,58 @@
request_url as requestUrl,
auth_code as authCode,
random_code as randomCode,
- notify_url as notifyUrl
+ notify_url as notifyUrl,
+ update_date as updateDate
from nu_iot_tq_config
- order by id desc
+ where org_code is null
+ order by id asc
limit 1
+
+
+
+ insert into nu_iot_config_sync_log (
+ log_id,
+ org_code,
+ org_name,
+ content,
+ sync_type,
+ status,
+ server_type,
+ create_time
+ )
+ values (
+ #{logId},
+ #{orgCode},
+ #{orgName},
+ #{content},
+ #{syncType},
+ #{status},
+ #{serverType},
+ now()
+ )
+
+
+
+ UPDATE nu_iot_config_sync_log
+ SET
+ status = #{status},
+ update_time = now()
+ where log_id = #{logId}
+
+
\ No newline at end of file
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/mapper/xml/TqDeviceInfoMapper.xml b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/mapper/xml/TqDeviceInfoMapper.xml
index 9056113..3f49ed7 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/mapper/xml/TqDeviceInfoMapper.xml
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/mapper/xml/TqDeviceInfoMapper.xml
@@ -15,6 +15,19 @@
where cid = #{cid}
+
+
insert into nu_iot_tq_collector(
cid,
@@ -57,4 +70,8 @@
where cid = #{cid}
+
+ DELETE FROM nu_iot_tq_collector WHERE cid = #{cid}
+
+
\ No newline at end of file
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/service/ITqConfigService.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/service/ITqConfigService.java
index 9b136ce..681fce1 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/service/ITqConfigService.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/service/ITqConfigService.java
@@ -10,5 +10,7 @@ import com.nu.modules.tq.common.entity.TqConfig;
* @Version: V1.0
*/
public interface ITqConfigService extends IService {
- TqConfig getConfig();
+ void add(TqConfig tqConfig);
+ void edit(TqConfig tqConfig);
+ void updateConfigLog(TqConfig tqConfig);
}
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/service/ITqDeviceInfoService.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/service/ITqDeviceInfoService.java
index 694bfe2..5b10474 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/service/ITqDeviceInfoService.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/service/ITqDeviceInfoService.java
@@ -10,6 +10,7 @@ import com.nu.modules.tq.common.entity.TqDeviceInfo;
* @Version: V1.0
*/
public interface ITqDeviceInfoService extends IService {
+ TqDeviceInfo getByCid(String cid);
void getAllMeter(boolean isJob);
void getAllCollector(boolean isJob);
}
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/service/impl/TqConfigServiceImpl.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/service/impl/TqConfigServiceImpl.java
index 8d3e399..44e63c4 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/service/impl/TqConfigServiceImpl.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tq/common/service/impl/TqConfigServiceImpl.java
@@ -1,23 +1,76 @@
package com.nu.modules.tq.common.service.impl;
+import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.nu.dto.IotTqConfigMQDto;
import com.nu.modules.tq.common.entity.TqConfig;
import com.nu.modules.tq.common.mapper.TqConfigMapper;
import com.nu.modules.tq.common.service.ITqConfigService;
+import com.nu.utils.RabbitMQUtil;
+import me.zhyd.oauth.utils.UuidUtils;
+import org.jeecg.common.util.DateUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import java.util.List;
+
/**
* @Description: 护理单元-物联管理-电水表配置信息
* @Author: caolei
- * @Date: 2025-06-04
+ * @Date: 2025-06-07
* @Version: V1.0
*/
@Service
public class TqConfigServiceImpl extends ServiceImpl implements ITqConfigService {
+ @Autowired
+ private RabbitMQUtil rabbitMQUtil;
+
@Override
- public TqConfig getConfig(){
- return baseMapper.getConfig();
+ public void add(TqConfig tqConfig){
+ tqConfig.setUpdateDate(DateUtils.formatDateTime());
+ this.save(tqConfig);
+ syncMq(tqConfig,"新增");
+ }
+
+ @Override
+ public void edit(TqConfig tqConfig){
+ tqConfig.setUpdateDate(DateUtils.formatDateTime());
+ this.updateById(tqConfig);
+ syncMq(tqConfig,"新增");
+ }
+
+ @Override
+ public void updateConfigLog(TqConfig tqConfig){
+ baseMapper.updateConfigLog(tqConfig);
+ }
+
+ private void syncMq(TqConfig tqConfig,String type){
+ IotTqConfigMQDto itc = new IotTqConfigMQDto();
+ BeanUtils.copyProperties(tqConfig, itc);
+ List orgList = baseMapper.getAllConfigList();
+ for(int i=0;i queryWrapper = new QueryWrapper<>();
queryWrapper.eq("address",electricityMeter.getAddress());
@@ -921,13 +927,34 @@ public class ElectricityMeterServiceImpl extends ServiceImpl> list = (List