package com.xy.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xy.annotation.Lock; import com.xy.collections.list.JArrayList; import com.xy.collections.list.JList; import com.xy.collections.map.JMap; import com.xy.config.ThreadPoolConfig; import com.xy.dto.DeviceCreateIdsDto; import com.xy.dto.SysWorkUser.ListDto; import com.xy.dto.SysWorkUser.SysWorkVo; import com.xy.entity.DeviceCreateIds; import com.xy.mapper.DeviceCreateIdsMapper; import com.xy.service.DeviceCreateIdsService; import com.xy.service.SysWorkUserService; import com.xy.utils.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; 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.annotation.Resource; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; import java.util.concurrent.CountDownLatch; import static com.xy.utils.Beans.copy; import static com.xy.utils.PlusBeans.toIPage; import static com.xy.utils.PlusBeans.toPageBean; /** *

* 设备-机器ID号生成 服务实现类 *

* * @author lijin * @since 2022-12-29 */ @Slf4j @Service @RequiredArgsConstructor @Api(tags = "设备-机器ID号生成") public class DeviceCreateIdsServiceImpl extends ServiceImpl implements DeviceCreateIdsService { @Resource(name = ThreadPoolConfig.DEVICE_CREATE_IDS_SAVE) private ThreadPoolTaskExecutor executor; private final SysWorkUserService sysWorkUserService; @SneakyThrows @PostMapping("save") @ApiOperation("添加") @Lock("device-create-ids-save") public R save(@RequestBody @Validated DeviceCreateIdsDto.Save save) { LocalDate localDate = LocalDate.now(); String year = String.valueOf(localDate.getYear()); String month = String.valueOf(localDate.getMonthValue()); String yearMonth = year.substring(2) + (month.length() == 1 ? "0" + month : month); String property = LambdaUtils.getProperty(DeviceCreateIds::getDeviceId); QueryWrapper queryWrapper = new QueryWrapper().select(String.format("max(%s) as %s", StringTools.humpToLine(property), property)); DeviceCreateIds deviceCreateIds = getOne(queryWrapper); JList deviceCreateIdss = new JArrayList<>(save.getNum()); Long loginId = AuthorizeUtils.getLoginId(Long.class); for (int i = 0; i < save.getNum(); i++) { String tail = null; if (deviceCreateIds != null) { String substring = String.valueOf(deviceCreateIds.getDeviceId()).substring(0, 4); if (substring.equals(yearMonth)) { tail = String.valueOf(deviceCreateIds.getDeviceId() + (i + 1)).substring(4); } } if (tail == null) { tail = String.valueOf((i + 1)); int i0 = 6 - tail.length(); for (int i1 = 0; i1 < i0; i1++) { tail = 0 + tail; } } Long deviceId = Long.valueOf(yearMonth + tail); DeviceCreateIds deviceCreateIdsInfo = copy(DeviceCreateIds.class, save) .setDeviceId(deviceId) .setCreateUserId(loginId) .setCreateTime(LocalDateTime.now()); deviceCreateIdss.add(deviceCreateIdsInfo); } JList> partition = deviceCreateIdss.partition(20); CountDownLatch latch = new CountDownLatch(partition.size()); for (JList createIds : partition) { executor.execute(() -> { try { saveBatch(createIds); } catch (Exception e) { log.error("", e); } finally { latch.countDown(); } }); } latch.await(); return R.ok(); } @PostMapping("page") @ApiOperation("分页查询") public R> page(@RequestBody DeviceCreateIdsDto.Page page) { PageBean pageBean = page.getPage(); LambdaQueryWrapper lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, DeviceCreateIds.class) .ge(DeviceCreateIds::getCreateTime, page.getBeginCreateTime()) .le(DeviceCreateIds::getCreateTime, page.getEndCreateTime()) .ge(DeviceCreateIds::getBindTime, page.getBeginBindTime()) .le(DeviceCreateIds::getBindTime, page.getEndBindTime()) .build() .orderByDesc(!Emptys.check(pageBean.getOrders()), DeviceCreateIds::getCreateTime); IPage iPage = page(toIPage(pageBean), lambdaQueryWrapper); IPage voIPage = PlusBeans.copy(DeviceCreateIdsDto.Vo.class, iPage); PageBean voPageBean = toPageBean(voIPage); List records = voPageBean.getRecords(); JList createUserIds = new JArrayList<>(records).getProperty(DeviceCreateIdsDto.Vo::getCreateUserId); List sysWorkVos = sysWorkUserService.list(new ListDto().setId(createUserIds)).getData(); JMap sysWorkVoJMap = new JArrayList<>(sysWorkVos).toMap(SysWorkVo::getId).cover(); records.forEach(vo -> { SysWorkVo sysWorkVo = sysWorkVoJMap.get(vo.getCreateUserId()); if (sysWorkVo == null) { return; } vo.setCreateUserName(sysWorkVo.getAccount()); }); return R.ok(voPageBean); } }