package com.gkhy.hazmat.system.service.impl;
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.github.pagehelper.PageHelper;
|
import com.gkhy.hazmat.common.api.CommonPage;
|
import com.gkhy.hazmat.common.config.IdTableNameHandler;
|
import com.gkhy.hazmat.common.domain.entity.SysUser;
|
import com.gkhy.hazmat.common.enums.CodePrexEnum;
|
import com.gkhy.hazmat.common.enums.HazmatStatusEnum;
|
import com.gkhy.hazmat.common.enums.OperateStatusEnum;
|
import com.gkhy.hazmat.common.enums.UserTypeEnum;
|
import com.gkhy.hazmat.common.exception.ApiException;
|
import com.gkhy.hazmat.common.utils.PageUtils;
|
import com.gkhy.hazmat.common.utils.SecurityUtils;
|
import com.gkhy.hazmat.system.domain.*;
|
import com.gkhy.hazmat.system.domain.vo.HzHazmatWarehouseVO;
|
import com.gkhy.hazmat.system.mapper.*;
|
import com.gkhy.hazmat.system.service.HzHazmatService;
|
import org.springframework.beans.factory.annotation.Autowired;
|
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.Map;
|
import java.util.Objects;
|
import java.util.stream.Collectors;
|
|
/**
|
* <p>
|
* 危化品表 服务实现类
|
* </p>
|
*
|
* @author kzy
|
* @since 2024-08-05 14:41:40
|
*/
|
@Service
|
public class HzHazmatServiceImpl extends ServiceImpl<HzHazmatMapper, HzHazmat> implements HzHazmatService {
|
|
@Autowired
|
private HzHazmatFlowMapper hazmatFlowMapper;
|
@Autowired
|
private HzWarehouseRecordMapper warehouseRecordMapper;
|
@Autowired
|
private HzHazmatBasicMapper hazmatBasicMapper;
|
@Autowired
|
private HzWarehouseMapper warehouseMapper;
|
|
|
@Override
|
public CommonPage selectHazmatList(HzHazmat hzHazmat) {
|
if(hzHazmat.getWarehouseId()==null||hzHazmat.getBasicId()==null){
|
throw new ApiException("仓库id或者危化品基础数据id不能为空");
|
}
|
SysUser currentUser = SecurityUtils.getLoginUser().getUser();
|
checkUserAllowed(null,currentUser);
|
if (currentUser.getUserType().equals(UserTypeEnum.CHECK_USER.getCode())){
|
IdTableNameHandler.setCurrentId(hzHazmat.getCompanyId());
|
}else {
|
//设置分表id
|
IdTableNameHandler.setCurrentId(currentUser.getCompanyId());
|
hzHazmat.setCompanyId(currentUser.getCompanyId());
|
}
|
PageUtils.startPage();
|
List<HzHazmat> hazmatList = baseMapper.selectHazmatList(hzHazmat);
|
IdTableNameHandler.removeCurrentId();
|
return CommonPage.restPage(hazmatList);
|
}
|
|
@Override
|
public CommonPage selectHazmatGroupWarehouse(HzHazmat hzHazmat) {
|
SysUser currentUser = SecurityUtils.getLoginUser().getUser();
|
checkUserAllowed(null,currentUser);
|
if (currentUser.getUserType().equals(UserTypeEnum.CHECK_USER.getCode())){
|
IdTableNameHandler.setCurrentId(hzHazmat.getCompanyId());
|
}else {
|
hzHazmat.setCompanyId(currentUser.getCompanyId());
|
//设置分表id
|
//todo
|
IdTableNameHandler.setCurrentId(currentUser.getCompanyId());
|
}
|
PageUtils.startPage();
|
List<HzHazmatWarehouseVO> hazmatList = baseMapper.selectHazmatGroupWareHouse(hzHazmat);
|
if(!hazmatList.isEmpty()) {
|
List<Long> warehouseIds = hazmatList.stream().map(HzHazmatWarehouseVO::getWarehouseId).collect(Collectors.toList());
|
List<Long> basicIds = hazmatList.stream().map(HzHazmatWarehouseVO::getBasicId).collect(Collectors.toList());
|
List<Integer> cupboardIds = hazmatList.stream().map(HzHazmatWarehouseVO::getCupboardId).collect(Collectors.toList());
|
List<HzHazmatBasic> hazmatBasicList = hazmatBasicMapper.selectHazmatBasicListByIds(basicIds);
|
List<HzWarehouse> warehouseList = warehouseMapper.selectWarehouseListByIds(warehouseIds);
|
List<HzWarehouseCupboard> hzWarehouseCupboards = warehouseMapper.selectByCupboardIds(cupboardIds);
|
|
Map<Long,HzHazmatBasic> hazmatBasicMap=hazmatBasicList.stream().collect(Collectors.toMap(HzHazmatBasic::getId, item->item));
|
Map<Long,HzWarehouse> warehouseMap=warehouseList.stream().collect(Collectors.toMap(HzWarehouse::getId, item->item));
|
Map<Integer, HzWarehouseCupboard> cupboardMap = hzWarehouseCupboards.stream().collect(Collectors.toMap(HzWarehouseCupboard::getId, item -> item));
|
for(HzHazmatWarehouseVO hazmatWarehouseVO:hazmatList){
|
HzHazmatBasic hazmatBasic=hazmatBasicMap.get(hazmatWarehouseVO.getBasicId());
|
HzWarehouse warehouse=warehouseMap.get(hazmatWarehouseVO.getWarehouseId());
|
HzWarehouseCupboard hzWarehouseCupboard = cupboardMap.get(hazmatWarehouseVO.getCupboardId());
|
if(hazmatBasic!=null){
|
hazmatWarehouseVO.setHazmatBasic(hazmatBasic);
|
}
|
if(warehouse!=null){
|
hazmatWarehouseVO.setWarehouseName(warehouse.getName());
|
}
|
if (hzWarehouseCupboard != null){
|
hazmatWarehouseVO.setCupboardName(hzWarehouseCupboard.getCupboardName());
|
}
|
|
}
|
}
|
IdTableNameHandler.removeCurrentId();
|
return CommonPage.restPage(hazmatList);
|
}
|
|
@Override
|
public HzHazmat selectHazmatById(Long hazmatId) {
|
SysUser currentUser = SecurityUtils.getLoginUser().getUser();
|
checkUserAllowed(null,currentUser);
|
//设置分表id
|
IdTableNameHandler.setCurrentId(currentUser.getCompanyId());
|
HzHazmat hazmat = baseMapper.selectById(hazmatId);
|
checkUserAllowed(hazmat,currentUser);
|
IdTableNameHandler.removeCurrentId();
|
return hazmat;
|
}
|
|
|
|
@Override
|
public int deleteHazmatById(Long hazmatId) {
|
SysUser currentUser = SecurityUtils.getLoginUser().getUser();
|
checkUserAllowed(null,currentUser);
|
//设置分表id
|
IdTableNameHandler.setCurrentId(currentUser.getCompanyId());
|
HzHazmat hazmat=baseMapper.selectById(hazmatId);
|
if(hazmat==null){
|
throw new ApiException("危化品不存在");
|
}
|
checkUserAllowed(hazmat,currentUser);
|
baseMapper.deleteHazmatById(hazmatId);
|
IdTableNameHandler.removeCurrentId();
|
return 0;
|
}
|
|
@Override
|
public HzHazmat selectHazmatByCode(String code) {
|
if(!code.startsWith(CodePrexEnum.MATERIAL.getCode())){
|
throw new ApiException("该条码格式不正确");
|
}
|
SysUser currentUser=SecurityUtils.getLoginUser().getUser();
|
checkUserAllowed(null,currentUser);
|
//设置分表id
|
IdTableNameHandler.setCurrentId(currentUser.getCompanyId());
|
HzHazmat hazmat=baseMapper.selectHazmatByCode(code,currentUser.getCompanyId());
|
IdTableNameHandler.removeCurrentId();
|
if(hazmat==null){
|
throw new ApiException("该条码数据不存在");
|
}
|
return hazmat;
|
}
|
|
@Override
|
@Transactional(rollbackFor = RuntimeException.class)
|
public void hazmatUse(Long hazmatId, Integer used) {
|
SysUser currentUser=SecurityUtils.getLoginUser().getUser();
|
checkUserAllowed(null,currentUser);
|
//设置分表id
|
IdTableNameHandler.setCurrentId(currentUser.getCompanyId());
|
HzHazmat hazmat=getById(hazmatId);
|
if(!hazmat.getState().equals(HazmatStatusEnum.WAREHOUSEIN.getCode())&&!hazmat.getState().equals(HazmatStatusEnum.USEWAREHOUSEIN.getCode())){
|
throw new ApiException("危化品不在库中,不能进行领用操作");
|
}
|
checkUserAllowed(hazmat,currentUser);
|
//获取变动前仓库库存
|
int count = baseMapper.selectHazmatCountOfWarehouse(hazmat.getWarehouseId(), hazmat.getBasicId(), currentUser.getCompanyId(),hazmat.getCupboardId());
|
|
//生成流向
|
BigDecimal remaining=hazmat.getRemaining();
|
HzHazmatFlow hazmatFlow=new HzHazmatFlow();
|
hazmatFlow.setHazmatId(hazmatId);
|
hazmatFlow.setBasicId(hazmat.getBasicId());
|
hazmatFlow.setState(OperateStatusEnum.USING.getCode());
|
hazmatFlow.setCompanyId(currentUser.getCompanyId());
|
hazmatFlow.setNum(remaining.multiply(BigDecimal.valueOf(-1)));
|
hazmatFlow.setCreateId(currentUser.getId());
|
hazmatFlowMapper.insert(hazmatFlow);
|
hazmat.setState(HazmatStatusEnum.USING.getCode());
|
if(used==1){//用尽流向
|
hazmatFlow=new HzHazmatFlow();
|
hazmatFlow.setHazmatId(hazmatId);
|
hazmatFlow.setBasicId(hazmat.getBasicId());
|
hazmatFlow.setState(OperateStatusEnum.USE_UP.getCode());
|
hazmatFlow.setCompanyId(currentUser.getCompanyId());
|
hazmatFlow.setNum(remaining.multiply(BigDecimal.valueOf(-1)));
|
hazmatFlow.setCreateId(currentUser.getId());
|
hazmatFlowMapper.insert(hazmatFlow);
|
hazmat.setState(HazmatStatusEnum.USED.getCode());
|
hazmat.setRemaining(BigDecimal.valueOf(0));
|
}
|
hazmat.setUpdateBy(currentUser.getUsername());
|
updateById(hazmat);//更新试剂状态
|
//生成库存变动记录
|
//新增危化品变动记录
|
HzWarehouseRecord warehouseRecord = new HzWarehouseRecord()
|
.setWarehouseId(hazmat.getWarehouseId())
|
.setBasicId(hazmat.getBasicId())
|
.setCupboardId(hazmat.getCupboardId())
|
.setCreateId(currentUser.getId())
|
.setNum(-1)
|
.setState(OperateStatusEnum.USING.getCode())
|
.setCompanyId(currentUser.getCompanyId())
|
.setRemaining(count-1);
|
warehouseRecordMapper.insert(warehouseRecord);
|
IdTableNameHandler.removeCurrentId();
|
}
|
|
@Override
|
@Transactional(rollbackFor = RuntimeException.class)
|
public void hazmatReturn(HzHazmat hazmat) {
|
if(hazmat.getId()==null||hazmat.getRemaining()==null||hazmat.getRemaining().compareTo(BigDecimal.ZERO)<=0){
|
throw new ApiException("参数不正确");
|
}
|
SysUser currentUser=SecurityUtils.getLoginUser().getUser();
|
checkUserAllowed(null,currentUser);
|
//设置分表id
|
IdTableNameHandler.setCurrentId(currentUser.getCompanyId());
|
HzHazmat dbhazmat=getById(hazmat.getId());
|
BigDecimal remaining=dbhazmat.getRemaining();
|
if(!dbhazmat.getState().equals(HazmatStatusEnum.USING.getCode())&&!dbhazmat.getState().equals(HazmatStatusEnum.USED.getCode())){
|
throw new ApiException("危化品非使用中或者用尽状态,不能进行归还操作");
|
}
|
if(dbhazmat.getState().equals(HazmatStatusEnum.USING.getCode())&&remaining.compareTo(hazmat.getRemaining())<0){
|
throw new ApiException("退还的容量不能高于库存容量");
|
}
|
if(dbhazmat.getState().equals(HazmatStatusEnum.USED.getCode())){
|
HzHazmatBasic hazmatBasic=hazmatBasicMapper.selectById(dbhazmat.getBasicId());
|
if(hazmatBasic.getMetering().compareTo(hazmat.getRemaining())<0) {
|
throw new ApiException("退还的容量不能高于最小包装数量");
|
}
|
}
|
checkUserAllowed(dbhazmat,currentUser);
|
//获取变动前仓库库存
|
int count = baseMapper.selectHazmatCountOfWarehouse(dbhazmat.getWarehouseId(), dbhazmat.getBasicId(), currentUser.getCompanyId(),dbhazmat.getCupboardId());
|
hazmat.setState(HazmatStatusEnum.USEWAREHOUSEIN.getCode());
|
hazmat.setUpdateBy(currentUser.getUsername());
|
updateById(hazmat);
|
//生成流向
|
HzHazmatFlow hazmatFlow=new HzHazmatFlow();
|
hazmatFlow.setHazmatId(dbhazmat.getId());
|
hazmatFlow.setBasicId(dbhazmat.getBasicId());
|
hazmatFlow.setState(OperateStatusEnum.RETURN.getCode());
|
hazmatFlow.setCompanyId(currentUser.getCompanyId());
|
hazmatFlow.setNum(hazmat.getRemaining());
|
hazmatFlow.setCreateId(currentUser.getId());
|
hazmatFlowMapper.insert(hazmatFlow);
|
|
//生成库存变动记录
|
//新增危化品变动记录
|
HzWarehouseRecord warehouseRecord = new HzWarehouseRecord()
|
.setWarehouseId(dbhazmat.getWarehouseId())
|
.setBasicId(dbhazmat.getBasicId())
|
.setCupboardId(hazmat.getCupboardId())
|
.setCreateId(currentUser.getId())
|
.setNum(1)
|
.setState(OperateStatusEnum.RETURN.getCode())
|
.setCompanyId(currentUser.getCompanyId())
|
.setRemaining(count+1);
|
warehouseRecordMapper.insert(warehouseRecord);
|
IdTableNameHandler.removeCurrentId();
|
}
|
|
@Override
|
@Transactional(rollbackFor = RuntimeException.class)
|
public void hazmatUsed(Long hazmatId) {
|
SysUser currentUser=SecurityUtils.getLoginUser().getUser();
|
checkUserAllowed(null,currentUser);
|
//设置分表id
|
IdTableNameHandler.setCurrentId(currentUser.getCompanyId());
|
HzHazmat hazmat=getById(hazmatId);
|
if(!hazmat.getState().equals(HazmatStatusEnum.USING.getCode())){
|
throw new ApiException("危化品非使用中状态,不能进行用完登记操作");
|
}
|
BigDecimal remaining=hazmat.getRemaining();
|
hazmat.setState(HazmatStatusEnum.USED.getCode());
|
hazmat.setRemaining(BigDecimal.valueOf(0));
|
hazmat.setUpdateBy(currentUser.getUsername());
|
updateById(hazmat);
|
//生成流向
|
HzHazmatFlow hazmatFlow=new HzHazmatFlow();
|
hazmatFlow.setHazmatId(hazmat.getId());
|
hazmatFlow.setBasicId(hazmat.getBasicId());
|
hazmatFlow.setState(OperateStatusEnum.USE_UP.getCode());
|
hazmatFlow.setCompanyId(currentUser.getCompanyId());
|
hazmatFlow.setNum(remaining.multiply(BigDecimal.valueOf(-1)));
|
hazmatFlow.setCreateId(currentUser.getId());
|
hazmatFlowMapper.insert(hazmatFlow);
|
IdTableNameHandler.removeCurrentId();
|
}
|
|
@Override
|
@Transactional(rollbackFor = RuntimeException.class)
|
public void hazmatDiscard(Long hazmatId) {
|
SysUser currentUser=SecurityUtils.getLoginUser().getUser();
|
checkUserAllowed(null,currentUser);
|
//设置分表id
|
IdTableNameHandler.setCurrentId(currentUser.getCompanyId());
|
HzHazmat hazmat=getById(hazmatId);
|
if(!hazmat.getState().equals(HazmatStatusEnum.WAREHOUSEIN.getCode())&&!hazmat.getState().equals(HazmatStatusEnum.USEWAREHOUSEIN.getCode())){
|
throw new ApiException("危化品不在库中,不能进行作废操作");
|
}
|
checkUserAllowed(hazmat,currentUser);
|
//获取变动前仓库库存
|
int count = baseMapper.selectHazmatCountOfWarehouse(hazmat.getWarehouseId(), hazmat.getBasicId(), currentUser.getCompanyId(),hazmat.getCupboardId());
|
hazmat.setState(HazmatStatusEnum.DISCARD.getCode());
|
hazmat.setUpdateBy(currentUser.getUsername());
|
updateById(hazmat);
|
//生成流向
|
HzHazmatFlow hazmatFlow=new HzHazmatFlow();
|
hazmatFlow.setHazmatId(hazmat.getId());
|
hazmatFlow.setBasicId(hazmat.getBasicId());
|
hazmatFlow.setState(OperateStatusEnum.DISCARD.getCode());
|
hazmatFlow.setCompanyId(currentUser.getCompanyId());
|
hazmatFlow.setNum(hazmat.getRemaining().multiply(BigDecimal.valueOf(-1)));
|
hazmatFlow.setCreateId(currentUser.getId());
|
hazmatFlowMapper.insert(hazmatFlow);
|
|
//生成库存变动记录
|
//新增危化品变动记录
|
HzWarehouseRecord warehouseRecord = new HzWarehouseRecord()
|
.setWarehouseId(hazmat.getWarehouseId())
|
.setBasicId(hazmat.getBasicId())
|
.setCupboardId(hazmat.getCupboardId())
|
.setCreateId(currentUser.getId())
|
.setNum(-1)
|
.setState(OperateStatusEnum.DISCARD.getCode())
|
.setCompanyId(currentUser.getCompanyId())
|
.setRemaining(count-1);
|
warehouseRecordMapper.insert(warehouseRecord);
|
IdTableNameHandler.removeCurrentId();
|
}
|
|
@Override
|
public void changeState(HzHazmat hazmat) {
|
if(hazmat.getId()==null||hazmat.getCompanyId()==null||hazmat.getState()==null){
|
throw new ApiException("参数不正确");
|
}
|
SysUser currentUser=SecurityUtils.getLoginUser().getUser();
|
checkUserAllowed(hazmat,currentUser);
|
//设置分表id
|
IdTableNameHandler.setCurrentId(currentUser.getCompanyId());
|
HzHazmat newHazmat=new HzHazmat().setId(hazmat.getId()).setState(hazmat.getState());
|
newHazmat.setUpdateBy(currentUser.getUsername());
|
updateById(newHazmat);
|
IdTableNameHandler.removeCurrentId();
|
}
|
|
@Override
|
@Transactional(rollbackFor = RuntimeException.class)
|
public void changeRemaining(HzHazmat hazmat) {
|
if(hazmat.getId()==null||hazmat.getRemaining()==null){
|
throw new ApiException("参数不正确");
|
}
|
SysUser currentUser=SecurityUtils.getLoginUser().getUser();
|
checkUserAllowed(null,currentUser);
|
//设置分表id
|
IdTableNameHandler.setCurrentId(currentUser.getCompanyId());
|
HzHazmat dbHazmat=getById(hazmat.getId());
|
checkUserAllowed(dbHazmat,currentUser);
|
if(hazmat.getRemaining().compareTo(dbHazmat.getRemaining())>=0){
|
throw new ApiException("修改值不能大于等于在库容量");
|
}
|
//校验是否产生流向
|
Long flowCount=hazmatFlowMapper.selectCount(Wrappers.<HzHazmatFlow>lambdaQuery().eq(HzHazmatFlow::getHazmatId,hazmat.getId())
|
.ne(HzHazmatFlow::getState,OperateStatusEnum.ENTRY.getCode()));
|
if(flowCount>0){
|
throw new ApiException("该危化品已流转,不能修改!");
|
}
|
HzHazmat newHazmat=new HzHazmat().setId(hazmat.getId()).setRemaining(hazmat.getRemaining());
|
newHazmat.setUpdateBy(currentUser.getUsername());
|
updateById(newHazmat);
|
//生成流向
|
HzHazmatFlow hazmatFlow=new HzHazmatFlow();
|
hazmatFlow.setHazmatId(hazmat.getId());
|
hazmatFlow.setBasicId(dbHazmat.getBasicId());
|
hazmatFlow.setState(OperateStatusEnum.REMNANT.getCode());
|
hazmatFlow.setCompanyId(currentUser.getCompanyId());
|
hazmatFlow.setNum(hazmat.getRemaining());
|
hazmatFlow.setCreateId(currentUser.getId());
|
hazmatFlowMapper.insert(hazmatFlow);
|
IdTableNameHandler.removeCurrentId();
|
}
|
|
public void checkUserAllowed(HzHazmat hazmat,SysUser user) {
|
if (user.getUserType().equals(UserTypeEnum.SYSTEM_USER.getCode())) {
|
throw new ApiException("管理员不能操作");
|
}
|
if(hazmat!=null){
|
if(!Objects.equals(user.getCompanyId(), hazmat.getCompanyId())){
|
throw new ApiException("无权限操作其他企业数据");
|
}
|
}
|
}
|
}
|