package com.xy.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xy.collections.list.JArrayList;
import com.xy.collections.list.JList;
import com.xy.collections.map.JMap;
import com.xy.device.EnumDeviceCharging;
import com.xy.device.EnumDeviceChargingHistoryStatus;
import com.xy.dto.DeviceChargingDto;
import com.xy.dto.DeviceInfoDto;
import com.xy.entity.DeviceCharging;
import com.xy.entity.DeviceChargingHistory;
import com.xy.entity.SysDictRedis;
import com.xy.error.CommRuntimeException;
import com.xy.mapper.DeviceChargingMapper;
import com.xy.utils.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
import org.springframework.context.annotation.Lazy;
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 java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import static com.xy.utils.PlusBeans.toIPage;
import static com.xy.utils.PlusBeans.toPageBean;
/**
*
* 设备计费表 服务实现类
*
*
* @author lijin
* @since 2023-04-14
*/
@Service
@Api(tags = "设备计费表")
@AllArgsConstructor(onConstructor_ = @Lazy)
public class DeviceChargingServiceImpl extends ServiceImpl implements DeviceChargingService {
private DeviceChargingHistoryServiceImpl deviceChargingHistoryService;
private DeviceInfoServiceImpl deviceInfoService;
private DeviceChargingServiceImpl deviceChargingService;
@PostMapping("check")
@ApiOperation("检查")
public R check(@RequestBody @Validated DeviceChargingDto.Check check) {
LocalDateTime now = LocalDateTime.now();
DeviceCharging deviceCharging = getById(check.getDeviceId());
if (deviceCharging == null) {
deviceChargingService.save(new DeviceCharging()
.setDeviceId(check.getDeviceId())
.setTimeout(now)
.setCreateTime(now)
);
throw new CommRuntimeException("设备欠费,请充值");
}
int contrast = DataTime.stringContrast(DataTime.toString(deviceCharging.getTimeout()), DataTime.toString(now));
if (deviceCharging.getChargingX() == 0 && contrast <= 0) {
throw new CommRuntimeException("设备欠费,请充值");
}
return R.ok();
}
@PostMapping("page")
@ApiOperation("分页查询")
public R> page(@RequestBody DeviceChargingDto.Page page) {
Integer value = SysDictUtils.getValue(EnumDeviceCharging.Code.CODE.getCode(), EnumDeviceCharging.N_200.getCode(), Integer.class);
String theTime = DataTime.getStringAround(0, 0, value, 0, 0, 0);
page.setThisTime(LocalDateTime.now()).setTheTime(DataTime.toLocal(theTime));
IPage iPage = baseMapper.page(toIPage(page.getPage()), page);
List records = iPage.getRecords();
if (Emptys.check(records)) {
Map stringSysDictRedisMap = SysDictUtils.get(EnumDeviceCharging.Code.CODE.getCode());
for (DeviceChargingDto.PageVo record : records) {
//封装过期状态说明
String timeoutStatus;
DeviceChargingDto.Vo deviceCharging = record.getDeviceCharging();
LocalDateTime timeout = deviceCharging.getTimeout();
long s = DataTime.diff(page.getThisTime(), timeout, "s");
if (s <= 0) {
timeoutStatus = "欠费(" + (~(s / 86400 - 1)) + "天)";
} else {
timeoutStatus = s <= value * 86400 ? "即将到期(" + s / 86400 + "天)" : "正常(" + s / 86400 + "天)";
}
record.getDeviceCharging().setTimeoutStatus(timeoutStatus);
//封装计费标准金额
DeviceInfoDto.Vo deviceInfo = record.getDeviceInfo();
SysDictRedis sysDictRedis = stringSysDictRedisMap.get(deviceInfo.getDeviceType().toString());
if (sysDictRedis != null) {
record.setChargingMoney(Integer.valueOf(sysDictRedis.getValue()));
}
}
}
return R.ok(toPageBean(iPage));
}
@Override
@ApiOperation("购买")
public R pay(DeviceChargingDto.Pay pay) {
JList deviceChargings = new JArrayList<>(pay.getDeviceChargings());
Integer payType = pay.getPayType();
LocalDateTime now = LocalDateTime.now();
JList deviceChargingHistories = new JArrayList<>();
deviceChargings.forEach(deviceCharging -> {
DeviceChargingHistory deviceChargingHistory = new DeviceChargingHistory()
.createId()
.setOrderId(pay.getOrderId())
.setDeviceId(deviceCharging.getDeviceId())
.setChargingSize(deviceCharging.getNum())
.setChargingMoney(deviceCharging.getChargingMoney())
.setChargingType(payType)
.setStandard(deviceCharging.getStandard())
.setCreateTime(now)
.setUpdateTime(now);
deviceChargingHistories.add(deviceChargingHistory);
});
if (!Emptys.check(deviceChargingHistories)) {
return R.fail();
}
//添加设备计费历史表
deviceChargingHistoryService.saveBatch(deviceChargingHistories);
return R.ok();
}
@Override
@ApiOperation("购买回调")
public R payNotice(DeviceChargingDto.PayNotice payNotice) {
//查询设备计费历史表
List list = deviceChargingHistoryService.list(new LambdaQueryWrapper().eq(DeviceChargingHistory::getOrderId, payNotice.getOrderId()));
if (!Emptys.check(list)) {
return R.ok();
}
JList deviceChargingHistories = new JArrayList<>(list);
LocalDateTime now = LocalDateTime.now();
//查询设备计费表
List deviceChargings = list(new LambdaQueryWrapper().in(DeviceCharging::getDeviceId, deviceChargingHistories.getProperty(DeviceChargingHistory::getDeviceId)));
JMap deviceChargingsJMaps = new JArrayList<>(deviceChargings).toMap(DeviceCharging::getDeviceId).cover();
//获取已支付字典
Integer status = SysDictUtils.getValue(EnumDeviceChargingHistoryStatus.Code.CODE.getCode(), EnumDeviceChargingHistoryStatus.N_2.getCode(), Integer.class);
JList updateDeviceCharging = new JArrayList<>();
JList updateDeviceInfos = new JArrayList<>();
JList updateDeviceChargingHistory = new JArrayList<>();
for (DeviceChargingHistory deviceChargingHistory : deviceChargingHistories) {
DeviceCharging deviceCharging = deviceChargingsJMaps.get(deviceChargingHistory.getDeviceId());
Integer chargingSize = deviceChargingHistory.getChargingSize();
boolean fal = false;
//设备计费历史完成
deviceChargingHistory.setStatus(status);
if (deviceChargingHistory.getChargingType() == 100) {
//赠送天数
deviceCharging.setChargingX(deviceCharging.getChargingX() + chargingSize);
fal = true;
} else {
String timeout = DataTime.getStringAround(chargingSize, 0, 0, 0, 0, 0, DataTime.toString(deviceCharging.getTimeout()));
deviceCharging.setChargingSumMoney(deviceCharging.getChargingSumMoney() + deviceChargingHistory.getChargingMoney())
.setTimeout(DataTime.toLocal(timeout));
//过期时间大于当前时间
if (DataTime.stringContrast(timeout, DataTime.toString(now)) > 0) {
fal = true;
}
}
if (fal) {
//设备重新计费
deviceCharging.setIsJob(true);
//解冻设备
DeviceInfoDto.Update deviceInfo = new DeviceInfoDto.Update()
.setDeviceId(deviceChargingHistory.getDeviceId());
deviceInfo.setFreezeStatus(1);
deviceInfo.setBusyState(1);
updateDeviceInfos.add(deviceInfo);
}
updateDeviceCharging.add(deviceCharging);
updateDeviceChargingHistory.add(deviceChargingHistory);
}
int size = 50;
//修改设备计费记录
if (Emptys.check(updateDeviceCharging)) {
JList> partition = updateDeviceCharging.partition(size);
partition.forEach(data -> updateBatchById(data));
}
//修改设备计费历史记录
if (Emptys.check(updateDeviceChargingHistory)) {
JList> partition = updateDeviceChargingHistory.partition(size);
partition.forEach(data -> deviceChargingHistoryService.updateBatchById(data));
}
//修改设备
if (Emptys.check(updateDeviceInfos)) {
JList> partition = updateDeviceInfos.partition(size);
partition.forEach(data -> deviceInfoService.updateBatch(data));
}
return R.ok();
}
}