zxl
2025-04-21 8b3793ac8072918f52201f5d54f1cdf49ce02299
录像可用率自定义列修改与导出
11个文件已修改
3个文件已添加
436 ■■■■■ 已修改文件
ycl-common/src/main/java/constant/RecordingAvailability.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/DynamicColumnValue.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/excel/RecordingAvailabilityExport.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/form/UpdateDynamicValueForm.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/RecordMetaDSumResult.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/DynamicColumnVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/controller/DataCenterController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/controller/DynamicColumnController.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/DynamicColumnMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/DataCenterService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/DynamicColumnService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/DynamicColumnServiceImpl.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/DynamicColumnMapper.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/constant/RecordingAvailability.java
New file
@@ -0,0 +1,22 @@
package constant;
public class RecordingAvailability {
    public final static String arealayername = "行政区域";
    public final static String arealayerno = "行政区域ID";
    public final static String createTime = "创建时间";
    public final static String deviceId = "摄像机ID";
    public final static String missDuration = "缺失时长";
    public final static String platId = "国标平台ID";
    public final static String recordDuration = "录像时长";
    public final static String recordStatusText = "录像完整状态";
    public final static String statTime = "统计时间";
}
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/DynamicColumnValue.java
@@ -35,7 +35,8 @@
    /** 关联的数据id */
    private Integer refId;
    @TableField("ref_String_id")
    private String refStringId;
}
ycl-pojo/src/main/java/com/ycl/platform/domain/excel/RecordingAvailabilityExport.java
New file
@@ -0,0 +1,54 @@
package com.ycl.platform.domain.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ycl.platform.domain.vo.DynamicColumnVO;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class RecordingAvailabilityExport {
    /** 行政区域*/
    @ColumnWidth(100)
    @ExcelProperty("行政区域")
    private String arealayername;
    /** 行政区域id*/
    @ColumnWidth(100)
    @ExcelProperty("行政区域ID")
    private String arealayerno;
    @ColumnWidth(100)
    @DateTimeFormat("yyyy-MM-dd")
    @ExcelProperty("创建时间")
    private Date createTime;
    @ColumnWidth(100)
    @ExcelProperty("摄像机ID")
    private String deviceId;
    @ColumnWidth(100)
    @ExcelProperty("缺失时长")
    private Double missDuration;
    @ColumnWidth(100)
    @ExcelProperty("国标平台ID")
    private String platId;
    @ColumnWidth(100)
    @ExcelProperty("录像时长")
    private Double recordDuration;
    @ColumnWidth(100)
    @ExcelProperty("录像完整状态")
    private String recordStatusText;
    @ColumnWidth(100)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ExcelProperty("统计时间")
    private Date statTime;
}
ycl-pojo/src/main/java/com/ycl/platform/domain/form/UpdateDynamicValueForm.java
New file
@@ -0,0 +1,15 @@
package com.ycl.platform.domain.form;
import com.ycl.platform.domain.vo.DynamicColumnVO;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.util.List;
@Data
public class UpdateDynamicValueForm {
    @NotBlank(message = "id不能为空")
    private String id;
    List<DynamicColumnVO> dynamicColumnVOList;
}
ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/RecordMetaDSumResult.java
@@ -2,6 +2,7 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ycl.platform.domain.result.BaseResult;
import com.ycl.platform.domain.vo.DynamicColumnVO;
import lombok.Data;
import org.springframework.data.mongodb.core.index.CompoundIndex;
import org.springframework.data.mongodb.core.index.CompoundIndexes;
@@ -10,6 +11,7 @@
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
@@ -81,7 +83,6 @@
     * 录像完整状态,1:完整,0:间歇,-1:异常
     */
    private String recordStatusText;
    /**
     * 统计时间,格式为日期字符串
     */
