提交人:陈绍鑫

日期:2025/11/28 15:30
内容:推送公享定时任务v1.1
This commit is contained in:
陈绍鑫 2025-12-28 18:23:52 +08:00
parent 2a73449f71
commit 1083f0b840
1 changed files with 406 additions and 0 deletions

View File

@ -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<String, Object> 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<String, Object> 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<DynamicObject> 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<DynamicObject> 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<DynamicObject> 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<DynamicObject> 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<DynamicObject> 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<DynamicObject> 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<DynamicObject> 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<DynamicObject> 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<String> 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<String, Object> 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;
}
}