You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
424 lines
15 KiB
424 lines
15 KiB
package com.ccl.tt.service.impl;
|
|
|
|
import java.io.BufferedOutputStream;
|
|
import java.io.File;
|
|
import java.io.FileOutputStream;
|
|
import java.sql.Timestamp;
|
|
import java.util.ArrayList;
|
|
import java.util.Calendar;
|
|
import java.util.Date;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.zip.ZipEntry;
|
|
import java.util.zip.ZipOutputStream;
|
|
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.security.core.Authentication;
|
|
import org.springframework.security.core.context.SecurityContextHolder;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
import com.ccl.tt.dao.BasicDao;
|
|
import com.ccl.tt.dao.FinalRollDao;
|
|
import com.ccl.tt.dao.PrepressDao;
|
|
import com.ccl.tt.data.PartData;
|
|
import com.ccl.tt.entity.Sequence;
|
|
import com.ccl.tt.entity.SoInfo;
|
|
import com.ccl.tt.model.SoOrderFileHist;
|
|
import com.ccl.tt.repository.SequenceRepository;
|
|
import com.ccl.tt.repository.SoInfoRepository;
|
|
import com.ccl.tt.service.PrepressService;
|
|
import com.ccl.tt.utils.DateUtils;
|
|
import com.ccl.tt.utils.SerialUtil;
|
|
|
|
/**
|
|
*
|
|
* @ClassName: PrepressServiceImpl
|
|
* @Description: 印前的方法实现
|
|
* @author: LR
|
|
* @date: 2024年6月18日 下午5:59:42
|
|
* @Copyright:
|
|
*/
|
|
@Service
|
|
public class PrepressServiceImpl implements PrepressService {
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(PrepressServiceImpl.class);
|
|
|
|
@Value("${ifs.datasource.sql.order}")
|
|
String ifsOrderSql;
|
|
@Value("${item.filePath}")
|
|
private String filePath;
|
|
|
|
@Autowired
|
|
private PrepressDao prepressDao;
|
|
@Autowired
|
|
private BasicDao basicDao;
|
|
@Autowired
|
|
private SoInfoRepository soInfoRepo;
|
|
@Autowired
|
|
private SequenceRepository seqRepo;
|
|
@Autowired
|
|
private FinalRollDao finalRollDao;
|
|
|
|
@Override
|
|
public Map<String, Object> getIfsOrder(String orderNo) {
|
|
Map<String, Object> resultMap = prepressDao.getResultMapBySql(ifsOrderSql, orderNo);
|
|
//判断是否非空
|
|
if (resultMap == null || resultMap.isEmpty()) {
|
|
throw new RuntimeException("Order information not found for " + orderNo + ":");
|
|
}
|
|
//校验工单是否存在当前的物料编码
|
|
String partNo = String.valueOf(resultMap.get("part_no"));
|
|
//判断物料是否存在
|
|
if(partNo == null || "".equals(partNo)) {
|
|
throw new RuntimeException("Material information not found for " + orderNo + "!");
|
|
}
|
|
//查询物料信息
|
|
PartData part = basicDao.getPartDataByPartNo(partNo);
|
|
//判断是否存在
|
|
if(null == part) {
|
|
throw new RuntimeException("Please maintain material code first:"+partNo+"!");
|
|
}
|
|
//填充物料信息
|
|
resultMap.put("revNo", part.getRevNo());
|
|
resultMap.put("partNo", part.getPartNo());
|
|
resultMap.put("partDesc", part.getPartDesc());
|
|
resultMap.put("apn", part.getSerialApn());
|
|
resultMap.put("customerPartNo", part.getCustomerPartNo());
|
|
resultMap.put("standardRollQty", part.getPackageQty());
|
|
resultMap.put("noOfCross", part.getCross());
|
|
resultMap.put("projectCode", part.getProjectCode());
|
|
return resultMap;
|
|
}
|
|
|
|
@Override
|
|
@Transactional
|
|
public void addSoInfo(SoInfo soInfo) throws Exception {
|
|
String orderNo = soInfo.getOrderNo();
|
|
soInfo.setCreatedDate(new Timestamp(System.currentTimeMillis()));
|
|
soInfo.setStatus(SoInfo.CREATED);
|
|
soInfo.setIsrework("N");
|
|
String needDateStr = soInfo.getNeedDate();
|
|
Date needDate = DateUtils.getDateByParten(needDateStr, "yyyy-MM-dd");
|
|
String currentDateStr = DateUtils.getStringDate(new Date(), "yyyy-MM-dd");
|
|
Date currentDate = DateUtils.getAddNumsDateByType(DateUtils.getDateByParten(currentDateStr, "yyyy-MM-dd"), 3, "DAY");
|
|
//判断是否需要
|
|
if(needDate.getTime() > currentDate.getTime()) {
|
|
throw new RuntimeException("Order planned start date is too late, please contact planning to modify!");
|
|
}
|
|
//判断是否存在
|
|
SoInfo tempData = soInfoRepo.findByOrderNo(orderNo);
|
|
if(tempData != null) {
|
|
throw new RuntimeException("Current order already exists!");
|
|
}
|
|
soInfo.setFirstRollTime(needDate);
|
|
//需要判断当前的数量是否能够整排
|
|
int inputLotSize = soInfo.getInputLotSize();
|
|
int cross = soInfo.getNoOfCross();
|
|
if(inputLotSize % cross > 0) {
|
|
inputLotSize = ((inputLotSize / cross) + 1) * cross;
|
|
//重置工单得生产数量
|
|
soInfo.setInputLotSize(inputLotSize);
|
|
}
|
|
soInfo.validate();
|
|
//查询是否物料编码是否存在
|
|
String partNo = soInfo.getPartNo();
|
|
//判断物料是否存在
|
|
if(partNo == null || "".equals(partNo)) {
|
|
throw new RuntimeException("Material code cannot be empty!");
|
|
}
|
|
//查询物料信息
|
|
PartData part = basicDao.getPartDataByPartNo(partNo);
|
|
//判断是否存在
|
|
if(null == part) {
|
|
throw new RuntimeException("Please maintain material code first:"+partNo+"!");
|
|
}
|
|
|
|
//设置参数
|
|
soInfo.setLaminationFlag("Y");
|
|
//查询长度是否符合要求
|
|
String apn = soInfo.getApn();
|
|
if(apn.length() != 11) {
|
|
throw new RuntimeException("Length of apn does not comply with the rules!");
|
|
}
|
|
String revNo = soInfo.getRevNo();
|
|
if(revNo.length() != 1) {
|
|
throw new RuntimeException("revNo length does not comply with the rules!");
|
|
}
|
|
//设置参数
|
|
soInfo.setCustomerPartNoAll(part.getCustomerPartNo());
|
|
|
|
soInfoRepo.save(soInfo);
|
|
}
|
|
|
|
@Override
|
|
@Transactional
|
|
public void genSerials(Integer id) {
|
|
//查询工单得信息
|
|
SoInfo soInfo = soInfoRepo.findOne(id);
|
|
//校验工单得信息
|
|
if (soInfo == null){
|
|
throw new RuntimeException("Order not found!");
|
|
}
|
|
if (soInfo.getSerialsGenDate() != null){
|
|
throw new RuntimeException("Already generated!");
|
|
}
|
|
//产生码包的模板
|
|
String snTemplate = genSerialTemplate(soInfo);
|
|
if(snTemplate == null || "".equals(snTemplate)){
|
|
throw new RuntimeException("eeeecode not found!");
|
|
}
|
|
soInfo.setSerialsTemplate(snTemplate);
|
|
|
|
//find existing
|
|
Sequence seq = seqRepo.findByTag(snTemplate);
|
|
if (seq == null){
|
|
seq = new Sequence();
|
|
seq.setTag(snTemplate);
|
|
seq.setSeq(0);
|
|
}
|
|
|
|
soInfo.setSerialStart(seq.getSeq() + 1);
|
|
soInfo.setSerialEnd(soInfo.getSerialStart() + soInfo.getInputLotSize() - 1);
|
|
//调用方法产生当前码包文件
|
|
List<String> serialList = this.genSoOrderSerialList(soInfo);
|
|
|
|
//公共参数
|
|
String orderNo = soInfo.getOrderNo();
|
|
String partNo = soInfo.getPartNo();
|
|
//生成单排的文件
|
|
this.genSingleRowZipSerialFile(orderNo, partNo, serialList);
|
|
//生成多排的文件
|
|
this.genMultiRowZipSerialFile(orderNo, partNo, serialList);
|
|
|
|
//保存工单得信息
|
|
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
|
soInfo.setRolls(0);
|
|
soInfo.setStatus(SoInfo.GENERATED);
|
|
soInfo.setSerialsGenBy(authentication.getName());
|
|
soInfo.setSerialsGenDate(new Timestamp(System.currentTimeMillis()));
|
|
//保存sn的记录数据 以前2023RQ添加的
|
|
finalRollDao.deleteSNTemplateCopy(soInfo);
|
|
finalRollDao.saveSNTemplateCopy(soInfo);
|
|
//保存工单得信息
|
|
soInfoRepo.save(soInfo);
|
|
//保存序列号的信息
|
|
seq.setSeq(soInfo.getSerialEnd());
|
|
seqRepo.save(seq);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @Title: genMultiRowZipSerialFile
|
|
* @Description: 创建多排的文件
|
|
* @author: LR
|
|
* @date 2024年5月22日 下午2:48:25
|
|
* @return: void
|
|
* @throws
|
|
*/
|
|
public void genMultiRowZipSerialFile(String orderNo, String partNo, List<String> serialList) {
|
|
//查询物料的信息
|
|
PartData part = basicDao.getPartDataByPartNo(partNo);
|
|
int crossNumber = part.getCross();
|
|
String apn = part.getApn();
|
|
String revNo = part.getRevNo();
|
|
int serialSize = serialList.size();
|
|
int rows = serialSize / crossNumber;
|
|
String baseDatePath = DateUtils.getStringDate(new Date(), "yyyy-MM-dd");
|
|
String sourceFilePath = filePath + "\\" +baseDatePath;
|
|
File sourceFile = new File(sourceFilePath);
|
|
//判断是否存在不存在创建目录
|
|
if(!sourceFile.exists()) {
|
|
sourceFile.mkdirs();
|
|
}
|
|
//创建文件
|
|
long start = System.currentTimeMillis();
|
|
String zipFileName = orderNo+"-"+partNo+".zip";
|
|
File zipFile = new File(sourceFile, zipFileName);
|
|
try (FileOutputStream fos = new FileOutputStream(zipFile);
|
|
BufferedOutputStream bos = new BufferedOutputStream(fos);
|
|
ZipOutputStream zos = new ZipOutputStream(bos);)
|
|
{
|
|
String fileName = orderNo+"-"+partNo+".csv";
|
|
ZipEntry entry = new ZipEntry(fileName);
|
|
zos.putNextEntry(entry);
|
|
//写入ID
|
|
zos.write(( "ID-1").getBytes("UTF-8"));
|
|
zos.write((",").getBytes("UTF-8"));
|
|
//创建表头
|
|
for(int i = 1; i <= crossNumber; i++) {
|
|
//首先循环生成表头的文件
|
|
zos.write(("SN"+i).getBytes("UTF-8"));
|
|
zos.write((",").getBytes("UTF-8"));
|
|
}
|
|
//换行写数据
|
|
zos.write(("\r\n").getBytes("UTF-8"));
|
|
//双重for循环开始写入数据
|
|
//外层for循环写行
|
|
for(int i = 0; i < rows; i++) {
|
|
//写入行数
|
|
zos.write((i + 1+"").getBytes("UTF-8"));
|
|
zos.write((",").getBytes("UTF-8"));
|
|
//内层循环循环列
|
|
for(int j = 0; j < crossNumber; j++) {
|
|
int serialIndex = (j * rows) + i;
|
|
//写数据
|
|
zos.write((serialList.get(serialIndex)).getBytes("UTF-8"));
|
|
zos.write((",").getBytes("UTF-8"));
|
|
}
|
|
//换行写数据
|
|
zos.write(("\r\n").getBytes("UTF-8"));
|
|
}
|
|
//把数据刷入缓存中
|
|
zos.flush();
|
|
bos.flush();
|
|
fos.flush();
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
//记录时间
|
|
long duration = System.currentTimeMillis() - start;
|
|
logger.info("Generated SN for order [{}], size={}, duration={}.",
|
|
orderNo, serialList.size(), duration);
|
|
//创建文件记录
|
|
//创建文件记录
|
|
SoOrderFileHist fileHist = new SoOrderFileHist();
|
|
fileHist.setSite("41");
|
|
fileHist.setOrderNo(orderNo);
|
|
fileHist.setFileName(zipFileName);
|
|
fileHist.setFilePath(zipFile.getAbsolutePath());
|
|
fileHist.setIsMulti("Y");
|
|
//保存当前的文件记录
|
|
prepressDao.insertSoOrderFileHist(fileHist);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @Title: genSingleRowZipSerialFile
|
|
* @Description:
|
|
* @author: LR
|
|
* @date 2024年5月22日 下午2:00:30
|
|
* @return: void
|
|
* @throws
|
|
*/
|
|
public void genSingleRowZipSerialFile(String orderNo, String partNo, List<String> serialList) {
|
|
//公共参数
|
|
String baseDatePath = DateUtils.getStringDate(new Date(), "yyyy-MM-dd");
|
|
String sourceFilePath = filePath + "\\" +baseDatePath;
|
|
File sourceFile = new File(sourceFilePath);
|
|
//判断是否存在不存在创建目录
|
|
if(!sourceFile.exists()) {
|
|
sourceFile.mkdirs();
|
|
}
|
|
//创建文件
|
|
long start = System.currentTimeMillis();
|
|
String zipFileName = orderNo+"single.zip";
|
|
File zipFile = new File(sourceFile, zipFileName);
|
|
try (FileOutputStream fos = new FileOutputStream(zipFile);
|
|
BufferedOutputStream bos = new BufferedOutputStream(fos);
|
|
ZipOutputStream zos = new ZipOutputStream(bos);)
|
|
{
|
|
String fileName = orderNo+"single.csv";
|
|
ZipEntry entry = new ZipEntry(fileName);
|
|
zos.putNextEntry(entry);
|
|
//创建表头
|
|
zos.write(("SN").getBytes("UTF-8"));
|
|
zos.write((",").getBytes("UTF-8"));
|
|
zos.write(( "ID" + "\r\n").getBytes("UTF-8"));
|
|
//循环开始写入数据
|
|
for(int i = 0; i < serialList.size(); i++) {
|
|
//写数据
|
|
zos.write((serialList.get(i)).getBytes("UTF-8"));
|
|
zos.write((",").getBytes("UTF-8"));
|
|
zos.write(((i + 1) + "\r\n").getBytes("UTF-8"));
|
|
}
|
|
//把数据刷入缓存中
|
|
zos.flush();
|
|
bos.flush();
|
|
fos.flush();
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
|
|
long duration = System.currentTimeMillis() - start;
|
|
logger.info("Generated SN for order [{}], size={}, duration={}.",
|
|
orderNo, serialList.size(), duration);
|
|
//创建文件记录
|
|
SoOrderFileHist fileHist = new SoOrderFileHist();
|
|
fileHist.setSite("41");
|
|
fileHist.setOrderNo(orderNo);
|
|
fileHist.setFileName(zipFileName);
|
|
fileHist.setFilePath(zipFile.getAbsolutePath());
|
|
fileHist.setIsMulti("N");
|
|
//保存当前的文件记录
|
|
prepressDao.insertSoOrderFileHist(fileHist);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @Title: genSoOrderSerialList
|
|
* @Description: 产生按照要求符合条件的码包数据
|
|
* @author: LR
|
|
* @date 2024年6月19日 下午3:01:40
|
|
* @return: List<String>
|
|
* @throws
|
|
*/
|
|
public List<String> genSoOrderSerialList(SoInfo soInfo) {
|
|
List<String> snList = new ArrayList<>();
|
|
String partNo = soInfo.getPartNo();
|
|
//查询当前物料的数据
|
|
PartData part = basicDao.getPartDataByPartNo(partNo);
|
|
String codeType = part.getCodeType();
|
|
for (int snIndex = soInfo.getSerialStart(); snIndex <= soInfo.getSerialEnd(); snIndex++) {
|
|
String currentSn = SerialUtil.getSerialNo(soInfo.getSerialsTemplate(), snIndex, codeType);
|
|
snList.add(currentSn);
|
|
}
|
|
return snList;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @Title: genSerialTemplate
|
|
* @Description: 产生码包的模板的方法
|
|
* @author: LR
|
|
* @date 2024年6月19日 下午2:50:09
|
|
* @return: String
|
|
* @throws
|
|
*/
|
|
public String genSerialTemplate(SoInfo soInfo) {
|
|
//公共参数
|
|
String partNo = soInfo.getPartNo();
|
|
//查询物料的属性
|
|
PartData part = basicDao.getPartDataByPartNo(partNo);
|
|
//查询相关的参数
|
|
String codeType = part.getCodeType();
|
|
|
|
Calendar cal = Calendar.getInstance();
|
|
cal.setTime(soInfo.getSerialsDate());
|
|
String platCode3 = "J4K";
|
|
String year1 = String.valueOf(cal.get(Calendar.YEAR) % 10);
|
|
String week2 = org.apache.commons.lang3.StringUtils.leftPad(String.valueOf(cal.get(Calendar.WEEK_OF_YEAR)), 2, '0');
|
|
String day1 = String.valueOf(cal.get(Calendar.DAY_OF_WEEK));
|
|
String code4 = "____";
|
|
String appleEEEE4 = part.getEeeeCode();
|
|
String rev1 = part.getRevNo();
|
|
String delimiter1 = "+";
|
|
String apn = part.getSerialApn();
|
|
String checkSum1 = "_";
|
|
String snLeft7 = platCode3 + year1 + week2 + day1;
|
|
String snMiddle5 = appleEEEE4 + rev1;
|
|
String snRight = delimiter1 + apn;
|
|
String snFormat = null;
|
|
//区分不同的类型
|
|
if ("2024".equals(codeType)) {
|
|
snFormat = snLeft7 + code4 + snMiddle5 + checkSum1 + snRight;
|
|
}else if("2025".equals(codeType)) {
|
|
snFormat = snLeft7 + code4 + snMiddle5 + checkSum1;
|
|
}
|
|
return snFormat;
|
|
}
|
|
|
|
}
|