package com.chinaztt.mes.quality.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.RandomUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.alibaba.fastjson.JSONObject; 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.common.wrapper.QueryWrapperUtil; import com.chinaztt.mes.quality.dto.Quality19PrintDTO; import com.chinaztt.mes.quality.entity.HwWeightLabelConfig; import com.chinaztt.mes.quality.entity.QualityHw19Code; import com.chinaztt.mes.quality.entity.QualityHw19CodeBing; import com.chinaztt.mes.quality.excel.QualityHw19CodeBingData; import com.chinaztt.mes.quality.excel.QualityHw19CodeBingImportData; import com.chinaztt.mes.quality.excel.QualityHw19CodeData; import com.chinaztt.mes.quality.excel.QualityHw19CodeImportData; import com.chinaztt.mes.quality.mapper.QualityHw19CodeBingMapper; import com.chinaztt.mes.quality.mapper.QualityHw19CodeMapper; import com.chinaztt.mes.quality.service.QualityHw19CodeBingService; import com.chinaztt.mes.quality.utils.HwWeightLabelConfigUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.math.BigDecimal; import java.net.URLEncoder; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 19条码生成绑定 * * @author pigx code generator * @date 2022-12-02 11:07:25 */ @Service public class QualityHw19CodeBingServiceImpl extends ServiceImpl implements QualityHw19CodeBingService { @Autowired private QualityHw19CodeMapper codeMapper; @Autowired private HwWeightLabelConfigUtils hwWeightLabelConfigUtils; @Override public void insert(QualityHw19CodeBing qualityHw19CodeBing) { //规则校验 String newMesCode = qualityHw19CodeBing.getNewMesCode(); JSONObject jsonObject = JSONObject.parseObject(newMesCode); //1.物料码校验 19条码物料码,mes码中物料码 String barCode = qualityHw19CodeBing.getBarCode(); QualityHw19Code qualityHw19Code = codeMapper.selectOne(Wrappers.lambdaQuery().eq(QualityHw19Code::getBarCode, barCode)); if (qualityHw19Code == null) { throw new RuntimeException("生码信息中未找到19条码"); } String materialCode = jsonObject.getString("material_code"); if (!qualityHw19Code.getMaterialCode().equals(materialCode)) { throw new RuntimeException("物料编码校验失败:与19生码中不一致"); } //2.生产数量校验 String qtyStr = jsonObject.getString("qty_arrived"); BigDecimal qty = new BigDecimal(qtyStr).multiply(new BigDecimal(1000)); if (qualityHw19Code.getLength().compareTo(qty) != 0) { throw new RuntimeException("生产数量校验:长度不一致"); } //3.唯一性校验 19唯一,批次、箱码唯一 String serialNum = jsonObject.getString("lot_batch_no"); Integer count1 = this.baseMapper.selectCount(Wrappers.lambdaQuery().eq(QualityHw19CodeBing::getBarCode, barCode)); if (count1 > 0) { throw new RuntimeException("绑定中存在相同的19码"); } Integer count2 = this.baseMapper.selectCount(Wrappers.lambdaQuery().eq(QualityHw19CodeBing::getSerialNum, serialNum)); if (count2 > 0) { throw new RuntimeException("绑定中存在相同的流水批次号"); } Integer count3 = this.baseMapper.selectCount(Wrappers.lambdaQuery().eq(QualityHw19CodeBing::getCodeBox, qualityHw19CodeBing.getCodeBox())); if (count3 > 0) { throw new RuntimeException("绑定中存在相同的箱码"); } //新增 qualityHw19CodeBing.setMaterialCode(materialCode); qualityHw19CodeBing.setSerialNum(serialNum); qualityHw19CodeBing.setLength(qty); qualityHw19CodeBing.setIsBind(1); qualityHw19CodeBing.setIsRelease(0); this.baseMapper.insert(qualityHw19CodeBing); } @Override public Quality19PrintDTO getPrintInfo(Long id) throws Exception { QualityHw19CodeBing qualityHw19CodeBing = this.baseMapper.selectById(id); Quality19PrintDTO resp = new Quality19PrintDTO(); resp.setLength(qualityHw19CodeBing.getLength()); resp.setSerialNum(qualityHw19CodeBing.getSerialNum()); resp.setProductDate(DateUtil.format(new Date(), "yyyy-MM")); //将原有的合格证码的规则改成:批次号 + & + 长度 resp.setQuaCer(qualityHw19CodeBing.getSerialNum()+"&"+qualityHw19CodeBing.getLength().stripTrailingZeros().toPlainString()); resp.setNewMesCode(qualityHw19CodeBing.getNewMesCode()); //获取产品名称及规格型号 //根据客户物料编码获取称重配置数据 List hwWeightLabelConfigList = hwWeightLabelConfigUtils.getConfigs(qualityHw19CodeBing.getMaterialCode()); //根据客户物料编码及长度获取对应的配置记录行 HwWeightLabelConfig hwWeightLabelConfig = hwWeightLabelConfigUtils.getConfigLine(hwWeightLabelConfigList, qualityHw19CodeBing.getLength()); //产品中文名称 resp.setProdNameCN(hwWeightLabelConfig.getProdNameCn()); //产品英文名称 resp.setProdNameEN(hwWeightLabelConfig.getProdNameEn()); //规格型号 resp.setModel(hwWeightLabelConfig.getModel()); //打印次数加1 this.baseMapper.updatePrintCount(id); return resp; } @Override public void importExcel(List list) { List qualityHw19CodeBingList = new ArrayList<>(); long barCodeNum = list.stream().map(QualityHw19CodeBingImportData::getBarCode).distinct().count(); if (barCodeNum < list.size()) { throw new RuntimeException("导入记录中19条码重复"); } long serialNum = list.stream().map(QualityHw19CodeBingImportData::getSerialNum).distinct().count(); if (serialNum < list.size()) { throw new RuntimeException("导入记录中流水批次号重复"); } long codeBoxNum = list.stream().map(QualityHw19CodeBingImportData::getCodeBox).distinct().count(); if (codeBoxNum < list.size()) { throw new RuntimeException("导入记录中箱码重复"); } for (QualityHw19CodeBingImportData qualityHw19CodeBingImportData : list) { //1.物料码校验 19条码物料码,mes码中物料码 if(StringUtils.isBlank(qualityHw19CodeBingImportData.getBarCode())){ throw new RuntimeException("19条码不能为空"); } if(StringUtils.isBlank(qualityHw19CodeBingImportData.getMaterialCode())){ throw new RuntimeException("物料编码不能为空"); } QualityHw19Code qualityHw19Code = codeMapper.selectOne(Wrappers.lambdaQuery().eq(QualityHw19Code::getBarCode, qualityHw19CodeBingImportData.getBarCode())); if (qualityHw19Code == null) { throw new RuntimeException("生码信息中未找到19条码"); } if (!qualityHw19Code.getMaterialCode().equals(qualityHw19CodeBingImportData.getMaterialCode())) { throw new RuntimeException("物料编码校验失败:与19生码中不一致"); } //2.生产数量校验 if(qualityHw19CodeBingImportData.getLength()==null){ throw new RuntimeException("生产数量不能为空"); } if (qualityHw19Code.getLength().compareTo(qualityHw19CodeBingImportData.getLength()) != 0) { throw new RuntimeException("生产数量校验:长度不一致"); } //3.唯一性校验 19唯一,批次、箱码唯一 Integer count1 = this.baseMapper.selectCount(Wrappers.lambdaQuery().eq(QualityHw19CodeBing::getBarCode, qualityHw19CodeBingImportData.getBarCode())); if (count1 > 0) { throw new RuntimeException("绑定中存在相同的19码"); } if(StringUtils.isBlank(qualityHw19CodeBingImportData.getSerialNum())){ throw new RuntimeException("流水批次号不能为空"); } Integer count2 = this.baseMapper.selectCount(Wrappers.lambdaQuery().eq(QualityHw19CodeBing::getSerialNum, qualityHw19CodeBingImportData.getSerialNum())); if (count2 > 0) { throw new RuntimeException("绑定中存在相同的流水批次号"); } if(StringUtils.isBlank(qualityHw19CodeBingImportData.getCodeBox())){ throw new RuntimeException("箱码不能为空"); } Integer count3 = this.baseMapper.selectCount(Wrappers.lambdaQuery().eq(QualityHw19CodeBing::getCodeBox, qualityHw19CodeBingImportData.getCodeBox())); if (count3 > 0) { throw new RuntimeException("绑定中存在相同的箱码"); } //是否合格非空判断 if(qualityHw19CodeBingImportData.getIsQualified()==null){ throw new RuntimeException("是否合格不能为空"); } //新mes码字段非空判断 if(StringUtils.isBlank(qualityHw19CodeBingImportData.getPartNo())){ throw new RuntimeException("零件号不能为空"); } if(StringUtils.isBlank(qualityHw19CodeBingImportData.getLotBatchNo())){ throw new RuntimeException("ifs批次号不能为空"); } if(qualityHw19CodeBingImportData.getQtyArrived()==null){ throw new RuntimeException("数量不能为空"); } if(StringUtils.isBlank(qualityHw19CodeBingImportData.getWdr())){ throw new RuntimeException("wdr号不能为空"); } if(StringUtils.isBlank(qualityHw19CodeBingImportData.getUnitMeas())){ throw new RuntimeException("Meas单位不能为空"); } //将新MES码转化为json,存入数据库相应字段中 JSONObject jsonObject = new JSONObject(); jsonObject.put("part_no",qualityHw19CodeBingImportData.getPartNo()); jsonObject.put("lot_batch_no",qualityHw19CodeBingImportData.getLotBatchNo()); jsonObject.put("qty_arrived",qualityHw19CodeBingImportData.getQtyArrived()); jsonObject.put("wdr",qualityHw19CodeBingImportData.getWdr()); jsonObject.put("unit_meas",qualityHw19CodeBingImportData.getUnitMeas()); jsonObject.put("material_code",qualityHw19CodeBingImportData.getMaterialCode()); QualityHw19CodeBing qualityHw19CodeBing = new QualityHw19CodeBing(); BeanUtils.copyProperties(qualityHw19CodeBingImportData,qualityHw19CodeBing); qualityHw19CodeBing.setNewMesCode(jsonObject.toJSONString()); qualityHw19CodeBingList.add(qualityHw19CodeBing); } saveBatch(qualityHw19CodeBingList); } @Override public void exportModel(HttpServletResponse response) throws IOException { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("UTF-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode("19条码绑定模板", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); try { //新建ExcelWriter ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build(); //获取sheet0对象 WriteSheet mainSheet = EasyExcel.writerSheet(0, "19条码绑定").head(QualityHw19CodeBingImportData.class).build(); //向sheet0写入数据 传入空list这样只导出表头 List respList = new ArrayList<>(); excelWriter.write(respList, mainSheet); //关闭流 excelWriter.finish(); } catch (IOException e) { throw new RuntimeException("导出失败"); } } @Override public void exportInfo(HttpServletResponse response, QualityHw19CodeBing req) throws IOException { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("UTF-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode("19条码绑定", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); try { //新建ExcelWriter ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build(); //获取sheet0对象 WriteSheet mainSheet = EasyExcel.writerSheet(0, "19条码").head(QualityHw19CodeBingData.class).build(); //向sheet0写入数据 传入空list这样只导出表头 List list = this.list(QueryWrapperUtil.gen(req)); List respList = new ArrayList<>(); for (QualityHw19CodeBing qualityHw19CodeBing : list) { QualityHw19CodeBingData resp = new QualityHw19CodeBingData(); BeanUtils.copyProperties(qualityHw19CodeBing,resp); LocalDateTime createTime = qualityHw19CodeBing.getCreateTime(); LocalDateTime updateTime = qualityHw19CodeBing.getUpdateTime(); if (createTime != null) { resp.setCreateTime(createTime.toString().replace("T"," ")); resp.setUpdateTime(updateTime.toString().replace("T"," ")); } respList.add(resp); } excelWriter.write(respList, mainSheet); //关闭流 excelWriter.finish(); } catch (IOException e) { throw new RuntimeException("导出失败"); } } }