临时提交

This commit is contained in:
磷叶 2025-01-04 18:05:32 +08:00
parent 45e1dca5be
commit cb2503266d
15 changed files with 959 additions and 51 deletions

View File

@ -23,7 +23,7 @@ public interface ${ClassName}Mapper
* @param ${pkColumn.javaField} ${functionName}主键 * @param ${pkColumn.javaField} ${functionName}主键
* @return ${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}列表 * 查询${functionName}列表
@ -31,7 +31,7 @@ public interface ${ClassName}Mapper
* @param query ${functionName} * @param query ${functionName}
* @return ${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} * 新增${functionName}
@ -39,7 +39,17 @@ public interface ${ClassName}Mapper
* @param ${className} ${functionName} * @param ${className} ${functionName}
* @return 结果 * @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} * 修改${functionName}
@ -55,7 +65,7 @@ public interface ${ClassName}Mapper
* @param ${pkColumn.javaField} ${functionName}主键 * @param ${pkColumn.javaField} ${functionName}主键
* @return 结果 * @return 结果
*/ */
public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
/** /**
* 批量删除${functionName} * 批量删除${functionName}
@ -72,7 +82,7 @@ public interface ${ClassName}Mapper
* @param ${pkColumn.javaField}s 需要删除的数据主键集合 * @param ${pkColumn.javaField}s 需要删除的数据主键集合
* @return 结果 * @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} * 批量新增${subTable.functionName}
@ -80,7 +90,7 @@ public interface ${ClassName}Mapper
* @param ${subclassName}List ${subTable.functionName}列表 * @param ${subclassName}List ${subTable.functionName}列表
* @return 结果 * @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 * @param ${pkColumn.javaField} ${functionName}ID
* @return 结果 * @return 结果
*/ */
public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField});
#end #end
} }

View File

@ -99,6 +99,52 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</trim> </trim>
</insert> </insert>
<insert id="batchInsert" parameterType="${ClassName}"#if($pkColumn.increment) useGeneratedKeys="true" keyProperty="$pkColumn.javaField"#end>
insert into ${tableName}
<trim prefix="(" suffix=")" suffixOverrides=",">
#foreach($column in $columns)
#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment)
$column.columnName,
#end
#end
</trim>
values
<foreach collection="list" item="i" separator=",">
<trim prefix="(" suffix=")" suffixOverrides=",">
#foreach($column in $columns)
#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment)
<if test="i.$column.javaField != null #if($column.javaType == 'String' && $column.required) and i.$column.javaField != ''#end">#{i.$column.javaField},</if>
<if test="i.$column.javaField == null #if($column.javaType == 'String' && $column.required) or i.$column.javaField == ''#end">default,</if>
#end
#end
</trim>
</foreach>
</insert>
<update id="batchUpdate">
update ${tableName}
<trim prefix="SET" suffixOverrides=",">
#foreach($column in $columns)
#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment)
<foreach open="$column.columnName = CASE $pkColumn.columnName" collection="list" item="item" close="END,">
<choose>
<when test="item.$column.javaField != null #if($column.javaType == 'String' && $column.required) and item.$column.javaField != ''#end">
WHEN #{item.$pkColumn.columnName} THEN #{item.$column.javaField}
</when>
<otherwise>
WHEN #{item.$pkColumn.columnName} THEN `$column.columnName`
</otherwise>
</choose>
</foreach>
#end
#end
</trim>
where $pkColumn.columnName in
<foreach item="item" collection="list" open="(" separator="," close=")">
#{item.$pkColumn.javaField}
</foreach>
</update>
<update id="update${ClassName}" parameterType="${ClassName}"> <update id="update${ClassName}" parameterType="${ClassName}">
update ${tableName} update ${tableName}
<trim prefix="SET" suffixOverrides=","> <trim prefix="SET" suffixOverrides=",">

View File

@ -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;
}

View File

@ -0,0 +1,11 @@
package com.ruoyi.ss.billEleRecord.domain;
import lombok.Data;
/**
* @author wjh
* 2025/1/4
*/
@Data
public class BillEleRecordQuery extends BillEleRecordVO {
}

View File

@ -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;
}

View File

@ -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<BillEleRecordVO> 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<BillEleRecord> list);
BigDecimal selectMaxEle(@Param("query") BillEleRecordQuery query);
BigDecimal selectSumOfTotalPrice(@Param("query") BillEleRecordQuery query);
}

View File

