package com.xy.service;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
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.JHashMap;
import com.xy.collections.map.JMap;
import com.xy.device.EnumDeviceFactoryStatus;
import com.xy.device.EnumDeviceQualityStatus;
import com.xy.device.EnumDeviceQualityThreshold;
import com.xy.dto.DeviceQualityDto;
import com.xy.dto.DeviceQualityValueDto;
import com.xy.dto.be.MercDto;
import com.xy.entity.*;
import com.xy.error.CommRuntimeException;
import com.xy.mapper.DeviceInfoMapper;
import com.xy.mapper.DeviceQualityMapper;
import com.xy.service.be.MercService;
import com.xy.utils.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.stereotype.Service;
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.Arrays;
import java.util.List;
import static com.xy.utils.PlusBeans.*;
/**
*
* 设备-质检 服务实现类
*
*
* @author lijin
* @since 2023-01-05
*/
@Service
@AllArgsConstructor
@Api(tags = "设备-质检")
public class DeviceQualityServiceImpl extends ServiceImpl implements DeviceQualityService {
private DeviceInfoMapper deviceInfoMapper;
private DeviceQualityValueServiceImpl deviceQualityValueService;
private DeviceSysinfoServiceImpl deviceSysinfoService;
private DeviceStatusServiceImpl deviceStatusService;
private DeviceCreateIdsServiceImpl deviceCreateIdsService;
private MercService mercService;
private void queryDeviceQualityValue(List list) {
if (Emptys.check(list)) {
JList deviceQualitys = new JArrayList<>(list);
//查询质检值
JList qualityIds = deviceQualitys.getProperty(DeviceQualityDto.Vo::getQualityId);
List deviceQualityValues = deviceQualityValueService.list(new LambdaQueryWrapper().in(DeviceQualityValue::getQualityId, qualityIds));
JMap deviceQualityValueMap = new JArrayList<>(deviceQualityValues).toMap(DeviceQualityValue::getQualityId).cover();
//查询机器ID号
List deviceCreateIds = deviceCreateIdsService.list(new LambdaQueryWrapper()
.in(DeviceCreateIds::getDeviceId, deviceQualitys.getProperty(DeviceQualityDto.Vo::getDeviceId))
.isNotNull(DeviceCreateIds::getDeviceQrMercId)
.ge(DeviceCreateIds::getDeviceQrMercId, 0)
);
JMap deviceCreateIdsJMaps;
JMap mercsJMaps;
if (Emptys.check(deviceCreateIds)) {
JList deviceCreateIdss = new JArrayList<>(deviceCreateIds);
deviceCreateIdsJMaps = deviceCreateIdss.toMap(DeviceCreateIds::getDeviceId).cover();
JList mercIds = deviceCreateIdss.getProperty(DeviceCreateIds::getDeviceQrMercId);
List mercs = mercService.list(new MercDto.SelectList().setMercIds(mercIds)).getData();
mercsJMaps = new JArrayList<>(mercs).toMap(MercDto.Vo::getId).cover();
} else {
deviceCreateIdsJMaps = new JHashMap<>();
mercsJMaps = new JHashMap<>();
}
list.forEach(vo -> {
//质检值信息
DeviceQualityValue deviceQualityValue = deviceQualityValueMap.get(vo.getQualityId());
if (deviceQualityValue == null) {
return;
}
vo.setDeviceQualityValue(copy(DeviceQualityValueDto.Vo.class, deviceQualityValue));
//机器ID号商户信息
DeviceCreateIds deviceCreateIdsInfo = deviceCreateIdsJMaps.get(vo.getDeviceId());
if (Emptys.check(deviceCreateIdsInfo)) {
MercDto.Vo merc = mercsJMaps.get(deviceCreateIdsInfo.getDeviceQrMercId());
if (Emptys.check(merc)) {
vo.setDeviceQrMercId(merc.getId()).setDeviceQrMercName(merc.getName());
}
}
});
}
}
@PostMapping("page")
@ApiOperation("分页查询")
public R> page(@RequestBody DeviceQualityDto.Page page) {
PageBean pageBean = page.getPage();
LambdaQueryWrapper lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, DeviceQuality.class)
.ge(DeviceQuality::getUpdateTime, page.getBeginUpdateTime())
.le(DeviceQuality::getUpdateTime, page.getEndUpdateTime())
.build()
.orderByDesc(!Emptys.check(pageBean.getOrders()), DeviceQuality::getCreateTime);
IPage iPage = page(toIPage(pageBean), lambdaQueryWrapper);
PageBean voPageBean = toPageBean(DeviceQualityDto.Vo.class, iPage);
List list = voPageBean.getRecords();
queryDeviceQualityValue(list);
return R.ok(voPageBean);
}
@PostMapping("list")
@ApiOperation("集合查询")
public R> list(@RequestBody DeviceQualityDto.SelectList selectList) {
LambdaQueryWrapper lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(selectList, DeviceQuality.class)
.in(DeviceQuality::getQualityId, selectList.getQualityIds())
.in(DeviceQuality::getDeviceId, selectList.getDeviceIds())
.build();
List deviceQualities = list(lambdaQueryWrapper);
List list = copy(DeviceQualityDto.Vo.class, deviceQualities);
queryDeviceQualityValue(list);
return R.ok(list);
}
@PostMapping("obj")
@ApiOperation("对象查询")
public R obj(@RequestBody DeviceQualityDto.Obj obj) {
LambdaQueryWrapper lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(obj, DeviceQuality.class)
.build()
.orderByDesc(DeviceQuality::getQualityId);
List deviceQualities = list(lambdaQueryWrapper);
List list = copy(DeviceQualityDto.Vo.class, deviceQualities);
if (!Emptys.check(list)) {
if (Emptys.check(obj.getDeviceId())) {
save(Arrays.asList(new DeviceQualityDto.Save().setDeviceId(obj.getDeviceId())));
return obj(obj);
}
return R.ok();
}
DeviceQualityDto.Vo vo = copy(DeviceQualityDto.Vo.class, list.get(0));
queryDeviceQualityValue(Arrays.asList(vo));
return R.ok(vo);
}
@PostMapping("update")
@ApiOperation("修改")
public R update(@RequestBody List vos) {
List deviceQualities = copy(DeviceQuality.class, vos);
LocalDateTime now = LocalDateTime.now();
List deviceSysinfos = deviceSysinfoService.list(new LambdaQueryWrapper().in(DeviceSysinfo::getDeviceId, new JArrayList<>(vos).getProperty(DeviceQualityDto.Vo::getDeviceId)));
JMap deviceSysinfosJMaps = new JArrayList<>(deviceSysinfos).toMap(DeviceSysinfo::getDeviceId).cover();
int qualified = SysDictUtils.getValue(EnumDeviceQualityStatus.Code.CODE.getCode(), EnumDeviceQualityStatus.QUALIFIED.getCode(), Integer.class);
List deviceStatuses = new ArrayList<>();
for (DeviceQuality deviceQuality : deviceQualities) {
if (deviceQuality.getQualityState() != null) {
//合格
if (qualified == deviceQuality.getQualityState()) {
//检查磁盘空间和内存容量
DeviceSysinfo deviceSysinfo = deviceSysinfosJMaps.get(deviceQuality.getDeviceId());
Integer diskSpace = deviceSysinfo.getDiskSpace();
int diskSpaceSize = SysDictUtils.getValue(EnumDeviceQualityThreshold.Code.CODE.getCode(), EnumDeviceQualityThreshold.DISK_SPACE_SIZE.getCode(), Integer.class);
if (diskSpace == null || diskSpace < diskSpaceSize) {
return R.fail(deviceSysinfo.getDeviceId() + "磁盘空间不足" + diskSpaceSize + "G");
}
Integer memerySpace = deviceSysinfo.getMemerySpace();
int memerySpaceSize = SysDictUtils.getValue(EnumDeviceQualityThreshold.Code.CODE.getCode(), EnumDeviceQualityThreshold.MEMERY_SPACE_SIZE.getCode(), Integer.class);
if (memerySpace == null || memerySpace < memerySpaceSize) {
return R.fail(deviceSysinfo.getDeviceId() + "内存容量不足" + memerySpaceSize + "M");
}
//标记机器不可交易
DeviceStatus deviceStatus = new DeviceStatus()
.setDeviceId(deviceQuality.getDeviceId())
.setIsPay(false);
deviceStatuses.add(deviceStatus);
}
deviceQuality.setQualityAuditUserId(AuthorizeUtils.getLoginId(Long.class));
}
if (deviceQuality.getFactoryState() != null) {
deviceQuality.setFactoryAuditUserId(AuthorizeUtils.getLoginId(Long.class));
}
deviceQuality.setUpdateTime(now);
}
updateBatchById(deviceQualities);
if (Emptys.check(deviceStatuses)) {
deviceStatusService.updateBatchById(deviceStatuses);
}
return R.ok();
}
@PostMapping("rest")
@ApiOperation(value = "重置多项质检", hidden = true)
public R rest(@RequestBody DeviceQualityDto.Rest rest) {
SysDictRedis sysDictRedis1 = SysDictUtils.get(EnumDeviceQualityStatus.Code.CODE.getCode(), EnumDeviceQualityStatus.QUALIFIED.getCode());
SysDictRedis sysDictRedis2 = SysDictUtils.get(EnumDeviceFactoryStatus.Code.CODE.getCode(), EnumDeviceFactoryStatus.CAN_SHIPPED.getCode());
DeviceQuality deviceQuality = getById(rest.getQualityId());
if (sysDictRedis1.getValue().equals(deviceQuality.getQualityState()) || sysDictRedis2.getValue().equals(deviceQuality.getFactoryState())) {
return R.fail("设备已合格或已出厂");
}
List types = rest.getTypes();
LocalDateTime now = LocalDateTime.now();
types.forEach(type -> {
QualityEnum qualityEnum = QualityEnum.getQualityEnum(type);
if (qualityEnum == null) {
return;
}
//修改质检
UpdateWrapper updateWrapper = new UpdateWrapper()
.set(qualityEnum.getBeginTime(), now)
.set(qualityEnum.getEndTime(), null)
.set(StringTools.humpToLine(LambdaUtils.getProperty(DeviceQuality::getUpdateTime)), now)
.eq(StringTools.humpToLine(LambdaUtils.getProperty(DeviceQuality::getQualityId)), rest.getQualityId());
update(updateWrapper);
//删除质检属性
DeviceQualityValueDto.Vo del = new DeviceQualityValueDto.Vo()
.setQualityId(rest.getQualityId())
.setQualityType(type);
deviceQualityValueService.del(del);
});
return R.ok();
}
@PostMapping("save")
@ApiOperation("添加新质检")
public R>> save(@RequestBody List deviceQualitySaves) {
List updates = new ArrayList<>();
List saves = new ArrayList<>();
JList deviceIds = new JArrayList<>(deviceQualitySaves).getProperty(DeviceQualityDto.Save::getDeviceId);
//获取设备信息
List deviceInfos = deviceInfoMapper.selectList(new LambdaQueryWrapper().in(DeviceInfo::getDeviceId, deviceIds));
JMap deviceInfoJMap = new JArrayList<>(deviceInfos).toMap(DeviceInfo::getDeviceId).cover();
//获取已有质检信息
List deviceQualities = list(new LambdaQueryWrapper()
.in(DeviceQuality::getDeviceId, deviceIds)
.eq(DeviceQuality::getShowStatus, true)
);
JMap> deviceQualitieJMap = new JArrayList<>(deviceQualities).toMap(DeviceQuality::getDeviceId).group();
LocalDateTime now = LocalDateTime.now();
//封装修改和添加对象
deviceQualitySaves.forEach(save -> {
DeviceInfo deviceInfo = deviceInfoJMap.get(save.getDeviceId());
if (deviceInfo == null) {
throw new CommRuntimeException(save.getDeviceId() + "设备不存在");
}
DeviceQuality deviceQuality = new DeviceQuality()
.setDeviceId(save.getDeviceId())
.setDeviceType(deviceInfo.getDeviceType())
.setCreateTime(now);
List list = deviceQualitieJMap.get(deviceQuality.getDeviceId());
if (Emptys.check(list)) {
JList qualityIds = new JArrayList<>(list).getProperty(DeviceQuality::getQualityId);
List vos2 = new ArrayList<>(qualityIds.size());
qualityIds.forEach(qualityId -> vos2.add(new DeviceQualityDto.Vo().setQualityId(qualityId).setShowStatus(false)));
updates.addAll(vos2);
}
saves.add(deviceQuality);
});
//修改
if (Emptys.check(updates)) {
update(updates);
}
//添加
saveBatch(saves);
return R.ok();
}
@ApiOperation(value = "质检结果通知", hidden = true)
@PostMapping("qualityResultBack")
public R qualityResultBack(@RequestBody DeviceQualityDto.QualityResultBack qualityResultBack) {
Long deviceId = qualityResultBack.getDeviceId();
String type = qualityResultBack.getType();
JSONObject data = qualityResultBack.getData();
LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper()
.eq(DeviceQuality::getDeviceId, deviceId)
.eq(DeviceQuality::getShowStatus, true).orderByDesc(DeviceQuality::getQualityId).last("limit 1");
DeviceQuality deviceQuality = getOne(lambdaQueryWrapper);
if (deviceQuality == null) {
return R.fail("设备不存在");
}
//修改质检
QualityEnum qualityEnum = QualityEnum.getQualityEnum(type);
if (qualityEnum != null) {
UpdateWrapper updateWrapper = new UpdateWrapper()
.set(qualityEnum.getEndTime(), LocalDateTime.now())
.eq(StringTools.humpToLine(LambdaUtils.getProperty(DeviceQuality::getDeviceId)), deviceId)
.eq(StringTools.humpToLine(LambdaUtils.getProperty(DeviceQuality::getShowStatus)), true);
update(updateWrapper);
}
//修改质检值
DeviceQualityValueDto.Vo saveOrUpdate = new DeviceQualityValueDto.Vo()
.setQualityType(type)
.setQualityValue(data.toString());
saveOrUpdate.setQualityId(deviceQuality.getQualityId());
deviceQualityValueService.saveOrUpdate(saveOrUpdate);
return R.ok();
}
/**
* 工厂枚举
*/
@Getter
@AllArgsConstructor
public enum QualityEnum {
/**
* 软件硬系统检查
*/
CHECK_SYSTEM("check_system", "system_state", "system_state_begin_time", "system_state_end_time"),
/**
* 交易测试检查
*/
CHECK_TRADE("check_trade", "trade_state", "trade_state_begin_time", "trade_state_end_time"),
/**
* 门锁检查
*/
CHECK_LOCKER("check_locker", "locker_state", "locker_state_begin_time", "locker_state_end_time"),
/**
* 温度检查
*/
CHECK_TEMPERATURE("check_temperature", "temperature_state", "temperature_state_begin_time", "temperature_state_end_time"),
/**
* 模拟批量测试
*/
CHECK_IMITATE_TEST("check_imitate_test", "imitate_test_state", "imitate_test_state_begin_time", "imitate_test_state_end_time"),
/**
* 参数设置检查
*/
CHECK_SETTING("check_setting", "setting_state", "setting_state_begin_time", "setting_state_end_time"),
;
/**
* 质检类型
*/
private String type;
/**
* 质检状态列名
*/
private String state;
/**
* 质检状态开始时间列名
*/
private String beginTime;
/**
* 质检状态结束时间列名
*/
private String endTime;
public static QualityEnum getQualityEnum(String type) {
QualityEnum[] values = QualityEnum.values();
for (QualityEnum qualityEnum : values) {
if (qualityEnum.type.equals(type)) {
return qualityEnum;
}
}
return null;
}
}
}