节点表单:参与人直接勾选 + 起点终点记录详细地址(批 13)
参与人(用户反馈:不想等全部填完、保存之后才回详情页加人):
- 节点表单里新增「参与人(直接勾选)」区块:家庭成员按胶囊复选框列出,
保存即生效;编辑时预勾选已有人。
- Members::syncForNode() 只做增删,**不动留下来的那些人的情绪 / 签到 /
角色标签**(重新勾一遍不该把之前记的心情清掉)。
- 安全性:新增走 Members::save(),逐条校验「用户属于该活动所在家庭」,
夹带别家 user_id 进不来;只有请求带 members_present=1(表单确实渲染了
参与人区块)才同步 —— 否则没这个字段的请求会把已有成员清空。
起点/终点记录详细地址(用户反馈:高德联想只返回简化地名):
- 联想项选中后不再是「青岛北站」就完事:
① 有坐标 → 逆地理编码(AMap.Geocoder.getAddress)取该点的
formattedAddress;
② 没坐标 → 按「区县 + 名称」正查,顺带把坐标补回来。
- 详细地址写进 start/end_location 的 address 字段,输入框下方实时显示
「详细地址:…」,节点详情页本来就展示这一项。
- 路线地图补点(只有地名没坐标时)改为**优先用详细地址**查询,
比简化地名定位准。
已验证:本地全链 12 步全绿(渲染检查 350 项、真 AMap 浏览器验证 11 项、
表单交互 75 项);远端 e2e 350 项 0 失败(新增 10 项:勾选落库 / 跨家庭
拒绝 / 取消勾选移出 / 情绪不被清 / 无标记不动参与人);部署静态断言、
双 PHP 渲染、内容断言全过后提交。
This commit is contained in:
@@ -166,6 +166,48 @@ class Members
|
||||
$stmt->execute([$nodeId, $userId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 勾选式同步:把节点参与人「对齐」成 $userIds(节点表单里直接勾选用)。
|
||||
*
|
||||
* 只做增删 —— 留下来的人的情绪 / 签到 / 角色标签**一律不动**(编辑节点时
|
||||
* 重新勾一遍参与人不该把之前记的心情清掉)。新增走 save(),
|
||||
* 家庭归属校验与「一键加入」那条链路完全一致。
|
||||
*
|
||||
* @return array{added:int, removed:int}
|
||||
*/
|
||||
public static function syncForNode(int $nodeId, array $userIds): array
|
||||
{
|
||||
$db = Database::get();
|
||||
|
||||
$want = [];
|
||||
foreach ($userIds as $uid) {
|
||||
$uid = (int)$uid;
|
||||
if ($uid > 0 && !in_array($uid, $want, true)) {
|
||||
$want[] = $uid;
|
||||
}
|
||||
}
|
||||
|
||||
$stmt = $db->prepare('SELECT user_id FROM node_members WHERE trip_node_id = ?');
|
||||
$stmt->execute([$nodeId]);
|
||||
$have = [];
|
||||
foreach ($stmt->fetchAll(\PDO::FETCH_COLUMN) as $uid) {
|
||||
$have[] = (int)$uid;
|
||||
}
|
||||
|
||||
$added = 0;
|
||||
$removed = 0;
|
||||
foreach (array_diff($have, $want) as $uid) {
|
||||
self::remove($nodeId, (int)$uid);
|
||||
$removed++;
|
||||
}
|
||||
foreach (array_diff($want, $have) as $uid) {
|
||||
if (self::save($nodeId, (int)$uid, [], '', null)['ok']) {
|
||||
$added++;
|
||||
}
|
||||
}
|
||||
return ['added' => $added, 'removed' => $removed];
|
||||
}
|
||||
|
||||
/** 一次把一批人加进节点(用于「把活动成员一键全部加入」) */
|
||||
public static function addMany(int $nodeId, array $userIds, array $roleTagIds = []): int
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user