@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.ss.billEleRecord.mapper.BillEleRecordMapper">
<resultMap type="BillEleRecordVO" id="BillEleRecordResult" autoMapping="true"/>
<sql id="selectBillEleRecordVo">
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
</sql>
<sql id="searchCondition">
<if test="query.id != null "> and sber.id = #{query.id}</if>
<if test="query.billId != null "> and sber.bill_id = #{query.billId}</if>
<if test="query.billNo != null "> and stb.bill_no like concat('%',#{query.billNo},'%')</if>
${query.params.dataScope}
</sql>
<select id="selectBillEleRecordList" parameterType="BillEleRecordQuery" resultMap="BillEleRecordResult">
<include refid="selectBillEleRecordVo"/>
<where>
<include refid="searchCondition"/>
</where>
</select>
<select id="selectBillEleRecordById" parameterType="Long" resultMap="BillEleRecordResult">
<include refid="selectBillEleRecordVo"/>
where sber.id = #{id}
</select>
<select id="selectMaxEle" resultType="java.math.BigDecimal">
select max(sber.total_ele)
from ss_bill_ele_record sber
<where>
<include refid="searchCondition"/>
</where>
</select>
<select id="selectSumOfTotalPrice" resultType="java.math.BigDecimal">
select sum(sber.total_price)
from ss_bill_ele_record sber
<where>
<include refid="searchCondition"/>
</where>
</select>
<insert id="insertBillEleRecord" parameterType="BillEleRecord" useGeneratedKeys="true" keyProperty="id">
insert into ss_bill_ele_record
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="billId != null">bill_id,</if>
<if test="totalEle != null">total_ele,</if>
<if test="usedEle != null">used_ele,</if>
<if test="price != null">price,</if>
<if test="totalPrice != null">total_price,</if>
<if test="createTime != null">create_time,</if>
<if test="timeStart != null">time_start,</if>
<if test="timeEnd != null">time_end,</if>
<if test="recordTime != null">record_time,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="billId != null">#{billId},</if>
<if test="totalEle != null">#{totalEle},</if>
<if test="usedEle != null">#{usedEle},</if>
<if test="price != null">#{price},</if>
<if test="totalPrice != null">#{totalPrice},</if>
<if test="createTime != null">#{createTime},</if>
<if test="timeStart != null">#{timeStart},</if>
<if test="timeEnd != null">#{timeEnd},</if>
<if test="recordTime != null">#{recordTime},</if>
</trim>
</insert>
<insert id="batchInsert" parameterType="BillEleRecord" useGeneratedKeys="true" keyProperty="id">
insert into ss_bill_ele_record
<trim prefix="(" suffix=")" suffixOverrides=",">
bill_id,
total_ele,
used_ele,
price,
total_price,
create_time,
time_start,
time_end,
record_time,
</trim>
values
<foreach collection="list" item="i" separator=",">
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="i.billId != null ">#{i.billId},</if>
<if test="i.billId == null ">default,</if>
<if test="i.totalEle != null ">#{i.totalEle},</if>
<if test="i.totalEle == null ">default,</if>
<if test="i.usedEle != null ">#{i.usedEle},</if>
<if test="i.usedEle == null ">default,</if>
<if test="i.price != null ">#{i.price},</if>
<if test="i.price == null ">default,</if>
<if test="i.totalPrice != null ">#{i.totalPrice},</if>
<if test="i.totalPrice == null ">default,</if>
<if test="i.createTime != null ">#{i.createTime},</if>
<if test="i.createTime == null ">default,</if>
<if test="i.timeStart != null ">#{i.timeStart},</if>
<if test="i.timeStart == null ">default,</if>
<if test="i.timeEnd != null ">#{i.timeEnd},</if>
<if test="i.timeEnd == null ">default,</if>
<if test="i.recordTime != null ">#{i.recordTime},</if>
<if test="i.recordTime == null ">default,</if>
</trim>
</foreach>
</insert>
<update id="updateBillEleRecord" parameterType="BillEleRecord">
update ss_bill_ele_record
<trim prefix="SET" suffixOverrides=",">
<include refid="updateColumns"/>
</trim>
where id = #{data.id}
</update>
<sql id="updateColumns">
<if test="data.billId != null">bill_id = #{data.billId},</if>
<if test="data.totalEle != null">total_ele = #{data.totalEle},</if>
<if test="data.usedEle != null">used_ele = #{data.usedEle},</if>
<if test="data.price != null">price = #{data.price},</if>
<if test="data.totalPrice != null">total_price = #{data.totalPrice},</if>
<if test="data.createTime != null">create_time = #{data.createTime},</if>
<if test="data.timeStart != null">time_start = #{data.timeStart},</if>
<if test="data.timeEnd != null">time_end = #{data.timeEnd},</if>
<if test="data.recordTime != null">record_time = #{data.recordTime},</if>
</sql>
<delete id="deleteBillEleRecordById" parameterType="Long">
delete from ss_bill_ele_record where id = #{id}
</delete>
<delete id="deleteBillEleRecordByIds" parameterType="String">
delete from ss_bill_ele_record where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -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);
}

