diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillOperation.java index b823467..904a88a 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillOperation.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillOperation.java @@ -36,6 +36,28 @@ public class PaybillOperation extends AbstractOperationServicePlugIn implements if ("pushfk".equals(operationKey)) { DynamicObject[] dataEntities = e.getDataEntities(); for (DynamicObject bill : dataEntities) { + bill = BusinessDataServiceHelper.loadSingle(bill.getPkValue(), "cas_paybill"); + if (null != bill) { + DynamicObject paymentidentify = bill.getDynamicObject("paymentidentify");//付款标识 + if (null != paymentidentify) { + if (!"FKBS02".equals(paymentidentify.getString("number"))) { + addErrorInfo(bill, "付款标识不为被动付款"); + } + } else { + addErrorInfo(bill, "付款标识为空无法判断被动主动"); + } + DynamicObject shjhBizsmall = bill.getDynamicObject("shjh_bizsmall"); + if (null != shjhBizsmall) { + if (!shjhBizsmall.getBoolean("shjh_tsfk")) { + addErrorInfo(bill, "【业务小类】中【是否推送费控系统】=否"); + } + } else { + addErrorInfo(bill, "业务小类为空"); + } + if (bill.getBoolean("shjh_ispushfk")) { + addErrorInfo(bill, "付款单需推送费控系统 = 是"); + } + } JSONObject data = new JSONObject(); // 构建header JSONObject header = buildHeader(bill); @@ -44,15 +66,11 @@ public class PaybillOperation extends AbstractOperationServicePlugIn implements data.put("header", header); data.put("body", body); JSONObject jsonObject = withholding_billing(data, bill.getString("billno")); - String code = (String)jsonObject.get("code"); + String code = (String) jsonObject.get("code"); if (!"0".equals(code)) { - OperateErrorInfo operateErrorInfo = new OperateErrorInfo(); - operateErrorInfo.setMessage("付款单:"+bill.getString("billno")+"推送费控失败:" + jsonObject.get("msg")); - operateErrorInfo.setErrorLevel(ErrorLevel.Error.name()); - operateErrorInfo.setPkValue(bill.getPkValue()); - this.operationResult.addErrorInfo(operateErrorInfo); - }else { - bill.set("shjh_ispushfk",true); + addErrorInfo(bill, "推送费控失败:" + jsonObject.get("msg")); + } else { + bill.set("shjh_ispushfk", true); SaveServiceHelper.save(new DynamicObject[]{bill}); this.operationResult.addSuccessPkId(bill.getPkValue()); } @@ -60,6 +78,15 @@ public class PaybillOperation extends AbstractOperationServicePlugIn implements } } + // 提取的方法 + private void addErrorInfo(DynamicObject bill, String errorMsg) { + OperateErrorInfo operateErrorInfo = new OperateErrorInfo(); + operateErrorInfo.setMessage("付款单:" + bill.getString("billno") + "推送费控失败:" + errorMsg); + operateErrorInfo.setErrorLevel(ErrorLevel.Error.name()); + operateErrorInfo.setPkValue(bill.getPkValue()); + this.operationResult.addErrorInfo(operateErrorInfo); + } + // 构建header方法 public static JSONObject buildHeader(DynamicObject bill) { bill = BusinessDataServiceHelper.loadSingle(bill.getPkValue(), "cas_paybill"); diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/task/PaybillPushFkTask.java b/main/java/shjh/jhzj7/fi/fi/plugin/task/PaybillPushFkTask.java index 9cf403e..3d21c9e 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/task/PaybillPushFkTask.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/task/PaybillPushFkTask.java @@ -2,42 +2,67 @@ package shjh.jhzj7.fi.fi.plugin.task; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.sap.db.jdbc.packet.ErrorLevel; import kd.bos.context.RequestContext; +import kd.bos.dataentity.OperateOption; import kd.bos.dataentity.entity.DynamicObject; -import kd.bos.entity.operate.result.OperateErrorInfo; +import kd.bos.entity.operate.OperateOptionConst; +import kd.bos.entity.operate.result.OperationResult; import kd.bos.exception.KDException; +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.schedule.executor.AbstractTask; import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.operation.OperationServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper; import kd.sdk.plugin.Plugin; +import java.util.ArrayList; import java.util.Map; -import static shjh.jhzj7.fi.fi.plugin.operate.PaybillOperation.buildBody; -import static shjh.jhzj7.fi.fi.plugin.operate.PaybillOperation.buildHeader; -import static shjh.jhzj7.fi.fi.utils.SapUtils.withholding_billing; public class PaybillPushFkTask extends AbstractTask implements Plugin { + private final static Log logger = LogFactory.getLog(PaybillPushFkTask.class); + @Override public void execute(RequestContext requestContext, Map map) throws KDException { - DynamicObject[] paybills = BusinessDataServiceHelper.load("cas_paybill", "id", null); - for (DynamicObject paybill : paybills) { - JSONObject data = new JSONObject(); - // 构建header - JSONObject header = buildHeader(paybill); - // 构建body - JSONArray body = buildBody(paybill); - data.put("header", header); - data.put("body", body); - JSONObject jsonObject = withholding_billing(data, paybill.getString("billno")); - String code = (String)jsonObject.get("code"); - if (!"0".equals(code)) { - //todo:失败:记录错误信息 - }else { - paybill.set("shjh_ispushfk",true); - SaveServiceHelper.save(new DynamicObject[]{paybill}); + + /** + * 【付款标识】=被动付款时显示。(付款标识_paymentidentify) + * 当【业务小类】中【是否推送费控系统】=是时, + * 该付款单需推送费控系统,推送后,标记此字段为是。 + */ + QFilter q1 = new QFilter("paymentidentify.number", QCP.equals, "FKBS02");//付款标识为被动付款 + QFilter q2 = new QFilter("shjh_bizsmall.shjh_tsfk", QCP.equals, true);//【业务小类】中【是否推送费控系统】=是 + QFilter q3 = new QFilter("shjh_ispushfk", QCP.equals, false);//付款单需推送费控系统 = 否 + DynamicObject[] paybills = BusinessDataServiceHelper.load("cas_paybill", "id", new QFilter[]{q1, q2, q3}); + if (paybills.length!=0){ + ArrayList ids = new ArrayList<>(); + for (DynamicObject dynamicObject : paybills) { + ids.add(dynamicObject.getLong("id")); + } + Map recBillMap = BusinessDataServiceHelper.loadFromCache(ids.toArray(), "cas_paybill"); + OperateOption operateOption = OperateOption.create(); + // 不执行警告级别校验器 + operateOption.setVariableValue(OperateOptionConst.IGNOREWARN, String.valueOf(true)); + // 不显示交互提示,自动执行到底 + operateOption.setVariableValue(OperateOptionConst.IGNOREINTERACTION, String.valueOf(true)); + // 全部校验通过才保存 + operateOption.setVariableValue(OperateOptionConst.STRICTVALIDATION, String.valueOf(true)); + //同一个用户在多个界面操作同一张,也不允许操作 + operateOption.setVariableValue(OperateOptionConst.MUTEX_ISSTRICT, String.valueOf(true)); + for (DynamicObject dynamicObject : recBillMap.values()) { + // 注意:executeOperate 需要一个数组形式的 DynamicObject[] + DynamicObject[] billArray = new DynamicObject[]{dynamicObject}; + OperationResult operationResult = OperationServiceHelper.executeOperate("pushfk", "cas_paybill", billArray, operateOption); + // 可以根据需要处理 operationResult,例如检查是否成功、获取返回值等 + if (operationResult.isSuccess()) { + logger.info("执行 pushfk 失败,单据编号:" + dynamicObject.getPkValue()); + } else { + logger.error(operationResult.getMessage()); + } } } } diff --git a/main/java/shjh/jhzj7/fi/fi/webapi/PayreceiptQueryControler.java b/main/java/shjh/jhzj7/fi/fi/webapi/PayreceiptQueryControler.java new file mode 100644 index 0000000..40dbc44 --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/webapi/PayreceiptQueryControler.java @@ -0,0 +1,123 @@ +package shjh.jhzj7.fi.fi.webapi; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.JSONObject; +import com.drew.lang.annotations.NotNull; +import kd.bos.api.client.ApiResult; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.logging.Log; +import kd.bos.logging.LogFactory; +import kd.bos.openapi.common.custom.annotation.ApiController; +import kd.bos.openapi.common.custom.annotation.ApiPostMapping; +import kd.bos.openapi.common.custom.annotation.ApiRequestBody; +import kd.bos.openapi.common.result.CustomApiResult; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import shjh.jhzj7.fi.fi.utils.JhzjUtils; +import shjh.jhzj7.fi.fi.webapi.model.PaybillVoucherNumModel; +import shjh.jhzj7.fi.fi.webapi.model.PayreceiptQueryModel; + +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +import static shjh.jhzj7.fi.fi.webapi.ApplyAdjustBillControler.loadOrgByCompanyNum; + +/** + * 付款电子回单查询接口 + */ +@ApiController(value = "PayreceiptQueryControler", desc = "付款电子回单查询接口,自定义插件") +public class PayreceiptQueryControler { + + private static final String Apimenthod = "付款电子回单查询接口"; + private static final Log log = LogFactory.getLog(PayreceiptQueryControler.class); + private static final String apimenthod = "/payreceipt_query"; + + @ApiPostMapping(value = apimenthod, desc = "付款电子回单查询接口") + public CustomApiResult paybill_vouchernum(@NotNull @Valid @ApiRequestBody(value = "入参json格式数据") PayreceiptQueryModel PayreceiptQuerybill) { + + //select * from T_CAS_PaymentBill where fbillno = 'FKZJ2025030006'; 2168985504052162560 + //select * from t_org_org where fid = 2116753963226241024; + JSONObject json_body; + String jsonBodyString = null; + try { + // 解析入参,如果格式不正确,日志记录,并反馈esb7.4.1 + json_body = (JSONObject) JSON.toJSON(PayreceiptQuerybill); + jsonBodyString = JSON.toJSONString(json_body); + } catch (JSONException e) { + return handleErrorAndReturn("付款电子回单查询接口入参异常:" + e.getMessage(), Apimenthod, null); + } + //返回值 + ApiResult customApiResult = new ApiResult(""); + HashMap map = new HashMap<>(); + + List items = PayreceiptQuerybill.getItems(); + for (PayreceiptQueryModel.EntryBean item : items) { + String companyNum = item.getCompanyNum();//公司编号 + String kdPayBillID = item.getKdPayBillID();//金蝶付款单ID + String fkBillID = item.getFkBillID();//费控单据主表ID + String fkEntryID = item.getFkEntryID();//费控单据分录ID + String fkBillNumber = item.getFkBillNumber();//费控单据编号 + + DynamicObject org = loadOrgByCompanyNum(companyNum); + if (org == null) { + return handleErrorAndReturn("同步失败,费控单据编号:" + fkBillNumber + "的组织编码不存在", fkBillNumber, jsonBodyString); + } + + if (kdPayBillID == null || kdPayBillID.isEmpty()) { + return handleErrorAndReturn("同步失败, kdPayBillID 为空或未设置", fkBillNumber, jsonBodyString); + } + QFilter q1 = null; + try { + Long kdPayBillIDLong = Long.valueOf(kdPayBillID); + q1 = new QFilter("id", QCP.equals, kdPayBillIDLong); + } catch (NumberFormatException e) { + return handleErrorAndReturn("同步失败, kdPayBillID 格式不正确: " + kdPayBillID, fkBillNumber, jsonBodyString); + } + QFilter q2 = new QFilter("openorg.number", QCP.equals, companyNum); + QFilter q3 = new QFilter("shjh_fkbillid", QCP.equals, fkBillID); + QFilter q4 = new QFilter("shjh_fkentryid", QCP.equals, fkEntryID); + DynamicObject paybill = BusinessDataServiceHelper.loadSingle("cas_paybill", new QFilter[]{q1, q2, q3, q4}); + if (null == paybill) { + return handleErrorAndReturn("同步失败:付款单不存在", fkEntryID, jsonBodyString); + } + + customApiResult.setHeaders(map); + customApiResult.getHeaders().put("companyNum",companyNum); + customApiResult.getHeaders().put("kdPayBillID",kdPayBillID); + customApiResult.getHeaders().put("fkBillID",fkBillID); + customApiResult.getHeaders().put("fkEntryID",fkEntryID); + customApiResult.getHeaders().put("receipturl","url");//todo:url待确认 + } + + return CustomApiResult.success(customApiResult); + } + + /** + * 处理错误并返回失败结果 + * + * @param errorMessage 错误信息 + * @param fkBillNum 费控单据编号 + * @param jsonBodyString 入参JSON字符串 + * @return 失败的CustomApiResult对象 + */ + public static CustomApiResult handleErrorAndReturn(String errorMessage, String fkBillNum, String jsonBodyString) { + handleError(errorMessage, fkBillNum, jsonBodyString); + return CustomApiResult.fail("400", errorMessage); + } + + /** + * 处理错误日志 + * + * @param errorMessage 错误信息 + * @param fkBillNum 费控单据编号 + * @param jsonBodyString 入参JSON字符串 + */ + public static void handleError(String errorMessage, String fkBillNum, String jsonBodyString) { + log.error(errorMessage); + // 可以添加更多的错误处理逻辑,如记录到数据库等 + JhzjUtils.saveLog(fkBillNum, Apimenthod, jsonBodyString, errorMessage, false, "API"); + } +} diff --git a/main/java/shjh/jhzj7/fi/fi/webapi/VouchernumControler.java b/main/java/shjh/jhzj7/fi/fi/webapi/VouchernumControler.java index 176a42d..8f8ec89 100644 --- a/main/java/shjh/jhzj7/fi/fi/webapi/VouchernumControler.java +++ b/main/java/shjh/jhzj7/fi/fi/webapi/VouchernumControler.java @@ -49,7 +49,7 @@ public class VouchernumControler { json_body = (JSONObject) JSON.toJSON(paybillVouchertbill); jsonBodyString = JSON.toJSONString(json_body); } catch (JSONException e) { - return handleErrorAndReturn("费控-SAP付款凭证号接口入参异常:" + e.getMessage(), "费控-SAP付款凭证号接口", null); + return handleErrorAndReturn("费控-SAP付款凭证号接口入参异常:" + e.getMessage(), Apimenthod, null); } List items = paybillVouchertbill.getItems(); for (PaybillVoucherNumModel.EntryBean item : items) { diff --git a/main/java/shjh/jhzj7/fi/fi/webapi/model/PaybillVoucherNumModel.java b/main/java/shjh/jhzj7/fi/fi/webapi/model/PaybillVoucherNumModel.java index 60ba2bc..08e36e7 100644 --- a/main/java/shjh/jhzj7/fi/fi/webapi/model/PaybillVoucherNumModel.java +++ b/main/java/shjh/jhzj7/fi/fi/webapi/model/PaybillVoucherNumModel.java @@ -10,7 +10,7 @@ import java.util.List; @ApiModel public class PaybillVoucherNumModel { - @ApiParam(value="明细数据集合",required=false,position=1) + @ApiParam(value="明细数据集合",required=true,position=1) private List items; @ApiModel public static class EntryBean implements Serializable { diff --git a/main/java/shjh/jhzj7/fi/fi/webapi/model/PayreceiptQueryModel.java b/main/java/shjh/jhzj7/fi/fi/webapi/model/PayreceiptQueryModel.java new file mode 100644 index 0000000..cc39282 --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/webapi/model/PayreceiptQueryModel.java @@ -0,0 +1,77 @@ +package shjh.jhzj7.fi.fi.webapi.model; + + +import kd.bos.openapi.common.custom.annotation.ApiModel; +import kd.bos.openapi.common.custom.annotation.ApiParam; + +import java.io.Serializable; +import java.util.List; + +@ApiModel +public class PayreceiptQueryModel { + + @ApiParam(value="明细数据集合",required=true,position=1) + private List items; + + @ApiModel + public static class EntryBean implements Serializable { + @ApiParam(value = "公司编号", required = true, position = 1) + private String companyNum; + @ApiParam(value = "金蝶付款单ID", required = true, position = 2) + private String kdPayBillID; + @ApiParam(value = "费控单据主表ID", required = true, position = 3) + private String fkBillID; + @ApiParam(value = "费控单据分录ID", required = true, position = 4) + private String fkEntryID; + @ApiParam(value = "费控单据编号", required = true, position = 5) + private String fkBillNumber; + + public String getCompanyNum() { + return companyNum; + } + + public void setCompanyNum(String companyNum) { + this.companyNum = companyNum; + } + + public String getKdPayBillID() { + return kdPayBillID; + } + + public void setKdPayBillID(String kdPayBillID) { + this.kdPayBillID = kdPayBillID; + } + + public String getFkBillID() { + return fkBillID; + } + + public void setFkBillID(String fkBillID) { + this.fkBillID = fkBillID; + } + + public String getFkEntryID() { + return fkEntryID; + } + + public void setFkEntryID(String fkEntryID) { + this.fkEntryID = fkEntryID; + } + + public String getFkBillNumber() { + return fkBillNumber; + } + + public void setFkBillNumber(String fkBillNumber) { + this.fkBillNumber = fkBillNumber; + } + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } +}