diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/task/SharePushTaskPlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/task/SharePushTaskPlugin.java new file mode 100644 index 0000000..d7eae9f --- /dev/null +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/task/SharePushTaskPlugin.java @@ -0,0 +1,315 @@ +package shkd.sys.sys.plugin.task; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import kd.bos.context.RequestContext; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.exception.KDException; +import kd.bos.form.IFormView; +import kd.bos.logging.Log; +import kd.bos.logging.LogFactory; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.schedule.executor.AbstractTask; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.QueryServiceHelper; +import kd.drp.mdr.api.Api; +import kd.tmc.fbp.common.util.EmptyUtil; +import shkd.sys.sys.mservice.ApiService; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @FileName SharePushTaskPlugin + * @Description 推送共享定时任务 + * @Author csx + * @date 2025-12-28 + **/ +public class SharePushTaskPlugin extends AbstractTask { + + private static final Log logger = LogFactory.getLog(SharePushTaskPlugin.class); + @Override + public void execute(RequestContext requestContext, Map map) throws KDException { + //要推送单据的过滤(查询单子回单) + QFilter dzhdqFilter = new QFilter("ismatch", QCP.equals,true); + dzhdqFilter = dzhdqFilter.and(new QFilter("billno", QCP.equals, "EBB-250928-101566")); + DynamicObject[] bei_elecreceiptids = BusinessDataServiceHelper.load("bei_elecreceipt", "id", dzhdqFilter.toArray()); + logger.info("符合推送条件数据有:{}条", bei_elecreceiptids.length); + //获取司库电子回单推送共享系统的对应映射 + QFilter qFilter = new QFilter("name", QCP.equals,"司库电子回单推送共享系统"); + DynamicObject shkd_apimappingid = BusinessDataServiceHelper.loadSingle("shkd_apimapping", "id", qFilter.toArray()); + DynamicObject shkd_apimapping = BusinessDataServiceHelper.loadSingle(shkd_apimappingid.getLong("id"), "shkd_apimapping"); + String url = shkd_apimapping.getString("shkd_url"); + String domainName = shkd_apimapping.getString("shkd_domainname"); + String appKey = shkd_apimapping.getString("shkd_appkey"); + String appSecret = shkd_apimapping.getString("shkd_appsecret"); + DynamicObjectCollection shkd_mapping = shkd_apimapping.getDynamicObjectCollection("shkd_mapping"); + + for (DynamicObject bei_elecreceiptid : bei_elecreceiptids) { + // 获取token + String token = ApiService.getBIPToken(domainName, appKey, appSecret); + logger.info("获取token:{}", token); + + DynamicObject bei_elecreceipt = BusinessDataServiceHelper.loadSingle(bei_elecreceiptid.getLong("id"), "bei_elecreceipt"); + String saveRequestBody=getJSON(bei_elecreceipt,shkd_mapping);//请求json + System.out.println(saveRequestBody); +// String saveResponseBody = pushBill(token, url, saveRequestBody); + } + } + + private String getJSON(DynamicObject bei_elecreceipt,DynamicObjectCollection shkd_mapping){ + JSONObject otherIsJson = new JSONObject(); + for (DynamicObject map : shkd_mapping) { + String shkd_jsonzdm = map.getString("shkd_jsonzdm");//JSON字段名 + String shkd_hqfs = map.getString("shkd_hqfs");//获取方式 + String shkd_jsontartype = map.getString("shkd_jsontartype");//JSON字段类型 + String shkd_djzdms = map.getString("shkd_djzdms");//JSON字段类型 + String shkd_mrz = map.getString("shkd_mrz");//默认值 + boolean shkd_sfbt = map.getBoolean("shkd_sfbt");//是否必填 + if (!shkd_sfbt){//如果不必填 + continue; + } + switch (shkd_jsontartype){ + case "对象": + //查找该对象下层级下的 + List JSONObjectfilteredList = shkd_mapping.stream() + .filter(obj -> shkd_jsonzdm.equals(obj.getString("shkd_fjcsm"))) + .collect(Collectors.toList()); + JSONObject json =getJSONObjectvalue(bei_elecreceipt,JSONObjectfilteredList); + otherIsJson.put(shkd_jsonzdm,json); + break; + case "数组": + //查找该对象下层级下的 + List JSONArrayfilteredList = shkd_mapping.stream() + .filter(obj -> shkd_jsonzdm.equals(obj.getString("shkd_fjcsm"))) + .collect(Collectors.toList()); + JSONArray jsonArray =getJSONArrayvalue(bei_elecreceipt,JSONArrayfilteredList); + otherIsJson.put(shkd_jsonzdm,jsonArray); + break; + default: + String value=getvalue(bei_elecreceipt,shkd_hqfs,shkd_jsontartype,shkd_djzdms,shkd_mrz); + otherIsJson.put(shkd_jsonzdm,value); + break; + } + + } + return otherIsJson.toJSONString(); + } + + private JSONArray getJSONArrayvalue(DynamicObject bei_elecreceipt, List jsonArrayfilteredList) { + JSONArray jsonArray = new JSONArray(); + JSONObject json = new JSONObject(); + for (DynamicObject map : jsonArrayfilteredList) { + String shkd_jsonzdm = map.getString("shkd_jsonzdm");//JSON字段名 + String shkd_hqfs = map.getString("shkd_hqfs");//获取方式 + String shkd_jsontartype = map.getString("shkd_jsontartype");//JSON字段类型 + String shkd_djzdms = map.getString("shkd_djzdms");//JSON字段类型 + String shkd_mrz = map.getString("shkd_mrz");//默认值 + switch (shkd_jsontartype){ + case "对象": + //查找该对象下层级下的 + List filteredList = jsonArrayfilteredList.stream() + .filter(obj -> shkd_jsonzdm.equals(obj.getString("shkd_fjcsm"))) + .collect(Collectors.toList()); + JSONObject json1 =getJSONObjectvalue(bei_elecreceipt,filteredList); + json.put(shkd_jsonzdm,json1); + break; + case "数组": + //查找该对象下层级下的 + List JSONArrayfilteredList = jsonArrayfilteredList.stream() + .filter(obj -> shkd_jsonzdm.equals(obj.getString("shkd_fjcsm"))) + .collect(Collectors.toList()); + JSONArray jsonArray1 =getJSONArrayvalue(bei_elecreceipt,JSONArrayfilteredList); + json.put(shkd_jsonzdm,jsonArray1); + break; + default: + String value=getvalue(bei_elecreceipt,shkd_hqfs,shkd_jsontartype,shkd_djzdms,shkd_mrz); + json.put(shkd_jsonzdm,value); + break; + } + } + jsonArray.add(json); + return jsonArray; + } + + private JSONObject getJSONObjectvalue(DynamicObject bei_elecreceipt, List JSONObjectfilteredList) { + + JSONObject json = new JSONObject(); + for (DynamicObject map : JSONObjectfilteredList) { + String shkd_jsonzdm = map.getString("shkd_jsonzdm");//JSON字段名 + String shkd_hqfs = map.getString("shkd_hqfs");//获取方式 + String shkd_jsontartype = map.getString("shkd_jsontartype");//JSON字段类型 + String shkd_djzdms = map.getString("shkd_djzdms");//JSON字段类型 + String shkd_mrz = map.getString("shkd_mrz");//默认值 + switch (shkd_jsontartype){ + case "对象": + //查找该对象下层级下的 + List filteredList = JSONObjectfilteredList.stream() + .filter(obj -> shkd_jsonzdm.equals(obj.getString("shkd_fjcsm"))) + .collect(Collectors.toList()); + JSONObject json1 =getJSONObjectvalue(bei_elecreceipt,filteredList); + json.put(shkd_jsonzdm,json1); + break; + case "数组": + //查找该对象下层级下的 + List JSONArrayfilteredList = JSONObjectfilteredList.stream() + .filter(obj -> shkd_jsonzdm.equals(obj.getString("shkd_fjcsm"))) + .collect(Collectors.toList()); + JSONArray jsonArray =getJSONArrayvalue(bei_elecreceipt,JSONArrayfilteredList); + json.put(shkd_jsonzdm,jsonArray); + break; + default: + String value=getvalue(bei_elecreceipt,shkd_hqfs,shkd_jsontartype,shkd_djzdms,shkd_mrz); + json.put(shkd_jsonzdm,value); + break; + } + } + return json; + } + + /* + * 根据映射获取单据信息 + * */ + private String getvalue(DynamicObject bei_elecreceipt, String shkd_hqfs,String shkd_jsontartype,String shkd_djzdms,String shkd_mrz) { + String value = null; + switch (shkd_hqfs){ + case "直接从单据上get": + value=getbytype(bei_elecreceipt,shkd_jsontartype,shkd_djzdms,shkd_mrz); + break; + case "用单据上的值找其他单据上的属性": + // 根据逗号进行分割 + String[] parts = shkd_djzdms.split(","); + if (parts.length == 3){ + String[] split = parts[2].split(";"); + QFilter qFilter = new QFilter(split[0], split[1], getbytype(bei_elecreceipt, shkd_jsontartype, split[2], shkd_mrz)); + DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(parts[0], parts[1], qFilter.toArray()); + value = dynamicObject.getString(parts[1]); + } + break; + case "附件信息": + IFormView viewByDynamicObj = ApiService.createViewByDynamicObj(bei_elecreceipt); + List errMsgList = new ArrayList<>(); + DynamicObjectCollection receipts = QueryServiceHelper.query("bei_elecreceipt", "id,bank," + + "fileflag,filepath,biztype,bankcheckflag,fileserverurl,tcpurl,uploadfilename,username,password," + + "bank.bank_cate bankcate", new QFilter[]{new QFilter("id", QCP.equals, bei_elecreceipt.getPkValue())}); + value = ApiService.getPdfUrl(viewByDynamicObj.getPageId(), receipts, errMsgList); + break; + case "默认值": + value=shkd_mrz; + break; + case "暂无": + break; + default: + break; + } + return value; + } + + /* + * 根据字段类型或默认值获取字段 + * */ + private String getbytype(DynamicObject bei_elecreceipt, String shkd_jsontartype, String shkd_djzdms,String shkd_mrz) { + String value = null; + switch (shkd_jsontartype){ + case "String": + if (shkd_djzdms.contains("_")) { + String[] parts = shkd_djzdms.split("_"); + DynamicObjectCollection dynamicObjectCollection = bei_elecreceipt.getDynamicObjectCollection(parts[0]); + value = dynamicObjectCollection.get(0).getString(parts[1]); + } else if (shkd_djzdms.contains(".")) { + String[] parts = shkd_djzdms.split("_"); + DynamicObject dynamicObject = bei_elecreceipt.getDynamicObject(parts[0]); + value = dynamicObject.getString(parts[1]); + }else { + value = bei_elecreceipt.getString(shkd_djzdms); + } + break; + case "Date": + Date date = bei_elecreceipt.getDate(shkd_djzdms); + if (EmptyUtil.isEmpty(shkd_mrz)){ + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");//默认 + value=simpleDateFormat.format(date); + }else { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(shkd_mrz); + value=simpleDateFormat.format(date); + } + break; + case "Integer": + value = bei_elecreceipt.getString(shkd_djzdms); + break; + case "BigDecimal": + value = bei_elecreceipt.getString(shkd_djzdms); + break; + default: + value = bei_elecreceipt.getString(shkd_djzdms); + break; + } + return value; + } + + private static String pushBill(String token, String linkUrl, String requestBody) { + // 响应数据 + String formattedContent; + try { + // 请求URL + URL url = new URL(linkUrl + "?access_token=" + token); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + + // 设置请求方法为POST + connection.setRequestMethod("POST"); + + // 设置请求头 + connection.setRequestProperty("Content-Type", "application/json"); + + // 允许输出 + connection.setDoOutput(true); + + // 写入请求体 + try (OutputStream os = connection.getOutputStream()) { + byte[] input = requestBody.getBytes(StandardCharsets.UTF_8); + os.write(input, 0, input.length); + } + + // 获取响应码 + int responseCode = connection.getResponseCode(); + + // 读取响应内容 + if (responseCode == HttpURLConnection.HTTP_OK) { // 成功响应 + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8)); + String inputLine; + StringBuilder content = new StringBuilder(); + while ((inputLine = in.readLine()) != null) { + content.append(inputLine); + } + in.close(); + // 替换 \n 为实际的换行符 + formattedContent = content.toString().replace("\\n", "\n"); + } else { + // 读取错误流 + BufferedReader errorReader = new BufferedReader(new InputStreamReader(connection.getErrorStream(), StandardCharsets.UTF_8)); + String errorLine; + StringBuilder errorContent = new StringBuilder(); + while ((errorLine = errorReader.readLine()) != null) { + errorContent.append(errorLine); + } + errorReader.close(); + formattedContent = "响应失败: " + errorContent; + } + } catch (Exception e) { + formattedContent = "请求失败," + e.getMessage(); + } + return formattedContent; + } +}