package org.springblade.mdm.flow.service;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.flowable.engine.HistoryService;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.springblade.core.oss.OssTemplate;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.mdm.basesetting.machine.MachineService;
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.basesetting.producedivision.entity.QinzheFgb;
import org.springblade.mdm.basesetting.producedivision.service.QinzheFgbService;
import org.springblade.mdm.commons.contants.DictBizConstants;
import org.springblade.mdm.commons.service.ParamService;
import org.springblade.mdm.flow.constants.FlowContants;
import org.springblade.mdm.flow.vo.ApproveTableInfo;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.entity.NcProgramApproved;
import org.springblade.mdm.program.service.NcNodeService;
import org.springblade.mdm.program.service.NcProgramApprovedService;
import org.springblade.system.feign.IDictBizClient;
import org.springblade.system.feign.IUserClient;
import org.springblade.system.pojo.entity.DictBiz;
import org.springblade.system.pojo.entity.User;
import org.springblade.system.pojo.entity.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.*;
import java.util.*;
import java.util.List;
/**
* 数控程序确认表输出服务
*
* @author yangys
*/
@Slf4j
@Service
public class ProgramConfirmTableService {
@Autowired
private QinzheFgbService qinzheFgbService;
@Autowired
private IDictBizClient dictBizClient;
@Autowired
private NcNodeService ncNodeService;
@Autowired
private MachineService machineService;
@Autowired
private OssTemplate ossTemplate;
@Autowired
private IUserClient userClient;
@Autowired
private ParamService paramService;
public void exportConfirmTable(FlowProgramProperties props, OutputStream os) throws IOException, DocumentException {
byte[] tplBytes = getTemplateBytes();
generateTempPDF(tplBytes,props,os);
}
void generateTempPDF(byte[] bytes,FlowProgramProperties props,OutputStream outputStream) throws DocumentException, IOException {
PdfReader reader = null;
PdfStamper pdfStamper = null;
reader = new PdfReader(bytes);
pdfStamper = new PdfStamper(reader, outputStream);
// 使用中文字体
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
ArrayList fontList = new ArrayList<>();
fontList.add(bf);
AcroFields fields = pdfStamper.getAcroFields();
fields.setSubstitutionFonts(fontList);
fillData(fields, getData(props));//染
//必须要调用这个,否则文档不会生成的
pdfStamper.setFormFlattening(true);
pdfStamper.close();
}
void fillData(AcroFields fields, Map data) throws DocumentException, IOException {
for (String key : data.keySet()) {
String value = data.get(key);
// 为字段赋值,注意字段名称是区分大小写的fields.setField(key,value);
fields.setField(key,value,true);
//form.setFieldProperty("fieldName", "clrflags", PdfAnnotation.FLAGS_HIDDEN, null);
//fields.setFieldRichValue()
}
}
/**
* 获取模板字节数组
* @return
*/
private byte[] getTemplateBytes() throws IOException {
String tplOssName = paramService.confirmTableTemplateOssFileName();
try (InputStream inputStream = this.ossTemplate.statFileStream(tplOssName)) {
return inputStream.readAllBytes();
}
}
/**
* 获取打印表格的数据
* @param props 流程属性
* @return 数据map
*/
Map getData(FlowProgramProperties props){
Map data = new HashMap<>();
data.put("pageTotal","1");
data.put("pageNo","1");
data.put("processNo",props.getProcessNo());
data.put("drawingNo",props.getDrawingNo());
data.put("drawingNoEdition",props.getDrawingNoEdition());
data.put("processName",props.getProcessName());
data.put("processEdition",props.getProcessEdition());
data.put("machineCode",props.getMachineCode());
data.put("productModel",props.getProductModel());
data.put("craftEdition",props.getCraftEdition());
//零组件名称
data.put("drawingName",getDrawingName(props.getDrawingNo()));
data.put("deviation",props.getDeviation());
data.put("programNo",queryProgramNo(props.getNodeId()));
data.put("fuheY","Y");
data.put("keyongY","Y");
Machine machine = this.machineService.getByCode(props.getMachineCode());
data.put("machineMode",machine.getName());
R dictSystemResult = dictBizClient.getValue(DictBizConstants.CONTROL_SYSTEM,machine.getControlSystem());
if(dictSystemResult.isSuccess()){
data.put("controlSystem",dictSystemResult.getData());
}
data.put("operator","不明确/2025-1-1");
data.put("jjy","不明确/2025-1-1");
data.put("programmerName",getNameByUserId(props.getProgrammerId()));
data.put("checkerName",getNameByUserId(props.getCheckerId()));
data.put("seniorName",getNameByUserId(props.getSeniorId()));
return data;
}
/**
* 查询程序编号
* @param nodeId
* @return
*/
private String queryProgramNo(Long nodeId) {
if(nodeId ==null) {
return StringUtils.EMPTY;
}
NcNode programPkdNode = this.ncNodeService.getById(nodeId);
if (programPkdNode != null) {
return programPkdNode.getProgramNo();
}else{
return StringUtils.EMPTY;
}
}
/**
* 获取零组件名称
* @param drawingNo 零件编号
* @return 零组件名称
*/
String getDrawingName(String drawingNo){
QinzheFgb fgb = qinzheFgbService.getByLjh(drawingNo);
if(fgb!= null){
return fgb.getLjmc();
}else{
return StringUtils.EMPTY;
}
}
String getNameByUserId(Long userId){
if(userId == null){
return StringUtils.EMPTY;
}
String name = StringUtils.EMPTY;
R useInfoResult = userClient.userInfoById(userId);
if(useInfoResult.isSuccess()){
name = useInfoResult.getData().getName();
}
return name;
}
}