|
@@ -8,21 +8,29 @@ import com.usky.common.core.exception.BusinessException;
|
|
|
import com.usky.common.security.utils.SecurityUtils;
|
|
import com.usky.common.security.utils.SecurityUtils;
|
|
|
import com.usky.vpp.domain.VppCustomer;
|
|
import com.usky.vpp.domain.VppCustomer;
|
|
|
import com.usky.vpp.domain.VppEnergyReadingMonthly;
|
|
import com.usky.vpp.domain.VppEnergyReadingMonthly;
|
|
|
|
|
+import com.usky.vpp.domain.VppResourcePoint;
|
|
|
import com.usky.vpp.mapper.VppCustomerMapper;
|
|
import com.usky.vpp.mapper.VppCustomerMapper;
|
|
|
import com.usky.vpp.mapper.VppEnergyReadingMonthlyMapper;
|
|
import com.usky.vpp.mapper.VppEnergyReadingMonthlyMapper;
|
|
|
|
|
+import com.usky.vpp.mapper.VppResourcePointMapper;
|
|
|
import com.usky.vpp.service.VppSettlementService;
|
|
import com.usky.vpp.service.VppSettlementService;
|
|
|
import com.usky.vpp.util.VppAuditHelper;
|
|
import com.usky.vpp.util.VppAuditHelper;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
|
|
+import java.io.IOException;
|
|
|
|
|
+import java.nio.charset.StandardCharsets;
|
|
|
|
|
+import java.util.Collections;
|
|
|
import java.util.HashMap;
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
|
|
+import java.util.Objects;
|
|
|
|
|
+import java.util.Set;
|
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * VppSettlementService 默认实现(待按业务完善)
|
|
|
|
|
|
|
+ * VppSettlementService 默认实现
|
|
|
*/
|
|
*/
|
|
|
@Service
|
|
@Service
|
|
|
public class VppSettlementServiceImpl implements VppSettlementService {
|
|
public class VppSettlementServiceImpl implements VppSettlementService {
|
|
@@ -31,52 +39,258 @@ public class VppSettlementServiceImpl implements VppSettlementService {
|
|
|
private VppCustomerMapper vppCustomerMapper;
|
|
private VppCustomerMapper vppCustomerMapper;
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private VppEnergyReadingMonthlyMapper energyReadingMonthlyMapper;
|
|
private VppEnergyReadingMonthlyMapper energyReadingMonthlyMapper;
|
|
|
-
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private VppResourcePointMapper resourcePointMapper;
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public CommonPage<VppEnergyReadingMonthly> pageReading(Long id, String customerName, String calcCycle, Integer current, Integer size) {
|
|
|
|
|
|
|
+ public CommonPage<VppEnergyReadingMonthly> pageReading(Long id, String customerName, String calcCycle,
|
|
|
|
|
+ Integer current, Integer size) {
|
|
|
IPage<VppEnergyReadingMonthly> page = new Page<>(current, size);
|
|
IPage<VppEnergyReadingMonthly> page = new Page<>(current, size);
|
|
|
- Integer tenantId = SecurityUtils.getTenantId();
|
|
|
|
|
|
|
+ LambdaQueryWrapper<VppEnergyReadingMonthly> wrapper = buildReadingQueryWrapper(id, customerName, calcCycle);
|
|
|
|
|
+ if (wrapper == null) {
|
|
|
|
|
+ return new CommonPage<>(Collections.emptyList(), 0L, size, current);
|
|
|
|
|
+ }
|
|
|
|
|
+ page = energyReadingMonthlyMapper.selectPage(page, wrapper);
|
|
|
|
|
+ List<VppEnergyReadingMonthly> records = page.getRecords();
|
|
|
|
|
+ fillCustomerNames(records);
|
|
|
|
|
+ fillResourceNames(records);
|
|
|
|
|
+ return new CommonPage<>(records, page.getTotal(), size, current);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void exportReading(String scope, String fileName, Long id, String customerName, String calcCycle,
|
|
|
|
|
+ Integer current, Integer size, HttpServletResponse response) {
|
|
|
|
|
+ List<VppEnergyReadingMonthly> readingList;
|
|
|
|
|
+
|
|
|
|
|
+ switch (scope) {
|
|
|
|
|
+ case "current":
|
|
|
|
|
+ if (current == null || size == null) {
|
|
|
|
|
+ throw new BusinessException("current 模式下分页参数 current 和 size 不能为空!");
|
|
|
|
|
+ }
|
|
|
|
|
+ IPage<VppEnergyReadingMonthly> page = new Page<>(current, size);
|
|
|
|
|
+ LambdaQueryWrapper<VppEnergyReadingMonthly> currWrapper = baseReadingQueryWrapper();
|
|
|
|
|
+ currWrapper.orderByDesc(VppEnergyReadingMonthly::getSettleYear)
|
|
|
|
|
+ .orderByDesc(VppEnergyReadingMonthly::getSettleMonth);
|
|
|
|
|
+ page = energyReadingMonthlyMapper.selectPage(page, currWrapper);
|
|
|
|
|
+ readingList = page.getRecords();
|
|
|
|
|
+ break;
|
|
|
|
|
|
|
|
- LambdaQueryWrapper<VppCustomer> customerQueryWrapper = new LambdaQueryWrapper<VppCustomer>();
|
|
|
|
|
- customerQueryWrapper.eq(VppCustomer::getTenantId, tenantId)
|
|
|
|
|
|
|
+ case "all":
|
|
|
|
|
+ LambdaQueryWrapper<VppEnergyReadingMonthly> allWrapper = baseReadingQueryWrapper();
|
|
|
|
|
+ allWrapper.orderByDesc(VppEnergyReadingMonthly::getSettleYear)
|
|
|
|
|
+ .orderByDesc(VppEnergyReadingMonthly::getSettleMonth);
|
|
|
|
|
+ readingList = energyReadingMonthlyMapper.selectList(allWrapper);
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ case "filtered":
|
|
|
|
|
+ boolean hasFilter = id != null || StringUtils.isNotBlank(customerName)
|
|
|
|
|
+ || StringUtils.isNotBlank(calcCycle);
|
|
|
|
|
+ if (!hasFilter) {
|
|
|
|
|
+ throw new BusinessException("filtered 模式下请至少提供一个筛选条件(id / customerName / calcCycle)!");
|
|
|
|
|
+ }
|
|
|
|
|
+ LambdaQueryWrapper<VppEnergyReadingMonthly> filteredWrapper = buildReadingQueryWrapper(
|
|
|
|
|
+ id, customerName, calcCycle);
|
|
|
|
|
+ if (filteredWrapper == null) {
|
|
|
|
|
+ readingList = Collections.emptyList();
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ readingList = energyReadingMonthlyMapper.selectList(filteredWrapper);
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ default:
|
|
|
|
|
+ throw new BusinessException("不支持的导出范围:" + scope + ",请使用 current / all / filtered");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (readingList == null) {
|
|
|
|
|
+ readingList = Collections.emptyList();
|
|
|
|
|
+ }
|
|
|
|
|
+ fillCustomerNames(readingList);
|
|
|
|
|
+ fillResourceNames(readingList);
|
|
|
|
|
+ writeReadingExcel(fileName, readingList, response);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private LambdaQueryWrapper<VppEnergyReadingMonthly> baseReadingQueryWrapper() {
|
|
|
|
|
+ return new LambdaQueryWrapper<VppEnergyReadingMonthly>()
|
|
|
|
|
+ .eq(VppEnergyReadingMonthly::getTenantId, SecurityUtils.getTenantId())
|
|
|
|
|
+ .eq(VppEnergyReadingMonthly::getDeleteFlag, VppAuditHelper.NOT_DELETED);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private LambdaQueryWrapper<VppEnergyReadingMonthly> buildReadingQueryWrapper(Long customerId,
|
|
|
|
|
+ String customerName,
|
|
|
|
|
+ String calcCycle) {
|
|
|
|
|
+ Map<Long, String> customerNameMap = resolveCustomerNameMap(customerName);
|
|
|
|
|
+ if (StringUtils.isNotBlank(customerName) && customerNameMap.isEmpty()) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, Object> cycleMap = null;
|
|
|
|
|
+ if (StringUtils.isNotBlank(calcCycle)) {
|
|
|
|
|
+ cycleMap = resolveCalcCycle(calcCycle);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return baseReadingQueryWrapper()
|
|
|
|
|
+ .eq(customerId != null, VppEnergyReadingMonthly::getCustomerId, customerId)
|
|
|
|
|
+ .in(StringUtils.isNotBlank(customerName), VppEnergyReadingMonthly::getCustomerId, customerNameMap.keySet())
|
|
|
|
|
+ .eq(cycleMap != null, VppEnergyReadingMonthly::getSettleYear,
|
|
|
|
|
+ cycleMap != null ? cycleMap.get("settleYear") : null)
|
|
|
|
|
+ .eq(cycleMap != null, VppEnergyReadingMonthly::getSettleMonth,
|
|
|
|
|
+ cycleMap != null ? cycleMap.get("settleMonth") : null)
|
|
|
|
|
+ .orderByDesc(VppEnergyReadingMonthly::getSettleYear)
|
|
|
|
|
+ .orderByDesc(VppEnergyReadingMonthly::getSettleMonth);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private Map<Long, String> resolveCustomerNameMap(String customerName) {
|
|
|
|
|
+ LambdaQueryWrapper<VppCustomer> customerQueryWrapper = new LambdaQueryWrapper<VppCustomer>()
|
|
|
|
|
+ .eq(VppCustomer::getTenantId, SecurityUtils.getTenantId())
|
|
|
.eq(VppCustomer::getDeleteFlag, VppAuditHelper.NOT_DELETED)
|
|
.eq(VppCustomer::getDeleteFlag, VppAuditHelper.NOT_DELETED)
|
|
|
.like(StringUtils.isNotBlank(customerName), VppCustomer::getCustomerName, customerName);
|
|
.like(StringUtils.isNotBlank(customerName), VppCustomer::getCustomerName, customerName);
|
|
|
- Map<Long, String> customerNameMap = vppCustomerMapper.selectList(customerQueryWrapper)
|
|
|
|
|
|
|
+ return vppCustomerMapper.selectList(customerQueryWrapper)
|
|
|
.stream()
|
|
.stream()
|
|
|
- .collect(Collectors.toMap(VppCustomer::getId, VppCustomer::getCustomerName));
|
|
|
|
|
-
|
|
|
|
|
- LambdaQueryWrapper<VppEnergyReadingMonthly> energyReadingQueryWrapper = new LambdaQueryWrapper<VppEnergyReadingMonthly>();
|
|
|
|
|
- energyReadingQueryWrapper.eq(VppEnergyReadingMonthly::getTenantId, tenantId)
|
|
|
|
|
- .eq(VppEnergyReadingMonthly::getDeleteFlag, VppAuditHelper.NOT_DELETED)
|
|
|
|
|
- .eq(id != null, VppEnergyReadingMonthly::getCustomerId, id)
|
|
|
|
|
- .eq(StringUtils.isNotBlank(calcCycle), VppEnergyReadingMonthly::getSettleYear, resolveCalcCycle(calcCycle).get("settleYear"))
|
|
|
|
|
- .eq(StringUtils.isNotBlank(calcCycle), VppEnergyReadingMonthly::getSettleMonth, resolveCalcCycle(calcCycle).get("settleMonth"))
|
|
|
|
|
- .orderByDesc(VppEnergyReadingMonthly::getSettleYear);
|
|
|
|
|
- page = energyReadingMonthlyMapper.selectPage(page, energyReadingQueryWrapper);
|
|
|
|
|
-
|
|
|
|
|
- List<VppEnergyReadingMonthly> energyReadingMonthlyList = page.getRecords();
|
|
|
|
|
- energyReadingMonthlyList.forEach(energyReadingMonthly -> {
|
|
|
|
|
- energyReadingMonthly.setCustomerName(customerNameMap.get(energyReadingMonthly.getCustomerId()));
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ .collect(Collectors.toMap(VppCustomer::getId, VppCustomer::getCustomerName, (a, b) -> a));
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- return new CommonPage<>(energyReadingMonthlyList, page.getTotal(), size, current);
|
|
|
|
|
|
|
+ private void fillCustomerNames(List<VppEnergyReadingMonthly> records) {
|
|
|
|
|
+ if (records == null || records.isEmpty()) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ Set<Long> customerIds = records.stream()
|
|
|
|
|
+ .map(VppEnergyReadingMonthly::getCustomerId)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .collect(Collectors.toSet());
|
|
|
|
|
+ if (customerIds.isEmpty()) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ Map<Long, String> customerNameMap = vppCustomerMapper.selectBatchIds(customerIds).stream()
|
|
|
|
|
+ .collect(Collectors.toMap(VppCustomer::getId, VppCustomer::getCustomerName, (a, b) -> a));
|
|
|
|
|
+ records.forEach(reading -> reading.setCustomerName(customerNameMap.get(reading.getCustomerId())));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void fillResourceNames(List<VppEnergyReadingMonthly> records) {
|
|
|
|
|
+ if (records == null || records.isEmpty()) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ Set<Long> resourceIds = records.stream()
|
|
|
|
|
+ .map(VppEnergyReadingMonthly::getResourceId)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .collect(Collectors.toSet());
|
|
|
|
|
+ Map<Long, String> resourceNameMap = resourceIds.isEmpty()
|
|
|
|
|
+ ? Collections.emptyMap()
|
|
|
|
|
+ : resourcePointMapper.selectBatchIds(resourceIds).stream()
|
|
|
|
|
+ .collect(Collectors.toMap(VppResourcePoint::getId, VppResourcePoint::getResourceName, (a, b) -> a));
|
|
|
|
|
+ records.forEach(reading -> {
|
|
|
|
|
+ if (reading.getResourceId() == null) {
|
|
|
|
|
+ reading.setResourceName("户号级");
|
|
|
|
|
+ } else {
|
|
|
|
|
+ reading.setResourceName(resourceNameMap.get(reading.getResourceId()));
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * 解析核算周期,年-月
|
|
|
|
|
- * @param calcCycle
|
|
|
|
|
- * @return
|
|
|
|
|
- */
|
|
|
|
|
private Map<String, Object> resolveCalcCycle(String calcCycle) {
|
|
private Map<String, Object> resolveCalcCycle(String calcCycle) {
|
|
|
Map<String, Object> calcCycleMap = new HashMap<>();
|
|
Map<String, Object> calcCycleMap = new HashMap<>();
|
|
|
String[] split = calcCycle.split("-");
|
|
String[] split = calcCycle.split("-");
|
|
|
try {
|
|
try {
|
|
|
calcCycleMap.put("settleYear", split[0]);
|
|
calcCycleMap.put("settleYear", split[0]);
|
|
|
- calcCycleMap.put("settleMonth", split[1]);
|
|
|
|
|
|
|
+ calcCycleMap.put("settleMonth", Integer.valueOf(split[1]));
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
throw new BusinessException("解析核算周期失败!请核对参数!");
|
|
throw new BusinessException("解析核算周期失败!请核对参数!");
|
|
|
}
|
|
}
|
|
|
return calcCycleMap;
|
|
return calcCycleMap;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ private void writeReadingExcel(String fileName, List<VppEnergyReadingMonthly> readingList,
|
|
|
|
|
+ HttpServletResponse response) {
|
|
|
|
|
+ try (org.apache.poi.xssf.usermodel.XSSFWorkbook workbook = new org.apache.poi.xssf.usermodel.XSSFWorkbook()) {
|
|
|
|
|
+ org.apache.poi.xssf.usermodel.XSSFSheet sheet = workbook.createSheet("月度电量核算");
|
|
|
|
|
+
|
|
|
|
|
+ org.apache.poi.xssf.usermodel.XSSFCellStyle headerStyle = workbook.createCellStyle();
|
|
|
|
|
+ headerStyle.setFillForegroundColor(org.apache.poi.ss.usermodel.IndexedColors.GREY_25_PERCENT.getIndex());
|
|
|
|
|
+ headerStyle.setFillPattern(org.apache.poi.ss.usermodel.FillPatternType.SOLID_FOREGROUND);
|
|
|
|
|
+ org.apache.poi.xssf.usermodel.XSSFFont headerFont = workbook.createFont();
|
|
|
|
|
+ headerFont.setBold(true);
|
|
|
|
|
+ headerStyle.setFont(headerFont);
|
|
|
|
|
+
|
|
|
|
|
+ String[] headers = {
|
|
|
|
|
+ "序号", "客户名称", "资源点", "结算年", "结算月",
|
|
|
|
|
+ "总用电量(kWh)", "峰电量(kWh)", "平电量(kWh)", "谷电量(kWh)", "尖电量(kWh)",
|
|
|
|
|
+ "发电量(kWh)", "核算状态", "核算时间", "创建时间"
|
|
|
|
|
+ };
|
|
|
|
|
+ org.apache.poi.xssf.usermodel.XSSFRow headerRow = sheet.createRow(0);
|
|
|
|
|
+ for (int i = 0; i < headers.length; i++) {
|
|
|
|
|
+ org.apache.poi.xssf.usermodel.XSSFCell cell = headerRow.createCell(i);
|
|
|
|
|
+ cell.setCellValue(headers[i]);
|
|
|
|
|
+ cell.setCellStyle(headerStyle);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ int rowIdx = 1;
|
|
|
|
|
+ for (VppEnergyReadingMonthly reading : readingList) {
|
|
|
|
|
+ org.apache.poi.xssf.usermodel.XSSFRow row = sheet.createRow(rowIdx++);
|
|
|
|
|
+ setCell(row, 0, rowIdx - 1);
|
|
|
|
|
+ setCell(row, 1, reading.getCustomerName());
|
|
|
|
|
+ setCell(row, 2, reading.getResourceName());
|
|
|
|
|
+ setCell(row, 3, reading.getSettleYear());
|
|
|
|
|
+ setCell(row, 4, reading.getSettleMonth());
|
|
|
|
|
+ setCell(row, 5, numberStr(reading.getTotalEnergyKwh()));
|
|
|
|
|
+ setCell(row, 6, numberStr(reading.getPeakEnergyKwh()));
|
|
|
|
|
+ setCell(row, 7, numberStr(reading.getFlatEnergyKwh()));
|
|
|
|
|
+ setCell(row, 8, numberStr(reading.getValleyEnergyKwh()));
|
|
|
|
|
+ setCell(row, 9, numberStr(reading.getSharpEnergyKwh()));
|
|
|
|
|
+ setCell(row, 10, numberStr(reading.getGenEnergyKwh()));
|
|
|
|
|
+ setCell(row, 11, calcStatusLabel(reading.getCalcStatus()));
|
|
|
|
|
+ setCell(row, 12, dateTimeStr(reading.getCalcAt()));
|
|
|
|
|
+ setCell(row, 13, dateTimeStr(reading.getCreateTime()));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for (int i = 0; i < headers.length; i++) {
|
|
|
|
|
+ sheet.autoSizeColumn(i);
|
|
|
|
|
+ int width = sheet.getColumnWidth(i);
|
|
|
|
|
+ if (width > 15000) {
|
|
|
|
|
+ sheet.setColumnWidth(i, 15000);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ String encodedFileName = java.net.URLEncoder.encode(fileName + ".xlsx", StandardCharsets.UTF_8.name())
|
|
|
|
|
+ .replace("+", "%20");
|
|
|
|
|
+ response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
|
|
|
|
+ response.setCharacterEncoding(StandardCharsets.UTF_8.name());
|
|
|
|
|
+ response.setHeader("Content-Disposition", "attachment; filename=" + encodedFileName
|
|
|
|
|
+ + "; filename*=UTF-8''" + encodedFileName);
|
|
|
|
|
+ workbook.write(response.getOutputStream());
|
|
|
|
|
+ response.getOutputStream().flush();
|
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
|
+ throw new BusinessException("导出月度电量核算数据失败: " + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private static void setCell(org.apache.poi.xssf.usermodel.XSSFRow row, int col, Object value) {
|
|
|
|
|
+ if (value != null) {
|
|
|
|
|
+ row.createCell(col).setCellValue(String.valueOf(value));
|
|
|
|
|
+ } else {
|
|
|
|
|
+ row.createCell(col).setCellValue("");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private static String numberStr(Object value) {
|
|
|
|
|
+ return value == null ? "" : value.toString();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private static String dateTimeStr(Object value) {
|
|
|
|
|
+ return value == null ? "" : value.toString();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private static String calcStatusLabel(Integer calcStatus) {
|
|
|
|
|
+ if (calcStatus == null) {
|
|
|
|
|
+ return "";
|
|
|
|
|
+ }
|
|
|
|
|
+ switch (calcStatus) {
|
|
|
|
|
+ case 0:
|
|
|
|
|
+ return "待核算";
|
|
|
|
|
+ case 1:
|
|
|
|
|
+ return "已核算";
|
|
|
|
|
+ case 2:
|
|
|
|
|
+ return "异常";
|
|
|
|
|
+ default:
|
|
|
|
|
+ return String.valueOf(calcStatus);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|