Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
Y
yifu-mvp
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fangxinjiang
yifu-mvp
Commits
21be7ae8
Commit
21be7ae8
authored
Sep 22, 2025
by
fangxinjiang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
企微智能表格相关-fxj
parent
3828d26b
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
1846 additions
and
0 deletions
+1846
-0
EkpAlertTableController.java
...cloud/plus/v1/ekp/controller/EkpAlertTableController.java
+6
-0
EkpAlertTableService.java
.../yifu/cloud/plus/v1/ekp/service/EkpAlertTableService.java
+2
-0
EkpAlertTableServiceImpl.java
...ud/plus/v1/ekp/service/impl/EkpAlertTableServiceImpl.java
+35
-0
FieldInfo.java
.../main/java/com/yifu/cloud/plus/v1/ekp/util/FieldInfo.java
+25
-0
SmartSheetDebugService.java
...m/yifu/cloud/plus/v1/ekp/util/SmartSheetDebugService.java
+139
-0
WeComSheetFieldFetcher.java
...m/yifu/cloud/plus/v1/ekp/util/WeComSheetFieldFetcher.java
+171
-0
WeComSheetIdFetcher.java
.../com/yifu/cloud/plus/v1/ekp/util/WeComSheetIdFetcher.java
+211
-0
WeComSmartSheetDataInserter.java
...u/cloud/plus/v1/ekp/util/WeComSmartSheetDataInserter.java
+194
-0
WeComSmartSheetDebugger.java
.../yifu/cloud/plus/v1/ekp/util/WeComSmartSheetDebugger.java
+407
-0
WeComSmartSheetManager.java
...m/yifu/cloud/plus/v1/ekp/util/WeComSmartSheetManager.java
+656
-0
No files found.
yifu-ekp/yifu-ekp-biz/src/main/java/com/yifu/cloud/plus/v1/ekp/controller/EkpAlertTableController.java
View file @
21be7ae8
...
...
@@ -70,4 +70,10 @@ public class EkpAlertTableController {
ekpAlertTableService
.
pushBudgetAlertInfoTomanager
(
0
);
}
@PostMapping
(
"/tesxWxExcelApi"
)
public
void
tesxWxExcelApi
()
{
ekpAlertTableService
.
tesxWxExcelApi
();
}
}
yifu-ekp/yifu-ekp-biz/src/main/java/com/yifu/cloud/plus/v1/ekp/service/EkpAlertTableService.java
View file @
21be7ae8
...
...
@@ -30,4 +30,6 @@ public interface EkpAlertTableService extends IService<EkpAlertTable> {
void
pushBudgetAlertInfoTomanager
(
int
type
);
void
tesxWxExcelApi
();
}
yifu-ekp/yifu-ekp-biz/src/main/java/com/yifu/cloud/plus/v1/ekp/service/impl/EkpAlertTableServiceImpl.java
View file @
21be7ae8
...
...
@@ -23,6 +23,8 @@ import com.yifu.cloud.plus.v1.ekp.entity.EkpBudgetWarningInfo;
import
com.yifu.cloud.plus.v1.ekp.mapper.EkpAlertTableMapper
;
import
com.yifu.cloud.plus.v1.ekp.mapper.EkpBudgetWarningInfoMapper
;
import
com.yifu.cloud.plus.v1.ekp.service.EkpAlertTableService
;
import
com.yifu.cloud.plus.v1.ekp.util.SmartSheetDebugService
;
import
com.yifu.cloud.plus.v1.ekp.util.WeComSmartSheetManager
;
import
com.yifu.cloud.plus.v1.ekp.vo.BudgetWarningVo
;
import
com.yifu.cloud.plus.v1.yifu.admin.api.entity.SysUser
;
import
com.yifu.cloud.plus.v1.yifu.admin.api.vo.SysUserListVo
;
...
...
@@ -57,6 +59,15 @@ public class EkpAlertTableServiceImpl extends ServiceImpl<EkpAlertTableMapper, E
@Autowired
private
EkpBudgetWarningInfoMapper
warningInfoMapper
;
@Autowired
private
WeComSmartSheetManager
smartSheetManager
;
@Autowired
private
SmartSheetDebugService
debugService
;
/**
...
...
@@ -243,6 +254,7 @@ public class EkpAlertTableServiceImpl extends ServiceImpl<EkpAlertTableMapper, E
log
.
error
(
"执行预算预警任务时发生异常:"
,
e
);
}
}
/**
* @param config 预警配置
* @return 是否超额
...
...
@@ -296,4 +308,27 @@ public class EkpAlertTableServiceImpl extends ServiceImpl<EkpAlertTableMapper, E
}
return
false
;
}
@Override
public
void
tesxWxExcelApi
()
{
/*RestTemplate restTemplate = new RestTemplate();
String accessToken = wxConfig.getAccessToken(restTemplate);
Map<String, Object> requestBody = new HashMap<>();
//requestBody.put("spaceid", ""); // 非必填,空间spaceid。若指定spaceid,则fatherid也要同时指定
//requestBody.put("fatherid", "Sheet1"); // 非必填,父目录fileid, 在根目录时为空间spaceid
requestBody.put("doc_type", 10); // 文档类型, 3:文档 4:表格 10:智能表格
requestBody.put("doc_name", "发票基础信息"); // 文档名字(注意:文件名最多填255个字符, 超过255个字符会被截断)
requestBody.put("admin_users", new String[]{"FeiTaiLang_Fang"}); // 非必填,文档管理员userid
// 发送POST请求(示例使用Spring的RestTemplate)
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers);
restTemplate = new RestTemplate();
String createDocUrl = "https://qyapi.weixin.qq.com/cgi-bin/wedoc/create_doc?access_token="+accessToken;
ResponseEntity<String> response = restTemplate.postForEntity(createDocUrl,requestEntity, String.class);*/
//smartSheetManager.test(wxConfig);
debugService
.
debugInsertIssue
(
wxConfig
);
}
}
yifu-ekp/yifu-ekp-biz/src/main/java/com/yifu/cloud/plus/v1/ekp/util/FieldInfo.java
0 → 100644
View file @
21be7ae8
package
com
.
yifu
.
cloud
.
plus
.
v1
.
ekp
.
util
;
import
lombok.Data
;
/**
* @Author fxj
* @Date 2025/9/18
* @Description
* @Version 1.0
*/
@Data
public
class
FieldInfo
{
private
String
fieldId
;
private
String
title
;
private
String
type
;
@Override
public
String
toString
()
{
return
"FieldInfo{"
+
"fieldId='"
+
fieldId
+
'\''
+
", title='"
+
title
+
'\''
+
", type='"
+
type
+
'\''
+
'}'
;
}
}
yifu-ekp/yifu-ekp-biz/src/main/java/com/yifu/cloud/plus/v1/ekp/util/SmartSheetDebugService.java
0 → 100644
View file @
21be7ae8
package
com
.
yifu
.
cloud
.
plus
.
v1
.
ekp
.
util
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
com.yifu.cloud.plus.v1.ekp.config.WxConfig
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* @Author fxj
* @Date 2025/9/18
* @Description
* @Version 1.0
*/
@Service
public
class
SmartSheetDebugService
{
@Autowired
private
WeComSmartSheetDebugger
debugger
;
/**
* 调试企业微信智能表格记录添加问题
*
*/
public
void
debugInsertIssue
(
WxConfig
wxConfig
)
{
String
corpId
=
"wwbcb090af0dfe50e5"
;
String
corpSecret
=
"16kqEL_eU-ARwYyqLgEBWHgxm8gXVnkzv_eJMLy9Np"
;
String
docId
=
"dcTSMCj4lWV9MEP7lquZacOY8WS4g-iHxP_jVYA02tdYwb2YYc3BpDR8NrFWkEngHUg8abET4eTIpo9Zv-571NEA"
;
String
sheetId
=
"q979lj"
;
System
.
out
.
println
(
"=== 开始调试企业微信智能表格记录添加问题 ==="
);
// 1. 获取并打印表格字段信息
System
.
out
.
println
(
"=== 表格字段信息 ==="
);
List
<
WeComSmartSheetDebugger
.
FieldInfo
>
fields
=
debugger
.
getSheetFields
(
wxConfig
,
corpId
,
corpSecret
,
docId
,
sheetId
);
if
(
fields
.
isEmpty
())
{
System
.
out
.
println
(
"未能获取到表格字段信息,请检查参数是否正确"
);
return
;
}
for
(
WeComSmartSheetDebugger
.
FieldInfo
field
:
fields
)
{
System
.
out
.
println
(
"字段ID: "
+
field
.
getFieldId
()
+
", 字段标题: '"
+
field
.
getTitle
()
+
"'"
+
", 字段类型: "
+
field
.
getType
());
}
// 创建数据
List
<
Map
<
String
,
Object
>>
records
=
new
ArrayList
<>();
// 第一条记录
Map
<
String
,
Object
>
record1
=
new
HashMap
<>();
record1
.
put
(
"姓名"
,
"文本内容1"
);
record1
.
put
(
"部门"
,
"文本内容2"
);
record1
.
put
(
"年龄"
,
"文本内容3"
);
records
.
add
(
record1
);
// 第二条记录
Map
<
String
,
Object
>
record2
=
new
HashMap
<>();
record2
.
put
(
"姓名"
,
"文本内容1"
);
record2
.
put
(
"部门"
,
"文本内容2"
);
record2
.
put
(
"年龄"
,
"文本内容3"
);
records
.
add
(
record2
);
/* // 2. 准备要插入的数据(示例数据,请根据实际情况修改)
List<Map<String, String>> records = new ArrayList<>();
Map<String, Object> record = new HashMap<>();
Map<String, Object> values = new HashMap<>();
List<Map<String, String>> fieldContent = new ArrayList<>();
Map<String, String> textContent = new HashMap<>();
textContent.put("type", "text");
textContent.put("text", "张三");
fieldContent.add(textContent);
textContent = new HashMap<>();
textContent.put("type", "text");
textContent.put("text", "李四");
fieldContent.add(textContent);
// 注意:这里的字段名称必须与表格中的完全一致(包括大小写和空格)
values.put("姓名", fieldContent);
fieldContent = new ArrayList<>();
record = new HashMap<>();
values = new HashMap<>();
textContent = new HashMap<>();
textContent.put("type", "text");
textContent.put("text", "技术部");
fieldContent.add(textContent);
textContent = new HashMap<>();
textContent.put("type", "text");
textContent.put("text", "产品部");
fieldContent.add(textContent);
values.put("部门", fieldContent);
record.put("values", values);
records.add(record);*/
/*fieldContent = new ArrayList<>();
record = new HashMap<>();
values = new HashMap<>();
textContent = new HashMap<>();
textContent.put("type", "text");
textContent.put("text", "技术部");
fieldContent.add(textContent);
textContent = new HashMap<>();
textContent.put("type", "text");
textContent.put("text", "产品部");
fieldContent.add(textContent);
values.put("部门", fieldContent);
record.put("values", values);
records.add(record);*/
// 3. 验证字段匹配性
System
.
out
.
println
(
"\n=== 字段匹配性验证 ==="
);
List
<
String
>
mismatches
=
debugger
.
validateFields
(
wxConfig
,
corpId
,
corpSecret
,
docId
,
sheetId
,
records
);
if
(
mismatches
.
isEmpty
())
{
System
.
out
.
println
(
"所有字段都匹配"
);
}
else
{
System
.
out
.
println
(
"以下字段不匹配:"
);
for
(
String
mismatch
:
mismatches
)
{
System
.
out
.
println
(
"- "
+
mismatch
);
}
System
.
out
.
println
(
"请根据以上信息修正数据后重试"
);
return
;
}
// 4. 测试插入数据并查看详细响应
System
.
out
.
println
(
"\n=== 测试数据插入 ==="
);
String
response
=
debugger
.
testInsertData
(
wxConfig
,
corpId
,
corpSecret
,
docId
,
sheetId
,
records
);
System
.
out
.
println
(
"API响应: "
+
response
);
System
.
out
.
println
(
"\n=== 调试完成 ==="
);
}
}
\ No newline at end of file
yifu-ekp/yifu-ekp-biz/src/main/java/com/yifu/cloud/plus/v1/ekp/util/WeComSheetFieldFetcher.java
0 → 100644
View file @
21be7ae8
package
com
.
yifu
.
cloud
.
plus
.
v1
.
ekp
.
util
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
org.springframework.http.*
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.client.RestTemplate
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* 企业微信智能表格字段信息获取工具类
* 用于获取智能表格的字段信息,帮助诊断"字段不存在"错误
*/
@Component
public
class
WeComSheetFieldFetcher
{
/**
* 企业微信API基础URL
*/
private
static
final
String
WE_COM_API_BASE_URL
=
"https://qyapi.weixin.qq.com/cgi-bin"
;
/**
* 获取access_token的接口路径
*/
private
static
final
String
GET_TOKEN_PATH
=
"/gettoken"
;
/**
* 获取智能表格字段信息的接口路径
*/
private
static
final
String
GET_FIELDS_PATH
=
"/wedoc/smartsheet/get_fields"
;
/**
* 获取智能表格字段信息
*
* @param corpId 企业ID
* @param corpSecret 应用的密钥
* @param docId 文档ID
* @param sheetId 工作表ID
* @return 字段信息列表
*/
public
List
<
FieldInfo
>
getSheetFields
(
String
corpId
,
String
corpSecret
,
String
docId
,
String
sheetId
)
{
List
<
FieldInfo
>
fieldInfos
=
new
ArrayList
<>();
try
{
// 1. 获取access_token
String
accessToken
=
getAccessToken
(
corpId
,
corpSecret
);
if
(
accessToken
==
null
||
accessToken
.
isEmpty
())
{
System
.
err
.
println
(
"获取access_token失败"
);
return
fieldInfos
;
}
// 2. 获取字段信息
fieldInfos
=
fetchFields
(
accessToken
,
docId
,
sheetId
);
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"获取表格字段信息时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
fieldInfos
;
}
/**
* 获取企业微信access_token
*
* @param corpId 企业ID
* @param corpSecret 应用密钥
* @return access_token
*/
private
String
getAccessToken
(
String
corpId
,
String
corpSecret
)
{
try
{
String
url
=
WE_COM_API_BASE_URL
+
GET_TOKEN_PATH
+
"?corpid="
+
corpId
+
"&corpsecret="
+
corpSecret
;
RestTemplate
restTemplate
=
new
RestTemplate
();
ResponseEntity
<
String
>
response
=
restTemplate
.
getForEntity
(
url
,
String
.
class
);
if
(
response
.
getStatusCode
()
==
HttpStatus
.
OK
)
{
JSONObject
jsonObject
=
JSON
.
parseObject
(
response
.
getBody
());
if
(
jsonObject
.
getInteger
(
"errcode"
)
==
0
)
{
return
jsonObject
.
getString
(
"access_token"
);
}
else
{
System
.
err
.
println
(
"获取access_token失败,错误代码:"
+
jsonObject
.
getInteger
(
"errcode"
)
+
",错误信息:"
+
jsonObject
.
getString
(
"errmsg"
));
return
null
;
}
}
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"获取access_token时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
null
;
}
/**
* 获取字段信息
*
* @param accessToken 访问令牌
* @param docId 文档ID
* @param sheetId 工作表ID
* @return 字段信息列表
*/
private
List
<
FieldInfo
>
fetchFields
(
String
accessToken
,
String
docId
,
String
sheetId
)
{
List
<
FieldInfo
>
fieldInfos
=
new
ArrayList
<>();
try
{
String
url
=
WE_COM_API_BASE_URL
+
GET_FIELDS_PATH
+
"?access_token="
+
accessToken
;
RestTemplate
restTemplate
=
new
RestTemplate
();
// 构造请求体
JSONObject
requestBody
=
new
JSONObject
();
requestBody
.
put
(
"docid"
,
docId
);
requestBody
.
put
(
"sheet_id"
,
sheetId
);
HttpHeaders
headers
=
new
HttpHeaders
();
headers
.
setContentType
(
MediaType
.
APPLICATION_JSON
);
HttpEntity
<
String
>
request
=
new
HttpEntity
<>(
requestBody
.
toJSONString
(),
headers
);
ResponseEntity
<
String
>
response
=
restTemplate
.
postForEntity
(
url
,
request
,
String
.
class
);
if
(
response
.
getStatusCode
()
==
HttpStatus
.
OK
)
{
JSONObject
jsonObject
=
JSON
.
parseObject
(
response
.
getBody
());
if
(
jsonObject
.
getInteger
(
"errcode"
)
==
0
)
{
JSONArray
fields
=
jsonObject
.
getJSONArray
(
"fields"
);
if
(
fields
!=
null
&&
!
fields
.
isEmpty
())
{
for
(
int
i
=
0
;
i
<
fields
.
size
();
i
++)
{
JSONObject
field
=
fields
.
getJSONObject
(
i
);
FieldInfo
fieldInfo
=
new
FieldInfo
();
fieldInfo
.
setFieldId
(
field
.
getString
(
"field_id"
));
fieldInfo
.
setTitle
(
field
.
getString
(
"title"
));
fieldInfo
.
setType
(
field
.
getString
(
"type"
));
fieldInfos
.
add
(
fieldInfo
);
}
}
}
else
{
System
.
err
.
println
(
"获取字段信息失败,错误代码:"
+
jsonObject
.
getInteger
(
"errcode"
)
+
",错误信息:"
+
jsonObject
.
getString
(
"errmsg"
));
}
}
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"获取字段信息时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
fieldInfos
;
}
/**
* 使用示例
*
* @param args 命令行参数
*/
public
static
void
main
(
String
[]
args
)
{
WeComSheetFieldFetcher
fetcher
=
new
WeComSheetFieldFetcher
();
// 示例数据
String
corpId
=
"your_corp_id"
;
String
corpSecret
=
"your_corp_secret"
;
String
docId
=
"your_doc_id"
;
String
sheetId
=
"your_sheet_id"
;
// 获取字段信息列表
List
<
FieldInfo
>
fields
=
fetcher
.
getSheetFields
(
corpId
,
corpSecret
,
docId
,
sheetId
);
System
.
out
.
println
(
"获取到的字段信息列表: "
+
fields
);
// 打印每个字段的详细信息
for
(
FieldInfo
field
:
fields
)
{
System
.
out
.
println
(
"字段ID: "
+
field
.
getFieldId
()
+
", 字段标题: "
+
field
.
getTitle
()
+
", 字段类型: "
+
field
.
getType
());
}
}
}
\ No newline at end of file
yifu-ekp/yifu-ekp-biz/src/main/java/com/yifu/cloud/plus/v1/ekp/util/WeComSheetIdFetcher.java
0 → 100644
View file @
21be7ae8
package
com
.
yifu
.
cloud
.
plus
.
v1
.
ekp
.
util
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
com.yifu.cloud.plus.v1.ekp.config.WxConfig
;
import
lombok.Data
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.*
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.client.RestTemplate
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* 企业微信智能表格SheetId获取工具类
* 用于通过文档ID获取表格ID
*/
@Data
@Component
public
class
WeComSheetIdFetcher
{
/**
* 企业微信API基础URL
*/
private
static
final
String
WE_COM_API_BASE_URL
=
"https://qyapi.weixin.qq.com/cgi-bin"
;
/**
* 获取access_token的接口路径
*/
private
static
final
String
GET_TOKEN_PATH
=
"/gettoken"
;
/**
* 查询子表的接口路径
*/
private
static
final
String
GET_SHEET_PATH
=
"/wedoc/smartsheet/get_sheet"
;
/**
* 通过文档ID获取表格ID列表
*
* @param docId 文档ID
* @return 表格ID列表
*/
public
List
<
String
>
getSheetIds
(
WxConfig
wxConfig
,
String
docId
)
{
List
<
String
>
sheetIds
=
new
ArrayList
<>();
try
{
RestTemplate
restTemplate
=
new
RestTemplate
();
// 1. 获取access_token
String
accessToken
=
wxConfig
.
getAccessToken
(
restTemplate
);
//getAccessToken(corpId, corpSecret);
if
(
accessToken
==
null
||
accessToken
.
isEmpty
())
{
System
.
err
.
println
(
"获取access_token失败"
);
return
sheetIds
;
}
// 2. 查询子表信息
List
<
SheetInfo
>
sheetInfos
=
getSheetInfo
(
accessToken
,
docId
);
for
(
SheetInfo
sheetInfo
:
sheetInfos
)
{
// 只返回智能表类型的sheet_id
if
(
"smartsheet"
.
equals
(
sheetInfo
.
getType
()))
{
sheetIds
.
add
(
sheetInfo
.
getSheetId
());
}
}
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"获取表格ID时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
sheetIds
;
}
/**
* 获取企业微信access_token
*
* @param corpId 企业ID
* @param corpSecret 应用密钥
* @return access_token
*/
private
String
getAccessToken
(
String
corpId
,
String
corpSecret
)
{
try
{
String
url
=
WE_COM_API_BASE_URL
+
GET_TOKEN_PATH
+
"?corpid="
+
corpId
+
"&corpsecret="
+
corpSecret
;
RestTemplate
restTemplate
=
new
RestTemplate
();
ResponseEntity
<
String
>
response
=
restTemplate
.
getForEntity
(
url
,
String
.
class
);
if
(
response
.
getStatusCode
()
==
HttpStatus
.
OK
)
{
JSONObject
jsonObject
=
JSON
.
parseObject
(
response
.
getBody
());
if
(
jsonObject
.
getInteger
(
"errcode"
)
==
0
)
{
return
jsonObject
.
getString
(
"access_token"
);
}
else
{
System
.
err
.
println
(
"获取access_token失败,错误代码:"
+
jsonObject
.
getInteger
(
"errcode"
)
+
",错误信息:"
+
jsonObject
.
getString
(
"errmsg"
));
return
null
;
}
}
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"获取access_token时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
null
;
}
/**
* 查询子表信息
*
* @param accessToken 访问令牌
* @param docId 文档ID
* @return 子表信息列表
*/
private
List
<
SheetInfo
>
getSheetInfo
(
String
accessToken
,
String
docId
)
{
List
<
SheetInfo
>
sheetInfos
=
new
ArrayList
<>();
try
{
String
url
=
WE_COM_API_BASE_URL
+
GET_SHEET_PATH
+
"?access_token="
+
accessToken
;
RestTemplate
restTemplate
=
new
RestTemplate
();
// 构造请求体
JSONObject
requestBody
=
new
JSONObject
();
requestBody
.
put
(
"docid"
,
docId
);
HttpHeaders
headers
=
new
HttpHeaders
();
headers
.
setContentType
(
MediaType
.
APPLICATION_JSON
);
HttpEntity
<
String
>
request
=
new
HttpEntity
<>(
requestBody
.
toJSONString
(),
headers
);
ResponseEntity
<
String
>
response
=
restTemplate
.
postForEntity
(
url
,
request
,
String
.
class
);
if
(
response
.
getStatusCode
()
==
HttpStatus
.
OK
)
{
JSONObject
jsonObject
=
JSON
.
parseObject
(
response
.
getBody
());
if
(
jsonObject
.
getInteger
(
"errcode"
)
==
0
)
{
JSONArray
sheets
=
jsonObject
.
getJSONArray
(
"sheet_list"
);
if
(
sheets
!=
null
&&
!
sheets
.
isEmpty
())
{
for
(
int
i
=
0
;
i
<
sheets
.
size
();
i
++)
{
JSONObject
sheet
=
sheets
.
getJSONObject
(
i
);
SheetInfo
sheetInfo
=
new
SheetInfo
();
sheetInfo
.
setSheetId
(
sheet
.
getString
(
"sheet_id"
));
sheetInfo
.
setTitle
(
sheet
.
getString
(
"title"
));
sheetInfo
.
setType
(
sheet
.
getString
(
"type"
));
sheetInfos
.
add
(
sheetInfo
);
}
}
}
else
{
System
.
err
.
println
(
"查询子表信息失败,错误代码:"
+
jsonObject
.
getInteger
(
"errcode"
)
+
",错误信息:"
+
jsonObject
.
getString
(
"errmsg"
));
}
}
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"查询子表信息时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
sheetInfos
;
}
/**
* 子表信息内部类
*/
public
static
class
SheetInfo
{
private
String
sheetId
;
private
String
title
;
private
String
type
;
// smartsheet: 智能表, dashboard: 仪表盘, external: 说明页
public
String
getSheetId
()
{
return
sheetId
;
}
public
void
setSheetId
(
String
sheetId
)
{
this
.
sheetId
=
sheetId
;
}
public
String
getTitle
()
{
return
title
;
}
public
void
setTitle
(
String
title
)
{
this
.
title
=
title
;
}
public
String
getType
()
{
return
type
;
}
public
void
setType
(
String
type
)
{
this
.
type
=
type
;
}
@Override
public
String
toString
()
{
return
"SheetInfo{"
+
"sheetId='"
+
sheetId
+
'\''
+
", title='"
+
title
+
'\''
+
", type='"
+
type
+
'\''
+
'}'
;
}
}
/**
* 使用示例
*
* @param args 命令行参数
*/
public
static
void
main
(
String
[]
args
)
{
WeComSheetIdFetcher
fetcher
=
new
WeComSheetIdFetcher
();
// 示例数据
String
corpId
=
"your_corp_id"
;
String
corpSecret
=
"your_corp_secret"
;
String
docId
=
"your_doc_id"
;
// 获取表格ID列表
/* List<String> sheetIds = fetcher.getSheetIds(docId);
System.out.println("获取到的表格ID列表: " + sheetIds);*/
}
}
\ No newline at end of file
yifu-ekp/yifu-ekp-biz/src/main/java/com/yifu/cloud/plus/v1/ekp/util/WeComSmartSheetDataInserter.java
0 → 100644
View file @
21be7ae8
package
com
.
yifu
.
cloud
.
plus
.
v1
.
ekp
.
util
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.yifu.cloud.plus.v1.ekp.config.WxConfig
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.*
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.LinkedMultiValueMap
;
import
org.springframework.util.MultiValueMap
;
import
org.springframework.web.client.RestTemplate
;
import
java.util.List
;
import
java.util.Map
;
/**
* 企业微信智能表格数据插入工具类
* 用于向已有的企业微信智能表格中插入数据
*/
@Component
public
class
WeComSmartSheetDataInserter
{
@Autowired
private
WxConfig
wxConfig
;
/**
* 企业微信API基础URL
*/
private
static
final
String
WE_COM_API_BASE_URL
=
"https://qyapi.weixin.qq.com/cgi-bin"
;
/**
* 获取access_token的接口路径
*/
private
static
final
String
GET_TOKEN_PATH
=
"/gettoken"
;
/**
* 智能表格添加记录的接口路径
*/
private
static
final
String
ADD_RECORDS_PATH
=
"/wedoc/smartsheet/add_records"
;
/**
* 向企业微信智能表格中插入数据
*
* @param docId 文档ID
* @param sheetId 表格ID
* @param records 要插入的记录列表
* @return 插入结果
*/
public
boolean
insertData
(
String
docId
,
String
sheetId
,
List
<
Map
<
String
,
Object
>>
records
)
{
try
{
RestTemplate
restTemplate
=
new
RestTemplate
();
// 1. 获取access_token
String
accessToken
=
wxConfig
.
getAccessToken
(
restTemplate
);
//getAccessToken(corpId, corpSecret);
if
(
accessToken
==
null
||
accessToken
.
isEmpty
())
{
System
.
err
.
println
(
"获取access_token失败"
);
return
false
;
}
// 2. 构造请求体
JSONObject
requestBody
=
new
JSONObject
();
requestBody
.
put
(
"docid"
,
docId
);
requestBody
.
put
(
"sheet_id"
,
sheetId
);
requestBody
.
put
(
"key_type"
,
"CELL_VALUE_KEY_TYPE_FIELD_TITLE"
);
// 构造records数组
new
com
.
alibaba
.
fastjson
.
JSONArray
();
requestBody
.
put
(
"records"
,
records
);
// 3. 发送请求插入数据
boolean
result
=
addRecords
(
accessToken
,
requestBody
);
if
(
result
)
{
System
.
out
.
println
(
"数据插入成功"
);
}
else
{
System
.
err
.
println
(
"数据插入失败"
);
}
return
result
;
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"插入数据时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
return
false
;
}
}
/**
* 获取企业微信access_token
*
* @param corpId 企业ID
* @param corpSecret 应用密钥
* @return access_token
*/
private
String
getAccessToken
(
String
corpId
,
String
corpSecret
)
{
try
{
String
url
=
WE_COM_API_BASE_URL
+
GET_TOKEN_PATH
+
"?corpid="
+
corpId
+
"&corpsecret="
+
corpSecret
;
RestTemplate
restTemplate
=
new
RestTemplate
();
ResponseEntity
<
String
>
response
=
restTemplate
.
getForEntity
(
url
,
String
.
class
);
if
(
response
.
getStatusCode
()
==
HttpStatus
.
OK
)
{
JSONObject
jsonObject
=
JSON
.
parseObject
(
response
.
getBody
());
if
(
jsonObject
.
getInteger
(
"errcode"
)
==
0
)
{
return
jsonObject
.
getString
(
"access_token"
);
}
else
{
System
.
err
.
println
(
"获取access_token失败,错误代码:"
+
jsonObject
.
getInteger
(
"errcode"
)
+
",错误信息:"
+
jsonObject
.
getString
(
"errmsg"
));
return
null
;
}
}
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"获取access_token时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
null
;
}
/**
* 向智能表格添加记录
*
* @param accessToken 访问令牌
* @param requestBody 请求体
* @return 是否成功
*/
private
boolean
addRecords
(
String
accessToken
,
JSONObject
requestBody
)
{
try
{
String
url
=
WE_COM_API_BASE_URL
+
ADD_RECORDS_PATH
+
"?access_token="
+
accessToken
;
RestTemplate
restTemplate
=
new
RestTemplate
();
HttpHeaders
headers
=
new
HttpHeaders
();
headers
.
setContentType
(
MediaType
.
APPLICATION_JSON
);
HttpEntity
<
String
>
request
=
new
HttpEntity
<>(
requestBody
.
toJSONString
(),
headers
);
ResponseEntity
<
String
>
response
=
restTemplate
.
postForEntity
(
url
,
request
,
String
.
class
);
if
(
response
.
getStatusCode
()
==
HttpStatus
.
OK
)
{
JSONObject
jsonObject
=
JSON
.
parseObject
(
response
.
getBody
());
if
(
jsonObject
.
getInteger
(
"errcode"
)
==
0
)
{
return
true
;
}
else
{
System
.
err
.
println
(
"添加记录失败,错误代码:"
+
jsonObject
.
getInteger
(
"errcode"
)
+
",错误信息:"
+
jsonObject
.
getString
(
"errmsg"
));
return
false
;
}
}
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"添加记录时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
false
;
}
/**
* 使用示例
*
* @param args 命令行参数
*/
public
static
void
main
(
String
[]
args
)
{
WeComSmartSheetDataInserter
inserter
=
new
WeComSmartSheetDataInserter
();
// 示例数据
String
corpId
=
"your_corp_id"
;
String
corpSecret
=
"your_corp_secret"
;
String
docId
=
"your_doc_id"
;
String
sheetId
=
"your_sheet_id"
;
// 构造要插入的数据
new
java
.
util
.
ArrayList
<
Map
<
String
,
Object
>>();
/*
// 示例记录
Map<String, Object> record1 = new HashMap<>();
Map<String, Object> values1 = new HashMap<>();
values1.put("姓名", "张三");
values1.put("年龄", 25);
values1.put("部门", "技术部");
record1.put("values", values1);
Map<String, Object> record2 = new HashMap<>();
Map<String, Object> values2 = new HashMap<>();
values2.put("姓名", "李四");
values2.put("年龄", 30);
values2.put("部门", "市场部");
record2.put("values", values2);
records.add(record1);
records.add(record2);
// 执行插入
boolean success = inserter.insertData(corpId, corpSecret, docId, sheetId, records);
if (success) {
System.out.println("数据插入成功");
} else {
System.out.println("数据插入失败");
}
*/
}
}
\ No newline at end of file
yifu-ekp/yifu-ekp-biz/src/main/java/com/yifu/cloud/plus/v1/ekp/util/WeComSmartSheetDebugger.java
0 → 100644
View file @
21be7ae8
package
com
.
yifu
.
cloud
.
plus
.
v1
.
ekp
.
util
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
com.yifu.cloud.plus.v1.ekp.config.WxConfig
;
import
org.springframework.http.*
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.client.RestTemplate
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* 企业微信智能表格调试工具类
* 用于诊断和解决企业微信智能表格记录添加后不显示的问题
*/
@Component
public
class
WeComSmartSheetDebugger
{
/**
* 企业微信API基础URL
*/
private
static
final
String
WE_COM_API_BASE_URL
=
"https://qyapi.weixin.qq.com/cgi-bin"
;
/**
* 获取access_token的接口路径
*/
private
static
final
String
GET_TOKEN_PATH
=
"/gettoken"
;
/**
* 获取智能表格字段信息的接口路径
*/
private
static
final
String
GET_FIELDS_PATH
=
"/wedoc/smartsheet/get_fields"
;
/**
* 添加记录的接口路径
*/
private
static
final
String
ADD_RECORDS_PATH
=
"/wedoc/smartsheet/add_records"
;
/**
* 查询记录的接口路径
*/
private
static
final
String
QUERY_RECORDS_PATH
=
"/wedoc/smartsheet/query_records"
;
/**
* 获取表格字段信息
*
* @param corpId 企业ID
* @param corpSecret 应用的密钥
* @param docId 文档ID
* @param sheetId 工作表ID
* @return 字段信息列表
*/
public
List
<
FieldInfo
>
getSheetFields
(
WxConfig
wxConfig
,
String
corpId
,
String
corpSecret
,
String
docId
,
String
sheetId
)
{
List
<
FieldInfo
>
fieldInfos
=
new
ArrayList
<>();
try
{
RestTemplate
restTemplate
=
new
RestTemplate
();
// 1. 获取access_token
String
accessToken
=
wxConfig
.
getAccessToken
(
restTemplate
);
//getAccessToken(corpId, corpSecret);
if
(
accessToken
==
null
||
accessToken
.
isEmpty
())
{
System
.
err
.
println
(
"获取access_token失败"
);
return
fieldInfos
;
}
// 2. 获取字段信息
fieldInfos
=
fetchFields
(
accessToken
,
docId
,
sheetId
);
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"获取表格字段信息时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
fieldInfos
;
}
/**
* 验证字段匹配性
*
* @param corpId 企业ID
* @param corpSecret 应用的密钥
* @param docId 文档ID
* @param sheetId 工作表ID
* @param records 要插入的记录列表
* @return 不匹配的字段列表
*/
public
List
<
String
>
validateFields
(
WxConfig
wxConfig
,
String
corpId
,
String
corpSecret
,
String
docId
,
String
sheetId
,
List
<
Map
<
String
,
Object
>>
records
)
{
List
<
String
>
mismatches
=
new
ArrayList
<>();
try
{
// 1. 获取表格字段信息
List
<
FieldInfo
>
fieldInfos
=
getSheetFields
(
wxConfig
,
corpId
,
corpSecret
,
docId
,
sheetId
);
Map
<
String
,
FieldInfo
>
fieldMap
=
new
HashMap
<>();
for
(
FieldInfo
fieldInfo
:
fieldInfos
)
{
fieldMap
.
put
(
fieldInfo
.
getTitle
(),
fieldInfo
);
}
// 2. 检查记录中的字段
for
(
Map
<
String
,
Object
>
record
:
records
)
{
Map
<
String
,
Object
>
values
=
(
Map
<
String
,
Object
>)
record
.
get
(
"values"
);
if
(
values
!=
null
)
{
for
(
Map
.
Entry
<
String
,
Object
>
entry
:
values
.
entrySet
())
{
String
fieldName
=
entry
.
getKey
();
Object
fieldValue
=
entry
.
getValue
();
// 检查字段是否存在
if
(!
fieldMap
.
containsKey
(
fieldName
))
{
mismatches
.
add
(
"字段 '"
+
fieldName
+
"' 在表格中不存在"
);
continue
;
}
// 检查字段类型是否匹配
FieldInfo
fieldInfo
=
fieldMap
.
get
(
fieldName
);
String
fieldType
=
fieldInfo
.
getType
();
if
(!
isFieldTypeMatch
(
fieldType
,
fieldValue
))
{
mismatches
.
add
(
"字段 '"
+
fieldName
+
"' 类型不匹配,表格中为 "
+
fieldType
+
" 类型,但传入的是 "
+
fieldValue
.
getClass
().
getSimpleName
()
+
" 类型"
);
}
}
}
}
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"验证字段匹配性时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
mismatches
;
}
/**
* 测试插入数据
*
* @param corpId 企业ID
* @param corpSecret 应用的密钥
* @param docId 文档ID
* @param sheetId 工作表ID
* @param records 要插入的记录列表
* @return API响应结果
*/
public
String
testInsertData
(
WxConfig
wxConfig
,
String
corpId
,
String
corpSecret
,
String
docId
,
String
sheetId
,
List
<
Map
<
String
,
Object
>>
records
)
{
try
{
RestTemplate
restTemplate
=
new
RestTemplate
();
// 1. 获取access_token
String
accessToken
=
wxConfig
.
getAccessToken
(
restTemplate
);
//getAccessToken(corpId, corpSecret);
if
(
accessToken
==
null
||
accessToken
.
isEmpty
())
{
return
"获取access_token失败"
;
}
// 2. 构造请求体
JSONObject
requestBody
=
new
JSONObject
();
requestBody
.
put
(
"docid"
,
docId
);
requestBody
.
put
(
"sheet_id"
,
sheetId
);
requestBody
.
put
(
"key_type"
,
"CELL_VALUE_KEY_TYPE_FIELD_TITLE"
);
// 构造records数组
// 格式化
JSONArray
recordsArray
=
new
JSONArray
();
for
(
Map
<
String
,
Object
>
fieldData
:
records
)
{
JSONObject
recordObj
=
new
JSONObject
();
JSONObject
values
=
new
JSONObject
();
for
(
Map
.
Entry
<
String
,
Object
>
entry
:
fieldData
.
entrySet
())
{
String
fieldName
=
entry
.
getKey
();
String
fieldValue
=
entry
.
getValue
().
toString
();
// 构造字段值格式[{"type": "text", "text": "文本内容"}]
JSONArray
fieldValueArray
=
new
JSONArray
();
JSONObject
textObject
=
new
JSONObject
();
textObject
.
put
(
"type"
,
"text"
);
textObject
.
put
(
"text"
,
fieldValue
);
fieldValueArray
.
add
(
textObject
);
values
.
put
(
fieldName
,
fieldValueArray
);
}
recordObj
.
put
(
"values"
,
values
);
recordsArray
.
add
(
recordObj
);
}
requestBody
.
put
(
"records"
,
recordsArray
);
// 3. 发送请求
return
insertRecords
(
accessToken
,
requestBody
);
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"测试插入数据时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
return
"测试插入数据时发生异常: "
+
e
.
getMessage
();
}
}
/**
* 检查字段类型是否匹配
*
* @param fieldType 字段类型
* @param fieldValue 字段值
* @return 是否匹配
*/
private
boolean
isFieldTypeMatch
(
String
fieldType
,
Object
fieldValue
)
{
switch
(
fieldType
)
{
case
"number"
:
return
fieldValue
instanceof
Number
;
case
"text"
:
return
fieldValue
instanceof
String
;
case
"boolean"
:
return
fieldValue
instanceof
Boolean
;
default
:
// 其他类型默认允许
return
true
;
}
}
/**
* 获取企业微信access_token
*
* @param corpId 企业ID
* @param corpSecret 应用密钥
* @return access_token
*/
private
String
getAccessToken
(
String
corpId
,
String
corpSecret
)
{
try
{
String
url
=
WE_COM_API_BASE_URL
+
GET_TOKEN_PATH
+
"?corpid="
+
corpId
+
"&corpsecret="
+
corpSecret
;
RestTemplate
restTemplate
=
new
RestTemplate
();
ResponseEntity
<
String
>
response
=
restTemplate
.
getForEntity
(
url
,
String
.
class
);
if
(
response
.
getStatusCode
()
==
HttpStatus
.
OK
)
{
JSONObject
jsonObject
=
JSON
.
parseObject
(
response
.
getBody
());
if
(
jsonObject
.
getInteger
(
"errcode"
)
==
0
)
{
return
jsonObject
.
getString
(
"access_token"
);
}
else
{
System
.
err
.
println
(
"获取access_token失败,错误代码:"
+
jsonObject
.
getInteger
(
"errcode"
)
+
",错误信息:"
+
jsonObject
.
getString
(
"errmsg"
));
return
null
;
}
}
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"获取access_token时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
null
;
}
/**
* 获取字段信息
*
* @param accessToken 访问令牌
* @param docId 文档ID
* @param sheetId 工作表ID
* @return 字段信息列表
*/
private
List
<
FieldInfo
>
fetchFields
(
String
accessToken
,
String
docId
,
String
sheetId
)
{
List
<
FieldInfo
>
fieldInfos
=
new
ArrayList
<>();
try
{
String
url
=
WE_COM_API_BASE_URL
+
GET_FIELDS_PATH
+
"?access_token="
+
accessToken
;
RestTemplate
restTemplate
=
new
RestTemplate
();
// 构造请求体
JSONObject
requestBody
=
new
JSONObject
();
requestBody
.
put
(
"docid"
,
docId
);
requestBody
.
put
(
"sheet_id"
,
sheetId
);
HttpHeaders
headers
=
new
HttpHeaders
();
headers
.
setContentType
(
MediaType
.
APPLICATION_JSON
);
HttpEntity
<
String
>
request
=
new
HttpEntity
<>(
requestBody
.
toJSONString
(),
headers
);
ResponseEntity
<
String
>
response
=
restTemplate
.
postForEntity
(
url
,
request
,
String
.
class
);
if
(
response
.
getStatusCode
()
==
HttpStatus
.
OK
)
{
JSONObject
jsonObject
=
JSON
.
parseObject
(
response
.
getBody
());
if
(
jsonObject
.
getInteger
(
"errcode"
)
==
0
)
{
JSONArray
fields
=
jsonObject
.
getJSONArray
(
"fields"
);
if
(
fields
!=
null
&&
!
fields
.
isEmpty
())
{
for
(
int
i
=
0
;
i
<
fields
.
size
();
i
++)
{
JSONObject
field
=
fields
.
getJSONObject
(
i
);
FieldInfo
fieldInfo
=
new
FieldInfo
();
fieldInfo
.
setFieldId
(
field
.
getString
(
"field_id"
));
fieldInfo
.
setTitle
(
field
.
getString
(
"field_title"
));
fieldInfo
.
setType
(
field
.
getString
(
"field_type"
));
fieldInfos
.
add
(
fieldInfo
);
}
}
}
else
{
System
.
err
.
println
(
"获取字段信息失败,错误代码:"
+
jsonObject
.
getInteger
(
"errcode"
)
+
",错误信息:"
+
jsonObject
.
getString
(
"errmsg"
));
}
}
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"获取字段信息时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
fieldInfos
;
}
/**
* 插入记录
*
* @param accessToken 访问令牌
* @param requestBody 请求体
* @return API响应结果
*/
private
String
insertRecords
(
String
accessToken
,
JSONObject
requestBody
)
{
try
{
String
url
=
WE_COM_API_BASE_URL
+
ADD_RECORDS_PATH
+
"?access_token="
+
accessToken
;
RestTemplate
restTemplate
=
new
RestTemplate
();
HttpHeaders
headers
=
new
HttpHeaders
();
headers
.
setContentType
(
MediaType
.
APPLICATION_JSON
);
HttpEntity
<
String
>
request
=
new
HttpEntity
<>(
requestBody
.
toJSONString
(),
headers
);
System
.
err
.
println
(
"插入数据的JSON:"
+
request
.
getBody
());
ResponseEntity
<
String
>
response
=
restTemplate
.
postForEntity
(
url
,
request
,
String
.
class
);
return
response
.
getBody
();
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"插入记录时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
return
"插入记录时发生异常: "
+
e
.
getMessage
();
}
}
/**
* 字段信息内部类
*/
public
static
class
FieldInfo
{
private
String
fieldId
;
private
String
title
;
private
String
type
;
public
String
getFieldId
()
{
return
fieldId
;
}
public
void
setFieldId
(
String
fieldId
)
{
this
.
fieldId
=
fieldId
;
}
public
String
getTitle
()
{
return
title
;
}
public
void
setTitle
(
String
title
)
{
this
.
title
=
title
;
}
public
String
getType
()
{
return
type
;
}
public
void
setType
(
String
type
)
{
this
.
type
=
type
;
}
@Override
public
String
toString
()
{
return
"FieldInfo{"
+
"fieldId='"
+
fieldId
+
'\''
+
", title='"
+
title
+
'\''
+
", type='"
+
type
+
'\''
+
'}'
;
}
}
/**
* 构造符合企业微信智能表格要求的记录数据
*
* @param docId 文档ID
* @param sheetId 工作表ID
* @param fieldDataList 字段数据列表,每个元素是一个Map,key为字段名,value为字段值
* @return 符合要求的JSON字符串
*/
public
String
buildRecordData
(
String
docId
,
String
sheetId
,
List
<
Map
<
String
,
String
>>
fieldDataList
)
{
JSONObject
requestBody
=
new
JSONObject
();
requestBody
.
put
(
"docid"
,
docId
);
requestBody
.
put
(
"sheet_id"
,
sheetId
);
requestBody
.
put
(
"key_type"
,
"CELL_VALUE_KEY_TYPE_FIELD_TITLE"
);
JSONArray
recordsArray
=
new
JSONArray
();
for
(
Map
<
String
,
String
>
fieldData
:
fieldDataList
)
{
JSONObject
recordObj
=
new
JSONObject
();
JSONObject
values
=
new
JSONObject
();
for
(
Map
.
Entry
<
String
,
String
>
entry
:
fieldData
.
entrySet
())
{
String
fieldName
=
entry
.
getKey
();
String
fieldValue
=
entry
.
getValue
();
// 构造字段值格式[{"type": "text", "text": "文本内容"}]
JSONArray
fieldValueArray
=
new
JSONArray
();
JSONObject
textObject
=
new
JSONObject
();
textObject
.
put
(
"type"
,
"text"
);
textObject
.
put
(
"text"
,
fieldValue
);
fieldValueArray
.
add
(
textObject
);
values
.
put
(
fieldName
,
fieldValueArray
);
}
recordObj
.
put
(
"values"
,
values
);
recordsArray
.
add
(
recordObj
);
}
requestBody
.
put
(
"records"
,
recordsArray
);
return
requestBody
.
toJSONString
();
}
}
\ No newline at end of file
yifu-ekp/yifu-ekp-biz/src/main/java/com/yifu/cloud/plus/v1/ekp/util/WeComSmartSheetManager.java
0 → 100644
View file @
21be7ae8
package
com
.
yifu
.
cloud
.
plus
.
v1
.
ekp
.
util
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
com.yifu.cloud.plus.v1.ekp.config.WxConfig
;
import
org.springframework.http.*
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.StringUtils
;
import
org.springframework.web.client.RestTemplate
;
import
java.util.*
;
/**
* 企业微信智能表格管理工具类
* 实现创建智能表格、创建工作表、清空工作表数据和插入数据的功能
*/
@Component
public
class
WeComSmartSheetManager
{
/**
* 企业微信API基础URL
*/
private
static
final
String
WE_COM_API_BASE_URL
=
"https://qyapi.weixin.qq.com/cgi-bin"
;
/**
* 获取access_token的接口路径
*/
private
static
final
String
GET_TOKEN_PATH
=
"/gettoken"
;
/**
* 创建文档的接口路径
*/
private
static
final
String
CREATE_DOC_PATH
=
"/wedoc/create_doc"
;
/**
* 查询子表的接口路径
*/
private
static
final
String
GET_SHEET_PATH
=
"/wedoc/smartsheet/get_sheet"
;
/**
* 添加记录的接口路径
*/
private
static
final
String
ADD_RECORDS_PATH
=
"/wedoc/smartsheet/add_records"
;
/**
* 查询记录的接口路径
*/
private
static
final
String
QUERY_RECORDS_PATH
=
"/wedoc/smartsheet/query_records"
;
/**
* 删除记录的接口路径
*/
private
static
final
String
DELETE_RECORDS_PATH
=
"/wedoc/smartsheet/delete_records"
;
/**
* 获取字段信息的接口路径
*/
private
static
final
String
GET_FIELDS_PATH
=
"/wedoc/smartsheet/get_fields"
;
/**
* 创建智能表格
*
* @param docName 文档名称
* @param adminUsers 管理员用户列表
* @return 文档ID
*/
public
String
createSmartSheet
(
WxConfig
wxConfig
,
String
docName
,
List
<
String
>
adminUsers
)
{
try
{
RestTemplate
restTemplate
=
new
RestTemplate
();
// 1. 获取access_token
String
accessToken
=
wxConfig
.
getAccessToken
(
restTemplate
);
//getAccessToken(corpId, corpSecret);
if
(
accessToken
==
null
||
accessToken
.
isEmpty
())
{
System
.
err
.
println
(
"获取access_token失败"
);
return
null
;
}
// 2. 构造请求体
JSONObject
requestBody
=
new
JSONObject
();
requestBody
.
put
(
"doc_type"
,
10
);
// 10: 智能表格
requestBody
.
put
(
"doc_name"
,
docName
);
requestBody
.
put
(
"admin_users"
,
adminUsers
);
// 3. 发送请求创建智能表格
String
docId
=
createDoc
(
accessToken
,
requestBody
);
if
(
docId
!=
null
)
{
System
.
out
.
println
(
"智能表格创建成功,文档ID: "
+
docId
);
}
else
{
System
.
err
.
println
(
"智能表格创建失败"
);
}
return
docId
;
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"创建智能表格时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
return
null
;
}
}
/**
* 获取指定智能表格下的所有工作表ID列表
* 注意:根据企业微信API文档,创建智能表格时会自动创建一个默认的子表
* 该方法用于查询这些已存在的子表。
*
* @param docId 文档ID
* @return 工作表ID列表
*/
public
List
<
String
>
createWorkSheets
(
WxConfig
wxConfig
,
String
docId
)
{
try
{
RestTemplate
restTemplate
=
new
RestTemplate
();
// 1. 获取access_token
String
accessToken
=
wxConfig
.
getAccessToken
(
restTemplate
);
if
(
accessToken
==
null
||
accessToken
.
isEmpty
())
{
System
.
err
.
println
(
"获取access_token失败"
);
return
new
ArrayList
<>();
}
return
getSheetIds
(
accessToken
,
docId
);
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"获取工作表ID时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
return
new
ArrayList
<>();
}
}
/**
* 使用access_token获取智能表格下的工作表ID列表
*
* @param accessToken 访问令牌
* @param docId 文档ID
* @return 工作表ID列表
*/
private
List
<
String
>
getSheetIds
(
String
accessToken
,
String
docId
)
{
List
<
String
>
sheetIds
=
new
ArrayList
<>();
try
{
String
url
=
WE_COM_API_BASE_URL
+
GET_SHEET_PATH
+
"?access_token="
+
accessToken
;
RestTemplate
restTemplate
=
new
RestTemplate
();
// 构造请求体
JSONObject
requestBody
=
new
JSONObject
();
requestBody
.
put
(
"docid"
,
docId
);
HttpHeaders
headers
=
new
HttpHeaders
();
headers
.
setContentType
(
MediaType
.
APPLICATION_JSON
);
HttpEntity
<
String
>
request
=
new
HttpEntity
<>(
requestBody
.
toJSONString
(),
headers
);
ResponseEntity
<
String
>
response
=
restTemplate
.
postForEntity
(
url
,
request
,
String
.
class
);
if
(
response
.
getStatusCode
()
==
HttpStatus
.
OK
)
{
JSONObject
jsonObject
=
JSON
.
parseObject
(
response
.
getBody
());
if
(
jsonObject
.
getInteger
(
"errcode"
)
==
0
)
{
JSONArray
sheets
=
jsonObject
.
getJSONArray
(
"sheet_list"
);
if
(
sheets
!=
null
&&
!
sheets
.
isEmpty
())
{
for
(
int
i
=
0
;
i
<
sheets
.
size
();
i
++)
{
JSONObject
sheet
=
sheets
.
getJSONObject
(
i
);
sheetIds
.
add
(
sheet
.
getString
(
"sheet_id"
));
}
}
else
{
System
.
err
.
println
(
"未找到任何工作表"
);
}
}
else
{
System
.
err
.
println
(
"查询工作表失败,错误代码:"
+
jsonObject
.
getInteger
(
"errcode"
)
+
",错误信息:"
+
jsonObject
.
getString
(
"errmsg"
));
}
}
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"查询工作表时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
sheetIds
;
}
/**
* 通过工作表的ID先清空工作表数据,然后插入新的多条数据
*
* @param docId 文档ID
* @param sheetId 工作表ID
* @param records 要插入的记录列表
* @return 是否成功
*/
public
boolean
clearAndInsertData
(
WxConfig
wxConfig
,
String
docId
,
String
sheetId
,
List
<
Map
<
String
,
Object
>>
records
)
{
try
{
RestTemplate
restTemplate
=
new
RestTemplate
();
// 1. 获取access_token
String
accessToken
=
wxConfig
.
getAccessToken
(
restTemplate
);
if
(
accessToken
==
null
||
accessToken
.
isEmpty
())
{
System
.
err
.
println
(
"获取access_token失败"
);
return
false
;
}
// 2. 验证字段是否存在
if
(!
validateFields
(
accessToken
,
docId
,
sheetId
,
records
))
{
System
.
err
.
println
(
"字段验证失败,请检查字段名称是否正确"
);
return
false
;
}
// 3. 清空工作表数据
if
(!
clearSheetData
(
accessToken
,
docId
,
sheetId
))
{
System
.
err
.
println
(
"清空工作表数据失败"
);
return
false
;
}
// 4. 插入新数据(分批处理,避免接口限制)
if
(!
insertDataInBatches
(
accessToken
,
docId
,
sheetId
,
records
))
{
System
.
err
.
println
(
"插入数据失败"
);
return
false
;
}
System
.
out
.
println
(
"清空并插入数据成功"
);
return
true
;
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"清空并插入数据时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
return
false
;
}
}
/**
* 获取企业微信access_token
*
* @param corpId 企业ID
* @param corpSecret 应用密钥
* @return access_token
*/
private
String
getAccessToken
(
String
corpId
,
String
corpSecret
)
{
try
{
String
url
=
WE_COM_API_BASE_URL
+
GET_TOKEN_PATH
+
"?corpid="
+
corpId
+
"&corpsecret="
+
corpSecret
;
RestTemplate
restTemplate
=
new
RestTemplate
();
ResponseEntity
<
String
>
response
=
restTemplate
.
getForEntity
(
url
,
String
.
class
);
if
(
response
.
getStatusCode
()
==
HttpStatus
.
OK
)
{
JSONObject
jsonObject
=
JSON
.
parseObject
(
response
.
getBody
());
if
(
jsonObject
.
getInteger
(
"errcode"
)
==
0
)
{
return
jsonObject
.
getString
(
"access_token"
);
}
else
{
System
.
err
.
println
(
"获取access_token失败,错误代码:"
+
jsonObject
.
getInteger
(
"errcode"
)
+
",错误信息:"
+
jsonObject
.
getString
(
"errmsg"
));
return
null
;
}
}
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"获取access_token时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
null
;
}
/**
* 创建文档
*
* @param accessToken 访问令牌
* @param requestBody 请求体
* @return 文档ID
*/
private
String
createDoc
(
String
accessToken
,
JSONObject
requestBody
)
{
try
{
String
url
=
WE_COM_API_BASE_URL
+
CREATE_DOC_PATH
+
"?access_token="
+
accessToken
;
RestTemplate
restTemplate
=
new
RestTemplate
();
HttpHeaders
headers
=
new
HttpHeaders
();
headers
.
setContentType
(
MediaType
.
APPLICATION_JSON
);
HttpEntity
<
String
>
request
=
new
HttpEntity
<>(
requestBody
.
toJSONString
(),
headers
);
ResponseEntity
<
String
>
response
=
restTemplate
.
postForEntity
(
url
,
request
,
String
.
class
);
if
(
response
.
getStatusCode
()
==
HttpStatus
.
OK
)
{
JSONObject
jsonObject
=
JSON
.
parseObject
(
response
.
getBody
());
if
(
jsonObject
.
getInteger
(
"errcode"
)
==
0
)
{
return
jsonObject
.
getString
(
"docid"
);
}
else
{
System
.
err
.
println
(
"创建文档失败,错误代码:"
+
jsonObject
.
getInteger
(
"errcode"
)
+
",错误信息:"
+
jsonObject
.
getString
(
"errmsg"
));
return
null
;
}
}
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"创建文档时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
null
;
}
/**
* 验证字段是否存在
*
* @param accessToken 访问令牌
* @param docId 文档ID
* @param sheetId 工作表ID
* @param records 记录列表
* @return 是否验证通过
*/
private
boolean
validateFields
(
String
accessToken
,
String
docId
,
String
sheetId
,
List
<
Map
<
String
,
Object
>>
records
)
{
try
{
// 1. 获取表格字段信息
List
<
FieldInfo
>
fieldInfos
=
getSheetFields
(
accessToken
,
docId
,
sheetId
);
Set
<
String
>
fieldTitles
=
new
HashSet
<>();
for
(
FieldInfo
fieldInfo
:
fieldInfos
)
{
fieldTitles
.
add
(
fieldInfo
.
getTitle
());
}
// 2. 检查记录中的字段是否都存在
for
(
Map
<
String
,
Object
>
record
:
records
)
{
Map
<
String
,
Object
>
values
=
(
Map
<
String
,
Object
>)
record
.
get
(
"values"
);
if
(
values
!=
null
)
{
for
(
String
fieldName
:
values
.
keySet
())
{
if
(!
fieldTitles
.
contains
(
fieldName
))
{
System
.
err
.
println
(
"字段 '"
+
fieldName
+
"' 在表格中不存在,请检查字段名称是否正确"
);
return
false
;
}
}
}
}
return
true
;
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"验证字段时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
return
false
;
}
}
/**
* 获取智能表格字段信息
*
* @param accessToken 访问令牌
* @param docId 文档ID
* @param sheetId 工作表ID
* @return 字段信息列表
*/
private
List
<
FieldInfo
>
getSheetFields
(
String
accessToken
,
String
docId
,
String
sheetId
)
{
List
<
FieldInfo
>
fieldInfos
=
new
ArrayList
<>();
try
{
String
url
=
WE_COM_API_BASE_URL
+
GET_FIELDS_PATH
+
"?access_token="
+
accessToken
;
RestTemplate
restTemplate
=
new
RestTemplate
();
// 构造请求体
JSONObject
requestBody
=
new
JSONObject
();
requestBody
.
put
(
"docid"
,
docId
);
requestBody
.
put
(
"sheet_id"
,
sheetId
);
HttpHeaders
headers
=
new
HttpHeaders
();
headers
.
setContentType
(
MediaType
.
APPLICATION_JSON
);
HttpEntity
<
String
>
request
=
new
HttpEntity
<>(
requestBody
.
toJSONString
(),
headers
);
ResponseEntity
<
String
>
response
=
restTemplate
.
postForEntity
(
url
,
request
,
String
.
class
);
if
(
response
.
getStatusCode
()
==
HttpStatus
.
OK
)
{
JSONObject
jsonObject
=
JSON
.
parseObject
(
response
.
getBody
());
if
(
jsonObject
.
getInteger
(
"errcode"
)
==
0
)
{
JSONArray
fields
=
jsonObject
.
getJSONArray
(
"fields"
);
if
(
fields
!=
null
&&
!
fields
.
isEmpty
())
{
FieldInfo
fieldInfo
;
for
(
int
i
=
0
;
i
<
fields
.
size
();
i
++)
{
JSONObject
field
=
fields
.
getJSONObject
(
i
);
fieldInfo
=
new
FieldInfo
();
fieldInfo
.
setFieldId
(
field
.
getString
(
"field_id"
));
fieldInfo
.
setTitle
(
field
.
getString
(
"field_title"
));
fieldInfo
.
setType
(
field
.
getString
(
"field_type"
));
fieldInfos
.
add
(
fieldInfo
);
}
}
}
else
{
System
.
err
.
println
(
"获取字段信息失败,错误代码:"
+
jsonObject
.
getInteger
(
"errcode"
)
+
",错误信息:"
+
jsonObject
.
getString
(
"errmsg"
));
}
}
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"获取字段信息时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
fieldInfos
;
}
/**
* 清空工作表数据
*
* @param accessToken 访问令牌
* @param docId 文档ID
* @param sheetId 工作表ID
* @return 是否成功
*/
private
boolean
clearSheetData
(
String
accessToken
,
String
docId
,
String
sheetId
)
{
try
{
// 1. 查询所有记录ID
List
<
String
>
recordIds
=
queryAllRecordIds
(
accessToken
,
docId
,
sheetId
);
if
(
recordIds
.
isEmpty
())
{
// 没有记录需要删除
return
true
;
}
// 2. 分批删除记录(企业微信API限制每次最多删除100条记录)
int
batchSize
=
100
;
for
(
int
i
=
0
;
i
<
recordIds
.
size
();
i
+=
batchSize
)
{
int
endIndex
=
Math
.
min
(
i
+
batchSize
,
recordIds
.
size
());
List
<
String
>
batchRecordIds
=
recordIds
.
subList
(
i
,
endIndex
);
if
(!
deleteRecords
(
accessToken
,
docId
,
sheetId
,
batchRecordIds
))
{
return
false
;
}
}
return
true
;
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"清空工作表数据时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
return
false
;
}
}
/**
* 查询所有记录ID
*
* @param accessToken 访问令牌
* @param docId 文档ID
* @param sheetId 工作表ID
* @return 记录ID列表
*/
private
List
<
String
>
queryAllRecordIds
(
String
accessToken
,
String
docId
,
String
sheetId
)
{
List
<
String
>
recordIds
=
new
ArrayList
<>();
try
{
String
url
=
WE_COM_API_BASE_URL
+
QUERY_RECORDS_PATH
+
"?access_token="
+
accessToken
;
RestTemplate
restTemplate
=
new
RestTemplate
();
// 构造请求体
JSONObject
requestBody
=
new
JSONObject
();
requestBody
.
put
(
"docid"
,
docId
);
requestBody
.
put
(
"sheet_id"
,
sheetId
);
requestBody
.
put
(
"key_type"
,
"CELL_VALUE_KEY_TYPE_FIELD_TITLE"
);
HttpHeaders
headers
=
new
HttpHeaders
();
headers
.
setContentType
(
MediaType
.
APPLICATION_JSON
);
HttpEntity
<
String
>
request
=
new
HttpEntity
<>(
requestBody
.
toJSONString
(),
headers
);
ResponseEntity
<
String
>
response
=
restTemplate
.
postForEntity
(
url
,
request
,
String
.
class
);
if
(
response
.
getStatusCode
()
==
HttpStatus
.
OK
)
{
JSONObject
jsonObject
=
JSON
.
parseObject
(
response
.
getBody
());
if
(
jsonObject
.
getInteger
(
"errcode"
)
==
0
)
{
JSONArray
records
=
jsonObject
.
getJSONArray
(
"records"
);
if
(
records
!=
null
&&
!
records
.
isEmpty
())
{
for
(
int
i
=
0
;
i
<
records
.
size
();
i
++)
{
JSONObject
record
=
records
.
getJSONObject
(
i
);
recordIds
.
add
(
record
.
getString
(
"record_id"
));
}
}
}
else
{
System
.
err
.
println
(
"查询记录失败,错误代码:"
+
jsonObject
.
getInteger
(
"errcode"
)
+
",错误信息:"
+
jsonObject
.
getString
(
"errmsg"
));
}
}
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"查询记录时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
recordIds
;
}
/**
* 删除记录
*
* @param accessToken 访问令牌
* @param docId 文档ID
* @param sheetId 工作表ID
* @param recordIds 记录ID列表
* @return 是否成功
*/
private
boolean
deleteRecords
(
String
accessToken
,
String
docId
,
String
sheetId
,
List
<
String
>
recordIds
)
{
try
{
String
url
=
WE_COM_API_BASE_URL
+
DELETE_RECORDS_PATH
+
"?access_token="
+
accessToken
;
RestTemplate
restTemplate
=
new
RestTemplate
();
// 构造请求体
JSONObject
requestBody
=
new
JSONObject
();
requestBody
.
put
(
"docid"
,
docId
);
requestBody
.
put
(
"sheet_id"
,
sheetId
);
requestBody
.
put
(
"record_ids"
,
recordIds
);
HttpHeaders
headers
=
new
HttpHeaders
();
headers
.
setContentType
(
MediaType
.
APPLICATION_JSON
);
HttpEntity
<
String
>
request
=
new
HttpEntity
<>(
requestBody
.
toJSONString
(),
headers
);
ResponseEntity
<
String
>
response
=
restTemplate
.
postForEntity
(
url
,
request
,
String
.
class
);
if
(
response
.
getStatusCode
()
==
HttpStatus
.
OK
)
{
JSONObject
jsonObject
=
JSON
.
parseObject
(
response
.
getBody
());
if
(
jsonObject
.
getInteger
(
"errcode"
)
==
0
)
{
return
true
;
}
else
{
System
.
err
.
println
(
"删除记录失败,错误代码:"
+
jsonObject
.
getInteger
(
"errcode"
)
+
",错误信息:"
+
jsonObject
.
getString
(
"errmsg"
));
return
false
;
}
}
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"删除记录时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
false
;
}
/**
* 分批插入数据
*
* @param accessToken 访问令牌
* @param docId 文档ID
* @param sheetId 工作表ID
* @param records 记录列表
* @return 是否成功
*/
private
boolean
insertDataInBatches
(
String
accessToken
,
String
docId
,
String
sheetId
,
List
<
Map
<
String
,
Object
>>
records
)
{
try
{
// 分批插入数据(企业微信API限制每次最多插入500条记录)
int
batchSize
=
500
;
for
(
int
i
=
0
;
i
<
records
.
size
();
i
+=
batchSize
)
{
int
endIndex
=
Math
.
min
(
i
+
batchSize
,
records
.
size
());
List
<
Map
<
String
,
Object
>>
batchRecords
=
records
.
subList
(
i
,
endIndex
);
if
(!
addRecords
(
accessToken
,
docId
,
sheetId
,
batchRecords
))
{
return
false
;
}
}
return
true
;
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"分批插入数据时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
return
false
;
}
}
/**
* 添加记录
*
* @param accessToken 访问令牌
* @param docId 文档ID
* @param sheetId 工作表ID
* @param records 记录列表
* @return 是否成功
*/
private
boolean
addRecords
(
String
accessToken
,
String
docId
,
String
sheetId
,
List
<
Map
<
String
,
Object
>>
records
)
{
try
{
String
url
=
WE_COM_API_BASE_URL
+
ADD_RECORDS_PATH
+
"?access_token="
+
accessToken
;
RestTemplate
restTemplate
=
new
RestTemplate
();
// 构造请求体
JSONObject
requestBody
=
new
JSONObject
();
requestBody
.
put
(
"docid"
,
docId
);
requestBody
.
put
(
"sheet_id"
,
sheetId
);
requestBody
.
put
(
"key_type"
,
"CELL_VALUE_KEY_TYPE_FIELD_TITLE"
);
// 构造records数组
JSONArray
recordsArray
=
new
JSONArray
();
for
(
Map
<
String
,
Object
>
record
:
records
)
{
recordsArray
.
add
(
record
);
}
requestBody
.
put
(
"records"
,
recordsArray
);
HttpHeaders
headers
=
new
HttpHeaders
();
headers
.
setContentType
(
MediaType
.
APPLICATION_JSON
);
HttpEntity
<
String
>
request
=
new
HttpEntity
<>(
requestBody
.
toJSONString
(),
headers
);
ResponseEntity
<
String
>
response
=
restTemplate
.
postForEntity
(
url
,
request
,
String
.
class
);
if
(
response
.
getStatusCode
()
==
HttpStatus
.
OK
)
{
JSONObject
jsonObject
=
JSON
.
parseObject
(
response
.
getBody
());
if
(
jsonObject
.
getInteger
(
"errcode"
)
==
0
)
{
return
true
;
}
else
{
System
.
err
.
println
(
"添加记录失败,错误代码:"
+
jsonObject
.
getInteger
(
"errcode"
)
+
",错误信息:"
+
jsonObject
.
getString
(
"errmsg"
));
// 特别处理字段不存在的错误
if
(
jsonObject
.
getInteger
(
"errcode"
)
==
2022004
)
{
System
.
err
.
println
(
"请检查您要插入的字段名称是否与表格中的字段完全匹配"
);
}
return
false
;
}
}
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"添加记录时发生异常: "
+
e
.
getMessage
());
e
.
printStackTrace
();
}
return
false
;
}
/**
* 使用示例
*
*/
public
void
test
(
WxConfig
wxConfig
)
{
WeComSmartSheetManager
manager
=
new
WeComSmartSheetManager
();
// 示例数据
//String corpId = "your_corp_id";
//String corpSecret = "your_corp_secret";
String
docName
=
"测试智能表格"
;
List
<
String
>
adminUsers
=
new
ArrayList
<>();
adminUsers
.
add
(
"ZhangQianQian"
);
adminUsers
.
add
(
"FeiTaiLang_Fang"
);
// 1. 创建智能表格
String
docId
=
"dcTSMCj4lWV9MEP7lquZacOY8WS4g-iHxP_jVYA02tdYwb2YYc3BpDR8NrFWkEngHUg8abET4eTIpo9Zv-571NEA"
;
//manager.createSmartSheet(wxConfig, docName, adminUsers);
if
(
StringUtils
.
isEmpty
(
docId
))
{
System
.
out
.
println
(
"创建智能表格失败"
);
return
;
}
// 2. 获取工作表ID列表
List
<
String
>
sheetIds
=
manager
.
createWorkSheets
(
wxConfig
,
docId
);
if
(
sheetIds
.
isEmpty
())
{
System
.
out
.
println
(
"获取工作表ID失败"
);
return
;
}
String
sheetId
=
sheetIds
.
get
(
0
);
// 3. 准备要插入的数据
List
<
Map
<
String
,
Object
>>
records
=
new
ArrayList
<>();
Map
<
String
,
Object
>
record1
=
new
HashMap
<>();
Map
<
String
,
Object
>
values1
=
new
HashMap
<>();
values1
.
put
(
"姓名"
,
"张三"
);
values1
.
put
(
"年龄"
,
"25"
);
values1
.
put
(
"部门"
,
"技术部"
);
record1
.
put
(
"values"
,
values1
);
Map
<
String
,
Object
>
record2
=
new
HashMap
<>();
Map
<
String
,
Object
>
values2
=
new
HashMap
<>();
values2
.
put
(
"姓名"
,
"李四"
);
values2
.
put
(
"年龄"
,
"30"
);
values2
.
put
(
"部门"
,
"市场部"
);
record2
.
put
(
"values"
,
values2
);
records
.
add
(
record1
);
records
.
add
(
record2
);
// 4. 清空并插入数据
boolean
success
=
manager
.
clearAndInsertData
(
wxConfig
,
docId
,
sheetId
,
records
);
if
(
success
)
{
System
.
out
.
println
(
"清空并插入数据成功"
);
}
else
{
System
.
out
.
println
(
"清空并插入数据失败"
);
}
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment