basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardTreeServiceImpl.java
@@ -156,10 +156,18 @@ // 修改名称匹配的标准树下的检验项目 // 查询所有对象+名称的树 List<StandardProductList> standardProductLists = standardProductListService.list(Wrappers.<StandardProductList>lambdaUpdate() .eq(StandardProductList::getSample, standardTree.getSample()) LambdaUpdateWrapper<StandardProductList> updateWrapper = Wrappers.<StandardProductList>lambdaUpdate() .eq(StandardProductList::getFactory, standardTree.getFactory()) .eq(StandardProductList::getLaboratory, standardTree.getLaboratory()) .eq(StandardProductList::getSampleType, standardTree.getSampleType()) .eq(StandardProductList::getModel, standardTree.getOldModel())); .eq(StandardProductList::getModel, standardTree.getOldModel()); if (StringUtils.isNotBlank(standardTree.getSample()) && !standardTree.getSample().equals("null")) { updateWrapper.eq(StandardProductList::getSample, standardTree.getSample()); } else { updateWrapper.isNull(StandardProductList::getSample); } List<StandardProductList> standardProductLists = standardProductListService.list(updateWrapper); if (CollectionUtils.isNotEmpty(standardProductLists)) { for (StandardProductList standardProductList : standardProductLists) { // 修改样品名称 @@ -182,8 +190,10 @@ .eq(StandardTree::getSampleType, standardTree.getSampleType()) .eq(StandardTree::getModel, standardTree.getOldModel()) .set(StandardTree::getModel, standardTree.getModel()); if (StringUtils.isNotBlank(standardTree.getSample())) { if (StringUtils.isNotBlank(standardTree.getSample()) && !standardTree.getSample().equals("null")) { wrapper.eq(StandardTree::getSample, standardTree.getSample()); } else { wrapper.isNull(StandardTree::getSample); } return standardTreeMapper.update(null, wrapper); } cnas-require/src/main/java/com/ruoyi/require/controller/FeTempHumDateController.java
@@ -1,6 +1,7 @@ package com.ruoyi.require.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.Result; import com.ruoyi.require.dto.FeTempHumDateDto; @@ -60,7 +61,21 @@ @PostMapping("addFeTempHumRecord") @ApiOperation("温湿度记录新增/修改") public Result<FeTempHumRecord> addFeTempHumRecord(@RequestBody FeTempHumRecord feTempHumRecord) { feTempHumRecordService.saveOrUpdate(feTempHumRecord); if (feTempHumRecord.getTempHumId() == null) { feTempHumRecordService.save(feTempHumRecord); } else { feTempHumRecordService.update(Wrappers.<FeTempHumRecord>lambdaUpdate() .eq(FeTempHumRecord::getTempHumId, feTempHumRecord.getTempHumId()) .set(FeTempHumRecord::getMorningTestTime, feTempHumRecord.getMorningTestTime()) .set(FeTempHumRecord::getMorningTemp, feTempHumRecord.getMorningTemp()) .set(FeTempHumRecord::getMorningHum, feTempHumRecord.getMorningHum()) .set(FeTempHumRecord::getMorningRecorderId, feTempHumRecord.getMorningRecorderId()) .set(FeTempHumRecord::getAfternoonTime, feTempHumRecord.getAfternoonTime()) .set(FeTempHumRecord::getAfternoonTemp, feTempHumRecord.getAfternoonTemp()) .set(FeTempHumRecord::getAfternoonHum, feTempHumRecord.getAfternoonHum()) .set(FeTempHumRecord::getAfternoonRecorderId, feTempHumRecord.getAfternoonRecorderId()) ); } return Result.success(); } cnas-require/src/main/java/com/ruoyi/require/dto/FeTempHumDateDto.java
@@ -9,4 +9,13 @@ @ApiModelProperty("创建人") private String createName; @ApiModelProperty("记录员") private String registrarUserName; @ApiModelProperty("温度区间") private String temperatureSection; @ApiModelProperty("湿度区间") private String humiditySection; } cnas-require/src/main/java/com/ruoyi/require/dto/FeTempHumRecordDto.java
@@ -1,5 +1,6 @@ package com.ruoyi.require.dto; import com.deepoove.poi.data.PictureRenderData; import com.ruoyi.require.pojo.FeTempHumRecord; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -24,4 +25,40 @@ @ApiModelProperty("检测天") private Integer monthDay; @ApiModelProperty("登记员") private Integer registrarUserId; @ApiModelProperty("试验区域名称") private String testAreaName; @ApiModelProperty("上午记录员签名地址") private String morningRecorderUrl; @ApiModelProperty("下午记录员签名地址") private String afternoonRecorderUrl; @ApiModelProperty("上午记录员签名地址") private PictureRenderData morningRecorderUrlRender; @ApiModelProperty("下午记录员签名地址") private PictureRenderData afternoonRecorderUrlRender; @ApiModelProperty("最高温度") private Double temperatureHighest; @ApiModelProperty("最低温度") private Double temperatureLowest; @ApiModelProperty("最高湿度") private Double humidityHighest; @ApiModelProperty("最低湿度") private Double humidityLowest; @ApiModelProperty("是否是疑问数据") private Integer isIssue; } cnas-require/src/main/java/com/ruoyi/require/mapper/FeTempHumRecordMapper.java
@@ -7,6 +7,9 @@ import com.ruoyi.require.pojo.FeTempHumRecord; import org.apache.ibatis.annotations.Param; import java.time.LocalDate; import java.util.List; /** * <p> * 设施和环境条件-设施和环境条件要求-温湿度记录 Mapper 接口 @@ -18,4 +21,10 @@ public interface FeTempHumRecordMapper extends BaseMapper<FeTempHumRecord> { IPage<FeTempHumRecordDto> getFeTempHumRecordPage(Page page, @Param("dateId") Integer dateId); /** * 查询有日期但是未填写名字的 * @return */ List<FeTempHumRecordDto> selectNoaffirm(LocalDate date); } cnas-require/src/main/java/com/ruoyi/require/pojo/FeTempHumDate.java
@@ -35,8 +35,8 @@ @ApiModelProperty("增补信息") private String subjoin; @ApiModelProperty("是否确认") private String isAffirm; @ApiModelProperty("登记员") private Integer registrarUserId; @ApiModelProperty("创建时间") @TableField(fill = FieldFill.INSERT) cnas-require/src/main/java/com/ruoyi/require/service/impl/FeTempHumDateServiceImpl.java
@@ -2,11 +2,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.data.Pictures; import com.ruoyi.common.utils.QueryWrappers; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.inspect.util.HackLoopTableRenderPolicy; @@ -18,6 +20,7 @@ import com.ruoyi.require.service.FeTempHumDateService; import com.ruoyi.require.service.FeTempHumRecordService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -46,6 +49,8 @@ @Resource private FeTempHumRecordService feTempHumRecordService; @Value("${file.path}") private String imgUrl; @Override public IPage<FeTempHumDateDto> getFeTempHumDate(Page page, FeTempHumDateDto feTempHumDateDto) { @@ -80,6 +85,10 @@ BeanUtils.copyProperties(recordDtos.get(0), recordDto, "month"); recordDto.setMorningTestTimeStr(recordDto.getMorningTestTime() == null ? null : recordDto.getMorningTestTime().format(formatter)); recordDto.setAfternoonTimeStr(recordDto.getAfternoonTime() == null ? null : recordDto.getAfternoonTime().format(formatter)); recordDto.setMorningRecorderUrlRender(StringUtils.isNotBlank(recordDto.getMorningRecorderUrl()) ? Pictures.ofLocal(imgUrl + "/" + recordDto.getMorningRecorderUrl()).create() : null); recordDto.setAfternoonRecorderUrlRender(StringUtils.isNotBlank(recordDto.getAfternoonRecorderUrl()) ? Pictures.ofLocal(imgUrl + "/" + recordDto.getAfternoonRecorderUrl()).create() : null); } } @@ -128,19 +137,7 @@ // 温湿度确认 this.update(Wrappers.<FeTempHumDate>lambdaUpdate() .eq(FeTempHumDate::getDateId, feTempHumDate.getDateId()) .set(FeTempHumDate::getSubjoin, feTempHumDate.getSubjoin()) .set(FeTempHumDate::getIsAffirm, 1)); .set(FeTempHumDate::getRegistrarUserId, feTempHumDate.getRegistrarUserId())); // 温湿度记录添加记录员 Integer userId = SecurityUtils.getUserId().intValue(); feTempHumRecordService.update(Wrappers.<FeTempHumRecord>lambdaUpdate() .isNotNull(FeTempHumRecord::getMorningTestTime) .eq(FeTempHumRecord::getDateId, feTempHumDate.getDateId()) .set(FeTempHumRecord::getMorningRecorderId, userId)); feTempHumRecordService.update(Wrappers.<FeTempHumRecord>lambdaUpdate() .isNotNull(FeTempHumRecord::getAfternoonTime) .eq(FeTempHumRecord::getDateId, feTempHumDate.getDateId()) .set(FeTempHumRecord::getAfternoonRecorderId, userId)); } } cnas-require/src/main/java/com/ruoyi/require/service/impl/FeTempHumRecordServiceImpl.java
@@ -1,6 +1,7 @@ package com.ruoyi.require.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.require.dto.FeTempHumRecordDto; @@ -22,6 +23,53 @@ @Override public IPage<FeTempHumRecordDto> getFeTempHumRecordPage(Page page, Integer dateId) { return baseMapper.getFeTempHumRecordPage(page, dateId); IPage<FeTempHumRecordDto> feTempHumRecordPage = baseMapper.getFeTempHumRecordPage(page, dateId); for (FeTempHumRecordDto record : feTempHumRecordPage.getRecords()) { // 判断是否是问题数据 // 判断温湿度是否超过区间 boolean flag = false; if (StringUtils.isNotBlank(record.getMorningTemp())) { Double value = Double.valueOf(record.getMorningTemp()); if (value > record.getTemperatureHighest() || value < record.getTemperatureLowest()) { flag = true; } } if (StringUtils.isNotBlank(record.getMorningHum())) { Double value = Double.valueOf(record.getMorningHum()); if (value > record.getHumidityHighest() || value < record.getHumidityLowest()) { flag = true; } } if (StringUtils.isNotBlank(record.getAfternoonTemp())) { Double value = Double.valueOf(record.getAfternoonTemp()); if (value > record.getTemperatureHighest() || value < record.getTemperatureLowest()) { flag = true; } } if (StringUtils.isNotBlank(record.getAfternoonHum())) { Double value = Double.valueOf(record.getAfternoonHum()); if (value > record.getHumidityHighest() || value < record.getHumidityLowest()) { flag = true; } } // 判断是否是恒温二, 是恒温二上下温度是否超过1摄氏度 if (StringUtils.isNotBlank(record.getTestAreaName()) && record.getTestAreaName().equals("恒温二")) { if (StringUtils.isNotBlank(record.getMorningTemp()) && StringUtils.isNotBlank(record.getAfternoonTemp())) { if (Double.valueOf(record.getAfternoonTemp()) - Double.valueOf(record.getMorningTemp()) > 1) { flag = true; } } } if (flag) { record.setIsIssue(1); } else { record.setIsIssue(0); } } return feTempHumRecordPage; } } cnas-require/src/main/java/com/ruoyi/require/task/FeTempHumDateSchedule.java
@@ -1,6 +1,11 @@ package com.ruoyi.require.task; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.core.domain.entity.User; import com.ruoyi.common.utils.WxCpUtils; import com.ruoyi.require.dto.FeTempHumRecordDto; import com.ruoyi.require.mapper.CollectLaboratoryMapper; import com.ruoyi.require.mapper.CollectTemperatureHumidityMapper; import com.ruoyi.require.mapper.FeTempHumDateMapper; @@ -9,10 +14,13 @@ import com.ruoyi.require.pojo.CollectTemperatureHumidity; import com.ruoyi.require.pojo.FeTempHumDate; import com.ruoyi.require.pojo.FeTempHumRecord; import com.ruoyi.system.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.lang.reflect.Field; import java.text.SimpleDateFormat; import java.time.LocalDate; @@ -20,6 +28,8 @@ import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * Author: yuan @@ -37,6 +47,10 @@ private CollectTemperatureHumidityMapper collectTemperatureHumidityMapper; @Autowired private FeTempHumRecordMapper feTempHumRecordMapper; @Autowired private ThreadPoolTaskExecutor threadPoolTaskExecutor; @Resource private UserMapper userMapper; // 获取当前年份和月份 如:2024-11 private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); @@ -59,6 +73,9 @@ FeTempHumDate feTempHumDate = new FeTempHumDate(); feTempHumDate.setMonthDate(formattedDate); feTempHumDate.setTestAreaName(collectLaboratory.getLaboratory()); if (collectLaboratory.getLaboratory().equals("恒温二")) { feTempHumDate.setSubjoin("注: 该实验室环境条件温度波动不大于±1℃要求"); } feTempHumDateMapper.insert(feTempHumDate); } } @@ -113,6 +130,30 @@ newFeTempHumRecord.setMorningHum(humidity.toString()); newFeTempHumRecord.setDateId(dateId); feTempHumRecordMapper.insert(newFeTempHumRecord); // 判断温湿度是否超过, 超过提醒 if (feTempHumDate.getRegistrarUserId() != null) { if (temperature < collectLaboratory.getTemperatureLowest() || temperature > collectLaboratory.getTemperatureHighest() || humidity< collectLaboratory.getHumidityLowest() || humidity > collectLaboratory.getHumidityHighest()) { // 发送企业微信通知 threadPoolTaskExecutor.execute(() -> { // 查询接收人 User personnel = userMapper.selectById(feTempHumDate.getRegistrarUserId()); String message = ""; message += "上午实验室温度或湿度超过指定区间, 请去查看"; message += "\n请去资源管理-设施和环境温度一温湿度记录"; message += StrUtil.format("\n实验室区域: {}", feTempHumDate.getTestAreaName()); //发送企业微信消息通知 try { WxCpUtils.inform(personnel.getAccount(), message, null); } catch (Exception e) { throw new RuntimeException(e); } }); } } } } @@ -202,6 +243,50 @@ } feTempHumRecordMapper.updateById(feTempHumRecord); // 判断温湿度是否超过, 超过提醒 if (feTempHumDate.getRegistrarUserId() != null) { if (temperature < collectLaboratory.getTemperatureLowest() || temperature > collectLaboratory.getTemperatureHighest() || humidity< collectLaboratory.getHumidityLowest() || humidity > collectLaboratory.getHumidityHighest()) { // 发送企业微信通知 threadPoolTaskExecutor.execute(() -> { // 查询接收人 User personnel = userMapper.selectById(feTempHumDate.getRegistrarUserId()); String message = ""; message += "下午实验室温度或湿度超过指定区间, 请去查看"; message += "\n请去资源管理-设施和环境温度一温湿度记录"; message += StrUtil.format("\n实验室区域: {}", feTempHumDate.getTestAreaName()); //发送企业微信消息通知 try { WxCpUtils.inform(personnel.getAccount(), message, null); } catch (Exception e) { throw new RuntimeException(e); } }); } if (feTempHumDate.getTestAreaName().equals("恒温二")) { // 判断上下午温差是否超过1 if (temperature - Double.valueOf(feTempHumRecord.getMorningTemp()) > 1) { // 发送企业微信通知 threadPoolTaskExecutor.execute(() -> { // 查询接收人 User personnel = userMapper.selectById(feTempHumDate.getRegistrarUserId()); String message = ""; message += "恒温二实验室上下温差超过 1℃, 请去查看"; message += "\n请去资源管理-设施和环境温度一温湿度记录"; message += StrUtil.format("\n实验室区域: {}", feTempHumDate.getTestAreaName()); //发送企业微信消息通知 try { WxCpUtils.inform(personnel.getAccount(), message, null); } catch (Exception e) { throw new RuntimeException(e); } }); } } } } } @@ -249,6 +334,40 @@ } /** * 扫描实验室温度记录判断是否有没有确认的温度信息 * */ // @Scheduled(cron = "0/5 * * * * *") @Scheduled(cron = "0 0 16 * * 1-6") // 每天15点执行一次 除了星期天 public void affirmTempHum() { // 查询有日期但是未填写名字的 List<FeTempHumRecordDto> feTempHumRecordList = feTempHumRecordMapper.selectNoaffirm(LocalDate.now()); for (FeTempHumRecordDto feTempHumRecord : feTempHumRecordList) { // 发送企业微信通知 threadPoolTaskExecutor.execute(() -> { // 查询接收人 User personnel = userMapper.selectById(feTempHumRecord.getRegistrarUserId()); String message = ""; message += "温湿度记录确认通知"; message += "\n请去资源管理-设施和环境温度一温湿度记录"; message += StrUtil.format("\n实验室区域: {}", feTempHumRecord.getTestAreaName()); //发送企业微信消息通知 try { WxCpUtils.inform(personnel.getAccount(), message, null); } catch (Exception e) { throw new RuntimeException(e); } }); } } /** * 根据实验室编号获取温度湿度 * * @param collectTemperatureHumidity 温度湿度数据 cnas-require/src/main/resources/mapper/FeTempHumDateMapper.xml
@@ -2,22 +2,15 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.require.mapper.FeTempHumDateMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.ruoyi.require.pojo.FeTempHumDate"> <id column="date_id" property="dateId" /> <result column="month_date" property="monthDate" /> <result column="test_area_name" property="testAreaName" /> <result column="create_time" property="createTime" /> <result column="update_time" property="updateTime" /> <result column="create_user" property="createUser" /> <result column="update_user" property="updateUser" /> </resultMap> <select id="getFeTempHumDate" resultType="com.ruoyi.require.dto.FeTempHumDateDto"> select * from ( select c.*, u.name create_name select c.*, u.name registrar_user_name, concat('≥', cl.temperature_lowest, '&', '≤', cl.temperature_highest) temperature_section, concat('≥', cl.humidity_lowest, '&', '≤', cl.humidity_highest) humidity_section from cnas_fe_temp_hum_date c left join user u on c.create_user = u.id) a left join user u on c.registrar_user_id = u.id left join collect_laboratory cl on cl.laboratory = c.test_area_name) a <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''"> ${ew.customSqlSegment} </if> cnas-require/src/main/resources/mapper/FeTempHumRecordMapper.xml
@@ -3,11 +3,34 @@ <mapper namespace="com.ruoyi.require.mapper.FeTempHumRecordMapper"> <select id="getFeTempHumRecordPage" resultType="com.ruoyi.require.dto.FeTempHumRecordDto"> select c.*, u1.name afternoon_recorder_user, u2.name morning_recorder_user select c.*, u1.name afternoon_recorder_user, u2.name morning_recorder_user, u1.signature_url afternoon_recorder_url, u2.signature_url morning_recorder_url, cl.temperature_lowest, cl.temperature_highest, cl.humidity_lowest, cl.humidity_highest, cd.test_area_name from cnas_fe_temp_hum_record c left join user u1 on u1.id = c.afternoon_recorder_id left join user u2 on u2.id = c.morning_recorder_id left join cnas_fe_temp_hum_date cd on cd.date_id = c.date_id left join collect_laboratory cl on cl.laboratory = cd.test_area_name where c.date_id = #{dateId} ORDER BY c.record_date desc </select> <!-- 查询有日期但是未填写名字的 --> <select id="selectNoaffirm" resultType="com.ruoyi.require.dto.FeTempHumRecordDto"> select cr.*, cd.registrar_user_id, cd.test_area_name from cnas_fe_temp_hum_record cr left join cnas_fe_temp_hum_date cd on cd.date_id = cr.date_id where cr.record_date = #{date} and (morning_test_time is not null and morning_recorder_id is null) and cd.registrar_user_id is not null </select> </mapper> cnas-require/src/main/resources/static/temp_hum_date.docxBinary files differ