فهرست منبع

设备管理费

李进 1 سال پیش
والد
کامیت
cfa85ec32a
22فایلهای تغییر یافته به همراه649 افزوده شده و 9 حذف شده
  1. 27 4
      device-api-service-merc-mini/src/main/java/com/xy/controller/MercMiniDeviceController.java
  2. 5 2
      device-api-service/pom.xml
  3. 55 0
      device-api-service/src/main/java/com/xy/entity/DeviceCharging.java
  4. 52 0
      device-api-service/src/main/java/com/xy/entity/DeviceChargingHistory.java
  5. 10 0
      device-api-service/src/main/java/com/xy/entity/DeviceInfo.java
  6. 174 0
      device-api-service/src/main/java/com/xy/job/DeviceChargingJob.java
  7. 16 0
      device-api-service/src/main/java/com/xy/mapper/DeviceChargingHistoryMapper.java
  8. 16 0
      device-api-service/src/main/java/com/xy/mapper/DeviceChargingMapper.java
  9. 11 0
      device-api-service/src/main/java/com/xy/mapper/DeviceInfoMapper.java
  10. 18 0
      device-api-service/src/main/java/com/xy/mapper/mapper/DeviceChargingHistoryMapper.xml
  11. 18 0
      device-api-service/src/main/java/com/xy/mapper/mapper/DeviceChargingMapper.xml
  12. 24 0
      device-api-service/src/main/java/com/xy/service/DeviceChargingHistoryServiceImpl.java
  13. 43 0
      device-api-service/src/main/java/com/xy/service/DeviceChargingServiceImpl.java
  14. 4 2
      device-api-service/src/main/java/com/xy/service/DeviceInfoServiceImpl.java
  15. 3 0
      device-api-service/src/main/java/com/xy/utils/enums/DictEnum.java
  16. 8 0
      device-api-service/src/main/java/com/xy/utils/enums/DictSonEnum.java
  17. 69 0
      device-api/src/main/java/com/xy/dto/DeviceChargingDto.java
  18. 53 0
      device-api/src/main/java/com/xy/dto/DeviceChargingHistoryDto.java
  19. 6 0
      device-api/src/main/java/com/xy/dto/DeviceInfoDto.java
  20. 16 0
      device-api/src/main/java/com/xy/service/DeviceChargingHistoryService.java
  21. 16 0
      device-api/src/main/java/com/xy/service/DeviceChargingService.java
  22. 5 1
      device-start/pom.xml

+ 27 - 4
device-api-service-merc-mini/src/main/java/com/xy/controller/MercMiniDeviceController.java

@@ -12,11 +12,10 @@ import com.xy.dto.be.MercDto;
 import com.xy.dto.common.MercLineDto;
 import com.xy.dto.common.MercPlaceDto;
 import com.xy.dto.mini.MiniMercRegionDto;
-import com.xy.entity.DeviceBluetoothAuth;
-import com.xy.entity.DeviceInfo;
-import com.xy.entity.DeviceSysinfo;
+import com.xy.entity.*;
 import com.xy.enums.MercStatus;
 import com.xy.service.DeviceBluetoothAuthServiceImpl;
+import com.xy.service.DeviceChargingServiceImpl;
 import com.xy.service.DeviceInfoServiceImpl;
 import com.xy.service.DeviceSysinfoServiceImpl;
 import com.xy.service.be.MercFeignService;
