This commit is contained in:
2023-08-01 21:41:15 +08:00
parent 47d7674d74
commit 2d952d10c6
5 changed files with 571 additions and 173 deletions

View File

@@ -32,6 +32,13 @@ public class HibernateConfig {
return new CamelCaseToUnderscoresNamingStrategy() {
@Override
public Identifier toPhysicalColumnName(Identifier logicalName, JdbcEnvironment jdbcEnvironment) {
return super.toPhysicalColumnName(new Identifier(logicalName.getText().replace("Entity", ""),
logicalName.isQuoted()),
jdbcEnvironment);
}
@Override
public Identifier toPhysicalTableName(Identifier logicalName, JdbcEnvironment jdbcEnvironment) {

View File

@@ -1,212 +1,279 @@
package cn.lihongjie.coal.entity;
import cn.lihongjie.coal.entity.base.OrgCommonEntity;
import jakarta.persistence.Entity;
import jakarta.persistence.*;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.hibernate.annotations.Comment;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
/**
*
*/
@Entity
@Data
@Comment("洗煤报告表")
public class CoalWashingDailyAnalysisEntity extends OrgCommonEntity {
@Comment("日期")
private LocalDate date;
@ElementCollection
@Comment("用户手动录入的记录")
@CollectionTable(name = "CoalWashingDailyAnalysisItem", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
private List<CoalWashingDailyAnalysisItemVo> inputItems;
@Comment("成分0 比例")
private Double c0p0;
@ElementCollection
@Comment("连续平均值")
@CollectionTable(name = "CoalWashingDailyAnalysisItem", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
private List<CoalWashingDailyAnalysisItemVo> rollingAvgItems;
@Comment("成分0")
private Double c0p1;
@Comment("成分0 硫")
private Double c0p2;
@Comment("成分1 比例")
private Double c1p0;
@Comment("成分1 灰")
private Double c1p1;
@Comment("成分1 硫")
private Double c1p2;
@Comment("成分2 比例")
private Double c2p0;
@Comment("成分2 灰")
private Double c2p1;
@Comment("成分2 硫")
private Double c2p2;
@Comment("成分3 比例")
private Double c3p0;
@Comment("成分3 灰")
private Double c3p1;
@Comment("成分3 硫")
private Double c3p2;
@Comment("成分4 比例")
private Double c4p0;
@Comment("成分4 灰")
private Double c4p1;
@Comment("成分4 硫")
private Double c4p2;
@Comment("成分5 比例")
private Double c5p0;
@Comment("成分5 灰")
private Double c5p1;
@Comment("成分5 硫")
private Double c5p2;
@Comment("成分6 比例")
private Double c6p0;
@Comment("成分6 灰")
private Double c6p1;
@Comment("成分6 硫")
private Double c6p2;
@Comment("成分7 比例")
private Double c7p0;
@Comment("成分7 灰")
private Double c7p1;
@Comment("成分7 硫")
private Double c7p2;
@Comment("成分8 比例")
private Double c8p0;
@Comment("成分8 灰")
private Double c8p1;
@Comment("成分8 硫")
private Double c8p2;
@Comment("成分9 比例")
private Double c9p0;
@Comment("成分9 灰")
private Double c9p1;
@Comment("成分9 硫")
private Double c9p2;
@Comment("大堆 灰")
@Comment("目标大堆")
private Double ddp1;
@Comment("大堆 硫")
@Comment("目标大堆 硫")
private Double ddp2;
@Comment("大堆 挥发")
@Comment("目标大堆 挥发")
private Double ddp3;
@Comment("大堆 粘结")
@Comment("目标大堆 粘结")
private Double ddp4;
@Comment("大堆 备用")
@Comment("目标大堆 备用")
private Double ddp5;
@Comment("产量初始值")
private Double initTotalNumber = 0.0;
public void rollingAvg() {
rollingAvgItems = new ArrayList<>();
if (CollectionUtils.isEmpty(inputItems)) {
return;
}
inputItems.sort(Comparator.comparing(x -> x.getTime()));
inputItems.forEach(x -> x.calculate());
for (int i = 0; i < inputItems.size(); i++) {
List<CoalWashingDailyAnalysisItemVo> current = inputItems.subList(0, i + 1);
rollingAvgItems.add(rollingAvg(current));
}
}
private CoalWashingDailyAnalysisItemVo rollingAvg(List<CoalWashingDailyAnalysisItemVo> current) {
CoalWashingDailyAnalysisItemVo vo = new CoalWashingDailyAnalysisItemVo();
int size = current.size();
vo.setTime(current.get(size - 1).getTime());
vo.setTotalNumber(current.get(size - 1).getTotalNumber());
vo.setC0p0(current.get(size - 1).getC0p0());
vo.setC1p0(current.get(size - 1).getC1p0());
vo.setC2p0(current.get(size - 1).getC2p0());
vo.setC3p0(current.get(size - 1).getC3p0());
vo.setC4p0(current.get(size - 1).getC4p0());
vo.setC5p0(current.get(size - 1).getC5p0());
vo.setC6p0(current.get(size - 1).getC6p0());
vo.setC7p0(current.get(size - 1).getC7p0());
vo.setC8p0(current.get(size - 1).getC8p0());
vo.setC9p0(current.get(size - 1).getC9p0());
for (int i = 0; i < size; i++) {
var c = current.get(i);
var p = i == 0 ? c.withTotalNumber(initTotalNumber) : current.get(i - 1);
double diff = c.getTotalNumber() - p.getTotalNumber();
if (vo.getC0p0() != null && vo.getC0p0() > 0) {
vo.setC0p1(ObjectUtils.defaultIfNull(vo.getC0p1(), 0.0) + diff * c.getC0p1());
vo.setC0p2(ObjectUtils.defaultIfNull(vo.getC0p2(), 0.0) + diff * c.getC0p1());
if (i == size - 1) {
vo.setC0p1(vo.getC0p1() / c.getTotalNumber());
vo.setC0p2(vo.getC0p2() / c.getTotalNumber());
}
}
if (vo.getC1p0() != null && vo.getC1p0() > 0) {
vo.setC1p1(ObjectUtils.defaultIfNull(vo.getC1p1(), 0.0) + diff * c.getC1p1());
vo.setC1p2(ObjectUtils.defaultIfNull(vo.getC1p2(), 0.0) + diff * c.getC1p1());
if (i == size - 1) {
vo.setC1p1(vo.getC1p1() / c.getTotalNumber());
vo.setC1p2(vo.getC1p2() / c.getTotalNumber());
}
}
if (vo.getC2p0() != null && vo.getC2p0() > 0) {
vo.setC2p1(ObjectUtils.defaultIfNull(vo.getC2p1(), 0.0) + diff * c.getC2p1());
vo.setC2p2(ObjectUtils.defaultIfNull(vo.getC2p2(), 0.0) + diff * c.getC2p1());
if (i == size - 1) {
vo.setC2p1(vo.getC2p1() / c.getTotalNumber());
vo.setC2p2(vo.getC2p2() / c.getTotalNumber());
}
}
if (vo.getC3p0() != null && vo.getC3p0() > 0) {
vo.setC3p1(ObjectUtils.defaultIfNull(vo.getC3p1(), 0.0) + diff * c.getC3p1());
vo.setC3p2(ObjectUtils.defaultIfNull(vo.getC3p2(), 0.0) + diff * c.getC3p1());
if (i == size - 1) {
vo.setC3p1(vo.getC3p1() / c.getTotalNumber());
vo.setC3p2(vo.getC3p2() / c.getTotalNumber());
}
}
if (vo.getC4p0() != null && vo.getC4p0() > 0) {
vo.setC4p1(ObjectUtils.defaultIfNull(vo.getC4p1(), 0.0) + diff * c.getC4p1());
vo.setC4p2(ObjectUtils.defaultIfNull(vo.getC4p2(), 0.0) + diff * c.getC4p1());
if (i == size - 1) {
vo.setC4p1(vo.getC4p1() / c.getTotalNumber());
vo.setC4p2(vo.getC4p2() / c.getTotalNumber());
}
}
if (vo.getC5p0() != null && vo.getC5p0() > 0) {
vo.setC5p1(ObjectUtils.defaultIfNull(vo.getC5p1(), 0.0) + diff * c.getC5p1());
vo.setC5p2(ObjectUtils.defaultIfNull(vo.getC5p2(), 0.0) + diff * c.getC5p1());
if (i == size - 1) {
vo.setC5p1(vo.getC5p1() / c.getTotalNumber());
vo.setC5p2(vo.getC5p2() / c.getTotalNumber());
}
}
if (vo.getC6p0() != null && vo.getC6p0() > 0) {
vo.setC6p1(ObjectUtils.defaultIfNull(vo.getC6p1(), 0.0) + diff * c.getC6p1());
vo.setC6p2(ObjectUtils.defaultIfNull(vo.getC6p2(), 0.0) + diff * c.getC6p1());
if (i == size - 1) {
vo.setC6p1(vo.getC6p1() / c.getTotalNumber());
vo.setC6p2(vo.getC6p2() / c.getTotalNumber());
}
}
if (vo.getC7p0() != null && vo.getC7p0() > 0) {
vo.setC7p1(ObjectUtils.defaultIfNull(vo.getC7p1(), 0.0) + diff * c.getC7p1());
vo.setC7p2(ObjectUtils.defaultIfNull(vo.getC7p2(), 0.0) + diff * c.getC7p1());
if (i == size - 1) {
vo.setC7p1(vo.getC7p1() / c.getTotalNumber());
vo.setC7p2(vo.getC7p2() / c.getTotalNumber());
}
}
if (vo.getC8p0() != null && vo.getC8p0() > 0) {
vo.setC8p1(ObjectUtils.defaultIfNull(vo.getC8p1(), 0.0) + diff * c.getC8p1());
vo.setC8p2(ObjectUtils.defaultIfNull(vo.getC8p2(), 0.0) + diff * c.getC8p1());
if (i == size - 1) {
vo.setC8p1(vo.getC8p1() / c.getTotalNumber());
vo.setC8p2(vo.getC8p2() / c.getTotalNumber());
}
}
if (vo.getC9p0() != null && vo.getC9p0() > 0) {
vo.setC9p1(ObjectUtils.defaultIfNull(vo.getC9p1(), 0.0) + diff * c.getC9p1());
vo.setC9p2(ObjectUtils.defaultIfNull(vo.getC9p2(), 0.0) + diff * c.getC9p1());
if (i == size - 1) {
vo.setC9p1(vo.getC9p1() / c.getTotalNumber());
vo.setC9p2(vo.getC9p2() / c.getTotalNumber());
}
}
vo.setDdp1(ObjectUtils.defaultIfNull(vo.getDdp1(), 0.0) + diff * c.getDdp1());
if (i == size - 1) {
vo.setDdp1(vo.getDdp1() / c.getTotalNumber());
}
vo.setDdp2(ObjectUtils.defaultIfNull(vo.getDdp2(), 0.0) + diff * c.getDdp2());
if (i == size - 1) {
vo.setDdp2(vo.getDdp2() / c.getTotalNumber());
}
vo.setDdp3(ObjectUtils.defaultIfNull(vo.getDdp3(), 0.0) + diff * c.getDdp3());
if (i == size - 1) {
vo.setDdp3(vo.getDdp3() / c.getTotalNumber());
}
vo.setDdp4(ObjectUtils.defaultIfNull(vo.getDdp4(), 0.0) + diff * c.getDdp4());
if (i == size - 1) {
vo.setDdp4(vo.getDdp4() / c.getTotalNumber());
}
vo.setDdp5(ObjectUtils.defaultIfNull(vo.getDdp5(), 0.0) + diff * c.getDdp5());
if (i == size - 1) {
vo.setDdp5(vo.getDdp5() / c.getTotalNumber());
}
vo.setSysDdp1(ObjectUtils.defaultIfNull(vo.getSysDdp1(), 0.0) + diff * c.getSysDdp1());
if (i == size - 1) {
vo.setSysDdp1(vo.getSysDdp1() / c.getTotalNumber());
}
vo.setSysDdp2(ObjectUtils.defaultIfNull(vo.getSysDdp2(), 0.0) + diff * c.getSysDdp2());
if (i == size - 1) {
vo.setSysDdp2(vo.getSysDdp2() / c.getTotalNumber());
}
vo.setSysDdp3(ObjectUtils.defaultIfNull(vo.getSysDdp3(), 0.0) + diff * c.getSysDdp3());
if (i == size - 1) {
vo.setSysDdp3(vo.getSysDdp3() / c.getTotalNumber());
}
vo.setSysDdp4(ObjectUtils.defaultIfNull(vo.getSysDdp4(), 0.0) + diff * c.getSysDdp4());
if (i == size - 1) {
vo.setSysDdp4(vo.getSysDdp4() / c.getTotalNumber());
}
vo.setSysDdp5(ObjectUtils.defaultIfNull(vo.getSysDdp5(), 0.0) + diff * c.getSysDdp5());
if (i == size - 1) {
vo.setSysDdp5(vo.getSysDdp5() / c.getTotalNumber());
}
vo.setAvgDdp1(ObjectUtils.defaultIfNull(vo.getAvgDdp1(), 0.0) + diff * c.getAvgDdp1());
if (i == size - 1) {
vo.setAvgDdp1(vo.getAvgDdp1() / c.getTotalNumber());
}
vo.setAvgDdp2(ObjectUtils.defaultIfNull(vo.getAvgDdp2(), 0.0) + diff * c.getAvgDdp2());
if (i == size - 1) {
vo.setAvgDdp2(vo.getAvgDdp2() / c.getTotalNumber());
}
vo.setAvgDdp3(ObjectUtils.defaultIfNull(vo.getAvgDdp3(), 0.0) + diff * c.getAvgDdp3());
if (i == size - 1) {
vo.setAvgDdp3(vo.getAvgDdp3() / c.getTotalNumber());
}
vo.setAvgDdp4(ObjectUtils.defaultIfNull(vo.getAvgDdp4(), 0.0) + diff * c.getAvgDdp4());
if (i == size - 1) {
vo.setAvgDdp4(vo.getAvgDdp4() / c.getTotalNumber());
}
vo.setAvgDdp5(ObjectUtils.defaultIfNull(vo.getAvgDdp5(), 0.0) + diff * c.getAvgDdp5());
if (i == size - 1) {
vo.setAvgDdp5(vo.getAvgDdp5() / c.getTotalNumber());
}
}
return vo;
}
}

View File

@@ -0,0 +1,251 @@
package cn.lihongjie.coal.entity;
import cn.lihongjie.coal.exception.BizException;
import io.vavr.collection.Stream;
import jakarta.persistence.Embeddable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.With;
import org.hibernate.annotations.Comment;
import java.time.LocalTime;
import java.util.Objects;
@Data
@Embeddable
@NoArgsConstructor
@AllArgsConstructor
public class CoalWashingDailyAnalysisItemVo {
@Comment("时间")
private LocalTime time;
@Comment("产量")
@With
private Double totalNumber;
@Comment("成分0 比例")
private Double c0p0;
@Comment("成分0 灰")
private Double c0p1;
@Comment("成分0 硫")
private Double c0p2;
@Comment("成分1 比例")
private Double c1p0;
@Comment("成分1 灰")
private Double c1p1;
@Comment("成分1 硫")
private Double c1p2;
@Comment("成分2 比例")
private Double c2p0;
@Comment("成分2 灰")
private Double c2p1;
@Comment("成分2 硫")
private Double c2p2;
@Comment("成分3 比例")
private Double c3p0;
@Comment("成分3 灰")
private Double c3p1;
@Comment("成分3 硫")
private Double c3p2;
@Comment("成分4 比例")
private Double c4p0;
@Comment("成分4 灰")
private Double c4p1;
@Comment("成分4 硫")
private Double c4p2;
@Comment("成分5 比例")
private Double c5p0;
@Comment("成分5 灰")
private Double c5p1;
@Comment("成分5 硫")
private Double c5p2;
@Comment("成分6 比例")
private Double c6p0;
@Comment("成分6 灰")
private Double c6p1;
@Comment("成分6 硫")
private Double c6p2;
@Comment("成分7 比例")
private Double c7p0;
@Comment("成分7 灰")
private Double c7p1;
@Comment("成分7 硫")
private Double c7p2;
@Comment("成分8 比例")
private Double c8p0;
@Comment("成分8 灰")
private Double c8p1;
@Comment("成分8 硫")
private Double c8p2;
@Comment("成分9 比例")
private Double c9p0;
@Comment("成分9 灰")
private Double c9p1;
@Comment("成分9 硫")
private Double c9p2;
@Comment("用户输入 大堆 灰")
private Double ddp1;
@Comment("用户输入 大堆 硫")
private Double ddp2;
@Comment("用户输入 大堆 挥发")
private Double ddp3;
@Comment("用户输入 大堆 粘结")
private Double ddp4;
@Comment("用户输入 大堆 备用")
private Double ddp5;
@Comment("系统计算 大堆 灰")
private Double sysDdp1;
@Comment("系统计算 大堆 硫")
private Double sysDdp2;
@Comment("系统计算 大堆 挥发")
private Double sysDdp3;
@Comment("系统计算 大堆 粘结")
private Double sysDdp4;
@Comment("系统计算 大堆 备用")
private Double sysDdp5;
@Comment("用户输入与系统计算的平均值 大堆 灰")
private Double avgDdp1;
@Comment("用户输入与系统计算的平均值 大堆 硫")
private Double avgDdp2;
@Comment("用户输入与系统计算的平均值 大堆 挥发")
private Double avgDdp3;
@Comment("用户输入与系统计算的平均值 大堆 粘结")
private Double avgDdp4;
@Comment("用户输入与系统计算的平均值 大堆 备用")
private Double avgDdp5;
public void calculate() {
if (Stream.of(c0p0, c1p0, c2p0, c3p0, c4p0, c5p0, c6p0, c7p0, c8p0, c9p0).filter(Objects::nonNull).sum().doubleValue() != 100)
throw new BizException("比例相加应该等于100!");
sysDdp1 = 0.0;
sysDdp2 = 0.0;
if (c0p0 != null) sysDdp1 += c0p1 * c0p0 / 100.00;
if (c0p0 != null) sysDdp2 += c0p2 * c0p0 / 100.00;
if (c1p0 != null) sysDdp1 += c1p1 * c1p0 / 100.00;
if (c1p0 != null) sysDdp2 += c1p2 * c1p0 / 100.00;
if (c2p0 != null) sysDdp1 += c2p1 * c2p0 / 100.00;
if (c2p0 != null) sysDdp2 += c2p2 * c2p0 / 100.00;
if (c3p0 != null) sysDdp1 += c3p1 * c3p0 / 100.00;
if (c3p0 != null) sysDdp2 += c3p2 * c3p0 / 100.00;
if (c4p0 != null) sysDdp1 += c4p1 * c4p0 / 100.00;
if (c4p0 != null) sysDdp2 += c4p2 * c4p0 / 100.00;
if (c5p0 != null) sysDdp1 += c5p1 * c5p0 / 100.00;
if (c5p0 != null) sysDdp2 += c5p2 * c5p0 / 100.00;
if (c6p0 != null) sysDdp1 += c6p1 * c6p0 / 100.00;
if (c6p0 != null) sysDdp2 += c6p2 * c6p0 / 100.00;
if (c7p0 != null) sysDdp1 += c7p1 * c7p0 / 100.00;
if (c7p0 != null) sysDdp2 += c7p2 * c7p0 / 100.00;
if (c8p0 != null) sysDdp1 += c8p1 * c8p0 / 100.00;
if (c8p0 != null) sysDdp2 += c8p2 * c8p0 / 100.00;
if (c9p0 != null) sysDdp1 += c9p1 * c9p0 / 100.00;
if (c9p0 != null) sysDdp2 += c9p2 * c9p0 / 100.00;
if (ddp1 != null && sysDdp1 != null) avgDdp1 = (ddp1 + sysDdp1) / 2.0;
if (ddp2 != null && sysDdp2 != null) avgDdp2 = (ddp2 + sysDdp2) / 2.0;
if (ddp3 != null && sysDdp3 != null) avgDdp3 = (ddp3 + sysDdp3) / 2.0;
if (ddp4 != null && sysDdp4 != null) avgDdp4 = (ddp4 + sysDdp4) / 2.0;
if (ddp5 != null && sysDdp5 != null) avgDdp5 = (ddp5 + sysDdp5) / 2.0;
}
}

View File

@@ -0,0 +1,35 @@
package cn.lihongjie.coal.mapper;
import cn.lihongjie.coal.entity.CoalWashingDailyAnalysisEntity;
import cn.lihongjie.coal.entity.CoalWashingDailyAnalysisItemVo;
import org.mapstruct.Mapper;
import org.mapstruct.MappingConstants;
import java.math.BigDecimal;
import java.math.RoundingMode;
@Mapper(
componentModel = MappingConstants.ComponentModel.SPRING,
uses = {CommonMapper.class}
)
public interface RoundMapper {
CoalWashingDailyAnalysisEntity round(CoalWashingDailyAnalysisEntity entity);
CoalWashingDailyAnalysisItemVo round(CoalWashingDailyAnalysisItemVo entity);
default Double formatDouble(Double d) {
if (d == null) {
return d;
}
return new BigDecimal(d).setScale(2, RoundingMode.HALF_UP).doubleValue();
}
}

View File

@@ -0,0 +1,38 @@
package cn.lihongjie.coal.entity;
import org.junit.jupiter.api.Test;
import java.time.LocalTime;
import java.util.Arrays;
class CoalWashingDailyAnalysisEntityTest {
@Test
void test1() {
CoalWashingDailyAnalysisEntity analysis = new CoalWashingDailyAnalysisEntity();
CoalWashingDailyAnalysisItemVo vo1 = new CoalWashingDailyAnalysisItemVo();
vo1.setC0p0(100.0);
vo1.setC0p1(10.0);
vo1.setC0p2(12.0);
vo1.setTime(LocalTime.of(1, 0));
vo1.setTotalNumber(10.0);
CoalWashingDailyAnalysisItemVo vo2 = new CoalWashingDailyAnalysisItemVo();
vo2.setC0p0(100.0);
vo2.setC0p1(10.0);
vo2.setC0p2(12.0);
vo2.setTime(LocalTime.of(2, 0));
vo2.setTotalNumber(12.0);
analysis.setInputItems(Arrays.asList(vo1, vo2));
analysis.rollingAvg();
System.out.println(analysis);
}
}