/* * 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.quality.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.BeanUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.chinaztt.mes.basic.entity.Location; import com.chinaztt.mes.basic.mapper.LocationMapper; import com.chinaztt.mes.quality.dto.QualityLabelDTO; import com.chinaztt.mes.quality.dto.QualityLabelInputDTO; import com.chinaztt.mes.quality.dto.QualityPrintLabelDTO; import com.chinaztt.mes.quality.entity.QualityLabel; import com.chinaztt.mes.quality.entity.QualityLabelPrintConfig; import com.chinaztt.mes.quality.entity.QualityLabelPrintConfigDetail; import com.chinaztt.mes.quality.entity.QualityLabelPrintLog; import com.chinaztt.mes.quality.mapper.QualityLabelMapper; import com.chinaztt.mes.quality.mapper.QualityLabelPrintConfigDetailMapper; import com.chinaztt.mes.quality.mapper.QualityLabelPrintConfigMapper; import com.chinaztt.mes.quality.service.QualityLabelPrintLogService; import com.chinaztt.mes.quality.service.QualityLabelService; import com.chinaztt.mes.warehouse.entity.Stock; import com.chinaztt.mes.warehouse.mapper.StockMapper; import com.chinaztt.ztt.admin.api.feign.RemoteParamService; import com.chinaztt.ztt.common.core.constant.SecurityConstants; import com.chinaztt.ztt.common.core.util.R; import com.google.gson.JsonObject; import lombok.AllArgsConstructor; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; /** * 标签 * * @author yy * @date 2023-04-11 13:54:42 */ @Service @AllArgsConstructor @Transactional public class QualityLabelServiceImpl extends ServiceImpl implements QualityLabelService { private QualityLabelPrintConfigMapper qualityLabelPrintConfigMapper; private QualityLabelPrintConfigDetailMapper qualityLabelPrintConfigDetailMapper; private StockMapper stockMapper; private LocationMapper locationMapper; private JdbcTemplate jdbcTemplate; private QualityLabelPrintLogService qualityLabelPrintLogService; private final static String WORKBENCH_LABEL_REPRINT = "WORKBENCH_LABEL_REPRINT"; private RemoteParamService remoteParamService; @Override public List printLabel(List snList,String labelUniqueCode,Boolean isPrint) { //查询产出合格库 List locationList = locationMapper.selectList(Wrappers.lambdaQuery().eq(Location::getLocType, "2")); List locationIdList = locationList.stream().map(Location::getId).collect(Collectors.toList()); //SN对应的实时库存产出合格库是否存在 for (String sn:snList) { List stockList = stockMapper.selectList(Wrappers.lambdaQuery() .eq(Stock::getPartBatchNo, sn) .in(Stock::getLocationId, locationIdList) .gt(Stock::getStockQuantity, 0)); if(CollectionUtil.isEmpty(stockList)){ throw new RuntimeException("{"+sn+"}库存记录中没有产出合格库"); } if(stockList.size()>1){ throw new RuntimeException("{"+sn+"}产出合格库库存记录大于一条"); } } QualityLabelPrintConfig qualityLabelPrintConfig = qualityLabelPrintConfigMapper.selectOne(Wrappers.lambdaQuery() .eq(QualityLabelPrintConfig::getLabelUniqueCode, labelUniqueCode)); if(qualityLabelPrintConfig==null){ throw new RuntimeException("没有此类标签信息"); } //查询标签详细配置信息 List qualityLabelPrintConfigDetailList = qualityLabelPrintConfigDetailMapper.selectList(Wrappers.lambdaQuery() .eq(QualityLabelPrintConfigDetail::getMid, qualityLabelPrintConfig.getId()) .eq(QualityLabelPrintConfigDetail::getIsActive,true)); List qualityLabelDTOList = new ArrayList<>(); List qualityLabelInputDTOList = new ArrayList<>(); //遍历SN号获取数据 for (String sn: snList) { List newQualityLabelPrintConfigDetailList = new ArrayList<>(); QualityLabelInputDTO qualityLabelInputDTO = new QualityLabelInputDTO(); for (QualityLabelPrintConfigDetail qualityLabelPrintConfigDetail:qualityLabelPrintConfigDetailList) { QualityLabelPrintConfigDetail newQualityLabelPrintConfigDetail = new QualityLabelPrintConfigDetail(); //若配置数据源,从SQL查询值赋给默认值 if(qualityLabelPrintConfigDetail.getIsConfigDataSource()){ String sql = qualityLabelPrintConfigDetail.getQrySql(); String replaceSn = "'"+sn+"'"; String replaceSql = sql.replace("#{sn}", replaceSn); List list = jdbcTemplate.queryForList(replaceSql, String.class); if(CollectionUtil.isNotEmpty(list)){ qualityLabelPrintConfigDetail.setDefaultValue(list.get(0)); } if("二维码".equals(qualityLabelPrintConfigDetail.getCaption())){ if(StringUtils.isNotBlank(qualityLabelPrintConfigDetail.getDefaultValue())){ JSONObject jsonObject = JSONObject.parseObject(qualityLabelPrintConfigDetail.getDefaultValue()); qualityLabelInputDTO.setPartNo(jsonObject.getString("part_no")); qualityLabelInputDTO.setIfsBatchNo(jsonObject.getString("lot_batch_no")); qualityLabelInputDTO.setQty(new BigDecimal(jsonObject.getString("qty_arrived"))); qualityLabelInputDTO.setWdr(jsonObject.getString("wdr")); } } } BeanUtil.copyProperties(qualityLabelPrintConfigDetail,newQualityLabelPrintConfigDetail); newQualityLabelPrintConfigDetailList.add(newQualityLabelPrintConfigDetail); } //返给前端标签样式以及数据DTO QualityLabelDTO qualityLabelDTO = new QualityLabelDTO(); qualityLabelDTO.setSn(sn); qualityLabelDTO.setQualityLabelPrintConfigDetail(newQualityLabelPrintConfigDetailList); qualityLabelDTO.setLabelUniqueCode(qualityLabelPrintConfig.getLabelUniqueCode()); qualityLabelDTO.setLabelDesc(qualityLabelPrintConfig.getLabelDesc()); qualityLabelDTO.setLabelSize(qualityLabelPrintConfig.getLabelSize()); qualityLabelDTO.setLabelTypeCode(qualityLabelPrintConfig.getLabelTypeCode()); qualityLabelDTO.setLabelTypeDesc(qualityLabelPrintConfig.getLabelTypeDesc()); qualityLabelDTOList.add(qualityLabelDTO); //labelInfo存储 JSONObject jsonObject = new JSONObject(); jsonObject.put("labelUniqueCode",qualityLabelPrintConfig.getLabelUniqueCode()); jsonObject.put("sn",sn); JSONArray array = new JSONArray(); for (QualityLabelPrintConfigDetail qualityLabelPrintConfigDetail:newQualityLabelPrintConfigDetailList) { JSONObject object = new JSONObject(); object.put("itemCode",qualityLabelPrintConfigDetail.getItemCode()); object.put("caption",qualityLabelPrintConfigDetail.getCaption()); object.put("defaultValue",qualityLabelPrintConfigDetail.getDefaultValue()); object.put("qrySql",qualityLabelPrintConfigDetail.getQrySql()); array.add(object); } jsonObject.put("qualityLabelPrintConfigDetail",array); //标签表存储数据 qualityLabelInputDTO.setPartBatchNo(sn); qualityLabelInputDTO.setLabelUniqueCode(labelUniqueCode); qualityLabelInputDTO.setLabelTypeCode(qualityLabelPrintConfig.getLabelTypeCode()); qualityLabelInputDTO.setLabelTypeDesc(qualityLabelPrintConfig.getLabelTypeDesc()); qualityLabelInputDTO.setLabelDesc(qualityLabelPrintConfig.getLabelDesc()); qualityLabelInputDTO.setLabelSize(qualityLabelPrintConfig.getLabelSize()); qualityLabelInputDTO.setLabelInfo(jsonObject.toJSONString()); qualityLabelInputDTOList.add(qualityLabelInputDTO); } List qualityLabelPrintLogList = new ArrayList<>(); //如果要打印 if(isPrint){ for (QualityLabelInputDTO qualityLabelInputDTO:qualityLabelInputDTOList) { Long mid = null; QualityLabel qualityLabel = baseMapper.selectOne(Wrappers.lambdaQuery() .eq(QualityLabel::getPartBatchNo, qualityLabelInputDTO.getPartBatchNo()) .eq(QualityLabel::getLabelTypeCode, qualityLabelInputDTO.getLabelTypeCode())); //有标签记录 if(qualityLabel!=null){ throw new RuntimeException("{"+qualityLabelInputDTO.getPartBatchNo()+"}标签记录中已有此SN号的标签类别码"); }else{ qualityLabelInputDTO.setPrintCount(1L); baseMapper.insert(qualityLabelInputDTO); mid = qualityLabelInputDTO.getId(); } //标签打印日志 QualityLabelPrintLog qualityLabelPrintLog = new QualityLabelPrintLog(); qualityLabelPrintLog.setMid(mid); qualityLabelPrintLog.setPartBatchNo(qualityLabelInputDTO.getPartBatchNo()); qualityLabelPrintLog.setQty(qualityLabelInputDTO.getQty()); qualityLabelPrintLog.setIfsBatchNo(qualityLabelInputDTO.getIfsBatchNo()); qualityLabelPrintLog.setPartNo(qualityLabelInputDTO.getPartNo()); qualityLabelPrintLog.setWdr(qualityLabelInputDTO.getWdr()); qualityLabelPrintLog.setLabelInfo(qualityLabelInputDTO.getLabelInfo()); qualityLabelPrintLog.setIfsBatchNo(qualityLabelInputDTO.getIfsBatchNo()); qualityLabelPrintLog.setPartNo(qualityLabelInputDTO.getPartNo()); qualityLabelPrintLog.setQty(qualityLabelInputDTO.getQty()); qualityLabelPrintLog.setWdr(qualityLabelInputDTO.getWdr()); qualityLabelPrintLogList.add(qualityLabelPrintLog); } qualityLabelPrintLogService.saveBatch(qualityLabelPrintLogList); }else{ //不打印直接保存进标签元素表 for (QualityLabelInputDTO qualityLabelInputDTO:qualityLabelInputDTOList) { QualityLabel qualityLabel = baseMapper.selectOne(Wrappers.lambdaQuery() .eq(QualityLabel::getPartBatchNo, qualityLabelInputDTO.getPartBatchNo()) .eq(QualityLabel::getLabelTypeCode, qualityLabelInputDTO.getLabelTypeCode())); //有标签记录 if (qualityLabel != null) { throw new RuntimeException("{"+qualityLabelInputDTO.getPartBatchNo()+"}标签记录中已有此SN号的标签类别码"); } else { baseMapper.insert(qualityLabelInputDTO); } } } return qualityLabelDTOList; } @Override public Boolean reprint(List idList){ List qualityLabelList = new ArrayList<>(); List qualityLabelPrintLogList = new ArrayList<>(); for (Long id:idList) { QualityLabel qualityLabel = baseMapper.selectById(id); //打印次数超过一次要输密码 if(qualityLabel.getPrintCount()>0){ return false; } qualityLabel.setPrintCount(1L); qualityLabelList.add(qualityLabel); //打印日志存储 QualityLabelPrintLog qualityLabelPrintLog = new QualityLabelPrintLog(); qualityLabelPrintLog.setMid(qualityLabel.getId()); qualityLabelPrintLog.setPartBatchNo(qualityLabel.getPartBatchNo()); qualityLabelPrintLog.setIfsBatchNo(qualityLabel.getIfsBatchNo()); qualityLabelPrintLog.setWdr(qualityLabel.getWdr()); qualityLabelPrintLog.setPartNo(qualityLabel.getPartNo()); qualityLabelPrintLog.setQty(qualityLabel.getQty()); qualityLabelPrintLog.setLabelInfo(qualityLabel.getLabelInfo()); qualityLabelPrintLogList.add(qualityLabelPrintLog); } this.updateBatchById(qualityLabelList); qualityLabelPrintLogService.saveBatch(qualityLabelPrintLogList); return true; } @Override public Boolean checkPassword(List idList,String password){ String res = remoteParamService.getByKey(WORKBENCH_LABEL_REPRINT, SecurityConstants.FROM_IN).getData(); if (null == password || password.length() == 0) { throw new RuntimeException("密码为空"); } if (null == res) { throw new RuntimeException("密码验证失败"); } if (!res.equals(password)) { throw new RuntimeException("密码错误"); } List qualityLabelList = new ArrayList<>(); List qualityLabelPrintLogList = new ArrayList<>(); for (Long id:idList) { QualityLabel qualityLabel = baseMapper.selectById(id); qualityLabel.setPrintCount(qualityLabel.getPrintCount()+1); qualityLabelList.add(qualityLabel); //打印日志存储 QualityLabelPrintLog qualityLabelPrintLog = new QualityLabelPrintLog(); qualityLabelPrintLog.setMid(qualityLabel.getId()); qualityLabelPrintLog.setPartBatchNo(qualityLabel.getPartBatchNo()); qualityLabelPrintLog.setIfsBatchNo(qualityLabel.getIfsBatchNo()); qualityLabelPrintLog.setWdr(qualityLabel.getWdr()); qualityLabelPrintLog.setPartNo(qualityLabel.getPartNo()); qualityLabelPrintLog.setQty(qualityLabel.getQty()); qualityLabelPrintLog.setLabelInfo(qualityLabel.getLabelInfo()); qualityLabelPrintLogList.add(qualityLabelPrintLog); } this.updateBatchById(qualityLabelList); qualityLabelPrintLogService.saveBatch(qualityLabelPrintLogList); return true; } @Override public Boolean logicDelete(QualityLabel qualityLabel) { return baseMapper.logicDelete(qualityLabel.getId()); } }