Quellcode durchsuchen

染整线能耗月统计相关操作

wukai vor 1 Monat
Ursprung
Commit
8dd7ca3073

+ 3 - 5
jjt-admin/src/test/java/com/jjt/data/ElecTest.java

@@ -1,19 +1,17 @@
 package com.jjt.data;
 
 import com.jjt.JjtApplication;
-import com.jjt.common.utils.StringUtils;
-import com.jjt.elec.domain.ElecPeriod;
-import com.jjt.elec.domain.ElecPrice;
 import com.jjt.elec.service.IElecPeriodService;
 import com.jjt.elec.service.IElecPriceService;
 import com.jjt.ws.service.ITwinWorkshopCalcService;
+import javafx.util.Pair;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.time.LocalDate;
-import java.util.*;
+import java.util.Map;
 
 /**
  * 印花机
@@ -31,7 +29,7 @@ public class ElecTest {
     void test() {
         String st = "2025-03-07";
         LocalDate localDate = LocalDate.parse(st);
-        Map<Integer, BigDecimal> result=priceService.getPrice(localDate);
+        Map<Integer, Pair<String, BigDecimal>> result = priceService.getPrice(localDate);
         System.err.println(result);
     }
 

+ 10 - 10
jjt-admin/src/test/java/com/jjt/data/EnergyTest.java

@@ -53,9 +53,9 @@ public class EnergyTest {
     @Test
     void test() {
         iotService.setToken();
-        String st = "2025-03-16";
+        String st = "2025-04-10";
         LocalDate localDate = LocalDate.parse(st);
-        LocalDateTime start = LocalDateTime.of(localDate, LocalTime.MIN).plusHours(2);
+        LocalDateTime start = LocalDateTime.of(localDate, LocalTime.MIN).plusHours(7);
         LocalDateTime end = start.plusHours(1);
         LocalDateTime stop = Tools.currWholeTime();
         while (!end.isAfter(stop)) {
@@ -72,14 +72,14 @@ public class EnergyTest {
 
     @Test
     void day() {
-//        for (int i = 8; i < 17; i++) {
-//            String d = "2025-03-" + (i < 10 ? "0" + i : i);
-//            LocalDate localDate = LocalDate.parse(d);
-//            calcService.calc(localDate);
-//        }
+        for (int i = 1; i < 20; i++) {
+            String d = "2025-04-" + (i < 10 ? "0" + i : i);
+            LocalDate localDate = LocalDate.parse(d);
+            calcService.calc(localDate);
+        }
 
-        String d = "2025-04-08";
-        LocalDate localDate = LocalDate.parse(d);
-        calcService.calc(localDate);
+//        String d = "2025-04-08";
+//        LocalDate localDate = LocalDate.parse(d);
+//        calcService.calc(localDate);
     }
 }

+ 3 - 0
jjt-biz/src/main/java/com/jjt/calc/domain/TwinCalcHourEnergy.java

@@ -63,6 +63,9 @@ public class TwinCalcHourEnergy extends BaseEntity {
     private String team;
     @ApiModelProperty("车间ID")
     private Long wsId;
+    @ApiModelProperty("用电类型")
+    private String type;
+
 
     /**
      * 计算价格

+ 9 - 1
jjt-biz/src/main/java/com/jjt/elec/service/IElecPriceService.java

@@ -1,6 +1,7 @@
 package com.jjt.elec.service;
 
 import com.jjt.elec.domain.ElecPrice;
+import javafx.util.Pair;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
@@ -68,5 +69,12 @@ public interface IElecPriceService {
      * @param localDate 时间,只取月份
      * @return 电价
      */
-    Map<Integer, BigDecimal> getPrice(LocalDate localDate);
+    Map<Integer, Pair<String, BigDecimal>> getPrice(LocalDate localDate);
+    /**
+     * 根据年月获取价格
+     * @param year 年
+     * @param month 月
+     * @return 结果
+     */
+    ElecPrice selectElecPriceByMonth(int year, int month);
 }

+ 19 - 11
jjt-biz/src/main/java/com/jjt/elec/service/impl/ElecPriceServiceImpl.java

@@ -6,6 +6,7 @@ import com.jjt.elec.domain.ElecPrice;
 import com.jjt.elec.mapper.ElecPriceMapper;
 import com.jjt.elec.service.IElecPeriodService;
 import com.jjt.elec.service.IElecPriceService;
