1.修改外销合同签章名称包含 ensign

2.增加框架合同合同签章
This commit is contained in:
zhouc 2024-09-19 11:20:23 +08:00
parent 80219cf6dd
commit 015f53e685
2 changed files with 173 additions and 5 deletions

View File

@ -0,0 +1,168 @@
package com.yem.wm.es.salescontrac.op;
import com.yem.wm.es.encasement.util.AttachmentUtil;
import com.yem.wm.utils.ContactSignUtils;
import com.yem.wm.utils.YEM;
import kd.bos.context.RequestContext;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.entity.AppInfo;
import kd.bos.entity.AppMetadataCache;
import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
import kd.bos.entity.plugin.PreparePropertysEventArgs;
import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
import kd.bos.exception.KDBizException;
import kd.bos.fileservice.FileServiceFactory;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.AttachmentDto;
import kd.bos.servicehelper.AttachmentServiceHelper;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.url.UrlService;
import org.jetbrains.annotations.NotNull;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBookmark;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
/**
* @author zhouc
* @date 2024/9/19 11:10
* @className SalesOrderAutoSignOp
* @description 框架合同上传签章 衣总签名带到Word文件ensign书签位置处
*/
public class SalesOrderAutoSignOp extends AbstractOperationServicePlugIn {
@Override
public void onPreparePropertys(PreparePropertysEventArgs e) {
super.onPreparePropertys(e);
List<String> fieldKeys = e.getFieldKeys();
fieldKeys.addAll(this.billEntityType.getAllFields().keySet());
}
@Override
public void beginOperationTransaction(BeginOperationTransactionArgs e) {
super.beginOperationTransaction(e);
DynamicObject[] entities = e.getDataEntities();
// Word中的书签名称
final String BOOKMARK = "ensign";
// 修改Word后上传的附件面板
final String UPLOAD_ATTACHMENT_KEY = "attachmentpanel";
for (DynamicObject dynamicObject : entities) {
String formId = dynamicObject.getDataEntityType().getName();
long pkId = dynamicObject.getLong("id");
// 获取衣晓明签字
DynamicObject user = BusinessDataServiceHelper.loadSingle("bos_user", new QFilter[]{new QFilter("number", "=", "10437")});
String imageId = user.getString("yem_signature");
if (YEM.isEmpty(imageId)) {
throw new KDBizException("获取工号 10437 的用户签章失败,请检查是否上传签章!!");
}
// 下载签字图片文件
String imageUrl = UrlService.getImageFullUrl(imageId);
imageUrl = imageUrl + "?access_token=" + RequestContext.get().getGlobalSessionId();
InputStream imageIn;
ByteArrayOutputStream buffer;
try {
URL url = new URL(imageUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
imageIn = connection.getInputStream();
// 图片数据缓存InputStream多次使用
buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = imageIn.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
connection.disconnect();
} catch (IOException ex) {
throw new KDBizException("下载工号 10437 的用户签章失败!!");
}
byte[] imageData = buffer.toByteArray();
// 清空上传的附件面板
List<Map<String, Object>> beforeUpload = AttachmentServiceHelper.getAttachments(formId, pkId, UPLOAD_ATTACHMENT_KEY);
for (Map<String, Object> map : beforeUpload) {
AttachmentServiceHelper.remove(formId, pkId, map.get("uid"));
}
final String DOWNLOAD_ATTACHMENT_KEY = "attachmentpanel";
List<Map<String, Object>> attachments = AttachmentServiceHelper.getAttachments(formId, pkId, DOWNLOAD_ATTACHMENT_KEY);
AppInfo appInfo = AppMetadataCache.getAppInfo("yem_es");
String appId = appInfo.getId();
for (Map<String, Object> attachment : attachments) {
// 获取Word附件
AttachmentDto attDao = AttachmentServiceHelper.getAttachmentInfoByAttPk(attachment.get("attPkId"));
String fileUrl = attDao.getResourcePath();
String filename = attDao.getFilename();
validatorFileExtension(filename);
ByteArrayOutputStream out = new ByteArrayOutputStream();
FileServiceFactory.getAttachmentFileService().download(fileUrl, out, null);
InputStream in = new ByteArrayInputStream(out.toByteArray());
InputStream validatorStream = new ByteArrayInputStream(out.toByteArray());
// 获取书签
List<CTBookmark> bookMarks = ContactSignUtils.getFileBookMarks(validatorStream);
validatorSignAble(bookMarks, BOOKMARK, filename);
File file;
try {
ByteArrayInputStream stream = new ByteArrayInputStream(imageData);
// 书签位置替换为图片书签不会删除
file = ContactSignUtils.replaceBookmarkWithImage(in, stream, filename, BOOKMARK);
AttachmentUtil.uploadAttachment(appId, formId, String.valueOf(pkId), UPLOAD_ATTACHMENT_KEY, file.getName(), file.getPath());
List<Map<String, Object>> uploaded = AttachmentServiceHelper.getAttachments(formId, pkId, UPLOAD_ATTACHMENT_KEY);
File pdf = ContactSignUtils.convertToPDF(uploaded);
if (pdf != null) {
AttachmentUtil.uploadAttachment(appId, formId, String.valueOf(pkId), UPLOAD_ATTACHMENT_KEY, pdf.getName(), pdf.getPath());
}
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
}
/**
* 检验是否是Word文件
* @param filename
*/
private void validatorFileExtension(String filename) {
if (!filename.endsWith(".docx") && !filename.endsWith(".doc")) {
throw new KDBizException("文件 " + filename + " 扩展名不正确,请上传 .doc 或 .docx 文件!!");
}
}
/**
* 校验Word是否有书签
*
* @param bookMarks 所以书签
* @param name 书签名称
* @param filename 附件名称
* @return
*/
private void validatorSignAble(List<CTBookmark> bookMarks, @NotNull String name, String filename) {
boolean pass = false;
for (CTBookmark bookMark : bookMarks) {
String bookMarkName = bookMark.getName();
if (bookMarkName.contains(name)) {
pass = true;
break;
}
}
if (!pass) {
throw new KDBizException("未在文件 " + filename + " 中找到包含书签: " + name + "请上传添加书签后的Word文件");
}
}
}

View File

@ -148,22 +148,22 @@ public class SalesOrderAutoSignOp extends AbstractOperationServicePlugIn {
/**
* 校验Word是否有书签
*
* @param bookMarks
* @param name
* @param filename
* @param bookMarks 所以书签
* @param name 书签名称
* @param filename 附件名称
* @return
*/
private void validatorSignAble(List<CTBookmark> bookMarks, @NotNull String name, String filename) {
boolean pass = false;
for (CTBookmark bookMark : bookMarks) {
String bookMarkName = bookMark.getName();
if (name.equals(bookMarkName)) {
if (bookMarkName.contains(name)) {
pass = true;
break;
}
}
if (!pass) {
throw new KDBizException("未在文件 " + filename + " 中找到书签: " + name + "请上传添加书签后的Word文件");
throw new KDBizException("未在文件 " + filename + " 中找到包含书签: " + name + "请上传添加书签后的Word文件");
}
}
}