设备类付款
This commit is contained in:
parent
0383012f22
commit
147ecde323
|
@ -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("执行成功");
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue