/*
|
* Copyright (c) 2018-2025, ztt All rights reserved.
|
*
|
* Redistribution and use in source and binary forms, with or without
|
* modification, are permitted provided that the following conditions are met:
|
*
|
* Redistributions of source code must retain the above copyright notice,
|
* this list of conditions and the following disclaimer.
|
* Redistributions in binary form must reproduce the above copyright
|
* notice, this list of conditions and the following disclaimer in the
|
* documentation and/or other materials provided with the distribution.
|
* Neither the name of the pig4cloud.com developer nor the names of its
|
* contributors may be used to endorse or promote products derived from
|
* this software without specific prior written permission.
|
* Author: ztt
|
*/
|
package com.chinaztt.mes.warehouse.service.impl;
|
|
|
import cn.hutool.core.collection.CollectionUtil;
|
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.extension.api.R;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.chinaztt.mes.basic.entity.Part;
|
import com.chinaztt.mes.basic.entity.Warehouse;
|
import com.chinaztt.mes.basic.mapper.PartMapper;
|
import com.chinaztt.mes.basic.util.BigDecimalUtils;
|
import com.chinaztt.mes.warehouse.dto.ValidateInventoryResultDTO;
|
import com.chinaztt.mes.warehouse.entity.InventoryDetail;
|
import com.chinaztt.mes.warehouse.entity.InventoryMain;
|
import com.chinaztt.mes.warehouse.entity.InventoryPda;
|
import com.chinaztt.mes.warehouse.entity.ProductOutput;
|
import com.chinaztt.mes.warehouse.mapper.InventoryDetailMapper;
|
import com.chinaztt.mes.warehouse.mapper.InventoryMainMapper;
|
import com.chinaztt.mes.warehouse.mapper.InventoryPdaMapper;
|
import com.chinaztt.mes.warehouse.mapper.ProductOutputMapper;
|
import com.chinaztt.mes.warehouse.service.InventoryDetailService;
|
import com.chinaztt.ztt.admin.api.entity.SysPublicParam;
|
import com.chinaztt.ztt.admin.api.feign.RemoteParamService;
|
import com.chinaztt.ztt.common.core.constant.SecurityConstants;
|
import lombok.AllArgsConstructor;
|
import lombok.Synchronized;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.time.LocalDateTime;
|
import java.time.format.DateTimeFormatter;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* 新盘点明细
|
*
|
* @author yangyao
|
* @date 2022-10-13 11:06:00
|
*/
|
@AllArgsConstructor
|
@Service
|
public class InventoryDetailServiceImpl extends ServiceImpl<InventoryDetailMapper, InventoryDetail> implements InventoryDetailService {
|
|
|
private InventoryPdaMapper inventoryPdaMapper;
|
|
private PartMapper partMapper;
|
|
private InventoryMainMapper inventoryMainMapper;
|
|
public static final String CHECK_INVENTORY_STATE = "CHECK_INVENTORY_STATE";//是否盘点中系统参数key
|
|
public static final String INVENTORY_TIME = "INVENTORY_TIME";//盘点时间系统参数key
|
|
private RemoteParamService remoteParamService;
|
|
@Resource
|
private ProductOutputMapper outputMapper;
|
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public boolean fullSave(InventoryDetail inventoryDetail) {
|
InventoryDetail inventoryDetailBySelect = judgeBlankAndRepeat(inventoryDetail);
|
//判断是否是盘点期间产出
|
if(judgeIsInventoryTime(inventoryDetail.getSn())){
|
throw new RuntimeException("盘点期间的产出冻结盘点操作");
|
}
|
|
if(inventoryDetailBySelect==null){
|
InventoryDetail detail = getInventoryDetail(inventoryDetail);
|
baseMapper.insert(detail);
|
return true;
|
}
|
inventoryDetailBySelect.setInyQty(inventoryDetail.getInyQty().add(BigDecimalUtils.getBigDecimalValue(inventoryDetailBySelect.getInyQty())));
|
inventoryDetailBySelect.setInyDiffQty(inventoryDetailBySelect.getStockQuantity().subtract(inventoryDetailBySelect.getInyQty()));
|
baseMapper.updateById(inventoryDetailBySelect);
|
return true;
|
}
|
|
|
public InventoryDetail judgeBlankAndRepeat(InventoryDetail inventoryDetail){
|
if(StringUtils.isBlank(inventoryDetail.getPartNo())){
|
throw new RuntimeException("零件号不能为空!");
|
}
|
if(StringUtils.isBlank(inventoryDetail.getSn())){
|
throw new RuntimeException("Sn号不能为空!");
|
}
|
if(StringUtils.isBlank(inventoryDetail.getIfsBatchNo())){
|
throw new RuntimeException("Ifs批次号不能为空!");
|
}
|
if(inventoryDetail.getInyQty()==null){
|
throw new RuntimeException("盘点数量不能为空!");
|
}
|
if(StringUtils.isBlank(inventoryDetail.getLocNo())){
|
throw new RuntimeException("库位号不能为空!");
|
}
|
InventoryDetail inventoryDetailBySelect = baseMapper.selectOne(Wrappers.<InventoryDetail>lambdaQuery()
|
.eq(InventoryDetail::getInventoryMainId, inventoryDetail.getInventoryMainId())
|
.eq(InventoryDetail::getPartNo, inventoryDetail.getPartNo())
|
.eq(InventoryDetail::getSn, inventoryDetail.getSn())
|
.eq(InventoryDetail::getIfsBatchNo, inventoryDetail.getIfsBatchNo())
|
.eq(InventoryDetail::getLocNo, inventoryDetail.getLocNo()));
|
|
return inventoryDetailBySelect;
|
|
}
|
|
|
public InventoryDetail getInventoryDetail(InventoryDetail inventoryDetail){
|
Warehouse warehouse = baseMapper.getWarehouseName(inventoryDetail.getLocNo());
|
Part part = partMapper.selectOne(Wrappers.<Part>lambdaQuery()
|
.eq(Part::getPartNo, inventoryDetail.getPartNo()));
|
inventoryDetail.setPlanningMethod(part.getPlanningMethod());
|
inventoryDetail.setPartName(part.getPartName());
|
inventoryDetail.setWarehouseId(warehouse.getId());
|
inventoryDetail.setWarehouseName(warehouse.getWarehouseName());
|
inventoryDetail.setStockQuantity(BigDecimal.ZERO);
|
inventoryDetail.setInyDiffQty(inventoryDetail.getInyQty().negate());
|
return inventoryDetail;
|
|
}
|
|
|
|
|
@Override
|
public boolean updateBatch(List<InventoryDetail> inventoryDetails) {
|
|
inventoryDetails.stream().forEach(inventoryDetail ->{
|
inventoryDetail.setInyDiffQty(inventoryDetail.getStockQuantity()
|
.subtract(BigDecimalUtils.getBigDecimalValue(inventoryDetail.getInyQty())));
|
});
|
updateBatchById(inventoryDetails);
|
return true;
|
}
|
|
@Override
|
public boolean noDiff(List<Long> ids) {
|
List<InventoryDetail> inventoryDetails = baseMapper.selectBatchIds(ids);
|
if(CollectionUtil.isNotEmpty(inventoryDetails)) {
|
inventoryDetails.stream().forEach(inventoryDetail ->{
|
if(inventoryDetail.getInyQty()==null){
|
inventoryDetail.setInyQty(inventoryDetail.getStockQuantity());
|
}
|
inventoryDetail.setInyDiffQty(inventoryDetail.getStockQuantity().subtract(inventoryDetail.getInyQty()));
|
});
|
|
updateBatchById(inventoryDetails);
|
}
|
return true;
|
}
|
|
|
@Override
|
public boolean cancelNoIny(List<Long> ids) {
|
baseMapper.cancelNoIny(ids);
|
return true;
|
}
|
|
@Override
|
@Synchronized
|
public boolean savePda(InventoryDetail inventoryDetail) {
|
InventoryDetail inventoryDetailBySelect = judgeBlankAndRepeat(inventoryDetail);
|
InventoryPda inventoryPda = new InventoryPda();
|
inventoryPda.setPartNo(inventoryDetail.getPartNo());
|
inventoryPda.setIfsBatchNo(inventoryDetail.getIfsBatchNo());
|
inventoryPda.setSn(inventoryDetail.getSn());
|
inventoryPda.setLocNo(inventoryDetail.getLocNo());
|
inventoryPda.setInyQty(inventoryDetail.getInyQty());
|
if(inventoryDetailBySelect==null){
|
InventoryDetail detail = getInventoryDetail(inventoryDetail);
|
detail.setCommitNum(1L);
|
baseMapper.insert(detail);
|
inventoryPda.setInventoryDetailId(detail.getId());
|
inventoryPdaMapper.insert(inventoryPda);
|
}else {
|
inventoryPda.setInventoryDetailId(inventoryDetailBySelect.getId());
|
inventoryPdaMapper.insert(inventoryPda);
|
inventoryDetailBySelect.setInyQty(inventoryDetail.getInyQty().add(BigDecimalUtils.getBigDecimalValue(inventoryDetailBySelect.getInyQty())));
|
if (inventoryDetailBySelect.getCommitNum() == null) {
|
inventoryDetailBySelect.setCommitNum(1L);
|
} else {
|
inventoryDetailBySelect.setCommitNum(1L + inventoryDetailBySelect.getCommitNum());
|
}
|
inventoryDetailBySelect.setInyDiffQty(inventoryDetailBySelect.getStockQuantity().subtract(inventoryDetailBySelect.getInyQty()));
|
baseMapper.updateById(inventoryDetailBySelect);
|
}
|
return true;
|
}
|
|
|
@Override
|
@Synchronized
|
public R checkSavePda(InventoryDetail inventoryDetail) {
|
if(StringUtils.isBlank(inventoryDetail.getPartNo())){
|
throw new RuntimeException("零件号不能为空!");
|
}
|
if(StringUtils.isBlank(inventoryDetail.getSn())){
|
throw new RuntimeException("Sn号不能为空!");
|
}
|
if(StringUtils.isBlank(inventoryDetail.getIfsBatchNo())){
|
throw new RuntimeException("Ifs批次号不能为空!");
|
}
|
if(StringUtils.isBlank(inventoryDetail.getLocNo())){
|
throw new RuntimeException("库位号不能为空!");
|
}
|
//判断是否是盘点期间产出
|
if(judgeIsInventoryTime(inventoryDetail.getSn())){
|
throw new RuntimeException("盘点期间的产出冻结盘点操作");
|
}
|
|
InventoryDetail inventoryDetailBySelect = baseMapper.selectOne(Wrappers.<InventoryDetail>lambdaQuery()
|
.eq(InventoryDetail::getInventoryMainId, inventoryDetail.getInventoryMainId())
|
.eq(InventoryDetail::getPartNo, inventoryDetail.getPartNo())
|
.eq(InventoryDetail::getSn, inventoryDetail.getSn())
|
.eq(InventoryDetail::getIfsBatchNo, inventoryDetail.getIfsBatchNo())
|
.eq(InventoryDetail::getLocNo, inventoryDetail.getLocNo()));
|
if(inventoryDetailBySelect!=null){
|
if(inventoryDetailBySelect.getCommitNum()==null){
|
return R.ok(ValidateInventoryResultDTO.builder().success(Boolean.TRUE).build());
|
}else{
|
return R.ok(ValidateInventoryResultDTO.builder().success(Boolean.FALSE).message("该零件批次已扫描过,是否继续扫描").build());
|
}
|
}else{
|
return R.ok(ValidateInventoryResultDTO.builder().success(Boolean.TRUE).build());
|
}
|
}
|
|
|
|
/**
|
* 判断是否是盘点期间产出
|
*/
|
public boolean judgeIsInventoryTime(String sn){
|
String res = remoteParamService.getByKey(CHECK_INVENTORY_STATE, SecurityConstants.FROM_IN).getData();
|
if(null != res && res.equals("true")){
|
List<LocalDateTime> createTimeList = baseMapper.getOutputCreateTime(sn);
|
if(CollectionUtil.isNotEmpty(createTimeList)){
|
String inventoryTime = remoteParamService.getByKey(INVENTORY_TIME, SecurityConstants.FROM_IN).getData();
|
if(inventoryTime!=null) {
|
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
LocalDateTime inventoryLocalDateTime = LocalDateTime.parse(inventoryTime, df);
|
//产出表创建时间大于等于系统参数盘点更新时间则为 盘点产出
|
if (createTimeList.get(0).isAfter(inventoryLocalDateTime) || createTimeList.get(0).equals(inventoryLocalDateTime)) {
|
return true;
|
}
|
}
|
}
|
}
|
return false;
|
}
|
|
|
|
/**
|
* 判断标签是否是盘点时打印
|
*/
|
@Override
|
public List<String> judgeLabelMark(List<String> snList){
|
String res = remoteParamService.getByKey(CHECK_INVENTORY_STATE, SecurityConstants.FROM_IN).getData();
|
List<String> returnList = new ArrayList<>();
|
if(null != res && res.equals("true")) {
|
for (String sn : snList) {
|
List<LocalDateTime> createTimeList = baseMapper.getOutputCreateTime(sn);
|
if (CollectionUtil.isNotEmpty(createTimeList)) {
|
String inventoryTime = remoteParamService.getByKey(INVENTORY_TIME, SecurityConstants.FROM_IN).getData();
|
if (inventoryTime != null) {
|
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
LocalDateTime inventoryLocalDateTime = LocalDateTime.parse(inventoryTime, df);
|
//产出表创建时间大于等于系统参数盘点更新时间则为 盘点产出
|
if (createTimeList.get(0).isAfter(inventoryLocalDateTime) || createTimeList.get(0).equals(inventoryLocalDateTime)) {
|
returnList.add(sn);
|
}
|
}
|
}
|
}
|
|
}
|
return returnList;
|
}
|
}
|