1
This commit is contained in:
@@ -41,6 +41,15 @@ public class TencentDocConfig {
|
||||
/** 刷新Token地址 */
|
||||
private String refreshTokenUrl = "https://docs.qq.com/oauth/v2/token";
|
||||
|
||||
/** 访问令牌(用于自动写入H-TF订单到腾讯文档) */
|
||||
private String accessToken;
|
||||
|
||||
/** 文件ID(H-TF订单的目标文档ID) */
|
||||
private String fileId;
|
||||
|
||||
/** 工作表ID(H-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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user