Sfoglia il codice sorgente

feat: save contact info to package_orders, keep SVG flow only

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Xiaogang Liao 1 mese fa
parent
commit
c2bd7d68f3

+ 9 - 0
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -7296,5 +7296,14 @@ private void runMigration100() {
 		} catch (Exception e) {
 			log.warn("修改activity_registrations.child_id失败: {}", e.getMessage());
 		}
+		// 迁移119: package_orders表添加联系人字段(产品页下单)
+		try {
+			ensureColumn("package_orders", "contact_name", "VARCHAR(50) COMMENT '联系人姓名'");
+			ensureColumn("package_orders", "contact_phone", "VARCHAR(20) COMMENT '联系人手机号'");
+			ensureColumn("package_orders", "contact_address", "VARCHAR(500) COMMENT '收件地址'");
+			log.info("已完成package_orders表联系人字段添加");
+		} catch (Exception e) {
+			log.warn("添加package_orders联系人字段失败: {}", e.getMessage());
+		}
 	}
 }

+ 6 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/guide/PaymentController.java

@@ -77,6 +77,12 @@ public class PaymentController {
         String orderNo = (String) params.get("orderNo");
         String description = (String) params.get("description");
         Integer amount = (Integer) params.get("amount");
+        String contactName = (String) params.get("contactName");
+        String contactPhone = (String) params.get("contactPhone");
+        String contactAddress = (String) params.get("contactAddress");
+
+        // 保存联系人信息
+        paymentService.saveContactInfo(orderNo, contactName, contactPhone, contactAddress);
 
         Map<String, Object> result = paymentService.createWechatNativePayOrder(orderNo, description, amount);
         return Result.success(result);

+ 7 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/PackageOrder.java

@@ -43,6 +43,10 @@ public class PackageOrder implements Serializable {
 
     private String notifyData;     // 支付回调数据
 
+    private String contactName;     // 联系人姓名
+    private String contactPhone;    // 联系人手机号
+    private String contactAddress;  // 收件地址
+
     private Date createdAt;
 
     private Date updatedAt;
@@ -63,6 +67,9 @@ public class PackageOrder implements Serializable {
     public void setTransactionId(String transactionId) { this.transactionId = transactionId; }
     public void setPaidAt(Date paidAt) { this.paidAt = paidAt; }
     public void setNotifyData(String notifyData) { this.notifyData = notifyData; }
+    public void setContactName(String contactName) { this.contactName = contactName; }
+    public void setContactPhone(String contactPhone) { this.contactPhone = contactPhone; }
+    public void setContactAddress(String contactAddress) { this.contactAddress = contactAddress; }
     public void setCreatedAt(Date createdAt) { this.createdAt = createdAt; }
     public void setUpdatedAt(Date updatedAt) { this.updatedAt = updatedAt; }
 }

+ 26 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/PaymentService.java

@@ -120,6 +120,32 @@ public class PaymentService implements PaymentServiceInterface {
         return createWechatPrepay(orderNo, description, amount, "");
     }
 
+    public void saveContactInfo(String orderNo, String name, String phone, String address) {
+        try {
+            PackageOrder order = packageOrderMapper.selectOne(
+                new LambdaQueryWrapper<PackageOrder>().eq(PackageOrder::getOrderNo, orderNo));
+            if (order == null) {
+                order = new PackageOrder();
+                order.setOrderNo(orderNo);
+                order.setPrice(0);
+                order.setStatus("pending");
+                order.setCreatedAt(new Date());
+                order.setUpdatedAt(new Date());
+            }
+            order.setContactName(name);
+            order.setContactPhone(phone);
+            order.setContactAddress(address);
+            if (order.getId() == null) {
+                packageOrderMapper.insert(order);
+            } else {
+                packageOrderMapper.updateById(order);
+            }
+            log.info("已保存联系人信息: orderNo={}, name={}, phone={}", orderNo, name, phone);
+        } catch (Exception e) {
+            log.warn("保存联系人信息失败: orderNo={}", orderNo, e);
+        }
+    }
+
     @Override
     public Map<String, Object> createWechatNativePayOrder(String orderNo, String description, Integer amount) {
         try {

+ 3 - 0
cfc-backend/src/main/resources/schema.sql

@@ -632,6 +632,9 @@ CREATE TABLE IF NOT EXISTS package_orders (
     transaction_id VARCHAR(64) COMMENT '微信支付订单号',
     paid_at DATETIME COMMENT '支付时间',
     notify_data TEXT COMMENT '支付回调数据',
+    contact_name VARCHAR(50) COMMENT '联系人姓名',
+    contact_phone VARCHAR(20) COMMENT '联系人手机号',
+    contact_address VARCHAR(500) COMMENT '收件地址',
     created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
     updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
     INDEX idx_user_id (user_id),

+ 7 - 8
web/product-intro/gut-testing.html

@@ -170,14 +170,6 @@
 <section>
   <div class="container">
     <h2>检测流程</h2>
-    <ol class="step-list">
-      <li><strong>在线下单</strong> — 完成购买后,检测套件将在24小时内寄出</li>
-      <li><strong>居家采样</strong> — 按照采样指南采集微量粪便样本(约米粒大小),无创无痛</li>
-      <li><strong>样本寄回</strong> — 使用配套的预付费快递包装,将样本寄回实验室</li>
-      <li><strong>实验室检测</strong> — 到样后5个工作日内完成DNA提取、测序和数据分析</li>
-      <li><strong>获取报告</strong> — 电子版报告在线查看,包含详细的检测结果和个性化建议</li>
-    </ol>
-
     <div style="text-align:center;margin:1.5rem 0;">
       <svg viewBox="0 0 400 416" style="max-width:480px;width:100%;height:auto;" role="img" aria-label="肠道菌群检测流程示意图" xmlns="http://www.w3.org/2000/svg">
         <defs>
@@ -370,6 +362,9 @@ function submitOrder() {
   // 生成订单号
   var orderNo = 'GUT' + Date.now() + Math.random().toString(36).substr(2,4).toUpperCase();
   
+  // 保存联系人信息到全局变量,供后续函数使用
+  window._orderContact = { name: name, phone: phone, address: address };
+  
   // 获取openid后进行JSAPI支付
   var openid = getUrlParam('openid');
   if (openid) {
@@ -457,6 +452,7 @@ function getUrlParam(name) {
 }
 
 function fallbackNativePay(orderNo) {
+  var c = window._orderContact || {};
   fetch('/api/payment/wechat/native', {
     method: 'POST',
     headers: { 'Content-Type': 'application/json' },
@@ -464,6 +460,9 @@ function fallbackNativePay(orderNo) {
       orderNo: orderNo,
       description: '肠道菌群基因检测',
       amount: 1,
+      contactName: c.name || '',
+      contactPhone: c.phone || '',
+      contactAddress: c.address || ''
     })
   })
   .then(function(r) { return r.json(); })