View File

@ -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<BillEleRecordVO> 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<BillEleRecord> list);
/**
* 查询订单最大记录的用电量
*/
BigDecimal selectMaxEleByBillId(Long billId);
/**
* 查询订单总金额
*/
BigDecimal selectSumOfTotalPrice(BillEleRecordQuery query);
}

View File

@ -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;
}
}

View File

@ -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<BillEleRecordVO> 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<BillEleRecord> 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);
}
}

View File

@ -18,6 +18,9 @@ import com.ruoyi.dashboard.domain.vo.BillCountVo;
import com.ruoyi.iot.domain.response.CommandResponse; import com.ruoyi.iot.domain.response.CommandResponse;
import com.ruoyi.iot.service.IotService; import com.ruoyi.iot.service.IotService;
import com.ruoyi.ss.account.domain.AccountVO; 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.Bonus;
import com.ruoyi.ss.bonus.domain.BonusQuery; import com.ruoyi.ss.bonus.domain.BonusQuery;
import com.ruoyi.ss.bonus.domain.BonusVO; import com.ruoyi.ss.bonus.domain.BonusVO;
@ -176,6 +179,12 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
@Autowired @Autowired
private RiskService riskService; 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) { // private int endTimingUse(EndUseBO bo) {
if (bo == null) { // if (bo == null) {
return 0; // return 0;
} // }
TransactionBillVO order = bo.getOrder(); // TransactionBillVO order = bo.getOrder();
DeviceVO device = bo.getDevice(); // DeviceVO device = bo.getDevice();
ServiceUtil.assertion(order == null, "订单不存在"); // ServiceUtil.assertion(order == null, "订单不存在");
ServiceUtil.assertion(!TransactionBillStatus.SUCCESS_DEPOSIT.getStatus().equals(order.getStatus()), "当前订单状态不允许结束"); // ServiceUtil.assertion(!TransactionBillStatus.SUCCESS_DEPOSIT.getStatus().equals(order.getStatus()), "当前订单状态不允许结束");
ServiceUtil.assertion(order.getIsFinished() != null && order.getIsFinished(), "当前订单已结束,无法操作"); // ServiceUtil.assertion(order.getIsFinished() != null && order.getIsFinished(), "当前订单已结束,无法操作");
ServiceUtil.assertion(device == null, "设备不存在"); // ServiceUtil.assertion(device == null, "设备不存在");
//
LocalDateTime endTime = LocalDateTime.now(); // 结束使用的时间 // LocalDateTime endTime = LocalDateTime.now(); // 结束使用的时间
//
// 结束使用的电量若蓝牙传过来的值为空或者小于当前电量则使用当前电量否则使用蓝牙传输的电量 // // 结束使用的电量若蓝牙传过来的值为空或者小于当前电量则使用当前电量否则使用蓝牙传输的电量
BigDecimal totalEle = this.calcTotalEle(device, bo.getTotalEle()); // BigDecimal totalEle = this.calcTotalEle(device, bo.getTotalEle());
//
// 计算金额 // // 计算金额
BigDecimal money = this.calcTimingAmount(order, endTime, totalEle); // BigDecimal money = this.calcTimingAmount(order, endTime, totalEle);
//
Integer result = transactionTemplate.execute(status -> { // Integer result = transactionTemplate.execute(status -> {
// 修改订单信息 // // 修改订单信息
TransactionBill data = new TransactionBill(); // TransactionBill data = new TransactionBill();
data.setSuitEndEle(totalEle); // data.setSuitEndEle(totalEle);
data.setSuitEndTime(endTime); // data.setSuitEndTime(endTime);
data.setStatus(TransactionBillStatus.UNPAID.getStatus()); // data.setStatus(TransactionBillStatus.UNPAID.getStatus());
data.setMoney(money); // data.setMoney(money);
TransactionBillQuery query = new TransactionBillQuery(); // TransactionBillQuery query = new TransactionBillQuery();
query.setStatus(TransactionBillStatus.SUCCESS_DEPOSIT.getStatus()); // query.setStatus(TransactionBillStatus.SUCCESS_DEPOSIT.getStatus());
query.setBillId(order.getBillId()); // query.setBillId(order.getBillId());
query.setIsFinished(false); // query.setIsFinished(false);
int update = this.updateByQuery(data, query); // int update = this.updateByQuery(data, query);
ServiceUtil.assertion(update != 1, "修改订单状态失败,请刷新后重试"); // ServiceUtil.assertion(update != 1, "修改订单状态失败,请刷新后重试");
//
return update; // return update;
}); // });
//
return result == null ? 0 : result; // return result == null ? 0 : result;
} // }
private BigDecimal calcTotalEle(DeviceVO device, BigDecimal totalEle) { private BigDecimal calcTotalEle(DeviceVO device, BigDecimal totalEle) {
if (totalEle == null || totalEle.compareTo(device.getTotalElectriQuantity()) < 0) { 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())) { if (SuitFeeType.TIMING_TIME.getType().equals(order.getSuitFeeType())) {
totalAmount = this.calcTimingTimeAmount(order, endTime); totalAmount = this.calcTimingTimeAmount(order, endTime);
} else if (SuitFeeType.TIMING_COUNT.getType().equals(order.getSuitFeeType())) { } else if (SuitFeeType.TIMING_COUNT.getType().equals(order.getSuitFeeType())) {
totalAmount = this.calcTimingCountAmount(order, endTime, totalEle); totalAmount = this.calcTimingCountAmount(order);
} else { } else {
throw new ServiceException("计算金额出错,套餐收费类型不支持"); throw new ServiceException("计算金额出错,套餐收费类型不支持");
} }
// 最低金额不允许低于最低服务费 // 最低金额不允许低于最低服务费
BigDecimal minService = sysConfigService.getBigDecimal(ConfigKey.RECHARGE_MIN_SERVICE); BigDecimal minService = sysConfigService.getBigDecimal(ConfigKey.RECHARGE_MIN_SERVICE);
if (totalAmount.compareTo(minService) < 0) { if (totalAmount == null || totalAmount.compareTo(minService) < 0) {
totalAmount = minService; totalAmount = minService;
} }
@ -1289,10 +1298,45 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
} }
// 计算分时段计量金额 // 计算分时段计量金额
private BigDecimal calcTimingCountAmount(TransactionBillVO order, LocalDateTime endTime, BigDecimal totalEle) { private BigDecimal calcTimingCountAmount(TransactionBillVO order) {
BigDecimal startEle = order.getSuitStartEle() == null ? BigDecimal.ZERO : order.getSuitStartEle(); // 起始电量 //---旧的
BigDecimal usedEle = totalEle == null ? BigDecimal.ZERO : totalEle.subtract(startEle); // 本次用电量 // BigDecimal startEle = order.getSuitStartEle() == null ? BigDecimal.ZERO : order.getSuitStartEle(); // 起始电量
return calcTimingCountAmount(order.getSuitGearAmount(), order.getSuitGearTime(), order.getSuitStartTime(), endTime, usedEle); // 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<BillEleRecordVO> 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() * )
// }
} }
// 计算分时段计量金额 // 计算分时段计量金额

