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);
}
}