设备类付款

This commit is contained in:
xiangerlin 2025-08-05 13:34:53 +08:00
parent 0383012f22
commit 147ecde323
4 changed files with 388 additions and 0 deletions

View File

@ -0,0 +1,99 @@
package com.hzya.frame.plugin.oa.payment.plugin;
import com.alibaba.fastjson.JSONObject;
import com.hzya.frame.base.PluginBaseEntity;
import com.hzya.frame.web.entity.BaseResult;
import com.hzya.frame.web.entity.JsonResultEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
@Description 设备类付款单传NCC
@Author xiangerlin
@Date 2025/7/6 14:40
**/
public class DevicePaybillPluginInitializer extends PluginBaseEntity {
Logger logger = LoggerFactory.getLogger(DevicePaybillPluginInitializer.class);
/***
* 插件初始化方法
* @Author 👻👻👻👻👻👻👻👻 gjh
* @Date 2023-08-02 10:48
* @Param []
* @return void
**/
@Override
public void initialize() {
logger.info(getPluginLabel() + "執行初始化方法initialize()");
}
/****
* 插件销毁方法
* @author 👻👻👻👻👻👻👻👻 gjh
* @date 2023-08-02 10:48
* @return void
**/
@Override
public void destroy() {
logger.info(getPluginLabel() + "執行銷毀方法destroy()");
}
/****
* 插件的ID
* @author 👻👻👻👻👻👻👻👻 gjh
* @date 2023-08-02 10:48
* @return void
**/
@Override
public String getPluginId() {
return "DevicePaybillPlugin";
}
/****
* 插件的名称
* @author 👻👻👻👻👻👻👻👻 gjh
* @date 2023-08-02 10:48
* @return void
**/
@Override
public String getPluginName() {
return "设备类付款单传NCC";
}
/****
* 插件的显示值
* @author 👻👻👻👻👻👻👻👻 gjh
* @date 2023-08-02 10:48
* @return void
**/
@Override
public String getPluginLabel() {
return "设备类付款单传NCC";
}
/***
* 插件类型 1场景插件
* @Author 👻👻👻👻👻👻👻👻 gjh
* @Date 2023-08-02 14:01
* @Param []
* @return java.lang.String
**/
@Override
public String getPluginType() {
return "0";
}
/***
* 执行业务代码
* @Author 👻👻👻👻👻👻👻👻 gjh
* @Date 2023-08-07 11:20
* @param requestJson 执行业务代码的参数
* @return void
**/
@Override
public JsonResultEntity executeBusiness(JSONObject requestJson) throws Exception {
logger.info("======开始执行设备付款单传NCC插件======");
return BaseResult.getSuccessMessageEntity("执行成功");
}
}

View File

@ -0,0 +1,18 @@
package com.hzya.frame.plugin.oa.payment.service;
import com.alibaba.fastjson.JSONObject;
import com.hzya.frame.web.entity.JsonResultEntity;
/**
* @Description 设备类付款单传NCC插件service
* @Author xiangerlin
* @Date 2025/7/6 14:44
**/
public interface IDevicePaybillPluginService {
/**
* 设备类付款单传到NCC
* @param requestJson
* @return
*/
JsonResultEntity sync2ncc(JSONObject requestJson);
}

View File

