清帐单、余额调节表、理财预提、存款预提保存pdf至附件、附件地址
This commit is contained in:
		
							parent
							
								
									11219db0fb
								
							
						
					
					
						commit
						147f84bffd
					
				|  | @ -0,0 +1,240 @@ | |||
| package shjh.jhzj7.fi.fi.plugin.task; | ||||
| 
 | ||||
| import com.fasterxml.jackson.databind.ObjectMapper; | ||||
| import kd.bos.context.RequestContext; | ||||
| import kd.bos.dataentity.entity.DynamicObject; | ||||
| import kd.bos.exception.KDException; | ||||
| import kd.bos.fileservice.FileService; | ||||
| import kd.bos.fileservice.FileServiceFactory; | ||||
| import kd.bos.logging.Log; | ||||
| import kd.bos.logging.LogFactory; | ||||
| import kd.bos.orm.query.QCP; | ||||
| import kd.bos.orm.query.QFilter; | ||||
| import kd.bos.print.api.PrintTask; | ||||
| import kd.bos.print.api.PrintWork; | ||||
| import kd.bos.print.core.service.PrtAttach; | ||||
| import kd.bos.print.service.BosPrintServiceHelper; | ||||
| import kd.bos.schedule.executor.AbstractTask; | ||||
| import kd.bos.servicehelper.AttachmentServiceHelper; | ||||
| import kd.bos.servicehelper.BusinessDataServiceHelper; | ||||
| import kd.bos.servicehelper.QueryServiceHelper; | ||||
| import kd.bos.servicehelper.operation.SaveServiceHelper; | ||||
| import kd.sdk.plugin.Plugin; | ||||
| import shjh.jhzj7.fi.fi.plugin.operate.RecRedPushOperation; | ||||
| 
 | ||||
| import java.io.ByteArrayOutputStream; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.util.*; | ||||
| 
 | ||||
