This commit is contained in:
磷叶 2025-04-16 17:53:37 +08:00
parent cc628ffc94
commit 79dc7fde0f
7 changed files with 75 additions and 13 deletions

View File

@ -2,6 +2,7 @@ package com.ruoyi.bst.bonus.domain;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
@ -94,4 +95,7 @@ public class Bonus extends BaseEntity
@ApiModelProperty("运营区ID") @ApiModelProperty("运营区ID")
private Long areaId; private Long areaId;
@Excel(name = "其他可见用户ID列表")
@ApiModelProperty("其他可见用户ID列表")
private List<Long> viewUserIds;
} }

View File

@ -4,7 +4,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.bst.bonus.mapper.BonusMapper"> <mapper namespace="com.ruoyi.bst.bonus.mapper.BonusMapper">
<resultMap type="BonusVO" id="BonusResult" autoMapping="true"/> <resultMap type="BonusVO" id="BonusResult" autoMapping="true">
<result property="viewUserIds" column="view_user_ids" typeHandler="com.ruoyi.common.mybatis.typehandler.LongSplitListTypeHandler"/>
</resultMap>
<sql id="checkAmount"> <sql id="checkAmount">
bb.invalid_amount + bb.wait_amount + bb.payed_amount + bb.refund_amount = bb.amount bb.invalid_amount + bb.wait_amount + bb.payed_amount + bb.refund_amount = bb.amount
@ -30,7 +32,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
bb.to_balance, bb.to_balance,
bb.reason, bb.reason,
bb.create_time, bb.create_time,
bb.area_id bb.area_id,
bb.view_user_ids
from <include refid="searchTables"/> from <include refid="searchTables"/>
</sql> </sql>
@ -68,13 +71,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{item} #{item}
</foreach> </foreach>
</if> </if>
${@com.ruoyi.framework.util.DataScopeUtil@dataScope( ${@com.ruoyi.framework.util.DataScopeUtil@create(query.scope)
null, .userAlias("su.user_id")
"su.user_id", .userSetAlias("bb.view_user_ids")
null, .build()
null, }
query.scope
)}
${query.params.dataScope} ${query.params.dataScope}
</sql> </sql>
@ -111,6 +112,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="reason != null">reason,</if> <if test="reason != null">reason,</if>
<if test="createTime != null">create_time,</if> <if test="createTime != null">create_time,</if>
<if test="areaId != null">area_id,</if> <if test="areaId != null">area_id,</if>
<if test="viewUserIds != null">view_user_ids,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="bstId != null">#{bstId},</if> <if test="bstId != null">#{bstId},</if>
@ -131,6 +133,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="reason != null">#{reason},</if> <if test="reason != null">#{reason},</if>
<if test="createTime != null">#{createTime},</if> <if test="createTime != null">#{createTime},</if>
<if test="areaId != null">#{areaId},</if> <if test="areaId != null">#{areaId},</if>
<if test="viewUserIds != null">#{viewUserIds,typeHandler=com.ruoyi.common.mybatis.typehandler.LongSplitListTypeHandler},</if>
</trim> </trim>
</insert> </insert>
@ -155,6 +158,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
reason, reason,
create_time, create_time,
area_id, area_id,
view_user_ids
</trim> </trim>
values values
<foreach collection="list" item="i" separator=","> <foreach collection="list" item="i" separator=",">
@ -195,6 +199,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="i.createTime == null ">default,</if> <if test="i.createTime == null ">default,</if>
<if test="i.areaId != null ">#{i.areaId},</if> <if test="i.areaId != null ">#{i.areaId},</if>
<if test="i.areaId == null ">default,</if> <if test="i.areaId == null ">default,</if>
<if test="i.viewUserIds != null ">#{i.viewUserIds,typeHandler=com.ruoyi.common.mybatis.typehandler.LongSplitListTypeHandler},</if>
<if test="i.viewUserIds == null ">default,</if>
</trim> </trim>
</foreach> </foreach>
</insert> </insert>
@ -226,6 +232,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="data.reason != null">reason = #{data.reason},</if> <if test="data.reason != null">reason = #{data.reason},</if>
<if test="data.createTime != null">create_time = #{data.createTime},</if> <if test="data.createTime != null">create_time = #{data.createTime},</if>
<if test="data.areaId != null">area_id = #{data.areaId},</if> <if test="data.areaId != null">area_id = #{data.areaId},</if>
<if test="data.viewUserIds != null">view_user_ids = #{data.viewUserIds,typeHandler=com.ruoyi.common.mybatis.typehandler.LongSplitListTypeHandler},</if>
</sql> </sql>
<delete id="deleteBonusById" parameterType="Long"> <delete id="deleteBonusById" parameterType="Long">

