diff --git a/arap/META-INF/dev_arap.upm b/arap/META-INF/dev_arap.upm
new file mode 100644
index 0000000..6b8ae2f
--- /dev/null
+++ b/arap/META-INF/dev_arap.upm
@@ -0,0 +1,9 @@
+
+
+
+
+ nc.itf.arap.dev.IDevArapBill2R6Service
+ nc.impl.arap.dev.DevArapBill2R6Impl
+
+
+
\ No newline at end of file
diff --git a/arap/src/private/nc/bs/pub/action/N_F2_DELETE.java b/arap/src/private/nc/bs/pub/action/N_F2_DELETE.java
new file mode 100644
index 0000000..ca7bbe5
--- /dev/null
+++ b/arap/src/private/nc/bs/pub/action/N_F2_DELETE.java
@@ -0,0 +1,68 @@
+// Decompiled by DJ v2.9.9.60 Copyright 2000 Atanas Neshkov Date: 2004-08-10 09:03:08
+// Home Page : http://members.fortunecity.com/neshkov/dj.html - Check often for new version!
+// Decompiler options: packimports(3) ansi
+// Source File Name: N_F2_DELETE.java
+
+package nc.bs.pub.action;
+
+import java.util.Hashtable;
+
+import nc.bs.arap.actions.N_BASE_ACTION;
+import nc.bs.framework.common.NCLocator;
+import nc.itf.arap.dev.IDevArapBill2R6Service;
+import nc.vo.arap.gathering.AggGatheringBillVO;
+import nc.vo.arap.gathering.GatheringBillVO;
+import nc.vo.arap.pub.ArapConstant;
+import nc.vo.fipub.exception.ExceptionHandler;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.compiler.PfParameterVO;
+import nccloud.pubitf.arap.arappub.IArapBillPubUtilService;
+
+public class N_F2_DELETE extends N_BASE_ACTION {
+
+ private Hashtable m_keyHas = null;
+
+ /*
+ * 备注:平台编写规则类 接口执行类
+ */
+ public Object runComClass(PfParameterVO paraVo) throws BusinessException {
+ try {
+
+ if (paraVo.m_preValueVos == null) {
+ return null;
+ }
+ Object obj = null;
+ super.m_tmpVo = paraVo;
+ // 权限校验
+ String actionCode = ArapConstant.DELETE;
+ NCLocator.getInstance().lookup(IArapBillPubUtilService.class).interceptorVaildator(paraVo.m_preValueVos, actionCode);
+ // 批量操作
+ setParameter("context", paraVo.m_preValueVos);
+ obj = runClass("nc.bs.arap.actions.GatheringbillDeleteBatchBSAction", "deleteVOs", "&context:nc.vo.pub.AggregatedValueObject[]", paraVo, m_keyHas);
+
+ afterCheck();
+ //调用删除更新合同销售订单更新
+ if(paraVo.m_preValueVo instanceof AggGatheringBillVO){
+ AggGatheringBillVO aggvo = (AggGatheringBillVO)paraVo.m_preValueVo;
+ NCLocator.getInstance().lookup(IDevArapBill2R6Service.class).updateR6Info(aggvo);
+ }
+ return obj;
+ } catch (Exception ex) {
+ throw ExceptionHandler.handleException(this.getClass(), ex);
+ }
+ }
+
+ public String getCodeRemark() {
+ return " arap action script not allowed to modify ,all rights reserved!";
+ }
+
+ protected void setParameter(String key, Object val) {
+ if (m_keyHas == null) {
+ m_keyHas = new Hashtable();
+ }
+ if (val != null) {
+ m_keyHas.put(key, val);
+ }
+ }
+
+}
diff --git a/arap/src/private/nc/impl/arap/dev/DevArapBill2R6Impl.java b/arap/src/private/nc/impl/arap/dev/DevArapBill2R6Impl.java
new file mode 100644
index 0000000..1e9ea3d
--- /dev/null
+++ b/arap/src/private/nc/impl/arap/dev/DevArapBill2R6Impl.java
@@ -0,0 +1,413 @@
+package nc.impl.arap.dev;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
+import nc.api.arap.resource.IgnoreSslUtil;
+import nc.bs.dao.BaseDAO;
+import nc.bs.dao.DAOException;
+import nc.bs.trade.business.HYSuperDMO;
+import nc.impl.pubapp.pattern.data.vo.VOUpdate;
+import nc.itf.arap.dev.IDevArapBill2R6Service;
+import nc.jdbc.framework.processor.MapProcessor;
+import nc.vo.arap.gathering.AggGatheringBillVO;
+import nc.vo.arap.gathering.GatheringBillItemVO;
+import nc.vo.bd.defdoc.DefdocVO;
+import nc.vo.cmp.util.StringUtils;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.lang.UFDouble;
+import nc.vo.pubapp.pattern.pub.MathTool;
+import nc.vo.so.m30.entity.SaleOrderHVO;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+import java.util.zip.GZIPInputStream;
+
+/**
+ * @Classname DevArapBill2R6Impl
+ * @Description TODO
+ * @Version 1.0.0
+ * @Date 2025/7/26 16:08
+ * @Created by ame
+ */
+public class DevArapBill2R6Impl implements IDevArapBill2R6Service {
+ HYSuperDMO dmo = null;
+
+ public HYSuperDMO getSuperDMO() {
+ if (dmo == null) {
+ dmo = new HYSuperDMO();
+ }
+ return dmo;
+ }
+ @Override
+ public void updateR6Info(AggGatheringBillVO aggvo) throws Exception {
+ GatheringBillItemVO[] billItemVOs = (GatheringBillItemVO[]) aggvo.getChildrenVO();
+ String pk_org = (String) aggvo.getParentVO().getAttributeValue("pk_org");
+ String pk_gatherbill = (String) aggvo.getParentVO().getAttributeValue("pk_gatherbill");
+ JSONObject jsonObject=new JSONObject();
+ JSONArray array=new JSONArray();
+ List saleOrderHVOList = new ArrayList<>();
+ for (GatheringBillItemVO gatheringBillItemVO : billItemVOs) {
+ JSONObject js_apct = afterChangeMny(gatheringBillItemVO.getSrc_billid(), pk_org, gatheringBillItemVO.getDef6(),
+ pk_gatherbill);
+ if(js_apct!=null){
+ SaleOrderHVO hvo = (SaleOrderHVO) js_apct.get("erphvo");
+ saleOrderHVOList.add(hvo);
+ js_apct.remove("erphvo");
+ array.add(js_apct);
+ }
+ }
+ if(saleOrderHVOList.isEmpty()){
+ return;
+ }
+ SaleOrderHVO[] update = (SaleOrderHVO[]) new VOUpdate().update(saleOrderHVOList.toArray(new SaleOrderHVO[0]),new String[]{"vdef11","vdef14"});
+ if(array!=null && array.size()>0){
+ jsonObject.put("HTXSDD",array);
+ pushBipCtOrderUpdate(jsonObject,saleOrderHVOList);
+ }
+ }
+ private JSONObject afterChangeMny(String csaleorderid, String pk_org, String ctid, String pk_gatherid) throws BusinessException {
+ try {
+ // 合同id
+ if (StringUtils.isEmpty(ctid)) {
+ return null;
+ }
+ if (StringUtils.isEmpty(csaleorderid)) {
+ return null;
+ }
+ // 获取销售订单表头
+ SaleOrderHVO hvo = (SaleOrderHVO) getSuperDMO().queryByPrimaryKey(SaleOrderHVO.class, csaleorderid);
+ if (hvo == null) {
+ return null;
+ }
+ String vdef9 = hvo.getVdef9();// BIP 合同销售订单id
+ if (StringUtils.isEmpty(vdef9)) {// 为空,不是从bip 生成的
+ return null;
+ }
+ // 合同金额vdef17
+ UFDouble ctmny = new UFDouble(hvo.getVdef17() == null ? "0" : hvo.getVdef17());
+ // 预收比例vdef15
+ UFDouble yfrate = new UFDouble(hvo.getVdef15() == null ? "0" : hvo.getVdef15());
+ UFDouble temp_yf_mny = ctmny.multiply(yfrate);
+ // 发货比例vdef16
+ UFDouble fhrate = new UFDouble(hvo.getVdef16() == null ? "0" : hvo.getVdef16());
+ UFDouble temp_fh_mny = ctmny.multiply(fhrate);
+ // vdef14 预付款标识
+ String vdef14 = "01";// 01无约定预付款
+ // vdef11 发货款标识
+ String vdef11 = "fhk03";// fhk03无约定发货款
+ UFDouble total_mny = UFDouble.ZERO_DBL;// 当前组织下本合同所有收款单金额累计
+ String sum_sql = "select sum(money_cr) as money_cr from ar_gatheritem where def6 not in ('~') and dr=0 and def6='"
+ + ctid + "'";
+ Map map = (Map) new BaseDAO().executeQuery(sum_sql, new MapProcessor());
+ if (map != null) {
+ total_mny = map.get("money_cr")==null ? UFDouble.ZERO_DBL:new UFDouble(String.valueOf(map.get("money_cr")));
+// total_mny = new UFDouble(String.valueOf(map.get("money_cr")));
+ }
+ if ((MathTool.compareTo(yfrate, UFDouble.ZERO_DBL) == 0)) {
+
+ } else {
+ if (MathTool.compareTo(total_mny, temp_yf_mny) >= 0) {// 累计收款金额≥合同金额*预收比例
+ vdef14 = "02"; // 02有约定已收到预付款
+ } else {
+ vdef14 = "03";// 03 有约定未收到款
+ }
+ }
+ if ((MathTool.compareTo(fhrate, UFDouble.ZERO_DBL) == 0)) {
+
+ } else {
+ if (MathTool.compareTo(total_mny, temp_fh_mny) >= 0) {// 累计收款金额≥合同金额*发货比例
+ vdef11 = "fhk01";// fhk01有约定已收到发货款
+ } else {
+ vdef11 = "fhk02";// fhk02有约定未收到发货款
+ }
+ }
+ DefdocVO[] defdocVOs = (DefdocVO[]) getSuperDMO().queryByWhereClause(DefdocVO.class,
+ " pk_defdoclist in (select pk_defdoclist from bd_defdoclist where code='xsdd' ) and code='" + vdef14
+ + "' and dr=0 ");
+ if (defdocVOs != null && defdocVOs.length > 0) {
+ hvo.setVdef14(defdocVOs[0].getPrimaryKey());
+// hvo.setVdef14(null);
+ hvo.setStatus(1);
+ }
+
+ defdocVOs = (DefdocVO[]) getSuperDMO().queryByWhereClause(DefdocVO.class,
+ " pk_defdoclist in (select pk_defdoclist from bd_defdoclist where code='FHK' ) and code='" + vdef11
+ + "' and dr=0 ");
+ if (defdocVOs != null && defdocVOs.length > 0) {
+ hvo.setVdef11(defdocVOs[0].getPrimaryKey());
+// hvo.setVdef11(null);
+ hvo.setStatus(1);
+ }
+
+ JSONObject js_apct = new JSONObject();
+ js_apct.put("id", hvo.getVdef9());
+ js_apct.put("isShipRecdAmt", vdef11);
+ js_apct.put("isPreRecv", vdef14);
+ js_apct.put("actRecvAmt", hvo.getNreceivedmny().floatValue());
+ js_apct.put("actPreRecvAmt", hvo.getNpreceivemny().floatValue());
+ js_apct.put("erphvo",hvo);
+ return js_apct;
+ } catch (Exception e) {
+ throw new BusinessException(e.getMessage());
+ }
+ }
+ private void pushBipCtOrderUpdate(JSONObject array, List saleOrderHVOList) throws BusinessException {
+ String baseUrl = "";
+ Map bipParamMap = checkBipParam();
+ if (bipParamMap.isEmpty()) {
+ return ;
+ }
+ baseUrl = bipParamMap.get("baseUrl");
+ String contractSaleOrderUrl = bipParamMap.get("contractSaleOrder");// 开票申请单回传
+ if (StringUtils.isEmpty(contractSaleOrderUrl)) {
+ return ;
+ }
+ Gson gson = new Gson();
+ try {
+ String accessToken = getAccessToken(baseUrl, bipParamMap);
+ if (accessToken != "") {
+ Map tokenParam = new HashMap<>();
+ tokenParam.put("access_token", accessToken);
+ Map headers = new HashMap();
+ headers.put("Content-Type", "application/json");
+ String custUpdateUrl = baseUrl + contractSaleOrderUrl;
+ String resultString = doSendHttp(custUpdateUrl, "POST", tokenParam, "", headers,
+ array.toJSONString());
+ Map updateMap = gson.fromJson(resultString, Map.class);
+ if ("200".equals(updateMap.get("code"))) {// 保存更新成功后需要更新日志表
+// getSuperDMO().updateArray(saleOrderHVOList.toArray(new SaleOrderHVO[0]));
+ } else {
+ throw new BusinessException("合同销售订单更新失败【"+updateMap.get("message")+"】");
+ }
+ }
+ } catch (Exception e) {
+ throw new BusinessException("合同销售订单更新失败【"+e.getMessage()+"】");
+ }
+ }
+ private Map checkBipParam() {
+ Map map = new HashMap();
+ String strWhere = " pk_defdoclist in (select pk_defdoclist from bd_defdoclist where code='BIP-sq' and dr=0 ) and dr=0";
+ try {
+ DefdocVO[] defdocVOs = (DefdocVO[]) getSuperDMO().queryByWhereClause(DefdocVO.class, strWhere);
+ if (defdocVOs != null && defdocVOs.length > 0) {
+ for (DefdocVO defdocVO : defdocVOs) {
+ map.put(defdocVO.getCode().trim(), defdocVO.getName());
+ }
+ }
+ } catch (DAOException e) {
+ e.printStackTrace();
+ }
+ return map;
+ }
+
+ private static String doGet(String path, Map params) throws IOException {
+ HttpURLConnection conn = null;
+ InputStream is = null;
+ BufferedReader br = null;
+ StringBuilder result = new StringBuilder();
+ try {
+ if (params != null) {
+ String paramStr = "";
+ for (String key : params.keySet()) {
+ if (!paramStr.isEmpty()) {
+ paramStr += '&';
+ }
+ paramStr += key + '=' + params.get(key);
+ }
+
+ if (path.indexOf('?') > 0) {
+ path += '&' + paramStr;
+ } else {
+ path += '?' + paramStr;
+ }
+ }
+ // 创建远程url连接对象
+ URL url = new URL(path);
+ if ("https".equalsIgnoreCase(url.getProtocol())) {// 判定网址是否信任,不信任则调用忽略信任工具类SslUtil
+ IgnoreSslUtil.ignoreSsl();
+ }
+ // 通过远程url连接对象打开一个连接,强转成HTTPURLConnection类
+ conn = (HttpURLConnection) url.openConnection();
+ conn.setRequestMethod("GET");
+ // 设置连接超时时间和读取超时时间
+ conn.setConnectTimeout(120000);
+ conn.setReadTimeout(120000);
+ conn.setRequestProperty("Accept", "application/json");
+ // 发送请求
+ conn.connect();
+ // 通过conn取得输入流,并使用Reader读取
+ if (200 == conn.getResponseCode()) {
+ is = conn.getInputStream();
+ br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+ String line;
+ while ((line = br.readLine()) != null) {
+ result.append(line);
+ System.out.println(line);
+ }
+ } else {
+ System.out.println("ResponseCode is an error code:" + conn.getResponseCode());
+ }
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return result.toString();
+ }
+
+ private String getAccessToken(String baseUrl, Map bipParamMap)
+ throws NoSuchAlgorithmException, InvalidKeyException, IOException {
+ String tokenUrl = baseUrl + "/iuap-api-auth/open-auth/selfAppAuth/getAccessToken";
+// String appKey = "f10c4bf17b1d4e1fb08eb82bf8540eab";
+ String appKey = bipParamMap.get("appKey");
+
+// String appSecret = "71dc2a58ca378c1a1143231a62e73e75a60e9236";
+ String appSecret = bipParamMap.get("appSecret");
+ String accessToken = "";
+ Map params = new HashMap<>();
+
+ params.put("appKey", appKey);
+ String timestamp = String.valueOf(System.currentTimeMillis());
+ params.put("timestamp", timestamp);
+ // 计算签名
+ Map treeMap;
+ if (params instanceof TreeMap) {
+ treeMap = params;
+ } else {
+ treeMap = new TreeMap<>(params);
+ }
+ StringBuilder stringBuilder = new StringBuilder();
+ for (Map.Entry entry : treeMap.entrySet()) {
+ stringBuilder.append(entry.getKey()).append(entry.getValue());
+ }
+ Mac mac = Mac.getInstance("HmacSHA256");
+
+ mac.init(new SecretKeySpec(appSecret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
+ byte[] signData = mac.doFinal(stringBuilder.toString().getBytes(StandardCharsets.UTF_8));
+ String base64String = Base64.getEncoder().encodeToString(signData);
+ String signature = URLEncoder.encode(base64String, "UTF-8");
+ params.put("signature", signature);
+
+ String responseString = doGet(tokenUrl, params);
+
+ Gson gson = new Gson();
+ Map result = gson.fromJson(responseString, Map.class);
+ if ("00000".equals(result.get("code"))) {
+ Map tokenInfo = (Map) result.get("data");
+ accessToken = (String) tokenInfo.get("access_token");
+
+ }
+
+ return accessToken;
+ }
+
+ public static String doSendHttp(String baseUrl, String method, Map paramMap, String mediaType,
+ Map headers, String json) {
+ HttpURLConnection urlConnection = null;
+ InputStream in = null;
+ OutputStream out = null;
+ BufferedReader bufferedReader = null;
+ String result = null;
+ try {
+ StringBuffer sb = new StringBuffer();
+ sb.append(baseUrl);
+ if (paramMap != null) {
+ sb.append("?");
+ for (Map.Entry entry : paramMap.entrySet()) {
+ String key = entry.getKey();
+ String value = entry.getValue();
+ sb.append(key + "=" + value).append("&");
+ baseUrl = sb.toString().substring(0, sb.toString().length() - 1);
+ }
+ }
+ URL urlobj = new URL(baseUrl);
+ if ("https".equalsIgnoreCase(urlobj.getProtocol())) {// 判定网址是否信任,不信任则调用忽略信任工具类SslUtil
+ IgnoreSslUtil.ignoreSsl();
+ }
+ urlConnection = (HttpURLConnection) urlobj.openConnection();
+ urlConnection.setConnectTimeout(50000);
+ urlConnection.setRequestMethod(method);
+ urlConnection.setDoInput(true);
+ urlConnection.setUseCaches(false);
+ // 如果设置了自定义头,则打印它们
+ if (headers != null && !headers.isEmpty()) {
+ for (Map.Entry entry : headers.entrySet()) {
+ urlConnection.addRequestProperty(entry.getKey(), entry.getValue());
+ }
+ }
+ if (json != null && json.length() > 0) {
+ urlConnection.setDoInput(true);
+ urlConnection.setDoOutput(true);
+ out = urlConnection.getOutputStream();
+ out.write(json.getBytes("utf-8"));
+ out.flush();
+ }
+ int resCode = urlConnection.getResponseCode();
+ String ecod = urlConnection.getContentEncoding();
+ if (resCode == HttpURLConnection.HTTP_OK || resCode == HttpURLConnection.HTTP_CREATED
+ || resCode == HttpURLConnection.HTTP_ACCEPTED) {
+ if (!StringUtils.isEmpty(ecod) && ecod.equals("gzip")) {
+ in = new GZIPInputStream(urlConnection.getInputStream());
+ } else {
+ in = urlConnection.getInputStream();
+ }
+ } else {
+ in = urlConnection.getErrorStream();
+ }
+ bufferedReader = new BufferedReader(new InputStreamReader(in, "utf-8"));
+ StringBuffer temp = new StringBuffer();
+ String line = bufferedReader.readLine();
+ while (line != null) {
+ temp.append(line).append("\r\n");
+ line = bufferedReader.readLine();
+ }
+ if (ecod == null || ecod.equals("gzip")) {
+ ecod = Charset.forName("utf-8").name();
+ }
+ result = new String(temp.toString().getBytes("utf-8"), ecod);
+ } catch (Exception e) {
+ JSONObject js = new JSONObject();
+ js.put("", -1);
+ js.put("message", "调用外系统接口失败:" + e.getMessage());
+ result = js.toString();
+ e.printStackTrace();
+ } finally {
+ if (null != bufferedReader) {
+ try {
+ bufferedReader.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ if (null != out) {
+ try {
+ out.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ if (null != in) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ urlConnection.disconnect();
+ }
+ return result;
+ }
+}
diff --git a/arap/src/public/nc/itf/arap/dev/IDevArapBill2R6Service.java b/arap/src/public/nc/itf/arap/dev/IDevArapBill2R6Service.java
new file mode 100644
index 0000000..9a28e5f
--- /dev/null
+++ b/arap/src/public/nc/itf/arap/dev/IDevArapBill2R6Service.java
@@ -0,0 +1,14 @@
+package nc.itf.arap.dev;
+
+import nc.vo.arap.gathering.AggGatheringBillVO;
+
+/**
+ * @Classname IDevArapBill2R6Service
+ * @Description TODO
+ * @Version 1.0.0
+ * @Date 2025/7/26 16:07
+ * @Created by ame
+ */
+public interface IDevArapBill2R6Service {
+ void updateR6Info(AggGatheringBillVO aggvo) throws Exception;
+}