Browse Source

碳资产分析-列表

2025年2月25日13:28:23
qingyuan_dev_new
lishuai 11 months ago
parent
commit
942a34224c
  1. 22
      modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/controller/QyCarbonAssetController.java
  2. 6
      modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/dto/QyCarbonAssetDTO.java
  3. 2
      modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/dto/QyCarbonQuotaInfoDTO.java
  4. 2
      modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/dto/QyCcerInfoDTO.java
  5. 3
      modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/dto/QyGreenCertificateInfoDTO.java
  6. 2
      modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/entity/QyCarbonQuotaInfoEntity.java
  7. 2
      modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/entity/QyCcerInfoEntity.java
  8. 1
      modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/entity/QyGreenCertificateInfoEntity.java
  9. 3
      modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/service/QyCarbonAssetService.java
  10. 219
      modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/service/impl/QyCarbonAssetServiceImpl.java
  11. 14
      modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/service/impl/QyCarbonQuotaInfoServiceImpl.java

22
modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/controller/QyCarbonAssetController.java

@ -1,10 +1,14 @@
package com.thing.qingyuan.carbon.controller;
import com.thing.common.core.constants.Constant;
import com.thing.common.core.web.response.PageData;
import com.thing.common.core.web.response.Result;
import com.thing.qingyuan.carbon.dto.QyCarbonAssetDTO;
import com.thing.qingyuan.carbon.service.QyCarbonAssetService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
@ -50,12 +54,18 @@ public class QyCarbonAssetController {
* 获取碳资产对应标签的单价,数量,余额,账户总余额
* @return 返回一个Map
*/
@GetMapping("list")
@Operation(summary = "获取碳资产对应标签的单价,数量,余额,账户总余额")
public Result<Map<String, String>> calculateAsset(@RequestParam("startTime") String startTime,
@RequestParam("endTime") String endTime) {
Map<String, String> unitPrice = qyCarbonAssetService.calculateAsset(startTime,endTime);
return new Result<Map<String, String>>().ok(unitPrice);
@GetMapping("page")
@Parameters({
@Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true) ,
@Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true) ,
@Parameter(name = "state", description = "状态", required = true) ,
@Parameter(name = Constant.ORDER_FIELD, description = "排序字段") ,
@Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)")
})
@Operation(summary = "分页获取碳资产对应标签的单价,数量,余额,账户总余额")
public Result<PageData<QyCarbonAssetDTO>> calculateAsset(@Parameter(hidden = true) @RequestParam Map<String, Object> params) {
PageData<QyCarbonAssetDTO> unitPrice = qyCarbonAssetService.calculateAsset(params);
return new Result<PageData<QyCarbonAssetDTO>>().ok(unitPrice);
}

6
modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/dto/QyCarbonAssetDTO.java