View File

@ -2,6 +2,7 @@ package com.ruoyi.bst.bonus.service.impl;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -98,7 +99,7 @@ public class BonusConverterImpl implements BonusConverter {
return Collections.emptyList(); return Collections.emptyList();
} }
Long areaUserId = device.getAreaUserId(); // 运营区归属用户 Long areaUserId = device.getAreaUserId(); // 运营区归属用户(运营商)
Long areaAgentId = device.getAreaAgentId(); // 运营区代理商 Long areaAgentId = device.getAreaAgentId(); // 运营区代理商
BigDecimal totalPoint = BigDecimal.ZERO; // 已分成百分比 BigDecimal totalPoint = BigDecimal.ZERO; // 已分成百分比
BigDecimal decimal100 = new BigDecimal(100); BigDecimal decimal100 = new BigDecimal(100);
@ -111,6 +112,7 @@ public class BonusConverterImpl implements BonusConverter {
Bonus bonus = BonusUtil.getInitBonus(BonusArrivalType.JOIN, joinUserId, join.getUserName(), join.getPoint()); Bonus bonus = BonusUtil.getInitBonus(BonusArrivalType.JOIN, joinUserId, join.getUserName(), join.getPoint());
if (bonus != null) { if (bonus != null) {
result.add(bonus); result.add(bonus);
bonus.setViewUserIds(Arrays.asList(areaUserId, areaAgentId)); // 代理商运营商可见
totalPoint = totalPoint.add(bonus.getPoint()); totalPoint = totalPoint.add(bonus.getPoint());
} }
} }
@ -121,6 +123,7 @@ public class BonusConverterImpl implements BonusConverter {
Bonus bonus = BonusUtil.getInitBonus(BonusArrivalType.PARTNER, partner.getUserId(), partner.getUserName(), partner.getPoint()); Bonus bonus = BonusUtil.getInitBonus(BonusArrivalType.PARTNER, partner.getUserId(), partner.getUserName(), partner.getPoint());
if (bonus != null) { if (bonus != null) {
result.add(bonus); result.add(bonus);
bonus.setViewUserIds(Arrays.asList(areaUserId, areaAgentId)); // 代理商运营商可见
totalPoint = totalPoint.add(bonus.getPoint()); totalPoint = totalPoint.add(bonus.getPoint());
} }
} }
@ -131,6 +134,7 @@ public class BonusConverterImpl implements BonusConverter {
Bonus bonus = BonusUtil.getInitBonus(BonusArrivalType.MCH, areaUserId, device.getAreaUserName(), device.getAreaUserPoint().subtract(totalPoint)); Bonus bonus = BonusUtil.getInitBonus(BonusArrivalType.MCH, areaUserId, device.getAreaUserName(), device.getAreaUserPoint().subtract(totalPoint));
if (bonus != null) { if (bonus != null) {
result.add(bonus); result.add(bonus);
bonus.setViewUserIds(Arrays.asList(areaAgentId)); // 代理商可见
totalPoint = totalPoint.add(bonus.getPoint()); totalPoint = totalPoint.add(bonus.getPoint());
} }
} }
@ -163,6 +167,7 @@ public class BonusConverterImpl implements BonusConverter {
ServiceUtil.assertion(bonus.getPoint().compareTo(BigDecimal.ZERO) < 0, "分成计算错误,分成方【%s】分成百分比为负数", bonus.getArrivalName()); ServiceUtil.assertion(bonus.getPoint().compareTo(BigDecimal.ZERO) < 0, "分成计算错误,分成方【%s】分成百分比为负数", bonus.getArrivalName());
} }
return result; return result;
} }

View File

@ -331,6 +331,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
bd.lock_status, bd.lock_status,
bd.area_id, bd.area_id,
bd.order_device_id, bd.order_device_id,
bd.last_location_time,
bd.longitude,
bd.latitude,
bod.status as order_device_status, bod.status as order_device_status,
bod.order_id bod.order_id
from bst_device bd from bst_device bd

View File

