profile-backfill.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import { backfillProfile as apiBackfill } from './api.js'
  2. const fieldUsage = require('./profile-field-usage.js')
  3. /**
  4. * 就地补充 → 自动回写个人信息
  5. * @param {Object} opts
  6. * targetType: 'user' | 'member'
  7. * targetId: memberId(targetType=member 时)
  8. * fields: { phone: '138...', birthday: '...' }
  9. * scene: 'activity-signup'(必传,校验字段是否属于本场景)
  10. * prevValues: { phone: '旧值' } 当前人已有值(用于「修改已有值」判定)
  11. * @returns {Promise<Object>} { updatedFields: [], skippedFields: [] }
  12. */
  13. export function backfillProfile(opts) {
  14. return new Promise(function(resolve, reject) {
  15. var scene = opts.scene
  16. var fields = opts.fields || {}
  17. var fieldNames = Object.keys(fields)
  18. if (!scene || fieldNames.length === 0) {
  19. resolve({ updatedFields: [], skippedFields: fieldNames })
  20. return
  21. }
  22. // 1. 场景校验:只回写本场景登记过的字段
  23. var allowedFields = {}
  24. var skippedFields = []
  25. for (var i = 0; i < fieldNames.length; i++) {
  26. var name = fieldNames[i]
  27. var usage = fieldUsage[name]
  28. if (!usage) {
  29. skippedFields.push(name)
  30. continue
  31. }
  32. var inScene = false
  33. var targetsOk = false
  34. for (var j = 0; j < usage.scenes.length; j++) {
  35. var sc = usage.scenes[j]
  36. if (sc.scene === scene) {
  37. inScene = true
  38. if (sc.backfillTarget.indexOf(opts.targetType) >= 0) {
  39. targetsOk = true
  40. }
  41. }
  42. }
  43. if (inScene && targetsOk) {
  44. allowedFields[name] = fields[name]
  45. } else {
  46. skippedFields.push(name)
  47. }
  48. }
  49. if (Object.keys(allowedFields).length === 0) {
  50. resolve({ updatedFields: [], skippedFields: skippedFields })
  51. return
  52. }
  53. // 2. 修改已有值 → 弹确认
  54. var prev = opts.prevValues || {}
  55. var changedNames = []
  56. for (var k in allowedFields) {
  57. var oldVal = prev[k]
  58. var newVal = allowedFields[k]
  59. if (oldVal && oldVal !== newVal && !(newVal === '' && oldVal === newVal)) {
  60. changedNames.push(fieldUsage[k].label)
  61. }
  62. }
  63. function doBackfill() {
  64. apiBackfill({
  65. targetType: opts.targetType,
  66. targetId: opts.targetId || null,
  67. fields: allowedFields
  68. }).then(function(res) {
  69. if (res && res.code === 200) {
  70. // 3. 成功后更新本地缓存
  71. var profile = (res.data && res.data.profile) || {}
  72. if (opts.targetType === 'user') {
  73. var userInfo = uni.getStorageSync('userInfo') || {}
  74. for (var f in allowedFields) {
  75. if (profile[f] !== undefined) {
  76. userInfo[f] = profile[f]
  77. }
  78. }
  79. uni.setStorageSync('userInfo', userInfo)
  80. }
  81. resolve({
  82. updatedFields: (res.data && res.data.updatedFields) || [],
  83. skippedFields: skippedFields
  84. })
  85. } else {
  86. reject(new Error((res && res.message) || '回写失败'))
  87. }
  88. }).catch(function(err) {
  89. reject(err)
  90. })
  91. }
  92. if (changedNames.length > 0) {
  93. uni.showModal({
  94. title: '同步更新资料',
  95. content: '检测到您修改了' + changedNames.join('、') + ',是否同步更新' + (opts.targetType === 'member' ? '该家人的' : '您的') + '个人信息?',
  96. confirmText: '同步更新',
  97. cancelText: '仅本次使用',
  98. success: function(modalRes) {
  99. if (modalRes.confirm) {
  100. doBackfill()
  101. } else {
  102. resolve({ updatedFields: [], skippedFields: skippedFields })
  103. }
  104. }
  105. })
  106. } else {
  107. doBackfill()
  108. }
  109. })
  110. }