套餐API

This commit is contained in:
墨大叔 2024-05-09 17:31:24 +08:00
parent d51db24133
commit a04c399c71
18 changed files with 391 additions and 17 deletions

View File

@ -22,6 +22,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="userId != null"> and su.user_id = #{userId}</if>
<if test="storeId != null"> and sd.store_id = #{storeId}</if>
<if test="deviceId != null"> and sd.device_id = #{deviceId}</if>
<if test="deviceNo != null"> and sd.device_no like concat('%', #{deviceNo}, '%')</if>
<if test="deviceIds != null and deviceIds.size() > 0">
and sd.device_id in
<foreach collection="deviceIds" open="(" close=")" separator="," item="item">

View File

@ -43,4 +43,7 @@ public class StoreQuery extends Store {
method = "name"
)
private String groupBy;
@ApiModelProperty("关键词")
private String keyword;
}

View File

@ -45,6 +45,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="deleted != null "> and ss.deleted = #{deleted}</if>
<if test="deleted == null "> and ss.deleted = false</if>
<if test="userName != null "> and su.user_name like concat('%', #{userName}, '%')</if>
<if test="keyword != null and keyword != ''">
and (
ss.name like concat('%', #{keyword}, '%')
or ss.contact_name like concat('%', #{keyword}, '%')
or ss.contact_mobile like concat('%', #{keyword}, '%')
or ss.address like concat('%', #{keyword}, '%')
)
</if>
<if test="center != null and center.size() == 2 and radius != null">
and #{radius} >= round(st_distance_sphere(point(#{center[0]}, #{center[1]}), point(ss.lng, ss.lat)))
</if>

View File

@ -4,6 +4,8 @@ import java.math.BigDecimal;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonView;
import com.ruoyi.common.core.domain.JsonViewProfile;
import com.ruoyi.common.core.domain.ValidGroup;
import com.ruoyi.ss.device.domain.DeviceView;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -12,6 +14,10 @@ import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/**
* 套餐对象 sm_suit
*
@ -24,35 +30,40 @@ public class Suit extends BaseEntity
private static final long serialVersionUID = 1L;
/** 套餐id */
@JsonView(DeviceView.SuitList.class)
@JsonView({DeviceView.SuitList.class, JsonViewProfile.AppMch.class})
@NotNull(message = "套餐id不允许为空", groups = {ValidGroup.Update.class, ValidGroup.FrontUpdate.class})
private Long suitId;
/** 设备id */
@Excel(name = "设备id")
@NotNull(message = "设备ID不允许为空", groups = {ValidGroup.Create.class, ValidGroup.FrontCreate.class})
@JsonView(JsonViewProfile.AppMch.class)
private Long deviceId;
/** 套餐名称 */
@Excel(name = "套餐名称")
@JsonView(DeviceView.SuitList.class)
@JsonView({DeviceView.SuitList.class, JsonViewProfile.AppMch.class})
@NotNull(message = "套餐名称不允许为空", groups = {ValidGroup.Create.class, ValidGroup.FrontCreate.class})
@Size(min = 1, max = 50, message = "套餐名称长度在1~50个字符之间")
private String name;
/** 通电时间(分) */
@Excel(name = "通电时间(分钟)")
@JsonView(DeviceView.SuitList.class)
@JsonView({DeviceView.SuitList.class, JsonViewProfile.AppMch.class})
@NotNull(message = "通电时间不允许为空", groups = {ValidGroup.Create.class, ValidGroup.FrontCreate.class})
@Min(value = 1, message = "通电时间不允许小于1分钟")
private BigDecimal value;
/** 价格(元) */
@Excel(name = "价格(元)")
@JsonView(DeviceView.SuitList.class)
@JsonView({DeviceView.SuitList.class, JsonViewProfile.AppMch.class})
@NotNull(message = "价格不允许为空", groups = {ValidGroup.Create.class, ValidGroup.FrontCreate.class})
@Min(value = 0, message = "价格不允许小于0")
private BigDecimal price;
/** 详细说明 */
@Excel(name = "详细说明")
@JsonView(DeviceView.SuitList.class)
@JsonView({DeviceView.SuitList.class, JsonViewProfile.AppMch.class})
@Size(max = 200, message = "详细说明长度不能超过200个字符")
private String description;
/** 删除标志 */
@Excel(name = "删除标志")
@JsonIgnore
private Boolean deleted;
}

View File

@ -0,0 +1,40 @@
package com.ruoyi.ss.suit.domain;
import lombok.Data;
/**
* @author wjh
* 2024/5/8
*/
@Data
public class SuitBO extends Suit {
/**
* 过滤APP创建字段
* @return
*/
public SuitBO filterCreateByApp() {
SuitBO bo = new SuitBO();
bo.setDeviceId(getDeviceId());
bo.setName(getName());
bo.setValue(getValue());
bo.setPrice(getPrice());
bo.setDescription(getDescription());
return bo;
}
/**
* 过滤APP更新字段
* @return
*/
public SuitBO filterUpdateByApp() {
SuitBO bo = new SuitBO();
bo.setSuitId(getSuitId());
bo.setDeviceId(getDeviceId());
bo.setName(getName());
bo.setValue(getValue());
bo.setPrice(getPrice());
bo.setDescription(getDescription());
return bo;
}
}

View File

@ -16,4 +16,10 @@ public class SuitQuery extends Suit {
@ApiModelProperty("设备id列表")
private List<Long> deviceIds;
@ApiModelProperty("套餐id列表")
private List<Long> suitIds;
@ApiModelProperty("商户id")
private Long mchId;
}

View File

@ -67,4 +67,11 @@ public interface SuitMapper
* @param suitIds ids
*/
int logicDel(@Param("suitIds") List<Long> suitIds);
/**
* 查询数量
* @param query
* @return
*/
int selectCount(SuitQuery query);
}

View File

@ -46,6 +46,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="deleted == null"> and ss.deleted = false</if>
<if test="deleted != null"> and ss.deleted = #{deleted}</if>
<if test="deviceName != null"> and sd.device_name like concat('%', #{deviceName}, '%')</if>
<if test="suitIds != null and suitIds.size() > 0">
and ss.suit_id in
<foreach item="item" collection="suitIds" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="mchId != null"> and store.user_id = #{mchId}</if>
</sql>
<select id="selectSuitList" parameterType="SuitQuery" resultMap="SuitResult">
@ -61,6 +68,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where ss.suit_id = #{suitId} and ss.deleted = false
</select>
<select id="selectCount" resultType="java.lang.Integer">
select count(ss.suit_id) as `count`
from sm_suit ss
left join sm_device sd on sd.device_id = ss.device_id
left join sm_store store on store.store_id = sd.store_id
<where>
<include refid="searchCondition"/>
</where>
</select>
<insert id="insertSuit" parameterType="Suit">
insert into sm_suit
<trim prefix="(" suffix=")" suffixOverrides=",">

View File

@ -84,4 +84,18 @@ public interface ISuitService
* @param keyMapper 分组映射方法需要保证唯一性
*/
<K> Map<K, List<SuitVo>> selectGroup(SuitQuery query, Function<? super SuitVo, ? extends K> keyMapper);
/**
* 根据设备查询套餐列表
* @param deviceId
* @return
*/
List<SuitVo> selectByDeviceId(Long deviceId);
/**
* 查询套餐数量
* @param query
* @return
*/
int selectCount(SuitQuery query);
}

View File

@ -1,6 +1,7 @@
package com.ruoyi.ss.suit.service;
import com.ruoyi.common.core.domain.ValidateResult;
import com.ruoyi.ss.suit.domain.SuitBO;
import org.springframework.stereotype.Service;
import java.util.List;
@ -12,5 +13,29 @@ import java.util.List;
*/
public interface SuitValidator {
/**
* 逻辑删除前校验
*/
ValidateResult preLogicDel(List<Long> suitIds);
/**
* APP删除前校验
*/
ValidateResult preLogicDelByApp(List<Long> ids);
/**
* APP创建前校验
*/
ValidateResult preCreateByApp(SuitBO suit);
/**
* APP更新前校验
*/
ValidateResult preUpdateByApp(SuitBO suit);
/**
* 判断这些套餐是否是指定客户的
*/
boolean isBelong(List<Long> ids, Long userId);
}

View File

@ -141,4 +141,31 @@ public class SuitServiceImpl implements ISuitService
}
return list.stream().collect(Collectors.groupingBy(keyMapper));
}
/**
* 根据设备查询套餐列表
*
* @param deviceId
* @return
*/
@Override
public List<SuitVo> selectByDeviceId(Long deviceId) {
if (deviceId == null) {
return Collections.emptyList();
}
SuitQuery query = new SuitQuery();
query.setDeviceId(deviceId);
return this.selectSuitList(query);
}
/**
* 查询套餐数量
*
* @param query
* @return
*/
@Override
public int selectCount(SuitQuery query) {
return suitMapper.selectCount(query);
}
}

