|
@@ -0,0 +1,195 @@
|
|
|
+package com.xlht.xlhtproject.utils;
|
|
|
+
|
|
|
+import com.xlht.xlhtproject.domain.SmartAdd;
|
|
|
+import com.xlht.xlhtproject.domain.TXinyiMedicineParam;
|
|
|
+import com.xlht.xlhtproject.mapper.TShuju1Mapper;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.util.Objects;
|
|
|
+
|
|
|
+import static com.xlht.xlhtproject.enums.MyConstants.*;
|
|
|
+
|
|
|
+@Component
|
|
|
+public class CalculateUtils {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private TShuju1Mapper shuju1Mapper;
|
|
|
+
|
|
|
+ public BigDecimal calculateMedicineByLastRecord(TXinyiMedicineParam param, int type) {
|
|
|
+ if (Objects.isNull(param)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ //计算用到的值
|
|
|
+ Integer hycXsyType = param.getHycXsyType();
|
|
|
+ BigDecimal hycXsyOne = param.getHycXsyOne();
|
|
|
+ BigDecimal hycXsyTwo = param.getHycXsyTwo();
|
|
|
+
|
|
|
+ BigDecimal htfksd = param.getHtfksd();
|
|
|
+
|
|
|
+ Integer qycAdType = param.getQycAdType();
|
|
|
+ BigDecimal qycAdOne = param.getQycAdOne();
|
|
|
+ BigDecimal qycAdTwo = param.getQycAdTwo();
|
|
|
+
|
|
|
+ Integer qycYxyType = param.getQycYxyType();
|
|
|
+ BigDecimal qycYxyOne = param.getQycYxyOne();
|
|
|
+ BigDecimal qycYxyTwo = param.getQycYxyTwo();
|
|
|
+
|
|
|
+ BigDecimal xzxs = param.getXzxs();
|
|
|
+
|
|
|
+ BigDecimal jzxs = param.getJzxs();
|
|
|
+
|
|
|
+ Integer jsLlType = param.getJsLlType();
|
|
|
+ BigDecimal jsLlOne = param.getJsLlOne();
|
|
|
+ BigDecimal jsLlTwo = param.getJsLlTwo();
|
|
|
+
|
|
|
+ BigDecimal slfpxs = param.getSlfpxs();
|
|
|
+
|
|
|
+ BigDecimal kzxs = param.getKzxs();
|
|
|
+
|
|
|
+ Integer jsCodType = param.getJsCodType();
|
|
|
+ BigDecimal jsCodOne = param.getJsCodOne();
|
|
|
+ BigDecimal jsCodTwo = param.getJsCodTwo();
|
|
|
+
|
|
|
+ BigDecimal zhxs = param.getZhxs();
|
|
|
+
|
|
|
+ BigDecimal tydl = param.getTydl();
|
|
|
+
|
|
|
+ BigDecimal medicineAmount = param.getMedicineAmount();//手动需要
|
|
|
+
|
|
|
+// Integer type = param.getType();//0自动 1一号池 2二号池 3人工投放
|
|
|
+
|
|
|
+ BigDecimal yymd = param.getYymd();
|
|
|
+
|
|
|
+ BigDecimal sxps = param.getSxps();
|
|
|
+
|
|
|
+ //计算
|
|
|
+ if(!Objects.isNull(type)) {
|
|
|
+ if(3 == type){
|
|
|
+ return medicineAmount;
|
|
|
+ }
|
|
|
+ //2024年09月19日11:30:06 锡林浩特,碳源投放是1池和2池分开投放的
|
|
|
+ //计算1号池的值
|
|
|
+ //计算二号池的值
|
|
|
+ //判断,返回值
|
|
|
+ if(0 == type)//锡林浩特没有这个逻辑,连个池子是分开的
|
|
|
+ return null;
|
|
|
+ else if(1 == type) {
|
|
|
+ return getResultByDiff(hycXsyType, hycXsyOne, htfksd, qycAdType, qycAdOne, qycYxyType, qycYxyOne, xzxs, jzxs, jsLlType, jsLlOne, slfpxs, kzxs, jsCodType, jsCodOne, zhxs, tydl, "one", yymd, sxps);
|
|
|
+ }else if(2 == type)
|
|
|
+ return getResultByDiff(hycXsyType, hycXsyTwo, htfksd, qycAdType, qycAdTwo, qycYxyType, qycYxyTwo, xzxs, jzxs, jsLlType, jsLlTwo, slfpxs, kzxs, jsCodType, jsCodTwo, zhxs, tydl, "two", yymd, sxps);
|
|
|
+ else {
|
|
|
+ return null;//错误的配置
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ private BigDecimal getResultByDiff(Integer hycXsyType, BigDecimal hycXsyVal, BigDecimal htfksd, Integer qycAdType, BigDecimal qycAdVal, Integer qycYxyType,
|
|
|
+ BigDecimal qycYxyVal, BigDecimal xzxs, BigDecimal jzxs, Integer jsLlType, BigDecimal jsLlVal, BigDecimal slfpxs, BigDecimal kzxs, Integer jsCodType,
|
|
|
+ BigDecimal jsCodVal, BigDecimal zhxs, BigDecimal tydl, String whichCZ, BigDecimal yymd, BigDecimal sxps) {
|
|
|
+ //2024年09月14日10:26:11 不同池子,根据不同类型,获取最新的数据,计算碳源投加量
|
|
|
+ //获取最新的实时数据
|
|
|
+ SmartAdd smartAdd = this.shuju1Mapper.getNewestData();
|
|
|
+ if(!Objects.isNull(smartAdd)){
|
|
|
+ if("one".equals(whichCZ)){//一池
|
|
|
+ if(!Objects.isNull(hycXsyType)){
|
|
|
+ if(1 == hycXsyType){//化验
|
|
|
+ hycXsyVal = smartAdd.getHyXsyHYOne();
|
|
|
+ }else if(2 == hycXsyType){//预测
|
|
|
+ hycXsyVal = smartAdd.getHyXsyYCOne();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(!Objects.isNull(qycAdType) && 1 == qycAdType){//化验
|
|
|
+ qycAdVal = smartAdd.getQyAdHYOne();
|
|
|
+ }
|
|
|
+ if(!Objects.isNull(qycYxyType) && 1 == qycYxyType){//化验
|
|
|
+ qycYxyVal = smartAdd.getQyXsyHYOne();
|
|
|
+ }
|
|
|
+ if(!Objects.isNull(jsCodType)){
|
|
|
+ if(1 == jsCodType){//仪表
|
|
|
+ jsCodVal = smartAdd.getJsCodYB();
|
|
|
+ }else if(2 == jsCodType){//化验
|
|
|
+ jsCodVal = smartAdd.getJsCodHY();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(!Objects.isNull(jsLlType) && 1 == jsLlType){//仪表
|
|
|
+ jsLlVal = smartAdd.getJslYB();
|
|
|
+ }
|
|
|
+ }else {//二池
|
|
|
+ if(!Objects.isNull(hycXsyType)){
|
|
|
+ if(1 == hycXsyType){//化验
|
|
|
+ hycXsyVal = smartAdd.getHyXsyHYTwo();
|
|
|
+ }else if(2 == hycXsyType){//预测
|
|
|
+ hycXsyVal = smartAdd.getHyXsyYCTwo();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(!Objects.isNull(qycAdType) && 1 == qycAdType){//化验
|
|
|
+ qycAdVal = smartAdd.getQyAdHYTwo();
|
|
|
+ }
|
|
|
+ if(!Objects.isNull(qycYxyType) && 1 == qycYxyType){//化验
|
|
|
+ qycYxyVal = smartAdd.getQyXsyHYTwo();
|
|
|
+ }
|
|
|
+ if(!Objects.isNull(jsCodType)){
|
|
|
+ if(1 == jsCodType){//仪表
|
|
|
+ jsCodVal = smartAdd.getJsCodYB();
|
|
|
+ }else if(2 == jsCodType){//化验
|
|
|
+ jsCodVal = smartAdd.getJsCodHY();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(!Objects.isNull(jsLlType) && 1 == jsLlType){//仪表
|
|
|
+ jsLlVal = smartAdd.getJslYB();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //兜底处理
|
|
|
+ if(Objects.isNull(hycXsyVal))
|
|
|
+ hycXsyVal = BigDecimal.ZERO;
|
|
|
+ if(Objects.isNull(htfksd))
|
|
|
+ htfksd = BigDecimal.ZERO;
|
|
|
+ if(Objects.isNull(qycAdVal))
|
|
|
+ qycAdVal = BigDecimal.ZERO;
|
|
|
+ if(Objects.isNull(qycYxyVal))
|
|
|
+ qycYxyVal = BigDecimal.ZERO;
|
|
|
+ if(Objects.isNull(xzxs))
|
|
|
+ xzxs = BigDecimal.ZERO;
|
|
|
+ if(Objects.isNull(jzxs))
|
|
|
+ jzxs = BigDecimal.ZERO;
|
|
|
+ if(Objects.isNull(jsLlVal))
|
|
|
+ jsLlVal = BigDecimal.ZERO;
|
|
|
+ if(Objects.isNull(slfpxs))
|
|
|
+ slfpxs = BigDecimal.ZERO;
|
|
|
+ if(Objects.isNull(kzxs))
|
|
|
+ kzxs = BigDecimal.ZERO;
|
|
|
+ if(Objects.isNull(jsCodVal))
|
|
|
+ jsCodVal = BigDecimal.ZERO;
|
|
|
+ if(Objects.isNull(zhxs))
|
|
|
+ zhxs = BigDecimal.ZERO;
|
|
|
+ if(Objects.isNull(tydl))
|
|
|
+ return null;//除数不能为0
|
|
|
+ if(Objects.isNull(yymd) || yymd.compareTo(BigDecimal.ZERO) <= 0)
|
|
|
+ return null;//除数不能为0
|
|
|
+ if(Objects.isNull(sxps)){
|
|
|
+ sxps = BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+ //1)计算挟走量
|
|
|
+ BigDecimal xzl = (((BigDecimal_2.multiply(hycXsyVal).subtract(htfksd)).add(((qycAdVal.add(qycYxyVal)).multiply(xzxs).subtract(htfksd)))).multiply((jzxs.subtract(BigDecimal_1)))).multiply((jsLlVal.multiply(slfpxs))).divide(BigDecimal_1000, NUMBER_SCALE_4, RoundingMode.HALF_UP);
|
|
|
+ //2)计算碳源投加总量
|
|
|
+ BigDecimal total = (xzl.multiply(kzxs).subtract((jsLlVal.multiply(slfpxs).multiply(jsCodVal).multiply(zhxs).divide(BigDecimal_1000, NUMBER_SCALE_4, RoundingMode.HALF_UP)))).divide(tydl, NUMBER_SCALE_4, RoundingMode.HALF_UP);
|
|
|
+ //2024年09月14日15:33:37 计算出来的结果太大,是几千,把第三步公式也加上
|
|
|
+ //计算加药流量
|
|
|
+ return DecimalUtils.getNLengthHalfUp(total.divide(yymd, NUMBER_SCALE_10, RoundingMode.HALF_UP).divide(BigDecimal_1000, NUMBER_SCALE_10, RoundingMode.HALF_UP).multiply(sxps), INT_3);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /*public static void main(String[] args) {
|
|
|
+ TXinyiMedicineParam tXinyiMedicineParam = new TXinyiMedicineParam();
|
|
|
+ tXinyiMedicineParam.setYymd(BigDecimal_2);
|
|
|
+ tXinyiMedicineParam.setTydl(BigDecimal_2);
|
|
|
+ System.out.println(calculateMedicineByLastRecord(tXinyiMedicineParam, 1));
|
|
|
+ }*/
|
|
|
+}
|