材料付款

This commit is contained in:
xiangerlin 2025-07-13 15:13:02 +08:00
parent e891eaba26
commit 43f368a4f1
1 changed files with 424 additions and 245 deletions

View File

@ -1,5 +1,6 @@
package com.hzya.frame.plugin.oa.payment.service.impl; package com.hzya.frame.plugin.oa.payment.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
@ -7,6 +8,7 @@ import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.hzya.frame.plugin.oa.payapply.dao.ICLPayApplyDao;
import com.hzya.frame.plugin.oa.payapply.entity.CLPayApplyEntity; import com.hzya.frame.plugin.oa.payapply.entity.CLPayApplyEntity;
import com.hzya.frame.plugin.oa.payapply.service.ICLPayApplyService; import com.hzya.frame.plugin.oa.payapply.service.ICLPayApplyService;
import com.hzya.frame.plugin.oa.payment.service.IPaybillPluginService; import com.hzya.frame.plugin.oa.payment.service.IPaybillPluginService;
@ -40,6 +42,8 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService {
Logger logger = LoggerFactory.getLogger(PaybillPluginServiceImpl.class); Logger logger = LoggerFactory.getLogger(PaybillPluginServiceImpl.class);
@Autowired @Autowired
private ICLPayApplyService clpayApplyService; private ICLPayApplyService clpayApplyService;
@Autowired
private ICLPayApplyDao clPayApplyDao;
/** /**
* 付款单传到NCC * 付款单传到NCC
@ -68,21 +72,21 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService {
//流程结束 //流程结束
// if (ColEventTypeEnum.ONPROCESSFINISHED.getType().equals(eventType)) { // if (ColEventTypeEnum.ONPROCESSFINISHED.getType().equals(eventType)) {
/** /**
* 判断付款单表头的财务组织如果是002说明是总部代项目部付款 * 判断付款单表头的财务组织如果是002说明是总部代项目部付款
* 要生成对应项目部的付款单 以及 总部的 付款结算单 * 要生成对应项目部的付款单 以及 总部的 付款结算单
* 付款单ap_paybill * 付款单ap_paybill
* 付款结算单cmp_paybill * 付款结算单cmp_paybill
* 如果支付类型是开票保证金要单独生成一张付款结算单 * 如果支付类型是开票保证金要单独生成一张付款结算单
*/ */
//付款单 //付款单
apPaybill(datasourceCode, formmainData, headers, forsonDataList); Boolean flag = apPaybill(datasourceCode, formmainData, headers, forsonDataList);
String orgCode = formmainData.getString("field0053"); String orgCode = formmainData.getString("field0053");
if ("002".equals(orgCode)) { if (flag && "002".equals(orgCode)) {
cmpPaybill(datasourceCode, formmainData, headers, forsonDataList); cmpPaybill(datasourceCode, formmainData, headers, forsonDataList);
} }
// } // }
return BaseResult.getSuccessMessageEntity("操作成功"); return BaseResult.getSuccessMessageEntity("操作成功");
} }
@ -90,6 +94,7 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService {
* 付款结算单 * 付款结算单
* 结算方式编码 10备用金20开票21背书3网银 * 结算方式编码 10备用金20开票21背书3网银
* 如果是开票 总部要生成2张付款结算单一张是保证金 一张是承兑汇票 * 如果是开票 总部要生成2张付款结算单一张是保证金 一张是承兑汇票
* 对于材料类付款来说付款组织是002的情况 基本上就是要生成总部付款结算单因为总部自己不会采购材料
* *
* @param datasourceCode * @param datasourceCode
* @param formmainData * @param formmainData
@ -97,55 +102,100 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService {
* @param forsonDataList * @param forsonDataList
*/ */
private void cmpPaybill(String datasourceCode, JSONObject formmainData, JSONObject headers, List<JSONObject> forsonDataList) { private void cmpPaybill(String datasourceCode, JSONObject formmainData, JSONObject headers, List<JSONObject> forsonDataList) {
String orgCode = formmainData.getString("field0053"); String pk_billmaker = headers.getString("pk_billmaker");
String billmaker = headers.getString("billmaker");
String groupCode = headers.getString("groupCode");
boolean flag = true;
//结算方式编码 10备用金20开票21背书3网银 //结算方式编码 10备用金20开票21背书3网银
String balaTypeCode = formmainData.getString("field0076"); String balaTypeCode = formmainData.getString("field0076");
//付款结算单 //背书和开票 才要生成付款结算单
JSONObject param = getCmpPayBillVO(formmainData, forsonDataList, orgCode, billmaker, groupCode); if ("20".equals(balaTypeCode) || "21".equals(balaTypeCode) || "3".equals(balaTypeCode)) {
String req = JSONObject.toJSONString(param); //付款结算单
logger.info("======OA付款单传NCC付款结算单请求参数:{}======", req); JSONObject param = getCmpPayBillVO(formmainData, forsonDataList, headers,false);
String access_token = getAccessToken(); String req = JSONObject.toJSONString(param);
String result = HttpRequest.post(baseUrl) logger.info("======OA付款单传NCC付款结算单请求参数:{}======", req);
.header("appId", "800065")//NCC应用 String access_token = getAccessToken();
.header("apiCode", "8000650006")//NCC付款结算单新增 String result = HttpRequest.post(baseUrl)
.header("publicKey", "ZJYAbkr9+XjnDrlfQCRKXtpVvg/BjxqtxzcLgg5TIGagEKJCe7eDIk+3zDUT+v578prj")//OA公钥 .header("appId", "800065")//NCC应用
.header("secretKey", "2GR4+yrcx+Ev+pN0Q6V6wxCdvisPX7wzNKBgc5SsIYGxYI5GTISXT6GvTPfp1u2Rj3JzOP8MtA1LSGvL+2BWG8c/o7DKi92S4mr3zcGearA=")//OA密钥 .header("apiCode", "8000650006")//NCC付款结算单新增
.header("access_token", access_token)//token .header("publicKey", "ZJYAbkr9+XjnDrlfQCRKXtpVvg/BjxqtxzcLgg5TIGagEKJCe7eDIk+3zDUT+v578prj")//OA公钥
.body(req)//表单内容 .header("secretKey", "2GR4+yrcx+Ev+pN0Q6V6wxCdvisPX7wzNKBgc5SsIYGxYI5GTISXT6GvTPfp1u2Rj3JzOP8MtA1LSGvL+2BWG8c/o7DKi92S4mr3zcGearA=")//OA密钥
.timeout(30000)//超时毫秒 .header("access_token", access_token)//token
.execute().body(); .body(req)//表单内容
logger.info("======OA付款单传NCC付款结算单响应参数:{}======",result); .timeout(30000)//超时毫秒
if (StrUtil.isNotEmpty(result)){ .execute().body();
JSONObject resultJson = JSONObject.parseObject(result); logger.info("======OA付款单传NCC付款结算单响应参数:{}======", result);
flag = resultJson.getBoolean("flag"); //结算单审批
} String orgCode = formmainData.getString("field0053");
String auditResult = cmpBillAudit(result, access_token, pk_billmaker, orgCode);
if (flag){ if (StrUtil.isNotEmpty(auditResult) && null != getData(auditResult)) {
//保证金单独生成一张付款结算单 //保证金单独生成一张付款结算单
if ("20".equals(balaTypeCode)) { if ("20".equals(balaTypeCode)) {
logger.info("======OA付款单传开票的方式保证金传NCC付款结算单请求参数:{}======"); logger.info("======OA付款单传开票的方式保证金传NCC付款结算单请求参数:{}======");
JSONObject bzjParam = getCmpPayBillVO(formmainData, forsonDataList, orgCode, billmaker, groupCode); JSONObject bzjParam = getCmpPayBillVO(formmainData, forsonDataList, headers,true);
String bzjReq = JSONObject.toJSONString(bzjParam); String bzjReq = JSONObject.toJSONString(bzjParam);
String bazjResult = HttpRequest.post(baseUrl) String bazjResult = HttpRequest.post(baseUrl)
.header("appId", "800065")//NCC应用 .header("appId", "800065")//NCC应用
.header("apiCode", "8000650006")//NCC付款结算单新增 .header("apiCode", "8000650006")//NCC付款结算单新增
.header("publicKey", "ZJYAbkr9+XjnDrlfQCRKXtpVvg/BjxqtxzcLgg5TIGagEKJCe7eDIk+3zDUT+v578prj")//OA公钥 .header("publicKey", "ZJYAbkr9+XjnDrlfQCRKXtpVvg/BjxqtxzcLgg5TIGagEKJCe7eDIk+3zDUT+v578prj")//OA公钥
.header("secretKey", "2GR4+yrcx+Ev+pN0Q6V6wxCdvisPX7wzNKBgc5SsIYGxYI5GTISXT6GvTPfp1u2Rj3JzOP8MtA1LSGvL+2BWG8c/o7DKi92S4mr3zcGearA=")//OA密钥 .header("secretKey", "2GR4+yrcx+Ev+pN0Q6V6wxCdvisPX7wzNKBgc5SsIYGxYI5GTISXT6GvTPfp1u2Rj3JzOP8MtA1LSGvL+2BWG8c/o7DKi92S4mr3zcGearA=")//OA密钥
.header("access_token", access_token)//token .header("access_token", access_token)//token
.body(bzjReq)//表单内容 .body(bzjReq)//表单内容
.timeout(30000)//超时毫秒 .timeout(30000)//超时毫秒
.execute().body(); .execute().body();
logger.info("======OA付款单传开票的方式保证金传NCC付款结算单返回参数:{}",bazjResult); logger.info("======OA付款单传开票的方式保证金传NCC付款结算单返回参数:{}", bazjResult);
//审批结算单
cmpBillAudit(bazjResult, access_token, pk_billmaker,orgCode);
}
} }
} }
} }
/**
* 付款结算单审批
*
* @param str 付款结算单新增返回的报文
* @param access_token token
* @param pk_billmaker 审批人pk
* @param org_code 业务单元
* @return
*/
private String cmpBillAudit(String str, String access_token, String pk_billmaker,String org_code) {
if (StrUtil.isNotEmpty(str)) {
JsonResultEntity resultEntity = JSONObject.parseObject(str, JsonResultEntity.class);
if (resultEntity.isFlag()) {
JSONObject attribute = (JSONObject) resultEntity.getAttribute();
Boolean success = attribute.getBoolean("success");
if (success) {
String bill_no = attribute.getJSONObject("data").getString("bill_no");
String pk_org = attribute.getJSONObject("data").getString("pk_org");
JSONObject reqParams = new JSONObject();
reqParams.put("bill_no", bill_no);
reqParams.put("pk_org", org_code);
reqParams.put("checknote", "同意");
reqParams.put("pk_approver", pk_billmaker);
String approverParam = reqParams.toJSONString();
String approverResult = HttpRequest.post(baseUrl)
.header("appId", "800065")//NCC应用
.header("apiCode", "8000650007")//NCC付款结算单审批
.header("publicKey", "ZJYAbkr9+XjnDrlfQCRKXtpVvg/BjxqtxzcLgg5TIGagEKJCe7eDIk+3zDUT+v578prj")//OA公钥
.header("secretKey", "2GR4+yrcx+Ev+pN0Q6V6wxCdvisPX7wzNKBgc5SsIYGxYI5GTISXT6GvTPfp1u2Rj3JzOP8MtA1LSGvL+2BWG8c/o7DKi92S4mr3zcGearA=")//OA密钥
.header("access_token", access_token)//token
.body(approverParam)//表单内容
.timeout(30000)//超时毫秒
.execute().body();
logger.info("付款结算单审批接口返回数据:{}", approverResult);
return approverResult;
}
}
}
return null;
}
//付款结算单 //付款结算单
@NotNull @NotNull
private static JSONObject getCmpPayBillVO(JSONObject formmainData, List<JSONObject> forsonDataList, String orgCode, String billmaker, String groupCode) { private static JSONObject getCmpPayBillVO(JSONObject formmainData, List<JSONObject> forsonDataList, JSONObject headers,Boolean isBzj) {
String orgCode = formmainData.getString("field0053");
String billmaker = headers.getString("billmaker");
String groupCode = headers.getString("groupCode");
JSONObject param = new JSONObject(); JSONObject param = new JSONObject();
JSONObject head = new JSONObject(); JSONObject head = new JSONObject();
List<JSONObject> body = new LinkedList<>(); List<JSONObject> body = new LinkedList<>();
@ -153,19 +203,24 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService {
param.put("head", head); param.put("head", head);
param.put("body", body); param.put("body", body);
head.put("pk_org", orgCode);//组织编码 head.put("pk_org", orgCode);//组织编码
head.put("pk_group", "ZJJH");//集团编码 head.put("pk_group", groupCode);//集团编码
head.put("bill_type", "F5");//单据类型 head.put("bill_type", "F5");//单据类型
head.put("trade_type", "D5");//付款结算类型 head.put("trade_type", "D5");//付款结算类型
head.put("source_flag", "2");//来源系统 head.put("source_flag", "2");//来源系统
head.put("bill_date", formatDate(formmainData.getString("field0004")));//单据日期 head.put("bill_date", formatDate(formmainData.getString("field0004")));//单据日期
if (!"20".equals(balaTypeCode)) { if (!isBzj) {
head.put("primal_money", formmainData.getString("field0019"));//付款原币金额 head.put("primal_money", formmainData.getString("field0019"));//付款原币金额
head.put("pk_balatype", formmainData.getString("field0076"));//结算方式
} else { } else {
head.put("primal_money", "field0096");//付款原币金额 这里要取保证金 head.put("primal_money", formmainData.getString("field0096"));//付款原币金额 这里要取保证金
//如果是汇票保证金则结算方式用网银
head.put("pk_balatype", "3");//结算方式
} }
head.put("pk_currtype", formmainData.getString("field0087"));//币种名称 head.put("pk_currtype", formmainData.getString("field0087"));//币种名称
head.put("billmaker", billmaker);//制单人名称 head.put("billmaker", billmaker);//制单人名称
head.put("def1", formmainData.getString("field0083"));//账户属性
head.put("def2", formmainData.getString("field0001"));//OA单据号
for (JSONObject item : forsonDataList) { for (JSONObject item : forsonDataList) {
JSONObject b = new JSONObject(); JSONObject b = new JSONObject();
b.put("pk_org", orgCode);//组织编码 b.put("pk_org", orgCode);//组织编码
@ -173,25 +228,33 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService {
b.put("bill_type", head.getString("bill_type"));//单据类型 b.put("bill_type", head.getString("bill_type"));//单据类型
b.put("trade_type", head.getString("trade_type"));//付款结算类型 b.put("trade_type", head.getString("trade_type"));//付款结算类型
b.put("pk_currtype", head.getString("pk_currtype"));//币种编码 b.put("pk_currtype", head.getString("pk_currtype"));//币种编码
b.put("pk_balatype", head.getString("pk_balatype"));//结算方式
b.put("bill_date", formatDate(head.getString("bill_date")));//单据日期 b.put("bill_date", formatDate(head.getString("bill_date")));//单据日期
if (!"20".equals(balaTypeCode)) { b.put("memo",item.getString("field0074"));
if (!isBzj) {
b.put("pay_primal", item.getString("field0030"));//付款原币金额 b.put("pay_primal", item.getString("field0030"));//付款原币金额
b.put("pk_customer", item.getString("field0065"));//这里传项目部的编码是在和项目部做结算
b.put("pk_recproject", headers.getString("付-往来款"));//收支项目 固定写付往来款
} else { } else {
b.put("pay_primal", "field0096");//这里要取保证金 b.put("pay_primal", formmainData.getString("field0096"));//这里要取保证金
b.put("pk_customer", "006");//保证金情况 固定写006浙江建辉矿建集团有限公司汇票保证金户
b.put("pk_recproject", headers.getString("付-汇票保证金"));//收支项目 固定写付-汇票保证金
} }
b.put("creationtime", DateUtil.now());//创建时间 b.put("creationtime", DateUtil.now());//创建时间
b.put("direction", "-1");//方向 :1=;-1=; b.put("direction", "-1");//方向 :1=;-1=;
b.put("objecttype", formmainData.getString("field0085"));//交易类型0=客户;1=供应商;2=部门;3=人员;4=散户; b.put("objecttype", "0");//交易类型0=客户;1=供应商;2=部门;3=人员;4=散户; 总部结算单固定写客户
b.put("pk_oppaccount", formmainData.getString("field0041"));//付款银行账号 b.put("pk_oppaccount", formmainData.getString("field0041"));//付款银行账号
b.put("pk_supplier", formmainData.getString("field0054"));//供应商编码 //b.put("pk_supplier", formmainData.getString("field0065"));//这里传项目部的编码是在和项目部做结算
b.put("pk_account", formmainData.getString("field0044"));//收款银行账户 b.put("pk_account", item.getString("field0099"));//对方银行账号 指的是付款结算单的收款银行账户
b.put("pk_recproject", item.getString("field0091"));//收支项目
body.add(b); body.add(b);
//质保金 明细行
if (isBzj) {
break;
}
} }
return param; return param;
} }
/** /**
* 付款单 * 付款单
* *
@ -200,172 +263,14 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService {
* @param headers * @param headers
* @param forsonDataList * @param forsonDataList
*/ */
private void apPaybill(String datasourceCode, JSONObject formmainData, JSONObject headers, List<JSONObject> forsonDataList) { private Boolean apPaybill(String datasourceCode, JSONObject formmainData, JSONObject headers, List<JSONObject> forsonDataList) {
String orgCode = formmainData.getString("field0053");
String billmaker = headers.getString("billmaker"); String billmaker = headers.getString("billmaker");
if (StrUtil.isNotEmpty(orgCode)) { boolean falg = true;
Map<String, List<JSONObject>> groupedMap = forsonDataList.stream() //付款明细行,每一行都生成一张NCC付款单
.collect(Collectors.groupingBy(item -> item.getString("field0065"))); for (int i = 0; i < forsonDataList.size(); i++) {
//付款明细按项目部代码分组几个项目部就生成几张单子 if (falg){
for (Map.Entry<String, List<JSONObject>> entry : groupedMap.entrySet()) { JSONObject forson = forsonDataList.get(i);
//每个项目部的付款总额 String req = payBillValueOf(datasourceCode, formmainData, forsonDataList, billmaker, forson);
BigDecimal money = BigDecimal.ZERO;
List<JSONObject> payList = entry.getValue();
JSONObject head = new JSONObject();
head.put("pk_org", payList.get(0).getString("field0065"));//财务组织编码
head.put("pk_tradetype", "D3");//交易类型编码
head.put("isinit", "");//期初标记
head.put("billdate", formmainData.getString("field0004"));//制单日期
head.put("busidate", "");//起算日期
head.put("objtype", formmainData.getString("field0085"));//往来对象1-供应商 2-部门 3-业务员
head.put("supplier", formmainData.getString("field0054"));//供应商编码
head.put("pk_dept", formmainData.getString("field0057"));//部门编码
head.put("pk_psndoc", formmainData.getString("field0056"));//业务员编码
head.put("pk_currtype", formmainData.getString("field0087"));//币种编码
head.put("pk_busitype", "");//业务流程编码
head.put("ap_payaccount", formmainData.getString("field0041"));//付款银行账户
head.put("ap_recaccount", formmainData.getString("field0044"));//收款银行账户
head.put("ap_cashaccount", formmainData.getString("field0046"));//现金银行账户
head.put("pk_balatype", formmainData.getString("field0076"));//结算方式编码
head.put("money", money);//原币金额
head.put("rate", "1");//组织本币汇率
head.put("local_money", money);//组织本币金额
head.put("grouprate", "1");//集团本币汇率
head.put("grouplocal", money);//集团本币金额
head.put("globalrate", "1");//全局本币汇率
head.put("globallocal", money);//全局本币金额
head.put("accessorynum", "");//附件张数
head.put("sett_org", "");//结算财务组织编码
head.put("pk_pcorg", "");//利润中心编码
head.put("pu_org", "");//业务组织编码
head.put("pu_deptid", "");//业务部门编码
head.put("pu_psndoc", "");//业务人员编码
head.put("billmaker", billmaker);//制单人编码
head.put("billstatus", "");//单据状态
head.put("approvestatus", "");//审核状态
head.put("effectstatus", "");//生效状态
head.put("approver", "");//审核人编码
head.put("approvedate", "");//审核日期
head.put("confirmuser", "");//单据确认人编码
head.put("effectdate", "");//生效日期
head.put("officialprintuser", "");//正式打印人编码
head.put("officialprintdate", "");//正式打印日期
head.put("src_syscode", "1");//单据来源系统编码
head.put("pk_ratetype", "");//组织汇率类型
head.put("ratedate", "");//组织汇率来源日期
head.put("def1", formmainData.getString("field0083"));//账户属性
List<JSONObject> itemList = new LinkedList<>();
//付款明细行
for (int i = 0; i < payList.size(); i++) {
JSONObject forson = payList.get(i);
String billNO = forson.getString("field0023");
//联查OA付款申请单明细行
CLPayApplyEntity clPayApply = new CLPayApplyEntity();
clPayApply.setDataSourceCode(datasourceCode);
clPayApply.setField0001(billNO);
List<CLPayApplyEntity> clPayApplyList = clpayApplyService.queryByBillNo(clPayApply);
if (CollectionUtils.isNotEmpty(clPayApplyList)) {
for (CLPayApplyEntity payApply : clPayApplyList) {
//采购订单号如果是参照的采购订单 这个值不为空
String orderNo = payApply.getField0048();
//应付订单号 如果参照的是应付单 这个值不为空
String payablebillNO = payApply.getField0047();
JSONObject payApplyJson = new JSONObject();
payApplyJson.put("contractno", "");//合同号
payApplyJson.put("purchaseorder", "");//订单号
payApplyJson.put("invoiceno", "");//发票号
payApplyJson.put("innerorderno", "");//调拨订单号
payApplyJson.put("scomment", payApply.getField0031());//摘要
payApplyJson.put("material", payApply.getField0027());//物料编码
payApplyJson.put("ap_pk_payterm", "");//付款协议编码
payApplyJson.put("objtype", formmainData.getString("field0085"));//往来对象1-供应商 2-部门 3-业务员
payApplyJson.put("supplier", formmainData.getString("field0054"));//供应商编码往来对象选择供应商时必输
payApplyJson.put("pk_dept", head.getString("pk_dept"));//部门编码往来对象选择部门时必输
payApplyJson.put("pk_psndoc", head.getString("pk_psndoc"));//业务员编码往来对象选择业务员时必输
payApplyJson.put("pk_recpaytype", forson.getString("field0031"));//付款业务类型名称
payApplyJson.put("pk_currtype", payApply.getField0051());//币种编码
payApplyJson.put("money_de", payApply.getField0064());//贷方原币金额
payApplyJson.put("occupationmny", payApply.getField0064());//预占用核销原币余额
payApplyJson.put("rate", "1");//组织本币汇率
payApplyJson.put("local_money_de", payApply.getField0064());//组织本币金额
payApplyJson.put("grouprate", "1");//组织本币汇率
payApplyJson.put("groupdebit", payApply.getField0064());//集团本币金额
payApplyJson.put("globalrate", "1");//全局本币汇率
payApplyJson.put("globaldebit", payApply.getField0064());//全局本币金额
payApplyJson.put("quantity_de", payApply.getField0044());//贷方数量
payApplyJson.put("price", payApply.getField0041());//单价
payApplyJson.put("local_price", payApply.getField0041());//本币单价
payApplyJson.put("quantity_bal", "");//数量余额
payApplyJson.put("taxprice", payApply.getField0030());//含税单价
payApplyJson.put("local_taxprice", payApply.getField0030());//本币含税单价
payApplyJson.put("taxcodeid", "");//税码编码
payApplyJson.put("taxrate", payApply.getField0043());//税率
payApplyJson.put("local_tax_de", "");//税额
payApplyJson.put("notax_de", "");//贷方无税金额
payApplyJson.put("sett_org", "");//结算财务组织编码
payApplyJson.put("pk_pcorg", "");//利润中心编码
payApplyJson.put("pu_org", "");//业务组织编码
payApplyJson.put("pu_deptid", "");//业务部门编码
payApplyJson.put("pu_psndoc", "");//业务人员编码
payApplyJson.put("equipmentcode", "");//设备编码
payApplyJson.put("pk_subjcode", forson.getString("field0091"));//收支项目编码
payApplyJson.put("cashitem", "");//现金流量项目编码
payApplyJson.put("bankrollproject", "");//资金计划项目编码
payApplyJson.put("checkelement", "");//责任核算要素编码
payApplyJson.put("subjcode", "");//科目编码
payApplyJson.put("ap_payaccount", formmainData.getString("field0089"));//这里有传付款银行子户pk
payApplyJson.put("ap_recaccount", "");//收款银行账户编码
payApplyJson.put("ordercubasdoc", "");//订单供应商编码
payApplyJson.put("freecust", "");//散户编码
payApplyJson.put("costcenter", "");//成本中心编码
payApplyJson.put("productline", "");//产品线编码
payApplyJson.put("pk_balatype", head.getString("pk_balatype"));//结算方式编码
payApplyJson.put("checktype", "");//票据类型编码
payApplyJson.put("checkno", "");//票据号
payApplyJson.put("pk_ratetype", "");//组织汇率类型
payApplyJson.put("ratedate", "");//组织汇率来源日期
payApplyJson.put("supplier_v", formmainData.getString("field0094"));//供应商版本编码
payApplyJson.put("customer_v", "");//客户版本编码
//如果是参照订单做预付那么源头和来源是一样的
if (StrUtil.isNotEmpty(orderNo)) {
payApplyJson.put("src_tradetype", payApply.getField0059());//源头交易类型
payApplyJson.put("src_billtype", payApply.getField0052());//源头单据类型
payApplyJson.put("src_billid", payApply.getField0061());//源头单据表头id
//payApplyJson.put("src_itemid", payApply.getField0062());//源头单据表体id
payApplyJson.put("src_itemid", payApply.getField0063());//源头单据表体id
payApplyJson.put("top_billid", payApply.getField0061());//上层单据表头id
//payApplyJson.put("top_itemid", payApply.getField0062());//上层单据表体id // 这里可能是取采购付款计划的pk
payApplyJson.put("top_itemid", payApply.getField0063());//上层单据表体id // 这里可能是取采购付款计划的pk
payApplyJson.put("top_billtype", payApply.getField0052());//上层单据类型
payApplyJson.put("top_tradetype", payApply.getField0059());//上层交易类型
payApplyJson.put("purchaseorder", payApply.getField0048());//订单号
payApplyJson.put("prepay", "1");//付款性质0应付款1预付款
} else {
//如果是参照应付 那正常取数
payApplyJson.put("src_tradetype", payApply.getField0053());//源头交易类型
payApplyJson.put("src_billtype", payApply.getField0060());//源头单据类型
payApplyJson.put("src_billid", payApply.getField0054());//源头单据表头id
payApplyJson.put("src_itemid", payApply.getField0055());//源头单据表体id
payApplyJson.put("top_billid", payApply.getField0061());//上层单据表头id
payApplyJson.put("top_itemid", payApply.getField0062());//上层单据表体id
payApplyJson.put("top_billtype", payApply.getField0052());//上层单据类型
payApplyJson.put("top_tradetype", payApply.getField0059());//上层交易类型
payApplyJson.put("prepay", "0");//付款性质0应付款1预付款
}
//累加付款总额
money = money.add(new BigDecimal(payApply.getField0064()));
itemList.add(payApplyJson);
}
}
}
head.put("money", money);//原币金额
head.put("local_money", money);//组织本币金额
head.put("grouplocal", money);//集团本币金额
head.put("globallocal", money);//全局本币金额
head.put("items", itemList);
String req = JSONObject.toJSONString(head);
logger.info("======OA付款单传NCC付款单请求参数:{}======", req);
String access_token = getAccessToken(); String access_token = getAccessToken();
String result = HttpRequest.post(baseUrl) String result = HttpRequest.post(baseUrl)
.header("appId", "800065")//NCC应用 .header("appId", "800065")//NCC应用
@ -376,11 +281,229 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService {
.body(req)//表单内容 .body(req)//表单内容
.timeout(30000)//超时毫秒 .timeout(30000)//超时毫秒
.execute().body(); .execute().body();
logger.info("======OA付款单传NCC付款单响应参数:{}======",result); logger.info("======OA付款单传NCC付款单响应参数:{}======", result);
//解析返回结果 并把NCC单据号更新到OA表单
falg = parseRes(result,datasourceCode,headers,forson.getString("id"));
} }
} }
return falg;
} }
private String payBillValueOf(String datasourceCode, JSONObject formmainData, List<JSONObject> forsonDataList, String billmaker, JSONObject forson) {
BigDecimal totalMoney = BigDecimal.ZERO;
JSONObject head = new JSONObject();
head.put("pk_org", forson.getString("field0065"));//财务组织编码
head.put("pk_tradetype", "D3");//交易类型编码
head.put("billdate", formmainData.getString("field0004"));//制单日期
head.put("objtype", formmainData.getString("field0085"));//往来对象1-供应商 2-部门 3-业务员
head.put("supplier", formmainData.getString("field0054"));//供应商编码
head.put("pk_dept", formmainData.getString("field0057"));//部门编码
head.put("pk_psndoc", formmainData.getString("field0056"));//业务员编码
head.put("pk_currtype", formmainData.getString("field0087"));//币种编码
head.put("ap_payaccount", formmainData.getString("field0041"));//付款银行账户
head.put("ap_recaccount", formmainData.getString("field0044"));//收款银行账户
head.put("ap_cashaccount", formmainData.getString("field0046"));//现金银行账户
head.put("pk_balatype", formmainData.getString("field0076"));//结算方式编码
head.put("money", totalMoney);//原币金额
head.put("rate", "1");//组织本币汇率
head.put("local_money", totalMoney);//组织本币金额
head.put("grouprate", "1");//集团本币汇率
head.put("grouplocal", totalMoney);//集团本币金额
head.put("globalrate", "1");//全局本币汇率
head.put("globallocal", totalMoney);//全局本币金额
head.put("isinit", "");//期初标记
head.put("busidate", "");//起算日期
head.put("pk_busitype", "");//业务流程编码
head.put("accessorynum", "");//附件张数
head.put("sett_org", "");//结算财务组织编码
head.put("pk_pcorg", "");//利润中心编码
head.put("pu_org", "");//业务组织编码
head.put("pu_deptid", "");//业务部门编码
head.put("pu_psndoc", "");//业务人员编码
head.put("billmaker", billmaker);//制单人编码
head.put("billstatus", "");//单据状态
head.put("approvestatus", "");//审核状态
head.put("effectstatus", "");//生效状态
head.put("approver", "");//审核人编码
head.put("approvedate", "");//审核日期
head.put("confirmuser", "");//单据确认人编码
head.put("effectdate", "");//生效日期
head.put("officialprintuser", "");//正式打印人编码
head.put("officialprintdate", "");//正式打印日期
head.put("src_syscode", "1");//单据来源系统编码
head.put("pk_ratetype", "");//组织汇率类型
head.put("ratedate", "");//组织汇率来源日期
head.put("def1", formmainData.getString("field0083"));//账户属性
head.put("def2", formmainData.getString("field0001"));//OA单据号
List<JSONObject> itemList = new LinkedList<>();
//付款申请单号
String billNO = forson.getString("field0023");
//联查OA付款申请单明细行
CLPayApplyEntity clPayApply = new CLPayApplyEntity();
clPayApply.setDataSourceCode(datasourceCode);
clPayApply.setField0001(billNO);
List<CLPayApplyEntity> clPayApplyList = clpayApplyService.queryByBillNo(clPayApply);
if (CollectionUtils.isNotEmpty(clPayApplyList)) {
if (clPayApplyList.get(0).getSource_bill_type().equals("采购订单")) {
clPayApplyList = clPayApplyList.stream().limit(1).collect(Collectors.toList());
} else if (clPayApplyList.get(0).getSource_bill_type().equals("应付单")) {
clPayApplyList = clPayApplyList.stream()
.filter(c -> StrUtil.isNotEmpty(c.getField0066()))
.filter(c -> new BigDecimal(c.getField0066()).compareTo(BigDecimal.ZERO) > 0)
.collect(Collectors.toList());
}
for (CLPayApplyEntity payApply : clPayApplyList) {
//单据类型
String sourceBillType = payApply.getSource_bill_type();
String money = payApply.getField0066();
if ("采购订单".equals(sourceBillType)) {
money = payApply.getField0071();
}
JSONObject payApplyJson = new JSONObject();
payApplyJson.put("contractno", "");//合同号
payApplyJson.put("purchaseorder", "");//订单号
payApplyJson.put("invoiceno", "");//发票号
payApplyJson.put("innerorderno", "");//调拨订单号
payApplyJson.put("scomment", forson.getString("field0074"));//摘要
payApplyJson.put("ap_pk_payterm", "");//付款协议编码
payApplyJson.put("objtype", formmainData.getString("field0085"));//往来对象1-供应商 2-部门 3-业务员
payApplyJson.put("supplier", formmainData.getString("field0054"));//供应商编码往来对象选择供应商时必输
payApplyJson.put("supplier_v", formmainData.getString("field0094"));//供应商版本编码
payApplyJson.put("pk_dept", head.getString("pk_dept"));//部门编码往来对象选择部门时必输
payApplyJson.put("pk_psndoc", head.getString("pk_psndoc"));//业务员编码往来对象选择业务员时必输
payApplyJson.put("pk_recpaytype", forson.getString("field0031"));//付款业务类型名称
payApplyJson.put("pk_currtype", payApply.getField0051());//币种编码
payApplyJson.put("money_de", money);//贷方原币金额
payApplyJson.put("occupationmny", money);//预占用核销原币余额
payApplyJson.put("rate", "1");//组织本币汇率
payApplyJson.put("local_money_de", money);//组织本币金额
payApplyJson.put("grouprate", "1");//组织本币汇率
payApplyJson.put("groupdebit", money);//集团本币金额
payApplyJson.put("globalrate", "1");//全局本币汇率
payApplyJson.put("globaldebit", money);//全局本币金额
payApplyJson.put("pk_balatype", head.getString("pk_balatype"));//结算方式编码
payApplyJson.put("pk_subjcode", forson.getString("field0091"));//收支项目编码
payApplyJson.put("ap_payaccount", formmainData.getString("field0089"));//这里有传付款银行子户pk
payApplyJson.put("taxcodeid", "");//税码编码
payApplyJson.put("local_tax_de", "");//税额
payApplyJson.put("notax_de", "");//贷方无税金额
payApplyJson.put("sett_org", "");//结算财务组织编码
payApplyJson.put("pk_pcorg", "");//利润中心编码
payApplyJson.put("pu_org", "");//业务组织编码
payApplyJson.put("pu_deptid", "");//业务部门编码
payApplyJson.put("pu_psndoc", "");//业务人员编码
payApplyJson.put("equipmentcode", "");//设备编码
payApplyJson.put("cashitem", "");//现金流量项目编码
payApplyJson.put("bankrollproject", "");//资金计划项目编码
payApplyJson.put("checkelement", "");//责任核算要素编码
payApplyJson.put("subjcode", "");//科目编码
payApplyJson.put("ap_recaccount", "");//收款银行账户编码
payApplyJson.put("ordercubasdoc", "");//订单供应商编码
payApplyJson.put("freecust", "");//散户编码
payApplyJson.put("costcenter", "");//成本中心编码
payApplyJson.put("productline", "");//产品线编码
payApplyJson.put("checktype", "");//票据类型编码
payApplyJson.put("checkno", "");//票据号
payApplyJson.put("pk_ratetype", "");//组织汇率类型
payApplyJson.put("ratedate", "");//组织汇率来源日期
payApplyJson.put("customer_v", "");//客户版本编码
//如果是参照订单做预付那么源头和来源是一样的
if ("采购订单".equals(payApply.getSource_bill_type())) {
payApplyJson.put("src_tradetype", payApply.getField0059());//源头交易类型
payApplyJson.put("src_billtype", payApply.getField0052());//源头单据类型
payApplyJson.put("src_billid", payApply.getField0061());//源头单据表头id
payApplyJson.put("src_itemid", payApply.getField0063());//源头单据表体id
payApplyJson.put("top_billid", payApply.getField0061());//上层单据表头id
payApplyJson.put("top_itemid", payApply.getField0063());//上层单据表体id // 这里可能是取采购付款计划的pk
payApplyJson.put("top_billtype", payApply.getField0052());//上层单据类型
payApplyJson.put("top_tradetype", payApply.getField0059());//上层交易类型
payApplyJson.put("purchaseorder", payApply.getField0048());//订单号
payApplyJson.put("prepay", "预付款");//付款性质0应付款1预付款
payApplyJson.put("taxrate", "0");//税率
} else {
//如果是参照应付 那正常取数
payApplyJson.put("src_tradetype", payApply.getField0053());//源头交易类型
payApplyJson.put("src_billtype", payApply.getField0060());//源头单据类型
payApplyJson.put("src_billid", payApply.getField0054());//源头单据表头id
payApplyJson.put("src_itemid", payApply.getField0055());//源头单据表体id
payApplyJson.put("top_billid", payApply.getField0061());//上层单据表头id
payApplyJson.put("top_itemid", payApply.getField0062());//上层单据表体id
payApplyJson.put("top_billtype", payApply.getField0052());//上层单据类型
payApplyJson.put("top_tradetype", payApply.getField0059());//上层交易类型
payApplyJson.put("prepay", "应付款");//付款性质0应付款1预付款
payApplyJson.put("material", payApply.getField0027());//物料编码
payApplyJson.put("taxrate", payApply.getField0043());//税率
payApplyJson.put("quantity_de", payApply.getField0044());//贷方数量
payApplyJson.put("price", payApply.getField0041());//单价
payApplyJson.put("local_price", payApply.getField0041());//本币单价
payApplyJson.put("quantity_bal", "");//数量余额
payApplyJson.put("taxprice", payApply.getField0030());//含税单价
payApplyJson.put("local_taxprice", payApply.getField0030());//本币含税单价
}
//累加付款总额
totalMoney = totalMoney.add(new BigDecimal(money));
itemList.add(payApplyJson);
}
}
head.put("money", totalMoney);//原币金额
head.put("local_money", totalMoney);//组织本币金额
head.put("grouplocal", totalMoney);//集团本币金额
head.put("globallocal", totalMoney);//全局本币金额
head.put("items", itemList);
String req = JSONObject.toJSONString(head);
logger.info("======OA付款单传NCC付款单请求参数:{}======", req);
return req;
}
/**
* 解析返回结果并把单号更新到OA
* @param result
* @param datasourceCode
* @param headers
* @param id OA付款单明细行id
* @return
*/
private Boolean parseRes(String result,String datasourceCode,JSONObject headers,String id){
boolean flag = false;
JSONObject attribute = getAttribute(result);
if (null != attribute){
String sql = null;
Boolean success = attribute.getBoolean("success");
if (success){
flag = true;
JSONObject data = attribute.getJSONObject("data");
String message = Convert.toStr(attribute.getString("message"), "成功");
String billno = data.getString("billno");
if (StrUtil.isNotEmpty(billno)){
String sqlTemplate = "update {} set {} = '{}',{} = '{}' where {} = '{}'";
sql = StrUtil.format(sqlTemplate,headers.getString("forsonTableName"),"field0100",billno,"field0101",message,"id",id);
}
}else {
String message = Convert.toStr(attribute.getString("message"), "失败");
String sqlTemplate = "update {} set {} = '{}' where {} = '{}'";
//更新错误信息
sql = StrUtil.format(sqlTemplate,headers.getString("forsonTableName"),"field0101",message,"id",id);
}
CLPayApplyEntity entity = new CLPayApplyEntity();
entity.setDataSourceCode(datasourceCode);
try {
clPayApplyDao.execUpdateSql(sql,entity);
}catch (Exception e){
logger.error("更新NCC付款单号到OA失败:{}",e);
}
}
return flag;
}
/**
* 日期格式化
* @param dateStr
* @return
*/
private static String formatDate(String dateStr) { private static String formatDate(String dateStr) {
if (StrUtil.isNotEmpty(dateStr)) { if (StrUtil.isNotEmpty(dateStr)) {
return DateUtil.format(DateUtil.parseDate(dateStr), "yyyy-MM-dd HH:mm:ss"); return DateUtil.format(DateUtil.parseDate(dateStr), "yyyy-MM-dd HH:mm:ss");
@ -388,7 +511,11 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService {
return null; return null;
} }
private String getAccessToken(){ /**
* 获取token
* @return
*/
private String getAccessToken() {
try { try {
String result = HttpRequest.post(baseUrl) String result = HttpRequest.post(baseUrl)
.header("appId", "800065")//NCC应用 .header("appId", "800065")//NCC应用
@ -398,19 +525,71 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService {
.body("")//表单内容 .body("")//表单内容
.timeout(30000)//超时毫秒 .timeout(30000)//超时毫秒
.execute().body(); .execute().body();
if (StrUtil.isNotEmpty(result)){ JSONObject data = getData(result);
JSONObject resultJson = JSONObject.parseObject(result); if (null != data) {
JSONObject attribute = resultJson.getJSONObject("attribute"); return data.getString("access_token");
if (null != attribute && attribute.getBoolean("success")){
JSONObject data = attribute.getJSONObject("data");
if (null != data){
return data.getString("access_token");
}
}
} }
}catch (Exception e){ } catch (Exception e) {
logger.error("获取NCCtoken失败:{}",e); logger.error("获取NCCtoken失败:{}", e);
} }
return null; return null;
} }
/**
* NCC返回值data值
*
* @param result
* @return
*/
private JSONObject getData(String result) {
if (StrUtil.isNotEmpty(result)) {
JSONObject resultJson = JSONObject.parseObject(result);
JSONObject attribute = resultJson.getJSONObject("attribute");
if (null != attribute && attribute.getBoolean("success")) {
JSONObject data = attribute.getJSONObject("data");
if (null != data) {
return data;
}
}
}
return null;
}
//是否成功
private Boolean isSuccess(String result){
if (StrUtil.isNotEmpty(result)) {
JSONObject resultJson = JSONObject.parseObject(result);
JSONObject attribute = resultJson.getJSONObject("attribute");
if (null != attribute ) {
return attribute.getBoolean("success");
}
}
return false;
}
//NCC返回值
private JSONObject getAttribute(String result) {
if (StrUtil.isNotEmpty(result)) {
JSONObject resultJson = JSONObject.parseObject(result);
JSONObject attribute = resultJson.getJSONObject("attribute");
if (null != attribute) {
return attribute;
}
}
return null;
}
public static void main(String[] args) {
String message = Convert.toStr("111", "成功");
System.out.println(message);
String result = "{\"msg\":\"转发成功\",\"type\":null,\"flag\":true,\"status\":\"200\",\"attribute\":{\"code\":\"1000000000\",\"data\":{\"pk_bill\":\"1001A6100000000Z54H4\",\"billmaker\":\"1001A1100000000WFLXR\",\"billno\":\"D32025070900000861\",\"pk_org\":\"0001A11000000000EL8V\"},\"success\":true,\"message\":null,\"errorStack\":null}}";
PaybillPluginServiceImpl service = new PaybillPluginServiceImpl();
JSONObject data = service.getData(result);
if (null != data){
String billno = data.getString("billno");
if (StrUtil.isNotEmpty(billno)){
String sqlTemplate = "update {} set {} = '{}' where {} = '{}'";
String sql = StrUtil.format(sqlTemplate,"formmain_1","field0100",billno,"id","123");
System.out.println(sql);
}
}
}
} }