package doumeemes.service.business.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import doumeemes.core.constants.ResponseStatus; import doumeemes.core.exception.BusinessException; import doumeemes.core.model.ApiResponse; import doumeemes.core.model.LoginUserInfo; import doumeemes.core.model.PageData; import doumeemes.core.model.PageWrap; import doumeemes.core.utils.Constants; import doumeemes.core.utils.Utils; import doumeemes.dao.business.BomDetailMapper; import doumeemes.dao.business.BomMapper; import doumeemes.dao.business.BomVersionMapper; import doumeemes.dao.business.MaterialMapper; import doumeemes.dao.business.model.Bom; import doumeemes.dao.business.model.BomDetail; import doumeemes.dao.business.model.BomVersion; import doumeemes.dao.business.model.Material; import doumeemes.dao.ext.BomExtMapper; import doumeemes.dao.ext.MaterialDistributeExtMapper; import doumeemes.dao.ext.bean.BomBean; import doumeemes.dao.ext.bean.BomDetailBean; import doumeemes.dao.ext.vo.BomExtListVO; import doumeemes.service.business.BomService; 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 io.swagger.annotations.Api; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.xpath.operations.Bool; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.Objects; /** * 物料清单信息表Service实现 * @author 江蹄蹄 * @date 2022/04/20 09:33 */ @Service public class BomServiceImpl implements BomService { @Autowired private BomMapper bomMapper; @Autowired private BomDetailMapper bomDetailMapper; @Autowired private BomVersionMapper bomVersionMapper; @Autowired private MaterialMapper materialMapper; @Autowired private MaterialDistributeExtMapper materialDistributeExtMapper; @Autowired private BomExtMapper bomExtMapper; @Override public Integer create(Bom bom) { bomMapper.insert(bom); return bom.getId(); } @Override public void deleteById(Integer id) { bomMapper.deleteById(id); } @Override public void delete(Bom bom) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(bom); bomMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } bomMapper.deleteBatchIds(ids); } @Override public void updateById(Bom bom) { bomMapper.updateById(bom); } @Override public void updateByIdInBatch(List boms) { if (CollectionUtils.isEmpty(boms)) { return; } for (Bom bom: boms) { this.updateById(bom); } } @Override public Bom findById(Integer id) { return bomMapper.selectById(id); } @Override public Bom findOne(Bom bom) { QueryWrapper wrapper = new QueryWrapper<>(bom); return bomMapper.selectOne(wrapper); } @Override public List findList(Bom bom) { QueryWrapper wrapper = new QueryWrapper<>(bom); return bomMapper.selectList(wrapper); } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); QueryWrapper queryWrapper = new QueryWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); if (pageWrap.getModel().getId() != null) { queryWrapper.lambda().eq(Bom::getId, pageWrap.getModel().getId()); } if (pageWrap.getModel().getDeleted() != null) { queryWrapper.lambda().eq(Bom::getDeleted, pageWrap.getModel().getDeleted()); } if (pageWrap.getModel().getCreateUser() != null) { queryWrapper.lambda().eq(Bom::getCreateUser, pageWrap.getModel().getCreateUser()); } if (pageWrap.getModel().getCreateTime() != null) { queryWrapper.lambda().ge(Bom::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime())); queryWrapper.lambda().le(Bom::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime())); } if (pageWrap.getModel().getUpdateUser() != null) { queryWrapper.lambda().eq(Bom::getUpdateUser, pageWrap.getModel().getUpdateUser()); } if (pageWrap.getModel().getUpdateTime() != null) { queryWrapper.lambda().ge(Bom::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime())); queryWrapper.lambda().le(Bom::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime())); } if (pageWrap.getModel().getRemark() != null) { queryWrapper.lambda().eq(Bom::getRemark, pageWrap.getModel().getRemark()); } if (pageWrap.getModel().getRootDepartId() != null) { queryWrapper.lambda().eq(Bom::getRootDepartId, pageWrap.getModel().getRootDepartId()); } if (pageWrap.getModel().getDepartId() != null) { queryWrapper.lambda().eq(Bom::getDepartId, pageWrap.getModel().getDepartId()); } if (pageWrap.getModel().getMaterialId() != null) { queryWrapper.lambda().eq(Bom::getMaterialId, pageWrap.getModel().getMaterialId()); } if (pageWrap.getModel().getVersion() != null) { queryWrapper.lambda().eq(Bom::getVersion, pageWrap.getModel().getVersion()); } if (pageWrap.getModel().getUnitId() != null) { queryWrapper.lambda().eq(Bom::getUnitId, pageWrap.getModel().getUnitId()); } if (pageWrap.getModel().getRouteId() != null) { queryWrapper.lambda().eq(Bom::getRouteId, pageWrap.getModel().getRouteId()); } if (pageWrap.getModel().getStatus() != null) { queryWrapper.lambda().eq(Bom::getStatus, pageWrap.getModel().getStatus()); } if (pageWrap.getModel().getValidTime() != null) { queryWrapper.lambda().ge(Bom::getValidTime, Utils.Date.getStart(pageWrap.getModel().getValidTime())); queryWrapper.lambda().le(Bom::getValidTime, Utils.Date.getEnd(pageWrap.getModel().getValidTime())); } if (pageWrap.getModel().getInvalidTime() != null) { queryWrapper.lambda().ge(Bom::getInvalidTime, Utils.Date.getStart(pageWrap.getModel().getInvalidTime())); queryWrapper.lambda().le(Bom::getInvalidTime, Utils.Date.getEnd(pageWrap.getModel().getInvalidTime())); } for(PageWrap.SortData sortData: pageWrap.getSorts()) { if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { queryWrapper.orderByDesc(sortData.getProperty()); } else { queryWrapper.orderByAsc(sortData.getProperty()); } } return PageData.from(bomMapper.selectPage(page, queryWrapper)); } @Override public long count(Bom bom) { QueryWrapper wrapper = new QueryWrapper<>(bom); return bomMapper.selectCount(wrapper); } @Override @Transactional public ApiResponse saveBean(BomBean bomBean,LoginUserInfo loginUserInfo){ Bom bom = new Bom(); BigDecimal bomVersionNum = BigDecimal.ONE.setScale(Constants.TWO); if(Objects.isNull(materialDistributeExtMapper.selectById(bomBean.getMaterialId()))){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "未查询到物料分配信息"); }; if(null == bomBean.getId() || bomBean.getId() == Constants.ONE){ //查询物料是否已创建bom // if(bomExtMapper.selectCount(new QueryWrapper() // .eq("material_id",bomBean.getMaterialId()))>0){ // throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "当前物料已存在BOM信息,无法再次建立"); // }; if(bomExtMapper.checkIsHave(bomBean.getMaterialId(),bomBean.getRouteId())>0){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "当前物料于当前工厂下已存在BOM信息,无法再次建立"); } bom = bomBean.toBom(bom); bom.setVersion(bomVersionNum.toString()); bom.setCreateTime(new Date()); bom.setCreateUser(loginUserInfo.getId()); bom.setRootDepartId(loginUserInfo.getRootDepartment().getId()); bom.setDepartId(loginUserInfo.getCurComDepartment().getId()); bomMapper.insert(bom); }else{ Bom dbBom = bomMapper.selectById(bomBean.getId()); if(2 == dbBom.getStatus()){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "已禁用失效,无法编辑保存"); } if(0 != dbBom.getStatus()){ bomVersionNum = new BigDecimal(dbBom.getVersion()).add(BigDecimal.valueOf(0.1)).setScale(2); }else{ BomVersion dbBomVersion = bomVersionMapper.selectOne(new QueryWrapper().eq("BOM_ID",bomBean.getId())); bomDetailMapper.delete(new QueryWrapper().eq("BOM_ID",dbBomVersion.getId())); bomVersionMapper.deleteById(dbBomVersion.getId()); } bom = bomBean.toBom(dbBom); bom.setVersion(bomVersionNum.toString()); bom.setUpdateTime(new Date()); bom.setUpdateUser(loginUserInfo.getId()); bomMapper.updateById(bom); } BomVersion bomVersion = JSON.parseObject(JSONObject.toJSON(bomBean).toString(), BomVersion.class); bomVersion.setId(null); bomVersion.setBomId(bom.getId()); bomVersion.setVersion(bomVersionNum.toString()); bomVersion.setRootDepartId(loginUserInfo.getRootDepartment().getId()); bomVersion.setDepartId(bom.getDepartId()); bomVersionMapper.insert(bomVersion); //失效历史版本数据 BomVersion updBomVersion = new BomVersion(); updBomVersion.setStatus(2); updBomVersion.setValidTime(new Date()); bomVersionMapper.update(updBomVersion,new UpdateWrapper() .eq("BOM_ID",bomVersion.getBomId()) .ne("id",bomVersion.getId()) ); saveBomDetail(bomBean.toBomDetail(),bomVersion.getId()); return ApiResponse.success(bom); } @Override @Transactional public ApiResponse openOrClose(Integer id,Integer optType){ Bom bom = bomMapper.selectById(id); if(Objects.isNull(bom)){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "未查询到对象信息"); } if( 1 == optType){ if(1 == bom.getStatus()){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "已启用生效,请勿重复操作"); }else if(2 == bom.getStatus()){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "已禁用失效,无法启用"); }else{ bom.setValidTime(new Date()); } }else if(2 == optType){ //查询当前记录下是否存在被占用的物料 List materialList = materialMapper.selectList( new QueryWrapper() .eq("id", bom.getMaterialId()) .apply(" id in ( select b2.MATERIAL_ID from bom_version b1 inner join bom_detail b2 on b1.id = b2.bom_id where b1.`STATUS` = 1 ) ") ); if(materialList.size()>0){ StringBuffer useName = new StringBuffer(); for (Material material:materialList) { useName.append(","+material.getName()); } throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "物料使用中,无法禁用失效,占用者:"+ useName.toString().substring(Constants.ONE,useName.length())); } if(0 == bom.getStatus()){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "未启用生效,无法禁用失效"); }else if(2 == bom.getStatus()){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "已禁用失效,请勿重复操作"); }else{ bom.setInvalidTime(new Date()); } } bom.setStatus(optType); bomMapper.updateById(bom); BomVersion bomVersion = new BomVersion(); bomVersion.setStatus(optType); bomVersion.setValidTime(bom.getValidTime()); bomVersion.setInvalidTime(bom.getInvalidTime()); bomVersionMapper.update(bomVersion,new UpdateWrapper().eq("BOM_ID",id)); return ApiResponse.success(bom); } public void saveBomDetail(List bomDetailList,Integer parentId){ bomDetailList.forEach(i->{ i.setBomId(parentId); bomDetailMapper.insert(i); }); } }