/* * 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 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.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.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 inventoryDetails) { inventoryDetails.stream().forEach(inventoryDetail ->{ inventoryDetail.setInyDiffQty(inventoryDetail.getStockQuantity() .subtract(BigDecimalUtils.getBigDecimalValue(inventoryDetail.getInyQty()))); }); updateBatchById(inventoryDetails); return true; } @Override public boolean noDiff(List ids) { List 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 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.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 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 judgeLabelMark(List snList){ String res = remoteParamService.getByKey(CHECK_INVENTORY_STATE, SecurityConstants.FROM_IN).getData(); List returnList = new ArrayList<>(); if(null != res && res.equals("true")) { for (String sn : snList) { List 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; } }