| /** | ||||
|  * 后台任务插件 | ||||
|  * 清帐单、余额调节表、存款预提处理、理财预提处理,打印表单存入附件并保存附件地址 | ||||
|  */ | ||||
| public class ClearBillSaveUrlTask extends AbstractTask implements Plugin { | ||||
| 
 | ||||
|     private final static Log log = LogFactory.getLog(ClearBillSaveUrlTask.class); | ||||
| 
 | ||||
| 
 | ||||
|     @Override | ||||
|     public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException { | ||||
| 
 | ||||
|         // 为每个表单创建独立的任务,互不干扰 | ||||
|         for (Map.Entry<String, Object> config : map.entrySet()) { | ||||
|             String formId = config.getKey(); | ||||
|             String printTemplateCode = (String) config.getValue(); | ||||
| 
 | ||||
|             try { | ||||
|                 processForm(formId, printTemplateCode); | ||||
|                 log.info("表单 {} 处理完成", formId); | ||||
|             } catch (Exception e) { | ||||
|                 // 捕获异常,确保一个表单失败不影响其他表单 | ||||
|                 log.error("处理表单 {} 时发生错误: {}", formId, e.getMessage(), e); | ||||
|                 // 可以在这里添加错误通知或其他处理逻辑 | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * 处理单个表单 | ||||
|      */ | ||||
|     private void processForm(String formId, String printTemplateCode) throws KDException { | ||||
|         // 1. 获取数据(已审核、无附件地址) | ||||
|         QFilter statusFilter = new QFilter("billstatus", QCP.equals, "C"); | ||||
|         QFilter urlFilter = new QFilter("shjh_url", QCP.equals, ""); | ||||
|         QFilter[] filters = new QFilter[]{statusFilter, urlFilter}; | ||||
| 
 | ||||
|         DynamicObject[] bills = BusinessDataServiceHelper.load(formId, "id,billstatus,shjh_url,billno", filters); | ||||
| 
 | ||||
|         if (bills.length == 0) { | ||||
|             log.info("表单 {} 没有需要处理的单据", formId); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         log.info("开始处理表单 {},共 {} 个单据", formId, bills.length); | ||||
| 
 | ||||
|         // 批量加载数据到缓存,提高性能 | ||||
|         Long[] ids = Arrays.stream(bills) | ||||
|                 .filter(bill -> { | ||||
|                     Object shjhUrl = bill.get("shjh_url"); | ||||
|                     // 过滤掉 shjh_url 不为 null 且不为空字符串的数据 | ||||
|                     return shjhUrl == null || "".equals(shjhUrl.toString().trim()); | ||||
|                 }) | ||||
|                 .map(bill -> (Long) bill.getPkValue()) | ||||
|                 .toArray(Long[]::new); | ||||
| 
 | ||||
|         Map<Object, DynamicObject> billMap = BusinessDataServiceHelper.loadFromCache(ids, formId); | ||||
| 
 | ||||
|         // 获取打印模板ID(只查询一次,提高性能) | ||||
|         DynamicObject printMeta = QueryServiceHelper.queryOne("bos_print_meta", "id", | ||||
|                 new QFilter[]{new QFilter("number", QCP.equals, printTemplateCode)}); | ||||
| 
 | ||||
|         if (printMeta == null) { | ||||
|             log.error("打印模板 {} 不存在", printTemplateCode); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         String tplId = printMeta.getString("id"); | ||||
| 
 | ||||
|         // 处理每个单据 | ||||
|         for (DynamicObject bill : billMap.values()) { | ||||
|             processSingleBill(bill, formId, tplId); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 处理单个单据 | ||||
|      */ | ||||
|     private void processSingleBill(DynamicObject bill, String formId, String tplId) { | ||||
|         try { | ||||
|             String billNo = bill.getString("billno"); | ||||
|             log.debug("处理单据: {}", billNo); | ||||
| 
 | ||||
|             //查看是否存在附件 | ||||
|             List<Map<String, Object>> list = AttachmentServiceHelper.getAttachments(formId, bill.getPkValue(), "attachmentpanel"); | ||||
|             if (list.size()==0){ | ||||
|                 // 生成打印任务 | ||||
|                 PrintTask printTask = createPrintTask(bill, formId, tplId); | ||||
|                 PrintWork printWork = createPrintWork(printTask); | ||||
| 
 | ||||
|                 // 生成PDF | ||||
|                 PrtAttach printResult = BosPrintServiceHelper.doPrint(printWork); | ||||
|                 PrtAttach.AttachDetail attachDetail = printResult.getAttachDetail().get(0); | ||||
| 
 | ||||
|                 // 创建附件信息并上传 | ||||
|                 Map<String, Object> attInfo = createAttInfo(attachDetail, billNo); | ||||
|                 uploadAttachment(formId, bill, attInfo); | ||||
|             } | ||||
| 
 | ||||
|             // 更新单据 | ||||
|             updateBill(bill,formId); | ||||
| 
 | ||||
|             log.debug("单据 {} 处理完成", billNo); | ||||
| 
 | ||||
|         } catch (Exception e) { | ||||
|             log.error("处理单据 {} 时发生错误: {}", bill.getString("billno"), e.getMessage(), e); | ||||
|             // 单个单据失败不影响其他单据 | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 创建打印任务 | ||||
|      */ | ||||
|     private PrintTask createPrintTask(DynamicObject bill, String formId, String tplId) { | ||||
|         ArrayList<Object> pkIds = new ArrayList<>(); | ||||
|         pkIds.add(bill.getPkValue()); | ||||
| 
 | ||||
|         PrintTask printTask = new PrintTask(); | ||||
|         printTask.setTplId(tplId); | ||||
|         printTask.setPkIds(pkIds); | ||||
|         printTask.setPrintType("billForm"); | ||||
|         printTask.setFormId(formId); | ||||
| 
 | ||||
|         return printTask; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 创建打印作业 | ||||
|      */ | ||||
|     private PrintWork createPrintWork(PrintTask printTask) { | ||||
|         ArrayList<PrintTask> taskList = new ArrayList<>(); | ||||
|         taskList.add(printTask); | ||||
| 
 | ||||
|         PrintWork printWork = new PrintWork(); | ||||
|         printWork.setPrintLang("zh_CN"); | ||||
|         printWork.setExpType("pdf"); | ||||
|         printWork.setTaskList(taskList); | ||||
| 
 | ||||
|         return printWork; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 上传附件 | ||||
|      */ | ||||
|     private void uploadAttachment(String formId, DynamicObject bill, Map<String, Object> attInfo) { | ||||
|         List<Map<String, Object>> attachments = new ArrayList<>(); | ||||
|         attachments.add(attInfo); | ||||
| 
 | ||||
|         AttachmentServiceHelper.upload(formId, bill.getPkValue(), "attachmentpanel", attachments); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 更新单据 | ||||
|      */ | ||||
|     private void updateBill(DynamicObject bill, String formId) { | ||||
|         List<Map<String, Object>> list = AttachmentServiceHelper.getAttachments(formId, bill.getPkValue(), "attachmentpanel"); | ||||
|         if (list.size()!=0){ | ||||
|             String url = (String) list.get(0).get("url"); | ||||
|             bill.set("shjh_url", url); | ||||
|             bill.set("shjh_url_tag", url); | ||||
|             SaveServiceHelper.update(bill); | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 创建附件信息(优化版本) | ||||
|      */ | ||||
|     private Map<String, Object> createAttInfo(PrtAttach.AttachDetail attachDetail, String billNo) { | ||||
|         long timestamp = System.currentTimeMillis(); | ||||
| 
 | ||||
|         Map<String, Object> att = new HashMap<>(); | ||||
|         att.put("createdate", timestamp); | ||||
|         att.put("lastModified", timestamp); | ||||
|         att.put("status", "success"); | ||||
|         att.put("type", attachDetail.getFileType()); | ||||
|         att.put("name", billNo + "_" + attachDetail.getFileName()); | ||||
|         att.put("uid", "rc-upload-" + timestamp + "-1"); | ||||
|         att.put("url", attachDetail.getFilePath()); | ||||
| 
 | ||||
|         // 异步或延迟计算文件大小,避免阻塞 | ||||
|         att.put("size", calculateFileSize(attachDetail.getFilePath())); | ||||
| 
 | ||||
|         return att; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 计算文件大小(优化性能) | ||||
|      */ | ||||
|     private long calculateFileSize(String filePath) { | ||||
|         try { | ||||
|             FileService fs = FileServiceFactory.getAttachmentFileService(); | ||||
|             try (InputStream in = fs.getInputStream(filePath); | ||||
|                  ByteArrayOutputStream out = new ByteArrayOutputStream()) { | ||||
| 
 | ||||
|                 byte[] buffer = new byte[8192]; // 使用缓冲区提高读取效率 | ||||
|                 int bytesRead; | ||||
|                 long totalSize = 0; | ||||
| 
 | ||||
|                 while ((bytesRead = in.read(buffer)) != -1) { | ||||
|                     totalSize += bytesRead; | ||||
|                 } | ||||
|                 return totalSize; | ||||
|             } | ||||
|         } catch (IOException e) { | ||||
|             log.warn("计算文件大小时发生错误: {}", e.getMessage()); | ||||
|             return 0L; | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue