package doumeemes.service.business.impl; import com.baomidou.mybatisplus.extension.api.R; import doumeemes.biz.system.SystemDictBiz; 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.DateUtil; import doumeemes.core.utils.Utils; import doumeemes.core.utils.excel.EasyExcelUtil; import doumeemes.core.utils.redis.RedisUtil; import doumeemes.dao.business.*; import doumeemes.dao.business.model.*; import doumeemes.dao.ext.dto.DeviceImportDTO; import doumeemes.dao.ext.dto.QueryDeviceExtDTO; import doumeemes.dao.ext.vo.DeviceExtListVO; import doumeemes.dao.system.SystemDictDataMapper; import doumeemes.dao.system.model.SystemDictData; import doumeemes.service.business.DeviceService; 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 doumeemes.service.ext.DeviceExtService; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; 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 org.springframework.web.multipart.MultipartFile; import java.util.*; import java.util.stream.Collectors; /** * 生产设备信息表Service实现 * @author 江蹄蹄 * @date 2022/04/20 09:34 */ @Service public class DeviceServiceImpl implements DeviceService { @Autowired private DeviceMapper deviceMapper; @Autowired private CompanyUserServiceImpl companyUserService; @Autowired private RedisTemplate redisTemplate; @Autowired private DeviceExtService deviceExtService; @Autowired private UserDeviceMapper userDeviceMapper; @Autowired private DepartmentMapper departmentMapper; @Autowired private ProceduresMapper proceduresMapper; @Autowired private WarehouseLocationMapper warehouseLocationMapper; @Autowired private WarehouseMapper warehouseMapper; @Autowired private SystemDictDataMapper systemDictDataMapper; @Override public Integer create(Device device) { deviceMapper.insert(device); return device.getId(); } @Override public void deleteById(Integer id) { deviceMapper.deleteById(id); } @Override public void delete(Device device) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(device); deviceMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } deviceMapper.deleteBatchIds(ids); } @Override public void updateById(Device device) { deviceMapper.updateById(device); } @Override public void updateByIdInBatch(List devices) { if (CollectionUtils.isEmpty(devices)) { return; } for (Device device: devices) { this.updateById(device); } } @Override public Device findById(Integer id) { return deviceMapper.selectById(id); } @Override public Device findOne(Device device) { QueryWrapper wrapper = new QueryWrapper<>(device); return deviceMapper.selectOne(wrapper.last("limit 1")); } @Override public List findList(Device device) { QueryWrapper wrapper = new QueryWrapper<>(device); return deviceMapper.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(Device::getId, pageWrap.getModel().getId()); } if (pageWrap.getModel().getDeleted() != null) { queryWrapper.lambda().eq(Device::getDeleted, pageWrap.getModel().getDeleted()); } if (pageWrap.getModel().getCreateUser() != null) { queryWrapper.lambda().eq(Device::getCreateUser, pageWrap.getModel().getCreateUser()); } if (pageWrap.getModel().getCreateTime() != null) { queryWrapper.lambda().ge(Device::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime())); queryWrapper.lambda().le(Device::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime())); } if (pageWrap.getModel().getUpdateUser() != null) { queryWrapper.lambda().eq(Device::getUpdateUser, pageWrap.getModel().getUpdateUser()); } if (pageWrap.getModel().getUpdateTime() != null) { queryWrapper.lambda().ge(Device::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime())); queryWrapper.lambda().le(Device::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime())); } if (pageWrap.getModel().getRemark() != null) { queryWrapper.lambda().eq(Device::getRemark, pageWrap.getModel().getRemark()); } if (pageWrap.getModel().getRootDepartId() != null) { queryWrapper.lambda().eq(Device::getRootDepartId, pageWrap.getModel().getRootDepartId()); } if (pageWrap.getModel().getDepartId() != null) { queryWrapper.lambda().eq(Device::getDepartId, pageWrap.getModel().getDepartId()); } if (pageWrap.getModel().getProcedureId() != null) { queryWrapper.lambda().eq(Device::getProcedureId, pageWrap.getModel().getProcedureId()); } if (pageWrap.getModel().getCode() != null) { queryWrapper.lambda().eq(Device::getCode, pageWrap.getModel().getCode()); } if (pageWrap.getModel().getType() != null) { queryWrapper.lambda().eq(Device::getType, pageWrap.getModel().getType()); } if (pageWrap.getModel().getName() != null) { queryWrapper.lambda().eq(Device::getName, pageWrap.getModel().getName()); } if (pageWrap.getModel().getModel() != null) { queryWrapper.lambda().eq(Device::getModel, pageWrap.getModel().getModel()); } if (pageWrap.getModel().getStatus() != null) { queryWrapper.lambda().eq(Device::getStatus, pageWrap.getModel().getStatus()); } if (pageWrap.getModel().getSupplier() != null) { queryWrapper.lambda().eq(Device::getSupplier, pageWrap.getModel().getSupplier()); } if (pageWrap.getModel().getStationCode() != null) { queryWrapper.lambda().eq(Device::getStationCode, pageWrap.getModel().getStationCode()); } if (pageWrap.getModel().getGroupId() != null) { queryWrapper.lambda().eq(Device::getGroupId, pageWrap.getModel().getGroupId()); } if (pageWrap.getModel().getSerialNum() != null) { queryWrapper.lambda().eq(Device::getSerialNum, pageWrap.getModel().getSerialNum()); } for(PageWrap.SortData sortData: pageWrap.getSorts()) { if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { queryWrapper.orderByDesc(sortData.getProperty()); } else { queryWrapper.orderByAsc(sortData.getProperty()); } } return PageData.from(deviceMapper.selectPage(page, queryWrapper)); } @Override public long count(Device device) { QueryWrapper wrapper = new QueryWrapper<>(device); return deviceMapper.selectCount(wrapper); } @Override public ApiResponse insert(Device device) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(StringUtils.isBlank(device.getCode())){ device.setCode(this.getNextCode(user.getCompany().getId())); } if(device.getType()==Constants.ONE){ //设备组 Device groupdata= this.findById(device.getGroupId()); if(groupdata!=null&&groupdata.getFinishWarehouseLocationId()!=null&&!Constants.equalsInteger(groupdata.getFinishWarehouseLocationId(),device.getFinishWarehouseLocationId())){ return ApiResponse.failed("所属设备组的生产货位关联错误!"); } if(groupdata!=null&&groupdata.getProduceWarehouseLocationId()!=null&&!Constants.equalsInteger(groupdata.getProduceWarehouseLocationId(),device.getProduceWarehouseLocationId())){ return ApiResponse.failed("所属设备组的已完工货位关联错误!"); } } Device queryDeviceExtDTO=new Device(); queryDeviceExtDTO.setDeleted(Constants.ZERO); queryDeviceExtDTO.setCode(device.getCode()); queryDeviceExtDTO.setRootDepartId(user.getRootDepartment().getId()); List list= this.findList(queryDeviceExtDTO); /* QueryDeviceExtDTO queryDeviceExtDTO1=new QueryDeviceExtDTO(); queryDeviceExtDTO1.setDeleted(Constants.ZERO); queryDeviceExtDTO1.setName(device.getName()); queryDeviceExtDTO1.setRootDepartId(user.getRootDepartment().getId()); List list1= deviceExtService.getListByCondition(queryDeviceExtDTO1);*/ if(list.size()>0){ return ApiResponse.failed("设备编码已存在,不允许添加"); } device.setDeleted(Constants.ZERO); device.setCreateTime(new Date()); device.setCreateUser(user.getId()); device.setRootDepartId(user.getRootDepartment().getId()); device.setDepartId(user.getCurComDepartment().getId()); device.setStatus(Constants.ZERO); deviceMapper.insert(device); if(StringUtils.isNotBlank(device.getUserIds())){ this.dealDeviceUserId(Constants.ZERO,device.getUserIds(),device.getId(),user); } return ApiResponse.success(null); } @Override public void dealDeviceUserId(Integer type,String userIds,Integer deviceId,LoginUserInfo userInfo){ if(type.equals(Constants.ONE)){ userDeviceMapper.delete(new QueryWrapper().eq("DEVICE_ID",deviceId)); } if(StringUtils.isNotEmpty(userIds)){ String [] ids=userIds.replace(" ","").split("[.,;,]"); for (String id : ids) { CompanyUser companyUser = companyUserService.findById(Integer.valueOf(id)); UserDevice userDevice = new UserDevice(); userDevice.setCompanyUserId(companyUser.getId()); userDevice.setUserId(companyUser.getUserId()); userDevice.setCreateTime(new Date()); userDevice.setCreateUser(userInfo.getId()); userDevice.setDeleted(Constants.ZERO); userDevice.setDeviceId(deviceId); userDevice.setDeviceDate(new Date()); userDeviceMapper.insert(userDevice); } } } @Transactional(rollbackFor = {Exception.class, BusinessException.class}) @Override public void importPlans(MultipartFile file) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } //解析excel List plansList = EasyExcelUtil.importExcel(file, 1, 1, DeviceImportDTO.class); if(plansList == null || plansList.size()==0){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "导入数据内容有误!"); } List departName = new ArrayList<>(); List procedureName = new ArrayList<>(); int num =0; for(DeviceImportDTO s : plansList){ if (StringUtils.isBlank(s.getDeviceName()) || s.getDeviceName().length() > 50 || StringUtils.isBlank(s.getDepartName()) || StringUtils.isBlank(s.getProcedureName()) || StringUtils.isBlank(s.getProduceWarehouseLocationName()) || StringUtils.isBlank(s.getFinishWarehouseLocationName())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"导入数据内容有误"); } if(isRepeatCode(s,num,plansList)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"文档中设备号【"+s.getDeviceCode()+"】重复!"); } departName.add(s.getDepartName()); procedureName.add(s.getProcedureName()); num++; } plansList.forEach(s->{ QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() .eq(Department::getRootId,user.getRootDepartment().getId()) .eq(Department::getName,s.getDepartName()) .last("limit 1"); Department department = departmentMapper.selectOne(wrapper); if(Objects.isNull(department)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"工厂名称不存在"); } QueryWrapper proceduresQuery = new QueryWrapper<>(); proceduresQuery.lambda() .eq(Procedures::getRootDepartId,user.getRootDepartment().getId()) .eq(Procedures::getOrgId,department.getId()) .eq(Procedures::getName,s.getProcedureName()); Procedures procedures = proceduresMapper.selectOne(proceduresQuery); if(Objects.isNull(procedures)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"工序名称不存在"); } // QueryDeviceExtDTO queryDeviceExtDTO=new QueryDeviceExtDTO(); // queryDeviceExtDTO.setDeleted(Constants.ZERO); // queryDeviceExtDTO.setCode(s.getDeviceCode()); // queryDeviceExtDTO.setRootDepartId(user.getRootDepartment().getId()); // List list= deviceExtService.getListByCondition(queryDeviceExtDTO); // if(list.size() > 0){ // throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"设备编码不存在"); // } QueryWrapper warehouseLocationQuery = new QueryWrapper<>(); warehouseLocationQuery.lambda() .eq(WarehouseLocation::getRootDepartId,department.getRootId()) .eq(WarehouseLocation::getUnionName ,s.getProduceWarehouseLocationName()).last("limit 1"); WarehouseLocation warehouseLocation = warehouseLocationMapper.selectOne(warehouseLocationQuery); if (Objects.isNull(warehouseLocation)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"待生产货位不存在"); } QueryWrapper systemDictDataQuery = new QueryWrapper<>(); systemDictDataQuery.lambda() .eq(SystemDictData::getDictId,3) .eq(SystemDictData::getCode,"混合"); SystemDictData systemDictData = systemDictDataMapper.selectOne(systemDictDataQuery); warehouseLocationQuery.clear(); warehouseLocationQuery.lambda() .eq(WarehouseLocation::getRootDepartId,department.getRootId()) .eq(WarehouseLocation::getSystemDicDataId,systemDictData.getId()) .eq(WarehouseLocation::getUnionName,s.getFinishWarehouseLocationName()).last("limit 1"); WarehouseLocation finishWarehouseLocations = warehouseLocationMapper.selectOne(warehouseLocationQuery); if (Objects.isNull(finishWarehouseLocations)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"已完工货位不是混合属性"); } Map collect =new HashMap<>(); collect.put(warehouseLocation.getUnionName(),warehouseLocation); collect.put(finishWarehouseLocations.getUnionName(),finishWarehouseLocations); Device device = new Device(); device.setDeleted(Constants.ZERO); device.setCreateUser(user.getId()); device.setCreateTime(new Date()); device.setUpdateUser(user.getId()); device.setUpdateTime(new Date()); // device.setRemark(); device.setRootDepartId(user.getRootDepartment().getId()); device.setDepartId(user.getCurComDepartment().getId()); device.setProcedureId(procedures.getId()); device.setCode(StringUtils.isNotBlank(s.getDeviceCode()) ? s.getDeviceCode() : this.getNextCode(user.getCompany().getId())); Device ttt=new Device(); ttt.setDeleted(Constants.ZERO); ttt.setCode(device.getCode()); ttt.setRootDepartId(user.getRootDepartment().getId()); if(findOne(ttt) !=null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"设备编码【"+device.getCode()+"重复】,不允许添加"); } if(StringUtils.isNotBlank(s.getType()) && StringUtils.equals("设备组",s.getType())){ device.setType(0); }else{ device.setType(1); } // device.setType(StringUtils.isNotBlank(device.getCode()) ? device.getCode().trim().equals("设备") ? 1 : 0 : 1); device.setName(s.getDeviceName()); device.setModel(s.getModel()); device.setStatus(Constants.ZERO); device.setStationCode(s.getStationCode()); device.setProduceWarehouseLocationId(Optional.ofNullable(collect.get(s.getProduceWarehouseLocationName())).map(m->m.getId()).orElseThrow(null)); device.setFinishWarehouseLocationId(Optional.ofNullable(collect.get(s.getFinishWarehouseLocationName())).map(m->m.getId()).orElseThrow(null)); deviceMapper.insert(device); if(StringUtils.isNotBlank(s.getUserIds())){ QueryWrapper companyUserQuery = new QueryWrapper<>(); companyUserQuery.lambda() .eq(CompanyUser::getComDepartId,user.getComDepartment().getId()) .in(CompanyUser::getPhone,Arrays.asList(s.getUserIds().split("[.,;,]"))); List list1 = companyUserService.findList(companyUserQuery); if (!CollectionUtils.isEmpty(list1)){ List collect1 = list1.stream().map(c -> c.getId().toString()).collect(Collectors.toList()); this.dealDeviceUserId(Constants.ZERO,StringUtils.join(collect1,","),device.getId(),user); } } }); } private boolean isRepeatCode(DeviceImportDTO s,int num,List plansList) { if(StringUtils.isNotBlank(s.getDeviceCode())){ int tNum = 0; for(DeviceImportDTO d :plansList){ if(num != tNum && StringUtils.equals(s.getDeviceCode(), d.getDeviceCode())){ return true; } tNum++; } } return false; } public synchronized String getNextCode(Integer comId ){ String prefix = "S-" + DateUtil.getDate(new Date(),"yyyyMMdd") +"-"; Integer countNum = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_DEVIECE_CHECK_KEY+comId,Integer.class); countNum = Constants.formatIntegerNum(countNum)+1; //更新缓存 RedisUtil.addObject(redisTemplate,Constants.RedisKeys.COM_DEVIECE_CHECK_KEY+comId,countNum); String nextIndex =Integer.toString( countNum ); return prefix + StringUtils.leftPad(nextIndex,4,"0"); } }