@@ -27,6 +26,7 @@ import com.xy.utils.enums.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -58,11 +58,14 @@ public class MercMiniDeviceController {
     private final DeviceInfoServiceImpl deviceInfoService;
 
     private final DeviceSysinfoServiceImpl deviceSysinfoService;
+
     private final MercPlaceService mercPlaceService;
+
     private final MercLineService mercLineService;
 
     private final DeviceBluetoothAuthServiceImpl deviceBluetoothAuthService;
 
+    private final DeviceChargingServiceImpl deviceChargingService;
 
     @ApiOperation("商户设备首页统计")
     @PostMapping("mercHomeStatistical")
@@ -177,17 +180,37 @@ public class MercMiniDeviceController {
 
     @PostMapping("active")
     @ApiOperation("激活设备")
+    @Transactional(rollbackFor = Exception.class)
     public R active(@RequestBody MercMiniDeviceDto.Active active) {
         R activeInfo = this.getActiveInfo(active);
+        //激活设备
         if (activeInfo.getCode() == R.Enum.SUCCESS.getCode()) {
-            //激活设备
+            DeviceInfo deviceInfo = deviceInfoService.getById(active.getDeviceId());
             DeviceInfo updateDeviceInfo = new DeviceInfo()
                     .setDeviceId(active.getDeviceId())
                     .setActiveState(Integer.valueOf(DictSonEnum.DEVICE_ACTIVE_STATUS_1.getKey()))
                     .setBusyState(Integer.valueOf(DictSonEnum.DEVICE_BUSY_STATUS_1.getKey()))
                     .setActiveTime(LocalDateTime.now())
                     .setShowStatus(true);
+            //首次激活可使用x天
+            if (!deviceInfo.getIsChargingX()) {
+                SysDictRedis sysDictRedis = SysDictUtils.get(DictEnum.DEVICE_CHARGING.getKey(), DictSonEnum.DEVICE_CHARGING_X.getKey());
+                updateDeviceInfo.setIsChargingX(true)
+                        .setChargingX(Integer.valueOf(sysDictRedis.getValue()));
+            }
             deviceInfoService.updateById(updateDeviceInfo);
+            //添加设备计费
+            DeviceCharging deviceCharging = deviceChargingService.getById(deviceInfo.getDeviceId());
+            if (deviceCharging == null) {
+                LocalDateTime now = LocalDateTime.now();
+                deviceChargingService.save(new DeviceCharging()
+                        .setDeviceId(deviceInfo.getDeviceId())
+                        .setDeviceType(deviceInfo.getDeviceType())
+                        .setTimeout(now)
+                        .setCreateTime(now)
+                        .setUpdateTime(now)
+                );
+            }
             return R.ok();
         } else {
             return activeInfo;

+ 5 - 2
device-api-service/pom.xml

@@ -39,13 +39,16 @@
             <artifactId>goods-api</artifactId>
             <version>1.0</version>
         </dependency>
-
         <dependency>
             <groupId>com.xy</groupId>
             <artifactId>sys-api</artifactId>
             <version>1.0</version>
         </dependency>
-
+        <dependency>
+            <groupId>com.xy</groupId>
+            <artifactId>merc-api</artifactId>
+            <version>1.0</version>
+        </dependency>
 
         <dependency>
             <groupId>com.xy</groupId>

+ 55 - 0
device-api-service/src/main/java/com/xy/entity/DeviceCharging.java

@@ -0,0 +1,55 @@
+package com.xy.entity;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 设备计费表
+ * </p>
+ *
+ * @author lijin
+ * @since 2023-04-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="DeviceCharging对象", description="设备计费表")
+public class DeviceCharging implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "设备id")
+    private Long deviceId;
+
+    @ApiModelProperty(value = "设备类型")
+    private Integer deviceType;
+
+    @ApiModelProperty(value = "续费金额")
+    private Integer chargingMoney;
+
+    @ApiModelProperty(value = "累计续费金额")
+    private Integer chargingSumMoney;
+
+    @ApiModelProperty(value = "续费方式")
+    private Integer chargingType;
+
+    @ApiModelProperty(value = "状态")
+    private Boolean status;
+
+    @ApiModelProperty(value = "过期时间")
+    private LocalDateTime timeout;
+
+    @ApiModelProperty(value = "创建时间")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "更新时间")
+    private LocalDateTime updateTime;
+
+
+}

+ 52 - 0
device-api-service/src/main/java/com/xy/entity/DeviceChargingHistory.java

@@ -0,0 +1,52 @@
+package com.xy.entity;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 设备计费历史表
+ * </p>
+ *
+ * @author lijin
+ * @since 2023-04-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="DeviceChargingHistory对象", description="设备计费历史表")
+public class DeviceChargingHistory implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "设备id")
+    private Long deviceId;
+
+    @ApiModelProperty(value = "设备类型")
+    private Integer deviceType;
+
+    @ApiModelProperty(value = "续费金额")
+    private Integer chargingMoney;
+
+    @ApiModelProperty(value = "续费方式")
+    private Integer chargingType;
+
+    @ApiModelProperty(value = "状态")
+    private Boolean status;
+
+    @ApiModelProperty(value = "过期时间")
+    private LocalDateTime timeout;
+
+    @ApiModelProperty(value = "创建时间")
+    private LocalDateTime createTime;
+
+
+}