+import javafx.util.Pair;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -102,7 +103,7 @@ public class ElecPriceServiceImpl implements IElecPriceService {
      * @return 电价
      */
     @Override
-    public Map<Integer, BigDecimal> getPrice(LocalDate localDate) {
+    public Map<Integer, Pair<String, BigDecimal>> getPrice(LocalDate localDate) {
         ElecPeriod period = periodService.selectElecPeriodByPeriodId(1L);
         int year = localDate.getYear();
         int month = localDate.getMonthValue();
@@ -112,7 +113,7 @@ public class ElecPriceServiceImpl implements IElecPriceService {
         boolean isSummerAutumn = getNumbers(period.getSaMonths(), PeriodType.MONTH).contains(month);
 
         // 根据月份和时段获取价格
-        Map<Integer, BigDecimal> result;
+        Map<Integer, Pair<String, BigDecimal>> result;
         // 根据月份和时段获取价格
         if (isSummerAutumn) {
             result = getPriceByPeriod(period.getSaPeak(), period.getSaFlat(), period.getSaValley(), period.getSaSuperPeak(), priceObj);
@@ -126,20 +127,20 @@ public class ElecPriceServiceImpl implements IElecPriceService {
     /**
      * 根据时段获取价格
      */
-    private Map<Integer, BigDecimal> getPriceByPeriod(String peakPeriod, String flatPeriod, String valleyPeriod, String superPeakPeriod, ElecPrice priceObj) {
-        Map<Integer, BigDecimal> map = new HashMap<>();
-        addPricesToMap(map, peakPeriod, priceObj.getPricePeak(), PeriodType.HOUR);
-        addPricesToMap(map, flatPeriod, priceObj.getPriceFlat(), PeriodType.HOUR);
-        addPricesToMap(map, valleyPeriod, priceObj.getPriceValley(), PeriodType.HOUR);
-        addPricesToMap(map, superPeakPeriod, priceObj.getPriceSuperPeak(), PeriodType.HOUR);
+    private Map<Integer, Pair<String, BigDecimal>> getPriceByPeriod(String peakPeriod, String flatPeriod, String valleyPeriod, String superPeakPeriod, ElecPrice priceObj) {
+        Map<Integer, Pair<String, BigDecimal>> map = new HashMap<>();
+        addPricesToMap(map, peakPeriod, priceObj.getPricePeak(), PeriodType.HOUR, "peak");
+        addPricesToMap(map, flatPeriod, priceObj.getPriceFlat(), PeriodType.HOUR, "flat");
+        addPricesToMap(map, valleyPeriod, priceObj.getPriceValley(), PeriodType.HOUR, "valley");
+        addPricesToMap(map, superPeakPeriod, priceObj.getPriceSuperPeak(), PeriodType.HOUR, "superPeak");
         return map;
     }
 
     /**
      * 将指定时段的价格添加到Map中
      */
-    private void addPricesToMap(Map<Integer, BigDecimal> map, String period, BigDecimal price, PeriodType periodType) {
-        getNumbers(period, periodType).forEach(hour -> map.put(hour, price));
+    private void addPricesToMap(Map<Integer, Pair<String, BigDecimal>> map, String period, BigDecimal price, PeriodType periodType, String type) {
+        getNumbers(period, periodType).forEach(hour -> map.put(hour, new Pair<>(type, price)));
     }
 
     /**
@@ -172,7 +173,14 @@ public class ElecPriceServiceImpl implements IElecPriceService {
                 .collect(Collectors.toSet());
     }
 
-    private ElecPrice selectElecPriceByMonth(int year, int month) {
+    /**
+     * 根据年月获取价格
+     * @param year 年
+     * @param month 月
+     * @return 结果
+     */
+    @Override
+    public ElecPrice selectElecPriceByMonth(int year, int month) {
         String monthStr = year + "-" + (month < 10 ? "0" + month : month);
         ElecPrice search = new ElecPrice();
         search.setPriceMonth(monthStr);

+ 1 - 1
jjt-biz/src/main/java/com/jjt/utils/InitService.java

@@ -50,7 +50,7 @@ public class InitService {
             //设置iotToken
             iotService.setToken();
             //补录印花线数据
-            twinCalcHourYhjService.calc2Curr();
+//            twinCalcHourYhjService.calc2Curr();
             //补录能耗数据至当前时间
             twinCalcHourEnergyService.calc2Curr();
             //补录经编车间数据至当前时间

+ 126 - 39
jjt-biz/src/main/java/com/jjt/ws/controller/TwinWorkshopCalcController.java

@@ -1,28 +1,35 @@
 package com.jjt.ws.controller;
 
-import java.util.List;
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
 import com.jjt.common.annotation.Log;
 import com.jjt.common.core.controller.BaseController;
 import com.jjt.common.core.domain.AjaxResult;
+import com.jjt.common.core.page.TableDataInfo;
 import com.jjt.common.enums.BusinessType;
+import com.jjt.common.utils.DateUtils;
+import com.jjt.elec.domain.ElecPrice;
 import com.jjt.ws.domain.TwinWorkshopCalc;
 import com.jjt.ws.service.ITwinWorkshopCalcService;
-import com.jjt.common.utils.poi.ExcelUtil;
-import com.jjt.common.core.page.TableDataInfo;
+import com.jjt.ws.vo.MonthCalcVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * 能源统计Controller
@@ -30,10 +37,10 @@ import com.jjt.common.core.page.TableDataInfo;
  * @author wukai
  * @date 2025-01-17
  */
-@Api(tags="能源统计")
+@Api(tags = "能源统计")
 @RestController
 @RequestMapping("/ws/calc")
-public class TwinWorkshopCalcController extends BaseController{
+public class TwinWorkshopCalcController extends BaseController {
     @Resource
     private ITwinWorkshopCalcService twinWorkshopCalcService;
 
@@ -43,25 +50,109 @@ public class TwinWorkshopCalcController extends BaseController{
     @ApiOperation("查询能源统计列表")
     @PreAuthorize("@ss.hasPermi('ws:calc:list')")
     @GetMapping("/list")
-    public TableDataInfo list(TwinWorkshopCalc twinWorkshopCalc)
-    {
+    public TableDataInfo list(TwinWorkshopCalc twinWorkshopCalc) {
         startPage();
         List<TwinWorkshopCalc> list = twinWorkshopCalcService.selectTwinWorkshopCalcList(twinWorkshopCalc);
         return getDataTable(list);
     }
 
     /**
-     * 导出能源统计列表
+     * 查询能源统计列表
      */
+    @ApiOperation("查询能源统计月报")
+    @GetMapping("/calc/rz")
+    public TableDataInfo calcRz(TwinWorkshopCalc twinWorkshopCalc) {
+        List<MonthCalcVO> list = twinWorkshopCalcService.calcYr(twinWorkshopCalc);
+        return getDataTable(list);
+    }
+
     @ApiOperation("导出能源统计列表")
-    @PreAuthorize("@ss.hasPermi('ws:calc:export')")
-    @Log(title = "能源统计", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, TwinWorkshopCalc twinWorkshopCalc)
-    {
-        List<TwinWorkshopCalc> list = twinWorkshopCalcService.selectTwinWorkshopCalcList(twinWorkshopCalc);
-        ExcelUtil<TwinWorkshopCalc> util = new ExcelUtil<TwinWorkshopCalc>(TwinWorkshopCalc.class);
-        util.exportExcel(response, list, "能源统计数据");
+    @RequestMapping("/export/rz")
+    public void exportRz(TwinWorkshopCalc twinWorkshopCalc, HttpServletResponse response) {
+        List<MonthCalcVO> list = twinWorkshopCalcService.calcYr(twinWorkshopCalc);
+        try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("tpl/yr-energy-month.xlsx"); Workbook wb = new XSSFWorkbook(inputStream); OutputStream outputStream = new BufferedOutputStream(response.getOutputStream())) {
+            Sheet sheet = wb.getSheetAt(0);
+            AtomicInteger colNum = new AtomicInteger(2);
+            int rowNum = 31;
+            AtomicReference<ElecPrice> elecPrice = new AtomicReference<>(new ElecPrice());
+            list.forEach(vo -> {
+                elecPrice.set(vo.getElecPrice());
+                Cell[] cells = new Cell[rowNum];
+                for (int i = 0; i < rowNum; i++) {
+                    Row row = sheet.getRow(i);
+                    cells[i] = row.getCell(colNum.get());
+                }
+                cells[0].setCellValue(DateUtils.parseDateToStrCN(vo.getDate()));
+                cells[1].setCellValue(vo.getD().getQz().getUse().doubleValue());
+                cells[2].setCellValue(vo.getD().getQz().getFUse().doubleValue());
+                cells[3].setCellValue(vo.getD().getQz().getGUse().doubleValue());
+                cells[4].setCellValue(vo.getD().getQz().getPUse().doubleValue());
+                if (vo.getD().getQz().getJfUse() != null) {
+                    cells[5].setCellValue(vo.getD().getQz().getJfUse().doubleValue());
+                }
+                cells[6].setCellValue(vo.getD().getQz().getPrice().doubleValue());
+
+                cells[7].setCellValue(vo.getD().getHz().getUse().doubleValue());
+                cells[8].setCellValue(vo.getD().getHz().getFUse().doubleValue());
+                cells[9].setCellValue(vo.getD().getHz().getGUse().doubleValue());
+                cells[10].setCellValue(vo.getD().getHz().getPUse().doubleValue());
+                if (vo.getD().getHz().getJfUse() != null) {
+                    cells[11].setCellValue(vo.getD().getHz().getJfUse().doubleValue());
+                }
+                cells[12].setCellValue(vo.getD().getHz().getPrice().doubleValue());
+
+                cells[13].setCellValue(vo.getD().getYr().getUse().doubleValue());
+                cells[14].setCellValue(vo.getD().getYr().getFUse().doubleValue());
+                cells[15].setCellValue(vo.getD().getYr().getGUse().doubleValue());
+                cells[16].setCellValue(vo.getD().getYr().getPUse().doubleValue());
+                if (vo.getD().getYr().getJfUse() != null) {
+                    cells[17].setCellValue(vo.getD().getYr().getJfUse().doubleValue());
+                }
+                cells[18].setCellValue(vo.getD().getYr().getPrice().doubleValue());
+                cells[19].setCellValue(vo.getD().getPrice().doubleValue());
+
+                cells[20].setCellValue(vo.getS().getUse().doubleValue());
+                cells[21].setCellValue(vo.getS().getPrice().doubleValue());
+
+                cells[22].setCellValue(vo.getQ().getLowUse().doubleValue());
+                cells[23].setCellValue(vo.getQ().getLowPrice().doubleValue());
+                cells[24].setCellValue(vo.getQ().getMidUse().doubleValue());
+                cells[25].setCellValue(vo.getQ().getMidPrice().doubleValue());
+
+                cells[26].setCellValue(vo.getPrice().doubleValue());
+                cells[27].setCellValue("");
+                cells[28].setCellValue("");
+                cells[29].setCellValue("");
+                cells[30].setCellValue("");
+                colNum.getAndIncrement();
+            });
+
+            Cell[] cells = new Cell[rowNum];
+            for (int i = 0; i < rowNum; i++) {
+                Row row = sheet.getRow(i);
+                cells[i] = row.getCell(1);
+            }
+
+            cells[2].setCellValue("峰电(kwh/"+elecPrice.get().getPricePeak()+")");
+            cells[3].setCellValue("谷电(kwh/"+elecPrice.get().getPriceValley()+")");
+            cells[4].setCellValue("平电(kwh/"+elecPrice.get().getPriceFlat()+")");
+            cells[5].setCellValue("尖峰(kwh/"+elecPrice.get().getPriceSuperPeak()+")");
+
+            wb.removeSheetAt(1);
+            // 清空response
+            response.reset();
+            // 设置response的Header
+            response.setCharacterEncoding("UTF-8");
+            //Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存
+            //attachment表示以附件方式下载 inline表示在线打开 "Content-Disposition: inline; filename=文件名.mp3"
+            // filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
+            response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("染整线统计" + DateUtils.dateTimeNow() + ".xlsx", "UTF-8"));
+            response.setContentType("application/octet-stream");
+            wb.write(outputStream);
+            outputStream.flush();
+        } catch (IOException ex) {
+            ex.printStackTrace();
+        }
     }
 
     /**
@@ -70,8 +161,7 @@ public class TwinWorkshopCalcController extends BaseController{
     @ApiOperation("获取能源统计详细信息")
     @PreAuthorize("@ss.hasPermi('ws:calc:query')")
     @GetMapping(value = "/{calcId}")
-    public AjaxResult getInfo(@PathVariable("calcId") Long calcId)
-    {
+    public AjaxResult getInfo(@PathVariable("calcId") Long calcId) {
         return success(twinWorkshopCalcService.selectTwinWorkshopCalcByCalcId(calcId));
     }
 
@@ -82,8 +172,7 @@ public class TwinWorkshopCalcController extends BaseController{
     @PreAuthorize("@ss.hasPermi('ws:calc:add')")
     @Log(title = "能源统计", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@RequestBody TwinWorkshopCalc twinWorkshopCalc)
-    {
+    public AjaxResult add(@RequestBody TwinWorkshopCalc twinWorkshopCalc) {
         return toAjax(twinWorkshopCalcService.insertTwinWorkshopCalc(twinWorkshopCalc));
     }
 
@@ -94,8 +183,7 @@ public class TwinWorkshopCalcController extends BaseController{
     @PreAuthorize("@ss.hasPermi('ws:calc:edit')")
     @Log(title = "能源统计", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@RequestBody TwinWorkshopCalc twinWorkshopCalc)
-    {
+    public AjaxResult edit(@RequestBody TwinWorkshopCalc twinWorkshopCalc) {
         return toAjax(twinWorkshopCalcService.updateTwinWorkshopCalc(twinWorkshopCalc));
     }
 
@@ -105,9 +193,8 @@ public class TwinWorkshopCalcController extends BaseController{
     @ApiOperation("删除能源统计")
     @PreAuthorize("@ss.hasPermi('ws:calc:remove')")
     @Log(title = "能源统计", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{calcIds}")
-    public AjaxResult remove(@PathVariable Long[] calcIds)
-    {
+    @DeleteMapping("/{calcIds}")
+    public AjaxResult remove(@PathVariable Long[] calcIds) {
         return toAjax(twinWorkshopCalcService.deleteTwinWorkshopCalcByCalcIds(calcIds));
     }
 }

+ 84 - 0
jjt-biz/src/main/java/com/jjt/ws/domain/TwinWorkshopCalc.java

@@ -96,6 +96,90 @@ public class TwinWorkshopCalc extends BaseEntity {
     @JsonProperty("bValue")
     private BigDecimal bValue;
 
+    /**
+     * 峰电电价
+     */
+    @ApiModelProperty("峰电电价")
+    @Excel(name = "峰电电价")
+    private BigDecimal peakUPrice;
+
+    /**
+     * 谷电电价
+     */
+    @ApiModelProperty("谷电电价")
+    @Excel(name = "谷电电价")
+    private BigDecimal valleyUPrice;
+
+    /**
+     * 平电电价
+     */
+    @ApiModelProperty("平电电价")
+    @Excel(name = "平电电价")
+    private BigDecimal flatUPrice;
+
+    /**
+     * 尖峰电价
+     */
+    @ApiModelProperty("尖峰电价")
+    @Excel(name = "尖峰电价")
+    private BigDecimal superPeakUPrice;
+
+    /**
+     * 峰电电费
+     */
+    @ApiModelProperty("峰电电费")
+    @Excel(name = "峰电电费")
+    private BigDecimal peakTPrice;
+
+    /**
+     * 谷电电费
+     */
+    @ApiModelProperty("谷电电费")
+    @Excel(name = "谷电电费")
+    private BigDecimal valleyTPrice;
+
+    /**
+     * 平电电费
+     */
+    @ApiModelProperty("平电电费")
+    @Excel(name = "平电电费")
+    private BigDecimal flatTPrice;
+
+    /**
+     * 尖峰电费
+     */
+    @ApiModelProperty("尖峰电费")
+    @Excel(name = "尖峰电费")
+    private BigDecimal superPeakTPrice;
+
+    /**
+     * 峰电用能
+     */
+    @ApiModelProperty("峰电用能")
+    @Excel(name = "峰电用能")
+    private BigDecimal peakValue;
+
+    /**
+     * 谷电用能
+     */
+    @ApiModelProperty("谷电用能")
+    @Excel(name = "谷电用能")
+    private BigDecimal valleyValue;
+
+    /**
+     * 平电用能
+     */
+    @ApiModelProperty("平电用能")
+    @Excel(name = "平电用能")
+    private BigDecimal flatValue;
+
+    /**
+     * 尖峰用能
+     */
+    @ApiModelProperty("尖峰用能")
+    @Excel(name = "尖峰用能")
+    private BigDecimal superPeakValue;
+
     public void setValue(BigDecimal aValue, BigDecimal bValue) {
         this.aValue = aValue == null ? BigDecimal.ZERO : aValue;
         this.bValue = bValue == null ? BigDecimal.ZERO : bValue;

+ 8 - 0
jjt-biz/src/main/java/com/jjt/ws/service/ITwinWorkshopCalcService.java

@@ -1,6 +1,7 @@
 package com.jjt.ws.service;
 
 import com.jjt.ws.domain.TwinWorkshopCalc;
+import com.jjt.ws.vo.MonthCalcVO;
 
 import java.time.LocalDate;
 import java.util.Date;
@@ -94,4 +95,11 @@ public interface ITwinWorkshopCalcService {
      * @return 结果
      */
     List<TwinWorkshopCalc> listByWsCodeDate(String wsCode, Date date);
+
+    /**
+     * 染整线月统计
+     * @param twinWorkshopCalc 查询条件
+     * @return 结果
+     */
+    List<MonthCalcVO> calcYr(TwinWorkshopCalc twinWorkshopCalc);
 }

+ 140 - 2
jjt-biz/src/main/java/com/jjt/ws/service/impl/TwinWorkshopCalcServiceImpl.java

@@ -3,6 +3,8 @@ package com.jjt.ws.service.impl;
 import com.jjt.calc.domain.TwinCalcHourEnergy;
 import com.jjt.calc.service.ITwinCalcHourEnergyService;
 import com.jjt.common.utils.DateUtils;
+import com.jjt.common.utils.StringUtils;
+import com.jjt.elec.domain.ElecPrice;
 import com.jjt.elec.service.IElecPriceService;
 import com.jjt.ws.domain.TwinWorkshop;
 import com.jjt.ws.domain.TwinWorkshopCalc;
@@ -10,6 +12,8 @@ import com.jjt.ws.domain.TwinWorkshopEnergy;
 import com.jjt.ws.mapper.TwinWorkshopCalcMapper;
 import com.jjt.ws.service.ITwinWorkshopCalcService;
 import com.jjt.ws.service.ITwinWorkshopService;
+import com.jjt.ws.vo.MonthCalcVO;
+import javafx.util.Pair;
 import org.apache.ibatis.session.ExecutorType;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
@@ -127,7 +131,7 @@ public class TwinWorkshopCalcServiceImpl implements ITwinWorkshopCalcService {
         });
         //获取统计数据
         List<TwinCalcHourEnergy> energyList = energyService.selectTwinEmpCalcListByDate(date);
-        Map<Integer, BigDecimal> elecPrice = elecPriceService.getPrice(localDate);
+        Map<Integer, Pair<String, BigDecimal>> elecPrice = elecPriceService.getPrice(localDate);
         energyList.forEach(obj -> {
             obj.setTeam();
             TwinWorkshopEnergy energy = wsMap.get(obj.getEnergyId());
@@ -137,7 +141,11 @@ public class TwinWorkshopCalcServiceImpl implements ITwinWorkshopCalcService {
                     obj.calcPrice(BigDecimal.valueOf(4.7));
                     break;
                 case "2"://电
-                    obj.calcPrice(elecPrice.get(obj.getHour()));
+                    Pair<String, BigDecimal> pair = elecPrice.get(obj.getHour());
+                    if (pair != null) {
+                        obj.calcPrice(pair.getValue());
+                        obj.setType(pair.getKey() + "," + pair.getValue());
+                    }
                     break;
                 case "3"://油
                     // break;
@@ -164,6 +172,7 @@ public class TwinWorkshopCalcServiceImpl implements ITwinWorkshopCalcService {
                             }
                     )));
 
+
             TwinWorkshopCalc calc = new TwinWorkshopCalc();
             calc.setWsId(wsId);
             calc.setDataDate(date);
@@ -181,6 +190,52 @@ public class TwinWorkshopCalcServiceImpl implements ITwinWorkshopCalcService {
             }
             calc.setValue(totalA, totalB);
             calc.setPrice(priceA, priceB);
+
+            //按用电类型统计用量和价格
+            Map<String, TwinWorkshopCalc> dMap = calcMap.get(wsId).stream().filter(o -> StringUtils.isNotEmpty(o.getType())).collect(Collectors.groupingBy(TwinCalcHourEnergy::getType,
+                    Collectors.collectingAndThen(
+                            Collectors.toList(),
+                            list -> {
+                                BigDecimal v = list.stream().map(TwinCalcHourEnergy::getDataValue).reduce(BigDecimal.ZERO, BigDecimal::add);
+                                BigDecimal p = list.stream().map(TwinCalcHourEnergy::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+                                TwinWorkshopCalc c = new TwinWorkshopCalc();
+                                c.setTotalPrice(p);
+                                c.setTotalValue(v);
+                                return c;
+                            }
+                    )));
+            if (dMap != null) {
+                for (String type : dMap.keySet()) {
+                    String[] tmp = type.split(",");
+                    TwinWorkshopCalc c = dMap.get(type);
+                    String tt = tmp[0];
+                    BigDecimal price = new BigDecimal(tmp[1]);
+                    switch (tt) {
+                        case "peak":
+                            calc.setPeakUPrice(price);
+                            calc.setPeakTPrice(c.getTotalPrice());
+                            calc.setPeakValue(c.getTotalValue());
+                            break;
+                        case "flat":
+                            calc.setFlatUPrice(price);
+                            calc.setFlatTPrice(c.getTotalPrice());
+                            calc.setFlatValue(c.getTotalValue());
+                            break;
+                        case "valley":
+                            calc.setValleyUPrice(price);
+                            calc.setValleyTPrice(c.getTotalPrice());
+                            calc.setValleyValue(c.getTotalValue());
+                            break;
+                        case "superPeak":
+                            calc.setSuperPeakUPrice(price);
+                            calc.setSuperPeakTPrice(c.getTotalPrice());
+                            calc.setSuperPeakValue(c.getTotalValue());
+                            break;
+                        default:
+                    }
+                }
+            }
+
             calcList.add(calc);
 
         }
@@ -232,4 +287,87 @@ public class TwinWorkshopCalcServiceImpl implements ITwinWorkshopCalcService {
     public List<TwinWorkshopCalc> listByWsCodeDate(String wsCode, Date date) {
         return twinWorkshopCalcMapper.listByWsCodeDate(wsCode, date);
     }
+
+    /**
+     * 染整线月统计
+     *
+     * @param twinWorkshopCalc 查询条件
+     * @return 结果
+     */
+    @Override
+    public List<MonthCalcVO> calcYr(TwinWorkshopCalc twinWorkshopCalc) {
+        String para = (String) twinWorkshopCalc.getParams().get("month");
+        int year = Integer.parseInt(para.split("-")[0]);
+        int month = Integer.parseInt(para.split("-")[1]);
+        ElecPrice elecPrice = elecPriceService.selectElecPriceByMonth(year, month);
+        List<MonthCalcVO> result = new ArrayList<>();
+        List<TwinWorkshopCalc> list = selectTwinWorkshopCalcList(twinWorkshopCalc);
+        list.sort(Comparator.comparing(TwinWorkshopCalc::getDataDate));
+        //按日期分组
+        Map<Date, List<TwinWorkshopCalc>> allMap = list.stream().collect(Collectors.groupingBy(TwinWorkshopCalc::getDataDate, LinkedHashMap::new, Collectors.toList()));
+        for (Date date : allMap.keySet()) {
+            List<TwinWorkshopCalc> todList = allMap.get(date);
+            MonthCalcVO vo = new MonthCalcVO();
+            vo.setDate(date);
+            vo.setElecPrice(elecPrice);
+            for (TwinWorkshopCalc calc : todList) {
+                switch (calc.getWsCode()) {
+                    case "WS03-D-QZ":
+                        setWorkshopData(vo.getD().getQz(), calc);
+                        break;
+                    case "WS03-D-HZ":
+                        setWorkshopData(vo.getD().getHz(), calc);
+                        break;
+                    case "WS03-D-YR":
+                        setWorkshopData(vo.getD().getYr(), calc);
+                        break;
+                    case "WS03-S-YR":
+                        MonthCalcVO.S s = vo.getS();
+                        s.setPrice(calc.getTotalPrice());
+                        s.setUse(calc.getTotalValue());
+                        break;
+                    case "WS03-Q-DY":
+                        setQuarterData(vo.getQ(), calc, BigDecimal.valueOf(257), "low");
+                        break;
+                    case "WS03-Q-ZY":
+                        setQuarterData(vo.getQ(), calc, BigDecimal.valueOf(223), "mid");
+                        break;
+                    default:
+                }
+
+            }
+            vo.setPrice();
+            result.add(vo);
+        }
+        return result;
+    }
+
+    private void setWorkshopData(MonthCalcVO.D.DD dd, TwinWorkshopCalc calc) {
+        dd.setUse(calc.getTotalValue());
+        dd.setPrice(calc.getTotalPrice());
+        dd.setFPrice(calc.getPeakUPrice());
+        dd.setFUse(calc.getPeakValue());
+        dd.setPPrice(calc.getFlatUPrice());
+        dd.setPUse(calc.getFlatValue());
+        dd.setGPrice(calc.getValleyUPrice());
+        dd.setGUse(calc.getValleyValue());
+        dd.setJfPrice(calc.getSuperPeakUPrice());
+        dd.setJfUse(calc.getSuperPeakValue());
+    }
+
+    private void setQuarterData(MonthCalcVO.Q q, TwinWorkshopCalc calc, BigDecimal unitPrice, String type) {
+        switch (type) {
+            case "low":
+                q.setLowPrice(calc.getTotalPrice());
+                q.setLowUse(calc.getTotalValue());
+                q.setLowUnitPrice(unitPrice);
+                break;
+            case "mid":
+                q.setMidPrice(calc.getTotalPrice());
+                q.setMidUse(calc.getTotalValue());
+                q.setMidUnitPrice(unitPrice);
+                break;
+            default:
+        }
+    }
 }

+ 146 - 0
jjt-biz/src/main/java/com/jjt/ws/vo/MonthCalcVO.java

@@ -0,0 +1,146 @@
+package com.jjt.ws.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jjt.common.annotation.Excel;
+import com.jjt.elec.domain.ElecPrice;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 能耗
+ *
+ * @author ruoyi
+ * @date 2024-12-30
+ */
+@Data
+@ApiModel(value = "MonthCalcVO", description = "月统计视图")
+public class MonthCalcVO {
+    private static final long serialVersionUID = 1L;
+
+    public MonthCalcVO() {
+        this.d = new D();
+        this.s = new S();
+        this.q = new Q();
+    }
+
+    @ApiModelProperty("日期")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date date;
+    @ApiModelProperty("电价")
+    private ElecPrice elecPrice;
+    @ApiModelProperty(name = "总费用")
+    private BigDecimal price;
+    @ApiModelProperty(name = "米长")
+    private BigDecimal length;
+    @ApiModelProperty(name = "重量")
+    private BigDecimal weight;
+    @ApiModelProperty(name = "平均每米费用")
+    private BigDecimal avgLengthPrice;
+    @ApiModelProperty(name = "平均每KG费用")
+    private BigDecimal avgWeightPrice;
+    @ApiModelProperty(name = "电")
+    private D d;
+
+    @ApiModelProperty(name = "水")
+    private S s;
+
+    @ApiModelProperty(name = "汽")
+    private Q q;
+
+    public void setPrice() {
+        BigDecimal dPrice = d.getQz().getPrice().add(d.getHz().getPrice()).add(d.getYr().getPrice());
+        d.setPrice(dPrice);
+        BigDecimal qPrice = q.getLowPrice();
+        if (q.getMidPrice() != null) {
+            qPrice = qPrice.add(q.getMidPrice());
+        }
+        q.setPrice(qPrice);
+        BigDecimal sPrice = s.getPrice();
+        this.price = dPrice.add(qPrice).add(sPrice);
+    }
+
+
+    @Data
+    public static class D {
+        public D() {
+            this.qz = new DD();
+            this.hz = new DD();
+            this.yr = new DD();
+            this.price = BigDecimal.ZERO;
+        }
+
+        @ApiModelProperty("电总费用")
+        private BigDecimal price;
+        @ApiModelProperty("前整车间")
+        private DD qz;
+        @ApiModelProperty("后整车间")
+        private DD hz;
+        @ApiModelProperty("印染车间")
+        private DD yr;
+
+        @Data
+        public static class DD {
+            private BigDecimal use;
+            private BigDecimal fUse;
+            private BigDecimal gUse;
+            private BigDecimal pUse;
+            private BigDecimal jfUse;
+            private BigDecimal price;
+            private BigDecimal fPrice;
+            private BigDecimal gPrice;
+            private BigDecimal pPrice;
+            private BigDecimal jfPrice;
+        }
+    }
+
+    @Data
+    public static class S {
+        @ApiModelProperty("水总费用")
+        private BigDecimal price;
+        @ApiModelProperty("水用量")
+        private BigDecimal use;
+        @ApiModelProperty("单价")
+        private BigDecimal unitPrice;
+        @ApiModelProperty("水洗用量")
+        private BigDecimal sxUse;
+        @ApiModelProperty("水洗价格")
+        private BigDecimal sxPrice;
+        @ApiModelProperty("调浆用量")
+        private BigDecimal tjUse;
+        @ApiModelProperty("调浆价格")
+        private BigDecimal tjPrice;
+        @ApiModelProperty("洗版用量")
+        private BigDecimal xbUse;
+        @ApiModelProperty("洗版价格")
+        private BigDecimal xbPrice;
+        @ApiModelProperty("制版用量")
+        private BigDecimal zbUse;
+        @ApiModelProperty("制版价格")
+        private BigDecimal zbPrice;
+    }
+
+    @Data
+    public static class Q {
+        @ApiModelProperty("汽总费用")
+        private BigDecimal price;
+        @ApiModelProperty("低压用量")
+        private BigDecimal lowUse;
+        @ApiModelProperty("低压单价")
+        private BigDecimal lowUnitPrice;
+        @ApiModelProperty("低压总价")
+        private BigDecimal lowPrice;
+        @ApiModelProperty("中压用量")
+        private BigDecimal midUse;
+        @ApiModelProperty("中压单价")
+        private BigDecimal midUnitPrice;
+        @ApiModelProperty("中压总价")
+        private BigDecimal midPrice;
+    }
+
+
+}

+ 66 - 1
jjt-biz/src/main/resources/mapper/ws/TwinWorkshopCalcMapper.xml

@@ -16,6 +16,18 @@
         <result property="totalValue" column="TOTAL_VALUE"/>
         <result property="aValue" column="A_VALUE"/>
         <result property="bValue" column="B_VALUE"/>
+        <result property="peakUPrice" column="PEAK_U_PRICE"/>
+        <result property="valleyUPrice" column="VALLEY_U_PRICE"/>
+        <result property="flatUPrice" column="FLAT_U_PRICE"/>
+        <result property="superPeakUPrice" column="SUPER_PEAK_U_PRICE"/>
+        <result property="peakTPrice" column="PEAK_T_PRICE"/>
+        <result property="valleyTPrice" column="VALLEY_T_PRICE"/>
+        <result property="flatTPrice" column="FLAT_T_PRICE"/>
+        <result property="superPeakTPrice" column="SUPER_PEAK_T_PRICE"/>
+        <result property="peakValue" column="PEAK_VALUE"/>
+        <result property="valleyValue" column="VALLEY_VALUE"/>
+        <result property="flatValue" column="FLAT_VALUE"/>
+        <result property="superPeakValue" column="SUPER_PEAK_VALUE"/>
     </resultMap>
 
     <sql id="selectTwinWorkshopCalcVo">
@@ -29,6 +41,18 @@
                      TOTAL_VALUE,
                      A_VALUE,
                      B_VALUE,
+                     PEAK_U_PRICE,
+                     VALLEY_U_PRICE,
+                     FLAT_U_PRICE,
+                     SUPER_PEAK_U_PRICE,
+                     PEAK_T_PRICE,
+                     VALLEY_T_PRICE,
+                     FLAT_T_PRICE,
+                     SUPER_PEAK_T_PRICE,
+                     PEAK_VALUE,
+                     VALLEY_VALUE,
+                     FLAT_VALUE,
+                     SUPER_PEAK_VALUE,
                      B.WS_CODE,
                      b.WS_NAME
               FROM TWIN_WORKSHOP_CALC A,
@@ -47,7 +71,12 @@
             <if test="totalValue != null ">and TOTAL_VALUE = #{totalValue}</if>
             <if test="aValue != null ">and A_VALUE = #{aValue}</if>
             <if test="bValue != null ">and B_VALUE = #{bValue}</if>
-            <if test="params.beginDataDate != null and params.beginDataDate != '' and params.endDataDate != null and params.endDataDate != ''"> and DATA_DATE between #{params.beginDataDate} and #{params.endDataDate}</if>
+            <if test="params.beginDataDate != null and params.beginDataDate != '' and params.endDataDate != null and params.endDataDate != ''">
+                and DATA_DATE between #{params.beginDataDate} and #{params.endDataDate}
+            </if>
+            <if test="params.month != null and params.month != ''">
+                and FORMAT(DATA_DATE, 'yyyy-MM') = #{params.month}
+            </if>
         </where>
         order by DATA_DATE desc
     </select>
@@ -83,6 +112,18 @@
             <if test="totalValue != null">TOTAL_VALUE,</if>
             <if test="aValue != null">A_VALUE,</if>
             <if test="bValue != null">B_VALUE,</if>
+            <if test="peakUPrice != null">PEAK_U_PRICE,</if>
+            <if test="valleyUPrice != null">VALLEY_U_PRICE,</if>
+            <if test="flatUPrice != null">FLAT_U_PRICE,</if>
+            <if test="superPeakUPrice != null">SUPER_PEAK_U_PRICE,</if>
+            <if test="peakTPrice != null">PEAK_T_PRICE,</if>
+            <if test="valleyTPrice != null">VALLEY_T_PRICE,</if>
+            <if test="flatTPrice != null">FLAT_T_PRICE,</if>
+            <if test="superPeakTPrice != null">SUPER_PEAK_T_PRICE,</if>
+            <if test="peakValue != null">PEAK_VALUE,</if>
+            <if test="valleyValue != null">VALLEY_VALUE,</if>
+            <if test="flatValue != null">FLAT_VALUE,</if>
+            <if test="superPeakValue != null">SUPER_PEAK_VALUE,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="dataDate != null">#{dataDate},</if>
@@ -93,6 +134,18 @@
             <if test="totalValue != null">#{totalValue},</if>
             <if test="aValue != null">#{aValue},</if>
             <if test="bValue != null">#{bValue},</if>
+            <if test="peakUPrice != null">#{peakUPrice},</if>
+            <if test="valleyUPrice != null">#{valleyUPrice},</if>
+            <if test="flatUPrice != null">#{flatUPrice},</if>
+            <if test="superPeakUPrice != null">#{superPeakUPrice},</if>
+            <if test="peakTPrice != null">#{peakTPrice},</if>
+            <if test="valleyTPrice != null">#{valleyTPrice},</if>
+            <if test="flatTPrice != null">#{flatTPrice},</if>
+            <if test="superPeakTPrice != null">#{superPeakTPrice},</if>
+            <if test="peakValue != null">#{peakValue},</if>
+            <if test="valleyValue != null">#{valleyValue},</if>
+            <if test="flatValue != null">#{flatValue},</if>
+            <if test="superPeakValue != null">#{superPeakValue},</if>
         </trim>
     </insert>
 
@@ -107,6 +160,18 @@
             <if test="totalValue != null">TOTAL_VALUE = #{totalValue},</if>
             <if test="aValue != null">A_VALUE = #{aValue},</if>
             <if test="bValue != null">B_VALUE = #{bValue},</if>
+            <if test="peakUPrice != null">PEAK_U_PRICE = #{peakUPrice},</if>
+            <if test="valleyUPrice != null">VALLEY_U_PRICE = #{valleyUPrice},</if>
+            <if test="flatUPrice != null">FLAT_U_PRICE = #{flatUPrice},</if>
+            <if test="superPeakUPrice != null">SUPER_PEAK_U_PRICE = #{superPeakUPrice},</if>
+            <if test="peakTPrice != null">PEAK_T_PRICE = #{peakTPrice},</if>
+            <if test="valleyTPrice != null">VALLEY_T_PRICE = #{valleyTPrice},</if>
+            <if test="flatTPrice != null">FLAT_T_PRICE = #{flatTPrice},</if>
+            <if test="superPeakTPrice != null">SUPER_PEAK_T_PRICE = #{superPeakTPrice},</if>
+            <if test="peakValue != null">PEAK_VALUE = #{peakValue},</if>
+            <if test="valleyValue != null">VALLEY_VALUE = #{valleyValue},</if>
+            <if test="flatValue != null">FLAT_VALUE = #{flatValue},</if>
+            <if test="superPeakValue != null">SUPER_PEAK_VALUE = #{superPeakValue},</if>
         </trim>
         where CALC_ID = #{calcId}
     </update>

BIN
jjt-biz/src/main/resources/tpl/yr-energy-month.xlsx


+ 4 - 0
jjt-common/src/main/java/com/jjt/common/utils/DateUtils.java

@@ -72,6 +72,10 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
         return new SimpleDateFormat(YYYY_MM_DD).format(date);
     }
 
+    public static final String parseDateToStrCN(final Date date) {
+        return new SimpleDateFormat("M月d日").format(date);
+    }
+
     public static final Date dateTime(final String format, final String ts) {
         try {
             return new SimpleDateFormat(format).parse(ts);