1.家化电子回单接口,差url

2.推送费控过滤条件(定时任务改成调操作)

--s
This commit is contained in:
weiyunlong 2025-03-15 17:28:13 +08:00
parent 533be5bc9a
commit c094710ceb
6 changed files with 283 additions and 31 deletions

View File

@ -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);
@ -46,11 +68,7 @@ public class PaybillOperation extends AbstractOperationServicePlugIn implements
JSONObject jsonObject = withholding_billing(data, bill.getString("billno"));
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);
addErrorInfo(bill, "推送费控失败:" + jsonObject.get("msg"));
} else {
bill.set("shjh_ispushfk", true);
SaveServiceHelper.save(new DynamicObject[]{bill});
@ -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");

View File

@ -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<String, Object> 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:失败:记录错误信息
/**
* 付款标识=被动付款时显示(付款标识_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<Long> ids = new ArrayList<>();
for (DynamicObject dynamicObject : paybills) {
ids.add(dynamicObject.getLong("id"));
}
Map<Object, DynamicObject> 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 {
paybill.set("shjh_ispushfk",true);
SaveServiceHelper.save(new DynamicObject[]{paybill});
logger.error(operationResult.getMessage());
}
}
}
}

View File

@ -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<ApiResult> 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<String, String> map = new HashMap<>();
List<PayreceiptQueryModel.EntryBean> 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<ApiResult> 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");
}
}

View File

@ -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<PaybillVoucherNumModel.EntryBean> items = paybillVouchertbill.getItems();
for (PaybillVoucherNumModel.EntryBean item : items) {

View File

@ -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<PaybillVoucherNumModel.EntryBean> items;
@ApiModel
public static class EntryBean implements Serializable {

View File

@ -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<PayreceiptQueryModel.EntryBean> 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<EntryBean> getItems() {
return items;
}
public void setItems(List<EntryBean> items) {
this.items = items;
}
}