From cb2503266dc44ff0205aed890800e7756936e6b0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A3=B7=E5=8F=B6?=
<14103883+leaf-phos@user.noreply.gitee.com>
Date: Sat, 4 Jan 2025 18:05:32 +0800
Subject: [PATCH] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/main/resources/vm/java/mapper.java.vm | 24 ++-
.../src/main/resources/vm/xml/mapper.xml.vm | 46 ++++++
.../billEleRecord/domain/BillEleRecord.java | 56 +++++++
.../domain/BillEleRecordQuery.java | 11 ++
.../billEleRecord/domain/BillEleRecordVO.java | 16 ++
.../mapper/BillEleRecordMapper.java | 72 ++++++++
.../mapper/BillEleRecordMapper.xml | 156 ++++++++++++++++++
.../service/BillEleRecordConverter.java | 24 +++
.../service/BillEleRecordService.java | 77 +++++++++
.../impl/BillEleRecordConverterImpl.java | 66 ++++++++
.../impl/BillEleRecordServiceImpl.java | 129 +++++++++++++++
.../impl/TransactionBillServiceImpl.java | 132 ++++++++++-----
.../transactionBill/utils/RechargeUtils.java | 11 ++
.../task/billEleRecord/BillEleRecordTask.java | 90 ++++++++++
.../ss/BillEleRecordController.java | 100 +++++++++++
15 files changed, 959 insertions(+), 51 deletions(-)
create mode 100644 smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/domain/BillEleRecord.java
create mode 100644 smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/domain/BillEleRecordQuery.java
create mode 100644 smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/domain/BillEleRecordVO.java
create mode 100644 smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/mapper/BillEleRecordMapper.java
create mode 100644 smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/mapper/BillEleRecordMapper.xml
create mode 100644 smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/service/BillEleRecordConverter.java
create mode 100644 smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/service/BillEleRecordService.java
create mode 100644 smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/service/impl/BillEleRecordConverterImpl.java
create mode 100644 smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/service/impl/BillEleRecordServiceImpl.java
create mode 100644 smart-switch-service/src/main/java/com/ruoyi/task/billEleRecord/BillEleRecordTask.java
create mode 100644 smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/BillEleRecordController.java
diff --git a/smart-switch-ruoyi/smart-switch-generator/src/main/resources/vm/java/mapper.java.vm b/smart-switch-ruoyi/smart-switch-generator/src/main/resources/vm/java/mapper.java.vm
index 6c49b692..47e2c9f6 100644
--- a/smart-switch-ruoyi/smart-switch-generator/src/main/resources/vm/java/mapper.java.vm
+++ b/smart-switch-ruoyi/smart-switch-generator/src/main/resources/vm/java/mapper.java.vm
@@ -23,7 +23,7 @@ public interface ${ClassName}Mapper
* @param ${pkColumn.javaField} ${functionName}主键
* @return ${functionName}
*/
- public ${ClassName}VO select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
+ ${ClassName}VO select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
/**
* 查询${functionName}列表
@@ -31,7 +31,7 @@ public interface ${ClassName}Mapper
* @param query ${functionName}
* @return ${functionName}集合
*/
- public List<${ClassName}VO> select${ClassName}List(@Param("query")${ClassName}Query query);
+ List<${ClassName}VO> select${ClassName}List(@Param("query")${ClassName}Query query);
/**
* 新增${functionName}
@@ -39,7 +39,17 @@ public interface ${ClassName}Mapper
* @param ${className} ${functionName}
* @return 结果
*/
- public int insert${ClassName}(${ClassName} ${className});
+ int insert${ClassName}(${ClassName} ${className});
+
+ /**
+ * 批量新增${functionName}
+ */
+ int batchInsert(@Param("list") List extends ${ClassName}> list);
+
+ /**
+ * 批量修改${functionName}
+ */
+ int batchUpdate(@Param("list") List extends ${ClassName}> list);
/**
* 修改${functionName}
@@ -55,7 +65,7 @@ public interface ${ClassName}Mapper
* @param ${pkColumn.javaField} ${functionName}主键
* @return 结果
*/
- public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
+ int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
/**
* 批量删除${functionName}
@@ -72,7 +82,7 @@ public interface ${ClassName}Mapper
* @param ${pkColumn.javaField}s 需要删除的数据主键集合
* @return 结果
*/
- public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
+ int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
/**
* 批量新增${subTable.functionName}
@@ -80,7 +90,7 @@ public interface ${ClassName}Mapper
* @param ${subclassName}List ${subTable.functionName}列表
* @return 结果
*/
- public int batch${subClassName}(List<${subClassName}> ${subclassName}List);
+ int batch${subClassName}(List<${subClassName}> ${subclassName}List);
/**
@@ -89,6 +99,6 @@ public interface ${ClassName}Mapper
* @param ${pkColumn.javaField} ${functionName}ID
* @return 结果
*/
- public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField});
+ int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField});
#end
}
diff --git a/smart-switch-ruoyi/smart-switch-generator/src/main/resources/vm/xml/mapper.xml.vm b/smart-switch-ruoyi/smart-switch-generator/src/main/resources/vm/xml/mapper.xml.vm
index dc668191..397bcc94 100644
--- a/smart-switch-ruoyi/smart-switch-generator/src/main/resources/vm/xml/mapper.xml.vm
+++ b/smart-switch-ruoyi/smart-switch-generator/src/main/resources/vm/xml/mapper.xml.vm
@@ -99,6 +99,52 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+
+ insert into ${tableName}
+
+ #foreach($column in $columns)
+ #if($column.columnName != $pkColumn.columnName || !$pkColumn.increment)
+ $column.columnName,
+ #end
+ #end
+
+ values
+
+
+ #foreach($column in $columns)
+ #if($column.columnName != $pkColumn.columnName || !$pkColumn.increment)
+ #{i.$column.javaField},
+ default,
+ #end
+ #end
+
+
+
+
+
+ update ${tableName}
+
+ #foreach($column in $columns)
+ #if($column.columnName != $pkColumn.columnName || !$pkColumn.increment)
+
+
+
+ WHEN #{item.$pkColumn.columnName} THEN #{item.$column.javaField}
+
+
+ WHEN #{item.$pkColumn.columnName} THEN `$column.columnName`
+
+
+
+ #end
+ #end
+
+ where $pkColumn.columnName in
+
+ #{item.$pkColumn.javaField}
+
+
+
update ${tableName}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/domain/BillEleRecord.java b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/domain/BillEleRecord.java
new file mode 100644
index 00000000..8a92d090
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/domain/BillEleRecord.java
@@ -0,0 +1,56 @@
+package com.ruoyi.ss.billEleRecord.domain;
+
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 订单电量记录对象 ss_bill_ele_record
+ *
+ * @author ruoyi
+ * @date 2025-01-04
+ */
+@Data
+public class BillEleRecord extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ private Long id;
+
+ @Excel(name = "订单ID")
+ @ApiModelProperty("订单ID")
+ private Long billId;
+
+ @Excel(name = "记录时的总用电量(度)")
+ @ApiModelProperty("记录时的总用电量(度)")
+ private BigDecimal totalEle;
+
+ @Excel(name = "当前时间段用电量(度)")
+ @ApiModelProperty("当前时间段用电量(度)")
+ private BigDecimal usedEle;
+
+ @Excel(name = "当前时间段电价(元/度)")
+ @ApiModelProperty("当前时间段电价(元/度)")
+ private BigDecimal price;
+
+ @Excel(name = "当前时间段总电价(元)")
+ @ApiModelProperty("当前时间段总电价(元)")
+ private BigDecimal totalPrice;
+
+ @Excel(name = "记录时间段(起始)", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+ @ApiModelProperty("记录时间段(起始)")
+ private LocalDateTime timeStart;
+
+ @Excel(name = "记录时间段(结束)", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+ @ApiModelProperty("记录时间段(结束)")
+ private LocalDateTime timeEnd;
+
+ @Excel(name = "记录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+ @ApiModelProperty("记录时间")
+ private LocalDateTime recordTime;
+
+}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/domain/BillEleRecordQuery.java b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/domain/BillEleRecordQuery.java
new file mode 100644
index 00000000..c685e353
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/domain/BillEleRecordQuery.java
@@ -0,0 +1,11 @@
+package com.ruoyi.ss.billEleRecord.domain;
+
+import lombok.Data;
+
+/**
+ * @author wjh
+ * 2025/1/4
+ */
+@Data
+public class BillEleRecordQuery extends BillEleRecordVO {
+}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/domain/BillEleRecordVO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/domain/BillEleRecordVO.java
new file mode 100644
index 00000000..60db5cf8
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/domain/BillEleRecordVO.java
@@ -0,0 +1,16 @@
+package com.ruoyi.ss.billEleRecord.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author wjh
+ * 2025/1/4
+ */
+@Data
+public class BillEleRecordVO extends BillEleRecord{
+
+ @ApiModelProperty("订单编号")
+ private String billNo;
+
+}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/mapper/BillEleRecordMapper.java b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/mapper/BillEleRecordMapper.java
new file mode 100644
index 00000000..09196b1d
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/mapper/BillEleRecordMapper.java
@@ -0,0 +1,72 @@
+package com.ruoyi.ss.billEleRecord.mapper;
+
+import com.ruoyi.ss.billEleRecord.domain.BillEleRecord;
+import com.ruoyi.ss.billEleRecord.domain.BillEleRecordQuery;
+import com.ruoyi.ss.billEleRecord.domain.BillEleRecordVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 订单电量记录Mapper接口
+ *
+ * @author ruoyi
+ * @date 2025-01-04
+ */
+public interface BillEleRecordMapper
+{
+ /**
+ * 查询订单电量记录
+ *
+ * @param id 订单电量记录主键
+ * @return 订单电量记录
+ */
+ public BillEleRecordVO selectBillEleRecordById(Long id);
+
+ /**
+ * 查询订单电量记录列表
+ *
+ * @param query 订单电量记录
+ * @return 订单电量记录集合
+ */
+ public List selectBillEleRecordList(@Param("query")BillEleRecordQuery query);
+
+ /**
+ * 新增订单电量记录
+ *
+ * @param billEleRecord 订单电量记录
+ * @return 结果
+ */
+ public int insertBillEleRecord(BillEleRecord billEleRecord);
+
+ /**
+ * 修改订单电量记录
+ *
+ * @param billEleRecord 订单电量记录
+ * @return 结果
+ */
+ public int updateBillEleRecord(@Param("data") BillEleRecord billEleRecord);
+
+ /**
+ * 删除订单电量记录
+ *
+ * @param id 订单电量记录主键
+ * @return 结果
+ */
+ public int deleteBillEleRecordById(Long id);
+
+ /**
+ * 批量删除订单电量记录
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ public int deleteBillEleRecordByIds(Long[] ids);
+
+ int batchInsert(@Param("list") List list);
+
+ BigDecimal selectMaxEle(@Param("query") BillEleRecordQuery query);
+
+ BigDecimal selectSumOfTotalPrice(@Param("query") BillEleRecordQuery query);
+}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/mapper/BillEleRecordMapper.xml b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/mapper/BillEleRecordMapper.xml
new file mode 100644
index 00000000..6e615d9b
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/mapper/BillEleRecordMapper.xml
@@ -0,0 +1,156 @@
+
+
+
+
+
+
+
+ select
+ sber.id,
+ sber.bill_id,
+ sber.total_ele,
+ sber.used_ele,
+ sber.price,
+ sber.total_price,
+ sber.create_time,
+ sber.time_start,
+ sber.time_end,
+ sber.record_time,
+ stb.bill_no as bill_no
+ from ss_bill_ele_record sber
+ left join sm_transaction_bill stb on stb.bill_id = sber.bill_id
+
+
+
+ and sber.id = #{query.id}
+ and sber.bill_id = #{query.billId}
+ and stb.bill_no like concat('%',#{query.billNo},'%')
+ ${query.params.dataScope}
+
+
+
+
+
+
+
+
+
+
+
+ insert into ss_bill_ele_record
+
+ bill_id,
+ total_ele,
+ used_ele,
+ price,
+ total_price,
+ create_time,
+ time_start,
+ time_end,
+ record_time,
+
+
+ #{billId},
+ #{totalEle},
+ #{usedEle},
+ #{price},
+ #{totalPrice},
+ #{createTime},
+ #{timeStart},
+ #{timeEnd},
+ #{recordTime},
+
+
+
+
+
+ insert into ss_bill_ele_record
+
+ bill_id,
+ total_ele,
+ used_ele,
+ price,
+ total_price,
+ create_time,
+ time_start,
+ time_end,
+ record_time,
+
+ values
+
+
+ #{i.billId},
+ default,
+ #{i.totalEle},
+ default,
+ #{i.usedEle},
+ default,
+ #{i.price},
+ default,
+ #{i.totalPrice},
+ default,
+ #{i.createTime},
+ default,
+ #{i.timeStart},
+ default,
+ #{i.timeEnd},
+ default,
+ #{i.recordTime},
+ default,
+
+
+
+
+
+ update ss_bill_ele_record
+
+
+
+ where id = #{data.id}
+
+
+
+ bill_id = #{data.billId},
+ total_ele = #{data.totalEle},
+ used_ele = #{data.usedEle},
+ price = #{data.price},
+ total_price = #{data.totalPrice},
+ create_time = #{data.createTime},
+ time_start = #{data.timeStart},
+ time_end = #{data.timeEnd},
+ record_time = #{data.recordTime},
+
+
+
+ delete from ss_bill_ele_record where id = #{id}
+
+
+
+ delete from ss_bill_ele_record where id in
+
+ #{id}
+
+
+
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/service/BillEleRecordConverter.java b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/service/BillEleRecordConverter.java
new file mode 100644
index 00000000..0af2d973
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/service/BillEleRecordConverter.java
@@ -0,0 +1,24 @@
+package com.ruoyi.ss.billEleRecord.service;
+
+import com.ruoyi.ss.billEleRecord.domain.BillEleRecord;
+import com.ruoyi.ss.device.domain.vo.DeviceVO;
+import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author wjh
+ * 2025/1/4
+ */
+public interface BillEleRecordConverter {
+
+ /**
+ * 转为PO
+ * @param bill 订单
+ * @param device 设备
+ * @param time 抄表时间
+ * @param chargeTime 计费时间
+ */
+ BillEleRecord toPo(TransactionBillVO bill, DeviceVO device, LocalDateTime time, LocalDateTime chargeTime);
+
+}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/service/BillEleRecordService.java b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/service/BillEleRecordService.java
new file mode 100644
index 00000000..3c9a6df2
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/service/BillEleRecordService.java
@@ -0,0 +1,77 @@
+package com.ruoyi.ss.billEleRecord.service;
+
+import com.ruoyi.ss.billEleRecord.domain.BillEleRecord;
+import com.ruoyi.ss.billEleRecord.domain.BillEleRecordQuery;
+import com.ruoyi.ss.billEleRecord.domain.BillEleRecordVO;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 订单电量记录Service接口
+ *
+ * @author ruoyi
+ * @date 2025-01-04
+ */
+public interface BillEleRecordService
+{
+ /**
+ * 查询订单电量记录
+ *
+ * @param id 订单电量记录主键
+ * @return 订单电量记录
+ */
+ public BillEleRecordVO selectBillEleRecordById(Long id);
+
+ /**
+ * 查询订单电量记录列表
+ *
+ * @param billEleRecord 订单电量记录
+ * @return 订单电量记录集合
+ */
+ public List selectBillEleRecordList(BillEleRecordQuery billEleRecord);
+
+ /**
+ * 新增订单电量记录
+ *
+ * @param billEleRecord 订单电量记录
+ * @return 结果
+ */
+ public int insertBillEleRecord(BillEleRecord billEleRecord);
+
+ /**
+ * 修改订单电量记录
+ *
+ * @param billEleRecord 订单电量记录
+ * @return 结果
+ */
+ public int updateBillEleRecord(BillEleRecord billEleRecord);
+
+ /**
+ * 批量删除订单电量记录
+ *
+ * @param ids 需要删除的订单电量记录主键集合
+ * @return 结果
+ */
+ public int deleteBillEleRecordByIds(Long[] ids);
+
+ /**
+ * 删除订单电量记录信息
+ *
+ * @param id 订单电量记录主键
+ * @return 结果
+ */
+ public int deleteBillEleRecordById(Long id);
+
+ int batchInsert(List list);
+
+ /**
+ * 查询订单最大记录的用电量
+ */
+ BigDecimal selectMaxEleByBillId(Long billId);
+
+ /**
+ * 查询订单总金额
+ */
+ BigDecimal selectSumOfTotalPrice(BillEleRecordQuery query);
+}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/service/impl/BillEleRecordConverterImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/service/impl/BillEleRecordConverterImpl.java
new file mode 100644
index 00000000..1d6a3560
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/service/impl/BillEleRecordConverterImpl.java
@@ -0,0 +1,66 @@
+package com.ruoyi.ss.billEleRecord.service.impl;
+
+import com.ruoyi.ss.billEleRecord.domain.BillEleRecord;
+import com.ruoyi.ss.billEleRecord.service.BillEleRecordConverter;
+import com.ruoyi.ss.billEleRecord.service.BillEleRecordService;
+import com.ruoyi.ss.device.domain.vo.DeviceVO;
+import com.ruoyi.ss.suit.domain.enums.SuitFeeType;
+import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO;
+import com.ruoyi.ss.transactionBill.utils.RechargeUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @author wjh
+ * 2025/1/4
+ */
+@Service
+public class BillEleRecordConverterImpl implements BillEleRecordConverter {
+
+ @Autowired
+ private BillEleRecordService billEleRecordService;
+
+ @Override
+ public BillEleRecord toPo(TransactionBillVO bill, DeviceVO device, LocalDateTime time, LocalDateTime chargeTime) {
+ if (device == null || bill == null) {
+ return null;
+ }
+ if (!SuitFeeType.TIMING_COUNT.getType().equals(bill.getSuitFeeType())) {
+ return null;
+ }
+
+ // 计费时间
+ LocalDateTime timeStart = chargeTime.withMinute(0).withSecond(0);
+ LocalDateTime timeEnd = chargeTime.withMinute(59).withSecond(59);
+ if (bill.getSuitStartTime() != null && timeStart.isBefore(bill.getSuitStartTime())) {
+ timeStart = bill.getSuitStartTime();
+ }
+ if (bill.getSuitEndTime() != null && timeEnd.isAfter(bill.getSuitEndTime())) {
+ timeEnd = bill.getSuitEndTime();
+ }
+
+ // 当前时间段的单价(元/度)
+ BigDecimal price = RechargeUtils.getGearAmount(bill, chargeTime.getHour());
+
+ // 查询订单在最大记录的用电量
+ BigDecimal maxEle = billEleRecordService.selectMaxEleByBillId(bill.getBillId());
+ if (maxEle == null) {
+ maxEle = bill.getSuitStartEle();
+ }
+
+ BillEleRecord po = new BillEleRecord();
+ po.setBillId(bill.getBillId());
+ po.setTotalEle(device.getTotalElectriQuantity());
+ po.setUsedEle(device.getTotalElectriQuantity().subtract(maxEle));
+ po.setRecordTime(time);
+ po.setTimeStart(timeStart);
+ po.setTimeEnd(timeEnd);
+ po.setPrice(price);
+ po.setTotalPrice(po.getPrice().multiply(po.getUsedEle()));
+
+ return po;
+ }
+}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/service/impl/BillEleRecordServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/service/impl/BillEleRecordServiceImpl.java
new file mode 100644
index 00000000..ae2f9a96
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/billEleRecord/service/impl/BillEleRecordServiceImpl.java
@@ -0,0 +1,129 @@
+package com.ruoyi.ss.billEleRecord.service.impl;
+
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.collection.CollectionUtils;
+import com.ruoyi.ss.billEleRecord.domain.BillEleRecord;
+import com.ruoyi.ss.billEleRecord.domain.BillEleRecordQuery;
+import com.ruoyi.ss.billEleRecord.domain.BillEleRecordVO;
+import com.ruoyi.ss.billEleRecord.mapper.BillEleRecordMapper;
+import com.ruoyi.ss.billEleRecord.service.BillEleRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 订单电量记录Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2025-01-04
+ */
+@Service
+public class BillEleRecordServiceImpl implements BillEleRecordService
+{
+ @Autowired
+ private BillEleRecordMapper billEleRecordMapper;
+
+ /**
+ * 查询订单电量记录
+ *
+ * @param id 订单电量记录主键
+ * @return 订单电量记录
+ */
+ @Override
+ public BillEleRecordVO selectBillEleRecordById(Long id)
+ {
+ return billEleRecordMapper.selectBillEleRecordById(id);
+ }
+
+ /**
+ * 查询订单电量记录列表
+ *
+ * @param billEleRecord 订单电量记录
+ * @return 订单电量记录
+ */
+ @Override
+ public List selectBillEleRecordList(BillEleRecordQuery billEleRecord)
+ {
+ return billEleRecordMapper.selectBillEleRecordList(billEleRecord);
+ }
+
+ /**
+ * 新增订单电量记录
+ *
+ * @param billEleRecord 订单电量记录
+ * @return 结果
+ */
+ @Override
+ public int insertBillEleRecord(BillEleRecord billEleRecord)
+ {
+ billEleRecord.setCreateTime(DateUtils.getNowDate());
+ return billEleRecordMapper.insertBillEleRecord(billEleRecord);
+ }
+
+ /**
+ * 修改订单电量记录
+ *
+ * @param billEleRecord 订单电量记录
+ * @return 结果
+ */
+ @Override
+ public int updateBillEleRecord(BillEleRecord billEleRecord)
+ {
+ return billEleRecordMapper.updateBillEleRecord(billEleRecord);
+ }
+
+ /**
+ * 批量删除订单电量记录
+ *
+ * @param ids 需要删除的订单电量记录主键
+ * @return 结果
+ */
+ @Override
+ public int deleteBillEleRecordByIds(Long[] ids)
+ {
+ return billEleRecordMapper.deleteBillEleRecordByIds(ids);
+ }
+
+ /**
+ * 删除订单电量记录信息
+ *
+ * @param id 订单电量记录主键
+ * @return 结果
+ */
+ @Override
+ public int deleteBillEleRecordById(Long id)
+ {
+ return billEleRecordMapper.deleteBillEleRecordById(id);
+ }
+
+ @Override
+ public int batchInsert(List list) {
+ if (CollectionUtils.isEmptyElement(list)) {
+ return 0;
+ }
+ Date now = DateUtils.getNowDate();
+ for (BillEleRecord record : list) {
+ record.setCreateTime(now);
+ }
+ return billEleRecordMapper.batchInsert(list);
+ }
+
+ @Override
+ public BigDecimal selectMaxEleByBillId(Long billId) {
+ if (billId == null) {
+ return null;
+ }
+ BillEleRecordQuery query = new BillEleRecordQuery();
+ query.setBillId(billId);
+ return billEleRecordMapper.selectMaxEle(query);
+ }
+
+ @Override
+ public BigDecimal selectSumOfTotalPrice(BillEleRecordQuery query) {
+ return billEleRecordMapper.selectSumOfTotalPrice(query);
+ }
+
+}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java
index e3ff999b..b0ffd619 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java
@@ -18,6 +18,9 @@ import com.ruoyi.dashboard.domain.vo.BillCountVo;
import com.ruoyi.iot.domain.response.CommandResponse;
import com.ruoyi.iot.service.IotService;
import com.ruoyi.ss.account.domain.AccountVO;
+import com.ruoyi.ss.billEleRecord.domain.BillEleRecordQuery;
+import com.ruoyi.ss.billEleRecord.service.BillEleRecordConverter;
+import com.ruoyi.ss.billEleRecord.service.BillEleRecordService;
import com.ruoyi.ss.bonus.domain.Bonus;
import com.ruoyi.ss.bonus.domain.BonusQuery;
import com.ruoyi.ss.bonus.domain.BonusVO;
@@ -176,6 +179,12 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
@Autowired
private RiskService riskService;
+ @Autowired
+ private BillEleRecordService billEleRecordService;
+
+ @Autowired
+ private BillEleRecordConverter billEleRecordConverter;
+
/**
* 查询充值记录
*
@@ -998,44 +1007,44 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
}
}
- private int endTimingUse(EndUseBO bo) {
- if (bo == null) {
- return 0;
- }
- TransactionBillVO order = bo.getOrder();
- DeviceVO device = bo.getDevice();
- ServiceUtil.assertion(order == null, "订单不存在");
- ServiceUtil.assertion(!TransactionBillStatus.SUCCESS_DEPOSIT.getStatus().equals(order.getStatus()), "当前订单状态不允许结束");
- ServiceUtil.assertion(order.getIsFinished() != null && order.getIsFinished(), "当前订单已结束,无法操作");
- ServiceUtil.assertion(device == null, "设备不存在");
-
- LocalDateTime endTime = LocalDateTime.now(); // 结束使用的时间
-
- // 结束使用的电量:若蓝牙传过来的值为空或者小于当前电量,则使用当前电量,否则使用蓝牙传输的电量
- BigDecimal totalEle = this.calcTotalEle(device, bo.getTotalEle());
-
- // 计算金额
- BigDecimal money = this.calcTimingAmount(order, endTime, totalEle);
-
- Integer result = transactionTemplate.execute(status -> {
- // 修改订单信息
- TransactionBill data = new TransactionBill();
- data.setSuitEndEle(totalEle);
- data.setSuitEndTime(endTime);
- data.setStatus(TransactionBillStatus.UNPAID.getStatus());
- data.setMoney(money);
- TransactionBillQuery query = new TransactionBillQuery();
- query.setStatus(TransactionBillStatus.SUCCESS_DEPOSIT.getStatus());
- query.setBillId(order.getBillId());
- query.setIsFinished(false);
- int update = this.updateByQuery(data, query);
- ServiceUtil.assertion(update != 1, "修改订单状态失败,请刷新后重试");
-
- return update;
- });
-
- return result == null ? 0 : result;
- }
+// private int endTimingUse(EndUseBO bo) {
+// if (bo == null) {
+// return 0;
+// }
+// TransactionBillVO order = bo.getOrder();
+// DeviceVO device = bo.getDevice();
+// ServiceUtil.assertion(order == null, "订单不存在");
+// ServiceUtil.assertion(!TransactionBillStatus.SUCCESS_DEPOSIT.getStatus().equals(order.getStatus()), "当前订单状态不允许结束");
+// ServiceUtil.assertion(order.getIsFinished() != null && order.getIsFinished(), "当前订单已结束,无法操作");
+// ServiceUtil.assertion(device == null, "设备不存在");
+//
+// LocalDateTime endTime = LocalDateTime.now(); // 结束使用的时间
+//
+// // 结束使用的电量:若蓝牙传过来的值为空或者小于当前电量,则使用当前电量,否则使用蓝牙传输的电量
+// BigDecimal totalEle = this.calcTotalEle(device, bo.getTotalEle());
+//
+// // 计算金额
+// BigDecimal money = this.calcTimingAmount(order, endTime, totalEle);
+//
+// Integer result = transactionTemplate.execute(status -> {
+// // 修改订单信息
+// TransactionBill data = new TransactionBill();
+// data.setSuitEndEle(totalEle);
+// data.setSuitEndTime(endTime);
+// data.setStatus(TransactionBillStatus.UNPAID.getStatus());
+// data.setMoney(money);
+// TransactionBillQuery query = new TransactionBillQuery();
+// query.setStatus(TransactionBillStatus.SUCCESS_DEPOSIT.getStatus());
+// query.setBillId(order.getBillId());
+// query.setIsFinished(false);
+// int update = this.updateByQuery(data, query);
+// ServiceUtil.assertion(update != 1, "修改订单状态失败,请刷新后重试");
+//
+// return update;
+// });
+//
+// return result == null ? 0 : result;
+// }
private BigDecimal calcTotalEle(DeviceVO device, BigDecimal totalEle) {
if (totalEle == null || totalEle.compareTo(device.getTotalElectriQuantity()) < 0) {
@@ -1051,14 +1060,14 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
if (SuitFeeType.TIMING_TIME.getType().equals(order.getSuitFeeType())) {
totalAmount = this.calcTimingTimeAmount(order, endTime);
} else if (SuitFeeType.TIMING_COUNT.getType().equals(order.getSuitFeeType())) {
- totalAmount = this.calcTimingCountAmount(order, endTime, totalEle);
+ totalAmount = this.calcTimingCountAmount(order);
} else {
throw new ServiceException("计算金额出错,套餐收费类型不支持");
}
// 最低金额不允许低于最低服务费
BigDecimal minService = sysConfigService.getBigDecimal(ConfigKey.RECHARGE_MIN_SERVICE);
- if (totalAmount.compareTo(minService) < 0) {
+ if (totalAmount == null || totalAmount.compareTo(minService) < 0) {
totalAmount = minService;
}
@@ -1289,10 +1298,45 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
}
// 计算分时段计量金额
- private BigDecimal calcTimingCountAmount(TransactionBillVO order, LocalDateTime endTime, BigDecimal totalEle) {
- BigDecimal startEle = order.getSuitStartEle() == null ? BigDecimal.ZERO : order.getSuitStartEle(); // 起始电量
- BigDecimal usedEle = totalEle == null ? BigDecimal.ZERO : totalEle.subtract(startEle); // 本次用电量
- return calcTimingCountAmount(order.getSuitGearAmount(), order.getSuitGearTime(), order.getSuitStartTime(), endTime, usedEle);
+ private BigDecimal calcTimingCountAmount(TransactionBillVO order) {
+ //---旧的
+// BigDecimal startEle = order.getSuitStartEle() == null ? BigDecimal.ZERO : order.getSuitStartEle(); // 起始电量
+// BigDecimal usedEle = totalEle == null ? BigDecimal.ZERO : totalEle.subtract(startEle); // 本次用电量
+// return calcTimingCountAmount(order.getSuitGearAmount(), order.getSuitGearTime(), order.getSuitStartTime(), endTime, usedEle);
+ // 旧的 ---
+
+ BillEleRecordQuery query = new BillEleRecordQuery();
+ query.setBillId(order.getBillId());
+ BigDecimal amount = billEleRecordService.selectSumOfTotalPrice(query);
+ if (amount == null) {
+ return BigDecimal.ZERO;
+ }
+ return amount;
+
+ // 查询订单电量记录
+// BillEleRecordQuery query = new BillEleRecordQuery();
+// query.setBillId(order.getBillId());
+// List recordList = billEleRecordService.selectBillEleRecordList(query);
+
+// // 拟创建新的记录
+// LocalDateTime now = LocalDateTime.now();
+// DeviceVO device = deviceService.selectById(order.getDeviceId());
+// deviceService.pullDeviceInfo(device, null);
+// BillEleRecord newRecord = billEleRecordConverter.toPo(order, device, now, now);
+// recordList.add((BillEleRecordVO) newRecord);
+//
+// // 记录根据记录时间排序
+// recordList.sort(Comparator.comparing(BillEleRecordVO::getRecordTime));
+//
+// // 计算每个记录的金额
+// BigDecimal lastEle = order.getSuitStartEle();
+// BigDecimal totalPrice = BigDecimal.ZERO;
+// for (BillEleRecordVO record : recordList) {
+//
+//
+// totalPrice.add(record.getPrice() * )
+// }
+
}
// 计算分时段计量金额
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/utils/RechargeUtils.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/utils/RechargeUtils.java
index ff639a3c..3c472928 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/utils/RechargeUtils.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/utils/RechargeUtils.java
@@ -1,5 +1,6 @@
package com.ruoyi.ss.transactionBill.utils;
+import com.ruoyi.common.utils.collection.CollectionUtils;
import com.ruoyi.ss.suit.domain.enums.SuitFeeMode;
import com.ruoyi.ss.suit.domain.enums.SuitFeeType;
import com.ruoyi.ss.suit.domain.enums.SuitTimeUnit;
@@ -148,4 +149,14 @@ public class RechargeUtils {
return round;
}
+ /**
+ * 获取分时段订单指定时段的金额
+ */
+ public static BigDecimal getGearAmount(TransactionBillVO bill, int hour) {
+ if (bill == null || CollectionUtils.isEmptyElement(bill.getSuitGearAmount()) || CollectionUtils.isEmptyElement(bill.getSuitGearTime()) || hour < 0) {
+ return null;
+ }
+
+ return bill.getSuitGearAmount().get(bill.getSuitGearTime().get(hour));
+ }
}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/task/billEleRecord/BillEleRecordTask.java b/smart-switch-service/src/main/java/com/ruoyi/task/billEleRecord/BillEleRecordTask.java
new file mode 100644
index 00000000..1529ab22
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/task/billEleRecord/BillEleRecordTask.java
@@ -0,0 +1,90 @@
+package com.ruoyi.task.billEleRecord;
+
+import com.ruoyi.common.utils.collection.CollectionUtils;
+import com.ruoyi.ss.billEleRecord.domain.BillEleRecord;
+import com.ruoyi.ss.billEleRecord.service.BillEleRecordConverter;
+import com.ruoyi.ss.billEleRecord.service.BillEleRecordService;
+import com.ruoyi.ss.device.domain.vo.DeviceVO;
+import com.ruoyi.ss.device.service.DeviceService;
+import com.ruoyi.ss.suit.domain.enums.SuitFeeMode;
+import com.ruoyi.ss.suit.domain.enums.SuitFeeType;
+import com.ruoyi.ss.transactionBill.domain.TransactionBillQuery;
+import com.ruoyi.ss.transactionBill.domain.enums.TransactionBillType;
+import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO;
+import com.ruoyi.ss.transactionBill.service.TransactionBillService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author wjh
+ * 2025/1/4
+ */
+@Component
+@Slf4j
+public class BillEleRecordTask {
+
+ @Autowired
+ private TransactionBillService transactionBillService;
+
+ @Autowired
+ private BillEleRecordService billEleRecordService;
+
+ @Autowired
+ private BillEleRecordConverter billEleRecordConverter;
+
+ @Autowired
+ private DeviceService deviceService;
+
+ // 记录分时段订单电量
+ public void record() {
+
+ // 查询未结束的分时段电量订单
+ TransactionBillQuery query = new TransactionBillQuery();
+ query.setType(TransactionBillType.RECHARGE.getType());
+ query.setIsFinished(false);
+ query.setSuitFeeMode(SuitFeeMode.SMART.getMode());
+ query.setSuitFeeType(SuitFeeType.TIMING_COUNT.getType());
+ List billList = transactionBillService.selectSmTransactionBillList(query);
+ if (CollectionUtils.isEmpty(billList)) {
+ log.info("记录分时段订单电量:暂无未结束的分时段电量订单");
+ return;
+ }
+ // 抄表时间
+ LocalDateTime time = LocalDateTime.now();
+ // 计费时间
+ LocalDateTime chargeTime = time.plusHours(-1);
+
+ // 查询设备列表
+ List deviceList = deviceService.selectByIds(CollectionUtils.map(billList, TransactionBillVO::getDeviceId));
+ deviceService.pullDeviceInfoList(deviceList, null);
+
+ // 待插入的记录列表
+ List recordList = new ArrayList<>();
+
+ // 记录电量
+ for (TransactionBillVO bill : billList) {
+ try {
+ DeviceVO device = deviceList.stream().filter(item -> Objects.equals(bill.getDeviceId(), item.getDeviceId())).findFirst().orElse(null);
+ if (device == null) {
+ continue;
+ }
+ BillEleRecord record = billEleRecordConverter.toPo(bill, device, time, chargeTime);
+ if (record != null) {
+ recordList.add(record);
+ }
+
+ } catch (Exception e) {
+ log.error("记录分时段订单电量失败,billNo:{}, {}", bill.getBillNo(), e.getMessage());
+ }
+ }
+
+ int insert = billEleRecordService.batchInsert(recordList);
+ log.info("记录分时段订单电量:共{}条记录", insert);
+ }
+}
diff --git a/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/BillEleRecordController.java b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/BillEleRecordController.java
new file mode 100644
index 00000000..f6c48b7f
--- /dev/null
+++ b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/BillEleRecordController.java
@@ -0,0 +1,100 @@
+package com.ruoyi.web.controller.ss;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.ss.billEleRecord.domain.BillEleRecordQuery;
+import com.ruoyi.ss.billEleRecord.domain.BillEleRecordVO;
+import com.ruoyi.ss.billEleRecord.service.BillEleRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 订单电量记录Controller
+ *
+ * @author ruoyi
+ * @date 2025-01-04
+ */
+@RestController
+@RequestMapping("/ss/billEleRecord")
+public class BillEleRecordController extends BaseController
+{
+ @Autowired
+ private BillEleRecordService billEleRecordService;
+
+ /**
+ * 查询订单电量记录列表
+ */
+ @PreAuthorize("@ss.hasPermi('ss:billEleRecord:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(BillEleRecordQuery query)
+ {
+ startPage();
+ startOrderBy();
+ List list = billEleRecordService.selectBillEleRecordList(query);
+ return getDataTable(list);
+ }
+
+ /**
+ * 导出订单电量记录列表
+ */
+ @PreAuthorize("@ss.hasPermi('ss:billEleRecord:export')")
+ @Log(title = "订单电量记录", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, BillEleRecordQuery query)
+ {
+ List list = billEleRecordService.selectBillEleRecordList(query);
+ ExcelUtil util = new ExcelUtil(BillEleRecordVO.class);
+ util.exportExcel(response, list, "订单电量记录数据");
+ }
+
+ /**
+ * 获取订单电量记录详细信息
+ */
+ @PreAuthorize("@ss.hasPermi('ss:billEleRecord:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") Long id)
+ {
+ return success(billEleRecordService.selectBillEleRecordById(id));
+ }
+
+ /**
+ * 新增订单电量记录
+ */
+// @PreAuthorize("@ss.hasPermi('ss:billEleRecord:add')")
+// @Log(title = "订单电量记录", businessType = BusinessType.INSERT)
+// @PostMapping
+// public AjaxResult add(@RequestBody BillEleRecord billEleRecord)
+// {
+// return toAjax(billEleRecordService.insertBillEleRecord(billEleRecord));
+// }
+//
+// /**
+// * 修改订单电量记录
+// */
+// @PreAuthorize("@ss.hasPermi('ss:billEleRecord:edit')")
+// @Log(title = "订单电量记录", businessType = BusinessType.UPDATE)
+// @PutMapping
+// public AjaxResult edit(@RequestBody BillEleRecord billEleRecord)
+// {
+// return toAjax(billEleRecordService.updateBillEleRecord(billEleRecord));
+// }
+//
+// /**
+// * 删除订单电量记录
+// */
+// @PreAuthorize("@ss.hasPermi('ss:billEleRecord:remove')")
+// @Log(title = "订单电量记录", businessType = BusinessType.DELETE)
+// @DeleteMapping("/{ids}")
+// public AjaxResult remove(@PathVariable Long[] ids)
+// {
+// return toAjax(billEleRecordService.deleteBillEleRecordByIds(ids));
+// }
+}