@ -16,8 +16,6 @@ public class QyCarbonAssetDTO implements Serializable {
@Schema(description = "交易时间")
private Long issueDate;
@Schema(description = "交易性质")
private String nature;
@Schema(description = "碳资产标签")
private String tag;
@Schema(description = "单价")
@ -27,8 +25,8 @@ public class QyCarbonAssetDTO implements Serializable {
@Schema(description = "价格")
private BigDecimal price;
@Schema(description = "账户余额")
private BigDecimal accountBalance;
@Schema(description = "碳资产状态:1.待发 2.已发 3.买入 4.核销 5.卖出 ")
private BigDecimal balance;
@Schema(description = "交易性质(碳资产状态:1.待发 2.已发 3.买入 4.核销 5.卖出) ")
private String state;
public QyCarbonAssetDTO() {

2
modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/dto/QyCarbonQuotaInfoDTO.java

@ -57,5 +57,7 @@ public class QyCarbonQuotaInfoDTO implements Serializable {
private Long deptId;
@Schema(description = "价格")
private BigDecimal price;
@Schema(description = "所属标签")
private String tag="碳配额";
}

2
modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/dto/QyCcerInfoDTO.java

@ -54,4 +54,6 @@ public class QyCcerInfoDTO implements Serializable {
private Long companyId;
@Schema(description = "部门id")
private Long deptId;
@Schema(description = "所属标签")
private String tag="CCER";
}

3
modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/dto/QyGreenCertificateInfoDTO.java

@ -53,6 +53,7 @@ public class QyGreenCertificateInfoDTO implements Serializable {
private String company;
@Schema(description = "绿证价格")
private BigDecimal price;
@Schema(description = "所属标签")
private String tag="绿证";
}

2
modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/entity/QyCarbonQuotaInfoEntity.java

@ -70,5 +70,7 @@ public class QyCarbonQuotaInfoEntity extends BaseInfoEntity implements Serializ
*/
private BigDecimal price;
private String tag;
}

2
modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/entity/QyCcerInfoEntity.java

@ -69,7 +69,7 @@ public class QyCcerInfoEntity extends BaseInfoEntity implements Serializable {
* 价格
*/
private BigDecimal price;
private String tag;
}

1
modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/entity/QyGreenCertificateInfoEntity.java

@ -62,6 +62,7 @@ public class QyGreenCertificateInfoEntity extends BaseInfoEntity implements Seri
* 绿证价格
*/
private BigDecimal price;
private String tag;
}

3
modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/service/QyCarbonAssetService.java

@ -1,6 +1,7 @@
package com.thing.qingyuan.carbon.service;
import com.thing.common.core.web.response.PageData;
import com.thing.qingyuan.carbon.dto.QyCarbonAssetDTO;
import java.util.List;
@ -25,6 +26,6 @@ public interface QyCarbonAssetService {
* 获取碳资产对应标签的单价,数量,余额,账户总余额
* @return 返回一个Map
*/
Map<String,String> calculateAsset(String startTime, String endTime);
PageData<QyCarbonAssetDTO> calculateAsset(Map<String, Object> params);
}

219
modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/service/impl/QyCarbonAssetServiceImpl.java

@ -1,7 +1,10 @@
package com.thing.qingyuan.carbon.service.impl;
import cn.hutool.core.map.MapUtil;
import com.google.common.collect.Lists;
import com.mybatisflex.core.query.QueryWrapper;
import com.thing.common.core.utils.PageUtils;
import com.thing.common.core.web.response.PageData;
import com.thing.qingyuan.carbon.dto.QyCarbonAssetDTO;
import com.thing.qingyuan.carbon.dto.QyCarbonSumQuotaInfoDTO;
import com.thing.qingyuan.carbon.entity.QyCarbonQuotaInfoEntity;
@ -284,158 +287,84 @@ public class QyCarbonAssetServiceImpl implements QyCarbonAssetService {
* @return 返回一个Map
*/
@Override
public Map<String, String> calculateAsset(String startTime, String endTime) {
/* QueryWrapper queryWrapper = QueryWrapper.create()
.select(
QY_CARBON_QUOTA_INFO_ENTITY.ISSUE_DATE.as("deal_time"),
QY_CARBON_QUOTA_INFO_ENTITY.PRICE
)
.where("issue_date >= '" + startTime + "' AND issue_date <= '" + endTime + "'")
.from(QY_CARBON_QUOTA_INFO_ENTITY);
List<QyCarbonAssetDTO> qyCarbonAssetDTOSTPE = mapper.selectListByQueryAs(queryWrapper, QyCarbonAssetDTO.class);
for (QyCarbonAssetDTO qyCarbonAssetDTO : qyCarbonAssetDTOSTPE) {
public PageData<QyCarbonAssetDTO> calculateAsset(Map<String, Object> params) {
Integer page = MapUtil.getInt(params, "page");
Integer limit = MapUtil.getInt(params, "limit");
Long startTime = MapUtil.getLong(params, "startTime");
Long endTime = MapUtil.getLong(params, "endTime");
List<QyCarbonAssetDTO> resList = Lists.newArrayList();
List<QyCarbonAssetDTO> carbonList = qyCarbonQuotaInfoService.getMapper().selectListByQueryAs(
QueryWrapper.create().select(QY_CARBON_QUOTA_INFO_ENTITY.TOTAL,
QY_CARBON_QUOTA_INFO_ENTITY.STATE,
QY_CARBON_QUOTA_INFO_ENTITY.ISSUE_DATE,
QY_CARBON_QUOTA_INFO_ENTITY.TAG,
QY_CARBON_QUOTA_INFO_ENTITY.TOTAL,
QY_CARBON_QUOTA_INFO_ENTITY.PRICE
)
.ge(QyCarbonQuotaInfoEntity::getIssueDate, startTime,!Objects.isNull(startTime))
.lt(QyCarbonQuotaInfoEntity::getIssueDate, endTime,!Objects.isNull(endTime))
, QyCarbonAssetDTO.class);
if(CollectionUtils.isNotEmpty(carbonList)){
calBalanceAndUnitPrice(carbonList);
}
//查询CCER这段时间的账户总额度
List<QyCarbonAssetDTO> ccerInfoList = qyCcerInfoService.getMapper().selectListByQueryAs(
QueryWrapper.create().select(
QY_CCER_INFO_ENTITY.TOTAL,
QY_CCER_INFO_ENTITY.STATE,
QY_CCER_INFO_ENTITY.ISSUE_DATE,
QY_CCER_INFO_ENTITY.TAG,
QY_CCER_INFO_ENTITY.TOTAL,
QY_CCER_INFO_ENTITY.PRICE)
.ge(QyCcerInfoEntity::getIssueDate, startTime,!Objects.isNull(startTime))
.lt(QyCcerInfoEntity::getIssueDate, endTime,!Objects.isNull(endTime))
, QyCarbonAssetDTO.class);
List<QyCarbonAssetDTO> qyCarbonAssetDTOSccer = mapper.selectListByQueryAs(queryWrapper, QyCarbonAssetDTO.class);
List<QyCarbonAssetDTO> qyCarbonAssetDTOlzr = mapper.selectListByQueryAs(queryWrapper, QyCarbonAssetDTO.class);
qyCarbonAssetDTOSTPE.addAll(qyCarbonAssetDTOSccer);
qyCarbonAssetDTOSTPE.addAll(qyCarbonAssetDTOlzr);
List<QyCarbonAssetDTO> list = qyCarbonAssetDTOSTPE.stream().sorted(Comparator.comparing(QyCarbonAssetDTO::getDealTime).reversed()).toList();
*//*
==================================碳配额数量和金额 =====================================================================
*//*
//查询碳配额量总量
QueryWrapper queryWrapper = QueryWrapper.create()
.select(sum(QY_CARBON_QUOTA_INFO_ENTITY.CARBON_QUOTA).as("total"))
.where("issue_date >= '" + startTime + "' AND issue_date <= '" + endTime + "'")
.from(QY_CARBON_QUOTA_INFO_ENTITY);
//numTotal 为碳配额量总量
String carbonTotal = mapper.selectOneByQueryAs(queryWrapper, String.class);
//查询碳配额总金额
QueryWrapper queryWrapper1 = QueryWrapper.create()
.select(sum(QY_CARBON_QUOTA_INFO_ENTITY.PRICE).as("total"))
.where("issue_date >= '" + startTime + "' AND issue_date <= '" + endTime + "'")
.from(QY_CARBON_QUOTA_INFO_ENTITY);
// sum 为碳配额总金额
String carbonPrice = mapper.selectOneByQueryAs(queryWrapper1, String.class);
*//*
==================================CCER数量和金额====================================================================
*//*
//查询ccer总量
QueryWrapper queryWrapper2 = QueryWrapper.create()
.select(sum(QY_CCER_INFO_ENTITY.RECORD_EMISSION).as("total"))
.where("emission_time >= '" + startTime + "' AND emission_time <= '" + endTime + "'")
.from(QY_CCER_INFO_ENTITY);
//ccerNum 为ccer总量
String ccerTotal= mapper.selectOneByQueryAs(queryWrapper2, String.class);
//查询ccer总金额
QueryWrapper queryWrapper3 = QueryWrapper.create()
.select(sum(QY_CCER_INFO_ENTITY.PRICE).as("total"))
.where("emission_time >= '" + startTime + "' AND emission_time <= '" + endTime + "'")
.from(QY_CCER_INFO_ENTITY);
//sum1 为ccer总金额
String ccerPrice= mapper.selectOneByQueryAs(queryWrapper3, String.class);
*//*
====================================绿证数量和金额=====================================================================
*//*
//查询绿证总量
QueryWrapper queryWrapper4 = QueryWrapper.create()
.select(sum(QY_GREEN_CERTIFICATE_INFO_ENTITY.GREEN_TOTAL).as("total"))
.where("date_issue >= '" + startTime + "' AND date_issue <= '" + endTime + "'")
.from(QY_GREEN_CERTIFICATE_INFO_ENTITY);
//greenTotal 为绿证总量
String greenTotal = mapper.selectOneByQueryAs(queryWrapper4, String.class);
//查询绿证总金额
QueryWrapper queryWrapper5 = QueryWrapper.create()
.select(sum(QY_GREEN_CERTIFICATE_INFO_ENTITY.PRICE).as("total"))
.where("date_issue >= '" + startTime + "' AND date_issue <= '" + endTime + "'")
.from(QY_GREEN_CERTIFICATE_INFO_ENTITY);
// sum2 为绿证总金额
String greenPrice = mapper.selectOneByQueryAs(queryWrapper5, String.class);
*//*
====================================核销量=================================================================
*//*
//查询碳配额核销量
QueryWrapper queryWrapper6 = QueryWrapper.create()
.select(sum(QY_CARBON_QUOTA_INFO_ENTITY.VERIFICATION_VOLUME).as("total"))
.where("verification_date >= '" + startTime + "' AND verification_date <= '" + endTime + "'")
.eq(QyCarbonQuotaInfoEntity::getAssetState,"2")
.from(QY_CARBON_QUOTA_INFO_ENTITY);
//carbonVer 为碳配额核销量
String carbonVer = mapper.selectOneByQueryAs(queryWrapper6, String.class);
//查询ccer核销量
QueryWrapper queryWrapper7 = QueryWrapper.create()
.select(sum(QY_CCER_INFO_ENTITY.VERIFICATION_VOLUME).as("total"))
.eq(QyCcerInfoEntity::getAssetState,"2")
.where("verification_date >= '" + startTime + "' AND verification_date <= '" + endTime + "'")
.from(QY_CCER_INFO_ENTITY);
//ccerVer 为ccer核销量
String ccerVer = mapper.selectOneByQueryAs(queryWrapper7, String.class);
//查询绿证核销量
QueryWrapper queryWrapper8 = QueryWrapper.create()
.select(sum(QY_GREEN_CERTIFICATE_INFO_ENTITY.VERIFICATION_VOLUME).as("total"))
.eq(QyGreenCertificateInfoEntity::getAssetState,"2")
.where("verification_date >= '" + startTime + "' AND verification_date <= '" + endTime + "'")
.from(QY_GREEN_CERTIFICATE_INFO_ENTITY);
//greenVer 为绿证核销量
String greenVer = mapper.selectOneByQueryAs(queryWrapper8, String.class);*/
/*
======================================统计账户总余额========================================================
*/
//统计碳配额总余额
/* BigDecimal carbonAccount = new BigDecimal(carbonTotal).subtract(new BigDecimal(carbonVer));
//统计ccer总余额
BigDecimal ccerAccount = new BigDecimal(ccerTotal).subtract(new BigDecimal(ccerVer));
//统计绿证总余额
BigDecimal greenAccount = (new BigDecimal(greenTotal).subtract(new BigDecimal(greenVer))).multiply(new BigDecimal("0.5703"));
//存储最终结果
HashMap<String, String> temMap = new HashMap<>();
//计算碳配额单价(/tCO2)
temMap.put("carbonUnitPrice",new BigDecimal(carbonTotal).divide(new BigDecimal(carbonPrice),2, RoundingMode.HALF_UP).toString());
//计算ccer单价
temMap.put("ccerUnitPrice",new BigDecimal(ccerTotal).divide(new BigDecimal(ccerPrice),2, RoundingMode.HALF_UP).toString());
//计算绿证单价
temMap.put("greenUnitPrice",new BigDecimal(greenTotal).multiply(new BigDecimal("0.5703")).divide(new BigDecimal(greenPrice),2, RoundingMode.HALF_UP).toString());
if(CollectionUtils.isNotEmpty(ccerInfoList)){
calBalanceAndUnitPrice(ccerInfoList);
}
//碳配额数量(tCO2)
temMap.put("carbonNum", StringUtils.isBlank(carbonTotal) ? "0" : carbonTotal);
//ccer数量(tCO2)
temMap.put("ccerNum", StringUtils.isBlank(ccerTotal) ? "0" : ccerTotal);
//绿证数量(tCO2)
temMap.put("greenNum", StringUtils.isBlank(greenTotal) ? "0" : greenTotal);
//总数量
temMap.put("totalNum",new BigDecimal(carbonTotal).add(new BigDecimal(ccerTotal)).add(new BigDecimal(greenTotal)).toString());
//碳配额金额,总余额
temMap.put("carbonPrice", StringUtils.isBlank(carbonPrice) ? "0" : carbonPrice);
temMap.put("carbonRemain",carbonAccount.toString());
//ccer金额,总余额
temMap.put("ccerPrice", StringUtils.isBlank(ccerPrice) ? "0" : ccerPrice);
temMap.put("ccerRemain",ccerAccount.toString());
//绿证金额,总余额
temMap.put("greenPrice", StringUtils.isBlank(greenPrice) ? "0" : greenPrice);
temMap.put("greenRemain",greenAccount.toString());*/
//查询绿证这段时间的账户总额度
List<QyCarbonAssetDTO> greenList = qyGreenCertificateInfoService.getMapper().selectListByQueryAs(
QueryWrapper.create().select(
QY_GREEN_CERTIFICATE_INFO_ENTITY.TOTAL,
QY_GREEN_CERTIFICATE_INFO_ENTITY.STATE,
QY_GREEN_CERTIFICATE_INFO_ENTITY.ISSUE_DATE,
QY_GREEN_CERTIFICATE_INFO_ENTITY.TAG,
QY_GREEN_CERTIFICATE_INFO_ENTITY.TOTAL,
QY_GREEN_CERTIFICATE_INFO_ENTITY.PRICE)
.ge(QyGreenCertificateInfoEntity::getIssueDate, startTime,!Objects.isNull(startTime))
.lt(QyGreenCertificateInfoEntity::getIssueDate, endTime,!Objects.isNull(endTime))
, QyCarbonAssetDTO.class);
if(CollectionUtils.isNotEmpty(greenList)){
calBalanceAndUnitPrice(greenList);
}
resList.addAll(carbonList);
resList.addAll(ccerInfoList);
resList.addAll(greenList);
List<QyCarbonAssetDTO> list = resList.stream().sorted(Comparator.comparing(QyCarbonAssetDTO::getIssueDate).reversed()).toList();
List<QyCarbonAssetDTO> qyCarbonAssetDTOS = PageUtils.startPage(list, page, limit);
return new PageData<>(qyCarbonAssetDTOS, CollectionUtils.size(list));
}
return null;
private static void calBalanceAndUnitPrice(List<QyCarbonAssetDTO> carbonList) {
//总数
BigDecimal sum = carbonList.stream().filter(s -> !"1".equals(s.getState()))
.map(QyCarbonAssetDTO::getTotal)
.reduce(BigDecimal.ZERO, BigDecimal::add);
//核销和卖出
BigDecimal sellNum = carbonList.stream().filter(s -> "4".equals(s.getState()) || "5".equals(s.getState()))
.map(QyCarbonAssetDTO::getTotal)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal balance = sum.subtract(sellNum);
for (QyCarbonAssetDTO qyCarbonAssetDTO : carbonList) {
qyCarbonAssetDTO.setBalance(balance);
qyCarbonAssetDTO.setUnitPrice(qyCarbonAssetDTO.getTotal().divide(qyCarbonAssetDTO.getPrice(), 2, RoundingMode.HALF_UP));
}
}
}

14
modules/qingyuan/src/main/java/com/thing/qingyuan/carbon/service/impl/QyCarbonQuotaInfoServiceImpl.java

@ -9,6 +9,7 @@ import com.thing.qingyuan.carbon.entity.QyCarbonQuotaInfoEntity;
import com.thing.qingyuan.carbon.mapper.QyCarbonQuotaInfoMapper;
import com.thing.qingyuan.carbon.service.QyCarbonQuotaInfoService;
import com.thing.qingyuan.carbon.util.Constant;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
@ -72,14 +73,23 @@ public class QyCarbonQuotaInfoServiceImpl extends BaseServiceImpl<QyCarbonQuotaI
.from(QY_CARBON_QUOTA_INFO_ENTITY);
String sum = mapper.selectOneByQueryAs(queryWrapper3, String.class);
QueryWrapper queryWrapperBalance = QueryWrapper.create()
.select(sum(QY_CARBON_QUOTA_INFO_ENTITY.TOTAL))
.from(QY_CARBON_QUOTA_INFO_ENTITY)
.in(QyCarbonQuotaInfoEntity::getState, "4","5");
//sum1 待发放碳配额总量
String sumBalance = mapper.selectOneByQueryAs(queryWrapperBalance, String.class);
Map<String, String> tempMap = new HashMap<>();
//待发放碳配额
tempMap.put("pendingPercent", new BigDecimal(sum1).divide(new BigDecimal(sum), 2, RoundingMode.HALF_UP).toString());
tempMap.put("pendingPercent", new BigDecimal(sum1).divide(new BigDecimal(sum), 2, RoundingMode.HALF_UP).toPlainString());
//已发放碳配额
tempMap.put("issuedPercent", new BigDecimal(sum2).divide(new BigDecimal(sum), 2, RoundingMode.HALF_UP).toString());
tempMap.put("issuedPercent", new BigDecimal(sum2).divide(new BigDecimal(sum), 2, RoundingMode.HALF_UP).toPlainString());
tempMap.put("pending",sum1);
tempMap.put("issued",sum2);
tempMap.put("total",sum);
tempMap.put("balance",new BigDecimal(sum).subtract(new BigDecimal(StringUtils.isBlank(sumBalance)? "0" : sumBalance)).toPlainString());
return tempMap;
}
/**

Loading…
Cancel
Save