diff --git a/smart-switch-service/pom.xml b/smart-switch-service/pom.xml index 47389369..8bf57335 100644 --- a/smart-switch-service/pom.xml +++ b/smart-switch-service/pom.xml @@ -22,6 +22,12 @@ com.ruoyi smart-switch-system + + + org.springframework.boot + spring-boot-starter-test + test + diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/dashboard/BillCountVo.java b/smart-switch-service/src/main/java/com/ruoyi/ss/dashboard/BillCountVo.java index 1dd3b749..5a403213 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/dashboard/BillCountVo.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/dashboard/BillCountVo.java @@ -1,6 +1,9 @@ package com.ruoyi.ss.dashboard; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonView; +import com.ruoyi.common.core.domain.JsonViewProfile; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -14,40 +17,68 @@ import java.util.Date; */ @Data public class BillCountVo { + + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonView(JsonViewProfile.AppMch.class) @ApiModelProperty("年") private Integer createYear; // 年 + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonView(JsonViewProfile.AppMch.class) @ApiModelProperty("月") private Integer createMonth; // 月 + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonView(JsonViewProfile.AppMch.class) @ApiModelProperty("日") private Integer createDay; // 日 + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonView(JsonViewProfile.AppMch.class) @ApiModelProperty("日期") @JsonFormat(pattern = "yyyy-MM-dd") private Date createDate; // 日期 + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonView(JsonViewProfile.AppMch.class) @ApiModelProperty("年月") private String createYearMonth; // 年月 + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonView(JsonViewProfile.AppMch.class) @ApiModelProperty("时间(小时)") private Integer createHour; // 时间(小时) + @JsonInclude(JsonInclude.Include.NON_NULL) @ApiModelProperty("店铺id") private Long storeId; + @JsonInclude(JsonInclude.Include.NON_NULL) + @ApiModelProperty("设备id") + private Long deviceId; + + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonView(JsonViewProfile.AppMch.class) @ApiModelProperty("充值金额(收入)") private BigDecimal recharge; // 充值金额 + @JsonInclude(JsonInclude.Include.NON_NULL) @ApiModelProperty("提现金额") private BigDecimal withdraw; // 提现金额 + @JsonInclude(JsonInclude.Include.NON_NULL) @ApiModelProperty("服务费") private BigDecimal serviceCharge; + @JsonInclude(JsonInclude.Include.NON_NULL) @ApiModelProperty("渠道成本") private BigDecimal channelCost; + @JsonInclude(JsonInclude.Include.NON_NULL) @ApiModelProperty("利润") private BigDecimal profit; + + @JsonInclude(JsonInclude.Include.NON_NULL) + @ApiModelProperty("数量") + private Integer count; } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/SmDevice.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/SmDevice.java index e7a33bbd..d66677cb 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/SmDevice.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/SmDevice.java @@ -121,32 +121,15 @@ public class SmDevice extends BaseEntity ) private String outageWay; - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "下次房租到期提醒日期") - @ApiModelProperty("下次房租到期提醒日期") - private Date expireDate; - @Excel(name = "wifi名称") @ApiModelProperty("wifi名称") private String wifi; - @Excel(name = "是否开启房租到期提醒") - @ApiModelProperty("是否开启房租到期提醒") - private Boolean enableExpireNotice; - - @Excel(name = "房租到期提醒方式") - @ApiModelProperty("房租到期提醒方式") - private String noticeWay; - @ApiModelProperty("上次拉取设备信息的时间") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date lastPullTime; - @ApiModelProperty("房租到期提醒日(每月)") - @Range(min = 1, max = 31, message = "房租到期提醒日应该在1到31日(含)之间") - private Integer expireDay; - - @ApiModelProperty("电量初始读数") + @ApiModelProperty("总电量初始读数") private BigDecimal initReading; @ApiModelProperty("开关状态,0断电,1通电") diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/vo/SmDeviceVo.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/vo/SmDeviceVo.java index c8bc4753..8668c788 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/vo/SmDeviceVo.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/vo/SmDeviceVo.java @@ -13,6 +13,7 @@ import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.NotNull; +import java.math.BigDecimal; import java.time.LocalTime; import java.util.List; @@ -60,4 +61,10 @@ public class SmDeviceVo extends SmDevice { @ApiModelProperty("所属商户ID") private Long userId; + + @ApiModelProperty("订单总数量") + private Integer orderCount; + + @ApiModelProperty("订单总金额") + private BigDecimal orderAmount; } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/SmDeviceMapper.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/SmDeviceMapper.java index e2049949..b8a04c14 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/SmDeviceMapper.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/SmDeviceMapper.java @@ -132,4 +132,10 @@ public interface SmDeviceMapper */ int bindSn(@Param("deviceId") Long deviceId, @Param("sn") String sn); + /** + * 根据SN查询简单数据 + * @param deviceNo + * @return + */ + SmDeviceVo selectSimpleSmDeviceBySn(String deviceNo); } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/SmDeviceMapper.xml b/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/SmDeviceMapper.xml index bd62a8a4..6f9fc77a 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/SmDeviceMapper.xml +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/SmDeviceMapper.xml @@ -22,7 +22,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and su.user_id = #{userId} and sd.store_id = #{storeId} and sd.device_id = #{deviceId} - and sd.expire_day = #{expireDay} and sd.device_id in @@ -158,6 +157,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + select LAST_INSERT_ID() @@ -183,11 +188,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" remark, outage_way, wifi, - enable_expire_notice, - notice_way, deleted, last_pull_time, - expire_day, init_reading, power_status, device_no, @@ -212,11 +214,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{remark}, #{outageWay}, #{wifi}, - #{enableExpireNotice}, - #{noticeWay}, #{deleted}, #{lastPullTime}, - #{expireDay}, #{initReading}, #{powerStatus}, #{deviceNo}, @@ -260,13 +259,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_time = #{updateTime}, remark = #{remark}, outage_way = #{outageWay}, - expire_date = #{expireDate}, wifi = #{wifi}, - enable_expire_notice = #{enableExpireNotice}, - notice_way = #{noticeWay}, deleted = #{deleted}, last_pull_time = #{lastPullTime}, - expire_day = #{expireDay}, init_reading = #{initReading}, power_status = #{powerStatus}, expire_time = #{expireTime}, diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceAssembler.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceAssembler.java index a6b771c8..530df552 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceAssembler.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceAssembler.java @@ -1,7 +1,6 @@ package com.ruoyi.ss.device.service; -import com.ruoyi.ss.device.domain.SmDevice; import com.ruoyi.ss.device.domain.vo.SmDeviceVo; import java.util.List; @@ -15,19 +14,21 @@ public interface DeviceAssembler { /** * 拼接租户信息 - * @param list */ void assembleTenant(List list); /** * 拼接套餐列表 - * @param list */ void assembleSuitList(List list); /** * 拼接店铺营业时间 - * @param list */ void assembleBusinessTime(List list); + + /** + * 拼接订单统计信息:订单数量、订单金额 + */ + void assembleOrderCountInfo(List list); } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/ISmDeviceService.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/ISmDeviceService.java index eacd84a1..3920cbcd 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/ISmDeviceService.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/ISmDeviceService.java @@ -136,7 +136,7 @@ public interface ISmDeviceService * @param mac * @return */ - boolean isBind(String mac); + boolean isBindByMac(String mac); /** * ids查询列表 @@ -180,4 +180,11 @@ public interface ISmDeviceService * @param sn SN */ int bindSn(Long deviceId, String sn); + + /** + * 根据SN码查询设备是否已经绑定 + * @param deviceNo + * @return + */ + boolean isBindBySn(String deviceNo); } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceAssemblerImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceAssemblerImpl.java similarity index 66% rename from smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceAssemblerImpl.java rename to smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceAssemblerImpl.java index 59d71e6b..473be2e2 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceAssemblerImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceAssemblerImpl.java @@ -1,9 +1,9 @@ -package com.ruoyi.ss.device.service; +package com.ruoyi.ss.device.service.impl; import com.ruoyi.common.utils.CollectionUtils; -import com.ruoyi.common.utils.ServiceUtil; -import com.ruoyi.ss.device.domain.SmDevice; +import com.ruoyi.ss.dashboard.BillCountVo; import com.ruoyi.ss.device.domain.vo.SmDeviceVo; +import com.ruoyi.ss.device.service.DeviceAssembler; import com.ruoyi.ss.store.domain.StoreQuery; import com.ruoyi.ss.store.domain.StoreVo; import com.ruoyi.ss.store.service.IStoreService; @@ -12,9 +12,15 @@ import com.ruoyi.ss.deviceTenant.service.ISmDeviceTenantService; import com.ruoyi.ss.suit.domain.SuitQuery; import com.ruoyi.ss.suit.domain.SuitVo; import com.ruoyi.ss.suit.service.ISuitService; +import com.ruoyi.ss.transactionBill.domain.TransactionBillQuery; +import com.ruoyi.ss.transactionBill.domain.enums.TransactionBillGroupBy; +import com.ruoyi.ss.transactionBill.domain.enums.TransactionBillStatus; +import com.ruoyi.ss.transactionBill.domain.enums.TransactionBillType; +import com.ruoyi.ss.transactionBill.service.TransactionBillService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.util.List; import java.util.Map; import java.util.Objects; @@ -30,15 +36,15 @@ public class DeviceAssemblerImpl implements DeviceAssembler { @Autowired private ISmDeviceTenantService deviceTenantService; - @Autowired - private IStoreService smDeviceGroupService; - @Autowired private ISuitService suitService; @Autowired private IStoreService storeService; + @Autowired + private TransactionBillService transactionBillService; + @Override public void assembleTenant(List list) { if (CollectionUtils.isEmpty(list)) { @@ -97,4 +103,29 @@ public class DeviceAssemblerImpl implements DeviceAssembler { } } + + /** + * 拼接订单统计信息:订单数量、订单金额 + * + * @param list + */ + @Override + public void assembleOrderCountInfo(List list) { + if (CollectionUtils.isEmptyElement(list)) { + return; + } + + TransactionBillQuery query = new TransactionBillQuery(); + query.setGroupBy(TransactionBillGroupBy.device_id.name()); + query.setDeviceIds(list.stream().map(SmDeviceVo::getDeviceId).collect(Collectors.toList())); + query.setType(TransactionBillType.RECHARGE.getType()); + query.setStatus(TransactionBillStatus.SUCCESS.getStatus()); + Map map = transactionBillService.selectCountMap(query, BillCountVo::getDeviceId); + + for (SmDeviceVo device : list) { + BillCountVo count = map.get(device.getDeviceId()); + device.setOrderCount(count == null ? 0 : count.getCount()); + device.setOrderAmount(count == null ? BigDecimal.ZERO : count.getRecharge()); + } + } } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/SmDeviceServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/SmDeviceServiceImpl.java similarity index 95% rename from smart-switch-service/src/main/java/com/ruoyi/ss/device/service/SmDeviceServiceImpl.java rename to smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/SmDeviceServiceImpl.java index 3ad08d71..c5951231 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/SmDeviceServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/SmDeviceServiceImpl.java @@ -1,4 +1,4 @@ -package com.ruoyi.ss.device.service; +package com.ruoyi.ss.device.service.impl; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.enums.LoginType; @@ -12,16 +12,13 @@ import com.ruoyi.ss.device.domain.enums.DeviceOnlineStatus; import com.ruoyi.ss.device.domain.enums.DevicePowerStatus; import com.ruoyi.ss.device.domain.enums.DeviceStatus; import com.ruoyi.ss.device.mapper.SmDeviceMapper; +import com.ruoyi.ss.device.service.DeviceAssembler; +import com.ruoyi.ss.device.service.ISmDeviceService; import com.ruoyi.ss.deviceBindRecord.service.ISmDeviceBindRecordService; -import com.ruoyi.ss.deviceTenant.domain.SmDeviceTenant; -import com.ruoyi.ss.deviceTenant.mapper.SmDeviceTenantMapper; -import com.ruoyi.ss.deviceTenant.service.ISmDeviceTenantService; import com.ruoyi.ss.resetRecord.domain.SmResetRecord; import com.ruoyi.ss.resetRecord.service.ISmResetRecordService; import com.ruoyi.ss.store.domain.StoreVo; import com.ruoyi.ss.store.service.IStoreService; -import com.ruoyi.ss.user.domain.SmUserVo; -import com.ruoyi.ss.user.mapper.SmUserMapper; import com.ruoyi.iot.domain.IotDeviceInfo; import com.ruoyi.iot.service.IotService; import lombok.SneakyThrows; @@ -55,15 +52,6 @@ public class SmDeviceServiceImpl implements ISmDeviceService @Autowired private SmDeviceMapper smDeviceMapper; - @Autowired - private SmUserMapper smUserMapper; - - @Autowired - private ISmDeviceTenantService smDeviceTenantService; - - @Autowired - private SmDeviceTenantMapper smDeviceTenantMapper; - @Autowired private IotService iotService; @@ -375,15 +363,9 @@ public class SmDeviceServiceImpl implements ISmDeviceService ServiceUtil.assertion(!StringUtils.hasText(device.getMac()), "设备Mac号为空"); deviceAssembler.assembleTenant(Collections.singletonList(device)); - ServiceUtil.assertion(!UserUtil.hasFrontUser(device.getTenantIds()) - && !UserUtil.hasFrontUser(device.getUserId()), "您不是该设备的租户或商户,无法进行该操作" ); + ServiceUtil.assertion(!UserUtil.hasFrontUser(device.getUserId()), "您不是该设备的商户,无法进行该操作" ); if (DevicePowerStatus.ON.equals(status)) { - // 通电,检查电量余额是否足够 - IotDeviceInfo deviceInfo = iotService.getDeviceInfo(device.getMac()); - ServiceUtil.assertion(deviceInfo.getM() == null - || BigDecimal.ZERO.compareTo(deviceInfo.getM()) >= 0, "电量余额不足,请充值后重试"); - iotService.open(device.getMac()); } else if (DevicePowerStatus.OFF.equals(status)) { iotService.close(device.getMac()); @@ -539,7 +521,7 @@ public class SmDeviceServiceImpl implements ISmDeviceService * @return */ @Override - public boolean isBind(String mac) { + public boolean isBindByMac(String mac) { if (StringUtils.isBlank(mac)) { return false; } @@ -547,6 +529,21 @@ public class SmDeviceServiceImpl implements ISmDeviceService return device != null && device.getStoreId() != null; } + /** + * 根据SN码查询设备是否已经绑定 + * + * @param deviceNo + * @return + */ + @Override + public boolean isBindBySn(String deviceNo) { + if (StringUtils.isBlank(deviceNo)) { + return false; + } + SmDeviceVo device = smDeviceMapper.selectSimpleSmDeviceBySn(deviceNo); + return device != null && device.getStoreId() != null; + } + /** * ids查询列表 * diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBill.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBill.java index 7794c58b..1344d4ac 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBill.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBill.java @@ -42,7 +42,8 @@ public class TransactionBill extends BaseEntity private Long userId; /** 类型 */ - @ApiModelProperty("类型:1充值") + @ApiModelProperty("类型:1充值,2提现") + @JsonView(JsonViewProfile.AppMch.class) private String type; /** 设备 */ @@ -59,6 +60,7 @@ public class TransactionBill extends BaseEntity /** 商户(到账用户) */ @Excel(name = "商户(到账用户)") @ApiModelProperty("商户(到账用户)id") + @JsonView(JsonViewProfile.AppMch.class) private Long mchId; /** 交易金额 */ @@ -73,6 +75,7 @@ public class TransactionBill extends BaseEntity /** 实际到账金额 */ @Excel(name = "商户实际到账金额") @ApiModelProperty("商户实际到账金额") + @JsonView(JsonViewProfile.AppMch.class) private BigDecimal arrivalAmount; /** 手续费 */ @@ -89,6 +92,7 @@ public class TransactionBill extends BaseEntity private Long channelId; @ApiModelProperty("到账后余额") + @JsonView(JsonViewProfile.AppMch.class) private BigDecimal afterBalance; @ApiModelProperty("支付成功的时间") @@ -99,6 +103,7 @@ public class TransactionBill extends BaseEntity private Date expireTime; @ApiModelProperty("交易账号(银行卡号、微信openId)") + @JsonView(JsonViewProfile.AppMch.class) private String accountNo; @ApiModelProperty("已支付/提现金额") diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBillQuery.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBillQuery.java index 3702760c..07d9906a 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBillQuery.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBillQuery.java @@ -31,7 +31,7 @@ public class TransactionBillQuery extends TransactionBill { private String userName; @ApiModelProperty("商户名称") - private String landlordName; + private String mchName; @ApiModelProperty("设备名称") private String deviceName; @@ -70,4 +70,7 @@ public class TransactionBillQuery extends TransactionBill { @ApiModelProperty("店铺ID列表") private List storeIds; + + @ApiModelProperty("设备ID列表") + private List deviceIds; } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBillVo.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBillVo.java index d608dabd..d7c4e3ea 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBillVo.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBillVo.java @@ -18,6 +18,7 @@ public class TransactionBillVo extends TransactionBill { private String userName; @ApiModelProperty("商户(到账用户)名称") + @JsonView(JsonViewProfile.AppMch.class) private String mchName; @ApiModelProperty("支付渠道名称") diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/enums/TransactionBillGroupBy.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/enums/TransactionBillGroupBy.java index 17644724..7ad9a7d2 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/enums/TransactionBillGroupBy.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/enums/TransactionBillGroupBy.java @@ -17,5 +17,6 @@ public enum TransactionBillGroupBy { create_date, create_hour, create_year_month, + device_id, store_id } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.xml b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.xml index 549d9b18..9c53df85 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.xml +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.xml @@ -56,7 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and stb.type = #{type} and stb.mch_id = #{mchId} and su.user_name like concat('%', #{userName}, '%') - and su1.user_name like concat('%', #{landlordName}, '%') + and su1.user_name like concat('%', #{mchName}, '%') and stb.device_name like concat('%', #{deviceName}, '%') and stb.create_time = #{createTime} and date(stb.create_time) = date(#{createDate}) @@ -87,6 +87,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{item} + + and stb.device_id in + + #{item} + +