清帐单、余额调节表、理财预提、存款预提保存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