+ 10 - 0
device-api-service/src/main/java/com/xy/entity/DeviceInfo.java

@@ -111,6 +111,16 @@ public class DeviceInfo {
      */
     private Integer faultLevel;
 
+    /**
+     * 是否已使用计费x
+     */
+    private Boolean isChargingX;
+
+    /**
+     * 计费x剩余天
+     */
+    private Integer chargingX;
+
     /**
      * 创建时间
      */

+ 174 - 0
device-api-service/src/main/java/com/xy/job/DeviceChargingJob.java

@@ -0,0 +1,174 @@
+package com.xy.job;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import com.xy.collections.list.JArrayList;
+import com.xy.collections.list.JList;
+import com.xy.collections.map.JMap;
+import com.xy.dto.DeviceInfoDto;
+import com.xy.dto.MercAccountDto;
+import com.xy.entity.DeviceCharging;
+import com.xy.entity.DeviceChargingHistory;
+import com.xy.entity.DeviceInfo;
+import com.xy.entity.SysDictRedis;
+import com.xy.mapper.DeviceInfoMapper;
+import com.xy.service.DeviceChargingHistoryServiceImpl;
+import com.xy.service.DeviceChargingServiceImpl;
+import com.xy.service.DeviceInfoServiceImpl;
+import com.xy.service.MercAccountService;
+import com.xy.utils.*;
+import com.xy.utils.enums.DictEnum;
+import com.xy.utils.enums.DictSonEnum;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 设备计费job
+ */
+@Slf4j
+@Component
+@AllArgsConstructor
+public class DeviceChargingJob {
+
+    private DeviceChargingServiceImpl deviceChargingService;
+
+    private DeviceChargingHistoryServiceImpl deviceChargingHistoryService;
+
+    private DeviceInfoServiceImpl deviceInfoService;
+
+    private MercAccountService mercAccountService;
+
+    private DeviceInfoMapper deviceInfoMapper;
+
+    /**
+     * 扣除设备服务费试用天数
+     *
+     * @return
+     */
+    @XxlJob("deviceChargingX")
+    public ReturnT<String> deviceChargingX() {
+        deviceInfoMapper.updateChargingX(LocalDateTime.now());
+        log.info("设备试用时间扣除完成~");
+        return ReturnT.SUCCESS;
+    }
+
+    /**
+     * 设备计费
+     *
+     * @return
+     */
+    @XxlJob("deviceCharging")
+    public ReturnT<String> deviceCharging() {
+        deviceCharging(1, 20, null);
+        log.info("设备计费完成~");
+        return ReturnT.SUCCESS;
+    }
+
+    /**
+     * 递归执行
+     *
+     * @param current
+     * @param size
+     * @param deviceIds
+     */
+    public void deviceCharging(int current, int size, List<Long> deviceIds) {
+        log.info("设备计费开始第{}页", current);
+        List<DeviceCharging> updateDeviceChargings = new ArrayList<>();
+        List<DeviceChargingHistory> deviceChargingHistories = new ArrayList<>();
+        List<DeviceInfoDto.Update> updateDeviceInfos = new ArrayList<>();
+        LocalDateTime now = LocalDateTime.now();
+        //查询已过期计费记录
+        PageBean<DeviceCharging> pageBean = new PageBean().setCurrent(current).setSize(size);
+        IPage<DeviceCharging> iPage = deviceChargingService.page(PlusBeans.toIPage(pageBean), new LambdaQueryWrapper<DeviceCharging>()
+                .le(DeviceCharging::getTimeout, now)
+                .in(Emptys.check(deviceIds), DeviceCharging::getDeviceId, deviceIds)
+        );
+        List<DeviceCharging> records = iPage.getRecords();
+        if (!Emptys.check(records)) {
+            return;
+        }
+        //剔除试用期的设备
+        JList<DeviceCharging> deviceChargings = new JArrayList<>(records);
+        JMap<Long, DeviceCharging> deviceChargingsJMaps = deviceChargings.toMap(DeviceCharging::getDeviceId).cover();
+        List<DeviceInfo> deviceInfos = deviceInfoService.list(new LambdaQueryWrapper<DeviceInfo>()
+                .in(DeviceInfo::getDeviceId, deviceChargings.getProperty(DeviceCharging::getDeviceId))
+                .gt(DeviceInfo::getChargingX, 0)
+        );
+        deviceInfos.forEach(deviceInfo -> deviceChargingsJMaps.remove(deviceInfo.getDeviceId()));
+        JMap<Long, DeviceInfo> deviceInfosJMaps = new JArrayList<>(deviceInfos).toMap(DeviceInfo::getDeviceId).cover();
+        //字典
+        Map<String, SysDictRedis> stringSysDictRedisMap = SysDictUtils.get(DictEnum.DEVICE_CHARGING.getKey());
+        SysDictRedis sysDictRedisY = stringSysDictRedisMap.get(DictSonEnum.DEVICE_CHARGING_Y.getKey());
+        Integer y = Integer.valueOf(sysDictRedisY.getValue());
+        //开始计费
+        deviceChargingsJMaps.forEach((deviceId, deviceCharging) -> {
+            deviceCharging.setUpdateTime(now);
+            //发起扣款
+            DeviceInfo deviceInfo = deviceInfosJMaps.get(deviceId);
+            SysDictRedis sysDictRedisBalance = stringSysDictRedisMap.get(String.valueOf(deviceInfo.getDeviceType()));
+            Integer balance = Integer.valueOf(sysDictRedisBalance.getValue());
+            R r = mercAccountService.updateBalance(new MercAccountDto.UpdateBalance()
+                    .setMercId(deviceInfo.getMercId())
+                    .setBalance(balance)
+                    .setResean("设备管理费")
+            );
+            //扣款成功
+            if (r.getCode() == R.Enum.SUCCESS.getCode()) {
+                LocalDateTime newTimeOut = DataTime.toLocal(DataTime.getStringAround(1, 0, 0, 0, 0, 0, DataTime.toString(deviceCharging.getTimeout())));
+                deviceCharging.setChargingMoney(balance)
+                        .setChargingSumMoney(deviceCharging.getChargingSumMoney() + balance)
+                        .setChargingType(DictSonEnum.DEVICE_CHARGING_100.getKeyInt())
+                        .setStatus(true)
+                        .setTimeout(newTimeOut);
+                DeviceChargingHistory deviceChargingHistory = new DeviceChargingHistory()
+                        .setDeviceId(deviceId)
+                        .setDeviceType(deviceCharging.getDeviceType())
+                        .setChargingMoney(balance)
+                        .setChargingType(DictSonEnum.DEVICE_CHARGING_100.getKeyInt())
+                        .setStatus(true)
+                        .setCreateTime(now)
+                        .setTimeout(newTimeOut);
+                deviceChargingHistories.add(deviceChargingHistory);
+            }
+            //扣款失败
+            if (r.getCode() == R.Enum.FAIL.getCode()) {
+                deviceCharging.setStatus(false);
+                //当前时间 - 过期时间 > y天 则冻结设备
+                long day = DataTime.diff(now, deviceCharging.getTimeout(), "d");
+                if (day > y) {
+                    DeviceInfoDto.Update update = new DeviceInfoDto.Update()
+                            .setDeviceId(deviceId);
+                    update.setFreezeStatus(2);
+                    updateDeviceInfos.add(update);
+                }
+            }
+            updateDeviceChargings.add(deviceCharging);
+        });
+        //修改设备计费记录
+        deviceChargingService.updateBatchById(updateDeviceChargings);
+        //添加设备计费记录历史
+        if (Emptys.check(deviceChargingHistories)) {
+            deviceChargingHistoryService.saveBatch(deviceChargingHistories);
+        }
+        //冻结设备
+        if (Emptys.check(updateDeviceInfos)) {
+            deviceInfoService.updateBatch(updateDeviceInfos);
+        }
+
+        //判断是否继续下一页
+        if (iPage.getPages() <= current) {
+            return;
+        } else {
+            deviceCharging(current + 1, size, deviceIds);
+        }
+    }
+
+}

+ 16 - 0
device-api-service/src/main/java/com/xy/mapper/DeviceChargingHistoryMapper.java

@@ -0,0 +1,16 @@
+package com.xy.mapper;
+
+import com.xy.entity.DeviceChargingHistory;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 设备计费历史表 Mapper 接口
+ * </p>
+ *
+ * @author lijin
+ * @since 2023-04-14
+ */
+public interface DeviceChargingHistoryMapper extends BaseMapper<DeviceChargingHistory> {
+
+}

+ 16 - 0
device-api-service/src/main/java/com/xy/mapper/DeviceChargingMapper.java

@@ -0,0 +1,16 @@
+package com.xy.mapper;
+
+import com.xy.entity.DeviceCharging;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 设备计费表 Mapper 接口
+ * </p>
+ *
+ * @author lijin
+ * @since 2023-04-14
+ */
+public interface DeviceChargingMapper extends BaseMapper<DeviceCharging> {
+
+}

+ 11 - 0
device-api-service/src/main/java/com/xy/mapper/DeviceInfoMapper.java

@@ -6,7 +6,9 @@ import com.xy.dto.DeviceInfoDto;
 import com.xy.entity.DeviceInfo;
 import com.xy.mapper.entity.DeviceInfoQueryPage;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -35,4 +37,13 @@ public interface DeviceInfoMapper extends BaseMapper<DeviceInfo> {
      * @return
      */
     List<DeviceInfoDto.MercHomeCountVO> merHomeCountList(@Param("query") DeviceInfoDto.MercHomeQueryDTO queryDTO);
+
+    /**
+     * 扣除设备服务费试用天数
+     *
+     * @param updateTime
+     * @return
+     */
+    @Select("update device_info set charging_x = charging_x - 1, update_time = #{updateTime} where is_charging_x = true and charging_x > 0")
+    int updateChargingX(@Param("updateTime") LocalDateTime updateTime);
 }

+ 18 - 0
device-api-service/src/main/java/com/xy/mapper/mapper/DeviceChargingHistoryMapper.xml

@@ -0,0 +1,18 @@
+<?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.xy.mapper.DeviceChargingHistoryMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.xy.entity.DeviceChargingHistory">
+        <id column="id" property="id" />
+        <result column="device_id" property="deviceId" />
+        <result column="device_type" property="deviceType" />
+        <result column="charging_money" property="chargingMoney" />
+        <result column="charging_sum_money" property="chargingSumMoney" />
+        <result column="charging_type" property="chargingType" />
+        <result column="status" property="status" />
+        <result column="timeout" property="timeout" />
+        <result column="create_time" property="createTime" />
+    </resultMap>
+
+</mapper>

+ 18 - 0
device-api-service/src/main/java/com/xy/mapper/mapper/DeviceChargingMapper.xml

@@ -0,0 +1,18 @@
+<?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.xy.mapper.DeviceChargingMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.xy.entity.DeviceCharging">
+        <id column="device_id" property="deviceId" />
+        <result column="device_type" property="deviceType" />
+        <result column="charging_money" property="chargingMoney" />
+        <result column="charging_sum_money" property="chargingSumMoney" />
+        <result column="charging_type" property="chargingType" />
+        <result column="status" property="status" />
+        <result column="timeout" property="timeout" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+</mapper>

+ 24 - 0
device-api-service/src/main/java/com/xy/service/DeviceChargingHistoryServiceImpl.java

@@ -0,0 +1,24 @@
+package com.xy.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xy.entity.DeviceChargingHistory;
+import com.xy.mapper.DeviceChargingHistoryMapper;
+import io.swagger.annotations.Api;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 设备计费历史表 服务实现类
+ * </p>
+ *
+ * @author lijin
+ * @since 2023-04-14
+ */
+@Service
+@AllArgsConstructor
+@Api(tags = "设备计费历史表")
+public class DeviceChargingHistoryServiceImpl extends ServiceImpl<DeviceChargingHistoryMapper, DeviceChargingHistory> implements DeviceChargingHistoryService {
+
+}

+ 43 - 0
device-api-service/src/main/java/com/xy/service/DeviceChargingServiceImpl.java

@@ -0,0 +1,43 @@
+package com.xy.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xy.dto.DeviceChargingDto;
+import com.xy.entity.DeviceCharging;
+import com.xy.job.DeviceChargingJob;
+import com.xy.mapper.DeviceChargingMapper;
+import com.xy.utils.R;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+
+/**
+ * <p>
+ * 设备计费表 服务实现类
+ * </p>
+ *
+ * @author lijin
+ * @since 2023-04-14
+ */
+@Service
+@AllArgsConstructor
+@Api(tags = "设备计费表")
+public class DeviceChargingServiceImpl extends ServiceImpl<DeviceChargingMapper, DeviceCharging> implements DeviceChargingService {
+
+    private DeviceChargingJob deviceChargingJob;
+
+    @ApiOperation("手动计费")
+    @PostMapping("charging")
+    public R charging(@RequestBody @Validated DeviceChargingDto.Charging charging) {
+        List<Long> deviceIds = charging.getDeviceIds();
+        deviceChargingJob.deviceCharging(1, deviceIds.size(), deviceIds);
+        return R.ok();
+    }
+}

+ 4 - 2
device-api-service/src/main/java/com/xy/service/DeviceInfoServiceImpl.java

@@ -219,7 +219,8 @@ public class DeviceInfoServiceImpl extends ServiceImpl<DeviceInfoMapper, DeviceI
     @ApiOperation("修改")
     @PostMapping("update")
     public R update(@RequestBody @Validated DeviceInfoDto.Update update) {
-        DeviceInfo deviceInfo = copy(DeviceInfo.class, update);
+        DeviceInfo deviceInfo = copy(DeviceInfo.class, update)
+                .setUpdateTime(LocalDateTime.now());
         updateById(deviceInfo);
         return R.ok();
     }
@@ -227,8 +228,9 @@ public class DeviceInfoServiceImpl extends ServiceImpl<DeviceInfoMapper, DeviceI
     @ApiOperation("批量修改")
     @PostMapping("updateBatch")
     public R updateBatch(@RequestBody List<DeviceInfoDto.Update> updates) {
+        LocalDateTime now = LocalDateTime.now();
         List<DeviceInfo> deviceInfos = new ArrayList<>(updates.size());
-        updates.forEach(update -> deviceInfos.add(copy(DeviceInfo.class, update)));
+        updates.forEach(update -> deviceInfos.add(copy(DeviceInfo.class, update).setUpdateTime(now)));
         updateBatchById(deviceInfos);
         return R.ok();
     }

+ 3 - 0
device-api-service/src/main/java/com/xy/utils/enums/DictEnum.java

@@ -30,6 +30,9 @@ public enum DictEnum {
     ENV("env", "环境标识"),
 
     ENV_PARAMS("env_params", "环境参数"),
+
+    DEVICE_CHARGING("device_charging", "设备计费标准"),
+
     ;
 
     private String key;

+ 8 - 0
device-api-service/src/main/java/com/xy/utils/enums/DictSonEnum.java

@@ -52,6 +52,14 @@ public enum DictSonEnum {
 
     ENV_PROD("prod", "环境标识-生产环境"),
 
+    DEVICE_CHARGING_X("x", "设备计费标准-机器激活后可使用天数"),
+
+    DEVICE_CHARGING_Y("y", "设备计费标准-机器欠费后可使用天数"),
+
+    DEVICE_CHARGING_100("100", "设备计费标准-余额续费方式"),
+
+    DEVICE_CHARGING_101("101", "设备计费标准-其他续费方式"),
+
     ;
 
     private String key;

+ 69 - 0
device-api/src/main/java/com/xy/dto/DeviceChargingDto.java

@@ -0,0 +1,69 @@
+package com.xy.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotEmpty;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 设备计费表
+ * </p>
+ *
+ * @author lijin
+ * @since 2023-04-14
+ */
+public class DeviceChargingDto {
+
+    @Data
+    @Accessors(chain = true)
+    public static class Charging {
+
+        @NotEmpty(message = "设备id不能为空")
+        @ApiModelProperty(value = "设备id集合")
+        private List<Long> deviceIds;
+    }
+
+
+    @Data
+    @Accessors(chain = true)
+    public static class Vo {
+
+        @ApiModelProperty(value = "设备id")
+        private Long deviceId;
+
+        @ApiModelProperty(value = "设备类型")
+        private Integer deviceType;
+
+        @ApiModelProperty(value = "续费金额")
+        private Integer chargingMoney;
+
+        @ApiModelProperty(value = "累计续费金额")
+        private Integer chargingSumMoney;
+
+        @ApiModelProperty(value = "续费方式")
+        private Integer chargingType;
+
+        @ApiModelProperty(value = "状态")
+        private Boolean status;
+
+        @ApiModelProperty(value = "过期时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime timeout;
+
+        @ApiModelProperty(value = "创建时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime createTime;
+
+        @ApiModelProperty(value = "更新时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime updateTime;
+
+
+    }
+
+}

+ 53 - 0
device-api/src/main/java/com/xy/dto/DeviceChargingHistoryDto.java

@@ -0,0 +1,53 @@
+package com.xy.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 设备计费历史表
+ * </p>
+ *
+ * @author lijin
+ * @since 2023-04-14
+ */
+public class DeviceChargingHistoryDto {
+
+    @Data
+    @Accessors(chain = true)
+    public static class Vo {
+
+        @ApiModelProperty(value = "id")
+        private Long id;
+
+        @ApiModelProperty(value = "设备id")
+        private Long deviceId;
+
+        @ApiModelProperty(value = "设备类型")
+        private Integer deviceType;
+
+        @ApiModelProperty(value = "续费金额")
+        private Integer chargingMoney;
+
+        @ApiModelProperty(value = "续费方式")
+        private Integer chargingType;
+
+        @ApiModelProperty(value = "状态")
+        private Boolean status;
+
+        @ApiModelProperty(value = "过期时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime timeout;
+
+        @ApiModelProperty(value = "创建时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime createTime;
+
+
+    }
+
+}

+ 6 - 0
device-api/src/main/java/com/xy/dto/DeviceInfoDto.java

@@ -328,6 +328,12 @@ public class DeviceInfoDto {
         @ApiModelProperty("故障等级")
         private Integer faultLevel;
 
+        @ApiModelProperty("是否已使用计费x")
+        private Boolean isChargingX;
+
+        @ApiModelProperty("计费x剩余天")
+        private Integer chargingX;
+
         @ApiModelProperty("创建时间")
         @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
         private LocalDateTime createTime;

+ 16 - 0
device-api/src/main/java/com/xy/service/DeviceChargingHistoryService.java

@@ -0,0 +1,16 @@
+package com.xy.service;
+
+import com.xy.annotate.RestMappingController;
+
+/**
+ * <p>
+ * 设备计费历史表 服务类
+ * </p>
+ *
+ * @author lijin
+ * @since 2023-04-14
+ */
+@RestMappingController("/device-charging-history")
+public interface DeviceChargingHistoryService {
+
+}

+ 16 - 0
device-api/src/main/java/com/xy/service/DeviceChargingService.java

@@ -0,0 +1,16 @@
+package com.xy.service;
+
+import com.xy.annotate.RestMappingController;
+
+/**
+ * <p>
+ * 设备计费表 服务类
+ * </p>
+ *
+ * @author lijin
+ * @since 2023-04-14
+ */
+@RestMappingController("/device-charging")
+public interface DeviceChargingService {
+
+}

+ 5 - 1
device-start/pom.xml

@@ -56,12 +56,16 @@
             <artifactId>merc-api-cloud</artifactId>
             <version>1.0</version>
         </dependency>
-
         <dependency>
             <groupId>com.xy</groupId>
             <artifactId>sys-api-feign</artifactId>
             <version>1.0</version>
         </dependency>
+        <dependency>
+            <groupId>com.xy</groupId>
+            <artifactId>merc-api-cloud</artifactId>
+            <version>1.0</version>
+        </dependency>
 
         <dependency>
             <groupId>com.xy</groupId>