View File

@ -1,5 +1,6 @@
package com.ruoyi.ss.transactionBill.utils; 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.SuitFeeMode;
import com.ruoyi.ss.suit.domain.enums.SuitFeeType; import com.ruoyi.ss.suit.domain.enums.SuitFeeType;
import com.ruoyi.ss.suit.domain.enums.SuitTimeUnit; import com.ruoyi.ss.suit.domain.enums.SuitTimeUnit;
@ -148,4 +149,14 @@ public class RechargeUtils {
return round; 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));
}
} }

View File

@ -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<TransactionBillVO> billList = transactionBillService.selectSmTransactionBillList(query);
if (CollectionUtils.isEmpty(billList)) {
log.info("记录分时段订单电量:暂无未结束的分时段电量订单");
return;
}
// 抄表时间
LocalDateTime time = LocalDateTime.now();
// 计费时间
LocalDateTime chargeTime = time.plusHours(-1);
// 查询设备列表
List<DeviceVO> deviceList = deviceService.selectByIds(CollectionUtils.map(billList, TransactionBillVO::getDeviceId));
deviceService.pullDeviceInfoList(deviceList, null);
// 待插入的记录列表
List<BillEleRecord> 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);
}
}

View File

@ -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<BillEleRecordVO> 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<BillEleRecordVO> list = billEleRecordService.selectBillEleRecordList(query);
ExcelUtil<BillEleRecordVO> util = new ExcelUtil<BillEleRecordVO>(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));
// }
}