Ver código fonte

调整页面上数据
1.完成首页经编所有数据为真实数据
2.染整为后台出的数据,不是纯模拟的了。

wukai 3 semanas atrás
pai
commit
d61ddd2866

+ 85 - 0
jjt-admin/src/test/java/com/jjt/rz/RzCalcTest.java

@@ -0,0 +1,85 @@
+package com.jjt.rz;
+
+import com.jjt.JjtApplication;
+import com.jjt.ws.domain.TwinRzCalcMonth;
+import com.jjt.ws.service.ITwinRzCalcMonthService;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.util.*;
+
+/**
+ * DataProcess$
+ *
+ * @author wukai
+ * @date 2024/5/7 11:49
+ */
+@SpringBootTest(classes = JjtApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class RzCalcTest {
+    @Resource
+    private ITwinRzCalcMonthService rzCalcMonthService;
+
+    @Test
+    public void test() {
+        TwinRzCalcMonth calcMonth = new TwinRzCalcMonth();
+        Map<String, Object> params = new HashMap<>();
+        params.put("start", LocalDate.now().minusDays(30).toString());
+        calcMonth.setParams(params);
+        List<TwinRzCalcMonth> list = rzCalcMonthService.selectTwinRzCalcMonthList(calcMonth);
+        list.size();
+    }
+    private static final Random random = new Random();
+    private static final int SCALE = 2; // 保留小数位数
+    private static final double DEVIATION_PERCENT = 0.25; // 波动幅度30%
+
+    public static void main(String[] args) {
+        BigDecimal total = new BigDecimal("100.00");
+        int parts = 8;
+
+        BigDecimal[] result = balancedRandomSplit(total, parts);
+        System.out.println("分割结果: " + Arrays.toString(result));
+
+        BigDecimal sum = Arrays.stream(result)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        System.out.println("验证总和: " + sum);
+    }
+
+    public static BigDecimal[] balancedRandomSplit(BigDecimal total, int parts) {
+        if (parts <= 0) throw new IllegalArgumentException("份数必须大于0");
+        if (total.compareTo(BigDecimal.ZERO) <= 0) throw new IllegalArgumentException("总数必须大于0");
+
+        BigDecimal average = total.divide(new BigDecimal(parts), SCALE, RoundingMode.HALF_UP);
+        BigDecimal[] splits = new BigDecimal[parts];
+        BigDecimal remaining = total;
+
+        // 前parts-1次分割
+        for (int i = 0; i < parts - 1; i++) {
+            // 计算允许的波动范围
+            BigDecimal min = average.multiply(BigDecimal.ONE.subtract(new BigDecimal(DEVIATION_PERCENT)))
+                    .max(BigDecimal.ZERO);
+            BigDecimal max = average.multiply(BigDecimal.ONE.add(new BigDecimal(DEVIATION_PERCENT)));
+
+            // 确保剩余金额足够
+            BigDecimal adjustedMax = remaining.subtract(min.multiply(new BigDecimal(parts - i - 1)));
+            max = max.min(adjustedMax);
+
+            // 在范围内随机取值
+            BigDecimal range = max.subtract(min);
+            BigDecimal randomFactor = BigDecimal.valueOf(random.nextDouble());
+            BigDecimal split = min.add(range.multiply(randomFactor))
+                    .setScale(SCALE, RoundingMode.HALF_UP);
+
+            splits[i] = split;
+            remaining = remaining.subtract(split);
+        }
+
+        // 最后一份
+        splits[parts - 1] = remaining.setScale(SCALE, RoundingMode.HALF_UP);
+
+        return splits;
+    }
+}

+ 100 - 4
jjt-biz/src/main/java/com/jjt/biz/service/impl/ApiAllServiceImpl.java

@@ -2,10 +2,14 @@ package com.jjt.biz.service.impl;
 
 import com.jjt.biz.service.IApiAllService;
 import com.jjt.biz.vo.*;
+import com.jjt.calc.domain.TwinCalcDay;
+import com.jjt.calc.service.ITwinCalcDayService;
 import com.jjt.common.constant.CacheConstants;
 import com.jjt.common.core.redis.RedisCache;
 import com.jjt.common.utils.DateUtils;
+import com.jjt.ws.domain.TwinRzCalcMonth;
 import com.jjt.ws.domain.TwinWorkshopCalc;
+import com.jjt.ws.service.ITwinRzCalcMonthService;
 import com.jjt.ws.service.ITwinWorkshopCalcService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -15,6 +19,8 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.YearMonth;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -31,6 +37,10 @@ public class ApiAllServiceImpl implements IApiAllService {
     private RedisCache redisCache;
     @Resource
     private ITwinWorkshopCalcService wsCalcService;
+    @Resource
+    private ITwinRzCalcMonthService rzCalcMonthService;
+    @Resource
+    private ITwinCalcDayService calcDayService;
 
     /**
      * 获取当前库存数据
@@ -49,10 +59,85 @@ public class ApiAllServiceImpl implements IApiAllService {
      */
     @Override
     public AvgMonthVO avgMonth() {
+        LocalDateTime ldt = LocalDateTime.now();
+        YearMonth targetMonth = YearMonth.from(ldt);
+        if (ldt.getDayOfMonth() < 2 || ldt.getDayOfMonth() == 2 && ldt.getHour() < 8) {
+            //2号8点之前 取上一个月
+            targetMonth = targetMonth.minusMonths(1);
+        }
+        String month = targetMonth.format(DateTimeFormatter.ofPattern("yyyy-MM"));
+        Map<String, Object> params = new HashMap<>(16);
+        params.put("month", month);
+
+        BigDecimal costTotal = BigDecimal.ZERO;
+        BigDecimal costJb = BigDecimal.ZERO;
+        BigDecimal yieldJb = BigDecimal.ZERO;
+        BigDecimal jdl = BigDecimal.ZERO;
+        BigDecimal costRz = BigDecimal.ZERO;
+        BigDecimal yieldRz = BigDecimal.ZERO;
+
         AvgMonthVO vo = new AvgMonthVO();
-        vo.mock();
-        redisCache.setCacheObject(CacheConstants.AVG_MONTH, vo);
-        return redisCache.getCacheObject(CacheConstants.AVG_MONTH);
+        TwinWorkshopCalc twinWorkshopCalc = new TwinWorkshopCalc();
+        twinWorkshopCalc.setParams(params);
+        List<TwinWorkshopCalc> wsList = wsCalcService.selectTwinWorkshopCalcList(twinWorkshopCalc);
+        Map<Date, List<TwinWorkshopCalc>> wsMap = wsList.stream().collect(Collectors.groupingBy(TwinWorkshopCalc::getDataDate));
+        for (Date d : wsMap.keySet()) {
+            List<TwinWorkshopCalc> list = wsMap.get(d);
+            for (TwinWorkshopCalc ws : list) {
+                if ("WS02-D".equals(ws.getWsCode())) {
+                    //经编费用
+                    costJb = costJb.add(ws.getTotalPrice());
+                }
+                costTotal = costTotal.add(ws.getTotalPrice());
+            }
+        }
+
+        costTotal = costTotal.divide(BigDecimal.valueOf(wsMap.size()), 2, RoundingMode.HALF_UP);
+        //这里是算的经编总费用
+        costJb = costJb.divide(BigDecimal.valueOf(wsMap.size()), 1, RoundingMode.HALF_UP);
+
+        List<TwinCalcDay> dayList = calcDayService.selectTwinCalcDayListByMonth(month);
+        Map<Date, List<TwinCalcDay>> dayMap = dayList.stream().collect(Collectors.groupingBy(TwinCalcDay::getTime));
+        for (Date d : dayMap.keySet()) {
+            List<TwinCalcDay> list = dayMap.get(d);
+            // 计算 length 总和
+            BigDecimal totalLength = list.stream()
+                    .map(TwinCalcDay::getLength)
+                    .filter(Objects::nonNull)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            yieldJb = yieldJb.add(totalLength);
+            // 计算 jdl 总和
+            BigDecimal totalJdl = list.stream()
+                    .map(TwinCalcDay::getEfficiency)
+                    .filter(Objects::nonNull)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal avgJdl = totalJdl.multiply(BigDecimal.valueOf(100)).divide(BigDecimal.valueOf(list.size()), 4, RoundingMode.HALF_UP);
+            jdl = jdl.add(avgJdl);
+        }
+
+        yieldJb = yieldJb.divide(BigDecimal.valueOf(dayMap.size()), 0, RoundingMode.HALF_UP);
+        jdl = jdl.divide(BigDecimal.valueOf(dayMap.size()), 2, RoundingMode.HALF_UP);
+
+
+        TwinRzCalcMonth twinRzCalcMonth = new TwinRzCalcMonth();
+        twinRzCalcMonth.setParams(params);
+        List<TwinRzCalcMonth> rzList = rzCalcMonthService.selectTwinRzCalcMonthList(twinRzCalcMonth);
+        for (TwinRzCalcMonth calcMonth : rzList) {
+            costRz = costRz.add(calcMonth.getLengthPrice());
+            yieldRz = yieldRz.add(calcMonth.getLength());
+        }
+
+        costRz = costRz.divide(BigDecimal.valueOf(rzList.size()), 2, RoundingMode.HALF_UP);
+        yieldRz = yieldRz.divide(BigDecimal.valueOf(rzList.size()), 0, RoundingMode.HALF_UP);
+        //这里算平均每米费用
+        costJb = costJb.divide(yieldJb, 2, RoundingMode.HALF_UP);
+        vo.setCostRz(costRz);
+        vo.setYieldRz(yieldRz);
+        vo.setCostTotal(costTotal);
+        vo.setCostJb(costJb);
+        vo.setYieldJb(yieldJb);
+        vo.setJdl(jdl);
+        return vo;
     }
 
     /**
@@ -91,15 +176,25 @@ public class ApiAllServiceImpl implements IApiAllService {
     public List<ProdTradeVO> prodTrade() {
         List<ProdTradeVO> list = new ArrayList<>();
         IndexData id = redisCache.getCacheObject(CacheConstants.INDEX_CALC);
+        YrTwinVO yrTwinVO = redisCache.getCacheObject(CacheConstants.RZ_MOCK);
+        List<YrProdTradeVO> yrProdTradeVOS = yrTwinVO.getProdTrade();
+        Map<String, YrProdTradeVO> yrMap = yrProdTradeVOS.stream()
+                .collect(Collectors.toMap(
+                        YrProdTradeVO::getTips,
+                        vo -> vo,
+                        (existing, replacement) -> existing
+                ));
         List<WeekData> weekDataList = id.getWeekData();
         for (WeekData wd : weekDataList) {
             ProdTradeVO vo = new ProdTradeVO();
-            vo.mock();
             vo.setJbLength(wd.getLength());
             vo.setJbWeight(wd.getWeight());
             LocalDate localDate = LocalDate.parse(wd.getTime());
             vo.setDate(week(localDate));
             vo.setTips(localDate.toString());
+            YrProdTradeVO yr = yrMap.get(wd.getTime());
+            vo.setRzLength(yr.getLine().get(0).getLength());
+            vo.setRzWeight(yr.getLine().get(0).getWeight());
             list.add(vo);
         }
 
@@ -255,6 +350,7 @@ public class ApiAllServiceImpl implements IApiAllService {
         CurrYieldVO currYieldVO = currYield();
         CurrYieldVO.RZ rz = currYieldVO.getRz();
         rz.setYield(rzVO.getStatus().getLength());
+        rz.setYieldMax(BigDecimal.valueOf(200000));
         vo.setCurrYield(currYieldVO);
         vo.setProdTrade(prodTrade());
         vo.setEnergyTrade(energyTrade());

+ 50 - 5
jjt-biz/src/main/java/com/jjt/biz/service/impl/ApiYrServiceImpl.java

@@ -4,6 +4,9 @@ import com.jjt.biz.service.IApiYrService;
 import com.jjt.biz.vo.*;
 import com.jjt.common.constant.CacheConstants;
 import com.jjt.common.core.redis.RedisCache;
+import com.jjt.common.utils.DateUtils;
+import com.jjt.ws.domain.TwinRzCalcMonth;
+import com.jjt.ws.service.ITwinRzCalcMonthService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
@@ -11,9 +14,7 @@ import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
+import java.util.*;
 
 /**
  * 首页统计数据
@@ -26,6 +27,8 @@ import java.util.Random;
 public class ApiYrServiceImpl implements IApiYrService {
     @Resource
     private RedisCache redisCache;
+    @Resource
+    private ITwinRzCalcMonthService rzCalcMonthService;
 
     /**
      * 获取产线状态
@@ -101,6 +104,42 @@ public class ApiYrServiceImpl implements IApiYrService {
     }
 
     /**
+     * 获取能耗趋势
+     *
+     * @return 结果
+     */
+    public List<YrEnergyTradeVO> energyTrade(List<TwinRzCalcMonth> list) {
+        List<YrEnergyTradeVO> result = new ArrayList<>();
+        for (TwinRzCalcMonth cm : list) {
+            YrEnergyTradeVO vo = new YrEnergyTradeVO();
+            LocalDate ldt = DateUtils.toLocalDate(cm.getDataDate());
+            vo.setDate(ldt.getDayOfMonth() + "");
+            vo.setTips(ldt.toString());
+            vo.split(cm.getLengthPrice(), cm.getDUse(), cm.getQLowUse(), cm.getSUse());
+            result.add(vo);
+        }
+        return result;
+    }
+
+    /**
+     * 获取生产趋势
+     *
+     * @return 结果
+     */
+    public List<YrProdTradeVO> prodTrade(List<TwinRzCalcMonth> list) {
+        List<YrProdTradeVO> result = new ArrayList<>();
+        for (TwinRzCalcMonth cm : list) {
+            YrProdTradeVO vo = new YrProdTradeVO();
+            LocalDate ldt = DateUtils.toLocalDate(cm.getDataDate());
+            vo.setDate(ldt.getDayOfMonth() + "");
+            vo.setTips(ldt.toString());
+            vo.split(cm.getLength(), cm.getWeight());
+            result.add(vo);
+        }
+        return result;
+    }
+
+    /**
      * 模拟数据定时任务
      */
     @Override
@@ -119,11 +158,17 @@ public class ApiYrServiceImpl implements IApiYrService {
             }
         }
         vo.setEff(effList);
-        vo.setProdTrade(prodTrade());
-        vo.setEnergyTrade(energyTrade());
+        TwinRzCalcMonth calcMonth = new TwinRzCalcMonth();
+        Map<String, Object> params = new HashMap<>(16);
+        params.put("start", LocalDate.now().minusDays(30));
+        List<TwinRzCalcMonth> list = rzCalcMonthService.selectTwinRzCalcMonthList(calcMonth);
+        calcMonth.setParams(params);
+        vo.setProdTrade(prodTrade(list));
+        vo.setEnergyTrade(energyTrade(list));
         redisCache.setCacheObject(CacheConstants.RZ_MOCK, vo);
     }
 
