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 list); + + /** + * 批量修改${functionName} + */ + int batchUpdate(@Param("list") List 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)); +// } +}