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<QualityHw19CodeBingMapper, QualityHw19CodeBing> 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.<QualityHw19Code>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.<QualityHw19CodeBing>lambdaQuery().eq(QualityHw19CodeBing::getBarCode, barCode));
|
if (count1 > 0) {
|
throw new RuntimeException("绑定中存在相同的19码");
|
}
|
Integer count2 = this.baseMapper.selectCount(Wrappers.<QualityHw19CodeBing>lambdaQuery().eq(QualityHw19CodeBing::getSerialNum, serialNum));
|
if (count2 > 0) {
|
throw new RuntimeException("绑定中存在相同的流水批次号");
|
}
|
Integer count3 = this.baseMapper.selectCount(Wrappers.<QualityHw19CodeBing>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<HwWeightLabelConfig> 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<QualityHw19CodeBingImportData> list) {
|
List<QualityHw19CodeBing> 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.<QualityHw19Code>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.<QualityHw19CodeBing>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.<QualityHw19CodeBing>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.<QualityHw19CodeBing>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<QualityHw19CodeBingImportData> 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<QualityHw19CodeBing> list = this.list(QueryWrapperUtil.gen(req));
|
List<QualityHw19CodeBingData> 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("导出失败");
|
}
|
}
|
}
|