diff --git a/pages.json b/pages.json index 4f19b71..c66adbd 100644 --- a/pages.json +++ b/pages.json @@ -1530,8 +1530,13 @@ { "path": "card/share", "style": { - "navigationBarTitleText": "名片分享", - "navigationStyle": "custom" + // #ifdef MP-HARMONY + // 鸿蒙元服务的 web-view 是原生全屏组件, 只能自绘头部(见 share.vue) + "navigationStyle": "custom", + // #endif + // 微信小程序必须用原生导航栏: web-view 会自动排在导航栏下方, + // 若用 custom + cover-view 自绘头部, 头部会浮在 web-view 上遮住名片顶部 + "navigationBarTitleText": "名片分享" } }, { diff --git a/pages_tool/card/admin/contacts.vue b/pages_tool/card/admin/contacts.vue index 12314cf..0c51afb 100644 --- a/pages_tool/card/admin/contacts.vue +++ b/pages_tool/card/admin/contacts.vue @@ -27,7 +27,7 @@ - + {{ item.name }} {{ item.source_text }} @@ -42,9 +42,9 @@ 已归档 - 编辑 - 转为潜在客户 - 删除 + 编辑 + 转为潜在客户 + 删除 @@ -116,7 +116,27 @@ export default { }, goSelf() {}, // 编辑页共用 contact-edit; from=admin 时保存后回本页(见 contact-edit.vue#backToList) - goEdit(id) { + /** + * 取事件对应的行数据。小程序端 v-for 内联传对象会丢参, 统一 :data-index + 不传参。 + * 兼容: 无参(新建) / 事件对象(data-index) / 直接 id。 + */ + resolveItem(payload) { + if (payload == null) return null; + if (typeof payload === 'number' || typeof payload === 'string') return null; + const ds = payload.currentTarget && payload.currentTarget.dataset; + if (ds) { + const i = Number(ds.index); + if (!isNaN(i) && this.list[i]) return this.list[i]; + } + return payload.id ? payload : null; + }, + goEdit(payload) { + let id = payload; + if (payload && payload.currentTarget) { + const i = Number(payload.currentTarget.dataset.index); + const item = this.list[i]; + id = item ? item.id : ''; + } const url = id ? '/pages_tool/card/contact-edit?from=admin&id=' + id : '/pages_tool/card/contact-edit?from=admin'; @@ -163,7 +183,9 @@ export default { } }); }, - convertToLead(item) { + convertToLead(payload) { + const item = this.resolveItem(payload); + if (!item) return; uni.showModal({ title: '转为潜在客户', content: '将「' + (item.name || '') + '」转入潜在客户跟进?人脉记录会保留。', @@ -192,7 +214,9 @@ export default { } }); }, - delContact(item) { + delContact(payload) { + const item = this.resolveItem(payload); + if (!item) return; // 真删不可恢复, 二次确认 uni.showModal({ title: '删除人脉', diff --git a/pages_tool/card/admin/leads.vue b/pages_tool/card/admin/leads.vue index 0e9ed02..96d6900 100644 --- a/pages_tool/card/admin/leads.vue +++ b/pages_tool/card/admin/leads.vue @@ -39,7 +39,7 @@ 复制微信 - 更新状态 + 更新状态 @@ -143,7 +143,33 @@ export default { } }); }, - changeStatus(item, index) { + /** + * 取事件对应的行数据。小程序端 v-for 内联传对象会丢参, 统一 :data-index + 不传参。 + * 兼容: 事件对象(data-index) / 数字索引 / 行对象本身。 + */ + resolveItem(payload) { + if (payload == null) return null; + if (typeof payload === 'number') return this.list[payload] || null; + const ds = payload.currentTarget && payload.currentTarget.dataset; + if (ds) { + const i = Number(ds.index); + if (!isNaN(i) && this.list[i]) return this.list[i]; + } + return payload.id ? payload : null; + }, + changeStatus(payload) { + let item, index; + if (payload && payload.currentTarget) { + index = Number(payload.currentTarget.dataset.index); + item = this.list[index]; + } else if (typeof payload === 'number') { + index = payload; + item = this.list[index]; + } else { + item = payload; + index = this.list.indexOf(item); + } + if (!item) return; uni.showActionSheet({ itemList: LEAD_STATUS.map(s => s.label), success: res => { diff --git a/pages_tool/card/admin/manage.vue b/pages_tool/card/admin/manage.vue index 9c0a66d..4ef1c4c 100644 --- a/pages_tool/card/admin/manage.vue +++ b/pages_tool/card/admin/manage.vue @@ -25,8 +25,8 @@ - + {{ avatarText(item.name) }} @@ -41,8 +41,8 @@ {{ sourceLabel(item) }} - 编辑 - 详情 + 编辑 + 详情 @@ -159,14 +159,30 @@ export default { }, /* ---------- 导航 ---------- */ + /** + * 取事件对应的行数据。小程序端 v-for 内联传对象(如 goDetail(item))会丢参, + * 统一改为 :data-index + 不传参, 这里从 dataset 取索引回表。 + */ + resolveItem(payload) { + if (payload == null) return null; + if (typeof payload === 'number') return this.list[payload] || null; + const ds = payload.currentTarget && payload.currentTarget.dataset; + if (ds) { + const i = Number(ds.index); + if (!isNaN(i) && this.list[i]) return this.list[i]; + } + return payload.card_id ? payload : null; + }, // 名片路由参数一律 card_id(字符串), encodeURIComponent 幂等 - goDetail(item) { + goDetail(payload) { + const item = this.resolveItem(payload); if (!item || !item.card_id) return; uni.navigateTo({ url: '/pages_tool/card/detail?card_id=' + encodeURIComponent(item.card_id) }); }, - goEdit(item) { + goEdit(payload) { + const item = this.resolveItem(payload); if (!item || !item.card_id) return; uni.navigateTo({ url: '/pages_tool/card/edit?card_id=' + encodeURIComponent(item.card_id) diff --git a/pages_tool/card/contacts.vue b/pages_tool/card/contacts.vue index 53923c2..6ce953c 100644 --- a/pages_tool/card/contacts.vue +++ b/pages_tool/card/contacts.vue @@ -41,9 +41,9 @@ 已归档 - 编辑 - 转为潜在客户 - 删除 + 编辑 + 转为潜在客户 + 删除 @@ -102,7 +102,28 @@ export default { goLeads() { this.$util.redirectTo('/pages_tool/card/leads'); }, - goEdit(id) { + /** + * 取事件对应的行数据。小程序端 v-for 内联传对象(如 convertToLead(item))会丢参, + * 统一改为 :data-index + 不传参, 这里从 dataset 取索引回表。 + * 兼容: 无参(新建) / 事件对象(data-index) / 直接 id。 + */ + resolveItem(payload) { + if (payload == null) return null; + if (typeof payload === 'number') return this.list[payload] || null; + const ds = payload.currentTarget && payload.currentTarget.dataset; + if (ds) { + const i = Number(ds.index); + if (!isNaN(i) && this.list[i]) return this.list[i]; + } + return payload.id ? payload : null; + }, + goEdit(payload) { + let id = payload; + if (payload && payload.currentTarget) { + const i = Number(payload.currentTarget.dataset.index); + const item = this.list[i]; + id = item ? item.id : ''; + } const url = id ? '/pages_tool/card/contact-edit?id=' + id : '/pages_tool/card/contact-edit'; this.$util.redirectTo(url); }, @@ -150,7 +171,9 @@ export default { } }); }, - convertToLead(item) { + convertToLead(payload) { + const item = this.resolveItem(payload); + if (!item) return; uni.showModal({ title: '转为潜在客户', content: '将「' + (item.name || '') + '」转入潜在客户跟进?人脉记录会保留。', @@ -178,7 +201,9 @@ export default { } }); }, - delContact(item) { + delContact(payload) { + const item = this.resolveItem(payload); + if (!item) return; uni.showModal({ title: '删除人脉', content: '删除后不可恢复,确定删除「' + (item.name || '') + '」?', diff --git a/pages_tool/card/exchange.vue b/pages_tool/card/exchange.vue index 9063a4d..b4a61a4 100644 --- a/pages_tool/card/exchange.vue +++ b/pages_tool/card/exchange.vue @@ -10,9 +10,9 @@ - + - + {{ item.name.charAt(0) }} @@ -26,7 +26,7 @@ {{ item.company }} - 同意 + 同意 已同意 @@ -110,8 +110,23 @@ export default { } }); }, + /** + * 取事件对应的行数据。小程序端 v-for 内联传对象(viewCard(item))会丢参, + * 统一改为 :data-index + 不传参, 这里从 dataset 取索引回表。 + */ + resolveItem(payload) { + if (payload == null) return null; + if (typeof payload === 'number') return this.shownList[payload] || null; + const ds = payload.currentTarget && payload.currentTarget.dataset; + if (ds) { + const i = Number(ds.index); + if (!isNaN(i) && this.shownList[i]) return this.shownList[i]; + } + return payload.id ? payload : null; + }, // 点对方名片 → 跳转对方名片详情(用 from_card_id 字符串) - viewCard(item) { + viewCard(payload) { + const item = this.resolveItem(payload); if (!item || !item.from_card_id) return; uni.navigateTo({ url: '/pages_tool/card/detail?card_id=' + encodeURIComponent(item.from_card_id) @@ -154,7 +169,9 @@ export default { return ''; // #endif }, - onAgree(item) { + onAgree(payload) { + const item = this.resolveItem(payload); + if (!item) return; this.$cardApi.exchangeAgree({ data: { id: item.id }, success: res => { diff --git a/pages_tool/card/leads.vue b/pages_tool/card/leads.vue index f88b8e3..8d3fee6 100644 --- a/pages_tool/card/leads.vue +++ b/pages_tool/card/leads.vue @@ -19,7 +19,7 @@ - + {{ item.name || '未留姓名' }} {{ item.status_text || '新客户' }} @@ -36,7 +36,7 @@ 复制微信 - 更新状态 + 更新状态 @@ -127,7 +127,33 @@ export default { } }); }, - changeStatus(item, index) { + /** + * 取事件对应的行数据。小程序端 v-for 内联传对象会丢参, 统一 :data-index + 不传参。 + * 兼容: 事件对象(data-index) / 数字索引 / 行对象本身。 + */ + resolveItem(payload) { + if (payload == null) return null; + if (typeof payload === 'number') return this.list[payload] || null; + const ds = payload.currentTarget && payload.currentTarget.dataset; + if (ds) { + const i = Number(ds.index); + if (!isNaN(i) && this.list[i]) return this.list[i]; + } + return payload.id ? payload : null; + }, + changeStatus(payload) { + let item, index; + if (payload && payload.currentTarget) { + index = Number(payload.currentTarget.dataset.index); + item = this.list[index]; + } else if (typeof payload === 'number') { + index = payload; + item = this.list[index]; + } else { + item = payload; + index = this.list.indexOf(item); + } + if (!item) return; uni.showActionSheet({ itemList: STATUS_MAP.map(s => s.label), success: res => { @@ -173,13 +199,14 @@ export default { // 点整条客户卡片 → 打开对方名片 // 与交换名片(exchange.vue)同款写法: detail 接收 card_id(卡片编号字符串); // 本人名下的卡 → 正常详情页; 非本人名下 → detail 兜底跳公开名片页(后端返回的 wap_url) - viewCard(item) { + viewCard(payload) { + const item = this.resolveItem(payload); const cardId = this.cardIdOf(item); if (!cardId) { // 后端 lead/lists 目前只下发 card_name(展示名), 没有名片编号 → 无法跳转。 // 这里把该行真实字段打到控制台, 便于确认后端是否用了别的字段名(如 relation_id) console.warn('[card/leads] 该行缺少名片编号(card_id/from_card_id/source_card_id), 无法打开对方名片; 可用字段:', - item ? Object.keys(item) : item, item); + item ? Object.keys(item) : 'event', item); uni.showToast({ title: '该客户未关联名片,无法查看', icon: 'none' }); return; } diff --git a/pages_tool/card/share.vue b/pages_tool/card/share.vue index 742640a..da78def 100644 --- a/pages_tool/card/share.vue +++ b/pages_tool/card/share.vue @@ -1,7 +1,7 @@