CalculateUtils.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package com.xlht.xlhtproject.utils;
  2. import com.xlht.xlhtproject.domain.SmartAdd;
  3. import com.xlht.xlhtproject.domain.TXlhtMedicineParam;
  4. import com.xlht.xlhtproject.mapper.TShuju1Mapper;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Component;
  9. import java.math.BigDecimal;
  10. import java.math.RoundingMode;
  11. import java.util.Objects;
  12. import static com.xlht.xlhtproject.enums.MyConstants.*;
  13. @Component
  14. public class CalculateUtils {
  15. private static final Logger log = LoggerFactory.getLogger(CalculateUtils.class);
  16. @Autowired
  17. private TShuju1Mapper shuju1Mapper;
  18. public BigDecimal calculateMedicineByLastRecord(TXlhtMedicineParam param, int whichCZ) {
  19. if (Objects.isNull(param)) {
  20. return null;
  21. }
  22. //计算用到的值
  23. Integer hycXsyTypeOne = param.getHycXsyTypeOne();
  24. Integer hycXsyTypeTwo = param.getHycXsyTypeTwo();
  25. BigDecimal hycXsyOne = param.getHycXsyOne();
  26. BigDecimal hycXsyTwo = param.getHycXsyTwo();
  27. BigDecimal htfksdOne = param.getHtfksdOne();
  28. BigDecimal htfksdTwo = param.getHtfksdTwo();
  29. Integer qycAdTypeOne = param.getQycAdTypeOne();
  30. Integer qycAdTypeTwo = param.getQycAdTypeTwo();
  31. BigDecimal qycAdOne = param.getQycAdOne();
  32. BigDecimal qycAdTwo = param.getQycAdTwo();
  33. Integer qycYxyTypeOne = param.getQycYxyTypeOne();
  34. Integer qycYxyTypeTwo = param.getQycYxyTypeTwo();
  35. BigDecimal qycYxyOne = param.getQycYxyOne();
  36. BigDecimal qycYxyTwo = param.getQycYxyTwo();
  37. BigDecimal xzxsOne = param.getXzxsOne();
  38. BigDecimal xzxsTwo = param.getXzxsTwo();
  39. BigDecimal jzxsOne = param.getJzxsOne();
  40. BigDecimal jzxsTwo = param.getJzxsTwo();
  41. Integer jsLlTypeOne = param.getJsLlTypeOne();
  42. Integer jsLlTypeTwo = param.getJsLlTypeTwo();
  43. BigDecimal jsLlOne = param.getJsLlOne();
  44. BigDecimal jsLlTwo = param.getJsLlTwo();
  45. BigDecimal slfpxsOne = param.getSlfpxsOne();
  46. BigDecimal slfpxsTwo = param.getSlfpxsTwo();
  47. BigDecimal kzxsOne = param.getKzxsOne();
  48. BigDecimal kzxsTwo = param.getKzxsTwo();
  49. Integer jsCodTypeOne = param.getJsCodTypeOne();
  50. Integer jsCodTypeTwo = param.getJsCodTypeTwo();
  51. BigDecimal jsCodOne = param.getJsCodOne();
  52. BigDecimal jsCodTwo = param.getJsCodTwo();
  53. BigDecimal zhxsOne = param.getZhxsOne();
  54. BigDecimal zhxsTwo = param.getZhxsTwo();
  55. BigDecimal tydlOne = param.getTydlOne();
  56. BigDecimal tydlTwo = param.getTydlTwo();
  57. BigDecimal medicineAmountOne = param.getMedicineAmountOne();//手动需要
  58. // Integer type = param.getType();//0自动 1一号池 2二号池 3人工投放
  59. BigDecimal yymdOne = param.getYymdOne();
  60. BigDecimal yymdTwo = param.getYymdTwo();
  61. BigDecimal sxpsOne = param.getSxpsOne();
  62. BigDecimal sxpsTwo = param.getSxpsTwo();
  63. //计算
  64. /*if(!Objects.isNull(whichCZ)) {
  65. if(3 == whichCZ){
  66. return medicineAmountOne;
  67. }
  68. //2024年09月19日11:30:06 锡林浩特,碳源投放是1池和2池分开投放的
  69. //计算1号池的值
  70. //计算二号池的值
  71. //判断,返回值
  72. if(0 == whichCZ)//锡林浩特没有这个逻辑,连个池子是分开的
  73. return null;
  74. else if(1 == whichCZ) {
  75. return getResultByDiff(hycXsyTypeOne, hycXsyOne, htfksdOne, qycAdTypeOne, qycAdOne, qycYxyTypeOne, qycYxyOne, xzxsOne, jzxsOne, jsLlTypeOne, jsLlOne, slfpxsOne, kzxsOne, jsCodTypeOne, jsCodOne, zhxsOne, tydlOne, "one", yymdOne, sxpsOne);
  76. }else if(2 == whichCZ)
  77. return getResultByDiff(hycXsyTypeTwo, hycXsyTwo, htfksdTwo, qycAdTypeTwo, qycAdTwo, qycYxyTypeTwo, qycYxyTwo, xzxsTwo, jzxsTwo, jsLlTypeTwo, jsLlTwo, slfpxsTwo, kzxsTwo, jsCodTypeTwo, jsCodTwo, zhxsTwo, tydlTwo, "two", yymdTwo, sxpsTwo);
  78. else {
  79. return null;//错误的配置
  80. }
  81. }*/
  82. //2024年09月24日14:35:32 先判断是哪个池子 再判断是否是手动
  83. Integer typeOne = param.getTypeOne();
  84. if(Objects.isNull(typeOne)) {
  85. typeOne = 0;
  86. }
  87. Integer typeTwo = param.getTypeTwo();
  88. if(Objects.isNull(typeTwo)) {
  89. typeTwo = 0;
  90. }
  91. if(1 == whichCZ) {
  92. if(typeOne == 1){//人工
  93. return param.getMedicineAmountOne();
  94. }else {//自动
  95. return getResultByDiff(hycXsyTypeOne, hycXsyOne, htfksdOne, qycAdTypeOne, qycAdOne, qycYxyTypeOne, qycYxyOne, xzxsOne, jzxsOne, jsLlTypeOne, jsLlOne, slfpxsOne, kzxsOne, jsCodTypeOne, jsCodOne, zhxsOne, tydlOne, "one", yymdOne, sxpsOne);
  96. }
  97. }else if(2 == whichCZ) {
  98. if(typeTwo == 1){//人工
  99. return param.getMedicineAmountTwo();
  100. }else {//自动
  101. return getResultByDiff(hycXsyTypeTwo, hycXsyTwo, htfksdTwo, qycAdTypeTwo, qycAdTwo, qycYxyTypeTwo, qycYxyTwo, xzxsTwo, jzxsTwo, jsLlTypeTwo, jsLlTwo, slfpxsTwo, kzxsTwo, jsCodTypeTwo, jsCodTwo, zhxsTwo, tydlTwo, "two", yymdTwo, sxpsTwo);
  102. }
  103. }else {
  104. log.error("不支持的类型××××××");
  105. }
  106. return null;
  107. }
  108. private BigDecimal getResultByDiff(Integer hycXsyType, BigDecimal hycXsyVal, BigDecimal htfksd, Integer qycAdType, BigDecimal qycAdVal, Integer qycYxyType,
  109. BigDecimal qycYxyVal, BigDecimal xzxs, BigDecimal jzxs, Integer jsLlType, BigDecimal jsLlVal, BigDecimal slfpxs, BigDecimal kzxs, Integer jsCodType,
  110. BigDecimal jsCodVal, BigDecimal zhxs, BigDecimal tydl, String whichCZ, BigDecimal yymd, BigDecimal sxps) {
  111. //2024年09月14日10:26:11 不同池子,根据不同类型,获取最新的数据,计算碳源投加量
  112. //获取最新的实时数据
  113. SmartAdd smartAdd = this.shuju1Mapper.getNewestData();
  114. if(!Objects.isNull(smartAdd)){
  115. if("one".equals(whichCZ)){//一池
  116. if(!Objects.isNull(hycXsyType)){
  117. if(1 == hycXsyType){//化验
  118. hycXsyVal = smartAdd.getHyXsyHYOne();
  119. }else if(2 == hycXsyType){//预测
  120. hycXsyVal = smartAdd.getHyXsyYCOne();
  121. }
  122. }
  123. if(!Objects.isNull(qycAdType) && 1 == qycAdType){//化验
  124. qycAdVal = smartAdd.getQyAdHYOne();
  125. }
  126. if(!Objects.isNull(qycYxyType) && 1 == qycYxyType){//化验
  127. qycYxyVal = smartAdd.getQyXsyHYOne();
  128. }
  129. if(!Objects.isNull(jsCodType)){
  130. if(1 == jsCodType){//仪表
  131. jsCodVal = smartAdd.getJsCodYB();
  132. }else if(2 == jsCodType){//化验
  133. jsCodVal = smartAdd.getJsCodHY();
  134. }
  135. }
  136. if(!Objects.isNull(jsLlType) && 1 == jsLlType){//仪表
  137. jsLlVal = smartAdd.getJslYB();
  138. }
  139. }else {//二池
  140. if(!Objects.isNull(hycXsyType)){
  141. if(1 == hycXsyType){//化验
  142. hycXsyVal = smartAdd.getHyXsyHYTwo();
  143. }else if(2 == hycXsyType){//预测
  144. hycXsyVal = smartAdd.getHyXsyYCTwo();
  145. }
  146. }
  147. if(!Objects.isNull(qycAdType) && 1 == qycAdType){//化验
  148. qycAdVal = smartAdd.getQyAdHYTwo();
  149. }
  150. if(!Objects.isNull(qycYxyType) && 1 == qycYxyType){//化验
  151. qycYxyVal = smartAdd.getQyXsyHYTwo();
  152. }
  153. if(!Objects.isNull(jsCodType)){
  154. if(1 == jsCodType){//仪表
  155. jsCodVal = smartAdd.getJsCodYB();
  156. }else if(2 == jsCodType){//化验
  157. jsCodVal = smartAdd.getJsCodHY();
  158. }
  159. }
  160. if(!Objects.isNull(jsLlType) && 1 == jsLlType){//仪表
  161. jsLlVal = smartAdd.getJslYB();
  162. }
  163. }
  164. }
  165. //兜底处理
  166. if(Objects.isNull(hycXsyVal))
  167. hycXsyVal = BigDecimal.ZERO;
  168. if(Objects.isNull(htfksd))
  169. htfksd = BigDecimal.ZERO;
  170. if(Objects.isNull(qycAdVal))
  171. qycAdVal = BigDecimal.ZERO;
  172. if(Objects.isNull(qycYxyVal))
  173. qycYxyVal = BigDecimal.ZERO;
  174. if(Objects.isNull(xzxs))
  175. xzxs = BigDecimal.ZERO;
  176. if(Objects.isNull(jzxs))
  177. jzxs = BigDecimal.ZERO;
  178. if(Objects.isNull(jsLlVal))
  179. jsLlVal = BigDecimal.ZERO;
  180. if(Objects.isNull(slfpxs))
  181. slfpxs = BigDecimal.ZERO;
  182. if(Objects.isNull(kzxs))
  183. kzxs = BigDecimal.ZERO;
  184. if(Objects.isNull(jsCodVal))
  185. jsCodVal = BigDecimal.ZERO;
  186. if(Objects.isNull(zhxs))
  187. zhxs = BigDecimal.ZERO;
  188. if(Objects.isNull(tydl))
  189. return null;//除数不能为0
  190. if(Objects.isNull(yymd) || yymd.compareTo(BigDecimal.ZERO) <= 0)
  191. return null;//除数不能为0
  192. if(Objects.isNull(sxps)){
  193. sxps = BigDecimal.ZERO;
  194. }
  195. //1)计算挟走量
  196. 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);
  197. //2)计算碳源投加总量
  198. 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);
  199. //2024年09月14日15:33:37 计算出来的结果太大,是几千,把第三步公式也加上
  200. //计算加药流量
  201. 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);
  202. }
  203. }