package com.doumee.service.business.impl; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.Constants; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.Utils; import com.doumee.core.utils.redis.RedisUtil; import com.doumee.dao.business.YwStockMapper; import com.doumee.dao.business.YwStocktakingMapper; import com.doumee.dao.business.YwStocktakingRecordMapper; import com.doumee.dao.business.YwWarehouseMapper; import com.doumee.dao.business.model.*; import com.doumee.service.business.YwStocktakingService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** * 运维盘点信息表Service实现 * @author 江蹄蹄 * @date 2025/01/06 11:05 */ @Service public class YwStocktakingServiceImpl implements YwStocktakingService { @Autowired private YwStocktakingMapper ywStocktakingMapper; @Autowired private YwStockMapper ywStockMapper; @Autowired private YwStocktakingRecordMapper ywStocktakingRecordMapper; @Autowired private YwWarehouseMapper ywWarehouseMapper; @Autowired private RedisTemplate redisTemplate; @Override @Transactional(rollbackFor = {Exception.class,BusinessException.class}) public Integer create(YwStocktaking ywStocktaking) { if(Objects.isNull(ywStocktaking) || StringUtils.isBlank(ywStocktaking.getName()) || Objects.isNull(ywStocktaking.getPlanDate()) || Objects.isNull(ywStocktaking.getWarehouseId()) || Objects.isNull(ywStocktaking.getUserId()) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } YwWarehouse ywWarehouse = ywWarehouseMapper.selectById(ywStocktaking.getWarehouseId()); if(Objects.isNull(ywWarehouse)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到仓库数据"); } //判断当前仓库当前日期是否存在盘点单 if(ywStocktakingMapper.selectCount(new QueryWrapper().lambda().eq(YwStocktaking::getIsdeleted,Constants.ZERO).eq(YwStocktaking::getStatus,Constants.ZERO) .eq(YwStocktaking::getWarehouseId,ywStocktaking.getWarehouseId()).apply(" DATE(PLAN_DATE) = '" + DateUtil.formatDate(ywStocktaking.getPlanDate(),"yyyy-MM-dd") +"'" ))>0){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"["+DateUtil.formatDate(ywStocktaking.getPlanDate(),"yyyy-MM-dd")+"]["+ywWarehouse.getName()+"]已有盘点单,不可重复发起盘点"); } LoginUserInfo loginUserInfo = ywStocktaking.getLoginUserInfo(); ywStocktaking.setCreator(loginUserInfo.getId()); ywStocktaking.setCreateDate(new Date()); ywStocktaking.setIsdeleted(Constants.ZERO); ywStocktaking.setStatus(Constants.ZERO); ywStocktaking.setCode(getNextCode()); ywStocktakingMapper.insert(ywStocktaking); return ywStocktaking.getId(); } @Override @Transactional(rollbackFor = {Exception.class,BusinessException.class}) public void deleteById(Integer id, LoginUserInfo loginUserInfo) { YwStocktaking model = ywStocktakingMapper.selectById(id); if(Objects.isNull(model)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到盘点单数据"); } if(Constants.equalsInteger(model.getStatus(),Constants.ZERO)||Constants.equalsInteger(model.getStatus(),Constants.THREE)){ ywStocktakingMapper.update(new UpdateWrapper().lambda() .set(YwStocktaking::getIsdeleted,Constants.ONE) .set(YwStocktaking::getEditDate,DateUtil.getCurrDateTime()) .set(YwStocktaking::getEditor,loginUserInfo.getId()) .eq(YwStocktaking::getId,id) ); }else{ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"盘点单状态已流转,无法进行该操作"); } } @Override @Transactional(rollbackFor = {Exception.class,BusinessException.class}) public void cancelById(Integer id, LoginUserInfo loginUserInfo) { YwStocktaking model = ywStocktakingMapper.selectById(id); if(Objects.isNull(model)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到盘点单数据"); } if(Constants.equalsInteger(model.getStatus(),Constants.ZERO)||Constants.equalsInteger(model.getStatus(),Constants.ONE)){ ywStocktakingMapper.update(new UpdateWrapper().lambda() .set(YwStocktaking::getEditDate,DateUtil.getCurrDateTime()) .set(YwStocktaking::getCancelDate,DateUtil.getCurrDateTime()) .set(YwStocktaking::getCancelUserId,loginUserInfo.getId()) .set(YwStocktaking::getEditor,loginUserInfo.getId()) .set(YwStocktaking::getStatus,Constants.THREE).eq(YwStocktaking::getId,id)); }else{ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"盘点单状态已流转,无法进行该操作"); } } @Override @Transactional(rollbackFor = {Exception.class,BusinessException.class}) public void beginById(Integer id, LoginUserInfo loginUserInfo) { YwStocktaking model = ywStocktakingMapper.selectById(id); if(Objects.isNull(model)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到盘点单数据"); } if(model.getPlanDate().getTime()().lambda() .set(YwStocktaking::getEditDate,DateUtil.getCurrDateTime()) .set(YwStocktaking::getDealDate,DateUtil.getCurrDateTime()) .set(YwStocktaking::getDealUserId,loginUserInfo.getId()) .set(YwStocktaking::getEditor,loginUserInfo.getId()) .set(YwStocktaking::getStatus,Constants.ONE) .eq(YwStocktaking::getId,model.getId())); //生成当前仓库下所有的资产信息 List stockList = ywStockMapper.selectList(new QueryWrapper().lambda().eq(YwStock::getIsdeleted,Constants.ZERO).eq(YwStock::getWarehouseId,model.getWarehouseId())); if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(stockList)){ List ywStocktakingRecordList = new ArrayList<>(); for (YwStock ywStock:stockList) { YwStocktakingRecord ywStocktakingRecord = new YwStocktakingRecord(); ywStocktakingRecord.setCreator(loginUserInfo.getId()); ywStocktakingRecord.setCreateDate(new Date()); ywStocktakingRecord.setIsdeleted(Constants.ZERO); ywStocktakingRecord.setStatus(Constants.ZERO); ywStocktakingRecord.setMaterialId(ywStock.getMaterialId()); ywStocktakingRecord.setStock(ywStock.getStock()); ywStocktakingRecord.setStocktakingId(model.getId()); ywStocktakingRecordList.add(ywStocktakingRecord); } ywStocktakingRecordMapper.insert(ywStocktakingRecordList); } }else{ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"盘点单状态已流转,无法进行该操作"); } } @Override @Transactional(rollbackFor = {Exception.class,BusinessException.class}) public void finishById(Integer id, LoginUserInfo loginUserInfo) { YwStocktaking model = ywStocktakingMapper.selectById(id); if(Objects.isNull(model)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到盘点单数据"); } if(!Constants.equalsInteger(model.getStatus(),Constants.ONE)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"盘点单状态已流转,无法进行该操作!"); } if(!Constants.equalsInteger(loginUserInfo.getId(),model.getUserId())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"非您的盘点单无法进行操作"); } List recordList = ywStocktakingRecordMapper.selectList(new QueryWrapper().lambda() .eq(YwStocktakingRecord::getStocktakingId,id).eq(YwStocktakingRecord::getIsdeleted,Constants.ZERO)); for (YwStocktakingRecord ywStocktakingRecord:recordList) { //提交时 未进行盘点的明细数据 if(Constants.equalsInteger(ywStocktakingRecord.getStatus(),Constants.ZERO)){ ywStocktakingRecordMapper.update(new UpdateWrapper().lambda() .set(YwStocktakingRecord::getStatus,Constants.TWO) .set(YwStocktakingRecord::getUserId,loginUserInfo.getId()) .eq(YwStocktakingRecord::getId,ywStocktakingRecord.getId()) ); } //查询库存信息 进行库存更新 YwStock ywStock = ywStockMapper.selectOne(new QueryWrapper().lambda().eq(YwStock::getMaterialId,ywStocktakingRecord.getMaterialId()) .eq(YwStock::getWarehouseId,model.getWarehouseId()).eq(YwStock::getStock,ywStocktakingRecord.getStock())); if(Objects.isNull(ywStock)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"库存信息异常,请联系管理员"); } if(ywStocktakingRecord.getActStock().compareTo(BigDecimal.ZERO)==Constants.ZERO){ ywStockMapper.deleteById(ywStock.getId()); }else { ywStockMapper.update(new UpdateWrapper().lambda().set(YwStock::getStock,ywStocktakingRecord.getActStock()).eq(YwStock::getId,ywStock.getId())); } } ywStocktakingMapper.update(new UpdateWrapper().lambda() .set(YwStocktaking::getEditDate,DateUtil.getCurrDateTime()) .set(YwStocktaking::getDoneDate,DateUtil.getCurrDateTime()) .set(YwStocktaking::getDoneUserId,loginUserInfo.getId()) .set(YwStocktaking::getEditor,loginUserInfo.getId()) .set(YwStocktaking::getStatus,Constants.TWO) .eq(YwStocktaking::getId,model.getId())); } @Override public void delete(YwStocktaking ywStocktaking) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(ywStocktaking); ywStocktakingMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } ywStocktakingMapper.deleteBatchIds(ids); } @Override public void updateById(YwStocktaking ywStocktaking) { if(Objects.isNull(ywStocktaking) || StringUtils.isBlank(ywStocktaking.getName()) || Objects.isNull(ywStocktaking.getId()) || Objects.isNull(ywStocktaking.getPlanDate()) || Objects.isNull(ywStocktaking.getWarehouseId()) || Objects.isNull(ywStocktaking.getUserId()) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } YwStocktaking model = ywStocktakingMapper.selectById(ywStocktaking.getId()); if(Objects.isNull(model)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到盘点单数据"); } YwWarehouse ywWarehouse = ywWarehouseMapper.selectById(ywStocktaking.getWarehouseId()); if(Objects.isNull(ywWarehouse)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到仓库数据"); } //判断当前仓库当前日期是否存在盘点单 if(ywStocktakingMapper.selectCount(new QueryWrapper().lambda().ne(YwStocktaking::getId,ywStocktaking.getId()).eq(YwStocktaking::getIsdeleted,Constants.ZERO).eq(YwStocktaking::getStatus,Constants.ZERO) .eq(YwStocktaking::getWarehouseId,ywStocktaking.getWarehouseId()).apply(" DATE(PLAN_DATE) = '" + DateUtil.formatDate(ywStocktaking.getPlanDate(),"yyyy-MM-dd") +"'" ))>0){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"["+DateUtil.formatDate(ywStocktaking.getPlanDate(),"yyyy-MM-dd")+"]["+ywWarehouse.getName()+"]已有盘点单,不可重复发起盘点"); } LoginUserInfo loginUserInfo = ywStocktaking.getLoginUserInfo(); ywStocktaking.setEditor(loginUserInfo.getId()); ywStocktaking.setEditDate(new Date()); ywStocktaking.setCode(null); ywStocktakingMapper.updateById(ywStocktaking); } @Override public void updateByIdInBatch(List ywStocktakings) { if (CollectionUtils.isEmpty(ywStocktakings)) { return; } for (YwStocktaking ywStocktaking: ywStocktakings) { this.updateById(ywStocktaking); } } @Override public YwStocktaking findById(Integer id) { return ywStocktakingMapper.selectById(id); } @Override public YwStocktaking getDetail(Integer id) { MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.selectAll(YwStocktaking.class) .select(" s.name ", YwStocktaking::getUserName) .select(" s1.name ",YwStocktaking::getCreateName) .selectAs(YwWarehouse::getName,YwStocktaking::getWarehouseName) .leftJoin(YwWarehouse.class,YwWarehouse::getId,YwStocktaking::getWarehouseId) .leftJoin("system_user s on t.user_id = s.id") .leftJoin("system_user s1 on t.creator = s1.id") .eq(YwStocktaking::getId,id) .last("limit 1"); YwStocktaking ywStocktaking = ywStocktakingMapper.selectOne(queryWrapper); List recordList = ywStocktakingRecordMapper.selectList(new QueryWrapper().lambda().eq(YwStocktakingRecord::getStocktakingId,id).eq(YwStocktakingRecord::getIsdeleted,Constants.ZERO)); if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(recordList)){ //合计盘点数据 ywStocktaking.setFinishAmount(recordList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ONE)).collect(Collectors.toList()).size()); ywStocktaking.setUnFinishAmount(recordList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ZERO)).collect(Collectors.toList()).size()); ywStocktaking.setEqualAmount(recordList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ONE)&&Constants.equalsInteger(i.getType(),Constants.ZERO)).collect(Collectors.toList()).size()); ywStocktaking.setLossAmount(recordList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ONE)&&Constants.equalsInteger(i.getType(),Constants.ONE)).collect(Collectors.toList()).size()); ywStocktaking.setProfitAmount(recordList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ONE)&&Constants.equalsInteger(i.getType(),Constants.TWO)).collect(Collectors.toList()).size()); } return ywStocktaking; } @Override public YwStocktaking findOne(YwStocktaking ywStocktaking) { QueryWrapper wrapper = new QueryWrapper<>(ywStocktaking); return ywStocktakingMapper.selectOne(wrapper); } @Override public List findList(YwStocktaking ywStocktaking) { QueryWrapper wrapper = new QueryWrapper<>(ywStocktaking); return ywStocktakingMapper.selectList(wrapper); } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); YwStocktaking model = pageWrap.getModel(); queryWrapper.selectAll(YwStocktaking.class) .select(" s.name ", YwStocktaking::getUserName) .select(" s1.name ",YwStocktaking::getCreateName) .selectAs(YwWarehouse::getName,YwStocktaking::getWarehouseName) .leftJoin(YwWarehouse.class,YwWarehouse::getId,YwStocktaking::getWarehouseId) .leftJoin("system_user s on t.user_id = s.id") .leftJoin("system_user s1 on t.creator = s1.id") .eq(YwStocktaking::getIsdeleted,Constants.ZERO) .like(StringUtils.isNotBlank(model.getName()),YwStocktaking::getName,model.getName()) .eq(Objects.nonNull(model.getStatus()),YwStocktaking::getStatus,model.getStatus()) .orderByAsc(YwStocktaking::getStatus) .orderByDesc(YwStocktaking::getPlanDate) ; IPage iPage = ywStocktakingMapper.selectJoinPage(page, YwStocktaking.class,queryWrapper); return PageData.from(iPage); } @Override public long count(YwStocktaking ywStocktaking) { QueryWrapper wrapper = new QueryWrapper<>(ywStocktaking); return ywStocktakingMapper.selectCount(wrapper); } public synchronized String getNextCode(){ String prefix = "PD-" + DateUtil.getDate(new Date(),"yyyyMMdd") +"-"; Integer countNum = RedisUtil.getObject(redisTemplate, Constants.RedisKeys.COM_OUTBOUND_TAKING_KEY, Integer.class); countNum = Constants.formatIntegerNum(countNum)+1; //更新缓存 RedisUtil.addObject(redisTemplate, Constants.RedisKeys.COM_OUTBOUND_TAKING_KEY,countNum); String nextIndex =Integer.toString( countNum ); return prefix + org.apache.commons.lang3.StringUtils.leftPad(nextIndex,4,"0"); } }