培训管理

pull/1/head
litao 4 years ago
parent 2d8c615210
commit 03b1cd4209
  1. 20
      lab-gateway/src/main/resources/application-dev.yml
  2. 7
      lab-ops/lab-xxljob-admin/src/main/resources/application-dev.yml
  3. 7
      lab-ops/lab-xxljob-admin/src/main/resources/application-prod.yml
  4. 6
      lab-ops/lab-xxljob-admin/src/main/resources/application-test.yml
  5. 2
      lab-service-api/lab-capital-api/pom.xml
  6. 7
      lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Entrust.java
  7. 7
      lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/RepairApplication.java
  8. 8
      lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/TaskBlueprint.java
  9. 7
      lab-service-api/lab-user-api/src/main/java/org/springblade/system/user/entity/Teacher.java
  10. 30
      lab-service-api/lab-user-api/src/main/java/org/springblade/system/user/entity/Train.java
  11. 15
      lab-service-api/lab-user-api/src/main/java/org/springblade/system/user/entity/TrainPerson.java
  12. 2
      lab-service-api/lab-user-api/src/main/java/org/springblade/system/user/entity/User.java
  13. 61
      lab-service/lab-capital/src/main/java/org/springblade/lims/goods/controller/ApplyController.java
  14. 2
      lab-service/lab-capital/src/main/java/org/springblade/lims/goods/controller/ContractController.java
  15. 229
      lab-service/lab-capital/src/main/java/org/springblade/lims/goods/controller/GoodsController.java
  16. 15
      lab-service/lab-iot/src/main/java/org/springblade/iot/config/ModbusReader.java
  17. 39
      lab-service/lab-iot/src/main/java/org/springblade/iot/config/RedisConfig.java
  18. 21
      lab-service/lab-iot/src/main/java/org/springblade/iot/config/RedisToolConfig.java
  19. 8
      lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorAlertController.java
  20. 38
      lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorController.java
  21. 569
      lab-service/lab-iot/src/main/java/org/springblade/iot/tools/RedisUtil.java
  22. 10
      lab-service/lab-lims/src/main/java/org/springblade/lims/controller/EntrustController.java
  23. 8
      lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineController.java
  24. 14
      lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineResultController.java
  25. 50
      lab-service/lab-lims/src/main/java/org/springblade/lims/controller/LargeScreenController.java
  26. 2
      lab-service/lab-lims/src/main/java/org/springblade/lims/controller/SimpleRelController.java
  27. 8
      lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/EntrustServiceImpl.java
  28. 17
      lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/ExamineResultServiceImpl.java
  29. 12
      lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/SimpleServiceImpl.java
  30. 7
      lab-service/lab-user/src/main/java/org/springblade/system/user/controller/TeacherController.java
  31. 60
      lab-service/lab-user/src/main/java/org/springblade/system/user/controller/TrainController.java
  32. 12
      lab-service/lab-user/src/main/java/org/springblade/system/user/controller/TrainPersonController.java
  33. 1
      lab-service/lab-user/src/main/java/org/springblade/system/user/service/ITeacherService.java
  34. 2
      lab-service/lab-user/src/main/java/org/springblade/system/user/service/ITrainService.java
  35. 70
      lab-service/lab-user/src/main/java/org/springblade/system/user/service/impl/TrainServiceImpl.java
  36. 1
      pom.xml

@ -1,20 +0,0 @@
#服务器端口
server:
port: 8001
blade:
#多团队协作服务配置
ribbon:
rule:
#开启配置
enabled: true
#负载均衡优先调用的ip段
prior-ip-pattern:
- 192.168.0.112
static-rewrite:
static-resources:
# 路径需要转译
'[/static/**]': file:D:/QRCode/
# 配置物理路径地址
'[/summarize/**]': file:/root/peacetrue/document-antora/public/
# 配置类路径地址
'[/classpath/**]': classpath:public/

@ -1,7 +0,0 @@
#数据源配置
spring:
datasource:
url: ${blade.datasource.job.dev.url}
username: ${blade.datasource.job.dev.username}
password: ${blade.datasource.job.dev.password}

@ -1,7 +0,0 @@
#数据源配置
spring:
datasource:
url: ${blade.datasource.job.prod.url}
username: ${blade.datasource.job.prod.username}
password: ${blade.datasource.job.prod.password}

@ -1,6 +0,0 @@
#数据源配置
spring:
datasource:
url: ${blade.datasource.job.test.url}
username: ${blade.datasource.job.test.username}
password: ${blade.datasource.job.test.password}

@ -12,7 +12,7 @@
<artifactId>lab-capital-api</artifactId>
<name>${project.artifactId}</name>
<version>${bladex.project.version}</version>
<packaging>jar</packaging>
<packaging>jar</packaging>
<dependencies>
<dependency>