+
     private List<YrProdTradeVO> mockProd() {
         List<YrProdTradeVO> list = new ArrayList<>();
         LocalDate end = LocalDate.now().minusDays(1);

+ 24 - 0
jjt-biz/src/main/java/com/jjt/biz/vo/YrEnergyTradeVO.java

@@ -1,5 +1,6 @@
 package com.jjt.biz.vo;
 
+import com.jjt.utils.Tools;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -27,6 +28,29 @@ public class YrEnergyTradeVO {
     @ApiModelProperty("各产线数据")
     private List<Line> line;
 
+    public void split(BigDecimal price, BigDecimal d, BigDecimal stream, BigDecimal water) {
+        BigDecimal[] avg = Tools.balancedRandomSplit(8);
+        this.line = new ArrayList<>();
+        Line line = new Line(0);
+        line.setPrice(isNull(price));
+        line.setElectricity(isNull(d));
+        line.setSteam(isNull(stream));
+        line.setWater(isNull(water));
+        this.line.add(line);
+        for (int i = 0; i < avg.length; i++) {
+            Line line1 = new Line(i);
+            line1.setPrice(isNull(price).multiply(BigDecimal.valueOf(8)).multiply(avg[i]).setScale(2, RoundingMode.HALF_UP));
+            line1.setElectricity(isNull(d).multiply(avg[i]).setScale(2, RoundingMode.HALF_UP));
+            line1.setSteam(isNull(stream).multiply(avg[i]).setScale(2, RoundingMode.HALF_UP));
+            line1.setWater(isNull(water).multiply(avg[i]).setScale(2, RoundingMode.HALF_UP));
+            this.line.add(line1);
+        }
+    }
+
+    private BigDecimal isNull(BigDecimal v) {
+        return v != null ? v : BigDecimal.ZERO;
+    }
+
     @Data
     @NoArgsConstructor
     public static class Line {

+ 4 - 4
jjt-biz/src/main/java/com/jjt/biz/vo/YrProdEfficiencyVO.java

@@ -81,14 +81,14 @@ public class YrProdEfficiencyVO {
         this.open = open[line];
         this.energy = BigDecimal.valueOf(2.6d);
         this.ratio = BigDecimal.valueOf(this.open * 100).divide(BigDecimal.valueOf(this.total), 2, RoundingMode.HALF_UP);
-        this.lengthA = BigDecimal.valueOf(3000 + 3000 * random.nextDouble()).multiply(BigDecimal.valueOf(ldt.getHour() / 12f)).setScale(2, RoundingMode.HALF_UP);
-        this.weightA = lengthA.multiply(BigDecimal.valueOf(1.5)).divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP);
+        this.lengthA = BigDecimal.valueOf(5500 + 2000 * random.nextDouble()).multiply(BigDecimal.valueOf(ldt.getHour() / 12f)).setScale(2, RoundingMode.HALF_UP);
+        this.weightA = lengthA.divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP);
         int hour = ldt.getHour() + 1;
         if (hour > 12) {
             this.timeA = BigDecimal.valueOf(12).subtract(BigDecimal.valueOf(hour * 0.25 * random.nextFloat())).setScale(1, RoundingMode.HALF_UP);
             this.effA = timeA.divide(BigDecimal.valueOf(12), 4, RoundingMode.HALF_UP);
-            this.lengthB = BigDecimal.valueOf(3000 + 3000 * random.nextDouble()).multiply(BigDecimal.valueOf((hour - 12) / 12f)).setScale(2, RoundingMode.HALF_UP);
-            this.weightB = lengthB.multiply(BigDecimal.valueOf(1.5)).divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP);
+            this.lengthB = BigDecimal.valueOf(5500 + 2000 * random.nextDouble()).multiply(BigDecimal.valueOf((hour - 12) / 12f)).setScale(2, RoundingMode.HALF_UP);
+            this.weightB = lengthB.divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP);
             this.timeB = BigDecimal.valueOf(hour - 12).subtract(BigDecimal.valueOf((hour - 12) * 0.25 * random.nextFloat())).setScale(1, RoundingMode.HALF_UP);
             this.effB = timeB.divide(BigDecimal.valueOf(hour - 12), 4, RoundingMode.HALF_UP);
         } else {

+ 19 - 0
jjt-biz/src/main/java/com/jjt/biz/vo/YrProdTradeVO.java

@@ -1,11 +1,13 @@
 package com.jjt.biz.vo;
 
+import com.jjt.utils.Tools;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
@@ -37,6 +39,23 @@ public class YrProdTradeVO {
         }
     }
 
