package com.northglass.service.optpattern;
|
|
import java.io.BufferedReader;
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.io.FileReader;
|
import java.io.IOException;
|
import java.io.InputStreamReader;
|
import java.text.DecimalFormat;
|
import java.text.NumberFormat;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Locale;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import com.northglass.constants.GlassColor;
|
import com.northglass.constants.ShelfTaskFlag;
|
import com.northglass.constants.ShelfTaskType;
|
import com.northglass.constants.StateConstants.RawPackageTxtState;
|
import com.northglass.constants.StateConstants.ShelfHoistState;
|
import com.northglass.constants.StateConstants.ShelfRankState;
|
import com.northglass.constants.StateConstants.ShelfTaskState;
|
import com.northglass.entity.ManufactureBatch;
|
import com.northglass.entity.OptPattern;
|
import com.northglass.entity.RawPackage;
|
import com.northglass.entity.RawPackageTxt;
|
import com.northglass.entity.ShelfHoist;
|
import com.northglass.entity.ShelfRank;
|
import com.northglass.entity.ShelfTask;
|
import com.northglass.entity.SingalGlass;
|
import com.northglass.repository.OptPatternDao;
|
import com.northglass.repository.RawPackageDao;
|
import com.northglass.repository.RawPackageTxtDao;
|
import com.northglass.repository.ShelfHoistDao;
|
import com.northglass.repository.ShelfRankDao;
|
import com.northglass.repository.ShelfTaskDao;
|
import com.northglass.repository.SingalGlassDao;
|
|
@Component
|
@Transactional
|
public class OptPatternService {
|
|
private static final Logger LOGGER = LoggerFactory.getLogger(OptPatternService.class);
|
|
@Autowired
|
private OptPatternDao patternDao;
|
|
@Autowired
|
private OptPatternDao optPatternDao;
|
|
@Autowired
|
private RawPackageTxtDao rawPackageTxtDao;
|
|
@Autowired
|
private RawPackageDao rawPackageDao;
|
|
@Autowired
|
private ShelfRankDao shelfRankDao;
|
|
@Autowired
|
private ShelfHoistDao shelfHoistDao;
|
|
@Autowired
|
private ShelfTaskDao shelfTaskDao;
|
|
@Autowired
|
private SingalGlassDao singalGlassDao;
|
|
/**
|
* 解析OPT文件
|
*
|
* @param optFilePath
|
* @return
|
*/
|
public String processOptFile(String optFilePath, String s) {
|
try {
|
// 生成批次信息
|
// ManufactureBatch batch =
|
// manufactureBatchDao.findWaitingManufactureBatch();
|
// 解析OPT文件,获取关键数据,并保存到数据库中
|
parseOptFile(optFilePath, s);
|
return "success";
|
} catch (IOException e) {
|
e.printStackTrace();
|
return "failure";
|
}
|
}
|
|
/**
|
* 解析OPT文件,获取Pattern数据,并保存到数据库中
|
*
|
* @param optFilePath
|
* opt文件路径
|
* @throws IOException
|
*/
|
public void parseOptFile(String optFilePath, String baseFileName) throws IOException {
|
SingalGlass glass = null;
|
//创建SingalGlass
|
List<SingalGlass> glasses = new ArrayList<SingalGlass>();
|
// 创建任务
|
RawPackageTxt txt = new RawPackageTxt(baseFileName, "", RawPackageTxtState.WAIT_ASSIGNE, new Date());
|
rawPackageTxtDao.save(txt);
|
|
String fileName = optFilePath.substring(optFilePath.lastIndexOf(File.separator) + 1,
|
optFilePath.lastIndexOf("."));
|
String numberPrefix = fileName + "_";
|
// 这里出现了中文乱码,所以设置了一下,不知道为什么设置为“UTF—8”会乱码,“GBK”才正常
|
// BufferedReader bufReader = new BufferedReader(new
|
// FileReader(optFilePath));
|
InputStreamReader isr = new InputStreamReader(new FileInputStream(optFilePath), "GBK");
|
BufferedReader bufReader = new BufferedReader(isr);
|
|
DecimalFormat dFormat = new DecimalFormat("00");
|
OptPattern pattern = new OptPattern();
|
int index = 1;
|
// 将小片信息放到
|
double thickness = 0;
|
String line = "";
|
// List<Glass> glasses = new ArrayList<Glass>();
|
while (line != null) {
|
line = bufReader.readLine();
|
System.out.println(line);
|
if (line == null) {
|
break;
|
}
|
if (line.trim().length() == 0) {
|
continue;
|
}
|
//line.length() == 13 &&
|
if (line.equalsIgnoreCase("[OPT_Pattern]")) {
|
String optId = numberPrefix + dFormat.format(index);
|
pattern = new OptPattern();
|
pattern.setOptId(optId);
|
//初始化
|
glass=null;
|
glasses=new ArrayList<SingalGlass>();
|
}
|
|
if (line.length() > 7 && line.startsWith("GlassID")) {
|
String glassId = line.substring(8);
|
pattern.setGlassId(glassId);
|
// 设置玻璃的颜色
|
boolean t = true;
|
String name = "";
|
for (int i = 0; i < glassId.length(); i++) {
|
if (Character.isDigit(glassId.charAt(i)) && t) {
|
|
} else {
|
t = false;
|
name += glassId.charAt(i);
|
}
|
}
|
// color = glassId.replaceAll("\\d+","");
|
pattern.setColor(name);
|
}
|
|
if (line.length() > 16 && line.startsWith("GlassDescription")) {
|
String glassDescription = line.substring(17);
|
pattern.setGlassDescription(glassDescription);
|
}
|
|
if (line.length() > 14 && line.startsWith("GlassThickness")) {
|
thickness = Double.parseDouble(line.substring(15));
|
pattern.setGlassThickness(thickness);
|
}
|
|
if (line.length() > 6 && line.startsWith("Pieces")) {
|
String pieces = line.substring(7);
|
pattern.setPieces(Integer.parseInt(pieces));
|
}
|
|
if (line.length() > 5 && line.startsWith("Width")) {
|
String width = line.substring(6);
|
pattern.setWidth(Double.parseDouble(width));
|
}
|
|
|
|
if (line.indexOf("Info=") > 0) {
|
// String infoValue = line.substring(line.indexOf("Info="));
|
String equalValue = line.substring(line.indexOf("Info=") + 5);
|
|
//注释。带入的id可能出错
|
// if (previousInfoData.equals(infoValue)) {
|
// glass.setPieces(glass.getPieces() + 1);
|
// singalGlassDao.save(glass);
|
// } else {
|
// previousInfoData = infoValue;
|
// glass = new SingalGlass(0, pattern.getGlassThickness(), 1, equalValue);
|
// glass.setManufacture_batch(txt.getTxt_name());
|
// glass.setOptPattern(pattern);
|
// glass.setColor(pattern.getColor());
|
// singalGlassDao.save(glass);
|
// glasses.add(glass);
|
// }
|
if (glasses.size()>0) {
|
for (int j=0;j<glasses.size();j++) {
|
SingalGlass glass2 = glasses.get(j);
|
if (glass2.getInfoId().equals(equalValue)) {
|
glass2.setPieces(glass2.getPieces()+1);
|
singalGlassDao.save(glass2);
|
break;
|
}
|
if (j==glasses.size()-1) {
|
glass = new SingalGlass(0, pattern.getGlassThickness(), 1, equalValue);
|
glass.setManufacture_batch(txt.getTxt_name());
|
glass.setOptPattern(pattern);
|
glass.setRemove("0");//倒角
|
glass.setPolish("0");//抛光
|
glass.setColor(pattern.getColor());
|
glass.setRawPackageTxt(txt);
|
singalGlassDao.save(glass);
|
glasses.add(glass);
|
break;
|
}
|
}
|
}else {
|
glass = new SingalGlass(0, pattern.getGlassThickness(), 1, equalValue);
|
glass.setManufacture_batch(txt.getTxt_name());
|
glass.setOptPattern(pattern);
|
glass.setRemove("0");
|
glass.setPolish("0");
|
glass.setColor(pattern.getColor());
|
glass.setRawPackageTxt(txt);
|
singalGlassDao.save(glass);
|
glasses.add(glass);
|
}
|
|
|
|
}
|
|
if (line.indexOf("[Info]") != -1) {
|
line = bufReader.readLine();
|
if (line.indexOf("Id=") != -1) {
|
String Id = line.substring(line.indexOf("=") + 1);
|
for (SingalGlass gla : glasses) {
|
if (gla.getInfoId().equals(Id)) {
|
line = bufReader.readLine();
|
while (!line.startsWith("PzNOTE20")) {
|
//新的opt对接 START
|
if (line.length() > 7 && line.startsWith("PzNOTE")) {
|
String PzNOTE = line.substring(7);//合同号
|
}
|
if (line.length() > 7 && line.startsWith("PzNOTE1")) {
|
String PzNOTE1 = line.substring(8);//编号
|
}
|
if (line.length() > 7 && line.startsWith("PzNOTE2")) {
|
String PzNOTE2 = line.substring(8);//加工图号
|
}
|
if (line.length() > 7 && line.startsWith("PzNOTE3")) {
|
String PzNOTE3 = line.substring(8);//成品名称
|
gla.setProduction(PzNOTE3);
|
}
|
if (line.length() > 7 && line.startsWith("PzNOTE4")) {
|
String PzNOTE4 = line.substring(8);//面积
|
}
|
if (line.length() > 7 && line.startsWith("PzNOTE5")) {
|
String PzNOTE5 = line.substring(8);//项目名称
|
gla.setApplication(PzNOTE5);
|
}
|
if (line.length() > 7 && line.startsWith("PzNOTE6")) {
|
String PzNOTE6 = line.substring(8);//明细备注
|
}
|
if (line.length() > 7 && line.startsWith("PzNOTE7")) {
|
String PzNOTE7 = line.substring(8);//流程卡号
|
// gla.setApart_id(PzNOTE7);
|
}
|
if (line.length() > 7 && line.startsWith("PzNOTE8")) {
|
String PzNOTE8 = line.substring(8);//玻璃编号
|
LOGGER.debug("PzNOTE8:"+PzNOTE8);
|
String string = PzNOTE8.substring(PzNOTE8.lastIndexOf("-")+1);
|
// String name[] = PzNOTE8.split("-");
|
// String string= name[name.length-1];
|
LOGGER.debug("string:"+string.length());
|
gla.setSort(Integer.parseInt(string.trim()));
|
}
|
if (line.length() > 7 && line.startsWith("PzNOTE9")) {
|
String PzNOTE9 = line.substring(8);//加工要求
|
gla.setPiece_sign(PzNOTE9);
|
}
|
if (line.length() > 8 && line.startsWith("PzNOTE10")) {
|
String PzNOTE10 = line.substring(9);//倒角
|
}
|
if (line.length() > 8 && line.startsWith("PzNOTE11")) {
|
String PzNOTE11 = line.substring(9);//精磨
|
}
|
if (line.length() > 8 && line.startsWith("PzNOTE12")) {
|
String PzNOTE12 = line.substring(9);//楼层号
|
gla.setFloor_number(PzNOTE12);
|
}
|
if (line.length() > 8 && line.startsWith("PzNOTE13")) {
|
String PzNOTE13 = line.substring(9);//条形码
|
gla.setRemark(PzNOTE13);
|
}
|
if (line.length() > 8 && line.startsWith("PzNOTE14")) {
|
String PzNOTE14 = line.substring(9);//交互日期
|
}
|
if (line.length() > 10 && line.startsWith("SheetWidth")) {
|
String SheetWidth = line.substring(11);//宽
|
gla.setStartwidth(Double.parseDouble(SheetWidth));
|
}
|
if (line.length() > 11 && line.startsWith("SheetHeight")) {
|
String SheetHeight = line.substring(12);//高
|
gla.setStartlength(Double.parseDouble(SheetHeight));
|
}
|
if (line.length() > 10 && line.startsWith("RealDimXPz")) {
|
String RealDimXPz = line.substring(11);//高
|
gla.setWidth(Double.parseDouble(RealDimXPz));
|
}
|
if (line.length() > 10 && line.startsWith("RealDimYPz")) {
|
String RealDimYPz = line.substring(11);//高
|
gla.setLength(Double.parseDouble(RealDimYPz));
|
}
|
if (line.length() > 6 && line.startsWith("RackNo")) {
|
String RackNo = line.substring(7);//落架
|
gla.setApart_id(RackNo);
|
}
|
if (line.length() > 8 && line.startsWith("Customer")) {
|
String Customer = line.substring(9);//落架
|
gla.setCustomer(Customer);
|
}
|
//END
|
line = bufReader.readLine();
|
}
|
|
if (line.length() > 8 && line.startsWith("PzNOTE20")) {
|
gla.setOptPattern(pattern);
|
gla.setManufacture_batch(baseFileName);
|
singalGlassDao.save(gla);
|
}
|
}
|
}
|
}
|
}
|
if (line.length() > 6 && line.startsWith("Height")) {
|
String height = line.substring(7);
|
pattern.setHeight(Double.parseDouble(height));
|
|
// 关联Pattern和批次,初始完成数量为0
|
// RawPackageTxt rawPackageTxt = rawPackageTxtDao.findByTxtName(baseFileName);
|
pattern.setRawPackageTxt(txt);
|
pattern.setBatch(baseFileName);
|
pattern.setCompletedPieces(0);
|
patternDao.save(pattern);
|
index++;
|
}
|
}
|
|
bufReader.close();
|
|
// 分割文件,将Pattern详细信息存到数据库中
|
splitFile(optFilePath, numberPrefix);
|
|
}
|
|
/**
|
* 分割OPT文件方法,将OPT文件读到字符串中,再以[OPT_Pattern]分割,将分割后内容保存到数据库中
|
*
|
* @param filePath
|
* @throws IOException
|
*/
|
private void splitFile(String filePath, String numberPrefix) throws IOException {
|
File sourceFile = new File(filePath);
|
String splitStr = "\\[OPT_Pattern\\]";
|
|
StringBuffer fileStrBuffer = new StringBuffer();
|
BufferedReader reader = new BufferedReader(new FileReader(sourceFile));
|
int c = reader.read();
|
while (c != -1) {
|
fileStrBuffer.append((char) c);
|
c = reader.read();
|
}
|
|
reader.close();
|
|
String[] patterns = fileStrBuffer.toString().split(splitStr);
|
List<OptPattern> optPatterns = patternDao.findOptPatternByNumberPrefix(numberPrefix);
|
LOGGER.debug("patterns长度:"+patterns.length);
|
// 文件头不用处理
|
for (int i = 1; i < patterns.length; i++) {
|
OptPattern pattern = optPatterns.get(i - 1);
|
pattern.setContent("[OPT_Pattern]" + patterns[i]);
|
patternDao.save(pattern);
|
}
|
}
|
|
/**
|
* 针对每个Pattern创建相应切割机任务
|
*
|
* @param batch
|
*/
|
private void createCutMachineTasks(OptPattern optPattern, ManufactureBatch batch) {
|
LOGGER.debug("> Start createCutMachineTasks");
|
|
LOGGER.debug("> End createCutMachineTasks");
|
}
|
|
public OptPattern getById(Long id) {
|
return patternDao.findOne(id);
|
}
|
|
public OptPattern save(OptPattern pattern) {
|
return patternDao.save(pattern);
|
}
|
|
public void changeState(Long patternId, String toState) {
|
LOGGER.debug("> Start changeState");
|
|
OptPattern pattern = getById(patternId);
|
LOGGER.debug("Change pattern " + pattern.getDescription() + " from [" + pattern.getState() + "] to [" + toState
|
+ "] ");
|
|
pattern.setState(toState);
|
save(pattern);
|
|
LOGGER.debug("> End changeState");
|
}
|
|
// 得到所有的原片信息
|
public List<OptPattern> findAll() {
|
return patternDao.findAll();
|
}
|
|
// 得到当前生产线的所有原片信息
|
public List<OptPattern> getOptPattern(String groups) {
|
List<OptPattern> patternes = optPatternDao.findOptPatternByGroups(groups);
|
return patternes;
|
}
|
|
// 当导入含有常用规格的原片时
|
public String general(String txt_name) {
|
List<OptPattern> nowlist = new ArrayList<OptPattern>();// 存放已经加的原片
|
|
// 得到当前任务的所有optPattern
|
List<OptPattern> OptPatterns = optPatternDao.findOptPatternByBatchNumber(txt_name);
|
|
List<OptPattern> cahcelist = new ArrayList<OptPattern>();
|
int s = 0;
|
cc: for (; s < OptPatterns.size();) {
|
OptPattern optPattern3 = OptPatterns.get(s);
|
double width3 = optPattern3.getWidth();
|
double height3 = optPattern3.getHeight();
|
double thickness3 = optPattern3.getGlassThickness();
|
String color3 = optPattern3.getColor();
|
OptPattern optPattern = new OptPattern(optPattern3.getGlassId(), optPattern3.getGlassDescription(),
|
thickness3, optPattern3.getPieces(), width3, height3, color3, "");
|
if (cahcelist.size() != 0) {
|
if (cahcelist.contains(optPattern3)) {
|
// 含有此对象,以下一个对象作为基准
|
s++;
|
continue cc;
|
}
|
}
|
|
// 拿下一个pattern对象
|
int m = s + 1;
|
dd: for (; m < OptPatterns.size();) {
|
OptPattern optPattern4 = OptPatterns.get(m);
|
double width4 = optPattern4.getWidth();
|
double height4 = optPattern4.getHeight();
|
double thickness4 = optPattern4.getGlassThickness();
|
String color4 = optPattern4.getColor();
|
|
if (width3 == width4 && height3 == height4 && thickness3 == thickness4 && color3.equals(color4)) {
|
optPattern.setPieces(optPattern.getPieces() + optPattern4.getPieces());
|
if (nowlist.contains(optPattern)) {
|
nowlist.remove(optPattern);
|
}
|
nowlist.add(optPattern);
|
cahcelist.add(optPattern4);
|
m++;
|
} else {
|
if (!nowlist.contains(optPattern)) {
|
nowlist.add(optPattern);
|
}
|
m++;
|
continue dd;
|
}
|
}
|
if (!nowlist.contains(optPattern)) {
|
nowlist.add(optPattern);
|
}
|
s++;
|
continue cc;
|
}
|
|
// 将所有的记录添加到gmms_raw_package表中
|
for (int h = 0; h < nowlist.size(); h++) {
|
RawPackage rawPackage = new RawPackage();
|
rawPackage.setGlassId(nowlist.get(h).getGlassId());
|
rawPackage.setWidth(nowlist.get(h).getWidth());
|
rawPackage.setHeight(nowlist.get(h).getHeight());
|
rawPackage.setThickness(nowlist.get(h).getGlassThickness());
|
rawPackage.setPieces(nowlist.get(h).getPieces());
|
rawPackage.setColor(nowlist.get(h).getGlassDescription());
|
if (nowlist.get(h).getGlassDescription().equals(GlassColor.WHITE_GLASS)) {
|
rawPackage.setComment(GlassColor.GENERAL_FLAG);
|
} else {
|
rawPackage.setComment(GlassColor.SPECIAL_FLAG);
|
}
|
rawPackage.setState(ShelfRankState.IN_WORK);
|
rawPackage.setCreateTime(new Date());
|
rawPackage.setManufacturer(txt_name);
|
rawPackageDao.save(rawPackage);
|
}
|
|
// 得到所有空闲中的料架
|
List<ShelfRank> freeRanks = shelfRankDao.findFreeRanks();
|
|
// 创建吊装任务
|
List<RawPackage> rawPackageList = rawPackageDao.findByManufacturer(txt_name);
|
|
ShelfHoist shelfHoist = shelfHoistDao.findAll().get(0);
|
shelfHoist.setState(ShelfHoistState.ON_WAITING);
|
// shelfHoist.setRawPackage(rawPackageList.get(0));
|
shelfHoistDao.save(shelfHoist);
|
|
if (rawPackageList.size() != 0 && freeRanks.size() >= rawPackageList.size()) {
|
for (int i = 0; i < rawPackageList.size(); i++) {
|
ShelfRank shelfRank = freeRanks.get(i);
|
shelfRank.setState(ShelfRankState.ON_WAITING);
|
shelfRank.setRawPackage(rawPackageList.get(i));
|
shelfRank.setColor(rawPackageList.get(i).getColor());
|
shelfRank.setGlassId(rawPackageList.get(i).getGlassId());
|
shelfRank.setLength(rawPackageList.get(i).getHeight());
|
shelfRank.setPieces(rawPackageList.get(i).getPieces());
|
shelfRank.setThickness(rawPackageList.get(i).getThickness());
|
shelfRank.setWidth(rawPackageList.get(i).getWidth());
|
shelfRank.setCreateTime(rawPackageList.get(i).getCreateTime());
|
shelfRankDao.save(shelfRank);
|
|
// 创建三个吊装任务
|
ShelfTask displayInfo = new ShelfTask(ShelfTaskState.WAITING, ShelfTaskType.DISPLAY_INFO, new Date(),
|
ShelfTaskFlag.SHELF_FLAG, shelfHoist, shelfRank);
|
ShelfTask fromEmptyRankToHoist = new ShelfTask(ShelfTaskState.WAITING,
|
ShelfTaskType.FROM_EMPTY_RANK_TO_HOIST, new Date(), ShelfTaskFlag.SHELF_FLAG, shelfHoist,
|
shelfRank);
|
ShelfTask fromHoistToRank = new ShelfTask(ShelfTaskState.WAITING, ShelfTaskType.FROM_HOIST_TO_RANK,
|
new Date(), ShelfTaskFlag.SHELF_FLAG, shelfHoist, shelfRank);
|
|
shelfTaskDao.save(displayInfo);
|
shelfTaskDao.save(fromEmptyRankToHoist);
|
shelfTaskDao.save(fromHoistToRank);
|
}
|
|
// 计算库存百分比
|
int total = shelfRankDao.findAll().size();
|
int complete = shelfRankDao.findAll().size() - shelfRankDao.findFreeRanks().size();
|
|
// String precent=(double)complete / (double)total * 100 +
|
// "%";//得到库存百分比
|
|
NumberFormat numberFormat = NumberFormat.getPercentInstance(Locale.CHINA);
|
numberFormat.setMaximumFractionDigits(2);
|
String precent = numberFormat.format((double) complete / (double) total);// 得到库存百分比
|
|
return precent;
|
}
|
|
return "fail";// 此时料架已满
|
}
|
|
}
|