@ -76,9 +76,12 @@ public class Entrust extends BaseEntity implements Serializable {
// 13.报告发送方式
public String reportSendType;
// 14.邮寄地址(省、市、区、详细地址之间用英文逗号隔开
// 14.邮寄地址(省、市、区)
public String mailAddr;
// 详细地址
public String detailAddr;
// 15.养殖情况
public String breedingSituation;
@ -165,6 +168,4 @@ public class Entrust extends BaseEntity implements Serializable {
// 备注(报告发送方式其他)
private String remarks;
// 邮寄地址
private String postAddr;
}

@ -1,5 +1,6 @@
package org.springblade.lims.entry;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.springblade.core.mp.base.BaseEntity;
@ -17,9 +18,6 @@ public class RepairApplication extends BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Long id;
// 仪器/设备id
private Long instrumentId;
// 仪器/设备编号
@ -33,7 +31,8 @@ public class RepairApplication extends BaseEntity implements Serializable {
// 制造商
private String manufacturer;
// 型号
private String model;
@TableField("model")
private String version;
// 出厂日期
private Date productionDate;
// 启用日期

@ -68,10 +68,10 @@ public class TaskBlueprint extends BaseEntity implements Serializable {
private Integer isContinue;
// 正样数量
@TableField(exist = false)
private Integer examineNum;
// @TableField(exist = false)
// private Integer examineNum;
// 留样数量
@TableField(exist = false)
private Integer reagentNum;
// @TableField(exist = false)
// private Integer reagentNum;
}

@ -45,6 +45,11 @@ public class Teacher extends BaseEntity {
* 部门名称
*/
private String deptName;
/**
* 好评量化
*/
private Integer praise;
/**
* 培训次数
*/
@ -56,7 +61,7 @@ public class Teacher extends BaseEntity {
/**
* 学历
*/
private Integer education;
private String education;
/**
* 联系方式
*/

@ -9,6 +9,7 @@ import org.springblade.core.mp.base.BaseEntity;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.Date;
/**
* 培训计划表实体类
@ -53,21 +54,11 @@ public class Train extends BaseEntity {
@JsonFormat(
pattern = "yyyy-MM-dd HH:mm:ss"
)
private LocalDateTime startTime;
/**
* 培训结束时间
*/
@DateTimeFormat(
pattern = "yyyy-MM-dd HH:mm:ss"
)
@JsonFormat(
pattern = "yyyy-MM-dd HH:mm:ss"
)
private LocalDateTime endTime;
private Date startTime;
/**
* 时长
*/
private String duration;
private Integer duration;
/**
* 培训地点
*/
@ -83,8 +74,6 @@ public class Train extends BaseEntity {
*/
private String remark;
/**
* 主讲人id
*/
@ -95,10 +84,21 @@ public class Train extends BaseEntity {
*/
private String teacherName;
/**
* 参训人员
*/
@TableField(exist = false)
private String trainPerson;
// 是否参加
@TableField(exist = false)
private Integer isJoin;
// 是否评价
@TableField(exist = false)
private Integer isEvaluate;
// 评价分数
@TableField(exist = false)
private Integer evaluateScore;
}

@ -5,6 +5,8 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.BaseEntity;
import java.util.Date;
/**
* 计划参训人员关系表实体类
* @author litao
@ -45,6 +47,10 @@ public class TrainPerson extends BaseEntity {
* 部门id
*/
private Long deptId;
/**
* 部门名称
*/
private String deptName;
/**
* 联系电话
*/
@ -52,4 +58,13 @@ public class TrainPerson extends BaseEntity {
private Integer isDeleted;
// 是否评价
private Integer isEvaluate;
// 评价分数
private Integer evaluateScore;
// 签到时间
private Date signInTime;
}

@ -67,7 +67,7 @@ public class User extends TenantEntity {
/**
* 学历
*/
private Integer education;
private String education;
/**
* 角色id
*/

@ -1,25 +1,16 @@
package org.springblade.lims.goods.controller;
import cn.afterturn.easypoi.word.WordExportUtil;
import com.alibaba.nacos.common.utils.UuidUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.models.auth.In;
import lombok.AllArgsConstructor;
import oracle.jdbc.proxy.annotation.Post;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springblade.common.utils.App;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.lims.capital.entity.ApplyOrder;
import org.springblade.lims.capital.entity.ApplyOrderDetail;
import org.springblade.lims.goods.entity.Apply;
import org.springblade.lims.goods.entity.ApplyDetail;
import org.springblade.lims.goods.entity.Goods;
@ -35,11 +26,6 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
/**
@ -88,43 +74,34 @@ public class ApplyController extends BladeController {
*/
@GetMapping("/getEveryStatusAndCount")
public Map<String, Integer> getEveryStatusAndCount() {
Map<String, Integer> map = new HashMap<>(6);
QueryWrapper<Apply> queryWrapper = new QueryWrapper<>();
// 驳回
queryWrapper.eq("status", -1);
queryWrapper.eq("create_dept", AuthUtil.getDeptId());
map.put("bh", applyService.count(queryWrapper));
queryWrapper.clear();
// 待审核
queryWrapper.eq("status", 0);
queryWrapper.eq("create_dept", AuthUtil.getDeptId());
map.put("dsh", applyService.count(queryWrapper));
queryWrapper.clear();
// 待出库
queryWrapper.eq("status", 1);
queryWrapper.eq("create_dept", AuthUtil.getDeptId());
map.put("dck", applyService.count(queryWrapper));
queryWrapper.clear();
queryWrapper.eq("status", 3);
if ("kg".equals(AuthUtil.getUserRole())) {
} else {
queryWrapper.eq("create_dept", AuthUtil.getDeptId());
}
map.put("dgh", applyService.count(queryWrapper));
queryWrapper.clear();
// 待确定
queryWrapper.eq("status", 2);
queryWrapper.eq("create_dept", AuthUtil.getDeptId());
map.put("dqd", applyService.count(queryWrapper));
queryWrapper.clear();
// 待归还
queryWrapper.eq("status", 3);
queryWrapper.eq("create_dept", AuthUtil.getDeptId());
map.put("dgh", applyService.count(queryWrapper));
queryWrapper.clear();
// 申领完成
queryWrapper.eq("status", 4);
queryWrapper.eq("create_dept", AuthUtil.getDeptId());
map.put("slwc", applyService.count(queryWrapper));
@ -156,7 +133,7 @@ public class ApplyController extends BladeController {
for (User user : userList) {
if ("1542095624162525185".equals(user.getRoleId())) {
messageClient.event(SysTypeEnum.INFORM.getValue(), "申领审核",
"你有新的申领单待审核,请及时处理", 1, 5, user.getId().toString(),"/capital/shenlingList");
"你有新的申领单待审核,请及时处理", 1, 5, user.getId().toString(), "/capital/shenlingList");
}
}
}
@ -167,6 +144,8 @@ public class ApplyController extends BladeController {
for (ApplyDetail applyDetail : detailList) {
applyDetail.setApplyId(apply.getId());
applyDetail.setIsCk(0);
applyDetail.setReturnNum(0);
applyDetail.setOutNum(0);
if (applyDetail.getReturnTime() != null) {
applyDetail.setIsReturn(0);
}
@ -202,13 +181,14 @@ public class ApplyController extends BladeController {
if (apply.getStatus() == 1) {
// 消息通知
messageClient.event(SysTypeEnum.INFORM.getValue(), "申领出库",
"你有新的申领单待出库,请及时处理", 1, 5, "1533753689484058625","/capital/shenlingList");
"你有新的申领单待出库,请及时处理", 1, 5, "1533753689484058625", "/capital/shenlingList");
}
//驳回
if (apply.getStatus() == -1) {
Apply byId = applyService.getById(apply.getId());
// 消息通知
messageClient.event(SysTypeEnum.INFORM.getValue(), "申领驳回",
"你有申领单被驳回,请重新下单", 1, 5, apply.getApplyUserId().toString(),"/capital/shenlingList");
"你有申领单被驳回,请重新下单", 1, 5, byId.getApplyUserId().toString(), "/capital/shenlingList");
if (detailList != null && detailList.size() > 0) {
for (ApplyDetail applyDetail : detailList) {
// 加回库存
@ -237,7 +217,7 @@ public class ApplyController extends BladeController {
if (detailList != null && detailList.size() > 0) {
for (ApplyDetail applyDetail : detailList) {
applyDetail.setIsCk(1);
applyDetail.setReturnNum(0);
applyDetail.setCkTime(new Date());
Goods goods = goodsService.getById(applyDetail.getProductId());
goods.setNum(goods.getNum() + (applyDetail.getApplyNum() - applyDetail.getOutNum()));
goodsService.updateById(goods);
@ -256,7 +236,7 @@ public class ApplyController extends BladeController {
// 消息通知
Apply byId = applyService.getById(apply.getId());
messageClient.event(SysTypeEnum.INFORM.getValue(), "领取确认",
"你有新的申领单待确认,请及时处理", 1, 5, byId.getApplyUserId().toString(),"/capital/shenlingList");
"你有新的申领单待确认,请及时处理", 1, 5, byId.getApplyUserId().toString(), "/capital/shenlingList");
}
}
@ -271,7 +251,7 @@ public class ApplyController extends BladeController {
applyService.updateById(apply);
// 消息通知
messageClient.event(SysTypeEnum.INFORM.getValue(), "异常变更",
"你申领的物品数量有变动,请及时核对", 1, 5, apply.getApplyUserId().toString(),"/capital/shenlingList");
"你申领的物品数量有变动,请及时核对", 1, 5, apply.getApplyUserId().toString(), "/capital/shenlingList");
List<ApplyDetail> detailList = applyVO.getDetailList();
if (detailList != null && detailList.size() > 0) {
for (ApplyDetail applyDetail : detailList) {
@ -400,7 +380,7 @@ public class ApplyController extends BladeController {
}
/**
* 出库单打印
* 10.出库单打印
*/
@GetMapping("/print")
public void print(String id, HttpServletResponse response) {
@ -408,5 +388,4 @@ public class ApplyController extends BladeController {
}
}

@ -228,7 +228,7 @@ public class ContractController extends BladeController {
contractDetailService.saveBatch(details);
contractService.save(contract1);
} else {
throw new Exception("系统内无此供应商,请录入供应商后重新导入!");
throw new Exception("系统内无" + contractExcels.get(0).getSupplierName() + "此供应商,请录入供应商后重新导入!");
}
}
}

@ -18,18 +18,17 @@ import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.lims.capital.entity.GoodsCheckLog;
import org.springblade.lims.capital.entity.Product;
import org.springblade.lims.capital.entity.ProductClass;
import org.springblade.lims.capital.entity.ProductStoreDetial;
import org.springblade.lims.capital.entity.*;
import org.springblade.lims.capital.excel.GoodsExcel;
import org.springblade.lims.capital.excel.ProductExcel;
import org.springblade.lims.capital.service.IGoodsCheckLogService;
import org.springblade.lims.capital.service.IProductClassService;
import org.springblade.lims.capital.service.IProductStoreDetialService;
import org.springblade.lims.common.OrderUtils;
import org.springblade.lims.goods.entity.ApplyDetail;
import org.springblade.lims.goods.entity.Goods;
import org.springblade.lims.goods.entity.Report;
import org.springblade.lims.goods.service.IApplyDetailService;
import org.springblade.lims.goods.service.IGoodsService;
import org.springblade.lims.goods.service.IReportService;
import org.springblade.resource.enums.SysTypeEnum;
@ -42,9 +41,9 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* 物品表 控制器
@ -69,6 +68,8 @@ public class GoodsController extends BladeController {
private final IUserClient userClient;
private final IApplyDetailService applyDetailService;
//物品列表 分页
@GetMapping("/list")
public IPage<Goods> list(Goods goods, Query query) {
@ -267,7 +268,6 @@ public class GoodsController extends BladeController {
productStoreDetialService.updateById(detial);
}
/**
* 质检详情
*/
@ -307,4 +307,217 @@ public class GoodsController extends BladeController {
}
}
}
/**
* 实验室物资种类及本周出入库统计
*/
@GetMapping("/classAndInOut")
public R<Map<String, Object>> classAndInOut() throws ParseException {
Map<String, Object> map = new HashMap<>();
// 物资种类数量
int count = productClassService.count();
map.put("classCount", count);
// 本周每天出入库数量
List<String> week = new ArrayList<>();
List<Integer> out = new ArrayList<>();
List<Integer> in = new ArrayList<>();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar cld = Calendar.getInstance(Locale.CHINA);
//以周一为首日
cld.setFirstDayOfWeek(Calendar.MONDAY);
// 周一开始时间和结束时间
cld.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
Date mondayStart = df2.parse(df.format(cld.getTime()) + " 00:00:00");
Date mondayEnd = df2.parse(df.format(cld.getTime()) + " 23:59:59");
// 周一出库数量
LambdaQueryWrapper<ApplyDetail> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ApplyDetail::getIsCk, 1);
wrapper.between(ApplyDetail::getCkTime,mondayStart,mondayEnd);
List<ApplyDetail> applyDetails1 = applyDetailService.list(wrapper);
int mondayOut = 0;
for (ApplyDetail applyDetail : applyDetails1) {
mondayOut += applyDetail.getOutNum();
}
// 周一入库数量
LambdaQueryWrapper<ProductStoreDetial> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProductStoreDetial::getStatus, 1);
queryWrapper.between(ProductStoreDetial::getUpdateTime,mondayStart,mondayEnd);
List<ProductStoreDetial> storeDetials1 = productStoreDetialService.list(queryWrapper);
int mondayIn = 0;
for (ProductStoreDetial storeDetial : storeDetials1) {
mondayIn += storeDetial.getNum();
}
week.add("周一");
out.add(mondayOut);
in.add(mondayIn);
// 周二开始时间和结束时间
cld.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
Date tuesdayStart = df2.parse(df.format(cld.getTime()) + " 00:00:00");
Date tuesdayEnd = df2.parse(df.format(cld.getTime()) + " 23:59:59");
// 周二出库数量
wrapper.clear();
wrapper.eq(ApplyDetail::getIsCk, 1);
wrapper.between(ApplyDetail::getCkTime,tuesdayStart,tuesdayEnd);
List<ApplyDetail> applyDetails2 = applyDetailService.list(wrapper);
int tuesdayOut = 0;
for (ApplyDetail applyDetail : applyDetails2) {
tuesdayOut += applyDetail.getOutNum();
}
// 周二入库数量
queryWrapper.clear();
queryWrapper.eq(ProductStoreDetial::getStatus, 1);
queryWrapper.between(ProductStoreDetial::getUpdateTime,tuesdayStart,tuesdayEnd);
List<ProductStoreDetial> storeDetials2 = productStoreDetialService.list(queryWrapper);
int tuesdayIn = 0;
for (ProductStoreDetial storeDetial : storeDetials2) {
tuesdayIn += storeDetial.getNum();
}
week.add("周二");
out.add(tuesdayOut);
in.add(tuesdayIn);
// 周三开始时间和结束时间
cld.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);
Date wednedayStart = df2.parse(df.format(cld.getTime()) + " 00:00:00");
Date wednedayEnd = df2.parse(df.format(cld.getTime()) + " 23:59:59");
// 周三出库数量
wrapper.clear();
wrapper.eq(ApplyDetail::getIsCk, 1);
wrapper.between(ApplyDetail::getCkTime,wednedayStart,wednedayEnd);
List<ApplyDetail> applyDetails3 = applyDetailService.list(wrapper);
int wednedayOut = 0;
for (ApplyDetail applyDetail : applyDetails3) {
wednedayOut += applyDetail.getOutNum();
}
// 周三入库数量
queryWrapper.clear();
queryWrapper.eq(ProductStoreDetial::getStatus, 1);
queryWrapper.between(ProductStoreDetial::getUpdateTime,wednedayStart,wednedayEnd);
List<ProductStoreDetial> storeDetials3 = productStoreDetialService.list(queryWrapper);
int wednedayIn = 0;
for (ProductStoreDetial storeDetial : storeDetials3) {
wednedayIn += storeDetial.getNum();
}
week.add("周三");
out.add(wednedayOut);
in.add(wednedayIn);
// 周四开始时间和结束时间
cld.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
Date thursdayStart = df2.parse(df.format(cld.getTime()) + " 00:00:00");
Date thursdayEnd = df2.parse(df.format(cld.getTime()) + " 23:59:59");
// 周四出库数量
wrapper.clear();
wrapper.eq(ApplyDetail::getIsCk, 1);
wrapper.between(ApplyDetail::getCkTime,thursdayStart,thursdayEnd);
List<ApplyDetail> applyDetails4 = applyDetailService.list(wrapper);
int thursdayOut = 0;
for (ApplyDetail applyDetail : applyDetails4) {
thursdayOut += applyDetail.getOutNum();
}
// 周四入库数量
queryWrapper.clear();
queryWrapper.eq(ProductStoreDetial::getStatus, 1);
queryWrapper.between(ProductStoreDetial::getUpdateTime,thursdayStart,thursdayEnd);
List<ProductStoreDetial> storeDetials4 = productStoreDetialService.list(queryWrapper);
int thursdayIn = 0;
for (ProductStoreDetial storeDetial : storeDetials4) {
thursdayIn += storeDetial.getNum();
}
week.add("周四");
out.add(thursdayOut);
in.add(thursdayIn);
// 周五开始时间和结束时间
cld.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
Date fridayStart = df2.parse(df.format(cld.getTime()) + " 00:00:00");
Date fridayEnd = df2.parse(df.format(cld.getTime()) + " 23:59:59");
// 周五出库数量
wrapper.clear();
wrapper.eq(ApplyDetail::getIsCk, 1);
wrapper.between(ApplyDetail::getCkTime,fridayStart,fridayEnd);
List<ApplyDetail> applyDetails5 = applyDetailService.list(wrapper);
int fridayOut = 0;
for (ApplyDetail applyDetail : applyDetails5) {
fridayOut += applyDetail.getOutNum();
}
// 周五入库数量
queryWrapper.clear();
queryWrapper.eq(ProductStoreDetial::getStatus, 1);
queryWrapper.between(ProductStoreDetial::getUpdateTime,fridayStart,fridayEnd);
List<ProductStoreDetial> storeDetials5 = productStoreDetialService.list(queryWrapper);
int fridayIn = 0;
for (ProductStoreDetial storeDetial : storeDetials5) {
fridayIn += storeDetial.getNum();
}
week.add("周五");
out.add(fridayOut);
in.add(fridayIn);
// 周六开始时间和结束时间
cld.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
Date saturdayStart = df2.parse(df.format(cld.getTime()) + " 00:00:00");
Date saturdayEnd = df2.parse(df.format(cld.getTime()) + " 23:59:59");
// 周六出库数量
wrapper.clear();
wrapper.eq(ApplyDetail::getIsCk, 1);
wrapper.between(ApplyDetail::getCkTime,saturdayStart,saturdayEnd);
List<ApplyDetail> applyDetails6 = applyDetailService.list(wrapper);
int saturdayOut = 0;
for (ApplyDetail applyDetail : applyDetails6) {
saturdayOut += applyDetail.getOutNum();
}
// 周六入库数量
queryWrapper.clear();
queryWrapper.eq(ProductStoreDetial::getStatus, 1);
queryWrapper.between(ProductStoreDetial::getUpdateTime,saturdayStart,saturdayEnd);
List<ProductStoreDetial> storeDetials6 = productStoreDetialService.list(queryWrapper);
int saturdayIn = 0;
for (ProductStoreDetial storeDetial : storeDetials6) {
saturdayIn += storeDetial.getNum();
}
week.add("周六");
out.add(saturdayOut);
in.add(saturdayIn);
// 周日开始时间和结束时间
cld.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
Date sundayStart = df2.parse(df.format(cld.getTime()) + " 00:00:00");
Date sundayEnd = df2.parse(df.format(cld.getTime()) + " 23:59:59");
// 周日出库数量
wrapper.clear();
wrapper.eq(ApplyDetail::getIsCk, 1);
wrapper.between(ApplyDetail::getCkTime,sundayStart,sundayEnd);
List<ApplyDetail> applyDetails7 = applyDetailService.list(wrapper);
int sundayOut = 0;
for (ApplyDetail applyDetail : applyDetails7) {
sundayOut += applyDetail.getOutNum();
}
// 周日入库数量
queryWrapper.clear();
queryWrapper.eq(ProductStoreDetial::getStatus, 1);
queryWrapper.between(ProductStoreDetial::getUpdateTime,sundayStart,sundayEnd);
List<ProductStoreDetial> storeDetials7 = productStoreDetialService.list(queryWrapper);
int sundayIn = 0;
for (ProductStoreDetial storeDetial : storeDetials7) {
sundayIn += storeDetial.getNum();
}
week.add("周日");
out.add(sundayOut);
in.add(sundayIn);
map.put("week", week);
map.put("out", out);
map.put("in", in);
return R.data(map);
}
}

@ -12,6 +12,7 @@ import org.springblade.iot.entry.SensorHistory;
import org.springblade.iot.service.ISensorAlertService;
import org.springblade.iot.service.ISensorHistoryService;
import org.springblade.iot.service.ISensorService;
import org.springblade.iot.tools.RedisUtil;
import org.springblade.iot.utils.ReadModBusUtil;
import org.springblade.system.feign.ISysClient;
import org.springframework.boot.CommandLineRunner;
@ -35,6 +36,8 @@ public class ModbusReader implements CommandLineRunner {
private final ISensorAlertService sensorAlertService;
private final RedisUtil redisUtil;
/**
* 项目启动读取传感器数据 相关逻辑
*/
@ -62,24 +65,16 @@ public class ModbusReader implements CommandLineRunner {
if (floats.get(0) != null) {
sensor.setCurrData(String.valueOf(floats.get(0)));
}
// System.out.println(sensor.getIp() + ":" + sensor.getSignalName() + ":" + floats);
// 加入缓存
String tempStr = CacheUtil.get(BIZ_CACHE, "sensor:id", sensor.getId(), () -> JSONObject.toJSONString(sensor));
System.out.println("tempStr" + tempStr);
redisUtil.set(BIZ_CACHE + "sensor:id" + sensor.getId(), JSONObject.toJSONString(sensor));
String tempStr = (String)redisUtil.get(BIZ_CACHE + "sensor:id" + sensor.getId());
Sensor result = JSONObject.parseObject(tempStr, Sensor.class);
System.out.println("result" + result);
String str = (String) CacheUtil.get(BIZ_CACHE, "sensor:id", sensor.getId());
System.out.println("str" + str);
Sensor result1 = JSONObject.parseObject(str, Sensor.class);
System.out.println("result" + result1);
SensorHistory resultHistory = new SensorHistory();
BeanUtil.copy(result, resultHistory);
resultHistory.setId(null);
resultHistory.setCreateTime(new Date());
tempList.add(resultHistory);
// System.out.println("resultHistory:" + resultHistory);
// 报警信息
if (sensor.getWarningValue() != null &&
!"".equals(sensor.getWarningValue()) &&

@ -0,0 +1,39 @@
package org.springblade.iot.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
@EnableCaching //开启注解
public class RedisConfig extends CachingConfigurerSupport {
/**
* retemplate相关配置
* 序列化配置如果没有配置序列化的话可能会出现往redis存了值但是获取不到
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSeial.setObjectMapper(om);
template.setValueSerializer(jacksonSeial);
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(jacksonSeial);
template.afterPropertiesSet();
return template;
}
}

@ -0,0 +1,21 @@
package org.springblade.iot.config;
import lombok.RequiredArgsConstructor;
import org.springblade.iot.tools.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
@Configuration
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class RedisToolConfig {
private final RedisTemplate redisTemplate;
@Bean(name = "redisUtil")
public RedisUtil redisUtil() {
return new RedisUtil(redisTemplate);
}
}

@ -4,6 +4,7 @@ package org.springblade.iot.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.annotations.Api;
import lombok.AllArgsConstructor;
import oracle.jdbc.proxy.annotation.Post;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.tool.api.R;
import org.springblade.iot.entry.SensorAlert;
@ -31,6 +32,13 @@ public class SensorAlertController extends BladeController {
public R<List<SensorAlert>> abnormal() {
LambdaQueryWrapper<SensorAlert> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SensorAlert::getIsRead, 0);
wrapper.orderByDesc(SensorAlert::getCreateTime);
return R.data(sensorAlertService.list(wrapper));
}
@PostMapping("/read")
public R read(@RequestBody SensorAlert sensorAlert) {
sensorAlert.setIsRead(1);
return R.status(sensorAlertService.updateById(sensorAlert));
}
}

@ -20,6 +20,7 @@ import org.springblade.iot.entry.Sensor;
import org.springblade.iot.entry.SensorHistory;
import org.springblade.iot.service.ISensorHistoryService;
import org.springblade.iot.service.ISensorService;
import org.springblade.iot.tools.RedisUtil;
import org.springframework.web.bind.annotation.*;
import java.text.DecimalFormat;
@ -43,6 +44,8 @@ public class SensorController extends BladeController {
private final ISensorHistoryService sensorHistoryService;
private final RedisUtil redisUtil;
/**
* 分页
*/
@ -565,20 +568,45 @@ public class SensorController extends BladeController {
System.out.println("sensors" + sensors);
if (sensors != null && sensors.size() > 0) {
for (Sensor sensor : sensors) {
System.out.println("sensor.getId()" + sensor.getId());
String str = (String) CacheUtil.get(BIZ_CACHE, "sensor:id", sensor.getId());
System.out.println("str:" + str);
String str = (String) redisUtil.get(BIZ_CACHE + "sensor:id" + sensor.getId());
Sensor result = JSONObject.parseObject(str, Sensor.class);
System.out.println("result" + result);
System.out.println("result.getType()" + result.getType());
double v = Double.parseDouble(result.getCurrData());
double v1 = Double.parseDouble(sensor.getWarningValue());
// 温度
if ("温度".equals(result.getType())) {
map.put("temperature", result.getCurrData());
if (v > v1) {
map.put("temperatureStatus", "0");
} else {
map.put("temperatureStatus", "1");
}
} else {
map.put("temperature", "-");
map.put("temperatureStatus", "1");
}
// 湿度
if ("湿度".equals(result.getType())) {
map.put("humidity", result.getCurrData());
if (v > v1) {
map.put("humidityStatus", "0");
} else {
map.put("humidityStatus", "1");
}
} else {
map.put("humidity", "-");
map.put("humidityStatus", "1");
}
// 压差
if ("压差".equals(result.getType())) {
map.put("pressure", result.getCurrData());
if (v < v1) {
map.put("pressureStatus", "0");
} else {
map.put("pressureStatus", "1");
}
} else {
map.put("pressure", "-");
map.put("pressureStatus", "1");
}
}
}

@ -0,0 +1,569 @@
package org.springblade.iot.tools;
import org.springframework.data.redis.core.BoundListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
public class RedisUtil {
private RedisTemplate<String, Object> redisTemplate;
public RedisUtil(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
/**
* 指定缓存失效时间
* @param key
* @param time 时间()
* @return
*/
public boolean expire(String key,long time){
try {
if(time>0){
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据key 获取过期时间
* @param key 不能为null
* @return 时间() 返回0代表为永久有效
*/
public long getExpire(String key){
return redisTemplate.getExpire(key,TimeUnit.SECONDS);
}
/**
* 判断key是否存在
* @param key
* @return true 存在 false不存在
*/
public boolean hasKey(String key){
try {
return redisTemplate.hasKey(key);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 删除缓存
* @param key 可以传一个值 或多个
*/
@SuppressWarnings("unchecked")
public void del(String ... key){
if(key!=null&&key.length>0){
if(key.length==1){
redisTemplate.delete(key[0]);
}else{
redisTemplate.delete(CollectionUtils.arrayToList(key));
}
}
}
/**
* 普通缓存获取
* @param key
* @return
*/
public Object get(String key){
return key==null?null:redisTemplate.opsForValue().get(key);
}
/**
* 普通缓存放入
* @param key
* @param value
* @return true成功 false失败
*/
public boolean set(String key,Object value) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 普通缓存放入并设置时间
* @param key
* @param value
* @param time 时间() time要大于0 如果time小于等于0 将设置无限期
* @return true成功 false 失败
*/
public boolean set(String key,Object value,long time){
try {
if(time>0){
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
}else{
set(key, value);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 递增
* @param key
* @param delta 要增加几(大于0)
* @return
*/
public long incr(String key, long delta){
if(delta<0){
throw new RuntimeException("递增因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, delta);
}
/**
* 递减
* @param key
* @param delta 要减少几(小于0)
* @return
*/
public long decr(String key, long delta){
if(delta<0){
throw new RuntimeException("递减因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, -delta);
}
/**
* HashGet
* @param key 不能为null
* @param item 不能为null
* @return
*/
public Object hget(String key,String item){
return redisTemplate.opsForHash().get(key, item);
}
/**
* 获取hashKey对应的所有键值
* @param key
* @return 对应的多个键值
*/
public Map<Object,Object> hmget(String key){
return redisTemplate.opsForHash().entries(key);
}
/**
* HashSet
* @param key
* @param map 对应多个键值
* @return true 成功 false 失败
*/
public boolean hmset(String key, Map<String,Object> map){
try {
redisTemplate.opsForHash().putAll(key, map);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* HashSet 并设置时间
* @param key
* @param map 对应多个键值
* @param time 时间()
* @return true成功 false失败
*/
public boolean hmset(String key, Map<String,Object> map, long time){
try {
redisTemplate.opsForHash().putAll(key, map);
if(time>0){
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 向一张hash表中放入数据,如果不存在将创建
* @param key
* @param item
* @param value
* @return true 成功 false失败
*/
public boolean hset(String key,String item,Object value) {
try {
redisTemplate.opsForHash().put(key, item, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 向一张hash表中放入数据,如果不存在将创建
* @param key
* @param item
* @param value
* @param time 时间() 注意:如果已存在的hash表有时间,这里将会替换原有的时间
* @return true 成功 false失败
*/
public boolean hset(String key,String item,Object value,long time) {
try {
redisTemplate.opsForHash().put(key, item, value);
if(time>0){
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 删除hash表中的值
* @param key 不能为null
* @param item 可以使多个 不能为null
*/
public void hdel(String key, Object... item){
redisTemplate.opsForHash().delete(key,item);
}
/**
* 判断hash表中是否有该项的值
* @param key 不能为null
* @param item 不能为null
* @return true 存在 false不存在
*/
public boolean hHasKey(String key, String item){
return redisTemplate.opsForHash().hasKey(key, item);
}
/**
* hash递增 如果不存在,就会创建一个 并把新增后的值返回
* @param key
* @param item
* @param by 要增加几(大于0)
* @return
*/
public double hincr(String key, String item,double by){
return redisTemplate.opsForHash().increment(key, item, by);
}
/**
* hash递减
* @param key
* @param item
* @param by 要减少记(小于0)
* @return
*/
public double hdecr(String key, String item,double by){
return redisTemplate.opsForHash().increment(key, item,-by);
}
/**
* 根据key获取Set中的所有值
* @param key
* @return
*/
public Set<Object> sGet(String key){
try {
return redisTemplate.opsForSet().members(key);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 根据value从一个set中查询,是否存在
* @param key
* @param value
* @return true 存在 false不存在
*/
public boolean sHasKey(String key,Object value){
try {
return redisTemplate.opsForSet().isMember(key, value);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将数据放入set缓存
* @param key
* @param values 可以是多个
* @return 成功个数
*/
public long sSet(String key, Object...values) {
try {
return redisTemplate.opsForSet().add(key, values);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 将set数据放入缓存
* @param key
* @param time 时间()
* @param values 可以是多个
* @return 成功个数
*/
public long sSetAndTime(String key,long time,Object...values) {
try {
Long count = redisTemplate.opsForSet().add(key, values);
if(time>0) {
expire(key, time);
}
return count;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 获取set缓存的长度
* @param key
* @return
*/
public long sGetSetSize(String key){
try {
return redisTemplate.opsForSet().size(key);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 移除值为value的
* @param key
* @param values 可以是多个
* @return 移除的个数
*/
public long setRemove(String key, Object ...values) {
try {
Long count = redisTemplate.opsForSet().remove(key, values);
return count;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 获取list缓存的内容
* @param key
* @param start 开始
* @param end 结束 0 -1代表所有值
* @return
*/
public List<Object> lGet(String key, long start, long end){
try {
return redisTemplate.opsForList().range(key, start, end);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 获取list缓存的长度
* @param key
* @return
*/
public long lGetListSize(String key){
try {
return redisTemplate.opsForList().size(key);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 通过索引 获取list中的值
* @param key
* @param index 索引 index>=0时 0 表头1 第二个元素依次类推index<0时-1表尾-2倒数第二个元素依次类推
* @return
*/
public Object lGetIndex(String key,long index){
try {
return redisTemplate.opsForList().index(key, index);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 将list放入缓存
* @param key
* @param value
* @return
*/
public boolean lSet(String key, Object value) {
try {
redisTemplate.opsForList().rightPush(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
* @param key
* @param value
* @param time 时间()
* @return
*/
public boolean lSet(String key, Object value, long time) {
try {
redisTemplate.opsForList().rightPush(key, value);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
* @param key
* @param value
* @return
*/
public boolean lSet(String key, List<Object> value) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
* @param key
* @param value
* @param time 时间()
* @return
*/
public boolean lSet(String key, List<Object> value, long time) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据索引修改list中的某条数据
* @param key
* @param index 索引
* @param value
* @return
*/
public boolean lUpdateIndex(String key, long index,Object value) {
try {
redisTemplate.opsForList().set(key, index, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 移除N个值为value
* @param key
* @param count 移除多少个
* @param value
* @return 移除的个数
*/
public long lRemove(String key,long count,Object value) {
try {
Long remove = redisTemplate.opsForList().remove(key, count, value);
return remove;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 模糊查询获取key值
* @param pattern
* @return
*/
public Set keys(String pattern){
return redisTemplate.keys(pattern);
}
/**
* 使用Redis的消息队列
* @param channel
* @param message 消息内容
*/
public void convertAndSend(String channel, Object message){
redisTemplate.convertAndSend(channel,message);
}
/**
* 根据起始结束序号遍历Redis中的list
* @param listKey
* @param start 起始序号
* @param end 结束序号
* @return
*/
public List<Object> rangeList(String listKey, long start, long end) {
//绑定操作
BoundListOperations<String, Object> boundValueOperations = redisTemplate.boundListOps(listKey);
//查询数据
return boundValueOperations.range(start, end);
}
/**
* 弹出右边的值 --- 并且移除这个值
* @param listKey
*/
public Object rifhtPop(String listKey){
//绑定操作
BoundListOperations<String, Object> boundValueOperations = redisTemplate.boundListOps(listKey);
return boundValueOperations.rightPop();
}
}

@ -485,8 +485,6 @@ public class EntrustController extends BladeController {
queryWrapper.eq("entrust_id", id);
TaskBlueprint taskBlueprint = blueprintService.getOne(queryWrapper);
List<Examine> examineList = new ArrayList<>();
//任务
List<ETask> eTaskList = new ArrayList<>();
if (taskBlueprint != null) {
@ -509,6 +507,7 @@ public class EntrustController extends BladeController {
examineLambdaQueryWrapper.eq(Examine::getETaskId, eTask.getId());
List<Examine> examines = examineService.list(examineLambdaQueryWrapper);
if (examines != null && examines.size() > 0) {
List<Examine> examineList = new ArrayList<>();
for (Examine examine : examines) {
if (examine.getExperieNum() != null && !"".equals(examine.getExperieNum())) {
ExamineItem examineItem = examineItemService.getById(examine.getExamineItemId());
@ -687,6 +686,12 @@ public class EntrustController extends BladeController {
if (examineBasis != null) {
examine.setExamineBasisName(examineBasis.getName());
}
if (!"".equals(examine.getExamineBy()) && examine.getExamineBy() != null) {
User user = userClient.userInfoById(Long.parseLong(examine.getExamineBy())).getData();
if (user != null) {
examine.setExamineByName(user.getName());
}
}
map.put("examine", examine);
return R.data(map);
// //已分配的检测数据
@ -1445,7 +1450,6 @@ public class EntrustController extends BladeController {
@GetMapping("/reportPrint")
public void reportPrint(String examineId, HttpServletResponse response) throws IOException {
service.reportPrint(examineId, response);
}

@ -17,6 +17,7 @@ import org.springblade.lims.entry.*;
import org.springblade.lims.service.*;
import org.springblade.resource.enums.SysTypeEnum;
import org.springblade.resource.feign.IMessageClient;
import org.springblade.system.feign.ISysClient;
import org.springblade.system.user.entity.User;
import org.springblade.system.user.feign.IUserClient;
import org.springframework.web.bind.annotation.*;
@ -56,6 +57,8 @@ public class ExamineController extends BladeController {
private final IMessageClient messageClient;
private final ISysClient sysClient;
/**
* 新增
*/
@ -207,7 +210,10 @@ public class ExamineController extends BladeController {
@GetMapping("/examineList")
public R<IPage<Examine>> list(Examine examine, Query query) {
LambdaQueryWrapper<Examine> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Examine::getDeptId, examine.getDeptId());
String dept = sysClient.getParamValue("is_limit_by_dept").getData();
if ("1".equals(dept) || dept == null) {
wrapper.eq(Examine::getDeptId, examine.getDeptId());
}
//待领取
if ("000".equals(examine.getEntrustStatus())) {
wrapper.eq(Examine::getIsDistribute, 0)

@ -584,7 +584,7 @@ public class ExamineResultController extends BladeController {
}
LambdaQueryWrapper<ExamineResult> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ExamineResult::getExamineId, examineId);
wrapper.eq(ExamineResult::getExamineId, examine.getId());
ExamineResult result = service.getOne(wrapper);
if (result != null) {
result.setOriginRecordData(JSON.toJSONString(mapList));
@ -593,7 +593,7 @@ public class ExamineResultController extends BladeController {
service.updateById(result);
} else {
ExamineResult examineResult = new ExamineResult();
examineResult.setExamineId(Long.valueOf(examineId));
examineResult.setExamineId(Long.valueOf(examine.getId()));
examineResult.setOriginRecordData(JSON.toJSONString(mapList));
examineResult.setOriginRecordResult(JSON.toJSONString(mapList));
examineResult.setExamineDataArr(JSON.toJSONString(list));
@ -959,7 +959,7 @@ public class ExamineResultController extends BladeController {
}
LambdaQueryWrapper<ExamineResult> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ExamineResult::getExamineId, examineId);
wrapper.eq(ExamineResult::getExamineId, examine.getId());
ExamineResult result = service.getOne(wrapper);
if (result != null) {
result.setOriginRecordData(JSON.toJSONString(map));
@ -968,7 +968,7 @@ public class ExamineResultController extends BladeController {
service.updateById(result);
} else {
ExamineResult examineResult = new ExamineResult();
examineResult.setExamineId(Long.valueOf(examineId));
examineResult.setExamineId(Long.valueOf(examine.getId()));
examineResult.setOriginRecordData(JSON.toJSONString(map));
examineResult.setOriginRecordResult(JSON.toJSONString(map1));
examineResult.setExamineDataArr(JSON.toJSONString(list));
@ -1339,7 +1339,7 @@ public class ExamineResultController extends BladeController {
map1.put("g" + (i + 1), mapList);
}
LambdaQueryWrapper<ExamineResult> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ExamineResult::getExamineId, examineId);
wrapper.eq(ExamineResult::getExamineId, examine.getId());
ExamineResult result = service.getOne(wrapper);
if (result != null) {
result.setOriginRecordData(JSON.toJSONString(map));
@ -1348,7 +1348,7 @@ public class ExamineResultController extends BladeController {
service.updateById(result);
} else {
ExamineResult examineResult = new ExamineResult();
examineResult.setExamineId(Long.valueOf(examineId));
examineResult.setExamineId(Long.valueOf(examine.getId()));
examineResult.setOriginRecordData(JSON.toJSONString(map));
examineResult.setOriginRecordResult(JSON.toJSONString(map1));
examineResult.setExamineDataArr(JSON.toJSONString(list));
@ -1356,7 +1356,6 @@ public class ExamineResultController extends BladeController {
}
return R.data(map1);
}
}
/**
@ -1543,7 +1542,6 @@ public class ExamineResultController extends BladeController {
}
}
/**
* 删除
*/

@ -1,9 +1,13 @@
package org.springblade.lims.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import lombok.AllArgsConstructor;
import org.openxmlformats.schemas.drawingml.x2006.chart.STErrBarType;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.lims.entry.*;
import org.springblade.lims.service.*;
@ -16,7 +20,6 @@ import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
/**
* @author swj
* @since 2022年6月1日19:49:10
@ -475,7 +478,7 @@ public class LargeScreenController extends BladeController {
* 仪器使用次数统计
*/
@GetMapping("/instrument")
public R<Map<String, Object>> instrument() {
public R<Map<String, Object>> instrument(Query query) {
Map<String, Object> map = new HashMap<>();
// 仪器设备运行中数量
LambdaQueryWrapper<Instrument> wrapper = new LambdaQueryWrapper<>();
@ -498,25 +501,40 @@ public class LargeScreenController extends BladeController {
// 仪器设备使用记录
LambdaQueryWrapper<InstrumentUseLog> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.orderByDesc(InstrumentUseLog::getCreateTime);
List<InstrumentUseLog> useLogs = instrumentUseLogService.list(queryWrapper);
if (useLogs.size() > 0 && useLogs.size() < 4) {
map.put("useLogs", useLogs);
} else {
List<InstrumentUseLog> useLogList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
useLogList.add(useLogs.get(i));
}
map.put("useLogs", useLogList);
}
IPage<InstrumentUseLog> page = instrumentUseLogService.page(Condition.getPage(query), queryWrapper);
map.put("page", page);
return R.data(map);
}
/**
* 定时往前端选择性推送
* 仪器设备维修情况
*/
@GetMapping("/message")
public void message() {
@GetMapping("/maintenance")
public R<Map<String, Object>> maintenance(Query query) {
Map<String, Object> map = new HashMap<>();
LambdaQueryWrapper<RepairApplication> wrapper = new LambdaQueryWrapper<>();
// 待审核
wrapper.eq(RepairApplication::getStatus, 0).or()
.eq(RepairApplication::getStatus, 1).or()
.eq(RepairApplication::getStatus, 2);
int dsh = repairApplicationService.count(wrapper);
wrapper.clear();
// 维修中
wrapper.eq(RepairApplication::getStatus, 3);
int wxz = repairApplicationService.count(wrapper);
wrapper.clear();
// 已完成
wrapper.eq(RepairApplication::getStatus, 4);
int ywc = repairApplicationService.count(wrapper);
wrapper.clear();
// 分页数据
wrapper.orderByDesc(RepairApplication::getCreateTime);
IPage<RepairApplication> page = repairApplicationService.page(Condition.getPage(query), wrapper);
map.put("dsh", dsh);
map.put("wxz", wxz);
map.put("ywc", ywc);
map.put("page", page);
return R.data(map);
}
}

@ -25,7 +25,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author swj
* @since 2022年6月1日19:49:10
@ -67,7 +66,6 @@ public class SimpleRelController extends BladeController {
String s = simpleRel.getExamineExperieNum().substring(0, 13);
// 实验检测编号
for (SimpleRel rel : rels) {
String num = "";
for (Integer i = 0; i < rel.getExamineNum(); i++) {
num += s + a + ",";

@ -219,7 +219,6 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
simpleRel.setEntrustId(id);
}
simpleRel.setSimpleName(name);
simpleRel.setReagentNum(1);
// simpleRel.setReagentExperieNum(s + sum);
// sum++;
@ -227,7 +226,6 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
simpleRel.setExamineNum(1);
// simpleRel.setExamineExperieNum(s + (i + a));
simpleRel.setExamineExperieNum(s + ((a - 1) * 2 + i + 1));
simpleRel.setRecessiveNum((i + a) + "");
simpleRel.setOriginalNum((i + a) + "");
simpleRel.setStatus(0);
@ -1051,7 +1049,7 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
}
for (int i = 0; i < (list.size() / 96); i++) {
int start = i * 96 - 1;
int start = i * 96;
if (i == 0) {
start = 0;
}
@ -1236,7 +1234,7 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
if (list.size() % 96 != 0) {
for (int i = 0; i < (list.size() / 96 + 1); i++) {
int start = i * 96 - 1;
int start = i * 96;
if (i == 0) {
start = 0;
}
@ -1335,7 +1333,7 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
}
} else {
for (int i = 0; i < (list.size() / 96); i++) {
int start = i * 96 - 1;
int start = i * 96;
if (i == 0) {
start = 0;
}

@ -158,8 +158,7 @@ public class ExamineResultServiceImpl extends BaseServiceImpl<ExamineResultMappe
log.setIsFinished(0);
simpleDoExamineLogService.save(log);
}
}
else {
} else {
this.updateById(examineResult);
}
}
@ -266,7 +265,19 @@ public class ExamineResultServiceImpl extends BaseServiceImpl<ExamineResultMappe
ExamineItem examineItem = examineItemService.getById(examine.getExamineItemId());
ExamineWay examineWay = examineWayService.getById(examine.getExamineWayId());
ExamineBasis examineBasis = examineBasisService.getById(examine.getExamineBasisId());
String workContent = examineItem.getName() + examineWay.getName() + examineBasis.getName();
String s1 = "";
if (examineBasis != null) {
s1 = examineBasis.getName();
}
String s2 = "";
if (examineBasis != null) {
s2 = examineBasis.getName();
}
String s3 = "";
if (examineBasis != null) {
s3 = examineBasis.getName();
}
String workContent = s1 + s2 + s3;
for (String s : split) {
Instrument instrument = instrumentService.getById(s);
InstrumentUseLog instrumentUseLog = new InstrumentUseLog();

@ -1,7 +1,5 @@
package org.springblade.lims.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@ -32,7 +30,6 @@ import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
* 委托单表 服务实现类
*
@ -104,9 +101,8 @@ public class SimpleServiceImpl extends BaseServiceImpl<SimpleMapper, Simple> imp
simple1.setIsDistribution(0);
resultList.add(simple1);
}
simple.setStatus(1);
}
simpleRelService.updateBatchById(rels);
this.saveBatch(resultList);
}
// 生成样品集编号
@ -148,7 +144,6 @@ public class SimpleServiceImpl extends BaseServiceImpl<SimpleMapper, Simple> imp
simpleSet.setSimpleState(simple.getSimpleState());
simpleSet.setSamplingDate(new Date());
simpleSet.setIsDistribution(0);
// simpleSet.setStatus(0);
simpleSetList.add(simpleSet);
for (Simple simple1 : simples) {
simple1.setSetId(simpleSet.getId());
@ -159,11 +154,6 @@ public class SimpleServiceImpl extends BaseServiceImpl<SimpleMapper, Simple> imp
} catch (ParseException e) {
e.printStackTrace();
}
this.saveBatch(resultList);
// 发送提示消息
// messageClient.event(SysTypeEnum.INFORM.getValue(), "计划书",
// "你有新的计划待分配,请及时查看", 1, 5, "1542330472226856962");
return R.data(simpleAo.getIsContinue());
}
}

@ -73,14 +73,9 @@ public class TeacherController extends BladeController {
teacher.setDeptId(user.getDeptId());
teacher.setDeptName(sysClient.getDeptName(Long.valueOf(user.getDeptId())).getData());
teacher.setTrainCount(0);
// 讲师相关培训
LambdaQueryWrapper<Train> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Train::getTeacher, teacher.getTeacherId());
wrapper.orderByDesc(Train::getCreateTime);
List<Train> list = trainService.list(wrapper);
teacher.setRecentTrain(list.get(0).getName());
teacher.setEducation(user.getEducation());
teacher.setTel(user.getPhone());
teacher.setPraise(0);
return R.status(teacherService.save(teacher));
}

@ -7,20 +7,26 @@ import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.resource.enums.SysTypeEnum;
import org.springblade.system.entity.AuthClient;
import org.springblade.system.user.entity.Teacher;
import org.springblade.system.user.entity.Train;
import org.springblade.system.user.entity.TrainPerson;
import org.springblade.system.user.entity.TrainSpeak;
import org.springblade.system.user.service.ITeacherService;
import org.springblade.system.user.service.ITrainPersonService;
import org.springblade.system.user.service.ITrainService;
import org.springblade.system.user.service.ITrainSpeakService;
import org.springblade.system.user.vo.TrainVO;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
/**
@ -36,6 +42,8 @@ public class TrainController extends BladeController {
private final ITrainService trainService;
private final ITrainPersonService trainPersonService;
/**
* 详情
*/
@ -58,17 +66,43 @@ public class TrainController extends BladeController {
.like(Train::getPlace, train.getName()).or()
.like(Train::getContent, train.getName());
}
// 添加根据培训计划编号模糊查询
// if (StringUtil.isNoneBlank(train.getCode())) {
// wrapper.like(Train::getCode, train.getCode());
// }
// 添加根据主讲人模糊查询
// if (train.getTeacher() != null) {
// wrapper.eq(Train::getTeacher, train.getTeacher());
// }
wrapper.orderByDesc(Train::getCreateTime);
IPage<Train> page = trainService.page(Condition.getPage(query), wrapper);
List<Train> trains = page.getRecords();
if (trains != null && trains.size() > 0) {
for (Train train1 : trains) {
long time = System.currentTimeMillis();
long startTime = train1.getStartTime().getTime();
long endTime = 1000 * 60 * 60 * train1.getDuration() + startTime;
if (time >= startTime && time <= endTime) {
train1.setStatus(1);
}
if (time > endTime) {
train1.setStatus(2);
}
LambdaQueryWrapper<TrainPerson> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(TrainPerson::getTrainId, train1.getId());
queryWrapper.eq(TrainPerson::getPersonId, AuthUtil.getUserId());
TrainPerson trainPerson = trainPersonService.getOne(queryWrapper);
if (trainPerson != null) {
if (trainPerson.getStatus() == 0) {
train1.setIsJoin(0);
train1.setIsEvaluate(0);
} else {
if (trainPerson.getIsEvaluate() == 0) {
train1.setIsEvaluate(0);
} else {
train1.setIsEvaluate(1);
}
train1.setIsJoin(1);
}
} else {
train1.setIsJoin(0);
train1.setIsEvaluate(0);
}
}
trainService.updateBatchById(trains);
}
return R.data(page);
}
@ -104,4 +138,12 @@ public class TrainController extends BladeController {
trainService.messageNotice(train);
}
/**
* 评价提交
*/
@PostMapping("/evaluateSubmit")
public void evaluateSubmit(@RequestBody Train train) {
trainService.evaluateSubmit(train);
}
}

@ -11,9 +11,9 @@ import org.springblade.system.user.entity.Train;
import org.springblade.system.user.entity.TrainPerson;
import org.springblade.system.user.service.ITrainPersonService;
import org.springblade.system.user.service.ITrainService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
/**
* 计划参训人员关系表 控制器
@ -41,4 +41,10 @@ public class TrainPersonController extends BladeController {
wrapper.orderByDesc(TrainPerson::getCreateTime);
return R.data(trainPersonService.page(Condition.getPage(query), wrapper));
}
@PostMapping("/update")
public R update(@RequestBody TrainPerson trainPerson) {
trainPerson.setSignInTime(new Date());
return R.status(trainPersonService.updateById(trainPerson));
}
}

@ -2,6 +2,7 @@ package org.springblade.system.user.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springblade.system.user.entity.Teacher;
import org.springblade.system.user.entity.Train;
import org.springblade.system.user.entity.TrainSpeak;
/**

@ -18,4 +18,6 @@ public interface ITrainService extends BaseService<Train> {
boolean delete(String ids);
void messageNotice(Train train);
void evaluateSubmit(Train train);
}

@ -3,16 +3,16 @@ package org.springblade.system.user.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.AllArgsConstructor;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.resource.enums.SysTypeEnum;
import org.springblade.resource.feign.IMessageClient;
import org.springblade.system.user.entity.Train;
import org.springblade.system.user.entity.TrainPerson;
import org.springblade.system.user.entity.TrainSpeak;
import org.springblade.system.user.entity.User;
import org.springblade.system.feign.ISysClient;
import org.springblade.system.user.entity.*;
import org.springblade.system.user.feign.IUserClient;
import org.springblade.system.user.mapper.TrainMapper;
import org.springblade.system.user.service.ITeacherService;
import org.springblade.system.user.service.ITrainPersonService;
import org.springblade.system.user.service.ITrainService;
import org.springblade.system.user.service.ITrainSpeakService;
@ -20,10 +20,12 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 培训计划服务实现类
*
* @author litao
* @since 2022-06-10
*/
@ -39,13 +41,19 @@ public class TrainServiceImpl extends BaseServiceImpl<TrainMapper, Train> implem
private final IMessageClient messageClient;
private final ITeacherService teacherService;
private final ISysClient sysClient;
@Override
@Transactional(rollbackFor = Exception.class)
public boolean saveTrain(Train train) {
User user1 = userClient.userInfoById(train.getTeacher()).getData();
train.setTeacherName(user1.getName());
String[] split = train.getTrainPerson().split(",");
train.setNum(split.length);
train.setStatus(0);
this.save(train);
// 参训人员入库
if (train.getTrainPerson() != null && !"".equals(train.getTrainPerson())) {
List<TrainPerson> personList = new ArrayList<>();
@ -58,19 +66,21 @@ public class TrainServiceImpl extends BaseServiceImpl<TrainMapper, Train> implem
trainPerson.setPersonId(Long.parseLong(s));
trainPerson.setPersonName(user.getName());
trainPerson.setDeptId(Long.parseLong(user.getDeptId()));
String deptName = sysClient.getDeptName(Long.parseLong(user.getDeptId())).getData();
trainPerson.setDeptName(deptName);
trainPerson.setTel(user.getPhone());
trainPerson.setStatus(0);
trainPerson.setIsEvaluate(0);
trainPerson.setCreateTime(new Date());
personList.add(trainPerson);
messageClient.event(SysTypeEnum.INFORM.getValue(), "培训会议",
"您有新的培训会议待参加,请及时查看详情", 1, 5, s,"/train/project");
"您有新的培训会议待参加,请及时查看详情", 1, 5, s, "/train/project");
}
trainPersonService.saveBatch(personList);
}
// 讲师入库
if (train.getTeacher() != null) {
User user1 = userClient.userInfoById(train.getTeacher()).getData();
train.setTeacherName(user1.getName());
TrainSpeak trainSpeak = new TrainSpeak();
trainSpeak.setTrainId(train.getId());
trainSpeak.setTrainName(train.getName());
@ -78,13 +88,28 @@ public class TrainServiceImpl extends BaseServiceImpl<TrainMapper, Train> implem
trainSpeak.setSpeakName(user1.getName());
trainSpeak.setDeptId(Long.parseLong(user1.getDeptId()));
trainSpeak.setTel(user1.getPhone());
trainSpeak.setStatus(0);
trainSpeak.setCreateTime(new Date());
trainSpeakService.save(trainSpeak);
messageClient.event(SysTypeEnum.INFORM.getValue(), "培训会议",
"您有新的培训会议待参加,请及时查看详情", 1, 5, train.getTeacher().toString(),"/train/project");
"您有新的培训会议待参加,请及时查看详情", 1, 5, train.getTeacher().toString(), "/train/project");
}
// 讲师培训次数
return this.save(train);
LambdaQueryWrapper<Teacher> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Teacher::getTeacherId, train.getTeacher());
Teacher teacher = teacherService.getOne(wrapper);
Integer count = teacher.getTrainCount();
teacher.setTrainCount(count + 1);
// 讲师相关培训
LambdaQueryWrapper<Train> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Train::getTeacher, teacher.getTeacherId());
queryWrapper.orderByDesc(Train::getCreateTime);
List<Train> list = this.list(queryWrapper);
if (list != null && list.size() > 0) {
teacher.setRecentTrain(list.get(0).getName());
}
return teacherService.updateById(teacher);
}
@Override
@ -154,7 +179,7 @@ public class TrainServiceImpl extends BaseServiceImpl<TrainMapper, Train> implem
Train byId = this.getById(train.getId());
// 通知主讲人
messageClient.event(SysTypeEnum.INFORM.getValue(), "培训会议",
"您有培训会议待参加,请及时查看详情", 1, 5, byId.getTeacher().toString(),"/train/project");
"您有培训会议待参加,请及时查看详情", 1, 5, byId.getTeacher().toString(), "/train/project");
// 通知参训人员
LambdaQueryWrapper<TrainPerson> wrapper = new LambdaQueryWrapper<>();
@ -163,8 +188,29 @@ public class TrainServiceImpl extends BaseServiceImpl<TrainMapper, Train> implem
if (personList != null && personList.size() > 0) {
for (TrainPerson trainPerson : personList) {
messageClient.event(SysTypeEnum.INFORM.getValue(), "培训会议",
"您有培训会议待参加,请及时查看详情", 1, 5, trainPerson.getPersonId().toString(),"/train/project");
"您有培训会议待参加,请及时查看详情", 1, 5, trainPerson.getPersonId().toString(), "/train/project");
}
}
}
@Override
public void evaluateSubmit(Train train) {
Train byId = this.getById(train.getId());
LambdaQueryWrapper<TrainPerson> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(TrainPerson::getTrainId, train.getId());
wrapper.eq(TrainPerson::getPersonId, AuthUtil.getUserId());
TrainPerson trainPerson = trainPersonService.getOne(wrapper);
if (trainPerson != null) {
trainPerson.setIsEvaluate(1);
trainPerson.setEvaluateScore(train.getEvaluateScore());
trainPersonService.updateById(trainPerson);
// 讲师加分入库
LambdaQueryWrapper<Teacher> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Teacher::getTeacherId, byId.getTeacher());
Teacher teacher = teacherService.getOne(queryWrapper);
Integer praise = teacher.getPraise();
teacher.setPraise(praise + train.getEvaluateScore());
teacherService.updateById(teacher);
}
}
}

@ -36,7 +36,6 @@
<module>lab-plugin</module>
<module>lab-plugin-api</module>
<module>lab-service</module>
<module>lab-service-api</module>
<!--<module>lab-monitor-api</module>-->
<!--<module>lab-iot</module>-->

Loading…
Cancel
Save