package doumeemes.service.ext.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import doumeemes.core.constants.ResponseStatus;
|
import doumeemes.core.exception.BusinessException;
|
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.excel.EasyExcelUtil;
|
import doumeemes.dao.business.WTransferDetailMapper;
|
import doumeemes.dao.business.WarehouseLocationMapper;
|
import doumeemes.dao.business.dto.WStockImportDTO;
|
import doumeemes.dao.business.model.*;
|
import doumeemes.dao.ext.*;
|
import doumeemes.dao.ext.beanDto.QueryWStockDto;
|
import doumeemes.dao.ext.beanDto.QueryWStockHeadNewDTO;
|
import doumeemes.dao.ext.beanDto.QueryWStockNewDTO;
|
import doumeemes.dao.ext.dto.*;
|
import doumeemes.dao.ext.vo.*;
|
import doumeemes.service.ext.ProceduresExtService;
|
import doumeemes.service.ext.WStockExtService;
|
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageInfo;
|
import org.apache.commons.lang3.StringUtils;
|
import org.apache.shiro.SecurityUtils;
|
import org.apache.shiro.util.CollectionUtils;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import java.math.BigDecimal;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Objects;
|
|
/**
|
* 物料库存余额信息Service实现
|
* @author 江蹄蹄
|
* @date 2022/04/20 10:56
|
*/
|
@Service
|
public class WStockExtServiceImpl implements WStockExtService {
|
|
@Autowired
|
private WStockExtMapper wStockExtMapper;
|
@Autowired
|
private MaterialDistributeExtMapper materialDistributeExtMapper;
|
@Autowired
|
private WarehouseExtMapper warehouseExtMapper;
|
@Autowired
|
private WarehouseLocationMapper warehouseLocationMapper;
|
@Autowired
|
private AppliancesExtMapper appliancesExtMapper;
|
|
@Autowired
|
private BomDetailExtMapper bomDetailExtMapper;
|
@Autowired
|
private BomExtMapper bomExtMapper;
|
@Autowired
|
private ProceduresExtService proceduresExtService;
|
@Autowired
|
private WTransferDetailExtMapper wTransferDetailExtMapper;
|
@Override
|
public PageData<WStockExtListVO> findPage(PageWrap<QueryWStockExtDTO> pageWrap) {
|
PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity());
|
List<WStockExtListVO> result = wStockExtMapper.selectListAll(pageWrap.getModel());
|
return PageData.from(new PageInfo<>(result));
|
}
|
|
@Override
|
public List<WStockExtListVO> getListBynum(QueryWStockExtDTO pageWrap) {
|
List<WStockExtListVO> result = wStockExtMapper.selectListAll(pageWrap);
|
return result;
|
}
|
|
@Override
|
public PageData<WStockExtListVO> findListPage(PageWrap<QueryWStockDto> pageWrap) {
|
|
LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
|
if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!");
|
}
|
//只能查看当前根组织的数据
|
pageWrap.getModel().setRootDepartId(user.getRootDepartment().getId());
|
// if(!Constants.equalsInteger(user.getCurComDepartment().getId(),user.getRootDepartment().getId())){
|
//如果当前选择的公司级组织非根组织信息,只能查看当前选择公司级组织数据
|
pageWrap.getModel().setDepartId(user.getCurComDepartment().getId());
|
// }
|
PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity());
|
List<WStockExtListVO> result = wStockExtMapper.selectAdminList(pageWrap.getModel());
|
return PageData.from(new PageInfo<>(result));
|
}
|
|
|
|
@Override
|
public PageData<WStockExtListVO> choiceStockListPage(PageWrap<QueryWStockDto> pageWrap) {
|
PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity());
|
if(!Objects.isNull(pageWrap.getModel().getWarehouseQualityType())){
|
Constants.wareHouse_QualityType w = Constants.wareHouse_QualityType.checkEnum(pageWrap.getModel().getWarehouseQualityType());
|
if(w.getType()==3){
|
pageWrap.getModel().setWarehouseQualityType(null);
|
}else{
|
pageWrap.getModel().setWarehouseQualityType(w.getType().toString());
|
}
|
}
|
List<WStockExtListVO> result = wStockExtMapper.choiceStockList(pageWrap.getModel());
|
return PageData.from(new PageInfo<>(result));
|
}
|
|
|
|
@Override
|
public PageData<WStockExtListVO> choiceStockPageByTransfer(PageWrap<QueryWStockHeadNewDTO> pageWrap) {
|
List<WTransferDetail> wTransferDetailList = wTransferDetailExtMapper.wTransferDetailListById(pageWrap.getModel().getTransferId());
|
if(Objects.isNull(wTransferDetailList)||wTransferDetailList.size()==Constants.ZERO){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未查询到转库单明细信息");
|
}
|
List<QueryWStockNewDTO> stockNewDTOList = new ArrayList<>();
|
for (WTransferDetail wTransferDetail:wTransferDetailList) {
|
QueryWStockNewDTO queryWStockNewDTO = new QueryWStockNewDTO();
|
BeanUtils.copyProperties(wTransferDetail,queryWStockNewDTO);
|
queryWStockNewDTO.setLocationId(wTransferDetail.getOutLocationId());
|
stockNewDTOList.add(queryWStockNewDTO);
|
}
|
pageWrap.getModel().setStockNewDTOList(stockNewDTOList);
|
PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity());
|
List<WStockExtListVO> result = wStockExtMapper.choiceStockPageByTransfer(pageWrap.getModel());
|
return PageData.from(new PageInfo<>(result));
|
}
|
|
/**
|
* 库存是否满足计划
|
* @param p
|
* @return
|
*/
|
@Override
|
public Integer isStockForPlan(PlansExtListVO p){
|
LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
|
QueryBomDetailExtDTO bdparam = initBomParam(user,p);
|
ProceduresExtListVO pModel = proceduresExtService.getById(user.getCompany().getId(),p.getProcedureId());
|
if(pModel==null){
|
return 0;
|
}
|
//待分配(计划数量-已分配未报工数量-合格数量-不良数量)
|
int tNum = p.getNum() - p.getDistributNum();
|
QueryWStockExtDTO stock = new QueryWStockExtDTO();
|
stock.setDeleted(Constants.ZERO);
|
stock.setRootDepartId(p.getRootDepartId());
|
stock.setWarehouseId(pModel.getPickingWarehouseId());
|
if(bdparam==null){
|
//如果没有配置BOM,则投料本身
|
stock.setMaterialId(p.getMaterialId());
|
//查询库存记录
|
List<WStockExtListVO> stockList = wStockExtMapper.selectAllList( stock);
|
if(stockList!=null && stockList.size()>0 &&Constants.formatBigdecimal(stockList.get(0).getNum()).compareTo(new BigDecimal(tNum)) >=0){
|
//如果库存不足
|
return 1;
|
}
|
}else{
|
//查询bom明细
|
List<BomDetailExtListVO> bomDetailList = bomDetailExtMapper.selectList(bdparam);
|
if(!CollectionUtils.isEmpty(bomDetailList) ){
|
stock.setMaterialIds(getMaterialIds(bomDetailList));
|
}
|
//查询库存记录
|
List<WStockExtListVO> stockList = wStockExtMapper.selectAllList( stock);
|
boolean isFull = true;
|
for (BomDetailExtListVO i : bomDetailList) {
|
//遍历查询库存是否满足
|
BigDecimal sNum =getStockByMaterialId(i.getMaterialId(),stockList);
|
//所需要库存量
|
BigDecimal needNum = Constants.formatBigdecimal(i.getNum()).multiply(new BigDecimal(tNum));
|
if( sNum.compareTo(needNum) <0){
|
//如果库存不足
|
isFull =false;
|
break;
|
}
|
}
|
return isFull?1:0;
|
}
|
return 0;
|
|
}
|
|
private BigDecimal getStockByMaterialId(Integer materialId, List<WStockExtListVO> stockList) {
|
BigDecimal num = new BigDecimal(0);
|
if(stockList!=null){
|
for(WStockExtListVO s : stockList){
|
if(Constants.equalsInteger(s.getMaterialId(),materialId)){
|
num.add(Constants.formatBigdecimal(s.getNum()));
|
}
|
}
|
}
|
return num;
|
}
|
|
private List<Integer> getMaterialIds(List<BomDetailExtListVO> bomDetailList) {
|
if(CollectionUtils.isEmpty(bomDetailList) ){
|
return null;
|
}
|
List<Integer> list = new ArrayList<>();
|
bomDetailList. forEach(i->{
|
//判断当前状态,根据状态获取明细记录 若是已取消业务,查询 0
|
list.add(i.getMaterialId());
|
});
|
return list;
|
}
|
|
|
private QueryBomDetailExtDTO initBomParam(LoginUserInfo user, PlansExtListVO mp) throws BusinessException{
|
QueryBomExtDTO bb = new QueryBomExtDTO();
|
bb.setDepartId(mp.getDepartId());
|
bb.setDeleted(Constants.ZERO);
|
bb.setRootDepartId(user.getRootDepartment().getId());
|
bb.setMaterialId(mp.getMaterialId());
|
bb.setProcedureId(mp.getProcedureId());
|
BomExtListVO versionBom = bomExtMapper.selectByModel( bb);
|
if(versionBom == null || StringUtils.isBlank(versionBom.getVersion()) || versionBom.getBomVersionId() == null){
|
return null;
|
}
|
QueryBomDetailExtDTO bom = new QueryBomDetailExtDTO();
|
bom.setDeleted(Constants.ZERO);
|
bom.setBomId(versionBom.getBomVersionId());
|
bom.setWorkorderId(mp.getId());
|
return bom;
|
}
|
|
|
|
|
|
@Transactional(rollbackFor = {BusinessException.class,Exception.class})
|
@Override
|
public String importStock(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<WStockImportDTO> list = EasyExcelUtil.importExcel(file, 1, 1, WStockImportDTO.class);
|
if(list == null || list.size()==0){
|
throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "导入数据内容有误!");
|
}
|
String msg = "";
|
int index = 1;
|
for(WStockImportDTO p : list){
|
WStock stock = new WStock();
|
stock.setDeleted(Constants.ZERO);
|
stock.setRootDepartId(user.getRootDepartment().getId());
|
stock.setBatch(p.getBatch());
|
stock.setNum(p.getNum());
|
|
Appliances appliances = new Appliances();
|
appliances.setUpdateTime(DateUtil.getCurrentDate());
|
appliances.setUpdateUser(user.getId());
|
appliances.setNum(p.getNum());
|
appliances.setBatch(p.getBatch());
|
//检查数据有效性
|
String code = checkData(p,stock,appliances,index,user);
|
if(StringUtils.isNotBlank(code)){
|
//如果有篮筐不为空,提示信息有修改
|
msg += "【"+code+"】";
|
}
|
if(stock.getId()!=null){
|
stock.setUpdateTime(DateUtil.getCurrentDate());
|
stock.setUpdateUser(user.getId());
|
wStockExtMapper.updateById(stock);
|
}else{
|
stock.setCreateTime(DateUtil.getCurrentDate());
|
stock.setCreateUser(user.getId());
|
wStockExtMapper.insert(stock);
|
}
|
appliancesExtMapper.updateById(appliances);
|
|
index++;
|
}
|
if(StringUtils.isNotBlank(msg)){
|
msg = "你好,部分数据导入成功!其中篮筐"+msg+"非空篮筐,导入不成功!";
|
}else{
|
msg = "全部导入成功!";
|
}
|
return msg;
|
|
}
|
|
/**
|
* 数据有效性检查
|
* @param p
|
* @param index
|
* @param user
|
* @throws BusinessException
|
*/
|
private String checkData(WStockImportDTO p, WStock stock, Appliances appliances ,int index,LoginUserInfo user) throws BusinessException{
|
if(Constants.formatBigdecimal(p.getNum()).compareTo(new BigDecimal(0)) != 1){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【物料数量】数据错误!");
|
}
|
if(p.getApplianceCode() == null){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【物料编码】数据错误");
|
}
|
if(StringUtils.isBlank(p.getMaterialCode())){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【物料编码】数据错误!");
|
}
|
if(StringUtils.isBlank(p.getWarehouse())){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【仓库名称】数据错误!");
|
}
|
|
p.setApplianceCode(p.getApplianceCode().trim());
|
p.setMaterialCode(p.getMaterialCode().trim());
|
p.setWarehouse(p.getWarehouse().trim());
|
Appliances a = new Appliances();
|
a.setDeleted(Constants.ZERO);
|
a.setCode(p.getApplianceCode());
|
a.setRootDepartId(user.getRootDepartment().getId());
|
a.setDepartId(user.getCurComDepartment().getId());
|
//查询篮筐信息
|
a = appliancesExtMapper.selectOne(new QueryWrapper<>(a));
|
if(a == null){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【篮筐编码】数据不存在!");
|
}
|
if(!Constants.equalsInteger(a.getStatus(),Constants.APPLIANCES_STATUS.empty)){
|
return p.getApplianceCode() ;
|
}
|
|
Warehouse w = new Warehouse();
|
w.setDeleted(Constants.ZERO);
|
w.setName(p.getWarehouse());
|
w.setRootDepartId(user.getRootDepartment().getId());
|
w.setDepartId(user.getCurComDepartment().getId());
|
//查询篮筐信息
|
w = warehouseExtMapper.selectOne(new QueryWrapper<>(w));
|
if(w == null){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【仓库名称】数据不存在!");
|
}
|
stock.setWarehouseId(w.getId());
|
|
if(StringUtils.isNotBlank(p.getLocation())){
|
p.setLocation(p.getLocation().trim());
|
WarehouseLocation l = new WarehouseLocation();
|
l.setDeleted(Constants.ZERO);
|
l.setWarehouseId(w.getId());
|
l.setUnionName(p.getLocation());
|
l.setRootDepartId(user.getRootDepartment().getId());
|
//查询篮筐信息
|
l = warehouseLocationMapper.selectOne(new QueryWrapper<>(l));
|
if(l == null || !Constants.equalsInteger(l.getWarehouseId(),w.getId())){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【库位名称】数据不存在!!");
|
}
|
stock.setLocationId(l.getId());
|
appliances.setLocationId(l.getId());
|
}
|
|
|
QueryMaterialDistributeExtDTO d = new QueryMaterialDistributeExtDTO();
|
d.setDeleted(Constants.ZERO);
|
d.setMmodelCode(p.getMaterialCode());
|
d.setRootDepartId(user.getRootDepartment().getId());
|
d.setDepartId(user.getCurComDepartment().getId());
|
//查询产品信息
|
MaterialDistributeExtListVO mm = materialDistributeExtMapper.selectByModel(d);
|
if(mm == null){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【产品编码】数据不存在!");
|
}
|
//存储物料分配表主键
|
stock.setMaterialId(mm.getId());
|
//单位编码
|
stock.setUnitId(mm.getUnitId());
|
|
appliances.setMaterialId(mm.getId());
|
appliances.setUnitId(mm.getUnitId());
|
appliances.setPositionType(Constants.APPLIANCES_POSITION.warehouse);
|
appliances.setStatus(Constants.APPLIANCES_STATUS.full);
|
appliances.setId(a.getId());
|
appliances.setWarehouseId(w.getId());
|
|
WStock s1 = new WStock();
|
s1.setLocationId(stock.getLocationId());
|
s1.setWarehouseId(stock.getWarehouseId());
|
s1.setDeleted(Constants.ZERO);
|
s1.setMaterialId(stock.getMaterialId());
|
s1.setBatch(stock.getBatch());
|
s1 = wStockExtMapper.selectOne(new QueryWrapper<>(s1));
|
if(s1 !=null){
|
stock.setId(s1.getId());
|
stock.setNum(Constants.formatBigdecimal(s1.getNum()).add(stock.getNum()));
|
}
|
|
return null;
|
}
|
}
|