1:资料类别BUG修改

2:大屏-预案
master
yangzhe123 2026-02-02 16:48:43 +08:00
parent 3a795a41e5
commit e55130b543
11 changed files with 316 additions and 48 deletions

View File

@ -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<List<DocCenter>> latestDocCenter(@PathVariable("docCategoryId") Long docCategoryId) {
return R.ok(docCenterService.latestDocCenter(docCategoryId));
}
@Operation(description = "分页查询")
@ -38,7 +44,7 @@ public class DocCenterController extends AbstractCommonFileController {
List<DocCenter> records = res.getRecords();
if(!records.isEmpty()){
for (DocCenter record : records) {
List<FileAssociations> files = fileService.getFiles(record.getBusinessName(), record.getId().toString());
List<FileAssociations> 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<DocCenter> 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<Boolean> 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<DocCenter> 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

View File

@ -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<Map<String,List<RotaB>>> query() {
Map<String,List<RotaB>> res = screenPlanService.query();
return R.ok(res);
}
@GetMapping("/doc")
public R<List<ResPlanB>> list(){
List<ResPlanB> 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";
}
}

View File

@ -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<StFlowRListVo>> list(){
List<StFlowRListVo> res = service.listLatestData();
public R<List<StFlowRLatestVo>> list(){
List<StFlowRLatestVo> res = service.listLatestData();
return R.ok(res);
}

View File

@ -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;
/**
* 24m³
*/
@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;
}

View File

@ -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<DocCenter> {
@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<DocCenter> latestDocCenter(@Param("docCategoryId") Long docCategoryId);
}

View File

@ -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<RotaB> {
</script>
""")
Long queryUser(@Param("value") String value);
}

View File

@ -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 = "归档人名称")

View File

@ -68,6 +68,17 @@ public class DocCenterService extends ServiceImpl<DocCenterMapper, DocCenter> {
}
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<DocCenterMapper, DocCenter> {
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<DocCenterMapper, DocCenter> {
return result;
}
public List<DocCenter> latestDocCenter(Long docCategoryId) {
List<DocCenter> 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<DocCategory> categoryPathRecursive = docCategoryService.findCategoryPathRecursive(record.getDocCategoryId());
List<String> 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;
}
}

View File

@ -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<RotaBMapper, RotaB> {
}
this.saveOrUpdateBatch(list);
}
public Map<String,List<RotaB>> queryByDateRange(LocalDate now, LocalDate nextDay) {
Map<String,List<RotaB>> res = new HashMap<>();
List<RotaB> today = this.baseMapper.dateList(now.toString());
res.put("today",today);
List<RotaB> next = this.baseMapper.dateList(nextDay.toString());
res.put("nextDay",next);
return res;
}
}

View File

@ -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<String,List<RotaB>> query() {
LocalDate now = LocalDate.now();
LocalDate nextDay = now.plusDays(1);
return rotaService.queryByDateRange(now,nextDay);
}
public List<ResPlanB> list() {
List<ResPlanB> list = resPlanBService.lambdaQuery().eq(ResPlanB::getIsAvailable, 1).list();
return list;
}
}

View File

@ -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<StFlowRMapper, StFlowR> {
return voMapper.getDataByStcdAndTm(stcd, tm);
}
public List<StFlowRListVo> listLatestData() {
List<StFlowRListVo> res = new ArrayList<>();
public List<StFlowRLatestVo> listLatestData() {
List<StFlowRLatestVo> res = new ArrayList<>();
List<StStbprpB> 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<StFlowR> 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);
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;
}
// 设置最新时间点的数据
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);
}
// 计算统计值
// 统计有效数据
validCount++;
sum24Q = sum24Q.add(currentQ);
res.add(stFlowR);
// 更新最小最大流量
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);
}
}
res.add(vo);
}
return res;
}