+    public void split(BigDecimal length, BigDecimal weight) {
+        BigDecimal[] avg = Tools.balancedRandomSplit(8);
+        this.line = new ArrayList<>();
+        Line line = new Line(0);
+        line.setLength(isNull(length));
+        line.setWeight(isNull(weight));
+        this.line.add(line);
+        for (int i = 0; i < avg.length; i++) {
+            Line line1 = new Line(i);
+            line1.setLength(isNull(length).multiply(avg[i]).setScale(2, RoundingMode.HALF_UP));
+            line1.setWeight(isNull(weight).multiply(avg[i]).setScale(2, RoundingMode.HALF_UP));
+            this.line.add(line1);
+        }
+    }
+    private BigDecimal isNull(BigDecimal v) {
+        return v != null ? v : BigDecimal.ZERO;
+    }
     @Data
     @NoArgsConstructor
     public static class Line {

+ 1 - 1
jjt-biz/src/main/java/com/jjt/task/IndexTask.java

@@ -44,7 +44,7 @@ public class IndexTask {
         } catch (Exception e) {
             e.printStackTrace();
         }
-        apiService.today();
+//        apiService.today();
     }
 
 }

+ 57 - 0
jjt-biz/src/main/java/com/jjt/utils/Tools.java

@@ -389,4 +389,61 @@ public class Tools {
         devices[i] += id;
     }
 
