53 changed files with 1130 additions and 174 deletions
@ -0,0 +1,36 @@ |
|||||
|
package com.yxt.anrui.fin.api.kingdee.bddepartment; |
||||
|
|
||||
|
import com.fasterxml.jackson.annotation.JsonProperty; |
||||
|
import lombok.Data; |
||||
|
|
||||
|
import javax.validation.constraints.NotBlank; |
||||
|
|
||||
|
/** |
||||
|
* 部门 |
||||
|
*/ |
||||
|
@Data |
||||
|
public class BdDepartment { |
||||
|
/* 使用组织:FUseOrgId (必填项)*/ |
||||
|
@JsonProperty("FUseOrgId") |
||||
|
@NotBlank(message = "FUseOrgId不能为空") |
||||
|
public String FUseOrgId; |
||||
|
/* 创建组织:FCreateOrgId (必填项) */ |
||||
|
@JsonProperty("FCreateOrgId") |
||||
|
@NotBlank(message = "FCreateOrgId不能为空") |
||||
|
public String FCreateOrgId; |
||||
|
/* 编码:FNumber*/ |
||||
|
@JsonProperty("FNumber") |
||||
|
public String FNumber=""; |
||||
|
/* 名称:FName (必填项)*/ |
||||
|
@JsonProperty("FName") |
||||
|
@NotBlank(message = "FName不能为空") |
||||
|
public String FName; |
||||
|
/* 名称:FGroup (必填项)*/ |
||||
|
@JsonProperty("FGroup") |
||||
|
@NotBlank(message = "FGroup不能为空") |
||||
|
public String FGroup=""; |
||||
|
/* 名称:FParentID */ |
||||
|
@JsonProperty("FParentID") |
||||
|
@NotBlank(message = "FParentID不能为空") |
||||
|
public String FParentID=""; |
||||
|
} |
@ -0,0 +1,50 @@ |
|||||
|
package com.yxt.anrui.fin.api.kingdee.bdempinfo; |
||||
|
|
||||
|
import com.fasterxml.jackson.annotation.JsonProperty; |
||||
|
import lombok.Data; |
||||
|
|
||||
|
import javax.validation.constraints.NotBlank; |
||||
|
|
||||
|
@Data |
||||
|
public class BDEmpinfo { |
||||
|
/*工作组织:FWorkOrgId (必填项) |
||||
|
所属部门:FPostDept (必填项) |
||||
|
就任岗位:FPost (必填项) |
||||
|
*/ |
||||
|
/* 员工姓名:FName (必填项)*/ |
||||
|
@JsonProperty("FName") |
||||
|
@NotBlank(message = "FName不能为空") |
||||
|
public String FName; |
||||
|
/** |
||||
|
* 使用组织:FUseOrgId (必填项) |
||||
|
*/ |
||||
|
@JsonProperty("FUseOrgId") |
||||
|
@NotBlank(message = "FUseOrgId不能为空") |
||||
|
public String FUseOrgId; |
||||
|
/** |
||||
|
* 创建组织:FCreateOrgId (必填项) |
||||
|
*/ |
||||
|
@JsonProperty("FCreateOrgId") |
||||
|
@NotBlank(message = "FCreateOrgId不能为空") |
||||
|
public String FCreateOrgId; |
||||
|
/** |
||||
|
* 描述:FDescription |
||||
|
*/ |
||||
|
@JsonProperty("FDescription") |
||||
|
public String FDescription=""; |
||||
|
/** |
||||
|
* 编码:FNumber |
||||
|
*/ |
||||
|
@JsonProperty("FNumber") |
||||
|
public String FNumber; |
||||
|
/** |
||||
|
* 移动电话:FMobile |
||||
|
*/ |
||||
|
@JsonProperty("FMobile") |
||||
|
public String FMobile; |
||||
|
/** |
||||
|
* 联系地址:FAddress |
||||
|
*/ |
||||
|
@JsonProperty("FAddress") |
||||
|
public String FAddress; |
||||
|
} |
@ -1,58 +1,56 @@ |
|||||
package com.yxt.anrui.fin.biz.kingdee; |
package com.yxt.anrui.fin.biz.kingdee; |
||||
|
|
||||
|
import org.springframework.beans.factory.annotation.Value; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
|
||||
|
/** |
||||
|
* 金蝶的系统的链接账号 url等信息 |
||||
|
*/ |
||||
|
@Configuration |
||||
public class KingDeeConfig { |
public class KingDeeConfig { |
||||
public static String sessionkey = "kdservice-sessionid"; |
public static String sessionkey = "kdservice-sessionid"; |
||||
public static String aspnetsessionkey = "ASP.NET_SessionId"; |
public static String aspnetsessionkey = "ASP.NET_SessionId"; |
||||
public static String sessionValue = ""; |
public static String sessionValue = ""; |
||||
public static String aspnetsessionValue = ""; |
public static String aspnetsessionValue = ""; |
||||
/** |
@Value("${kingdee.acctID}") |
||||
* 登录金蝶的账户信息 20211011 |
private String acctID; |
||||
*/ |
@Value("${kingdee.userName}") |
||||
// public static String acctID = "61654d8e138fe6";
|
private String userName; |
||||
/** |
@Value("${kingdee.password}") |
||||
* 登录金蝶的账户信息 2022010测试 |
private String password; |
||||
*/ |
@Value("${kingdee.userName_administrator}") |
||||
// public static String acctID = "61dce6601125a0";
|
private String userName_administrator; |
||||
/** |
@Value("${kingdee.password_administrator}") |
||||
* 登录金蝶的账户信息 正式系统 正式系统 正式系统 正式系统 正式系统 正式系统 正式系统 正式系统 正式系统 正式系统 |
private String password_administrator; |
||||
*/ |
@Value("${kingdee.lcid}") |
||||
public static String acctID = "5e84c526016ed7"; |
private String lcid; |
||||
/** |
@Value("${kingdee.url}") |
||||
* 登录金蝶的账户信息 2022010测试的 |
public String url; |
||||
*/ |
public String getAcctID(){ |
||||
// public static String userName = "信息部2";
|
return acctID; |
||||
/** |
} |
||||
* 登录金蝶的账户信息 |
|
||||
*/ |
|
||||
//public static String password = "123321";
|
|
||||
/** |
|
||||
* 登录金蝶的账户信息 2022010测试 |
|
||||
*/ |
|
||||
// public static String userName_administrator = "administrator";
|
|
||||
/** |
|
||||
* 登录金蝶的账户信息 2022010测试 |
|
||||
*/ |
|
||||
// public static String password_administrator = "ANrui123456.";
|
|
||||
|
|
||||
/** |
public String getUrl() { |
||||
* 登录金蝶的账户信息 正式系统正式系统正式系统正式系统正式系统 正式系统 正式系统 正式系统 正式系统 |
return url; |
||||
*/ |
} |
||||
public static String userName = "信息部"; |
|
||||
/** |
public String getUserName() { |
||||
* 登录金蝶的账户信息 正式系统正式系统正式系统正式系统正式系统 正式系统 正式系统 正式系统 正式系统 |
return userName; |
||||
*/ |
} |
||||
public static String password = "ywzx0750"; |
|
||||
/** |
public String getPassword() { |
||||
* 登录金蝶的账户信息 正式系统 正式系统 正式系统 正式系统 |
return password; |
||||
*/ |
} |
||||
public static String userName_administrator = "Administrator"; |
|
||||
/** |
public String getUserName_administrator() { |
||||
* 登录金蝶的账户信息 正式系统 正式系统 正式系统 正式系统 |
return userName_administrator; |
||||
*/ |
} |
||||
public static String password_administrator = "hebei@anrui202108."; |
|
||||
/** |
public String getPassword_administrator() { |
||||
* 登录金蝶的账户信息 |
return password_administrator; |
||||
*/ |
} |
||||
public static String lcid = "2052"; |
|
||||
public static String url="http://121.36.43.55" ; |
public String getLcid() { |
||||
|
return lcid; |
||||
|
} |
||||
} |
} |
||||
|
@ -0,0 +1,44 @@ |
|||||
|
package com.yxt.anrui.fin.biz.kingdee.bddepartment; |
||||
|
|
||||
|
import com.alibaba.fastjson.JSON; |
||||
|
import com.alibaba.fastjson.JSONObject; |
||||
|
import com.alibaba.fastjson.parser.Feature; |
||||
|
import com.yxt.anrui.fin.biz.kingdee.KingDeeUtils; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
|
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* 封装转换的类 |
||||
|
*/ |
||||
|
public class BdDepartmentCastToKingDeeBillFields { |
||||
|
private static Logger log=LoggerFactory.getLogger(BdDepartmentCastToKingDeeBillFields.class); |
||||
|
/** |
||||
|
* 构造金蝶需要的数据结构 并对字段赋值 |
||||
|
* |
||||
|
* @param map_fEntityModel_ |
||||
|
* @return |
||||
|
*/ |
||||
|
public static String getKingDeeData(Map<String,String> map_fEntityModel_ ){ |
||||
|
/** |
||||
|
* 取模板 |
||||
|
*/ |
||||
|
String readJsonFile = KingDeeUtils.readJsonFile("com/yxt/anrui/fin/biz/kingdee/bddepartment/data.json"); |
||||
|
String fEntityData_ = KingDeeUtils.readJsonFile("com/yxt/anrui/fin/biz/kingdee/bddepartment/data_data.json"); |
||||
|
String fEntityModel_ = KingDeeUtils.readJsonFile("com/yxt/anrui/fin/biz/kingdee/bddepartment/data_model.json"); |
||||
|
log.info("readJsonFile:{}",readJsonFile); |
||||
|
log.info("fEntityData_:{}",fEntityData_); |
||||
|
log.info("fEntityModel_:{}",fEntityModel_); |
||||
|
|
||||
|
//模板字符创转json
|
||||
|
JSONObject jsonObj= JSONObject.parseObject(readJsonFile, Feature.OrderedField); |
||||
|
JSONObject jsonFEntityData_= JSONObject.parseObject(fEntityData_,Feature.OrderedField); |
||||
|
fEntityModel_ =KingDeeUtils.replaceTemplateParams(fEntityModel_, map_fEntityModel_); |
||||
|
JSONObject jsonFEntityModel_= JSONObject.parseObject(fEntityModel_,Feature.OrderedField); |
||||
|
|
||||
|
jsonFEntityData_.put("Model",JSONObject.parseObject(JSON.toJSONString(jsonFEntityModel_),Feature.OrderedField)); |
||||
|
jsonObj.put("data",jsonFEntityData_.toJSONString()); |
||||
|
return jsonObj.toJSONString(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,144 @@ |
|||||
|
package com.yxt.anrui.fin.biz.kingdee.bddepartment; |
||||
|
|
||||
|
import com.alibaba.fastjson.JSONObject; |
||||
|
import com.yxt.anrui.fin.api.kingdee.KingDeeBillId; |
||||
|
import com.yxt.anrui.fin.api.kingdee.KingDeeBillUrl; |
||||
|
import com.yxt.anrui.fin.api.kingdee.bddepartment.BdDepartment; |
||||
|
import com.yxt.anrui.fin.biz.kingdee.FinKingDeeService; |
||||
|
import com.yxt.anrui.fin.biz.kingdee.KingDeeConfig; |
||||
|
import com.yxt.common.base.utils.StringUtils; |
||||
|
import com.yxt.common.core.result.ResultBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
|
||||
|
import java.util.ArrayList; |
||||
|
import java.util.List; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
@Service |
||||
|
public class BdDepartmentService extends FinKingDeeService { |
||||
|
@Autowired |
||||
|
private KingDeeConfig kingDeeConfig; |
||||
|
/** |
||||
|
* 保存部门 |
||||
|
* @param bdDepartment |
||||
|
* @return |
||||
|
*/ |
||||
|
public ResultBean saveBdDepartment(BdDepartment bdDepartment) { |
||||
|
//BdDepartments=BdDepartments.createBdDepartments();
|
||||
|
ResultBean rb=ResultBean.fireFail(); |
||||
|
try { |
||||
|
//业务表的主表数据集合
|
||||
|
Map<String,String> map_fEntityModel_= object2Map(bdDepartment); |
||||
|
map_fEntityModel_.put("FDEPTID","0"); |
||||
|
map_fEntityModel_.put("IsDeleteEntry", "True"); |
||||
|
String kingDeeData = BdDepartmentCastToKingDeeBillFields.getKingDeeData(map_fEntityModel_); |
||||
|
return addBdDepartment(kingDeeData,bdDepartment.getFNumber()); |
||||
|
} catch (Exception e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
return rb; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 批量修改 部门 |
||||
|
* @param BdDepartments |
||||
|
* @return |
||||
|
*/ |
||||
|
public ResultBean<String> updateBdDepartments(List<BdDepartment> BdDepartments) { |
||||
|
ResultBean rb=ResultBean.fireFail(); |
||||
|
List<String> list=new ArrayList<>(); |
||||
|
BdDepartments.forEach(o->{ |
||||
|
ResultBean<String> r = updateBdDepartment(o); |
||||
|
if(r.getSuccess()){ |
||||
|
list.add(r.getData()); |
||||
|
} |
||||
|
}); |
||||
|
return rb.success().setData(JSONObject.toJSONString(list)); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 修改部门 |
||||
|
* @param bdDepartment |
||||
|
* @return |
||||
|
*/ |
||||
|
public ResultBean<String> updateBdDepartment( BdDepartment bdDepartment) { |
||||
|
//BdDepartments=BdDepartments.createBdDepartments();
|
||||
|
ResultBean<String> rb=ResultBean.fireFail(); |
||||
|
try { |
||||
|
Map<String,String> map_fEntityModel_= object2Map(bdDepartment); |
||||
|
map_fEntityModel_.put("FDEPTID","0"); |
||||
|
map_fEntityModel_.put("IsDeleteEntry", "True"); |
||||
|
String kingDeeData = BdDepartmentCastToKingDeeBillFields.getKingDeeData(map_fEntityModel_); |
||||
|
ResultBean<String> stringResultBean = viewGetId(KingDeeBillId.BD_Department.getID(), bdDepartment.getFNumber() |
||||
|
); |
||||
|
String id = stringResultBean.getData(); |
||||
|
if(!stringResultBean.getSuccess()&&"0".equals(id)){ |
||||
|
return addBdDepartment(kingDeeData,bdDepartment.getFNumber()); |
||||
|
} |
||||
|
//反审核
|
||||
|
boolean c = isAudit(KingDeeBillId.BD_Department.getID(), "C", id); |
||||
|
//修改
|
||||
|
map_fEntityModel_.put("FDEPTID",id); |
||||
|
map_fEntityModel_.put("IsDeleteEntry", "False"); |
||||
|
kingDeeData = BdDepartmentCastToKingDeeBillFields.getKingDeeData(map_fEntityModel_); |
||||
|
rb= accessKingDeeInterface(KingDeeBillId.BD_Department.getID(), kingDeeData, KingDeeBillUrl.SAVE_URL.getURL()); |
||||
|
//提交审核
|
||||
|
ResultBean<String> resultBean2 = submitAndAudit(id); |
||||
|
return resultBean2; |
||||
|
} catch (Exception e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
return rb; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 新增 |
||||
|
* @param kingDeeData |
||||
|
* @return |
||||
|
*/ |
||||
|
private ResultBean<String> addBdDepartment(String kingDeeData,String FNumber){ |
||||
|
ResultBean<String> rb=ResultBean.fireFail(); |
||||
|
try{ |
||||
|
rb= accessKingDeeInterface(KingDeeBillId.BD_Department.getID(), kingDeeData, KingDeeBillUrl.SAVE_URL.getURL()); |
||||
|
String s = draftResultGetId(rb.getData()); |
||||
|
return submitAndAudit(s); |
||||
|
}catch (Exception e){ |
||||
|
e.printStackTrace(); |
||||
|
return rb.setMsg("部门新增失败"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 提交审核部门 |
||||
|
* @param id |
||||
|
* @return |
||||
|
*/ |
||||
|
private ResultBean<String> submitAndAudit( String id){ |
||||
|
ResultBean<String> rb=ResultBean.fireFail(); |
||||
|
try{ |
||||
|
String submitKDTempJson = getSubmitKDTempJson(KingDeeBillId.BD_Department.getID(),id ); |
||||
|
ResultBean<String> resultBean1 = accessKingDeeInterface(KingDeeBillId.BD_Department.getID(), submitKDTempJson, |
||||
|
KingDeeBillUrl.SUBMIT_URL.getURL()); |
||||
|
if(!resultBean1.getSuccess()){ |
||||
|
log.info("部门提交失败!"); |
||||
|
return rb.setMsg("部门提交失败!"); |
||||
|
} |
||||
|
log.info("部门提交成功!"); |
||||
|
String auditKDTempJson = getAuditKDTempJson(KingDeeBillId.BD_Department.getID(), id); |
||||
|
ResultBean<String> resultBean2 = |
||||
|
accessKingDeeInterface(KingDeeBillId.BD_Department.getID(), auditKDTempJson, |
||||
|
KingDeeBillUrl.AUDIT_URL.getURL()); |
||||
|
if(!resultBean2.getSuccess()){ |
||||
|
log.info("部门审核失败!"); |
||||
|
return rb.setMsg("部门审核失败!"); |
||||
|
} |
||||
|
log.info("部门审核成功!"); |
||||
|
return resultBean2; |
||||
|
} catch (Exception e){ |
||||
|
e.printStackTrace(); |
||||
|
return rb.setMsg("部门提交审核失败"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
@ -0,0 +1,4 @@ |
|||||
|
{ |
||||
|
"formId": "BD_Department", |
||||
|
"data": "@KD_data" |
||||
|
} |
@ -0,0 +1,13 @@ |
|||||
|
{ |
||||
|
"Creator": "", |
||||
|
"NeedUpDateFields": [], |
||||
|
"NeedReturnFields": [], |
||||
|
"IsDeleteEntry": "True", |
||||
|
"SubSystemId": "", |
||||
|
"IsVerifyBaseDataField": "false", |
||||
|
"IsEntryBatchFill": "True", |
||||
|
"ValidateFlag": "True", |
||||
|
"NumberSearch": "True", |
||||
|
"InterationFlags": "", |
||||
|
"Model": {} |
||||
|
} |
@ -0,0 +1,24 @@ |
|||||
|
{ |
||||
|
"FDEPTID": @KD_FDEPTID, |
||||
|
"FCreateOrgId": { |
||||
|
"FNumber": "@KD_FCreateOrgId" |
||||
|
}, |
||||
|
"FNumber": "@KD_FNumber", |
||||
|
"FUseOrgId": { |
||||
|
"FNumber": "@KD_FUseOrgId" |
||||
|
}, |
||||
|
"FName": "@KD_FName", |
||||
|
"FParentID": { |
||||
|
"FNumber": "@KD_FParentID" |
||||
|
}, |
||||
|
"FEffectDate": "@KD_FParentID", |
||||
|
"FLapseDate": "9999-12-31 00:00:00", |
||||
|
"FDeptProperty": { |
||||
|
"FNumber": "DP02_SYS" |
||||
|
}, |
||||
|
"FGroup": { |
||||
|
"FNumber": "@KD_FGroup" |
||||
|
}, |
||||
|
"FIsCopyFlush": false, |
||||
|
"FSHRMapEntity": {} |
||||
|
} |
@ -0,0 +1,71 @@ |
|||||
|
一、请求参数说明: |
||||
|
1.formid:业务对象表单Id,字符串类型(必录) |
||||
|
2.data:Json格式数据(详情参考Json格式数据)(必录) |
||||
|
2.1.Creator:创建者内码(非必录) |
||||
|
2.2.NeedUpDateFields:需要更新的字段,数组类型,格式:[key1,key2,...](非必录),注(更新单据体字段得加上单据体key) |
||||
|
2.3.NeedReturnFields:需返回结果的字段集合,数组类型,格式:[key,entitykey.key,...](非必录),注(返回单据体字段格式:entitykey.key) |
||||
|
2.4.IsDeleteEntry:是否删除已存在的分录,布尔类型,默认true(非必录) |
||||
|
2.5.SubSystemId:表单所在的子系统内码,字符串类型(非必录) |
||||
|
2.6.IsVerifyBaseDataField:是否验证所有的基础资料有效性,布尔类,默认false(非必录) |
||||
|
2.7.IsEntryBatchFill:是否批量填充分录,默认true(非必录) |
||||
|
2.8.ValidateFlag:是否验证标志,布尔类型,默认true(非必录) |
||||
|
2.9.NumberSearch:是否用编码搜索基础资料,布尔类型,默认true(非必录) |
||||
|
2.10.InterationFlags:交互标志集合,字符串类型,分号分隔,格式:"flag1;flag2;..."(非必录),例如(允许负库存标识:STK_InvCheckResult) |
||||
|
2.11.Model:表单数据包,Json类型(必录) |
||||
|
|
||||
|
二、Json格式数据: |
||||
|
{\"Creator\":\"\",\"NeedUpDateFields\":[],\"NeedReturnFields\":[],\"IsDeleteEntry\":\"True\",\"SubSystemId\":\"\",\"IsVerifyBaseDataField\":\"false\",\"IsEntryBatchFill\":\"True\",\"ValidateFlag\":\"True\",\"NumberSearch\":\"True\",\"InterationFlags\":\"\",\"Model\":{\"FDEPTID\":\"0\",\"FCreateOrgId\":{\"FNumber\":\"\"},\"FNumber\":\"\",\"FUseOrgId\":{\"FNumber\":\"\"},\"FName\":\"\",\"FHelpCode\":\"\",\"FParentID\":{\"FNumber\":\"\"},\"FFullName\":\"\",\"FEffectDate\":\"1900-01-01\",\"FLapseDate\":\"1900-01-01\",\"FDeptProperty\":{\"FNumber\":\"\"},\"FDescription\":\"\",\"FGroup\":{\"FNumber\":\"\"},\"FIsCopyFlush\":\"false\",\"FSHRMapEntity\":{\"FMAPID\":\"0\"}}} |
||||
|
|
||||
|
三、返回参数: |
||||
|
{\"Result\":{\"ResponseStatus\":{\"ErrorCode\":\"\",\"IsSuccess\":\"false\",\"Errors\":[{\"FieldName\":\"\",\"Message\":\"\",\"DIndex\":0}],\"SuccessEntitys\":[{\"Id\":\"\",\"Number\":\"\",\"DIndex\":0}],\"SuccessMessages\":[{\"FieldName\":\"\",\"Message\":\"\",\"DIndex\":0}]},\"Id\":\"\",\"NeedReturnData\":[{}]}} |
||||
|
|
||||
|
四、代码示例: |
||||
|
// 使用webapi引用组件Kingdee.BOS.WebApi.Client.dll |
||||
|
K3CloudApiClient client = new K3CloudApiClient("http://121.36.43.55/k3cloud/"); |
||||
|
var ret = client.ValidateLogin("61dce6601125a0","Administrator","888888",2052); |
||||
|
var result = JObject.Parse(ret)["LoginResultType"].Value<int>(); |
||||
|
// 登陆成功 |
||||
|
if (result == 1) |
||||
|
{ |
||||
|
client.Draft("BD_Department","{\"Creator\":\"\",\"NeedUpDateFields\":[],\"NeedReturnFields\":[],\"IsDeleteEntry\":\"True\",\"SubSystemId\":\"\",\"IsVerifyBaseDataField\":\"false\",\"IsEntryBatchFill\":\"True\",\"ValidateFlag\":\"True\",\"NumberSearch\":\"True\",\"InterationFlags\":\"\",\"Model\":{\"FDEPTID\":\"0\",\"FCreateOrgId\":{\"FNumber\":\"\"},\"FNumber\":\"\",\"FUseOrgId\":{\"FNumber\":\"\"},\"FName\":\"\",\"FHelpCode\":\"\",\"FParentID\":{\"FNumber\":\"\"},\"FFullName\":\"\",\"FEffectDate\":\"1900-01-01\",\"FLapseDate\":\"1900-01-01\",\"FDeptProperty\":{\"FNumber\":\"\"},\"FDescription\":\"\",\"FGroup\":{\"FNumber\":\"\"},\"FIsCopyFlush\":\"false\",\"FSHRMapEntity\":{\"FMAPID\":\"0\"}}}"); |
||||
|
} |
||||
|
|
||||
|
五、字段说明: |
||||
|
WIP仓位:FWIPLocationID |
||||
|
WIP仓库:FWIPStockID |
||||
|
深度:FDepth |
||||
|
层级码:FLevelCode |
||||
|
车间:FIsStock |
||||
|
HR部门:FIsHRDept |
||||
|
禁用日期:FForbidDate |
||||
|
业务组织本部:FIsOrg |
||||
|
对应业务组织:FOrg |
||||
|
是否根节点:FIsRoot |
||||
|
名称:FSHRName |
||||
|
编码:FSHRNumber |
||||
|
所属ERP组织:FErpCode |
||||
|
状态:FSHRStatus |
||||
|
SHR内码:FShrId |
||||
|
部门分组:FGroup |
||||
|
部门属性:FDeptProperty |
||||
|
副产品倒冲:FIsCopyFlush |
||||
|
来源于s-HR:FIsSHR |
||||
|
使用组织:FUseOrgId (必填项) |
||||
|
创建组织:FCreateOrgId (必填项) |
||||
|
修改人:FModifierId |
||||
|
创建人:FCreatorId |
||||
|
描述:FDescription |
||||
|
禁用状态:FForbidStatus |
||||
|
数据状态:FDocumentStatus |
||||
|
编码:FNumber |
||||
|
名称:FName (必填项) |
||||
|
创建日期:FCreateDate |
||||
|
审核日期:FAuditDate |
||||
|
审核人:FAuditorID |
||||
|
禁用人:FForbidderID |
||||
|
上级部门:FParentID |
||||
|
失效日期:FLapseDate |
||||
|
助记码:FHelpCode |
||||
|
修改日期:FModifyDate |
||||
|
生效日期:FEffectDate |
||||
|
部门全称:FFullName |
@ -0,0 +1 @@ |
|||||
|
{\"Creator\":\"\",\"NeedUpDateFields\":[],\"NeedReturnFields\":[],\"IsDeleteEntry\":\"True\",\"SubSystemId\":\"\",\"IsVerifyBaseDataField\":\"false\",\"IsEntryBatchFill\":\"True\",\"ValidateFlag\":\"True\",\"NumberSearch\":\"True\",\"InterationFlags\":\"\",\"Model\":{\"FDEPTID\":0,\"FCreateOrgId\":{\"FNumber\":\"101\"},\"FUseOrgId\":{\"FNumber\":\"101\"},\"FName\":\"1212211212211212\",\"FParentID\":{\"FNumber\":\"05.01\"},\"FEffectDate\":\"2022-10-28 00:00:00\",\"FLapseDate\":\"9999-12-31 00:00:00\",\"FDeptProperty\":{\"FNumber\":\"DP02_SYS\"},\"FGroup\":{\"FNumber\":\"01\"},\"FIsCopyFlush\":false,\"FSHRMapEntity\":{}}} |
Binary file not shown.
@ -0,0 +1,44 @@ |
|||||
|
package com.yxt.anrui.fin.biz.kingdee.bdempinfo; |
||||
|
|
||||
|
import com.alibaba.fastjson.JSON; |
||||
|
import com.alibaba.fastjson.JSONObject; |
||||
|
import com.alibaba.fastjson.parser.Feature; |
||||
|
import com.yxt.anrui.fin.biz.kingdee.KingDeeUtils; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
|
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* 封装转换的类 |
||||
|
*/ |
||||
|
public class BDEmpinfoCastToKingDeeBillFields { |
||||
|
private static Logger log=LoggerFactory.getLogger(BDEmpinfoCastToKingDeeBillFields.class); |
||||
|
/** |
||||
|
* 构造金蝶需要的数据结构 并对字段赋值 |
||||
|
* |
||||
|
* @param map_fEntityModel_ |
||||
|
* @return |
||||
|
*/ |
||||
|
public static String getKingDeeData(Map<String,String> map_fEntityModel_ ){ |
||||
|
/** |
||||
|
* 取模板 |
||||
|
*/ |
||||
|
String readJsonFile = KingDeeUtils.readJsonFile("com/yxt/anrui/fin/biz/kingdee/bdempinfo/data.json"); |
||||
|
String fEntityData_ = KingDeeUtils.readJsonFile("com/yxt/anrui/fin/biz/kingdee/bdempinfo/data_data.json"); |
||||
|
String fEntityModel_ = KingDeeUtils.readJsonFile("com/yxt/anrui/fin/biz/kingdee/bdempinfo/data_model.json"); |
||||
|
log.info("readJsonFile:{}",readJsonFile); |
||||
|
log.info("fEntityData_:{}",fEntityData_); |
||||
|
log.info("fEntityModel_:{}",fEntityModel_); |
||||
|
|
||||
|
//模板字符创转json
|
||||
|
JSONObject jsonObj= JSONObject.parseObject(readJsonFile, Feature.OrderedField); |
||||
|
JSONObject jsonFEntityData_= JSONObject.parseObject(fEntityData_,Feature.OrderedField); |
||||
|
fEntityModel_ =KingDeeUtils.replaceTemplateParams(fEntityModel_, map_fEntityModel_); |
||||
|
JSONObject jsonFEntityModel_= JSONObject.parseObject(fEntityModel_,Feature.OrderedField); |
||||
|
|
||||
|
jsonFEntityData_.put("Model",JSONObject.parseObject(JSON.toJSONString(jsonFEntityModel_),Feature.OrderedField)); |
||||
|
jsonObj.put("data",jsonFEntityData_.toJSONString()); |
||||
|
return jsonObj.toJSONString(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,143 @@ |
|||||
|
package com.yxt.anrui.fin.biz.kingdee.bdempinfo; |
||||
|
|
||||
|
import com.alibaba.fastjson.JSONObject; |
||||
|
import com.yxt.anrui.fin.api.kingdee.KingDeeBillId; |
||||
|
import com.yxt.anrui.fin.api.kingdee.KingDeeBillUrl; |
||||
|
import com.yxt.anrui.fin.api.kingdee.bdempinfo.BDEmpinfo; |
||||
|
import com.yxt.anrui.fin.api.kingdee.bdempinfo.BDEmpinfo; |
||||
|
import com.yxt.anrui.fin.biz.kingdee.FinKingDeeService; |
||||
|
import com.yxt.anrui.fin.biz.kingdee.KingDeeConfig; |
||||
|
import com.yxt.common.core.result.ResultBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
|
||||
|
import java.util.ArrayList; |
||||
|
import java.util.List; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
@Service |
||||
|
public class BDEmpinfoService extends FinKingDeeService { |
||||
|
@Autowired |
||||
|
private KingDeeConfig kingDeeConfig; |
||||
|
/** |
||||
|
* 保存员工 |
||||
|
* @param BDEmpinfo |
||||
|
* @return |
||||
|
*/ |
||||
|
public ResultBean saveBDEmpinfo(BDEmpinfo BDEmpinfo) { |
||||
|
//BDEmpinfos=BDEmpinfos.createBDEmpinfos();
|
||||
|
ResultBean rb=ResultBean.fireFail(); |
||||
|
try { |
||||
|
//业务表的主表数据集合
|
||||
|
Map<String,String> map_fEntityModel_= object2Map(BDEmpinfo); |
||||
|
map_fEntityModel_.put("FID","0"); |
||||
|
map_fEntityModel_.put("IsDeleteEntry", "True"); |
||||
|
String kingDeeData = BDEmpinfoCastToKingDeeBillFields.getKingDeeData(map_fEntityModel_); |
||||
|
return addBDEmpinfo(kingDeeData,BDEmpinfo.getFNumber()); |
||||
|
} catch (Exception e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
return rb; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 批量修改 员工 |
||||
|
* @param BDEmpinfos |
||||
|
* @return |
||||
|
*/ |
||||
|
public ResultBean<String> updateBDEmpinfos(List<BDEmpinfo> BDEmpinfos) { |
||||
|
ResultBean rb=ResultBean.fireFail(); |
||||
|
List<String> list=new ArrayList<>(); |
||||
|
BDEmpinfos.forEach(o->{ |
||||
|
ResultBean<String> r = updateBDEmpinfo(o); |
||||
|
if(r.getSuccess()){ |
||||
|
list.add(r.getData()); |
||||
|
} |
||||
|
}); |
||||
|
return rb.success().setData(JSONObject.toJSONString(list)); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 修改员工 |
||||
|
* @param BDEmpinfo |
||||
|
* @return |
||||
|
*/ |
||||
|
public ResultBean<String> updateBDEmpinfo( BDEmpinfo BDEmpinfo) { |
||||
|
//BDEmpinfos=BDEmpinfos.createBDEmpinfos();
|
||||
|
ResultBean<String> rb=ResultBean.fireFail(); |
||||
|
try { |
||||
|
Map<String,String> map_fEntityModel_= object2Map(BDEmpinfo); |
||||
|
map_fEntityModel_.put("FID","0"); |
||||
|
map_fEntityModel_.put("IsDeleteEntry", "True"); |
||||
|
String kingDeeData = BDEmpinfoCastToKingDeeBillFields.getKingDeeData(map_fEntityModel_); |
||||
|
ResultBean<String> stringResultBean = viewGetId(KingDeeBillId.BD_Empinfo.getID(), BDEmpinfo.getFNumber()); |
||||
|
String id = stringResultBean.getData(); |
||||
|
if(!stringResultBean.getSuccess()&&"0".equals(id)){ |
||||
|
return addBDEmpinfo(kingDeeData,BDEmpinfo.getFNumber()); |
||||
|
} |
||||
|
//反审核
|
||||
|
boolean c = isAudit(KingDeeBillId.BD_Empinfo.getID(), "C", id); |
||||
|
//修改
|
||||
|
map_fEntityModel_.put("FID",id); |
||||
|
map_fEntityModel_.put("IsDeleteEntry", "False"); |
||||
|
kingDeeData = BDEmpinfoCastToKingDeeBillFields.getKingDeeData(map_fEntityModel_); |
||||
|
rb= accessKingDeeInterface(KingDeeBillId.BD_Empinfo.getID(), kingDeeData,KingDeeBillUrl.SAVE_URL.getURL()); |
||||
|
//提交审核
|
||||
|
ResultBean<String> resultBean2 = submitAndAudit(id); |
||||
|
return resultBean2; |
||||
|
} catch (Exception e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
return rb; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 新增 |
||||
|
* @param kingDeeData |
||||
|
* @return |
||||
|
*/ |
||||
|
private ResultBean<String> addBDEmpinfo(String kingDeeData,String FNumber){ |
||||
|
ResultBean<String> rb=ResultBean.fireFail(); |
||||
|
try{ |
||||
|
rb= accessKingDeeInterface(KingDeeBillId.BD_Empinfo.getID(), kingDeeData,KingDeeBillUrl.SAVE_URL.getURL()); |
||||
|
String s = draftResultGetId(rb.getData()); |
||||
|
return submitAndAudit(s); |
||||
|
}catch (Exception e){ |
||||
|
e.printStackTrace(); |
||||
|
return rb.setMsg("员工新增失败"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 提交审核员工 |
||||
|
* @param id |
||||
|
* @return |
||||
|
*/ |
||||
|
private ResultBean<String> submitAndAudit( String id){ |
||||
|
ResultBean<String> rb=ResultBean.fireFail(); |
||||
|
try{ |
||||
|
String submitKDTempJson = getSubmitKDTempJson(KingDeeBillId.BD_Empinfo.getID(),id ); |
||||
|
ResultBean<String> resultBean1 = accessKingDeeInterface(KingDeeBillId.BD_Empinfo.getID(), submitKDTempJson, |
||||
|
KingDeeBillUrl.SUBMIT_URL.getURL()); |
||||
|
if(!resultBean1.getSuccess()){ |
||||
|
log.info("员工提交失败!"); |
||||
|
return rb.setMsg("员工提交失败!"); |
||||
|
} |
||||
|
log.info("员工提交成功!"); |
||||
|
String auditKDTempJson = getAuditKDTempJson(KingDeeBillId.BD_Empinfo.getID(), id); |
||||
|
ResultBean<String> resultBean2 = |
||||
|
accessKingDeeInterface(KingDeeBillId.BD_Empinfo.getID(), auditKDTempJson, |
||||
|
KingDeeBillUrl.AUDIT_URL.getURL()); |
||||
|
if(!resultBean2.getSuccess()){ |
||||
|
log.info("员工审核失败!"); |
||||
|
return rb.setMsg("员工审核失败!"); |
||||
|
} |
||||
|
log.info("员工审核成功!"); |
||||
|
return resultBean2; |
||||
|
} catch (Exception e){ |
||||
|
e.printStackTrace(); |
||||
|
return rb.setMsg("员工提交审核失败"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
@ -0,0 +1,4 @@ |
|||||
|
{ |
||||
|
"formId": "BD_Empinfo", |
||||
|
"data": "@KD_data" |
||||
|
} |
@ -0,0 +1,13 @@ |
|||||
|
{ |
||||
|
"Creator": "", |
||||
|
"NeedUpDateFields": [], |
||||
|
"NeedReturnFields": [], |
||||
|
"IsDeleteEntry": "True", |
||||
|
"SubSystemId": "", |
||||
|
"IsVerifyBaseDataField": "false", |
||||
|
"IsEntryBatchFill": "True", |
||||
|
"ValidateFlag": "True", |
||||
|
"NumberSearch": "True", |
||||
|
"InterationFlags": "", |
||||
|
"Model": {} |
||||
|
} |
@ -0,0 +1,13 @@ |
|||||
|
{ |
||||
|
"FID": @KD_FID, |
||||
|
"FName": "@KD_FNAME", |
||||
|
"FMobile": "@KD_FMobile", |
||||
|
"FAddress": "@KD_FAddress", |
||||
|
"FUseOrgId": { |
||||
|
"FNumber": "@KD_FUseOrgId" |
||||
|
}, |
||||
|
"FCreateOrgId": { |
||||
|
"FNumber": "@KD_FCreateOrgId" |
||||
|
}, |
||||
|
"FSHRMapEntity": {} |
||||
|
} |
@ -0,0 +1,87 @@ |
|||||
|
一、请求参数说明: |
||||
|
1.formid:业务对象表单Id,字符串类型(必录) |
||||
|
2.data:Json格式数据(详情参考Json格式数据)(必录) |
||||
|
2.1.Creator:创建者内码(非必录) |
||||
|
2.2.NeedUpDateFields:需要更新的字段,数组类型,格式:[key1,key2,...](非必录),注(更新单据体字段得加上单据体key) |
||||
|
2.3.NeedReturnFields:需返回结果的字段集合,数组类型,格式:[key,entitykey.key,...](非必录),注(返回单据体字段格式:entitykey.key) |
||||
|
2.4.IsDeleteEntry:是否删除已存在的分录,布尔类型,默认true(非必录) |
||||
|
2.5.SubSystemId:表单所在的子系统内码,字符串类型(非必录) |
||||
|
2.6.IsVerifyBaseDataField:是否验证所有的基础资料有效性,布尔类,默认false(非必录) |
||||
|
2.7.IsEntryBatchFill:是否批量填充分录,默认true(非必录) |
||||
|
2.8.ValidateFlag:是否验证标志,布尔类型,默认true(非必录) |
||||
|
2.9.NumberSearch:是否用编码搜索基础资料,布尔类型,默认true(非必录) |
||||
|
2.10.InterationFlags:交互标志集合,字符串类型,分号分隔,格式:"flag1;flag2;..."(非必录),例如(允许负库存标识:STK_InvCheckResult) |
||||
|
2.11.Model:表单数据包,Json类型(必录) |
||||
|
|
||||
|
二、Json格式数据: |
||||
|
{\"Creator\":\"\",\"NeedUpDateFields\":[],\"NeedReturnFields\":[],\"IsDeleteEntry\":\"True\",\"SubSystemId\":\"\",\"IsVerifyBaseDataField\":\"false\",\"IsEntryBatchFill\":\"True\",\"ValidateFlag\":\"True\",\"NumberSearch\":\"True\",\"InterationFlags\":\"\",\"Model\":{\"FID\":\"0\",\"FName\":\"\",\"FStaffNumber\":\"\",\"FMobile\":\"\",\"FTel\":\"\",\"FEmail\":\"\",\"FDescription\":\"\",\"FAddress\":\"\",\"FUseOrgId\":{\"FNumber\":\"\"},\"FCreateOrgId\":{\"FNumber\":\"\"},\"FSHRMapEntity\":{\"FMAPID\":\"0\"},\"FPostEntity\":[{\"FENTRYID\":\"0\",\"FWorkOrgId\":{\"FNumber\":\"\"},\"FPostDept\":{\"FNumber\":\"\"},\"FPost\":{\"FNumber\":\"\"},\"FStaffStartDate\":\"1900-01-01\",\"FIsFirstPost\":\"false\"}],\"FBankInfo\":[{\"FBankId\":\"0\",\"FBankCountry\":{\"FNumber\":\"\"},\"FOpenBankName\":\"\",\"FBankCode\":\"\",\"FBankHolder\":\"\",\"FBankTypeRec\":{\"FNUMBER\":\"\"},\"FTextBankDetail\":\"\",\"FOpenAddressRec\":\"\",\"FCNAPS\":\"\",\"FBankCurrencyId\":{\"FNUMBER\":\"\"},\"FBankIsDefault\":\"false\",\"FBankDesc\":\"\"}]}} |
||||
|
|
||||
|
三、返回参数: |
||||
|
{\"Result\":{\"ResponseStatus\":{\"ErrorCode\":\"\",\"IsSuccess\":\"false\",\"Errors\":[{\"FieldName\":\"\",\"Message\":\"\",\"DIndex\":0}],\"SuccessEntitys\":[{\"Id\":\"\",\"Number\":\"\",\"DIndex\":0}],\"SuccessMessages\":[{\"FieldName\":\"\",\"Message\":\"\",\"DIndex\":0}]},\"Id\":\"\",\"NeedReturnData\":[{}]}} |
||||
|
|
||||
|
四、代码示例: |
||||
|
// 使用webapi引用组件Kingdee.BOS.WebApi.Client.dll |
||||
|
K3CloudApiClient client = new K3CloudApiClient("http://121.36.43.55/k3cloud/"); |
||||
|
var ret = client.ValidateLogin("61dce6601125a0","Administrator","888888",2052); |
||||
|
var result = JObject.Parse(ret)["LoginResultType"].Value<int>(); |
||||
|
// 登陆成功 |
||||
|
if (result == 1) |
||||
|
{ |
||||
|
client.Draft("BD_Empinfo","{\"Creator\":\"\",\"NeedUpDateFields\":[],\"NeedReturnFields\":[],\"IsDeleteEntry\":\"True\",\"SubSystemId\":\"\",\"IsVerifyBaseDataField\":\"false\",\"IsEntryBatchFill\":\"True\",\"ValidateFlag\":\"True\",\"NumberSearch\":\"True\",\"InterationFlags\":\"\",\"Model\":{\"FID\":\"0\",\"FName\":\"\",\"FStaffNumber\":\"\",\"FMobile\":\"\",\"FTel\":\"\",\"FEmail\":\"\",\"FDescription\":\"\",\"FAddress\":\"\",\"FUseOrgId\":{\"FNumber\":\"\"},\"FCreateOrgId\":{\"FNumber\":\"\"},\"FSHRMapEntity\":{\"FMAPID\":\"0\"},\"FPostEntity\":[{\"FENTRYID\":\"0\",\"FWorkOrgId\":{\"FNumber\":\"\"},\"FPostDept\":{\"FNumber\":\"\"},\"FPost\":{\"FNumber\":\"\"},\"FStaffStartDate\":\"1900-01-01\",\"FIsFirstPost\":\"false\"}],\"FBankInfo\":[{\"FBankId\":\"0\",\"FBankCountry\":{\"FNumber\":\"\"},\"FOpenBankName\":\"\",\"FBankCode\":\"\",\"FBankHolder\":\"\",\"FBankTypeRec\":{\"FNUMBER\":\"\"},\"FTextBankDetail\":\"\",\"FOpenAddressRec\":\"\",\"FCNAPS\":\"\",\"FBankCurrencyId\":{\"FNUMBER\":\"\"},\"FBankIsDefault\":\"false\",\"FBankDesc\":\"\"}]}}"); |
||||
|
} |
||||
|
|
||||
|
五、字段说明: |
||||
|
员工任岗ID:FStaffDetails |
||||
|
部门全称:FBaseProperty3 |
||||
|
禁用状态:FStaffForbidStatus |
||||
|
编码:FSHRNumber |
||||
|
工作组织:FWorkOrgId (必填项) |
||||
|
是否主任岗:FIsFirstPost |
||||
|
数据状态:FStaffDocumentStatus |
||||
|
来源于s-HR:FIsSHR |
||||
|
任岗状态:FBaseProperty9 |
||||
|
主任岗开始日期:FBaseProperty1 |
||||
|
所属部门:FPostDept (必填项) |
||||
|
任岗开始日期:FStaffStartDate |
||||
|
就任岗位:FPost (必填项) |
||||
|
SHR内码:FShrId |
||||
|
开户行地址:FOpenAddressRec |
||||
|
描述:FBankDesc |
||||
|
默认:FBankIsDefault |
||||
|
选择银行网点:FTextBankDetail |
||||
|
收款银行:FBankTypeRec |
||||
|
联行号:FCNAPS |
||||
|
币别:FBankCurrencyId |
||||
|
国家:FBankCountry |
||||
|
状态:FSHRStatus |
||||
|
名称:FSHRName |
||||
|
账户名称:FBankHolder |
||||
|
银行账号:FBankCode |
||||
|
开户银行:FOpenBankName |
||||
|
创建日期:FCreateDate |
||||
|
修改人:FModifierId |
||||
|
创建人:FCreatorId |
||||
|
禁用人:FForbidderId |
||||
|
禁用日期:FForbidDate |
||||
|
修改日期:FModifyDate |
||||
|
使用组织:FUseOrgId (必填项) |
||||
|
员工姓名:FName (必填项) |
||||
|
禁用状态:FForbidStatus |
||||
|
数据状态:FDocumentStatus |
||||
|
创建组织:FCreateOrgId (必填项) |
||||
|
描述:FDescription |
||||
|
编码:FNumber |
||||
|
员工编号:FStaffNumber |
||||
|
人员:FPersonID |
||||
|
主任职职员信息:FStaffId |
||||
|
固定电话:FTel |
||||
|
主任岗岗位:FBaseProperty |
||||
|
主证件内码:FFirstCardID |
||||
|
员工姓名:FBaseProperty8 |
||||
|
电子邮箱:FEmail |
||||
|
审核日期:FAuditDate |
||||
|
审核人:FAuditorID |
||||
|
照片:FPhoto |
||||
|
移动电话:FMobile |
||||
|
联系地址:FAddress |
||||
|
HR员工:FIsHR |
@ -0,0 +1 @@ |
|||||
|
{\"Creator\":\"\",\"NeedUpDateFields\":[],\"NeedReturnFields\":[],\"IsDeleteEntry\":\"True\",\"SubSystemId\":\"\",\"IsVerifyBaseDataField\":\"false\",\"IsEntryBatchFill\":\"True\",\"ValidateFlag\":\"True\",\"NumberSearch\":\"True\",\"InterationFlags\":\"\",\"Model\":{\"FID\":0,\"FName\":\"员工姓名1\",\"FMobile\":\"15097329653\",\"FAddress\":\"联系地址联系地址联系地址联系地址\",\"FUseOrgId\":{\"FNumber\":\"101\"},\"FCreateOrgId\":{\"FNumber\":\"101\"},\"FSHRMapEntity\":{}}} |
Binary file not shown.
Loading…
Reference in new issue