@ -0,0 +1,180 @@
package com.hzya.frame.plugin.oa.payment.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hzya.frame.plugin.oa.payment.service.IDevicePaybillPluginService;
import com.hzya.frame.seeyon.enums.ColEventTypeEnum;
import com.hzya.frame.web.entity.BaseResult;
import com.hzya.frame.web.entity.JsonResultEntity;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.LinkedList;
import java.util.List;
/**
* @Description
* @Author xiangerlin
* @Date 2025/7/6 14:44
**/
@Service(value = "devicePaybillPluginServiceImpl")
public class DevicePaybillPluginServiceImpl implements IDevicePaybillPluginService {
Logger logger = LoggerFactory.getLogger(DevicePaybillPluginServiceImpl.class);
@Value("${zt.url}")
private String baseUrl;
@Autowired
private PaybillPluginCommonService paybillPluginCommonService;
/**
* 设备类付款单传到NCC 生成NCC付款结算单
* OA付款申请参照NCC采购订单
* 开票保证金部分 要单独生成一张付款结算单剩余部分再生成一张
*
* @param requestJson
* @return
*/
@Override
public JsonResultEntity sync2ncc(JSONObject requestJson) {
//数据源编码
String datasourceCode = requestJson.getString("sourceCode");
String headersStr = requestJson.getString("headers");//请求头
String eventType = requestJson.getString("eventType");
JSONObject headers = requestJson.getJSONObject("headers");
Assert.notEmpty(eventType, "eventType不能为空");
Assert.notEmpty(headersStr, "headers不能为空");
String formmainTableName = headers.getString("formmainTableName");
String forsonTableName = headers.getString("forsonTableName");
JSONObject jsonStrObj = requestJson.getJSONObject("jsonStr");
JSONObject businessData = jsonStrObj.getJSONObject("businessDataStr");
JSONObject formmainData = businessData.getJSONObject(formmainTableName);
List<JSONObject> forsonDataList = JSON.parseArray(businessData.getJSONArray(forsonTableName).toJSONString(), JSONObject.class);
//if (ColEventTypeEnum.ONPROCESSFINISHED.getType().equals(eventType)) {
//结算方式编码 10备用金20开票21背书3网银
String balaTypeCode = formmainData.getString("field0083");
JSONObject cmpPayBillVO = getCmpPayBillVO(formmainData, forsonDataList, headers, false);
String req = JSONObject.toJSONString(cmpPayBillVO);
String access_token = paybillPluginCommonService.getAccessToken();
String result = HttpRequest.post(baseUrl)
.header("appId", "800065")//NCC应用
.header("apiCode", "8000650006")//NCC付款结算单新增
.header("publicKey", "ZJYAbkr9+XjnDrlfQCRKXtpVvg/BjxqtxzcLgg5TIGagEKJCe7eDIk+3zDUT+v578prj")//OA公钥
.header("secretKey", "2GR4+yrcx+Ev+pN0Q6V6wxCdvisPX7wzNKBgc5SsIYGxYI5GTISXT6GvTPfp1u2Rj3JzOP8MtA1LSGvL+2BWG8c/o7DKi92S4mr3zcGearA=")//OA密钥
.header("access_token", access_token)//OA密钥
.body(req)//表单内容
.timeout(30000)//超时毫秒
.execute().body();
logger.info("======OA设备类付款单传NCC付款结算单返回参数:{}", result);
//结算单审批
String orgCode = formmainData.getString("field0053");
String pk_billmaker = headers.getString("billmaker");
String auditResult = paybillPluginCommonService.cmpBillAudit(result, access_token, pk_billmaker, orgCode);
//如果是开票保证金也要生成一张付款结算单
if ("20".equals(balaTypeCode)) {
JSONObject bzjParam = getCmpPayBillVO(formmainData, forsonDataList, headers, true);
String bzjReq = JSONObject.toJSONString(bzjParam);
String bazjResult = HttpRequest.post(baseUrl)
.header("appId", "800065")//NCC应用
.header("apiCode", "8000650006")//NCC付款结算单新增
.header("publicKey", "ZJYAbkr9+XjnDrlfQCRKXtpVvg/BjxqtxzcLgg5TIGagEKJCe7eDIk+3zDUT+v578prj")//OA公钥
.header("secretKey", "2GR4+yrcx+Ev+pN0Q6V6wxCdvisPX7wzNKBgc5SsIYGxYI5GTISXT6GvTPfp1u2Rj3JzOP8MtA1LSGvL+2BWG8c/o7DKi92S4mr3zcGearA=")//OA密钥
.body(bzjReq)//表单内容
.timeout(30000)//超时毫秒
.execute().body();
logger.info("======OA设备类付款单开票保证金传NCC付款结算单返回参数:{}", bazjResult);
paybillPluginCommonService.cmpBillAudit(bazjResult, access_token, pk_billmaker, orgCode);
}
//}
return BaseResult.getSuccessMessageEntity("操作成功");
}
/**
* 付款结算单
* @param formmainData 主表
* @param forsonDataList 明细表
* @param headers 请求头参数
* @param isBzj 是否保证金
* @return
*/
@NotNull
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 head = new JSONObject();
List<JSONObject> body = new LinkedList<>();
String balaTypeCode = formmainData.getString("field0083");
param.put("head", head);
param.put("body", body);
head.put("pk_org", orgCode);//组织编码
head.put("pk_group", groupCode);//集团编码
head.put("bill_type", "F5");//单据类型
head.put("trade_type", "D5");//付款结算类型
head.put("source_flag", "2");//来源系统
head.put("bill_date", formatDate(formmainData.getString("field0004")));//单据日期
if (!isBzj) {
head.put("primal_money", formmainData.getString("field0019"));//付款原币金额
head.put("pk_balatype", formmainData.getString("field0083"));//结算方式
} else {
head.put("primal_money", formmainData.getString(""));//付款原币金额 这里要取保证金
//如果是汇票保证金则结算方式用网银
head.put("pk_balatype", "3");//结算方式
}
head.put("pk_currtype", formmainData.getString(""));//币种名称
head.put("billmaker", billmaker);//制单人名称
head.put("def1", formmainData.getString("field0083"));//账户属性
head.put("def2", formmainData.getString("field0001"));//OA单据号
for (JSONObject item : forsonDataList) {
JSONObject b = new JSONObject();
b.put("pk_org", orgCode);//组织编码
b.put("pk_group", groupCode);//集团编码
b.put("bill_type", head.getString("bill_type"));//单据类型
b.put("trade_type", head.getString("trade_type"));//付款结算类型
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("memo",item.getString("field0080"));
if (!isBzj) {
b.put("pay_primal", item.getString("field0030"));//付款原币金额
b.put("pk_customer", item.getString("field0065"));//这里传项目部的编码是在和项目部做结算
b.put("pk_recproject", headers.getString("付-往来款"));//收支项目 固定写付往来款
} else {
b.put("pay_primal", formmainData.getString(""));//这里要取保证金
b.put("pk_customer", "006");//保证金情况 固定写006浙江建辉矿建集团有限公司汇票保证金户
b.put("pk_recproject", headers.getString("付-汇票保证金"));//收支项目 固定写付-汇票保证金
}
b.put("creationtime", DateUtil.now());//创建时间
b.put("direction", "-1");//方向 :1=;-1=;
b.put("objecttype", "0");//交易类型0=客户;1=供应商;2=部门;3=人员;4=散户; 总部结算单固定写客户
b.put("pk_oppaccount", formmainData.getString("field0041"));//付款银行账号
b.put("pk_account", item.getString(""));//对方银行账号 指的是付款结算单的收款银行账户 这里要传项目部的银行账户
body.add(b);
//质保金 明细行
if (isBzj) {
break;
}
}
return param;
}
private static String formatDate(String dateStr) {
if (StrUtil.isNotEmpty(dateStr)) {
return DateUtil.format(DateUtil.parseDate(dateStr), "yyyy-MM-dd HH:mm:ss");
}
return null;
}
}

