This commit is contained in:
2025-08-27 20:36:28 +08:00
parent a92122cc94
commit 435cfc1c3c
5 changed files with 203 additions and 2 deletions

View File

@@ -17,6 +17,14 @@ public interface JDOrderMapper {
* 根据主键查询
*/
JDOrder selectJDOrderById(Long id);
int insertJDOrder(JDOrder jdOrder);
int updateJDOrder(JDOrder jdOrder);
JDOrder selectJDOrderByRemark(String remark);
List<JDOrder> selectJDOrderListByAddress(String address);
}

View File

@@ -16,6 +16,18 @@ public interface IJDOrderService {
* 按ID查询
*/
JDOrder selectJDOrderById(Long id);
/** 新增 */
int insertJDOrder(JDOrder jdOrder);
/** 更新 */
int updateJDOrder(JDOrder jdOrder);
/** 按 remark 查单(单号) */
JDOrder selectJDOrderByRemark(String remark);
/** 按地址倒序查询全部 */
java.util.List<JDOrder> selectJDOrderListByAddress(String address);
}

View File

@@ -185,9 +185,8 @@ public class InstructionServiceImpl implements IInstructionService {
}
return sb.toString();
}
// 单… 的解析/入库在 jd 工程内较复杂,这里仅返回模板校验结果
if (input.startsWith("")) {
return "录单模板校验暂未开放(仅支持 慢搜/慢查、录单/慢单 查询)";
return handleDanWriteDb(input);
}
return helpText();
}
@@ -395,6 +394,124 @@ public class InstructionServiceImpl implements IInstructionService {
return s.replaceAll("[\\t ]+", " ").replaceAll("\n{3,}", "\n\n").trim();
}
// ===== “单 …” 写库 =====
private String handleDanWriteDb(String input) {
// 与 JDUtil.parseOrderFromText 一致的模板字段
JDOrder order = parseOrderFromText(input.trim().replace("", ""));
// 字段校验并返回缺失项
StringBuilder missing = new StringBuilder();
if (isEmpty(order.getOrderId())) missing.append("单号\n");
if (isEmpty(order.getBuyer())) missing.append("下单人\n");
if (order.getPaymentAmount() == null || order.getPaymentAmount() == 0) missing.append("下单价格\n");
if (order.getRebateAmount() == null) missing.append("后返金额\n");
if (isEmpty(order.getLogisticsLink())) missing.append("物流链接\n");
if (isEmpty(order.getAddress())) missing.append("收货地址\n");
if (isEmpty(order.getModelNumber())) missing.append("型号\n");
if (missing.length() > 0) {
String warn = "[炸弹] [炸弹] [炸弹] 录单警告!!! \n缺少表单字段 \n" + missing;
return warn;
}
// 地址重复提示(不阻断写入,与 JDUtil 提示一致)
List<JDOrder> byAddress = jdOrderService.selectJDOrderListByAddress(order.getAddress());
if (byAddress != null && !byAddress.isEmpty()) {
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String latest = sdf.format(byAddress.get(0).getOrderTime());
// 仅提示
}
// 按 remark 判断新增/更新
JDOrder exists = jdOrderService.selectJDOrderByRemark(order.getRemark());
String info;
if (exists != null) {
order.setId(exists.getId());
jdOrderService.updateJDOrder(order);
info = "更新成功";
} else {
jdOrderService.insertJDOrder(order);
info = "新增成功";
}
StringBuilder sb = new StringBuilder();
String distributionMark2 = "";
if (!isEmpty(order.getDistributionMark())) {
if (order.getDistributionMark().startsWith("H")) distributionMark2 = "鸿";
else if (order.getDistributionMark().startsWith("F")) distributionMark2 = "";
}
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd");
sb.append(order.getRemark()).append('\t')
.append(order.getOrderId()).append('\t')
.append(sdf.format(order.getOrderTime())).append('\t')
.append(order.getModelNumber()).append('\t')
.append(order.getAddress()).append('\t')
.append(order.getLogisticsLink()).append('\t')
.append('\t').append(order.getBuyer()).append('\t')
.append(nvl(order.getPaymentAmount())).append('\t')
.append(nvl(order.getRebateAmount())).append('\t')
.append(distributionMark2);
return info + "\n" + sb;
}
private boolean isEmpty(String s) { return s == null || s.isEmpty(); }
// 参照 JDUtil.parseOrderFromText
private JDOrder parseOrderFromText(String input) {
input = input.replaceAll("\\s+", " ").trim();
Map<String, String> fields = new HashMap<>();
extractField(input, fields, "单:", "备注:");
extractField(input, fields, "备注:", "分销标记:");
extractField(input, fields, "分销标记:", "型号:");
extractField(input, fields, "型号:", "链接:");
extractField(input, fields, "链接:", "下单付款:");
extractField(input, fields, "下单付款:", "后返金额:");
extractField(input, fields, "后返金额:", "地址:");
extractField(input, fields, "地址:", "物流链接:");
extractField(input, fields, "物流链接:", "订单号:");
extractField(input, fields, "订单号:", "下单人:");
java.util.regex.Pattern buyerPattern = java.util.regex.Pattern.compile("下单人:\\s*(.*?)\\s*(?=单:|\\Z)", java.util.regex.Pattern.DOTALL);
java.util.regex.Matcher buyerMatcher = buyerPattern.matcher(input);
if (buyerMatcher.find()) {
fields.put("下单人", buyerMatcher.group(1).trim());
}
JDOrder order = new JDOrder();
order.setRemark(fields.getOrDefault("", null));
order.setDistributionMark(fields.getOrDefault("分销标记", null));
order.setModelNumber(fields.getOrDefault("型号", null));
order.setLink(fields.getOrDefault("链接", null));
order.setStatus(fields.getOrDefault("备注", null));
try { order.setPaymentAmount(Double.parseDouble(fields.getOrDefault("下单付款", "0"))); } catch (Exception ignore) {}
try { order.setRebateAmount(Double.parseDouble(fields.getOrDefault("后返金额", "0"))); } catch (Exception ignore) {}
order.setAddress(fields.getOrDefault("地址", null));
order.setLogisticsLink(extractFirstUrl(fields.getOrDefault("物流链接", "")));
order.setOrderId(fields.getOrDefault("订单号", null));
order.setBuyer(fields.getOrDefault("下单人", null));
try {
String dateStr = fields.getOrDefault("", "").split(" ")[0];
java.text.SimpleDateFormat sdf2 = new java.text.SimpleDateFormat("yyyy-MM-dd");
order.setOrderTime(sdf2.parse(dateStr));
} catch (Exception e) { order.setOrderTime(new Date()); }
return order;
}
private void extractField(String input, Map<String, String> map, String startKeyword, String endKeyword) {
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(startKeyword + "\\s*(.*?)\\s*(?=" + endKeyword + "|\\Z)", java.util.regex.Pattern.DOTALL);
java.util.regex.Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
String value = matcher.group(1).trim().replaceAll("^" + startKeyword, "").trim();
map.put(startKeyword.replace("", ""), value);
}
}
private String extractFirstUrl(String text) {
if (text == null || text.isEmpty()) return null;
java.util.regex.Pattern urlPattern = java.util.regex.Pattern.compile("(https?://[^\\s]+)");
java.util.regex.Matcher matcher = urlPattern.matcher(text);
return matcher.find() ? matcher.group(0) : null;
}
private String handleTransferLike(String input) {
// 前端仍复用已有 /jarvis/jdorder/generatePromotionContent 接口,这里仅提供一个回显占位
return "指令入口:请在\"一键转链\"页面使用(输入文案/链接后点生成)";

View File

@@ -23,6 +23,26 @@ public class JDOrderServiceImpl implements IJDOrderService {
public JDOrder selectJDOrderById(Long id) {
return jdOrderMapper.selectJDOrderById(id);
}
@Override
public int insertJDOrder(JDOrder jdOrder) {
return jdOrderMapper.insertJDOrder(jdOrder);
}
@Override
public int updateJDOrder(JDOrder jdOrder) {
return jdOrderMapper.updateJDOrder(jdOrder);
}
@Override
public JDOrder selectJDOrderByRemark(String remark) {
return jdOrderMapper.selectJDOrderByRemark(remark);
}
@Override
public List<JDOrder> selectJDOrderListByAddress(String address) {
return jdOrderMapper.selectJDOrderListByAddress(address);
}
}

View File

@@ -56,6 +56,50 @@
where id = #{id}
</select>
<insert id="insertJDOrder" parameterType="JDOrder" useGeneratedKeys="true" keyProperty="id">
insert into jd_order (
remark, distribution_mark, model_number, link,
payment_amount, rebate_amount, address, logistics_link,
order_id, buyer, order_time, create_time, update_time, status
) values (
#{remark}, #{distributionMark}, #{modelNumber}, #{link},
#{paymentAmount}, #{rebateAmount}, #{address}, #{logisticsLink},
#{orderId}, #{buyer}, #{orderTime}, now(), now(), #{status}
)
</insert>
<update id="updateJDOrder" parameterType="JDOrder">
update jd_order
<set>
<if test="remark != null"> remark = #{remark},</if>
<if test="distributionMark != null"> distribution_mark = #{distributionMark},</if>
<if test="modelNumber != null"> model_number = #{modelNumber},</if>
<if test="link != null"> link = #{link},</if>
<if test="paymentAmount != null"> payment_amount = #{paymentAmount},</if>
<if test="rebateAmount != null"> rebate_amount = #{rebateAmount},</if>
<if test="address != null"> address = #{address},</if>
<if test="logisticsLink != null"> logistics_link = #{logisticsLink},</if>
<if test="orderId != null"> order_id = #{orderId},</if>
<if test="buyer != null"> buyer = #{buyer},</if>
<if test="orderTime != null"> order_time = #{orderTime},</if>
<if test="status != null"> status = #{status},</if>
update_time = now()
</set>
where id = #{id}
</update>
<select id="selectJDOrderByRemark" parameterType="string" resultMap="JDOrderResult">
<include refid="selectJDOrderBase"/>
where remark = #{remark}
limit 1
</select>
<select id="selectJDOrderListByAddress" parameterType="string" resultMap="JDOrderResult">
<include refid="selectJDOrderBase"/>
where address = #{address}
order by order_time desc
</select>
</mapper>