From 43f368a4f100ee8f6bce0e7fe942ca5d7727da7a Mon Sep 17 00:00:00 2001 From: xiangerlin <251481237@qq.com> Date: Sun, 13 Jul 2025 15:13:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9D=90=E6=96=99=E4=BB=98=E6=AC=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/PaybillPluginServiceImpl.java | 669 +++++++++++------- 1 file changed, 424 insertions(+), 245 deletions(-) diff --git a/base-buildpackage/src/main/java/com/hzya/frame/plugin/oa/payment/service/impl/PaybillPluginServiceImpl.java b/base-buildpackage/src/main/java/com/hzya/frame/plugin/oa/payment/service/impl/PaybillPluginServiceImpl.java index 8600d058..5666175e 100644 --- a/base-buildpackage/src/main/java/com/hzya/frame/plugin/oa/payment/service/impl/PaybillPluginServiceImpl.java +++ b/base-buildpackage/src/main/java/com/hzya/frame/plugin/oa/payment/service/impl/PaybillPluginServiceImpl.java @@ -1,5 +1,6 @@ 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.lang.Assert; import cn.hutool.core.util.StrUtil; @@ -7,6 +8,7 @@ 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.payapply.dao.ICLPayApplyDao; import com.hzya.frame.plugin.oa.payapply.entity.CLPayApplyEntity; import com.hzya.frame.plugin.oa.payapply.service.ICLPayApplyService; import com.hzya.frame.plugin.oa.payment.service.IPaybillPluginService; @@ -40,6 +42,8 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService { Logger logger = LoggerFactory.getLogger(PaybillPluginServiceImpl.class); @Autowired private ICLPayApplyService clpayApplyService; + @Autowired + private ICLPayApplyDao clPayApplyDao; /** * 付款单传到NCC @@ -68,21 +72,21 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService { //流程结束 - // if (ColEventTypeEnum.ONPROCESSFINISHED.getType().equals(eventType)) { - /** - * 判断付款单表头的财务组织如果是002,说明是总部代项目部付款 - * 要生成对应项目部的付款单 以及 总部的 付款结算单 - * 付款单:ap_paybill - * 付款结算单:cmp_paybill - * 如果支付类型是开票,保证金要单独生成一张付款结算单 - */ - //付款单 - apPaybill(datasourceCode, formmainData, headers, forsonDataList); - String orgCode = formmainData.getString("field0053"); - if ("002".equals(orgCode)) { - cmpPaybill(datasourceCode, formmainData, headers, forsonDataList); - } - // } + // if (ColEventTypeEnum.ONPROCESSFINISHED.getType().equals(eventType)) { + /** + * 判断付款单表头的财务组织如果是002,说明是总部代项目部付款 + * 要生成对应项目部的付款单 以及 总部的 付款结算单 + * 付款单:ap_paybill + * 付款结算单:cmp_paybill + * 如果支付类型是开票,保证金要单独生成一张付款结算单 + */ + //付款单 + Boolean flag = apPaybill(datasourceCode, formmainData, headers, forsonDataList); + String orgCode = formmainData.getString("field0053"); + if (flag && "002".equals(orgCode)) { + cmpPaybill(datasourceCode, formmainData, headers, forsonDataList); + } + // } return BaseResult.getSuccessMessageEntity("操作成功"); } @@ -90,6 +94,7 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService { * 付款结算单 * 结算方式编码, 10备用金、20开票、21背书、3网银 * 如果是开票 总部要生成2张付款结算单,一张是保证金 一张是承兑汇票 + * 对于材料类付款来说,付款组织是002的情况 基本上就是要生成总部付款结算单,因为总部自己不会采购材料 * * @param datasourceCode * @param formmainData @@ -97,55 +102,100 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService { * @param forsonDataList */ private void cmpPaybill(String datasourceCode, JSONObject formmainData, JSONObject headers, List forsonDataList) { - String orgCode = formmainData.getString("field0053"); - String billmaker = headers.getString("billmaker"); - String groupCode = headers.getString("groupCode"); - boolean flag = true; + String pk_billmaker = headers.getString("pk_billmaker"); //结算方式编码, 10备用金、20开票、21背书、3网银 String balaTypeCode = formmainData.getString("field0076"); - //付款结算单 - JSONObject param = getCmpPayBillVO(formmainData, forsonDataList, orgCode, billmaker, groupCode); - String req = JSONObject.toJSONString(param); - logger.info("======OA付款单传NCC付款结算单请求参数:{}======", req); - String access_token = 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)//token - .body(req)//表单内容 - .timeout(30000)//超时,毫秒 - .execute().body(); - logger.info("======OA付款单传NCC付款结算单响应参数:{}======",result); - if (StrUtil.isNotEmpty(result)){ - JSONObject resultJson = JSONObject.parseObject(result); - flag = resultJson.getBoolean("flag"); - } - - if (flag){ - //保证金单独生成一张付款结算单 - if ("20".equals(balaTypeCode)) { - logger.info("======OA付款单传开票的方式保证金传NCC付款结算单请求参数:{}======"); - JSONObject bzjParam = getCmpPayBillVO(formmainData, forsonDataList, orgCode, billmaker, groupCode); - 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密钥 - .header("access_token", access_token)//token - .body(bzjReq)//表单内容 - .timeout(30000)//超时,毫秒 - .execute().body(); - logger.info("======OA付款单传开票的方式保证金传NCC付款结算单返回参数:{}",bazjResult); + //背书和开票 才要生成付款结算单 + if ("20".equals(balaTypeCode) || "21".equals(balaTypeCode) || "3".equals(balaTypeCode)) { + //付款结算单 + JSONObject param = getCmpPayBillVO(formmainData, forsonDataList, headers,false); + String req = JSONObject.toJSONString(param); + logger.info("======OA付款单传NCC付款结算单请求参数:{}======", req); + String access_token = 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)//token + .body(req)//表单内容 + .timeout(30000)//超时,毫秒 + .execute().body(); + logger.info("======OA付款单传NCC付款结算单响应参数:{}======", result); + //结算单审批 + String orgCode = formmainData.getString("field0053"); + String auditResult = cmpBillAudit(result, access_token, pk_billmaker, orgCode); + if (StrUtil.isNotEmpty(auditResult) && null != getData(auditResult)) { + //保证金单独生成一张付款结算单 + if ("20".equals(balaTypeCode)) { + logger.info("======OA付款单传开票的方式保证金传NCC付款结算单请求参数:{}======"); + 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密钥 + .header("access_token", access_token)//token + .body(bzjReq)//表单内容 + .timeout(30000)//超时,毫秒 + .execute().body(); + 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 - private static JSONObject getCmpPayBillVO(JSONObject formmainData, List forsonDataList, String orgCode, String billmaker, String groupCode) { + 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<>(); @@ -153,19 +203,24 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService { param.put("head", head); param.put("body", body); head.put("pk_org", orgCode);//组织编码 - head.put("pk_group", "ZJJH");//集团编码 + 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 (!"20".equals(balaTypeCode)) { + if (!isBzj) { head.put("primal_money", formmainData.getString("field0019"));//付款原币金额 + head.put("pk_balatype", formmainData.getString("field0076"));//结算方式 } 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("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);//组织编码 @@ -173,25 +228,33 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService { 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")));//单据日期 - if (!"20".equals(balaTypeCode)) { + b.put("memo",item.getString("field0074")); + 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", "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("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_supplier", formmainData.getString("field0054"));//供应商编码 - b.put("pk_account", formmainData.getString("field0044"));//收款银行账户 - b.put("pk_recproject", item.getString("field0091"));//收支项目 + //b.put("pk_supplier", formmainData.getString("field0065"));//这里传项目部的编码,是在和项目部做结算 + b.put("pk_account", item.getString("field0099"));//对方银行账号 :指的是付款结算单的收款银行账户 body.add(b); + //质保金 明细行 + if (isBzj) { + break; + } } return param; } - /** * 付款单 * @@ -200,172 +263,14 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService { * @param headers * @param forsonDataList */ - private void apPaybill(String datasourceCode, JSONObject formmainData, JSONObject headers, List forsonDataList) { - String orgCode = formmainData.getString("field0053"); + private Boolean apPaybill(String datasourceCode, JSONObject formmainData, JSONObject headers, List forsonDataList) { String billmaker = headers.getString("billmaker"); - if (StrUtil.isNotEmpty(orgCode)) { - Map> groupedMap = forsonDataList.stream() - .collect(Collectors.groupingBy(item -> item.getString("field0065"))); - //付款明细按项目部代码分组,几个项目部就生成几张单子 - for (Map.Entry> entry : groupedMap.entrySet()) { - //每个项目部的付款总额 - BigDecimal money = BigDecimal.ZERO; - List 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 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 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); + boolean falg = true; + //付款明细行,每一行都生成一张NCC付款单 + for (int i = 0; i < forsonDataList.size(); i++) { + if (falg){ + JSONObject forson = forsonDataList.get(i); + String req = payBillValueOf(datasourceCode, formmainData, forsonDataList, billmaker, forson); String access_token = getAccessToken(); String result = HttpRequest.post(baseUrl) .header("appId", "800065")//NCC应用 @@ -376,11 +281,229 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService { .body(req)//表单内容 .timeout(30000)//超时,毫秒 .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 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 itemList = new LinkedList<>(); + + //付款申请单号 + String billNO = forson.getString("field0023"); + //联查OA付款申请单明细行 + CLPayApplyEntity clPayApply = new CLPayApplyEntity(); + clPayApply.setDataSourceCode(datasourceCode); + clPayApply.setField0001(billNO); + List 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) { if (StrUtil.isNotEmpty(dateStr)) { return DateUtil.format(DateUtil.parseDate(dateStr), "yyyy-MM-dd HH:mm:ss"); @@ -388,7 +511,11 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService { return null; } - private String getAccessToken(){ + /** + * 获取token + * @return + */ + private String getAccessToken() { try { String result = HttpRequest.post(baseUrl) .header("appId", "800065")//NCC应用 @@ -398,19 +525,71 @@ public class PaybillPluginServiceImpl implements IPaybillPluginService { .body("")//表单内容 .timeout(30000)//超时,毫秒 .execute().body(); - 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.getString("access_token"); - } - } + JSONObject data = getData(result); + if (null != data) { + return data.getString("access_token"); } - }catch (Exception e){ - logger.error("获取NCCtoken失败:{}",e); + } catch (Exception e) { + logger.error("获取NCCtoken失败:{}", e); } 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); + } + } + } }