From 19eb507c10368e781e818cc5c577abf9d4790388 Mon Sep 17 00:00:00 2001 From: zoujiangtao Date: Thu, 24 Apr 2025 17:49:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=86=85=E5=AE=B9=EF=BC=9A?= =?UTF-8?q?=E6=8E=A8=E9=80=81BIP=E7=BB=93=E7=AE=97=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E6=97=A5=E6=9C=9F=E4=BF=AE=E6=94=B9=E3=80=81=E4=BB=98=E6=AC=BE?= =?UTF-8?q?=E5=8D=95BIP=E6=89=93=E5=9B=9E=E5=8A=9F=E8=83=BD=20=E6=97=B6?= =?UTF-8?q?=E9=97=B4=EF=BC=9A2025-04-24=2017=EF=BC=9A48=20=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E4=BA=BA=EF=BC=9A=E9=82=B9=E6=B1=9F=E6=B6=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shkd/sys/sys/mservice/ApiService.java | 203 +++++++++++- .../sys/plugin/api/PayBillApiSavePlugin.java | 76 ++--- .../sys/plugin/form/ApiTestBillPlugin.java | 312 +++++++++++++++++- .../form/PaymentProcessingBillPlugin.java | 72 +++- .../HitBackOperationServicePlugin.java | 42 +-- .../sys/sys/plugin/task/PushTaskPlugin.java | 8 +- 6 files changed, 620 insertions(+), 93 deletions(-) diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/mservice/ApiService.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/mservice/ApiService.java index 349399e..7945a85 100644 --- a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/mservice/ApiService.java +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/mservice/ApiService.java @@ -3,6 +3,9 @@ package shkd.sys.sys.mservice; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +//import com.google.gson.Gson; +//import com.kingdee.bos.webapi.entity.RepoRet; +//import com.kingdee.bos.webapi.sdk.K3CloudApi; import kd.bos.bill.BillShowParameter; import kd.bos.cache.CacheFactory; import kd.bos.cache.TempFileCache; @@ -46,6 +49,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; +import shkd.sys.sys.common.PaymentRequest; import java.nio.file.Path; import java.nio.file.Paths; @@ -189,10 +193,10 @@ public class ApiService { /** * 组装推送BIP付款单JSON * - * @param dynamic 某个单据的 某条需要推送的数据 注:映射字段必须包含在其中,缺失字段会报错 - * @param systemName 推送系统标识 + * @param dynamic 某个单据的 某条需要推送的数据 注:映射字段必须包含在其中,缺失字段会报错 + * @param systemName 推送系统标识 * @param dynamicObjects 反写单据数据 - * @param requestBody 请求体数据 + * @param requestBody 请求体数据 * @return 推送结果 */ public static String paymentSlipsJson(DynamicObject dynamic, String systemName, List dynamicObjects, String requestBody) { @@ -1051,4 +1055,197 @@ public class ApiService { } } } +/* + *//** + * 电子回单推送星空 + * + * @param dynamicObject + * @param k3CloudApi + * @return + *//* + public static String pushElectronicReceipts(DynamicObject dynamicObject, K3CloudApi k3CloudApi) throws Exception { + PaymentRequest paymentRequest = new PaymentRequest(); + paymentRequest.setIsDeleteEntry("true");// 是否删除已存在的分录 + paymentRequest.setIsVerifyBaseDataField("false");// 是否验证所有的基础资料有效性 + paymentRequest.setIsEntryBatchFill("true");// 是否批量填充分录 + paymentRequest.setValidateFlag("true");// 是否验证数据合法性标志 + paymentRequest.setNumberSearch("true");// 是否用编码搜索基础资料 + paymentRequest.setIsAutoAdjustField("false");// 是否自动调整JSON字段顺序 + paymentRequest.setIsControlPrecision("false");// 是否控制精度,为true时对金额、单价和数量字段进行精度验证 + paymentRequest.setValidateRepeatJson("false");// 是否控制精度,为true时对金额、单价和数量字段进行精度验证 + + *//** + * { + * "NeedUpDateFields": [], + * "NeedReturnFields": [], + * "IsDeleteEntry": "true", + * "SubSystemId": "", + * "IsVerifyBaseDataField": "false", + * "IsEntryBatchFill": "true", + * "ValidateFlag": "true", + * "NumberSearch": "true", + * "IsAutoAdjustField": "false", + * "InterationFlags": "", + * "IgnoreInterationFlag": "", + * "IsControlPrecision": "false", + * "ValidateRepeatJson": "false", + * "Model": { + * "FID": 0, + * "FDATE": "2025-04-18 00:00:00", + * "FCURRENCYID": { + * "FNUMBER": "PRE001" + * }, + * "FBANKID": { + * "FNUMBER": "001" + * }, + * "FPAYORGID": { + * "FNumber": "100" + * }, + * "FACCOUNTID": { + * "FNUMBER": "087826120100302087331" + * }, + * "FDEBITAMOUNT": 10.0, + * "FCREDITAMOUNT": 0.0, + * "FAmount": 10.0, + * "FEXPLANATION": "测试摘要", + * "FOPPOSITEBANKNAME": "中国工商银行股份有限公司北京中电财支行", + * "FOPPOSITEBANKACNTNO": "1602022101276101", + * "FOPPOSITECCOUNTNAME": "中国工商银行股份有限公司北京中电财支行", + * "FPRINTCOUNT": 0, + * "FMATCHED": false, + * "FReceiptNo": "123", + * "FFlowNo": "456", + * "FSRCBILLID": 0, + * "FReceiptInfo": "测试附言", + * "FRemark": "测试备注", + * "FUSECN": "测试用途" + * } + * } + *//* + + PaymentRequest.Model model = new PaymentRequest.Model(); + + // 交易日期 + Date bizdate = dynamicObject.getDate("bizdate"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String formattedDate = sdf.format(bizdate); + model.setfDate(formattedDate);// 交易日期:FDATE + + model.setfBillNo(dynamicObject.getString("billno"));// 单据编号:FBillNo + + + DynamicObject currency = dynamicObject.getDynamicObject("currency"); + String currencyNumber = currency.getString("number"); + *//** + * CNY 人民币 + * HKD 港币 + * JPY 日元 + * USD 美元 + * EUR 欧元 + * GBP 英镑 + * GEL 格鲁吉亚拉里 + * NPR 尼泊尔卢比 + *//* + PaymentRequest.Model.FNumberWrapper currency_number = new PaymentRequest.Model.FNumberWrapper(); + switch (currencyNumber) { + case "CNY": + currency_number.setFNumber("PRE001"); + break; + case "HKD": + currency_number.setFNumber("PRE002"); + break; + case "JPY": + currency_number.setFNumber("PRE004"); + break; + case "USD": + currency_number.setFNumber("PRE007"); + break; + case "EUR": + currency_number.setFNumber("PRE003"); + break; + case "GBP": + currency_number.setFNumber("PRE006"); + break; + } + model.setfCurrencyId(currency_number);// 币别 + + DynamicObject bank = dynamicObject.getDynamicObject("bank"); + String bank_name = bank.getString("name"); + PaymentRequest.Model.FNameWrapper bank_number = new PaymentRequest.Model.FNameWrapper(); + bank_number.setFName(bank_name); + model.setfBankId(bank_number);// 银行:FBANKID (必填项) + + DynamicObject company = dynamicObject.getDynamicObject("company"); + String company_number = company.getString("shkd_xkorgnumber");//星空组织编码(shkd_xkorgnumber) + PaymentRequest.Model.FNumberWrapper payOrg_number = new PaymentRequest.Model.FNumberWrapper(); + payOrg_number.setFNumber(company_number); + model.setfPayOrgId(payOrg_number);// 收付组织:FPAYORGID (必填项) + + DynamicObject accountbank = dynamicObject.getDynamicObject("accountbank"); + String accountbank_bankaccountnumber = accountbank.getString("bankaccountnumber"); + PaymentRequest.Model.FNumberWrapper Account_number = new PaymentRequest.Model.FNumberWrapper(); + Account_number.setFNumber(accountbank_bankaccountnumber); + model.setfAccountId(Account_number);// 银行账号:FACCOUNTID (必填项) + +// model.setfSrcBillTypeId();// 业务单据类型:FSRCBILLTYPEID + model.setfSrcBillNo(dynamicObject.getString("billno"));// 业务单据编号:FSRCBILLNO +// model.setfBusiRefeNo();// 业务参考号:FBUSIREFENO + model.setfDebitAmount(dynamicObject.getBigDecimal("debitamount"));// 借方(付款)金额:FDEBITAMOUNT + model.setfCreditAmount(dynamicObject.getBigDecimal("creditamount"));// 贷方(收款)金额:FCREDITAMOUNT + model.setfAmount(dynamicObject.getBigDecimal("amount"));// 金额:FAmount + model.setfExplanation(dynamicObject.getString("description"));// 摘要:FEXPLANATION + model.setfOppositeBankName(dynamicObject.getString("oppbank"));// 对方开户银行:FOPPOSITEBANKNAME + model.setfOppositeBankAcntNo(dynamicObject.getString("oppbanknumber"));// 对方银行账号:FOPPOSITEBANKACNTNO + model.setfOppositeCcountName(dynamicObject.getString("oppbankname"));// 对方账号名称:FOPPOSITECCOUNTNAME + model.setfPrintCount(0);// 打印次数:FPRINTCOUNT +// model.setfFirstPrintDate();// 首次打印时间:FFIRSTPRINTDATE + model.setfMatched("false");// 匹配交易明细:FMATCHED + model.setfReceiptNo(dynamicObject.getString("receiptno"));// 电子回单编号:FReceiptNo + model.setfFlowNo(dynamicObject.getString("detailid"));// 交易流水号:FFlowNo +// model.setfDetailNo();// 关联标记:FDetailNo +// model.setfVerificationCode();// 验证码:FVerificationCode +// model.setfSrcFormId();// 业务单据FormId:FSRCFormId +// model.setfSrcBillId();// 业务单据ID:FSRCBILLID +// model.setfKdRetFlag();// KD标志:FKDRETFLAG +// model.setfReceiptInfo(dynamicObject.getString(""));// 附言:FReceiptInfo + model.setfRemark(dynamicObject.getString("remarks"));// 备注:FRemark + model.setfUseCN(dynamicObject.getString("use"));// 用途:FUSECN + paymentRequest.setModel(model); + Gson gson = new Gson(); + String requestJson = gson.toJson(paymentRequest); + String result = k3CloudApi.save("WB_ReceiptBill", requestJson); + JSONObject resultJson = JSON.parseObject(result); + JSONObject responseStatus = resultJson.getJSONObject("Result").getJSONObject("ResponseStatus"); + JSONArray successEntitys = responseStatus.getJSONArray("SuccessEntitys"); + + if (!successEntitys.isEmpty()) { + JSONObject firstEntity = successEntitys.getJSONObject(0); + String id = firstEntity.getString("Id"); + + DynamicObject dynamicObjectObj = BusinessDataServiceHelper.loadSingle(dynamicObject.getPkValue(), dynamicObject.getDynamicObjectType().getName()); + IFormView viewByDynamicObj = createViewByDynamicObj(dynamicObjectObj); + List errMsgList = new ArrayList<>(); + DynamicObjectCollection receipts = QueryServiceHelper.query("bei_elecreceipt", "id,bank," + + "fileflag,filepath,biztype,bankcheckflag,fileserverurl,tcpurl,uploadfilename,username,password," + + "bank.bank_cate bankcate", new QFilter[]{new QFilter("id", QCP.equals, dynamicObject.getPkValue())}); + String pdfUrl = getPdfUrl(viewByDynamicObj.getPageId(), receipts, errMsgList); + Path path = Paths.get(dynamicObject.getString("filepath")); + String upfileName = path.getFileName().toString(); + logger.info("电子回单查询 → 电子回单附件推送接口 → 获取pdf地址:{}", pdfUrl); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("FileName", upfileName);// 文件名 + jsonObject.put("FormId", "WB_ReceiptBill");// 表单id + jsonObject.put("IsLast", true);// 是否最后一次上传 + jsonObject.put("InterId", id);// 单据内码 + jsonObject.put("BillNO", dynamicObject.getString("billno"));// 单据编码 + jsonObject.put("AliasFileName", upfileName);// 附件别名 + jsonObject.put("SendByte", attachmentBase64(pdfUrl));// 文件字节数组转base64后的字符串 + + String uploadAttachmentResult = k3CloudApi.attachmentUpload(jsonObject.toString()); + return "单据上传结果:" + result + "\n附件上传结果:" + uploadAttachmentResult; + } else { + return "单据推送失败"; + } + }*/ } \ No newline at end of file diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/api/PayBillApiSavePlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/api/PayBillApiSavePlugin.java index 02ebb36..3f07149 100644 --- a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/api/PayBillApiSavePlugin.java +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/api/PayBillApiSavePlugin.java @@ -175,35 +175,18 @@ public class PayBillApiSavePlugin implements ApiSavePlugin { objectNumber = objects[0].getString("number"); } } else if ("bos_user".equals(payeetype)) { + Map username = new HashMap<>(); + username.put("username", map.get("payeenumber").toString()); + map.put("shkd_user", username); - if (map.get("shkd_businessname").toString().equals("XK")) { - Map user_number = new HashMap<>(); - user_number.put("number", map.get("payeenumber").toString()); - map.put("shkd_user", user_number); - - DynamicObject[] objects = BusinessDataServiceHelper.load(payeetype.toString(), "id,name,number,username", new QFilter("number", QCP.equals, map.get("payeenumber").toString()).toArray()); - if (objects.length > 0) { - // 收款人编码 - map.put("payeenumber", objects[0].getString("number")); - // 收款人ID - map.put(fieldName1, objects[0].getPkValue()); - //收款人编码 - objectNumber = objects[0].getString("number"); - } - } else { - Map username = new HashMap<>(); - username.put("username", map.get("payeenumber").toString()); - map.put("shkd_user", username); - - DynamicObject[] objects = BusinessDataServiceHelper.load(payeetype.toString(), "id,name,number,username", new QFilter("username", QCP.equals, map.get("payeenumber").toString()).toArray()); - if (objects.length > 0) { - // 收款人编码 - map.put("payeenumber", objects[0].getString("number")); - // 收款人ID - map.put(fieldName1, objects[0].getPkValue()); - //收款人编码 - objectNumber = objects[0].getString("number"); - } + DynamicObject[] objects = BusinessDataServiceHelper.load(payeetype.toString(), "id,name,number,username", new QFilter("username", QCP.equals, map.get("payeenumber").toString()).toArray()); + if (objects.length > 0) { + // 收款人编码 + map.put("payeenumber", objects[0].getString("number")); + // 收款人ID + map.put(fieldName1, objects[0].getPkValue()); + //收款人编码 + objectNumber = objects[0].getString("number"); } } else if ("bos_org".equals(payeetype)) { Map number = new HashMap<>(); @@ -299,32 +282,17 @@ public class PayBillApiSavePlugin implements ApiSavePlugin { objectNumber = objects[0].getString("number"); } } else if ("bos_user".equals(payertype)) { - if (map.get("shkd_businessname").toString().equals("XK")) { - Map user_number = new HashMap<>(); - user_number.put("number", map.get("payernumber").toString()); - map.put("shkd_user", user_number); - DynamicObject[] objects = BusinessDataServiceHelper.load(payertype.toString(), "id,name,number,username", new QFilter("number", QCP.equals, map.get("payernumber").toString()).toArray()); - if (objects.length > 0) { - // 付款人编码 - map.put("payernumber", objects[0].getString("number")); - // 付款人ID - map.put(fieldName1, objects[0].getPkValue()); - // 付款人编码 - objectNumber = objects[0].getString("number"); - } - } else { - Map username = new HashMap<>(); - username.put("username", map.get("payernumber").toString()); - map.put("shkd_user", username); - DynamicObject[] objects = BusinessDataServiceHelper.load(payertype.toString(), "id,name,number,username", new QFilter("username", QCP.equals, map.get("payernumber").toString()).toArray()); - if (objects.length > 0) { - // 付款人编码 - map.put("payernumber", objects[0].getString("number")); - // 付款人ID - map.put(fieldName1, objects[0].getPkValue()); - // 付款人编码 - objectNumber = objects[0].getString("number"); - } + Map username = new HashMap<>(); + username.put("username", map.get("payernumber").toString()); + map.put("shkd_user", username); + DynamicObject[] objects = BusinessDataServiceHelper.load(payertype.toString(), "id,name,number,username", new QFilter("username", QCP.equals, map.get("payernumber").toString()).toArray()); + if (objects.length > 0) { + // 付款人编码 + map.put("payernumber", objects[0].getString("number")); + // 付款人ID + map.put(fieldName1, objects[0].getPkValue()); + // 付款人编码 + objectNumber = objects[0].getString("number"); } } else if ("bos_org".equals(payertype)) { Map number = new HashMap<>(); diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/ApiTestBillPlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/ApiTestBillPlugin.java index ab18548..243a330 100644 --- a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/ApiTestBillPlugin.java +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/ApiTestBillPlugin.java @@ -1,20 +1,66 @@ package shkd.sys.sys.plugin.form; import kd.bos.bill.AbstractBillPlugIn; +import kd.bos.bill.BillShowParameter; +import kd.bos.cache.CacheFactory; +import kd.bos.cache.TempFileCache; +import kd.bos.context.RequestContext; +import kd.bos.dataentity.OperateOption; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.dataentity.entity.LocaleString; +import kd.bos.dataentity.resource.ResManager; +import kd.bos.dataentity.utils.StringUtils; +import kd.bos.entity.MainEntityType; +import kd.bos.entity.operate.result.OperationResult; +import kd.bos.exception.KDBizException; +import kd.bos.form.IFormView; import kd.bos.form.control.Toolbar; import kd.bos.form.control.events.ItemClickEvent; import kd.bos.logging.Log; import kd.bos.logging.LogFactory; +import kd.bos.metadata.dao.MetadataDao; +import kd.bos.mvc.FormConfigFactory; +import kd.bos.mvc.SessionManager; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.print.core.service.PrtAttach; +import kd.bos.print.matchtpl.MatcherTpl; +import kd.bos.print.matchtpl.ViewType; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.MetadataServiceHelper; +import kd.bos.servicehelper.PrintServiceHelper; +import kd.bos.servicehelper.QueryServiceHelper; +import kd.bos.servicehelper.operation.OperationServiceHelper; +import kd.bos.servicehelper.print.NotePrintService; +import kd.bos.util.ExceptionUtils; import kd.sdk.plugin.Plugin; +import kd.tmc.bei.business.ocr.impl.ScanServiceImpl; +import kd.tmc.bei.business.ocr.invoke.ScanSystemFactory; +import kd.tmc.bei.common.helper.BeiHelper; +import kd.tmc.bei.common.helper.ReceiptPrintHelper; +import kd.tmc.bei.common.resource.BeiBizResource; +import kd.tmc.fbp.common.ofd.OfdConvertUtil; +import kd.tmc.fbp.common.util.EmptyUtil; //import shkd.sys.sys.mservice.PlanningService; -import java.util.EventObject; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; +import java.util.stream.Collectors; + +import static kd.bos.servicehelper.workflow.WorkflowServiceHelper.abandonByBusienssKey; +import static kd.bos.servicehelper.workflow.WorkflowServiceHelper.existProcDefByEntityNumber; /** * 单据界面插件 */ public class ApiTestBillPlugin extends AbstractBillPlugIn implements Plugin { private static final Log logger = LogFactory.getLog(ApiTestBillPlugin.class); + @Override public void registerListener(EventObject e) { // super.registerListener(e); @@ -28,6 +74,7 @@ public class ApiTestBillPlugin extends AbstractBillPlugIn implements Plugin { // Button save = this.getView().getControl("qwz5_baritemap"); // save.addClickListener(this); // 添加出菜单栏点击事件监听 } + @Override public void itemClick(ItemClickEvent evt) { super.itemClick(evt); @@ -40,12 +87,51 @@ public class ApiTestBillPlugin extends AbstractBillPlugIn implements Plugin { // this.getView().showTipNotification(token == null ? "获取token为空" :token); } + if ("shkd_process".equals(key)) { + logger.info("进入shkd_process触发按钮"); + Boolean number = existProcDefByEntityNumber(this.getModel().getDataEntity(true).getString("billno")); + if (number) { + this.getView().showTipNotification("流程存在"); + } else { + this.getView().showTipNotification("流程不存在"); + } + } + + if ("shkd_interrupt".equals(key)) { + logger.info("shkd_interrupt"); + abandonByBusienssKey(this.getModel().getDataEntity(true).getPkValue().toString()); + OperationResult operation; + this.getView().showTipNotification("流程中断"); + if ("B".equals(this.getModel().getDataEntity(true).getString("billstatus"))) { + this.getView().invokeOperation("unsubmit"); + } + + if ("B".equals(this.getModel().getDataEntity(true).getString("billstatus"))) { + this.getView().invokeOperation("unaudit"); + } + } + + if ("shkd_annex".equals(key)) { + DynamicObject dynamic = this.getModel().getDataEntity(true); + DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(dynamic.getPkValue(), dynamic.getDynamicObjectType().getName()); + IFormView viewByDynamicObj = createViewByDynamicObj(dynamicObject); + List errMsgList = new ArrayList<>(); + DynamicObjectCollection receipts = QueryServiceHelper.query("bei_elecreceipt", "id,bank," + + "fileflag,filepath,biztype,bankcheckflag,fileserverurl,tcpurl,uploadfilename,username,password," + + "bank.bank_cate bankcate", new QFilter[]{new QFilter("id", QCP.equals, dynamic.getPkValue())}); + String pdfUrl = getPdfUrl(viewByDynamicObj.getPageId(), receipts, errMsgList); + Path path = Paths.get(dynamic.getString("filepath")); + String upfileName = path.getFileName().toString(); + String dataUrl = convertUrlToBase64DataUrl(pdfUrl); + this.getView().showTipNotification("dataUrl:" + dataUrl + "\n文件名:" + upfileName); + } + if ("shkd_api".equals(key)) { // JSONObject jsonObject = BIPService.paymentSlipsJson(); // this.getView().showTipNotification(jsonObject.toJSONString()); } - if ("shkd_funds".equals(key)) { + if ("shkd_dian".equals(key)) { // JSONObject jsonObject = BIPService.paymentSlipsJson(); // this.getView().showTipNotification(jsonObject.toJSONString()); // String result = PlanningService.writeData(); @@ -53,4 +139,226 @@ public class ApiTestBillPlugin extends AbstractBillPlugIn implements Plugin { } } + /** + * 按照动态对象来创建页面视图,可在后端模拟操作并且修改值触发对应插件 + * + * @return IFormView + */ + public static IFormView createViewByDynamicObj(DynamicObject dynamicObj) { + MainEntityType type = MetadataServiceHelper.getDataEntityType(dynamicObj.getDataEntityType().getName()); + String appId = type.getAppId(); + IFormView view = createView(dynamicObj.getDataEntityType().getName(), appId, dynamicObj.getPkValue()); + if (view != null) { + view.getModel().createNewData(dynamicObj); + } + return view; + } + + /** + * 创建视图 + * + * @param formId:表单标识 + * @param appId:应用id + * @return IFormView + */ + public static IFormView createView(String formId, String appId, Object pkId) { + BillShowParameter para = new BillShowParameter(); + para.setFormId(formId); + para.setAppId(appId); + para.setPkId(pkId); + // 创建单据配置 + FormConfigFactory.createConfigInCurrentAppService(para); + // 获取单据页面视图 + SessionManager sm = SessionManager.getCurrent(); + return sm.getView(para.getPageId()); + } + + private static String getPdfUrl(String pageId, DynamicObjectCollection receipts, List errMsgList) { + List listPdf = new ArrayList<>(10); + List resList = new ArrayList<>(10); + String getEreceipturlError = (new BeiBizResource()).getGetEreceipturlError(); + String templateError = (new BeiBizResource()).getTemplateError(); + String getTemplateError = (new BeiBizResource()).getGetTemplateError(); + logger.info("ViewReceiptService.getPdfUrl receipts.size=" + receipts.size()); + if (receipts.size() > 1000) { + errMsgList.add(ResManager.loadKDString("请求打印电子回单数量超过1000条,请分批处理。", "ViewReceiptService_6", "tmc-bei-business")); + return null; + } else { + Set pkIds = receipts.stream().map((receiptx) -> receiptx.getLong("id")).collect(Collectors.toSet()); + Map> receiptTemplate = ReceiptPrintHelper.getMatchReceiptTemplate("bei", "bei_elecreceipt", pkIds, ViewType.LIST, pageId); + receiptTemplate.remove(""); + long timeMillis = System.currentTimeMillis(); + + for (DynamicObject receipt : receipts) { + Long receiptID = receipt.getLong("id"); + + try { + logger.info("ViewReceiptService templateForm.size=" + receiptTemplate.size()); + if (receiptTemplate.isEmpty()) { + errMsgList.add(templateError); + } else { + + for (MatcherTpl o : receiptTemplate.get(receiptID)) { + String templateId = o.getTplId(); + logger.info("ViewReceiptService templateForm.keySet=" + templateId); + String templateFormId = ""; + if (EmptyUtil.isNoEmpty(templateId)) { + templateFormId = MetadataDao.getNumberById(templateId); + logger.info("ViewReceiptService templateFormId=" + templateFormId); + } + + String url = PrintServiceHelper.createPdfUrl(pageId, "bei_elecreceipt", templateFormId, new Long[]{receiptID}); + logger.info("ViewReceiptService url4old=" + url); + if (StringUtils.isNotEmpty(url)) { + if (receipt.getBoolean("fileflag")) { + logger.info("设置username-------" + receipt.getString("username")); + System.setProperty("ereceipt.authuser", receipt.getString("username")); + String uploadFileName = ReceiptPrintHelper.getRealUploadUrl(receipt); + if (StringUtils.isBlank(uploadFileName)) { + errMsgList.add(getEreceipturlError); + } + + String fileServerUrl = receipt.getString("fileserverurl"); + + try { + if (!EmptyUtil.isEmpty(fileServerUrl)) { + ScanSystemFactory.getScanService(); + Long userId = RequestContext.get().getCurrUserId(); + DynamicObjectCollection userObj = QueryServiceHelper.query("bos_user", "id,phone", (new QFilter("id", "=", userId)).toArray()); + DynamicObjectCollection configObj = QueryServiceHelper.query("bas_imageconfig", "imageurl,clientid,clientsecret", (new QFilter("enable", "=", "A")).toArray()); + InputStream image = ScanServiceImpl.getImage(configObj.get(0).getString("clientid"), configObj.get(0).getString("clientsecret"), configObj.get(0).getString("imageurl"), userObj.get(0).getString("phone"), fileServerUrl); + ReceiptPrintHelper.imageConvertPdf("", resList, image); + } else if (!uploadFileName.endsWith("pdf") && !uploadFileName.endsWith("PDF")) { + if (!uploadFileName.endsWith("ofd") && !uploadFileName.endsWith("OFD")) { + logger.info("fileReceipt url:" + uploadFileName); + ReceiptPrintHelper.imageConvertPdf(uploadFileName, resList, null); + } else { + logger.info("ofdReceipt url:" + uploadFileName); + byte[] bytes = OfdConvertUtil.convertToPdfNew(BeiHelper.getPdfPutStream(uploadFileName, "old")); + resList.add(bytes); + } + } else { + logger.info("pdfReceipt url:" + uploadFileName); + BeiHelper.getPdfPutStream(uploadFileName, resList); + } + } catch (Exception var28) { + logger.info(ExceptionUtils.getExceptionStackTraceMessage(var28)); + errMsgList.add(getEreceipturlError); + } + } else { + listPdf.add(url); + } + } else { + PrtAttach attach = ReceiptPrintHelper.doNewPrint(pageId, "bei_elecreceipt", templateId, receipt.get("id")); + logger.info("ViewReceiptService attach=" + attach); + if (Objects.nonNull(attach)) { + List attachDetail = attach.getAttachDetail(); + + for (PrtAttach.AttachDetail detail : attachDetail) { + byte[] pdfPutStream = BeiHelper.getPdfPutStream(detail.getFilePath(), "new"); + resList.add(pdfPutStream); + } + logger.info("ViewReceiptService resList.size=" + resList.size()); + } + } + } + + logger.info("ViewReceiptService listPdf=" + listPdf); + logger.info("ViewReceiptService resList.size=" + resList.size()); + } + } catch (KDBizException var29) { + errMsgList.add(var29.getMessage()); + } catch (Exception var30) { + logger.info(ExceptionUtils.getExceptionStackTraceMessage(var30)); + errMsgList.add(getTemplateError); + } + } + + readTemplate(listPdf, resList); + String pdfUrl = null; + + try { + logger.info("resList:{}", resList); + pdfUrl = finlyOpenForm(resList); + } catch (Exception var27) { + logger.error("mergeMultiPdf Fail:", ExceptionUtils.getExceptionStackTraceMessage(var27)); + errMsgList.add((new BeiBizResource()).dealPdfError()); + } + + logger.info("printTimeCost: " + (System.currentTimeMillis() - timeMillis) + " generatePdfUrl: " + pdfUrl); + return pdfUrl; + } + } + + private static void readTemplate(List listPdf, List resList) { + if (listPdf != null && !listPdf.isEmpty()) { + TempFileCache tempFileCache = CacheFactory.getCommonCacheFactory().getTempFileCache(); + + for (String string : listPdf) { + InputStream ins = tempFileCache.getInputStream(string); + + try { + byte[] bytes = new byte[ins.available()]; + int bytesRead = 0; + int bytesToRead = ins.available(); + + while (bytesRead < bytesToRead) { + int result = ins.read(bytes, bytesRead, bytesToRead - bytesRead); + bytesRead += result; + if (result == -1) { + break; + } + } + + resList.add(bytes); + ins.close(); + } catch (IOException var11) { + logger.info("IO流失败" + ExceptionUtils.getExceptionStackTraceMessage(var11)); + } + } + + } + } + + private static String finlyOpenForm(List resList) { + if (!resList.isEmpty()) { + byte[] mergeMultiPdf; + if (resList.size() > 1) { + try { + mergeMultiPdf = ReceiptPrintHelper.mergeMultiPdf(resList); + } catch (Exception var5) { + throw new KDBizException(ExceptionUtils.getExceptionStackTraceMessage(var5)); + } + } else { + mergeMultiPdf = resList.get(0); + } + + NotePrintService notePrintService = new NotePrintService(); + LocaleString localeString = new LocaleString("receipt"); + return notePrintService.createPdfUrl(localeString, mergeMultiPdf); + } else { + return null; + } + } + + private String convertUrlToBase64DataUrl(String url) { + try (InputStream inputStream = CacheFactory.getCommonCacheFactory().getTempFileCache().getInputStream(url); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + + // 读取文件内容并编码为Base64 + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + byte[] fileBytes = outputStream.toByteArray(); + String base64 = Base64.getEncoder().encodeToString(fileBytes); + + // 构造Data URL,指定PDF的MIME类型 + return "data:application/pdf;base64," + base64; + + } catch (IOException e) { + throw new RuntimeException("Error converting URL to Base64 Data URL", e); + } + } } \ No newline at end of file diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/PaymentProcessingBillPlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/PaymentProcessingBillPlugin.java index d9889a1..1b3f963 100644 --- a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/PaymentProcessingBillPlugin.java +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/PaymentProcessingBillPlugin.java @@ -11,10 +11,12 @@ import kd.bos.dataentity.entity.LocaleString; import kd.bos.dataentity.resource.ResManager; import kd.bos.dataentity.utils.StringUtils; import kd.bos.entity.MainEntityType; +import kd.bos.entity.operate.result.OperationResult; import kd.bos.exception.KDBizException; import kd.bos.form.IFormView; import kd.bos.form.control.Toolbar; import kd.bos.form.control.events.ItemClickEvent; +import kd.bos.form.events.AfterDoOperationEventArgs; import kd.bos.logging.Log; import kd.bos.logging.LogFactory; import kd.bos.metadata.dao.MetadataDao; @@ -25,6 +27,7 @@ import kd.bos.orm.query.QFilter; import kd.bos.print.core.service.PrtAttach; import kd.bos.print.matchtpl.MatcherTpl; import kd.bos.print.matchtpl.ViewType; +import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.MetadataServiceHelper; import kd.bos.servicehelper.PrintServiceHelper; import kd.bos.servicehelper.QueryServiceHelper; @@ -48,6 +51,8 @@ import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; +import static kd.bos.servicehelper.workflow.WorkflowServiceHelper.abandonByBusienssKey; + /** * 单据界面插件 */ @@ -66,24 +71,67 @@ public class PaymentProcessingBillPlugin extends AbstractBillPlugIn implements P if ("shkd_hitback".equals(itemKey)) { DynamicObject dataEntity = this.getModel().getDataEntity(true); String bankpaystatus = dataEntity.getString("bankpaystatus"); + String billstatus = dataEntity.getString("billstatus"); if (!"共享系统".equals(dataEntity.getString("shkd_businessname"))) { - this.getView().showTipNotification("只允许打回BIP推送单据"); + this.getView().showTipNotification("打回失败,只允许打回BIP推送的单据"); return; } - if ("TF、NC、OF".contains(bankpaystatus)) { - List dynamicObjects = new ArrayList<>(); - String result = ApiService.paymentSlipsJson(dataEntity, "BIPNO", dynamicObjects, null); - logger.info("result信息:{}", result); - if (result.contains("成功")) { - SaveServiceHelper.save(dynamicObjects.toArray(new DynamicObject[0])); - this.getView().showSuccessNotification("打回成功"); - } else { - this.getView().showTipNotification("打回失败"); + if (!"B".equals(billstatus) && !"C".equals(billstatus)) { + this.getView().showTipNotification("打回失败,只允许打回单据状态为已提交或者已审核的单据"); + return; + } + + abandonByBusienssKey(dataEntity.getPkValue().toString()); + List dynamicObjects = new ArrayList<>(); + if ("B".equals(dataEntity.getString("billstatus"))) { + OperationResult result = this.getView().invokeOperation("unsubmit"); + if (result.isSuccess()) { + DynamicObject[] objects = BusinessDataServiceHelper.load("cas_paybill", + "id,billno,actpayamt,entry,entry.e_expenseitem,entry.e_remark,settletype,acttradedate," + + "payeebanknum,payeetype,payeenumber,payeracctbank,payeebank,payeebankname,paymenttype," + + "org,bizdate,description,shkd_pushstatus,shkd_businessnumber,shkd_businessid,shkd_businessname," + + "billstatus,bankpaystatus", new QFilter("billno", QCP.equals, dataEntity.getString("billno")).toArray()); + String pushResult = ApiService.paymentSlipsJson(objects[0], "BIPRE", dynamicObjects, null); + logger.info("result信息:{}", pushResult); + if (pushResult.contains("成功")) { + SaveServiceHelper.save(dynamicObjects.toArray(new DynamicObject[0])); + this.getView().showSuccessNotification("打回成功"); + } else { + this.getView().showTipNotification("打回失败,调用BIP接口失败"); + } } - } else { - this.getView().showTipNotification("打回失败,请确认银行支付状态"); + } + + if ("C".equals(dataEntity.getString("billstatus"))) { + OperationResult result = this.getView().invokeOperation("unaudit"); + if (result.isSuccess()) { + DynamicObject[] objects = BusinessDataServiceHelper.load("cas_paybill", + "id,billno,actpayamt,entry,entry.e_expenseitem,entry.e_remark,settletype,acttradedate," + + "payeebanknum,payeetype,payeenumber,payeracctbank,payeebank,payeebankname,paymenttype," + + "org,bizdate,description,shkd_pushstatus,shkd_businessnumber,shkd_businessid,shkd_businessname," + + "billstatus,bankpaystatus", new QFilter("billno", QCP.equals, dataEntity.getString("billno")).toArray()); + String pushResult = ApiService.paymentSlipsJson(objects[0], "BIPRE", dynamicObjects, null); + logger.info("result信息:{}", pushResult); + if (pushResult.contains("成功")) { + SaveServiceHelper.save(dynamicObjects.toArray(new DynamicObject[0])); + this.getView().showSuccessNotification("打回成功"); + } else { + this.getView().showTipNotification("打回失败,调用BIP接口失败"); + } + } + } + } + } + + @Override + public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) { + if (("unsubmit".equals(afterDoOperationEventArgs.getOperateKey()) || "unaudit".equals(afterDoOperationEventArgs.getOperateKey())) && afterDoOperationEventArgs.getOperationResult().isSuccess()) { + DynamicObject dataEntity = this.getModel().getDataEntity(true); + Object businessname = dataEntity.get("shkd_businessname"); + if (businessname != null && "共享系统".equals(businessname.toString())) { + afterDoOperationEventArgs.getOperationResult().setShowMessage(false); } } } diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/operation/HitBackOperationServicePlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/operation/HitBackOperationServicePlugin.java index 885ec53..3e5b0c9 100644 --- a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/operation/HitBackOperationServicePlugin.java +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/operation/HitBackOperationServicePlugin.java @@ -2,9 +2,9 @@ package shkd.sys.sys.plugin.operation; import kd.bos.dataentity.OperateOption; import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.entity.operate.result.IOperateInfo; import kd.bos.entity.operate.result.OperationResult; import kd.bos.entity.plugin.AbstractOperationServicePlugIn; -import kd.bos.entity.plugin.args.AfterOperationArgs; import kd.bos.entity.plugin.args.BeforeOperationArgs; import kd.bos.logging.Log; import kd.bos.logging.LogFactory; @@ -16,13 +16,14 @@ import kd.bos.servicehelper.operation.SaveServiceHelper; import kd.sdk.plugin.Plugin; import scala.collection.mutable.StringBuilder; import shkd.sys.sys.mservice.ApiService; -import kd.bos.entity.operate.result.IOperateInfo; -import shkd.sys.sys.plugin.form.ApiMappingBillPlugin; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static kd.bos.servicehelper.workflow.WorkflowServiceHelper.abandonByBusienssKey; +import static kd.bos.servicehelper.workflow.WorkflowServiceHelper.existProcDefByEntityNumber; + /** * 单据操作插件 */ @@ -49,49 +50,50 @@ public class HitBackOperationServicePlugin extends AbstractOperationServicePlugI "org,bizdate,description,shkd_pushstatus,shkd_businessnumber,shkd_businessid,shkd_businessname," + "billstatus,bankpaystatus" , new QFilter("id", QCP.in, pkValue) - .and("billstatus", QCP.in, "A、C") + .and("billstatus", QCP.in, "B、C") .and("shkd_businessname", QCP.equals, "共享系统").toArray()); if (objects == null || objects.length == 0) { - args.setCancel(true); args.setCancelMessage("打回失败\n" + "1、选择打回单据必须为BIP推送单据\n" + "2、只能打回提交、已审核的单据\n" + "(若有其他问题,可找业务老师咨询)" ); + args.setCancel(true); } else { StringBuilder stringBuilder = new StringBuilder(); - List dynamicObjects = new ArrayList<>(); for (DynamicObject dynamicObject : objects) { if (!"未结算".equals(dynamicObject.getString("shkd_pushstatus"))) { - args.setCancel(true); - args.setCancelMessage("打回失败,该单据结算结果已被推送"); - return; + stringBuilder.append("单据编号:" + dynamicObject.get("billno") + " 打回失败,该单据结算结果已被推送\n"); + continue; } - - OperationResult sumbit = OperationServiceHelper.executeOperate("unsubmit", "cas_paybill", dynamicObjects.toArray(new DynamicObject[0]), OperateOption.create()); - List allErrorOrValidateInfo = sumbit.getAllErrorOrValidateInfo(); + OperationResult operation; + if ("B".equals(dynamicObject.getString("billstatus"))) { + operation = OperationServiceHelper.executeOperate("unsubmit", "cas_paybill", new DynamicObject[]{dynamicObject}, OperateOption.create()); + }else{ + operation = OperationServiceHelper.executeOperate("unaudit", "cas_paybill", new DynamicObject[]{dynamicObject}, OperateOption.create()); + } + List allErrorOrValidateInfo = operation.getAllErrorOrValidateInfo(); if (allErrorOrValidateInfo.isEmpty()) { + List dynamicObjects = new ArrayList<>(); String result = ApiService.paymentSlipsJson(dynamicObject, "BIPRE", dynamicObjects, null); logger.info("result信息:{}", result); if (result.contains("成功")) { SaveServiceHelper.save(dynamicObjects.toArray(new DynamicObject[0])); - } else { - args.setCancel(true); - args.setCancelMessage(result); - return; + stringBuilder.append("单据编号:" + dynamicObject.get("billno") + " 打回失败,调用BIP接口失败\n"); } - return; } else { allErrorOrValidateInfo.forEach(operateInfo -> { DynamicObject object = BusinessDataServiceHelper.loadSingle(operateInfo.getPkValue(), "cas_paybill"); stringBuilder.append("单据编号:" + object.get("billno") + "," + operateInfo.getMessage() + "\n"); }); - args.setCancel(true); - args.setCancelMessage(stringBuilder.toString()); - return; } } + + if (!stringBuilder.isEmpty()) { + args.setCancelMessage(stringBuilder.toString()); + args.setCancel(true); + } } } } \ No newline at end of file diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/task/PushTaskPlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/task/PushTaskPlugin.java index e7027b9..f6a8309 100644 --- a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/task/PushTaskPlugin.java +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/task/PushTaskPlugin.java @@ -75,8 +75,12 @@ public class PushTaskPlugin extends AbstractTask implements Plugin { //TF 交易失败 //NC 交易未确认 //OF 银企异常 - DynamicObject[] objects4 = BusinessDataServiceHelper.load("cas_paybill", "id,billno,actpayamt,entry,entry.e_expenseitem,entry.e_remark,settletype,payeebanknum,payeetype,payeenumber,payeracctbank,payeebank,payeebankname,paymenttype,org,bizdate,description,shkd_pushstatus,shkd_businessnumber,shkd_businessid,shkd_businessname,billstatus,bankpaystatus" - , new QFilter("bizdate", QCP.large_equals, calculateTheDate(10)) + DynamicObject[] objects4 = BusinessDataServiceHelper.load("cas_paybill", + "id,billno,actpayamt,entry,entry.e_expenseitem,entry.e_remark,settletype,acttradedate," + + "payeebanknum,payeetype,payeenumber,payeracctbank,payeebank,payeebankname,paymenttype," + + "org,bizdate,description,shkd_pushstatus,shkd_businessnumber,shkd_businessid,shkd_businessname," + + "billstatus,bankpaystatus" + , new QFilter("acttradedate", QCP.large_equals, calculateTheDate(10)) .and("bankpaystatus", QCP.equals, "TS") .and("shkd_pushstatus", QCP.equals, "未结算") .and(new QFilter("shkd_businessname", QCP.equals, "共享系统")).toArray());