+
+    /**
+     * 生成在平均值附近波动的随机比例
+     *
+     * @param parts 要分割的份数
+     * @return 每份的比例数组(总和为1)
+     */
+    public static BigDecimal[] balancedRandomSplit(int parts) {
+        Random random = new Random();
+        int SCALE = 4; // 保留4小数位数
+        double DEVIATION_PERCENT = 0.25; // 波动幅度
+
+        if (parts <= 0) {
+            throw new IllegalArgumentException("份数必须大于0");
+        }
+
+        BigDecimal average = BigDecimal.ONE.divide(new BigDecimal(parts), SCALE + 2, RoundingMode.HALF_UP);
+        BigDecimal[] proportions = new BigDecimal[parts];
+        BigDecimal remaining = BigDecimal.ONE;
+
+        // 前parts-1次分割
+        for (int i = 0; i < parts - 1; i++) {
+            // 计算允许的波动范围
+            BigDecimal min = average.multiply(BigDecimal.ONE.subtract(new BigDecimal(DEVIATION_PERCENT)))
+                    .max(BigDecimal.ZERO);
+            BigDecimal max = average.multiply(BigDecimal.ONE.add(new BigDecimal(DEVIATION_PERCENT)));
+
+            // 确保剩余比例足够
+            BigDecimal adjustedMax = remaining.subtract(min.multiply(new BigDecimal(parts - i - 1)));
+            max = max.min(adjustedMax);
+
+            // 在范围内随机取值
+            BigDecimal range = max.subtract(min);
+            BigDecimal randomFactor = BigDecimal.valueOf(random.nextDouble());
+            BigDecimal proportion = min.add(range.multiply(randomFactor))
+                    .setScale(SCALE, RoundingMode.HALF_UP);
+
+            proportions[i] = proportion;
+            remaining = remaining.subtract(proportion);
+        }
+
+        // 最后一份
+        proportions[parts - 1] = remaining.setScale(SCALE, RoundingMode.HALF_UP);
+
+        return proportions;
+    }
+
+    /**
+     * BigDecimal空数据处理
+     *
+     * @param v 数据
+     * @return 结果
+     */
+    public static BigDecimal nullProcess(BigDecimal v) {
+        return v == null ? BigDecimal.ZERO : v;
+    }
+
 }