View File

@ -2,11 +2,18 @@ package com.ruoyi.ss.suit.service.impl;
import com.ruoyi.common.core.domain.BaseValidator;
import com.ruoyi.common.core.domain.ValidateResult;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.ss.device.service.DeviceValidator;
import com.ruoyi.ss.suit.domain.SuitBO;
import com.ruoyi.ss.suit.domain.SuitQuery;
import com.ruoyi.ss.suit.service.ISuitService;
import com.ruoyi.ss.suit.service.SuitValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import com.ruoyi.common.utils.CollectionUtils;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
/**
@ -16,11 +23,99 @@ import java.util.List;
*/
@Service
public class SuitValidatorImpl extends BaseValidator implements SuitValidator {
@Autowired
private DeviceValidator deviceValidator;
@Autowired
private ISuitService suitService;
@Override
public ValidateResult preLogicDel(List<Long> suitIds) {
if (CollectionUtils.isEmpty(suitIds)) {
if (CollectionUtils.isEmptyElement(suitIds)) {
return error("数据不允许为空");
}
return success();
}
/**
* APP删除前校验
*
* @param ids
*/
@Override
public ValidateResult preLogicDelByApp(List<Long> ids) {
ValidateResult result = this.preLogicDel(ids);
if (result.isError()) {
return result;
}
if (!this.isBelong(ids, SecurityUtils.getUserId())) {
return error("您没有权限删除这些套餐");
}
return success();
}
/**
* APP创建前校验
*
* @param suit
* @return
*/
@Override
public ValidateResult preCreateByApp(SuitBO suit) {
if (suit == null) {
return error("数据不允许为空");
}
// 设备校验
if (!deviceValidator.isBelong(suit.getDeviceId(), SecurityUtils.getUserId())) {
return error("该设备不属于该用户");
}
return success();
}
/**
* APP更新前校验
*
* @param suit
* @return
*/
@Override
public ValidateResult preUpdateByApp(SuitBO suit) {
if (suit == null) {
return error("数据不允许为空");
}
Long userId = SecurityUtils.getUserId();
// 判断套餐是否属于用户
if (!this.isBelong(Collections.singletonList(suit.getSuitId()), userId)) {
return error("您无权修改该套餐");
}
// 设备校验
if (suit.getDeviceId() != null) {
if (!deviceValidator.isBelong(suit.getDeviceId(), userId)) {
return error("该设备不属于该用户");
}
}
return success();
}
/**
* 判断这些套餐是否是指定用户的
*/
@Override
public boolean isBelong(List<Long> ids, Long userId) {
if (CollectionUtils.isEmptyElement(ids) || userId == null) {
return false;
}
SuitQuery query = new SuitQuery();
query.setSuitIds(ids);
query.setMchId(userId);
return suitService.selectCount(query) == new HashSet<>(ids).size();
}
}

View File

@ -27,6 +27,7 @@ public class SmUserVo extends SmUser {
@Excel(name = "提现金额")
@ApiModelProperty("提现金额")
@JsonView(JsonViewProfile.App.class)
private BigDecimal withDrawlAmount; // 提现金额
@ApiModelProperty("总收入")

View File

@ -18,6 +18,10 @@ import com.ruoyi.ss.device.domain.enums.DevicePowerStatus;
import com.ruoyi.ss.device.domain.vo.SmDeviceVo;
import com.ruoyi.ss.device.service.ISmDeviceService;
import com.ruoyi.ss.meterReadingRecord.service.ISmMeterReadingRecordService;
import com.ruoyi.ss.transactionBill.domain.TransactionBillQuery;
import com.ruoyi.ss.transactionBill.domain.enums.TransactionBillStatus;
import com.ruoyi.ss.transactionBill.domain.enums.TransactionBillType;
import com.ruoyi.ss.transactionBill.service.TransactionBillService;
import com.ruoyi.web.core.annotation.MchRequired;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -52,9 +56,13 @@ public class AppDeviceController extends BaseController {
@Value("${debug}")
private Boolean debug;
@Autowired
private DeviceValidator deviceValidator;
@Autowired
private TransactionBillService transactionBillService;
/**
* 修改设备
*/

View File

@ -123,10 +123,9 @@ public class AppStoreController extends BaseController {
@GetMapping("/listNearBy")
@JsonView(JsonViewProfile.App.class)
@Anonymous
public TableDataInfo listNearBy(@Validated(ValidGroup.Query.class) StoreQuery query) {
startPage();
public AjaxResult listNearBy(@Validated(ValidGroup.Query.class) StoreQuery query) {
List<StoreVo> list = storeService.listNearBy(query);
return getDataTable(list);
return success(list);
}
@ApiOperation("获取店铺信息")

View File

@ -0,0 +1,91 @@
package com.ruoyi.web.controller.app;
import com.fasterxml.jackson.annotation.JsonView;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.JsonViewProfile;
import com.ruoyi.common.core.domain.ValidGroup;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.ServiceUtil;
import com.ruoyi.ss.device.service.DeviceValidator;
import com.ruoyi.ss.suit.domain.SuitBO;
import com.ruoyi.ss.suit.domain.SuitVo;
import com.ruoyi.ss.suit.service.ISuitService;
import com.ruoyi.ss.suit.service.SuitValidator;
import com.ruoyi.web.core.annotation.MchRequired;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
/**
* @author wjh
* 2024/5/8
*/
@RestController
@RequestMapping("/app/suit")
public class AppSuitController extends BaseController {
@Autowired
private ISuitService suitService;
@Autowired
private SuitValidator suitValidator;
@Autowired
private DeviceValidator deviceValidator;
@ApiOperation("查询设备套餐列表")
@MchRequired
@JsonView(JsonViewProfile.AppMch.class)
@GetMapping("/listByDeviceId/{deviceId}")
public AjaxResult list(@PathVariable Long deviceId)
{
ServiceUtil.assertion(!deviceValidator.isBelong(deviceId, getUserId()), "这不是您的设备,无法查看");
List<SuitVo> list = suitService.selectByDeviceId(deviceId);
return success(list);
}
@ApiOperation("获取套餐详细信息")
@JsonView(JsonViewProfile.AppMch.class)
@MchRequired
@GetMapping("/{suitId}")
public AjaxResult getInfo(@PathVariable("suitId") Long suitId) {
return success(suitService.selectSuitBySuitId(suitId));
}
@ApiOperation("新增套餐")
@PostMapping
@MchRequired
public AjaxResult add(@RequestBody @Validated({ValidGroup.FrontCreate.class}) SuitBO suit) {
suit = suit.filterCreateByApp();
ServiceUtil.assertion(suitValidator.preCreateByApp(suit));
return success(suitService.insertSuit(suit));
}
@ApiOperation("修改套餐")
@MchRequired
@PutMapping
public AjaxResult edit(@RequestBody @Validated({ValidGroup.FrontUpdate.class}) SuitBO suit)
{
suit = suit.filterUpdateByApp();
ServiceUtil.assertion(suitValidator.preUpdateByApp(suit));
return success(suitService.updateSuit(suit));
}
@MchRequired
@ApiOperation("删除套餐")
@DeleteMapping("/{suitIds}")
public AjaxResult remove(@PathVariable @ApiParam("套餐id列表") Long[] suitIds)
{
List<Long> ids = Arrays.asList(suitIds);
ServiceUtil.assertion(suitValidator.preLogicDelByApp(ids));
return success(suitService.logicDel(ids) >= 1);
}
}

View File

@ -9,6 +9,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.UserType;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ServiceUtil;
import com.ruoyi.ss.device.service.DeviceValidator;
import com.ruoyi.ss.transactionBill.domain.TransactionBill;
import com.ruoyi.ss.transactionBill.domain.TransactionBillQuery;
import com.ruoyi.ss.transactionBill.domain.bo.TransactionBillBO;
@ -56,6 +57,9 @@ public class AppTransactionBillController extends BaseController
@Autowired
private TransactionBillValidator transactionBillValidator;
@Autowired
private DeviceValidator deviceValidator;
/**
* 查询充值记录列表
*/
@ -190,4 +194,18 @@ public class AppTransactionBillController extends BaseController
return AjaxResult.success(smTransactionBillService.selectDeviceRechargeFailList(getUserId()));
}
@MchRequired
@ApiOperation("获取设备充值列表")
@GetMapping("/rechargeListByDevice")
@JsonView(JsonViewProfile.AppMch.class)
public TableDataInfo getDeviceRechargeList(@RequestParam @ApiParam("设备id") Long deviceId) {
ServiceUtil.assertion(!deviceValidator.isBelong(deviceId, getUserId()), "这不是您的设备,无法查询");
TransactionBillQuery query = new TransactionBillQuery();
query.setDeviceId(deviceId);
query.setType(TransactionBillType.RECHARGE.getType());
query.setStatus(TransactionBillStatus.SUCCESS.getStatus());
startPage();
return getDataTable(smTransactionBillService.selectSmTransactionBillList(query));
}
}

View File

@ -4,12 +4,15 @@ import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.core.domain.ValidGroup;
import com.ruoyi.common.utils.ServiceUtil;
import com.ruoyi.ss.suit.domain.SuitBO;
import com.ruoyi.ss.suit.domain.SuitQuery;
import com.ruoyi.ss.suit.domain.SuitVo;
import com.ruoyi.ss.suit.service.SuitValidator;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
@ -84,7 +87,7 @@ public class SuitController extends BaseController
@PreAuthorize("@ss.hasPermi('ss:suit:add')")
@Log(title = "套餐", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody Suit suit)
public AjaxResult add(@RequestBody @Validated(ValidGroup.Create.class) SuitBO suit)
{
return toAjax(suitService.insertSuit(suit));
}
@ -95,7 +98,7 @@ public class SuitController extends BaseController
@PreAuthorize("@ss.hasPermi('ss:suit:edit')")
@Log(title = "套餐", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody Suit suit)
public AjaxResult edit(@RequestBody @Validated(ValidGroup.Update.class) Suit suit)
{
return toAjax(suitService.updateSuit(suit));
}