View File

@ -0,0 +1,91 @@
package com.hzya.frame.plugin.oa.payment.service.impl;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONObject;
import com.hzya.frame.web.entity.JsonResultEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
/**
* @Description
* @Author xiangerlin
* @Date 2025/7/13 14:18
**/
@Service(value = "paybillPluginCommonService")
public class PaybillPluginCommonService {
@Value("${zt.url}")
private String baseUrl;
Logger logger = LoggerFactory.getLogger(PaybillPluginCommonService.class);
//获取token
public String getAccessToken() {
try {
String result = HttpRequest.post(baseUrl)
.header("appId", "800065")//NCC应用
.header("apiCode", "8000650004")//NCC付token
.header("publicKey", "ZJYAbkr9+XjnDrlfQCRKXtpVvg/BjxqtxzcLgg5TIGagEKJCe7eDIk+3zDUT+v578prj")//OA公钥
.header("secretKey", "2GR4+yrcx+Ev+pN0Q6V6wxCdvisPX7wzNKBgc5SsIYGxYI5GTISXT6GvTPfp1u2Rj3JzOP8MtA1LSGvL+2BWG8c/o7DKi92S4mr3zcGearA=")//OA密钥
.body("")//表单内容
.timeout(30000)//超时毫秒
.execute().body();
JSONObject data = getData(result);
if (null != data) {
return data.getString("access_token");
}
} catch (Exception e) {
logger.error("获取NCCtoken失败:{}", e);
}
return null;
}
//付款结算单审批
public 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;
}
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;
}
}