@@ -90,6 +91,11 @@
    private Date statTime;
    /**
     * 动态列
     */
    private List<DynamicColumnVO> dynamicColumnList;
    /**
     * 租户ID
     */
    private String tenantId;
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/DynamicColumnVO.java
@@ -27,6 +27,10 @@
    private String columnValue;
    /** 关联数据的id */
    private Integer refId;
    /** 关联数据的id String类型*/
    private String refStringId;
    /** value表的id */
    private Integer valueId;
    public static DynamicColumnVO getVoByEntity(@NonNull DynamicColumn entity, DynamicColumnVO vo) {
ycl-server/src/main/java/com/ycl/platform/controller/DataCenterController.java
@@ -1,6 +1,7 @@
package com.ycl.platform.controller;
import annotation.Log;
import com.ycl.platform.domain.form.UpdateDynamicValueForm;
import com.ycl.platform.domain.query.DataCenterQuery;
import com.ycl.platform.service.DataCenterService;
import com.ycl.platform.service.ITMonitorService;
@@ -12,6 +13,8 @@
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
/**
 * 数据中心接口
@@ -147,6 +150,12 @@
        return dataCenterService.deptVideoAvailabilityRate(query);
    }
    @PutMapping("/videoMinistryVideoAvailable/updateDynamicValue")
    public Result updateDynamicValue(@RequestBody UpdateDynamicValueForm form){
        return dataCenterService.updateDynamicValue(form);
    }
    /**
     * 视频:录像可用率
     *
@@ -182,6 +191,21 @@
        query.setTime();
        return dataCenterService.videoImportantPointLabelingAccuracy(query);
    }
    @PostMapping("/recordingAvailability/export")
    public void recordingAvailabilityExport(HttpServletResponse response,DataCenterQuery query) throws IOException {
        query.setTime();
        dataCenterService.recordingAvailabilityExport(response, query);
    }
    @PostMapping("/pointOnline/export")
    public void pointOnlineExport(HttpServletResponse response,DataCenterQuery query) throws IOException {
        query.setTime();
         dataCenterService.pointOnlineExport(response,query);
    }
    /**
     * 视频:导出重点点位标注正确率
     *
ycl-server/src/main/java/com/ycl/platform/controller/DynamicColumnController.java
@@ -2,8 +2,8 @@
import com.ycl.system.Result;
import com.ycl.system.domain.group.Add;
import com.ycl.system.domain.group.Update;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import lombok.RequiredArgsConstructor;
@@ -12,7 +12,6 @@
import io.swagger.annotations.ApiOperation;
import com.ycl.platform.service.DynamicColumnService;
import com.ycl.platform.domain.form.DynamicColumnForm;
import com.ycl.platform.domain.query.DynamicColumnQuery;
import org.springframework.web.bind.annotation.*;
/**
@@ -54,4 +53,39 @@
    public Result list() {
        return dynamicColumnService.all();
    }
    @GetMapping("/listByTableName")
    @ApiOperation(value = "列表", notes = "列表")
    public Result listByTableName(@RequestParam @NotNull(message = "路径名不能为空")String pathName) {
        String tableName = getTableNameByPathNane(pathName);
        return dynamicColumnService.allByTableName(tableName);
    }
    @PostMapping("/addByTableName")
    @ApiOperation(value = "添加", notes = "添加")
    @PreAuthorize("@ss.hasPermi('dynamicColumn:add')")
    public Result addByTableName(@RequestParam @NotNull(message = "路径名不能为空")String pathName,@RequestBody @Validated(Add.class) DynamicColumnForm form){
        String tableName = getTableNameByPathNane(pathName);
        return dynamicColumnService.addByTableName(tableName,form);
    }
    private final static String COLUMN_NAME_VIDEO = "uy_record_meta_d_sum";
    private final static String COLUMN_NAME_POINT = "";
    @PutMapping("/updateByTableName")
    @ApiOperation(value = "修改", notes = "修改")
    public Result updateByTableName(@RequestParam @NotNull(message = "路径名不能为空")String pathName, @RequestBody @NotEmpty(message = "数据为空,无法保存") List<DynamicColumnForm> columnList){
        String tableName = getTableNameByPathNane(pathName);
        return dynamicColumnService.updateByTableName(tableName,columnList);
    }
    private String getTableNameByPathNane(String pathName) {
        String tableName = "";
        if ("录像可用率".equals(pathName)){
            tableName = COLUMN_NAME_VIDEO;
        }else if("点位在线率".equals(pathName)){
            tableName = COLUMN_NAME_POINT;
        }
        return tableName;
    }
}
ycl-server/src/main/java/com/ycl/platform/mapper/DynamicColumnMapper.java
@@ -47,5 +47,7 @@
    void deleteBatch(@Param("deleteList") List<Integer> deleteList);
    List<DynamicColumnVO> getDynamicColumnByTable(@Param("tableName")String tableName,@Param("id")String id);
    List<DynamicColumnVO> getDynamicColumnByTableName(@Param("tableName")String tableName);
}
ycl-server/src/main/java/com/ycl/platform/service/DataCenterService.java
@@ -1,13 +1,17 @@
package com.ycl.platform.service;
import com.ycl.platform.domain.entity.DynamicColumn;
import com.ycl.platform.domain.form.UpdateDynamicValueForm;
import com.ycl.platform.domain.query.DataCenterQuery;
import com.ycl.platform.domain.result.HK.*;
import com.ycl.platform.domain.result.UY.MonitorQualifyResult;
import com.ycl.platform.domain.result.UY.OneMachineFileResult;
import com.ycl.platform.domain.result.UY.RecordMetaDSumResult;
import com.ycl.platform.domain.vo.DynamicColumnVO;
import com.ycl.system.Result;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
@@ -18,6 +22,12 @@
 */
public interface DataCenterService {
    void recordingAvailabilityExport(HttpServletResponse response,DataCenterQuery query) throws IOException;
    void pointOnlineExport(HttpServletResponse response,DataCenterQuery query) throws IOException ;
    Result updateDynamicValue(UpdateDynamicValueForm form);
    /**
     * 视频:点位在线率
     *
ycl-server/src/main/java/com/ycl/platform/service/DynamicColumnService.java
@@ -23,11 +23,25 @@
    Result add(DynamicColumnForm form);
    /**
     * 添加
     * @param form
     * @return
     */
    Result addByTableName(String table,DynamicColumnForm form);
    /**
     * 修改
     *
     * @param columnList
     */
    Result update(List<DynamicColumnForm> columnList);
    /**
     * 修改
     *
     * @param columnList
     */
    Result updateByTableName(String tableName,List<DynamicColumnForm> columnList);
    /**
     * id删除
@@ -41,4 +55,6 @@
     * @return
     */
    Result all();
    Result allByTableName(String tableName);
}
ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java
@@ -1,5 +1,7 @@
package com.ycl.platform.service.impl;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
@@ -9,7 +11,9 @@
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.ycl.platform.domain.entity.*;
import com.ycl.platform.domain.excel.RecordingAvailabilityExport;
import com.ycl.platform.domain.excel.TMonitorExp;
import com.ycl.platform.domain.form.UpdateDynamicValueForm;
import com.ycl.platform.domain.query.DataCenterQuery;
import com.ycl.platform.domain.result.HK.*;
import com.ycl.platform.domain.result.SYS.TMonitorResult;
@@ -17,8 +21,10 @@
import com.ycl.platform.domain.vo.DataCenter.BigPicUsefulVO;
import com.ycl.platform.domain.vo.DataCenter.MonitorQualifyResultVO;
import com.ycl.platform.domain.vo.DataCenter.SnapClockVO;
import com.ycl.platform.domain.vo.DynamicColumnVO;
import com.ycl.platform.domain.vo.PointDetailVO;
import com.ycl.platform.domain.vo.home.HomeFaceVO;
import com.ycl.platform.mapper.DynamicColumnMapper;
import com.ycl.platform.mapper.ImageResourceSecurityDetailMapper;
import com.ycl.platform.mapper.YwPointMapper;
import com.ycl.platform.service.*;
@@ -31,9 +37,11 @@
import com.ycl.utils.poi.ExcelUtil;
import constant.ApiConstants;
import constant.CheckConstants;
import constant.RecordingAvailability;
import enumeration.general.AreaDeptEnum;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.bson.Document;
import org.springframework.data.domain.Sort;
@@ -44,6 +52,7 @@
import org.springframework.data.mongodb.core.query.TextCriteria;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
@@ -60,6 +69,7 @@
 */
@Service
@RequiredArgsConstructor
@Slf4j
public class DataCenterServiceImpl implements DataCenterService {
    private final MongoTemplate mongoTemplate;
@@ -68,11 +78,139 @@
    private final ICheckIndexVideoService checkIndexVideoService;
    private final ICheckIndexCarService checkIndexCarService;
    private final ICheckIndexFaceService checkIndexFaceService;
    private final DynamicColumnMapper dynamicColumnMapper;
    private final static String TIME_FIELD = "mongoCreateTime";
    private static DecimalFormat DF = new DecimalFormat("#.####");
    @Override
    public void recordingAvailabilityExport(HttpServletResponse response,DataCenterQuery params) throws IOException {
        List<String> likeFileds = Arrays.asList("deviceId", "deviceName");
        Query query = MongoUtil.getQuery(params, "createTime", likeFileds, null);
        //下拉框录像情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("recordStatus").is(params.getOption()));
        }
        List<RecordMetaDSumResult> resultList = mongoTemplate.find(query, RecordMetaDSumResult.class);
        List<DynamicColumnVO> dynamicColumnVOList = dynamicColumnMapper.getDynamicColumnByTableName("uy_record_meta_d_sum");
        //翻译行政区域
        resultList.forEach(item -> {
            String areaCode = item.getArealayername().substring(0, 6);
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromCode(areaCode);
            if (areaDeptEnum != null) item.setArealayername(areaDeptEnum.getName());
        });
        Map<String,List<DynamicColumnVO>> groupByRefStringIdMap = dynamicColumnVOList.stream().collect(Collectors.groupingBy(DynamicColumnVO::getRefStringId));
        //提那家固定表头
        LinkedHashSet<String> headers = new LinkedHashSet<>();
        headers.add(RecordingAvailability.arealayername);
        headers.add(RecordingAvailability.arealayerno);
        headers.add(RecordingAvailability.createTime);
        headers.add(RecordingAvailability.deviceId);
        headers.add(RecordingAvailability.missDuration);
        headers.add(RecordingAvailability.platId);
        headers.add(RecordingAvailability.recordDuration);
        headers.add(RecordingAvailability.recordStatusText);
        headers.add(RecordingAvailability.statTime);
        List<String> headersList = new LinkedList<>();
        List<String> dynamicsHeaders = dynamicColumnMapper.getHeader("uy_record_meta_d_sum");
        //添加动态表头
        if (!org.springframework.util.CollectionUtils.isEmpty(dynamicsHeaders)) {
            //使用链表保证后续补充数据时获取数据顺序一致
            headersList.addAll(dynamicsHeaders);
            headers.addAll(headersList);
        }
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        List<List<Object>> data = new ArrayList<>();
        for (RecordMetaDSumResult result : resultList){
            List<Object> row = new ArrayList<>();
            row.add(result.getArealayername());
            row.add(result.getArealayerno());
            row.add(dateFormat2.format(result.getCreateTime()));
            row.add(result.getDeviceId());
            row.add(result.getMissDuration());
            row.add(result.getPlatId());
            row.add(result.getRecordDuration());
            row.add(result.getRecordStatusText());
            row.add(dateFormat2.format(result.getCreateTime()));
            //添加动态列数据
            for (String header : headersList){
                boolean flag = false;
                List<DynamicColumnVO> columnVOS = groupByRefStringIdMap.get(result.getId());
                if (!CollectionUtils.isEmpty(columnVOS)) {
                    for (DynamicColumnVO columnVO : columnVOS) {
                        if (header.equals(columnVO.getLabelValue())) {
                            row.add(columnVO.getColumnValue());
                            flag = true;
                        }
                    }
                }
                //没找到用空串占位
                if (!flag) row.add("");
            }
            data.add(row);
        }
        List<List<String>> headList = new ArrayList<>();
        for (String header : headers) {
            headList.add(Collections.singletonList(header));
        }
        EasyExcel.write(response.getOutputStream())
                .head(headList) // 设置表头
                .sheet("录像可用率") // 设置sheet名称
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .doWrite(data); // 写入数据
    }
    @Override
    public void pointOnlineExport(HttpServletResponse response,DataCenterQuery query) throws IOException  {
    }
    @Override
    public Result updateDynamicValue(UpdateDynamicValueForm form) {
        List<DynamicColumnVO> list = form.getDynamicColumnVOList();
        if (CollectionUtils.isEmpty(list) || StringUtils.isEmpty(form.getId())) {
            throw new RuntimeException("修改自定义列的传入值为null或传入id为null");
        }
        List<DynamicColumnValue> updateList = new ArrayList<>();
        List<DynamicColumnValue> addList = new ArrayList<>();
        for (DynamicColumnVO dynamicColumnVO : list){
            if(dynamicColumnVO.getColumnValue() == null){
                continue;
            }
            DynamicColumnValue dynamicColumnValue = new DynamicColumnValue();
            dynamicColumnValue.setColumnValue(dynamicColumnVO.getColumnValue());
            dynamicColumnValue.setDynamicColumnId(dynamicColumnVO.getId());
            dynamicColumnValue.setRefStringId(form.getId());
            dynamicColumnValue.setRefId(0);
            if(dynamicColumnVO.getValueId() == null){
                addList.add(dynamicColumnValue);
            }else {
                dynamicColumnValue.setId(dynamicColumnVO.getValueId());
                updateList.add(dynamicColumnValue);
            }
        }
        log.error("addList:{}",addList);
        log.error("updateList:{}",updateList);
        if (CollectionUtils.isNotEmpty(addList)){
            dynamicColumnMapper.saveBatch(addList);
        }
        if (CollectionUtils.isNotEmpty(updateList)) {
            dynamicColumnMapper.updateBatch(updateList);
        }
        return Result.ok("修改成功");
    }
    /**
     * 视频:点位在线率
@@ -798,6 +936,7 @@
     * @return
     */
    @Override
    public Result videoAvailabilityRate(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("deviceId", "deviceName");
        Query query = MongoUtil.getQuery(params, "createTime", likeFileds, null);
@@ -808,11 +947,18 @@
        long total = mongoTemplate.count(query, RecordMetaDSumResult.class);
        MongoUtil.setPage(query, params, "createTime");
        List<RecordMetaDSumResult> resultList = mongoTemplate.find(query, RecordMetaDSumResult.class);
        //查询动态列数据
        //查询动态列数据更具id查询
//        List<DynamicColumnVO> dynamicColumnNames = dynamicColumnMapper.getDynamicColumnByTableName("uy_record_meta_d_sum");
        //翻译行政区域
        resultList.forEach(item -> {
            String areaCode = item.getArealayername().substring(0, 6);
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromCode(areaCode);
            if (areaDeptEnum != null) item.setArealayername(areaDeptEnum.getName());
            List<DynamicColumnVO> list = dynamicColumnMapper.getDynamicColumnByTable("uy_record_meta_d_sum",item.getId());
            item.setDynamicColumnList(list);
        });
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
@@ -859,12 +1005,15 @@
        resultCount.add(0, totalCount + "");
        BigDecimal onlineRate = BigDecimal.ZERO;
//        1:完整 0:间歇 -1:异常 |
        if (!StringUtils.isEmpty(resultCount.get(0)) && !"0".equals(resultCount.get(0))) {
            //resultCount.get(0)
            onlineRate = new BigDecimal(resultCount.get(1)).divide(new BigDecimal(resultCount.get(0)), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        resultCount.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        log.error("resultCount:{}",resultCount.get(3));
        map.put("count", resultCount);
        map.put("list", resultList);
        return Result.ok().data(map).total(total);
@@ -2973,6 +3122,10 @@
            sampleCount = doc.getInteger("sampleCount");
            expCount = doc.getInteger("expCount");
        }
        //新构建聚合查询离线时间
        List<String> countList = new ArrayList<>();
        // 统计数
@@ -2995,6 +3148,8 @@
            onlineRate = new BigDecimal(sampleCount-expCount).divide(new BigDecimal(sampleCount), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        countList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", countList);
        map.put("list", voList);
ycl-server/src/main/java/com/ycl/platform/service/impl/DynamicColumnServiceImpl.java
@@ -33,6 +33,8 @@
    private final static String TABLE_NAME = "t_yw_point";
    /**
     * 添加
     * @param form
@@ -55,6 +57,23 @@
        return Result.ok("添加成功");
    }
    @Override
    public Result addByTableName(String tableName,DynamicColumnForm form) {
        Long num = new LambdaQueryChainWrapper<>(baseMapper)
                .eq(DynamicColumn::getLabelValue, form.getLabelValue())
                .eq(DynamicColumn::getTableName, tableName)
                .count();
        if (num > 0) {
            throw new RuntimeException("列名称不能重复");
        }
        DynamicColumn entity = DynamicColumnForm.getEntityByForm(form, null);
        entity.setPropName(IdUtils.randomNO(new Date()));
        entity.setCreateTime(new Date());
        entity.setTableName(tableName);
        baseMapper.insert(entity);
        return Result.ok("添加成功");
    }
    /**
     * 修改
     *
@@ -68,6 +87,28 @@
            } else {
                Long num = new LambdaQueryChainWrapper<>(baseMapper)
                        .eq(DynamicColumn::getTableName, TABLE_NAME)
                        .eq(DynamicColumn::getLabelValue, column.getLabelValue())
                        .ne(DynamicColumn::getId, column.getId())
                        .count();
                if (num == 0) {
                    new LambdaUpdateChainWrapper<>(baseMapper)
                            .eq(DynamicColumn::getId, column.getId())
                            .set(DynamicColumn::getLabelValue, column.getLabelValue())
                            .update();
                }
            }
        });
        return Result.ok("保存成功");
    }
    @Override
    public Result updateByTableName(String tableName, List<DynamicColumnForm> columnList) {
        columnList.stream().filter(item -> StringUtils.hasText(item.getLabelValue())).forEach(column -> {
            if (Objects.isNull(column.getId())) {
                this.addByTableName(tableName,column);
            } else {
                Long num = new LambdaQueryChainWrapper<>(baseMapper)
                        .eq(DynamicColumn::getTableName, tableName)
                        .eq(DynamicColumn::getLabelValue, column.getLabelValue())
                        .ne(DynamicColumn::getId, column.getId())
                        .count();
@@ -102,6 +143,20 @@
    public Result all() {
        List<DynamicColumn> entities = new LambdaQueryChainWrapper<>(baseMapper)
                .orderByAsc(DynamicColumn::getCreateTime)
                .eq(DynamicColumn::getTableName,"t_yw_point")
                .list();
        List<DynamicColumnVO> vos = entities.stream()
                .map(entity -> DynamicColumnVO.getVoByEntity(entity, null))
                .collect(Collectors.toList());
        return Result.ok().data(vos);
    }
    @Override
    public Result allByTableName(String tableName) {
        List<DynamicColumn> entities = new LambdaQueryChainWrapper<>(baseMapper)
                .eq(DynamicColumn::getTableName,tableName)
                .orderByAsc(DynamicColumn::getCreateTime)
                .list();
        List<DynamicColumnVO> vos = entities.stream()
                .map(entity -> DynamicColumnVO.getVoByEntity(entity, null))
ycl-server/src/main/resources/mapper/zgyw/DynamicColumnMapper.xml
@@ -60,9 +60,9 @@
    </select>
    <insert id="saveBatch">
        insert into t_dynamic_column_value (dynamic_column_id,column_value,ref_id) values
        insert into t_dynamic_column_value (dynamic_column_id,column_value,ref_id,ref_string_id) values
        <foreach collection="insertList" item="item" separator=",">
            (#{item.dynamicColumnId},#{item.columnValue},#{item.refId})
            (#{item.dynamicColumnId},#{item.columnValue},#{item.refId},#{item.refStringId})
        </foreach>
    </insert>
    <update id="updateBatch">
@@ -91,4 +91,30 @@
            #{id}
        </foreach>
    </select>
    <resultMap id="dynamicColumnMap" type="com.ycl.platform.domain.vo.DynamicColumnVO">
        <result column="prop_name" property="propName"/>
        <result column="label_value" property="labelValue"/>
        <result column="column_value" property="columnValue"/>
        <result column="ref_string_id" property="refStringId"/>
        <result column="value_id" property="valueId"/>
    </resultMap>
    <select id="getDynamicColumnByTable" resultMap="dynamicColumnMap">
        SELECT
        *,
        dcv.id as value_id
        FROM
        t_dynamic_column dc
        LEFT JOIN t_dynamic_column_value dcv ON dc.id = dcv.dynamic_column_id and dcv.ref_String_id = #{id} WHERE dc.table_name = #{tableName}
    </select>
    <select id="getDynamicColumnByTableName" resultMap="dynamicColumnMap">
        select *,dcv.id as value_id
        from  t_dynamic_column_value dcv
        left join t_dynamic_column dc
        on dc.id = dcv.dynamic_column_id
        where dc.table_name =#{tableName}
    </select>
</mapper>