From 1083f0b8403dc849ea5146347aaf92ccfd1c3e29 Mon Sep 17 00:00:00 2001 From: csx <1981897232@qq.com> Date: Sun, 28 Dec 2025 18:23:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BA=BA=EF=BC=9A=E9=99=88?= =?UTF-8?q?=E7=BB=8D=E9=91=AB=20=E6=97=A5=E6=9C=9F=EF=BC=9A2025/11/28=2015?= =?UTF-8?q?=EF=BC=9A30=20=E5=86=85=E5=AE=B9:=E6=8E=A8=E9=80=81=E5=85=AC?= =?UTF-8?q?=E4=BA=AB=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1v1.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/form/tsgxApiMappingBillPlugin.java | 406 ++++++++++++++++++ 1 file changed, 406 insertions(+) create mode 100644 sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/tsgxApiMappingBillPlugin.java diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/tsgxApiMappingBillPlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/tsgxApiMappingBillPlugin.java new file mode 100644 index 0000000..ade683c --- /dev/null +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/tsgxApiMappingBillPlugin.java @@ -0,0 +1,406 @@ +package shkd.sys.sys.plugin.form; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import kd.bos.bill.AbstractBillPlugIn; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.form.IFormView; +import kd.bos.form.control.Toolbar; +import kd.bos.form.control.events.ItemClickEvent; +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.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.QueryServiceHelper; +import kd.bos.servicehelper.operation.SaveServiceHelper; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import shkd.sys.sys.mservice.ApiService; +import shkd.sys.sys.plugin.task.SharePushTaskPlugin; +import shkd.sys.sys.utils.EmptyUtil; + +import java.io.IOException; +import java.net.URI; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @FileName tsgxApiMappingBillPlugin + * @Description + * @Author csx + * @date 2025-12-28 + **/ +public class tsgxApiMappingBillPlugin extends AbstractBillPlugIn { + + private static final Log logger = LogFactory.getLog(tsgxApiMappingBillPlugin.class); + // 日期格式化器 + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); + @Override + public void registerListener(EventObject e) { + Toolbar tbmain = this.getView().getControl("tbmain"); + Toolbar advcontoolbarap = this.getView().getControl("advcontoolbarap"); + tbmain.addItemClickListener(this); + advcontoolbarap.addItemClickListener(this); + } + + @Override + public void itemClick(ItemClickEvent evt) { + String itemKey = evt.getItemKey(); + if ("shkd_tsgx".equals(itemKey)){ + //获取司库电子回单推送共享系统的对应映射 + QFilter qFilter = new QFilter("shkd_name", QCP.equals,"司库电子回单推送共享系统"); + DynamicObject shkd_apimappingid = BusinessDataServiceHelper.loadSingle("shkd_apimapping", "id", qFilter.toArray()); + if (shkd_apimappingid==null){ + logger.info("未找到对应的推送接口映射"); + return; + } + DynamicObject shkd_apimapping = BusinessDataServiceHelper.loadSingle(shkd_apimappingid.getLong("id"), "shkd_apimapping"); + + //要推送单据的过滤(查询单子回单默认过滤条件) + QFilter dzhdqFilter = new QFilter("ismatch", QCP.equals,true); + + //自定义过滤条件 + String shkd_zdygltj = shkd_apimapping.getString("shkd_zdygltj"); + if (!EmptyUtil.isEmpty(shkd_zdygltj)){ + QFilter zdyqFilter= null; + try { + zdyqFilter = getqFilter(shkd_zdygltj); + } catch (ParseException e) { + throw new RuntimeException(e); + } + dzhdqFilter=dzhdqFilter.and(zdyqFilter); + } + + DynamicObject[] bei_elecreceiptids = BusinessDataServiceHelper.load("bei_elecreceipt", "id", dzhdqFilter.toArray()); + logger.info("符合推送条件数据有:{}条", bei_elecreceiptids.length); + + + String shkd_url = shkd_apimapping.getString("shkd_url"); + Map headMap = new HashMap<>(); + DynamicObjectCollection shkdHeade = shkd_apimapping.getDynamicObjectCollection("shkd_heade"); + for (DynamicObject dynamicObject : shkdHeade) { + headMap.put(dynamicObject.getString("shkd_headcsm"), dynamicObject.getString("shkd_headcsz")); + } + DynamicObjectCollection shkd_mapping = shkd_apimapping.getDynamicObjectCollection("shkd_mapping"); + + for (DynamicObject bei_elecreceiptid : bei_elecreceiptids) { + DynamicObject bei_elecreceipt = BusinessDataServiceHelper.loadSingle(bei_elecreceiptid.getLong("id"), "bei_elecreceipt"); + String saveRequestBody=getJSON(bei_elecreceipt,shkd_mapping);//请求json + logger.info("单据"+bei_elecreceipt.getString("billno")+"推送json:"+saveRequestBody); + String res = doPost(shkd_url,headMap,saveRequestBody,null); + logger.info("单据"+bei_elecreceipt.getString("billno")+"返回json:"+res); + JSONObject otherIsJsonRS = JSONObject.parseObject(res);//获取返回结果 + Map resultMap = new HashMap<>(); + resultMap.put("shkd_requesturl",shkd_url);//请求地址 + resultMap.put("shkd_request",saveRequestBody);//请求体 + resultMap.put("shkd_response",res);//响应数据 + resultMap.put("shkd_thirdpartysys","浪潮");//第三方系统 + resultMap.put("shkd_calldescription","司库->浪潮");//第三方系统 + + String flag = otherIsJsonRS.getString("flag"); + if ("0".equals(flag)){//失败 + resultMap.put("shkd_issuccess",false);//是否成功 + }else { + JSONArray datas = otherIsJsonRS.getJSONArray("data"); + JSONObject data = datas.getJSONObject(0); + String dataflag = data.getString("flag"); + if ("0".equals(dataflag)){ + resultMap.put("shkd_issuccess",false);//是否成功 + }else { + resultMap.put("shkd_issuccess",true);//是否成功 + bei_elecreceipt.set("shkd_sfcgtsgx",true); + SaveServiceHelper.update(bei_elecreceipt); + } + } + ApiService.saveThePushLog(resultMap); + } + } + } + + private QFilter getqFilter(String shkd_zdygltj) throws ParseException { + // 将字符串转换为 JSON 数组 + JSONArray jsonArray = JSONArray.parseArray(shkd_zdygltj); + QFilter qFilter = null; + // 遍历 JSON 数组 + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + String field = jsonObject.getString("field"); + String qcp = jsonObject.getString("qcp"); + String value = jsonObject.getString("value"); + String type = jsonObject.getString("type"); + Object o; + if (type.equals("String")){ + o=value; + } else if (type.equals("Date")) { + o = dateFormat.parse(value); // 将字符串转换为 Date + }else { + o=value; + } + if (i==0){ + qFilter=new QFilter(field,qcp,o); + }else { + qFilter.and(new QFilter(field,qcp,o)); + } + } + return qFilter; + } + + 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");//是否必填 + String shkd_fjcsm = map.getString("shkd_fjcsm");//父级参数名 + if (!shkd_sfbt&&EmptyUtil.isEmpty(shkd_hqfs)){//如果不必填 + continue; + } + if (EmptyUtil.isEmpty(shkd_fjcsm)){ + 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,shkd_mapping); + 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,shkd_mapping); + 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,DynamicObjectCollection shkd_mapping) { + 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");//默认值 + boolean shkd_sfbt = map.getBoolean("shkd_sfbt");//是否必填 + if (!shkd_sfbt&&EmptyUtil.isEmpty(shkd_hqfs)){//如果不必填 + continue; + } + switch (shkd_jsontartype){ + case "对象": + //查找该对象下层级下的 + List filteredList = shkd_mapping.stream() + .filter(obj -> shkd_jsonzdm.equals(obj.getString("shkd_fjcsm"))) + .collect(Collectors.toList()); + JSONObject json1 =getJSONObjectvalue(bei_elecreceipt,filteredList,shkd_mapping); + json.put(shkd_jsonzdm,json1); + break; + case "数组": + //查找该对象下层级下的 + List JSONArrayfilteredList = shkd_mapping.stream() + .filter(obj -> shkd_jsonzdm.equals(obj.getString("shkd_fjcsm"))) + .collect(Collectors.toList()); + JSONArray jsonArray1 =getJSONArrayvalue(bei_elecreceipt,JSONArrayfilteredList,shkd_mapping); + 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,DynamicObjectCollection shkd_mapping) { + + 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");//默认值 + boolean shkd_sfbt = map.getBoolean("shkd_sfbt");//是否必填 + if (!shkd_sfbt&&EmptyUtil.isEmpty(shkd_hqfs)){//如果不必填 + continue; + } + switch (shkd_jsontartype){ + case "对象": + //查找该对象下层级下的 + List filteredList = shkd_mapping.stream() + .filter(obj -> shkd_jsonzdm.equals(obj.getString("shkd_fjcsm"))) + .collect(Collectors.toList()); + JSONObject json1 =getJSONObjectvalue(bei_elecreceipt,filteredList,shkd_mapping); + json.put(shkd_jsonzdm,json1); + 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,shkd_mapping); + 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 "附件信息": + if ("name".equals(shkd_mrz)){ + Path path = Paths.get(bei_elecreceipt.getString("filepath")); + value = path.getFileName().toString(); + }else { + 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); + logger.info("单据编号:"+bei_elecreceipt.getString("billno")+"对应url:"+value); + } + 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; + } + + /* + * 执行doPost请求 请求参数:Ctx Json + */ + public static String doPost(String url,Map headMap,String requestJson, String token) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString; + try { + // 创建uri + URIBuilder builder = new URIBuilder(url); + URI uri = builder.build(); + // 创建HTTP Post请求 + HttpPost httpPost = new HttpPost(uri.toString()); + // 创建请求内容 + StringEntity entity = new StringEntity(requestJson, "UTF-8"); + entity.setContentType(ContentType.APPLICATION_JSON.toString()); + httpPost.setEntity(entity); +// httpPost.setHeader("Content-Type","application/json;charset=UTF-8"); + // 添加指定的Headers + httpPost.setHeader("X-ECC-Current-Tenant", headMap.get("X-ECC-Current-Tenant").toString()); + httpPost.setHeader("apikey", headMap.get("apikey").toString()); + httpPost.setHeader("Content-Type", headMap.get("Content-Type").toString()); + httpPost.setHeader("Authorization", headMap.get("Authorization").toString()); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + resultString = e.getMessage(); + } finally { + try { + if (response != null) { + response.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return resultString; + } +}