diff --git a/src/main/java/com/gunshi/project/ss/controller/DocCenterController.java b/src/main/java/com/gunshi/project/ss/controller/DocCenterController.java index d370ef0..9680ac9 100644 --- a/src/main/java/com/gunshi/project/ss/controller/DocCenterController.java +++ b/src/main/java/com/gunshi/project/ss/controller/DocCenterController.java @@ -1,6 +1,7 @@ package com.gunshi.project.ss.controller; +import com.gunshi.core.annotation.Get; import com.gunshi.core.result.R; import com.gunshi.project.ss.entity.so.DocCenterPageSo; import com.gunshi.project.ss.model.DocCenter; @@ -29,6 +30,11 @@ public class DocCenterController extends AbstractCommonFileController { @Autowired private FileAssociationsService fileService; + @Operation(description = "获取最新的档案") + @GetMapping("/latestDoc/{docCategoryId}") + public R> latestDocCenter(@PathVariable("docCategoryId") Long docCategoryId) { + return R.ok(docCenterService.latestDocCenter(docCategoryId)); + } @Operation(description = "分页查询") @@ -38,7 +44,7 @@ public class DocCenterController extends AbstractCommonFileController { List records = res.getRecords(); if(!records.isEmpty()){ for (DocCenter record : records) { - List files = fileService.getFiles(record.getBusinessName(), record.getId().toString()); + List files = fileService.getFiles2(record.getBusinessName(), record.getId().toString()); record.setFiles(files); } } @@ -47,16 +53,16 @@ public class DocCenterController extends AbstractCommonFileController { @Operation(description = "新增") @PostMapping("/insert") - public DocCenter insert(@RequestBody DocCenter docCenter){ + public R insert(@RequestBody DocCenter docCenter){ boolean flag = docCenterService.saveData(docCenter); if(flag){ fileService.saveFile(docCenter.getFiles(), docCenter.getBusinessName(), docCenter.getId().toString()); } - return docCenter; + return R.ok(docCenter); } @Operation(description = "删除") - @GetMapping("/delete/{id}") + @GetMapping("/del/{id}") public R delete(@PathVariable("id") Integer id){ DocCenter center = docCenterService.deleteById(id); if(center != null){ @@ -68,12 +74,12 @@ public class DocCenterController extends AbstractCommonFileController { @Operation(description = "修改") @PostMapping("/edit") - public DocCenter edit(@RequestBody DocCenter docCenter){ + public R edit(@RequestBody DocCenter docCenter){ boolean flag = docCenterService.updateData(docCenter); if(flag){ fileService.saveFile(docCenter.getFiles(), docCenter.getBusinessName(), docCenter.getId().toString()); } - return docCenter; + return R.ok(docCenter); } @Override diff --git a/src/main/java/com/gunshi/project/ss/controller/ScreenPlanController.java b/src/main/java/com/gunshi/project/ss/controller/ScreenPlanController.java new file mode 100644 index 0000000..ce8a020 --- /dev/null +++ b/src/main/java/com/gunshi/project/ss/controller/ScreenPlanController.java @@ -0,0 +1,49 @@ +package com.gunshi.project.ss.controller; + + +import com.gunshi.core.result.R; +import com.gunshi.project.ss.model.ResPlanB; +import com.gunshi.project.ss.model.RotaB; +import com.gunshi.project.ss.service.FileAssociationsService; +import com.gunshi.project.ss.service.ResPlanBService; +import com.gunshi.project.ss.service.ScreenPlanService; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; + +@Tag(name = "大屏-预案") +@RestController +@RequestMapping(value="/screen/plan") +public class ScreenPlanController { + + @Autowired + private ScreenPlanService screenPlanService; + + @Autowired + private FileAssociationsService fileService; + + @GetMapping("/rota") + public R>> query() { + Map> res = screenPlanService.query(); + return R.ok(res); + } + + @GetMapping("/doc") + public R> list(){ + List list = screenPlanService.list(); + if(!list.isEmpty()){ + list.forEach(o -> o.setFiles(fileService.getFiles(getGroupId(),String.valueOf( o.getId())))); + } + return R.ok(list); + } + + public String getGroupId() { + return "ResPlanB"; + } + +} diff --git a/src/main/java/com/gunshi/project/ss/controller/StFlowRController.java b/src/main/java/com/gunshi/project/ss/controller/StFlowRController.java index 960903f..adef2b8 100644 --- a/src/main/java/com/gunshi/project/ss/controller/StFlowRController.java +++ b/src/main/java/com/gunshi/project/ss/controller/StFlowRController.java @@ -4,6 +4,7 @@ import com.gunshi.core.result.R; import com.gunshi.project.ss.common.model.StFlowR; import com.gunshi.project.ss.entity.dto.StFlowDataCheckDto; import com.gunshi.project.ss.entity.vo.StFlowLowerDataCheckVo; +import com.gunshi.project.ss.entity.vo.StFlowRLatestVo; import com.gunshi.project.ss.entity.vo.StFlowRListVo; import com.gunshi.project.ss.service.StFlowRService; import io.swagger.v3.oas.annotations.Operation; @@ -35,8 +36,8 @@ public class StFlowRController { @Operation(description = "查询最新数据") @GetMapping("/list") - public R> list(){ - List res = service.listLatestData(); + public R> list(){ + List res = service.listLatestData(); return R.ok(res); } diff --git a/src/main/java/com/gunshi/project/ss/entity/vo/StFlowRLatestVo.java b/src/main/java/com/gunshi/project/ss/entity/vo/StFlowRLatestVo.java new file mode 100644 index 0000000..204463d --- /dev/null +++ b/src/main/java/com/gunshi/project/ss/entity/vo/StFlowRLatestVo.java @@ -0,0 +1,43 @@ +package com.gunshi.project.ss.entity.vo; + + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +public class StFlowRLatestVo { + /** + * 近24h平均流量 + */ + @TableField(exist = false) + private BigDecimal avg24Q; + + /** + * 近24h变幅 + */ + @TableField(exist = false) + private BigDecimal change24Q; + + /** + * 近24小时累计水量单位万m³ + */ + @TableField(exist = false) + private BigDecimal total24V; + + + private String stnm; + + private String stcd; + + /** + * 瞬时流量,单位m³/s + */ + private BigDecimal q; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime tm; +} diff --git a/src/main/java/com/gunshi/project/ss/mapper/DocCenterMapper.java b/src/main/java/com/gunshi/project/ss/mapper/DocCenterMapper.java index b7e4030..c55bac2 100644 --- a/src/main/java/com/gunshi/project/ss/mapper/DocCenterMapper.java +++ b/src/main/java/com/gunshi/project/ss/mapper/DocCenterMapper.java @@ -4,7 +4,28 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.gunshi.project.ss.model.DocCategory; import com.gunshi.project.ss.model.DocCenter; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; @Mapper public interface DocCenterMapper extends BaseMapper { + + + @Select(""" + SELECT * + FROM ( + SELECT *, + ROW_NUMBER() OVER ( + PARTITION BY group_id + ORDER BY doc_number DESC + ) AS rn + FROM doc_center + WHERE doc_category_id = #{docCategoryId} + ) AS ranked + WHERE rn = 1; +""") + List latestDocCenter(@Param("docCategoryId") Long docCategoryId); + } diff --git a/src/main/java/com/gunshi/project/ss/mapper/RotaBMapper.java b/src/main/java/com/gunshi/project/ss/mapper/RotaBMapper.java index 4199773..32eb936 100644 --- a/src/main/java/com/gunshi/project/ss/mapper/RotaBMapper.java +++ b/src/main/java/com/gunshi/project/ss/mapper/RotaBMapper.java @@ -6,6 +6,7 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; +import java.time.LocalDate; import java.util.List; @Mapper @@ -34,4 +35,5 @@ public interface RotaBMapper extends BaseMapper { """) Long queryUser(@Param("value") String value); + } \ No newline at end of file diff --git a/src/main/java/com/gunshi/project/ss/model/DocCenter.java b/src/main/java/com/gunshi/project/ss/model/DocCenter.java index aa25f09..19ae53d 100644 --- a/src/main/java/com/gunshi/project/ss/model/DocCenter.java +++ b/src/main/java/com/gunshi/project/ss/model/DocCenter.java @@ -29,19 +29,23 @@ public class DocCenter { private Long id; @TableField("doc_name") - @NotNull(message = "档案名称不能为空", groups = {Insert.class, Update.class}) @Schema(description = "档案名称") private String docName; @TableField("replace_id") - @NotNull(message = "替换档案id不能为空", groups = {Insert.class, Update.class}) @Schema(description = "替换档案id") private Long replaceId; + @TableField(exist = false) + @Schema(description = "替换档案名称") + private String replaceName; + @TableField("doc_category_id") @Schema(description = "资料类别id") private Long docCategoryId; + + @TableField("group_id") @Schema(description = "组id - 用于替换档案时") @JsonSerialize(using = ToStringSerializer.class) @@ -89,7 +93,7 @@ public class DocCenter { @TableField("make_time") @Schema(description = "编制时间") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - private LocalDateTime makeTime; + private LocalDate makeTime; @TableField(exist = false) @Schema(description = "归档人名称") diff --git a/src/main/java/com/gunshi/project/ss/service/DocCenterService.java b/src/main/java/com/gunshi/project/ss/service/DocCenterService.java index d1c7bf0..386e8e1 100644 --- a/src/main/java/com/gunshi/project/ss/service/DocCenterService.java +++ b/src/main/java/com/gunshi/project/ss/service/DocCenterService.java @@ -68,6 +68,17 @@ public class DocCenterService extends ServiceImpl { } categoryCodes.add(record.getDocNumber()); record.setCategoryCodes(categoryCodes); + //根据资料中心id查询数据 + DocCategory docCategory = docCategoryService.getBaseMapper().selectById(record.getDocCategoryId()); + if(docCategory != null){ + record.setCategoryName(docCategory.getCategoryName()); + } + if(record.getReplaceId() != null){ + DocCenter replaceDocCenter = lambdaQuery().eq(DocCenter::getId, record.getReplaceId()).last("limit 1").one(); + if(replaceDocCenter != null){ + record.setReplaceName(replaceDocCenter.getDocName()); + } + } } return docCenterPage; } @@ -76,10 +87,18 @@ public class DocCenterService extends ServiceImpl { if(StringUtils.isBlank(docCenter.getBusinessName())){ throw new IllegalArgumentException("请传业务名称"); } - Long count = lambdaQuery().eq(DocCenter::getDocCategoryId, docCenter.getDocCategoryId()).count(); - count++; + Long latestDocNumberLong; + DocCenter theLastDocNumber = lambdaQuery().eq(DocCenter::getDocCategoryId, docCenter.getDocCategoryId()).orderByDesc(DocCenter::getDocNumber).last("limit 1").one(); + if(theLastDocNumber != null){ + String docNumber = theLastDocNumber.getDocNumber(); + latestDocNumberLong = Long.valueOf(docNumber); + latestDocNumberLong++; + }else{ + latestDocNumberLong = 1l; + } + // 将 count 转换为字符串,前面补0,保持至少4位数字 - String countStr = String.format("%04d", count); + String countStr = String.format("%04d", latestDocNumberLong); docCenter.setDocNumber(countStr); LocalDateTime now = LocalDateTime.now(); docCenter.setCreateTime(now); @@ -331,4 +350,29 @@ public class DocCenterService extends ServiceImpl { return result; } + + public List latestDocCenter(Long docCategoryId) { + List docCenters = this.baseMapper.latestDocCenter(docCategoryId); + for (DocCenter record : docCenters) { + if(record.getUserId() != null){ + SysUser sysUser = sysUserMapper.selectUserById(record.getUserId()); + if(sysUser != null){ + record.setUserName(sysUser.getNickName()); + } + } + List categoryPathRecursive = docCategoryService.findCategoryPathRecursive(record.getDocCategoryId()); + List categoryCodes = new ArrayList<>(); + for (DocCategory docCategory : categoryPathRecursive) { + categoryCodes.add(docCategory.getCategoryCode()); + } + categoryCodes.add(record.getDocNumber()); + record.setCategoryCodes(categoryCodes); + //根据资料中心id查询数据 + DocCategory docCategory = docCategoryService.getBaseMapper().selectById(record.getDocCategoryId()); + if(docCategory != null){ + record.setCategoryName(docCategory.getCategoryName()); + } + } + return docCenters; + } } diff --git a/src/main/java/com/gunshi/project/ss/service/RotaService.java b/src/main/java/com/gunshi/project/ss/service/RotaService.java index 58a331b..ad90384 100644 --- a/src/main/java/com/gunshi/project/ss/service/RotaService.java +++ b/src/main/java/com/gunshi/project/ss/service/RotaService.java @@ -16,10 +16,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.time.LocalDate; +import java.util.*; import java.util.stream.Collectors; /** @@ -100,4 +98,13 @@ public class RotaService extends ServiceImpl { } this.saveOrUpdateBatch(list); } + + public Map> queryByDateRange(LocalDate now, LocalDate nextDay) { + Map> res = new HashMap<>(); + List today = this.baseMapper.dateList(now.toString()); + res.put("today",today); + List next = this.baseMapper.dateList(nextDay.toString()); + res.put("nextDay",next); + return res; + } } diff --git a/src/main/java/com/gunshi/project/ss/service/ScreenPlanService.java b/src/main/java/com/gunshi/project/ss/service/ScreenPlanService.java new file mode 100644 index 0000000..de2788d --- /dev/null +++ b/src/main/java/com/gunshi/project/ss/service/ScreenPlanService.java @@ -0,0 +1,37 @@ +package com.gunshi.project.ss.service; + + +import com.gunshi.core.result.R; +import com.gunshi.project.ss.model.ResPlanB; +import com.gunshi.project.ss.model.RotaB; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.List; +import java.util.Map; + +@Slf4j +@Service +public class ScreenPlanService { + + + @Autowired + private RotaService rotaService; + + + @Autowired + private ResPlanBService resPlanBService; + + public Map> query() { + LocalDate now = LocalDate.now(); + LocalDate nextDay = now.plusDays(1); + return rotaService.queryByDateRange(now,nextDay); + } + + public List list() { + List list = resPlanBService.lambdaQuery().eq(ResPlanB::getIsAvailable, 1).list(); + return list; + } +} diff --git a/src/main/java/com/gunshi/project/ss/service/StFlowRService.java b/src/main/java/com/gunshi/project/ss/service/StFlowRService.java index b8257d6..7a6f8b6 100644 --- a/src/main/java/com/gunshi/project/ss/service/StFlowRService.java +++ b/src/main/java/com/gunshi/project/ss/service/StFlowRService.java @@ -8,6 +8,7 @@ import com.gunshi.project.ss.common.model.StFlowR; import com.gunshi.project.ss.common.model.StStbprpB; import com.gunshi.project.ss.entity.dto.StFlowDataCheckDto; import com.gunshi.project.ss.entity.vo.StFlowLowerDataCheckVo; +import com.gunshi.project.ss.entity.vo.StFlowRLatestVo; import com.gunshi.project.ss.entity.vo.StFlowRListVo; import com.gunshi.project.ss.entity.vo.StFlowRVo; import com.gunshi.project.ss.mapper.StFlowRVoMapper; @@ -63,47 +64,100 @@ public class StFlowRService extends ServiceImpl { return voMapper.getDataByStcdAndTm(stcd, tm); } - public List listLatestData() { - List res = new ArrayList<>(); + public List listLatestData() { + List res = new ArrayList<>(); List flowStations = stStbprpBService.getFlowStations(); LocalDateTime now = LocalDateTime.now(); - LocalDateTime lastDay = now.minusDays(1); + LocalDateTime yesterday = now.minusDays(1); for (StStbprpB flowStation : flowStations) { - StFlowRListVo stFlowR = new StFlowRListVo(); - stFlowR.setStcd(flowStation.getStcd()); - stFlowR.setStnm(flowStation.getStnm()); - stFlowR.setLgtd(flowStation.getLgtd()); - stFlowR.setLttd(flowStation.getLttd()); - // 获取24小时内的所有流量数据 + StFlowRLatestVo vo = new StFlowRLatestVo(); + vo.setStcd(flowStation.getStcd()); + vo.setStnm(flowStation.getStnm()); + List list = lambdaQuery() - .eq(StFlowR::getStcd, flowStation.getStcd()) - .ge(StFlowR::getTm, lastDay) + .eq(StFlowR::getStcd, vo.getStcd()) + .ge(StFlowR::getTm, yesterday) .le(StFlowR::getTm, now) - .orderByAsc(StFlowR::getTm) // 按时间升序排列,方便计算 + .orderByAsc(StFlowR::getTm) .list(); - if(list.isEmpty()){ - res.add(stFlowR); - continue; + if (!list.isEmpty()) { + // 初始化统计变量(每个站点独立) + BigDecimal total24V = BigDecimal.ZERO; + BigDecimal sum24Q = BigDecimal.ZERO; + BigDecimal min24Q = null; + BigDecimal max24Q = null; + int validCount = 0; // 有效数据点数 + + // 用于记录上一个有效数据点 + StFlowR previousValid = null; + vo.setQ(list.getLast().getQ()); + vo.setTm(list.getLast().getTm()); + + for (int i = 0; i < list.size(); i++) { + StFlowR current = list.get(i); + BigDecimal currentQ = current.getQ(); + + // 跳过流量为null的数据点 + if (currentQ == null) { + continue; + } + + // 统计有效数据 + validCount++; + sum24Q = sum24Q.add(currentQ); + + // 更新最小最大流量 + if (min24Q == null || currentQ.compareTo(min24Q) < 0) { + min24Q = currentQ; + } + if (max24Q == null || currentQ.compareTo(max24Q) > 0) { + max24Q = currentQ; + } + + // 计算水量(需要与前一个有效数据点计算) + if (previousValid != null && previousValid.getQ() != null) { + // 计算时间间隔(秒) + long seconds = ChronoUnit.SECONDS.between(previousValid.getTm(), current.getTm()); + if (seconds > 0) { // 确保时间间隔为正 + // 使用前一个时间的流量计算水量 + BigDecimal previousFlow = previousValid.getQ(); + // 水量 = 流量 × 时间间隔(m³/s × s = m³,再除以10000转换为万m³) + BigDecimal waterVolume = previousFlow + .multiply(BigDecimal.valueOf(seconds)) // m³ + .divide(BigDecimal.valueOf(10000), 10, RoundingMode.HALF_UP); // 万m³ + total24V = total24V.add(waterVolume); + } + } + // 更新上一个有效数据点 + previousValid = current; + } + + // 设置统计结果 + vo.setTotal24V(total24V.setScale(4, RoundingMode.HALF_UP)); + + // 计算24h平均流量 + if (validCount > 0) { + BigDecimal avg24Q = sum24Q.divide(BigDecimal.valueOf(validCount), 4, RoundingMode.HALF_UP); + vo.setAvg24Q(avg24Q); + } else { + vo.setAvg24Q(BigDecimal.ZERO); + } + + // 计算24h变幅流量(最大流量 - 最小流量) + if (min24Q != null && max24Q != null) { + BigDecimal change24Q = max24Q.subtract(min24Q); + vo.setChange24Q(change24Q.setScale(4, RoundingMode.HALF_UP)); + } else { + vo.setChange24Q(BigDecimal.ZERO); + } + } - // 设置最新时间点的数据 - StFlowR latestData = list.get(list.size() - 1); - stFlowR.setTm(latestData.getTm()); - stFlowR.setQ(latestData.getQ()); - //判断状态 - LocalDateTime tm = latestData.getTm(); - Duration between = Duration.between(tm, now); - if(between.toHours() > 24){ - stFlowR.setStatus(0); - }else{ - stFlowR.setStatus(1); - } - // 计算统计值 - - res.add(stFlowR); + res.add(vo); } + return res; }