@ -45,7 +45,7 @@ public enum OrderStatus {
// 可以退款的订单状态 // 可以退款的订单状态
public static List<String> canRefund() { public static List<String> canRefund() {
return CollectionUtils.map(OrderStatus::getCode, FINISHED, REFUNDED); return CollectionUtils.map(OrderStatus::getCode, FINISHED, REFUNDED, REJECTED, WAIT_VERIFY);
} }
// 未支付的订单状态 // 未支付的订单状态

View File

@ -27,6 +27,7 @@ import com.ruoyi.bst.orderDevice.domain.enums.OrderDeviceStatus;
import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.MathUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.iot.constants.IotConstants; import com.ruoyi.iot.constants.IotConstants;
import com.ruoyi.iot.domain.IotDeviceSysInfo; import com.ruoyi.iot.domain.IotDeviceSysInfo;
@ -80,11 +81,19 @@ public class IotReceiveServiceImpl implements IotReceiveService {
if (device == null) { if (device == null) {
return; return;
} }
// 转为设备信息 // 转为设备信息
IotDeviceSysInfo sys = IotUtil.toSysInfo(msg.getValue()); IotDeviceSysInfo sys = IotUtil.toSysInfo(msg.getValue());
LocalDateTime at = DateUtils.toLocalDateTime(msg.getAt());
// 处理设备定位BUG若出现BUG则重启设备
int handle = this.handleDeviceReboot(device, sys, at);
if (handle == 1) {
return;
}
// 设置设备信息 // 设置设备信息
DeviceUtil.setIotSysInfo(device, sys); DeviceUtil.setIotSysInfo(device, sys);
LocalDateTime at = DateUtils.toLocalDateTime(msg.getAt());
device.setLastTime(at); device.setLastTime(at);
device.setLastLocationTime(at); device.setLastLocationTime(at);
@ -104,6 +113,27 @@ public class IotReceiveServiceImpl implements IotReceiveService {
} }
} }
/**
* 处理设备重启
* @param device
*/
private int handleDeviceReboot(DeviceVO device, IotDeviceSysInfo sys, LocalDateTime at) {
if (device == null || StringUtils.isBlank(device.getMac()) || device.getLastLocationTime() == null || at == null) {
return 0;
}
boolean isOpen = DeviceLockStatus.OPEN.getCode().equals(device.getLockStatus()); // 是否开锁
// 需要在设备未启动的时候做否则可能有安全问题
if (!isOpen) {
// 若当前数据点的上报时间和设备内上次上报的时间不一样但是定位一样则重启设备
if (at.isAfter(device.getLastLocationTime()) && MathUtils.equals(device.getLongitude(), sys.getLon()) && MathUtils.equals(device.getLatitude(), sys.getLat())) {
deviceIotService.reboot(device, "设备不同时间的两次定位一样,重启设备", true);
return 1;
}
}
return 0;
}
/** /**
* 处理车辆运营区 * 处理车辆运营区
*/ */

View File

@ -1,6 +1,7 @@
package com.ruoyi.web.bst; package com.ruoyi.web.bst;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -13,8 +14,10 @@ import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.bst.bonus.domain.Bonus;
import com.ruoyi.bst.bonus.domain.BonusQuery; import com.ruoyi.bst.bonus.domain.BonusQuery;
import com.ruoyi.bst.bonus.domain.BonusVO; import com.ruoyi.bst.bonus.domain.BonusVO;
import com.ruoyi.bst.bonus.domain.enums.BonusArrivalType;
import com.ruoyi.bst.bonus.service.BonusService; import com.ruoyi.bst.bonus.service.BonusService;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
@ -80,7 +83,17 @@ public class BonusController extends BaseController
@PreAuthorize("@ss.hasPermi('bst:bonus:preview')") @PreAuthorize("@ss.hasPermi('bst:bonus:preview')")
@GetMapping(value = "/preview") @GetMapping(value = "/preview")
public AjaxResult preview(Long deviceId) { public AjaxResult preview(Long deviceId) {
return success(bonusService.preview(deviceId)); List<Bonus> list = bonusService.preview(deviceId);
// 若不是系统管理员则只返回当前用户可见信息
if (!isSysAdmin()) {
Long userId = getUserId();
list = list.stream().filter(bonus ->
BonusArrivalType.userList().contains(bonus.getArrivalType())
&& bonus.getViewUserIds() != null
&& bonus.getViewUserIds().contains(userId)
).collect(Collectors.toList());
}
return success(list);
} }
/** /**