付款电子回单查询

This commit is contained in:
yuxueliang0813 2025-04-11 16:01:22 +08:00
parent 5f5313b248
commit 76b7a43975
5 changed files with 156 additions and 108 deletions

View File

@ -1,15 +1,16 @@
package shjh.jhzj7.fi.fi.plugin.form;
import kd.bos.context.RequestContext;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.form.events.SetFilterEvent;
import kd.bos.list.plugin.AbstractListPlugin;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.permission.PermissionServiceHelper;
import kd.sdk.plugin.Plugin;
import java.util.EventObject;
import java.util.Set;
/**
* 列表插件-清账明细单-过滤创建人
@ -17,7 +18,9 @@ import java.util.Set;
*/
public class ClearDetailBillListPlugin extends AbstractListPlugin implements Plugin {
private boolean isArRole = false;//是否应收角色
private boolean isArRole = false;//是否属于应收组
private static final String entityName = "bos_usergroupstaff";//用户组职员关系 T_SEC_UserGroupStaff
@Override
public void setFilter(SetFilterEvent e) {
@ -29,12 +32,28 @@ public class ClearDetailBillListPlugin extends AbstractListPlugin implements Plu
}
private void setArRole(){
//判断当前用户的角色是否是应收是应收返回true
// PermissionServiceHelper.getUsersByRoleNum("source_quality_DJ");//根据角色编号查找下属所有用户
Set<String> roles = PermissionServiceHelper.getRolesByUser(RequestContext.get().getCurrUserId());//根据用户ID查找所属角色集合
//TODO 再判断集合中是否包含应收角色
if(roles.contains("ar000")){
//如果是全功能用户返回true
if(PermissionServiceHelper.isSuperUser(RequestContext.get().getCurrUserId())){
isArRole = true;
return;
}
// PermissionServiceHelper.getUsersByRoleNum("source_quality_DJ");//根据角色编号查找下属所有用户
// Set<String> roles = PermissionServiceHelper.getRolesByUser(RequestContext.get().getCurrUserId());//根据用户ID查找所属角色集合
// //再判断集合中是否包含应收角色
// if(roles.contains("ar000")){
// isArRole = true;
// }
//判断当前用户的用户组是否是应收是应收返回true
DynamicObject[] ddos = BusinessDataServiceHelper.load(entityName, "usergroup.id,usergroup.number,usergroup.name",
new QFilter[]{new QFilter("user", QCP.equals, RequestContext.get().getCurrUserId())});
DynamicObject groupinfo;
for (DynamicObject ddo : ddos) {
groupinfo = ddo.getDynamicObject("usergroup");
if("应收组".equals(groupinfo.getString("name"))){
isArRole = true;
break;
}
}
}

View File

@ -239,10 +239,11 @@ public class FundPlanCollectionTask extends AbstractTask implements Plugin {
QFilter startDateFilter = new QFilter("shjh_begindate", QCP.less_equals, currentDate);
QFilter endDateFilter = new QFilter("shjh_enddate", QCP.large_equals, currentDate);
QFilter newFilter = qFilter.and(startDateFilter).and(endDateFilter);
accounts = BusinessDataServiceHelper.load(payReceName, "id", newFilter.toArray());
//多个条件时根据优先级排序拿到优先级最高的
accounts = BusinessDataServiceHelper.load(payReceName, "id", newFilter.toArray(),"shjh_priority");
}
if (accounts.length > 0) {
// 处理找到符合条件的账户
// 处理找到符合条件的资金科目
DynamicObject account = accounts[0];
account = BusinessDataServiceHelper.loadSingle(account.getPkValue(), payReceName);
return account.getDynamicObject("shjh_membersubject").getString("number");

View File

@ -6,8 +6,6 @@ import com.alibaba.fastjson.JSONObject;
import com.drew.lang.annotations.NotNull;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.fileservice.FileService;
import kd.bos.fileservice.FileServiceFactory;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.openapi.common.custom.annotation.ApiController;
@ -17,14 +15,12 @@ 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 kd.bos.util.ExceptionUtils;
import kd.bos.util.StringUtils;
import kd.tmc.bei.common.helper.ReceiptPrintHelper;
import shjh.jhzj7.fi.fi.utils.JhzjUtils;
import shjh.jhzj7.fi.fi.webapi.model.ApiResultExt;
import shjh.jhzj7.fi.fi.webapi.model.PayreceiptQueryModel;
import javax.validation.Valid;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
@ -37,8 +33,11 @@ import static shjh.jhzj7.fi.fi.webapi.ApplyAdjustBillControler.loadOrgByCompanyN
public class PayreceiptQueryControler {
private static final String Apimenthod = "付款电子回单查询接口";
private static final Log log = LogFactory.getLog(PayreceiptQueryControler.class);
private static final Log logger = LogFactory.getLog(PayreceiptQueryControler.class);
private static final String apimenthod = "/payreceipt_query";
private static final String detailName = "bei_intelpay";//交易明细标识
private static final String elecreceiptName = "bei_elecreceipt";//电子回单标识
private static final String paybillName = "cas_paybill";//付款单标识 T_CAS_PaymentBill
@ApiPostMapping(value = apimenthod, desc = "付款电子回单查询接口")
public CustomApiResult<ApiResultExt> paybill_vouchernum(@NotNull @Valid @ApiRequestBody(value = "入参json格式数据") PayreceiptQueryModel PayreceiptQuerybill) {
@ -47,7 +46,7 @@ public class PayreceiptQueryControler {
//select * from T_CAS_PaymentBill where fbillno = 'FKZJ2025030006'; 2168985504052162560
//select * from t_org_org where fid = 2116753963226241024;
JSONObject json_body;
String jsonBodyString = null;
String jsonBodyString;
try {
// 解析入参如果格式不正确日志记录并反馈esb7.4.1
json_body = (JSONObject) JSON.toJSON(PayreceiptQuerybill);
@ -64,27 +63,35 @@ public class PayreceiptQueryControler {
String fkBillID = item.getFkBillID();//费控单据主表ID
String fkEntryID = item.getFkEntryID();//费控单据分录ID
String fkBillNumber = item.getFkBillNumber();//费控单据编号
String voucherNum = item.getVoucherNum();//付款凭证号
String voucherYear = item.getVoucherYear();//付款凭证会计年度
DynamicObject org = loadOrgByCompanyNum(companyNum);
if (org == null) {
return handleErrorAndReturn("同步失败,费控单据编号:" + fkBillNumber + "的组织编码不存在", fkBillNumber, jsonBodyString,apiResultExt);
return handleErrorAndReturn("查询失败,费控单据编号:" + fkBillNumber + "的组织编码不存在", fkBillNumber, jsonBodyString,apiResultExt);
}
QFilter q1 = new QFilter("openorg.number", QCP.equals, companyNum);
QFilter q1 = new QFilter("openorg.number", QCP.equals, companyNum);//公司编号
if (kdPayBillID != null && !kdPayBillID.isEmpty()) {
q1 = addFilterIfNotNull(q1, "id", Long.valueOf(kdPayBillID));
q1 = addFilterIfNotNull(q1, "id", Long.valueOf(kdPayBillID));//金蝶付款单ID
}
q1 = addFilterIfNotEmpty(q1, "shjh_fkbillid", fkBillID);
q1 = addFilterIfNotEmpty(q1, "shjh_fkentryid", fkEntryID);
DynamicObject paybill = BusinessDataServiceHelper.loadSingle("cas_paybill", new QFilter[]{q1});
q1 = addFilterIfNotEmpty(q1, "shjh_fkbillid", fkBillID);//费控单据主表ID
q1 = addFilterIfNotEmpty(q1, "shjh_fkentryid", fkEntryID);//费控单据分录ID
q1 = addFilterIfNotEmpty(q1, "entry.shjh_fkdjbh", fkBillNumber);//费控单据编号-外部系统单号
q1 = addFilterIfNotEmpty(q1, "shjh_credentialnum", voucherNum);//付款凭证号
DynamicObject paybill = BusinessDataServiceHelper.loadSingle(paybillName, new QFilter[]{q1});
if (null == paybill) {
return handleErrorAndReturn("同步失败:付款单不存在", fkEntryID, jsonBodyString,apiResultExt);
return handleErrorAndReturn("查询失败:付款单不存在", fkEntryID, jsonBodyString,apiResultExt);
}
//申明此次查询的返回值
ApiResultExt.EntryBean entryBean = new ApiResultExt.EntryBean();
entryBean.setCompanyNum(companyNum);
entryBean.setKdPayBillID(String.valueOf(paybill.getPkValue()));
entryBean.setFkBillID(paybill.getString("shjh_fkbillid"));
entryBean.setFkEntryID(paybill.getString("shjh_fkentryid"));
entryBean.setCompanyNum(companyNum);//公司编号
entryBean.setKdPayBillID(String.valueOf(paybill.getPkValue()));//金蝶付款单ID
entryBean.setFkBillID(paybill.getString("shjh_fkbillid"));//费控单据主表ID
entryBean.setFkEntryID(paybill.getString("shjh_fkentryid"));//费控单据分录ID
entryBean.setFkBillNumber(fkBillNumber);//费控单据编号
entryBean.setVoucherNum(voucherNum);//付款凭证号
entryBean.setVoucherYear(voucherYear);//付款凭证会计年度
//查询电子回单,返回pdf url
//1.付款单查询明细
DynamicObjectCollection bankcheckentity = paybill.getDynamicObjectCollection("bankcheckentity");//交易明细分录
@ -92,95 +99,65 @@ public class PayreceiptQueryControler {
for (DynamicObject dynamicObject : bankcheckentity) {
String edetailbillno = dynamicObject.getString("edetailbillno");//交易明细编号
QFilter qFilter = new QFilter("billno", QCP.equals, edetailbillno);
//被动付款入账
DynamicObject beiIntelpay = BusinessDataServiceHelper.loadSingle("bei_intelpay",
//被动付款入账-交易明细
DynamicObject beiIntelpay = BusinessDataServiceHelper.loadSingle(detailName,
"id,billno,matchreceiptentry,matchreceiptentry.e_receiptid", qFilter.toArray());
if (beiIntelpay != null) {
//电子回单关联信息分录
DynamicObjectCollection matchreceiptentry = beiIntelpay.getDynamicObjectCollection("matchreceiptentry");
if (!matchreceiptentry.isEmpty()) {
for (DynamicObject object : matchreceiptentry) {
Long eReceiptid = object.getLong("e_receiptid");//电子回单ID
QFilter qFilter1 = new QFilter("id", QCP.equals, eReceiptid);
//电子回单信息
DynamicObject receipt = BusinessDataServiceHelper.loadSingle("bei_elecreceipt",
"id,uploadfilename", qFilter1.toArray());
if (null != receipt) {
String realUploadUrl = getRealUploadUrl(receipt);
String[] split = realUploadUrl.split("/");
String fileName = split[split.length - 1];
String desPlace = "./".concat(fileName);
OutputStream out = downloadFile(desPlace, realUploadUrl);
File ofdFile = getFile(out, realUploadUrl, desPlace);
System.out.println("");
DynamicObjectCollection mentrys = beiIntelpay.getDynamicObjectCollection("matchreceiptentry");
if (!mentrys.isEmpty()) {
// for (DynamicObject object : matchreceiptentry) {
// }
Long eReceiptid = mentrys.get(0).getLong("e_receiptid");//电子回单ID
//电子回单信息
DynamicObject receipt = BusinessDataServiceHelper.loadSingle(eReceiptid,elecreceiptName,"id,fileflag,receiptno,uploadfilename");
if (null != receipt) {
String receiptNo = receipt.getString("receiptno");
if (receipt.getBoolean("fileflag")) {
try {
String realUploadUrl = ReceiptPrintHelper.getRealUploadUrl(receipt);//电子回单真实路径
realUploadUrl = ReceiptPrintHelper.getFilePreviewUrl(realUploadUrl);
entryBean.setReceipturl(realUploadUrl);
logger.info("电子回单预览URL: "+realUploadUrl);
// new ViewReceiptService().getElecByReceiptno();//可获得电子回单的查看URL kd.tmc.bei.business.opservice.elec
// byte[] stream = BeiHelper.getPdfPutStream(realUploadUrl);//电子回单字节数组
// if (stream.length <= 1) {
// logger.warn(receiptNo + "下载回单文件流为空,请检查回单文件路径值。");
// } else {
// entryBean.setFileName(realUploadUrl.substring(realUploadUrl.lastIndexOf("/")+1));
// entryBean.setFileData(stream);
// logger.info("电子回单文件下载成功: "+entryBean.getFileName());
// entryBean.setErrormsg(realUploadUrl);
// String[] split = realUploadUrl.split("\\.");
// resultMap.put(receiptNo, new OpenApiFile(realUploadUrl, split[split.length - 1], true, stream));
// }
} catch (Exception var11) {
logger.error("电子回单获取文件路径异常: " + var11.getMessage());
return handleErrorAndReturn("查询失败:电子回单获取文件路径异常", eReceiptid+"", jsonBodyString,apiResultExt);
}
} else {
logger.warn(receiptNo + "回单为非文件类回单");
return handleErrorAndReturn("查询失败:回单为非文件类回单", eReceiptid+"", jsonBodyString,apiResultExt);
}
}else{
return handleErrorAndReturn("查询失败:电子回单不存在", eReceiptid+"", jsonBodyString,apiResultExt);
}
}else{
return handleErrorAndReturn("查询失败:交易明细未关联电子回单", edetailbillno, jsonBodyString,apiResultExt);
}
}else{
return handleErrorAndReturn("查询失败:交易明细编号不存在", edetailbillno, jsonBodyString,apiResultExt);
}
}
}else{
return handleErrorAndReturn("查询失败:付款单未关联交易明细", fkEntryID, jsonBodyString,apiResultExt);
}
entryBean.setReceipturl("https://fm-test.jahwa.com.cn/ierp/?formId=home_page");
entryBeans.add(entryBean);
}
return handleSuccessAndReturn(apiResultExt, entryBeans);
}
/**
* 获取文件真实路径
*/
public static String getRealUploadUrl(DynamicObject receipt) {
String uploadFilName = receipt.getString("uploadfilename");
String realPath = "";
if (StringUtils.isNotEmpty(uploadFilName)) {
realPath = uploadFilName;
if (!uploadFilName.contains(".") && !uploadFilName.contains("/")) {
//不是以路径结尾的, 作为查询条件去查实际路径
try {
FileService attachmentFileService = FileServiceFactory.getAttachmentFileService();
realPath = attachmentFileService.getFileServiceExt().getRealPath(uploadFilName);
}catch (Exception e) {
log.error("获取文件真实路径失败" + ExceptionUtils.getExceptionStackTraceMessage(e));
}
}
}
return realPath;
}
public static OutputStream downloadFile(String desPlace, String realUploadUrl) {
OutputStream out = null;
try {
FileService fs = FileServiceFactory.getAttachmentFileService();
String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36";
try {
out = new FileOutputStream(desPlace);
} catch (FileNotFoundException e) {
log.error("根据目标路径创建文件输出流出错 {}", e.getMessage());
}
fs.download(realUploadUrl, out, userAgent);
} catch (Exception e) {
log.error("执行download下载操作出错 {}", e.getMessage());
}
return out;
}
public static File getFile(OutputStream outStream, String relativeUrl, String targetPdfRoute){
FileService fileService = FileServiceFactory.getAttachmentFileService();
try (InputStream inputStream = fileService.getInputStream(relativeUrl)){
byte[] buffer = new byte[inputStream.available()];
inputStream.read(buffer);
File targetFile = new File(targetPdfRoute);
outStream.write(buffer);
return targetFile;
}catch (Exception e) {
log.error("从容器获取电子回单pdf失败 {}", e.getMessage());
return null;
}
}
private static QFilter addFilterIfNotNull(QFilter baseFilter, String field, Long value) {
private QFilter addFilterIfNotNull(QFilter baseFilter, String field, Long value) {
if (value != null) {
QFilter newFilter = new QFilter(field, QCP.equals, value);
return baseFilter.and(newFilter);
@ -188,7 +165,7 @@ public class PayreceiptQueryControler {
return baseFilter;
}
private static QFilter addFilterIfNotEmpty(QFilter baseFilter, String field, String value) {
private QFilter addFilterIfNotEmpty(QFilter baseFilter, String field, String value) {
if (value != null && !value.isEmpty()) {
QFilter newFilter = new QFilter(field, QCP.equals, value);
return baseFilter.and(newFilter);
@ -204,7 +181,7 @@ public class PayreceiptQueryControler {
* @param jsonBodyString 入参JSON字符串
* @return 失败的CustomApiResult对象
*/
public static CustomApiResult<ApiResultExt> handleErrorAndReturn(String errorMessage, String fkBillNum, String jsonBodyString,ApiResultExt apiResultExt) {
public CustomApiResult<ApiResultExt> handleErrorAndReturn(String errorMessage, String fkBillNum, String jsonBodyString,ApiResultExt apiResultExt) {
handleError(errorMessage, fkBillNum, jsonBodyString);
apiResultExt.setErrorCode("400");
apiResultExt.setStatus(false);
@ -217,7 +194,7 @@ public class PayreceiptQueryControler {
* 处理成功并返回结果
* @return 成功的CustomApiResult对象
*/
public static CustomApiResult<ApiResultExt> handleSuccessAndReturn(ApiResultExt apiResultExt, List<ApiResultExt.EntryBean> entryBeans) {
public CustomApiResult<ApiResultExt> handleSuccessAndReturn(ApiResultExt apiResultExt, List<ApiResultExt.EntryBean> entryBeans) {
apiResultExt.setErrorCode("0");
apiResultExt.setStatus(true);
apiResultExt.setData(entryBeans);
@ -232,8 +209,8 @@ public class PayreceiptQueryControler {
* @param fkBillNum 费控单据编号
* @param jsonBodyString 入参JSON字符串
*/
public static void handleError(String errorMessage, String fkBillNum, String jsonBodyString) {
log.error(errorMessage);
public void handleError(String errorMessage, String fkBillNum, String jsonBodyString) {
logger.error(errorMessage);
// 可以添加更多的错误处理逻辑如记录到数据库等
JhzjUtils.saveLog(fkBillNum, Apimenthod, jsonBodyString, errorMessage, false, "API");
}

View File

@ -30,7 +30,13 @@ public class ApiResultExt implements Serializable {
private String fkBillID;
@ApiParam("费控单据分录ID")
private String fkEntryID;
@ApiParam("电子回单的URL有可能为空")
@ApiParam("费控单据编号")
private String fkBillNumber;
@ApiParam("付款凭证号")
private String voucherNum;
@ApiParam("付款凭证会计年度")
private String voucherYear;
@ApiParam("电子回单的预览URL有可能为空")
private String receipturl;
public String getCompanyNum() {
@ -65,6 +71,22 @@ public class ApiResultExt implements Serializable {
this.fkEntryID = fkEntryID;
}
public String getVoucherNum() {
return voucherNum;
}
public void setVoucherNum(String voucherNum) {
this.voucherNum = voucherNum;
}
public String getVoucherYear() {
return voucherYear;
}
public void setVoucherYear(String voucherYear) {
this.voucherYear = voucherYear;
}
public String getReceipturl() {
return receipturl;
}
@ -72,6 +94,15 @@ public class ApiResultExt implements Serializable {
public void setReceipturl(String receipturl) {
this.receipturl = receipturl;
}
public String getFkBillNumber() {
return fkBillNumber;
}
public void setFkBillNumber(String fkBillNumber) {
this.fkBillNumber = fkBillNumber;
}
}
public Boolean getStatus() {

View File

@ -25,6 +25,26 @@ public class PayreceiptQueryModel implements Serializable{
private String fkEntryID;
@ApiParam(value = "费控单据编号", required = false, position = 5)
private String fkBillNumber;
@ApiParam(value = "付款凭证号", required = false, position = 6)
private String voucherNum;
@ApiParam(value = "付款凭证会计年度", required = false, position = 7)
private String voucherYear;
public String getVoucherNum() {
return voucherNum;
}
public void setVoucherNum(String voucherNum) {
this.voucherNum = voucherNum;
}
public String getVoucherYear() {
return voucherYear;
}
public void setVoucherYear(String voucherYear) {
this.voucherYear = voucherYear;
}
public String getCompanyNum() {
return companyNum;