Browse Source

feat: 注册引导-回写工具profile-backfill

Xiaogang Liao 1 tháng trước cách đây
mục cha
commit
bc9fbfef9a
1 tập tin đã thay đổi với 116 bổ sung0 xóa
  1. 116 0
      cfc-frontend/utils/profile-backfill.js

+ 116 - 0
cfc-frontend/utils/profile-backfill.js

@@ -0,0 +1,116 @@
+import { backfillProfile as apiBackfill } from './api.js'
+const fieldUsage = require('./profile-field-usage.js')
+
+/**
+ * 就地补充 → 自动回写个人信息
+ * @param {Object} opts
+ *   targetType: 'user' | 'member'
+ *   targetId:   memberId(targetType=member 时)
+ *   fields:     { phone: '138...', birthday: '...' }
+ *   scene:      'activity-signup'(必传,校验字段是否属于本场景)
+ *   prevValues: { phone: '旧值' } 当前人已有值(用于「修改已有值」判定)
+ * @returns {Promise<Object>} { updatedFields: [], skippedFields: [] }
+ */
+export function backfillProfile(opts) {
+  return new Promise(function(resolve, reject) {
+    var scene = opts.scene
+    var fields = opts.fields || {}
+    var fieldNames = Object.keys(fields)
+    if (!scene || fieldNames.length === 0) {
+      resolve({ updatedFields: [], skippedFields: fieldNames })
+      return
+    }
+
+    // 1. 场景校验:只回写本场景登记过的字段
+    var allowedFields = {}
+    var skippedFields = []
+    for (var i = 0; i < fieldNames.length; i++) {
+      var name = fieldNames[i]
+      var usage = fieldUsage[name]
+      if (!usage) {
+        skippedFields.push(name)
+        continue
+      }
+      var inScene = false
+      var targetsOk = false
+      for (var j = 0; j < usage.scenes.length; j++) {
+        var sc = usage.scenes[j]
+        if (sc.scene === scene) {
+          inScene = true
+          if (sc.backfillTarget.indexOf(opts.targetType) >= 0) {
+            targetsOk = true
+          }
+        }
+      }
+      if (inScene && targetsOk) {
+        allowedFields[name] = fields[name]
+      } else {
+        skippedFields.push(name)
+      }
+    }
+
+    if (Object.keys(allowedFields).length === 0) {
+      resolve({ updatedFields: [], skippedFields: skippedFields })
+      return
+    }
+
+    // 2. 修改已有值 → 弹确认
+    var prev = opts.prevValues || {}
+    var changedNames = []
+    for (var k in allowedFields) {
+      var oldVal = prev[k]
+      var newVal = allowedFields[k]
+      if (oldVal && oldVal !== newVal && !(newVal === '' && oldVal === newVal)) {
+        changedNames.push(fieldUsage[k].label)
+      }
+    }
+
+    function doBackfill() {
+      apiBackfill({
+        targetType: opts.targetType,
+        targetId: opts.targetId || null,
+        fields: allowedFields
+      }).then(function(res) {
+        if (res && res.code === 200) {
+          // 3. 成功后更新本地缓存
+          var profile = (res.data && res.data.profile) || {}
+          if (opts.targetType === 'user') {
+            var userInfo = uni.getStorageSync('userInfo') || {}
+            for (var f in allowedFields) {
+              if (profile[f] !== undefined) {
+                userInfo[f] = profile[f]
+              }
+            }
+            uni.setStorageSync('userInfo', userInfo)
+          }
+          resolve({
+            updatedFields: (res.data && res.data.updatedFields) || [],
+            skippedFields: skippedFields
+          })
+        } else {
+          reject(new Error((res && res.message) || '回写失败'))
+        }
+      }).catch(function(err) {
+        reject(err)
+      })
+    }
+
+    if (changedNames.length > 0) {
+      uni.showModal({
+        title: '同步更新资料',
+        content: '检测到您修改了' + changedNames.join('、') + ',是否同步更新' + (opts.targetType === 'member' ? '该家人的' : '您的') + '个人信息?',
+        confirmText: '同步更新',
+        cancelText: '仅本次使用',
+        success: function(modalRes) {
+          if (modalRes.confirm) {
+            doBackfill()
+          } else {
+            resolve({ updatedFields: [], skippedFields: skippedFields })
+          }
+        }
+      })
+    } else {
+      doBackfill()
+    }
+  })
+}