diff --git a/base-buildpackage/src/main/java/com/hzya/frame/plugin/oa/payment/plugin/DevicePaybillPluginInitializer.java b/base-buildpackage/src/main/java/com/hzya/frame/plugin/oa/payment/plugin/DevicePaybillPluginInitializer.java new file mode 100644 index 00000000..dcf6724b --- /dev/null +++ b/base-buildpackage/src/main/java/com/hzya/frame/plugin/oa/payment/plugin/DevicePaybillPluginInitializer.java @@ -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("执行成功"); + } +} diff --git a/base-buildpackage/src/main/java/com/hzya/frame/plugin/oa/payment/service/IDevicePaybillPluginService.java b/base-buildpackage/src/main/java/com/hzya/frame/plugin/oa/payment/service/IDevicePaybillPluginService.java new file mode 100644 index 00000000..882952ac --- /dev/null +++ b/base-buildpackage/src/main/java/com/hzya/frame/plugin/oa/payment/service/IDevicePaybillPluginService.java @@ -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); +} diff --git a/base-buildpackage/src/main/java/com/hzya/frame/plugin/oa/payment/service/impl/DevicePaybillPluginServiceImpl.java b/base-buildpackage/src/main/java/com/hzya/frame/plugin/oa/payment/service/impl/DevicePaybillPluginServiceImpl.java new file mode 100644 index 00000000..ea448065 --- /dev/null +++ b/base-buildpackage/src/main/java/com/hzya/frame/plugin/oa/payment/service/impl/DevicePaybillPluginServiceImpl.java @@ -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 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 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 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; + } +} diff --git a/base-buildpackage/src/main/java/com/hzya/frame/plugin/oa/payment/service/impl/PaybillPluginCommonService.java b/base-buildpackage/src/main/java/com/hzya/frame/plugin/oa/payment/service/impl/PaybillPluginCommonService.java new file mode 100644 index 00000000..836c6709 --- /dev/null +++ b/base-buildpackage/src/main/java/com/hzya/frame/plugin/oa/payment/service/impl/PaybillPluginCommonService.java @@ -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; + } +}