diff --git a/src/main/java/com/yem/wm/es/salescontrac/op/SalesOrderAutoSignOp.java b/src/main/java/com/yem/wm/es/salescontrac/op/SalesOrderAutoSignOp.java new file mode 100644 index 00000000..de680722 --- /dev/null +++ b/src/main/java/com/yem/wm/es/salescontrac/op/SalesOrderAutoSignOp.java @@ -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文件!!"); + } + } +} diff --git a/src/main/java/com/yem/wm/es/salesorder/op/SalesOrderAutoSignOp.java b/src/main/java/com/yem/wm/es/salesorder/op/SalesOrderAutoSignOp.java index ff475f07..c2f4012c 100644 --- a/src/main/java/com/yem/wm/es/salesorder/op/SalesOrderAutoSignOp.java +++ b/src/main/java/com/yem/wm/es/salesorder/op/SalesOrderAutoSignOp.java @@ -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文件!!"); } } }