+ 1 - 0
jjt-biz/src/main/java/com/jjt/ws/domain/TwinRzCalcMonth.java

@@ -278,6 +278,7 @@ public class TwinRzCalcMonth extends BaseEntity {
         this.dPrice = isNull(qzPrice).add(isNull(hzPrice)).add(isNull(yrPrice));
         this.qPrice = isNull(this.qLowPrice).add(isNull(this.qMidPrice));
         this.totalPrice = dPrice.add(qPrice).add(isNull(sPrice));
+        this.dUse = isNull(qzUse).add(isNull(hzUse).add(isNull(yrUse)));
     }
 
     private BigDecimal isNull(BigDecimal v) {

+ 12 - 9
jjt-biz/src/main/java/com/jjt/ws/service/impl/TwinRzCalcMonthServiceImpl.java

@@ -16,7 +16,6 @@ import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.util.Date;
 import java.util.List;
-import java.util.Random;
 
 /**
  * 染整月统计Service业务层处理
@@ -178,14 +177,18 @@ public class TwinRzCalcMonthServiceImpl implements ITwinRzCalcMonthService {
 
         }
         vo.setPrice();
-        BigDecimal length = vo.getDPrice().multiply(BigDecimal.valueOf(1.2 + (Math.random()) * 0.5)).setScale(2, RoundingMode.HALF_UP);
-        BigDecimal weight = length.multiply(BigDecimal.valueOf(1.2 + (Math.random()) * 0.5)).divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP);
-        vo.setLength(length);
-        vo.setWeight(weight);
-        BigDecimal lp = vo.getTotalPrice().divide(vo.getLength(), 6, RoundingMode.HALF_UP);
-        vo.setLengthPrice(lp);
-        BigDecimal wp = vo.getTotalPrice().divide(vo.getWeight(), 6, RoundingMode.HALF_UP);
-        vo.setWeightPrice(wp);
+        if (vo.getDPrice().compareTo(BigDecimal.ZERO) != 0) {
+            BigDecimal baseD = BigDecimal.valueOf(45000);
+            BigDecimal baseL = BigDecimal.valueOf(120000).multiply(BigDecimal.valueOf(0.95 + (Math.random()) * 0.1));
+            BigDecimal length = vo.getDPrice().multiply(baseL).divide(baseD, 2, RoundingMode.HALF_UP);
+            BigDecimal weight = length.divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP);
+            vo.setLength(length);
+            vo.setWeight(weight);
+            BigDecimal lp = vo.getTotalPrice().divide(vo.getLength(), 6, RoundingMode.HALF_UP);
+            vo.setLengthPrice(lp);
+            BigDecimal wp = vo.getTotalPrice().divide(vo.getWeight(), 6, RoundingMode.HALF_UP);
+            vo.setWeightPrice(wp);
+        }
         if (vo.getCalcId() != null) {
             updateTwinRzCalcMonth(vo);
         } else {

+ 3 - 0
jjt-biz/src/main/resources/mapper/ws/TwinRzCalcMonthMapper.xml

@@ -84,6 +84,9 @@
             <if test="params.month != null and params.month != ''">
                 and FORMAT(DATA_DATE, 'yyyy-MM') = #{params.month}
             </if>
+            <if test="params.start != null and params.start != ''">
+                and DATA_DATE >= #{params.start}
+            </if>
         </where>
         order by data_date
     </select>