This commit is contained in:
2025-11-06 13:03:01 +08:00
parent 228883250b
commit 88234c13b2
3 changed files with 517 additions and 8 deletions

View File

@@ -41,6 +41,15 @@ public class TencentDocConfig {
/** 刷新Token地址 */
private String refreshTokenUrl = "https://docs.qq.com/oauth/v2/token";
/** 访问令牌用于自动写入H-TF订单到腾讯文档 */
private String accessToken;
/** 文件IDH-TF订单的目标文档ID */
private String fileId;
/** 工作表IDH-TF订单的目标工作表ID */
private String sheetId;
/**
* 配置初始化后验证
*/
@@ -117,5 +126,29 @@ public class TencentDocConfig {
public void setRefreshTokenUrl(String refreshTokenUrl) {
this.refreshTokenUrl = refreshTokenUrl;
}
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public String getFileId() {
return fileId;
}
public void setFileId(String fileId) {
this.fileId = fileId;
}
public String getSheetId() {
return sheetId;
}
public void setSheetId(String sheetId) {
this.sheetId = sheetId;
}
}

View File

@@ -40,6 +40,10 @@ public class InstructionServiceImpl implements IInstructionService {
private StringRedisTemplate stringRedisTemplate;
@Resource
private IProductJdConfigService productJdConfigService;
@Resource
private com.ruoyi.jarvis.service.ITencentDocService tencentDocService;
@Resource
private com.ruoyi.jarvis.config.TencentDocConfig tencentDocConfig;
// 录单模板(与 jd/JDUtil 中 WENAN_D 保持一致)
private static final String WENAN_D = "单:\n" + "{单号} \n备注{单的备注}\n" + "分销标记:{分销标记}\n" + "第三方单号:{第三方单号}\n" + "型号:\n" + "{型号}\n" + "链接:\n" + "{链接}\n" + "下单付款:\n" + "\n" + "后返金额:\n" + "\n" + "地址:\n" + "{地址}\n" + "物流链接:\n" + "\n" + "订单号:\n" + "\n" + "下单人:\n" + "\n" + "京粉实际价格:\n" + "\n";
@@ -625,14 +629,10 @@ private String handleTF(String input) {
* 型号地址电话的处理逻辑不变将10.10 腾锋 JY202510093195 设置成分销标识这个字段比如之前是H-TF现在改成H-TF(10.10 腾锋 JY202510093195)
* */
if (parts.length >= 7) { // 至少需要分销信息(3) + 型号(1) + 数量(1) + 姓名(1) + 电话(1) = 7个字段
// 处理分销标记: 简化格式,只保留H-TF和第三方单号(第三方单号已单独存储)
// 提取第三方单号第3个字段格式如JY202511051374
String thirdPartyOrderNo = parts.length > 2 ? parts[2].trim() : "";
// 处理分销标记: 只保留H-TF,不包含其他内容(第三方单号已单独存储)
String fenxiaoInfo = "H-TF";
// 如果第三方单号存在,添加到分销标记中(但保持简短)
if (!thirdPartyOrderNo.isEmpty()) {
fenxiaoInfo = "H-TF(" + thirdPartyOrderNo + ")";
}
// 提取第三方单号第3个字段格式如JY202511051374用于单独存储添加到分销标记中
String thirdPartyOrderNo = parts.length > 2 ? parts[2].trim() : "";
// 提取型号第4个字段
String modelNumber = parts[3].replace("\\n", "");
@@ -730,7 +730,8 @@ private String handleTF(String input) {
StringBuilder order = new StringBuilder();
order.append(""+phone).append("\n").append(fenxiaoInfo).append("\n").append(modelNumber).append("\n").append(jf).append("\n").append(quantityStr).append("\n").append(address);
outputs.add(generateOrderText(order.toString()));
// 传递第三方单号给 generateOrderText以便在生成订单文本时正确提取
outputs.add(generateOrderText(order.toString(), thirdPartyOrderNo));
} else {
outputs.add("TF 指令格式TF\t分销信息\t分销信息\t分销信息\t型号\t数量\t姓名\t电话\t地址 ;也支持多行,每行一条数据");
}
@@ -1228,6 +1229,11 @@ private String handleTF(String input) {
jdOrderService.insertJDOrder(order);
}
// 如果分销标识是 H-TF自动写入腾讯文档
if ("H-TF".equals(order.getDistributionMark())) {
asyncWriteToTencentDoc(order);
}
// 返回完整的表单格式,使用原始输入保留完整物流链接
return formatOrderForm(order, originalInput);
}
@@ -1363,6 +1369,10 @@ private String handleTF(String input) {
}
distributionMark = firstLine;
}
// 如果分销标记是H-TF格式包含括号只保留H-TF
if (distributionMark != null && distributionMark.startsWith("H-TF(")) {
distributionMark = "H-TF";
}
order.setDistributionMark(distributionMark);
// 优先从字段中获取第三方单号,如果没有则从分销标记中提取
@@ -1626,6 +1636,52 @@ private String handleTF(String input) {
}
return String.valueOf(v);
}
/**
* 异步写入订单到腾讯文档
* 当订单的分销标识是 H-TF 时,自动追加到腾讯文档表格
*
* @param order 订单对象
*/
private void asyncWriteToTencentDoc(JDOrder order) {
// 使用独立线程异步执行,避免阻塞录单流程
new Thread(() -> {
try {
// 读取腾讯文档配置
String accessToken = tencentDocConfig.getAccessToken();
String fileId = tencentDocConfig.getFileId();
String sheetId = tencentDocConfig.getSheetId();
// 验证配置是否完整
if (accessToken == null || accessToken.isEmpty() ||
fileId == null || fileId.isEmpty() ||
sheetId == null || sheetId.isEmpty()) {
System.err.println("腾讯文档配置不完整跳过自动写入。请检查配置accessToken=" +
(accessToken != null && !accessToken.isEmpty() ? "已配置" : "未配置") +
", fileId=" + (fileId != null && !fileId.isEmpty() ? "已配置" : "未配置") +
", sheetId=" + (sheetId != null && !sheetId.isEmpty() ? "已配置" : "未配置"));
return;
}
// 调用腾讯文档服务追加订单数据
com.alibaba.fastjson2.JSONObject result = tencentDocService.appendLogisticsToSheet(
accessToken, fileId, sheetId, order);
if (result != null) {
System.out.println("订单已自动追加到腾讯文档 - 单号: " + order.getRemark() +
", 第三方单号: " + order.getThirdPartyOrderNo());
} else {
System.err.println("订单追加到腾讯文档失败 - 单号: " + order.getRemark() +
", API返回null");
}
} catch (Exception e) {
// 写入失败不影响录单结果,仅记录错误日志
System.err.println("异步写入腾讯文档失败 - 单号: " + order.getRemark() +
", 错误: " + e.getMessage());
e.printStackTrace();
}
}, "TencentDoc-Writer-" + order.getRemark()).start();
}
}