package com.xy.service;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
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.github.yitter.idgen.YitIdHelper;
import com.xy.collections.list.JArrayList;
import com.xy.collections.list.JList;
import com.xy.collections.map.JHashMap;
import com.xy.collections.map.JMap;
import com.xy.config.DeviceThreadPoolConfig;
import com.xy.device.EnumAlgorithmPayConfig;
import com.xy.device.EnumDeviceAlgorithmChargingHistoryStatus;
import com.xy.device.EnumDeviceAlgorithmChargingType;
import com.xy.device.EnumDeviceType;
import com.xy.dto.*;
import com.xy.entity.DeviceAlgorithmCharging;
import com.xy.entity.DeviceAlgorithmChargingHistory;
import com.xy.entity.DeviceInfo;
import com.xy.entity.SysDictRedis;
import com.xy.mapper.DeviceAlgorithmChargingMapper;
import com.xy.utils.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
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.ArrayList;
import java.util.List;
import java.util.Map;
import static com.xy.utils.PlusBeans.toPageBean;
/**
*
* 设备算法计费表 服务实现类
*
*
* @author lijin
* @since 2023-06-29
*/
@Slf4j
@Service
@AllArgsConstructor(onConstructor_ = @Lazy)
@Api(tags = "设备算法计费表")
public class DeviceAlgorithmChargingServiceImpl extends ServiceImpl implements DeviceAlgorithmChargingService {
private DeviceAlgorithmChargingHistoryServiceImpl deviceAlgorithmChargingHistoryService;
private DeviceInfoServiceImpl deviceInfoService;
private DeviceSysinfoServiceImpl deviceSysinfoService;
private AlipayDeviceService alipayDeviceService;
private MercDeviceAlgorithmChargingService mercDeviceAlgorithmChargingService;
@PostMapping("count")
@ApiOperation("查询条数")
public R> count(@RequestBody @Validated DeviceAlgorithmChargingDto.Count count) {
//默认值
JList deviceIds = new JArrayList<>(count.getDeviceIds());
JList countVos = new JArrayList<>(deviceIds.size());
deviceIds.forEach(deviceId -> {
DeviceAlgorithmChargingDto.CountVo countVo = new DeviceAlgorithmChargingDto.CountVo()
.setDeviceId(deviceId)
.setUnusedCount(0)
.setUnusedSize(0)
.setMakeSize(0)
.setArrearageBalance(0);
countVos.add(countVo);
});
JMap cover = countVos.toMap(DeviceAlgorithmChargingDto.CountVo::getDeviceId).cover();
//查询全部
JList> partition = deviceIds.partition(100);
JList deviceAlgorithmChargings = new JArrayList<>();
partition.forEach(longs -> {
List list = list(new LambdaQueryWrapper()
.select(DeviceAlgorithmCharging::getDeviceId, DeviceAlgorithmCharging::getMakeSize, DeviceAlgorithmCharging::getUnusedSize, DeviceAlgorithmCharging::getTimeout, DeviceAlgorithmCharging::getBeginTime)
.in(DeviceAlgorithmCharging::getDeviceId, longs)
.eq(DeviceAlgorithmCharging::getMercId, count.getMercId())
);
deviceAlgorithmChargings.addAll(list);
});
JMap> allGroup = deviceAlgorithmChargings.toMap(DeviceAlgorithmCharging::getDeviceId).group();
//查询未使用
String thisTime = DataTime.getSring("yyyyMMdd");
JList unuseds = deviceAlgorithmChargings.filter()
.gt(DeviceAlgorithmCharging::getUnusedSize, 0)
.eq(DeviceAlgorithmCharging::getTimeout, -1)
.le(DeviceAlgorithmCharging::getBeginTime, thisTime)
.list();
JList unuseds2 = deviceAlgorithmChargings.filter()
.gt(DeviceAlgorithmCharging::getUnusedSize, 0)
.ge(DeviceAlgorithmCharging::getTimeout, thisTime)
.le(DeviceAlgorithmCharging::getBeginTime, thisTime)
.list();
if (Emptys.check(unuseds2)) {
unuseds.addAll(unuseds2);
}
JMap> unusedGroup = unuseds.toMap(DeviceAlgorithmCharging::getDeviceId).group();
//统计设备欠费金额
List countArrearageBalanceVos = mercDeviceAlgorithmChargingService.countArrearageBalance(new MercDeviceAlgorithmChargingDto.CountArrearageBalance()
.setDeviceIds(deviceIds)
.setMercId(count.getMercId())
).getData();
JMap countArrearageBalanceVosJMaps = new JArrayList<>(countArrearageBalanceVos).toMap(MercDeviceAlgorithmChargingDto.CountArrearageBalanceVo::getDeviceId).cover();
//封装数据
cover.forEach((deviceId, countVo) -> {
//未使用
List deviceAlgorithmChargings1 = unusedGroup.get(deviceId);
if (Emptys.check(deviceAlgorithmChargings1)) {
countVo.setUnusedCount(deviceAlgorithmChargings1.size());
int unusedSize = 0;
for (DeviceAlgorithmCharging deviceAlgorithmCharging : deviceAlgorithmChargings1) {
unusedSize += deviceAlgorithmCharging.getUnusedSize();
}
countVo.setUnusedSize(unusedSize);
}
//已使用
List deviceAlgorithmChargings2 = allGroup.get(deviceId);
if (Emptys.check(deviceAlgorithmChargings2)) {
int makeSize = 0;
for (DeviceAlgorithmCharging deviceAlgorithmCharging : deviceAlgorithmChargings2) {
makeSize += deviceAlgorithmCharging.getMakeSize();
}
countVo.setMakeSize(makeSize);
}
//欠费金额
MercDeviceAlgorithmChargingDto.CountArrearageBalanceVo countArrearageBalanceVo = countArrearageBalanceVosJMaps.get(deviceId);
if (Emptys.check(countArrearageBalanceVo)) {
countVo.setArrearageBalance(countArrearageBalanceVo.getArrearageBalance());
}
});
return R.ok(countVos);
}
@PostMapping("page")
@ApiOperation("分页查询")
public R> page(@RequestBody @Validated DeviceAlgorithmChargingDto.Page page) {
LambdaQueryWrapper lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, DeviceAlgorithmCharging.class)
.build()
.orderByDesc(DeviceAlgorithmCharging::getTimeout, DeviceAlgorithmCharging::getUnusedSize);
IPage iPage = page(PlusBeans.toIPage(page.getPage()), lambdaQueryWrapper);
return R.ok(toPageBean(DeviceAlgorithmChargingDto.Vo.class, iPage));
}
@PostMapping("check")
@ApiOperation("检查")
public R check(@RequestBody @Validated DeviceAlgorithmChargingDto.Check check) {
int yyyyMMdd = Integer.valueOf(DataTime.getSring("yyyyMMdd"));
DeviceInfoDto.Vo deviceInfo = deviceInfoService.obj(new DeviceInfoDto.Obj().setDeviceId(check.getDeviceId())).getData();
List deviceAlgorithmChargings = list(new LambdaQueryWrapper()
.eq(DeviceAlgorithmCharging::getMercId, deviceInfo.getMercId())
.eq(DeviceAlgorithmCharging::getDeviceId, deviceInfo.getDeviceId())
.eq(DeviceAlgorithmCharging::getAlgorithmId, deviceInfo.getAlgorithmId())
.gt(DeviceAlgorithmCharging::getUnusedSize, 0)
.and(deviceAlgorithmChargingLambdaQueryWrapper -> deviceAlgorithmChargingLambdaQueryWrapper
.ge(DeviceAlgorithmCharging::getTimeout, yyyyMMdd)
.or()
.eq(DeviceAlgorithmCharging::getTimeout, -1)
)
.ge(DeviceAlgorithmCharging::getBeginTime, yyyyMMdd)
);
if (!Emptys.check(deviceAlgorithmChargings)) {
return R.fail(R.Enum.ALGORITHM_CHARGING.getCode(), R.Enum.ALGORITHM_CHARGING.getMsg());
}
return R.ok();
}
@Override
@ApiOperation("购买")
public R pay(DeviceAlgorithmChargingDto.Pay pay) {
JList deviceAlgorithmChargings = new JArrayList<>(pay.getDeviceAlgorithmChargings());
LocalDateTime now = LocalDateTime.now();
List deviceAlgorithmChargingHistories = new ArrayList<>(deviceAlgorithmChargings.size());
deviceAlgorithmChargings.forEach(deviceAlgorithmCharging -> {
DeviceAlgorithmChargingHistory deviceAlgorithmChargingHistory = new DeviceAlgorithmChargingHistory()
.setId(YitIdHelper.nextId())
.setMercId(pay.getMercId())
.setOrderId(pay.getOrderId())
.setDeviceId(deviceAlgorithmCharging.getDeviceId())
.setAlgorithmId(deviceAlgorithmCharging.getAlgorithmId())
.setChargingSize(deviceAlgorithmCharging.getChargingSize())
.setChargingMoney(deviceAlgorithmCharging.getMoney())
.setType(deviceAlgorithmCharging.getType())
.setName(deviceAlgorithmCharging.getName())
.setChargingType(pay.getPayType())
.setCreateTime(now)
.setUpdateTime(now)
.setNote(pay.getNote());
deviceAlgorithmChargingHistories.add(deviceAlgorithmChargingHistory);
});
//添加设备算法计费历史表
if (Emptys.check(deviceAlgorithmChargingHistories)) {
deviceAlgorithmChargingHistoryService.saveBatch(deviceAlgorithmChargingHistories);
}
return R.ok();
}
@Override
@ApiOperation("购买回调")
public R payNotice(DeviceAlgorithmChargingDto.PayNotice payNotice) {
List list = deviceAlgorithmChargingHistoryService.list(new LambdaQueryWrapper().eq(DeviceAlgorithmChargingHistory::getOrderId, payNotice.getOrderId()));
if (!Emptys.check(list)) {
return R.ok();
}
JList deviceAlgorithmChargingHistories = new JArrayList<>(list);
JList infs = new JArrayList<>();
JList gives = new JArrayList<>();
LocalDateTime now = LocalDateTime.now();
int yyyyMMdd = Integer.valueOf(DataTime.getSring("yyyyMMdd"));
//查询设备信息
List deviceInfos = deviceInfoService.list(new LambdaQueryWrapper().in(DeviceInfo::getDeviceId, deviceAlgorithmChargingHistories.getProperty(DeviceAlgorithmChargingHistory::getDeviceId)));
JMap deviceInfoJMap = new JArrayList<>(deviceInfos).toMap(DeviceInfo::getDeviceId).cover();
//查询设备系统信息
List deviceSysinfos = deviceSysinfoService.list(new DeviceSysinfoDto.SelectList().setDeviceIds(deviceAlgorithmChargingHistories.getProperty(DeviceAlgorithmChargingHistory::getDeviceId))).getData();
JMap deviceSysinfosJMaps = new JArrayList<>(deviceSysinfos).toMap(DeviceSysinfoDto.Vo::getDeviceId).cover();
//获取算法包月字典
Map algorithmMoonConfigMaps = SysDictUtils.get(EnumAlgorithmPayConfig.Code.CODE.getCode());
//获取类型字典
Map deviceAlgorithmChargingTypeMaps = SysDictUtils.get(EnumDeviceAlgorithmChargingType.Code.CODE.getCode());
JList updateDeviceInfos = new JArrayList<>();
JList> ailiActive = new JArrayList<>();
int aliDeviceType = SysDictUtils.getValue(EnumDeviceType.Code.CODE.getCode(), EnumDeviceType.N_5.getCode(), Integer.class);
//处理有效期
deviceAlgorithmChargingHistories.forEach(deviceAlgorithmChargingHistory -> {
//解冻设备 激活设备
if (deviceAlgorithmChargingHistory.getChargingType() != 100) {
DeviceInfoDto.Update updateDeviceInfo = new DeviceInfoDto.Update()
.setDeviceId(deviceAlgorithmChargingHistory.getDeviceId());
updateDeviceInfo.setFreezeStatus(1);
updateDeviceInfo.setBusyState(1);
DeviceInfo deviceInfo = deviceInfoJMap.get(deviceAlgorithmChargingHistory.getDeviceId());
if (deviceInfo.getActiveState() == 2) {
updateDeviceInfo.setActiveState(1);
}
if (!Emptys.check(deviceInfo.getActiveTime())) {
updateDeviceInfo.setActiveTime(now);
}
updateDeviceInfos.add(updateDeviceInfo);
}
//支付宝设备
DeviceInfo deviceInfo = deviceInfoJMap.get(deviceAlgorithmChargingHistory.getDeviceId());
if (deviceInfo.getDeviceType() == aliDeviceType) {
if (deviceAlgorithmChargingHistory.getChargingType() != 100 && deviceInfo.getActiveState() == 2) {
//支付宝绑定
DeviceSysinfoDto.Vo deviceSysinfo = deviceSysinfosJMaps.get(deviceAlgorithmChargingHistory.getDeviceId());
BindDeviceDTO bindDeviceDTO = new BindDeviceDTO().setTerminalId(String.valueOf(deviceInfo.getDeviceId()))
.setBoardSn(deviceSysinfo.getDeviceSn());
//支付宝激活
BindActiveDTO bindActiveDTO = new BindActiveDTO()
.setTerminalId(String.valueOf(deviceInfo.getDeviceId()))
.setBoardSn(deviceSysinfo.getDeviceSn())
.setDeviceName(StrUtil.isNotEmpty(deviceInfo.getDeviceName()) ? deviceInfo.getDeviceName() : String.valueOf(deviceInfo.getDeviceId()));
ailiActive.add(new Tuple.Tuple2<>(bindDeviceDTO, bindActiveDTO));
}
}
Integer type = deviceAlgorithmChargingHistory.getType();
SysDictRedis deviceAlgorithmChargingType2 = deviceAlgorithmChargingTypeMaps.get(EnumDeviceAlgorithmChargingType.N_2.getCode());
if (type.equals(Integer.valueOf(deviceAlgorithmChargingType2.getValue()))) {
infs.add(deviceAlgorithmChargingHistory);
return;
}
SysDictRedis deviceAlgorithmChargingType3 = deviceAlgorithmChargingTypeMaps.get(EnumDeviceAlgorithmChargingType.N_3.getCode());
if (type.equals(Integer.valueOf(deviceAlgorithmChargingType3.getValue()))) {
gives.add(deviceAlgorithmChargingHistory);
return;
}
SysDictRedis algorithmMoonConfigDict = algorithmMoonConfigMaps.get(deviceAlgorithmChargingHistory.getAlgorithmId().toString());
DeviceAlgorithmChargingDto.AlgorithmMoonConfig algorithmMoonConfig = JSONUtil.parseObj(algorithmMoonConfigDict.getValue()).toBean(DeviceAlgorithmChargingDto.AlgorithmMoonConfig.class);
DeviceAlgorithmChargingDto.AlgorithmMoonConfig.Moon moon = algorithmMoonConfig.getMoon();
Integer chargingSize = deviceAlgorithmChargingHistory.getChargingSize();
for (Integer integer = 0; integer < chargingSize; integer++) {
//查询生效时间最大的算法计费
LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper()
.eq(DeviceAlgorithmCharging::getDeviceId, deviceAlgorithmChargingHistory.getDeviceId())
.eq(DeviceAlgorithmCharging::getAlgorithmId, deviceAlgorithmChargingHistory.getAlgorithmId())
.eq(DeviceAlgorithmCharging::getType, type)
.orderByDesc(DeviceAlgorithmCharging::getBeginTime)
.last("limit 1");
DeviceAlgorithmCharging deviceAlgorithmCharging = getOne(lambdaQueryWrapper);
int beginTime;
int timeout;
if (deviceAlgorithmCharging == null) {
beginTime = Integer.valueOf(DataTime.toString(deviceAlgorithmChargingHistory.getCreateTime(), "yyyyMMdd"));
String stringAround = DataTime.getStringAround(0, 1, 0, 0, 0, 0, DataTime.toString(deviceAlgorithmChargingHistory.getCreateTime()));
timeout = Integer.valueOf(DataTime.toString(DataTime.toLocal(stringAround), "yyyyMMdd"));
} else {
LocalDateTime localDateTime = DataTime.toLocal(deviceAlgorithmCharging.getBeginTime() + "01000000", "yyyyMMddHHmmss");
String s = DataTime.toString(localDateTime, "yyyy-MM-dd HH:mm:ss");
String stringAround = DataTime.getStringAround(0, 1, 0, 0, 0, 0, s);
beginTime = Integer.valueOf(DataTime.toString(DataTime.toLocal(stringAround), "yyyyMMdd"));
String stringAround1 = DataTime.getStringAround(0, 1, 0, 0, 0, 0, stringAround);
timeout = Integer.valueOf(DataTime.toString(DataTime.toLocal(stringAround1), "yyyyMMdd"));
}
DeviceAlgorithmCharging deviceAlgorithmChargingInfo = new DeviceAlgorithmCharging()
.setMercId(deviceAlgorithmChargingHistory.getMercId())
.setDeviceId(deviceAlgorithmChargingHistory.getDeviceId())
.setAlgorithmId(deviceAlgorithmChargingHistory.getAlgorithmId())
.setUnusedSize(moon.getSize())
.setType(type)
.setName(deviceAlgorithmChargingHistory.getName())
.setTimeout(timeout)
.setBeginTime(beginTime)
.setCreateTime(now)
.setUpdateTime(now);
save(deviceAlgorithmChargingInfo);
}
});
//处理无期限
infs.forEach(deviceAlgorithmChargingHistory -> {
DeviceAlgorithmCharging deviceAlgorithmChargingInfo = new DeviceAlgorithmCharging()
.setMercId(deviceAlgorithmChargingHistory.getMercId())
.setDeviceId(deviceAlgorithmChargingHistory.getDeviceId())
.setAlgorithmId(deviceAlgorithmChargingHistory.getAlgorithmId())
.setUnusedSize(deviceAlgorithmChargingHistory.getChargingSize())
.setType(deviceAlgorithmChargingHistory.getType())
.setName(deviceAlgorithmChargingHistory.getName())
.setTimeout(-1)
.setBeginTime(yyyyMMdd)
.setCreateTime(now)
.setUpdateTime(now);
save(deviceAlgorithmChargingInfo);
});
//处理赠送
gives.forEach(deviceAlgorithmChargingHistory -> {
DeviceAlgorithmCharging deviceAlgorithmChargingInfo = new DeviceAlgorithmCharging()
.setMercId(deviceAlgorithmChargingHistory.getMercId())
.setDeviceId(deviceAlgorithmChargingHistory.getDeviceId())
.setAlgorithmId(deviceAlgorithmChargingHistory.getAlgorithmId())
.setUnusedSize(deviceAlgorithmChargingHistory.getChargingSize())
.setType(deviceAlgorithmChargingHistory.getType())
.setName(deviceAlgorithmChargingHistory.getName())
.setTimeout(payNotice.getTimeout())
.setBeginTime(yyyyMMdd)
.setCreateTime(now)
.setUpdateTime(now);
save(deviceAlgorithmChargingInfo);
});
//修改设备算法计费历史
if (Emptys.check(deviceAlgorithmChargingHistories)) {
Integer status = SysDictUtils.getValue(EnumDeviceAlgorithmChargingHistoryStatus.Code.CODE.getCode(), EnumDeviceAlgorithmChargingHistoryStatus.N_2.getCode(), Integer.class);
deviceAlgorithmChargingHistories.forEach(deviceAlgorithmChargingHistory -> deviceAlgorithmChargingHistory.setStatus(status));
deviceAlgorithmChargingHistoryService.updateBatchById(deviceAlgorithmChargingHistories);
}
//修改设备
if (Emptys.check(updateDeviceInfos)) {
deviceInfoService.updateBatch(updateDeviceInfos);
}
//支付宝刷脸柜激活请求
if (Emptys.check(ailiActive)) {
ThreadPoolUtils.Execute execute = ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.ALI_DEVICE_ACTIVE, ailiActive.size());
ailiActive.forEach(bindDeviceDTOBindActiveDTOTuple2 -> execute.execute(() -> {
//调用支付宝绑定
R.feignCheckData(alipayDeviceService.deviceBind(bindDeviceDTOBindActiveDTOTuple2.getV1()));
//调用支付宝激活
R.feignCheckData(alipayDeviceService.deviceActive(bindDeviceDTOBindActiveDTOTuple2.getV2()));
}));
}
return R.ok();
}
@Override
@ApiOperation("扣费")
public R