package com.sinata.system.service.impl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.sinata.common.entity.PageDTO; import com.sinata.common.exception.ServiceException; import com.sinata.common.utils.CollUtils; import com.sinata.common.utils.StringUtils; import com.sinata.system.domain.MwBox; import com.sinata.system.domain.dto.MwBoxDTO; import com.sinata.system.domain.query.MwBoxPageQuery; import com.sinata.system.domain.vo.BoxStatisticsVO; import com.sinata.system.domain.vo.MwBoxVO; import com.sinata.system.enums.BoxProcessEnum; import com.sinata.system.enums.BoxStatusEnum; import com.sinata.system.mapper.MwBoxMapper; import com.sinata.system.service.MwBoxService; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** *

* 转运箱 服务实现类 *

* * @author mitao * @since 2024-12-02 */ @Service public class MwBoxServiceImpl extends ServiceImpl implements MwBoxService { /** * 转运箱数据统计 * * @return */ @Override public BoxStatisticsVO getBoxStatistics() { BoxStatisticsVO boxStatisticsVO = new BoxStatisticsVO(); List boxList = this.list(); if (CollUtils.isNotEmpty(boxList)) { boxStatisticsVO.setTotal(boxList.size()); boxStatisticsVO.setBrokenCount(boxList.stream().filter(box -> BoxStatusEnum.BROKEN.getCode().equals(box.getStatus())).count()); boxStatisticsVO.setLostCount(boxList.stream().filter(box -> BoxStatusEnum.LOST.getCode().equals(box.getStatus())).count()); boxStatisticsVO.setDisposeCount(boxList.stream().filter(box -> BoxProcessEnum.DISPOSAL.getCode().equals(box.getLink())).count()); boxStatisticsVO.setHospitalUsingCount(boxList.stream().filter(box -> BoxProcessEnum.HOSPITAL_USING.getCode().equals(box.getLink())).count()); boxStatisticsVO.setTransitingCount(boxList.stream().filter(box -> BoxProcessEnum.TRANSITING.getCode().equals(box.getLink())).count()); } return boxStatisticsVO; } /** * 转运箱分页列表 * * @param query * @return */ @Override public PageDTO pageList(MwBoxPageQuery query) { Page page = this.lambdaQuery() .between(StringUtils.isNotBlank(query.getBoxNumberStart()) && StringUtils.isNotBlank(query.getBoxNumberEnd()), MwBox::getBoxNumber, query.getBoxNumberStart(), query.getBoxNumberEnd()) .eq(Objects.nonNull(query.getStatus()), MwBox::getStatus, query.getStatus()) .eq(Objects.nonNull(query.getLink()), MwBox::getLink, query.getLink()) .between(Objects.nonNull(query.getLastUseTimeStart()) && Objects.nonNull(query.getLastUseTimeEnd()), MwBox::getLastUseTime, query.getLastUseTimeStart(), query.getLastUseTimeEnd()) .orderByDesc(MwBox::getCreateTime) .page(new Page<>(query.getPageCurr(), query.getPageSize())); return PageDTO.of(page, MwBoxVO.class); } /** * 新增转运箱 * * @param boxNumberStart * @param boxNumberEnd * @return */ @Override @Transactional(rollbackFor = Exception.class) public void add(String boxNumberStart, String boxNumberEnd) { //String regx = "\\d+"; //if (boxNumberStart.length() != 11 || boxNumberEnd.length() != 11 || !boxNumberStart.matches(regx) || !boxNumberEnd.matches(regx)) { // throw new ServiceException("请输入有效的11位数字编号!"); //} BigDecimal start = new BigDecimal(boxNumberStart); BigDecimal end = new BigDecimal(boxNumberEnd); if (start.compareTo(end) > 0) { throw new ServiceException("开始编号不能大于结束编号"); } List boxList = new ArrayList<>(); for (BigDecimal i = start; i.compareTo(end) <= 0; i = i.add(BigDecimal.ONE)) { MwBox mwBox = new MwBox(); // 每次生成编号时,确保其为11位 String formattedBoxNumber = String.format("%011d", i.longValue()); mwBox.setBoxNumber(formattedBoxNumber); mwBox.setStatus(BoxStatusEnum.NORMAL.getCode()); boxList.add(mwBox); } try { this.saveBatch(boxList); } catch (DuplicateKeyException e) { throw new ServiceException("转运箱编号重复"); } } /** * 编辑转运箱状态 * * @param dto * @return */ @Override @Transactional(rollbackFor = Exception.class) public void editBatch(MwBoxDTO dto) { List idList = dto.getIdList(); List boxList = idList.stream().map(id -> { MwBox mwBox = new MwBox(); mwBox.setId(id); mwBox.setStatus(dto.getStatus()); mwBox.setRemark(dto.getRemark()); return mwBox; }).collect(Collectors.toList()); this.updateBatchById(boxList); } }