竞选规则与名簿
票数规则
表 campaign_rule_weights:(campaign_id, department, position) → weight。
匹配时对部门和职位做 TRIM,要求与用户资料完全相等(不是模糊匹配)。无行则 DEFAULT_CAMPAIGN_VOTE_WEIGHT = 1。
创建竞选时表单至少一条规则。规则 JSON 解析与去重见 lib/campaign-rule-form-json.ts。
保存规则后应走权重同步:已有 ballots.weight 更新;若该票已有 ballot_allocations,按新总票数比例缩放(lib/ballot-allocation-scale.ts)。
固定部门 / 职位选项
下拉默认值在 lib/user-org-options.ts:
- 部门:文娱部、事务部、技术部、市场部、影视部、主席团、宣传部、职发部
- 职位:部长、副部长、主席
库中或规则里多出来的值会附在列表后半。规则字符串必须与用户资料一致,例如不要一个写「技术部」、一个写「Tech」。
候选人名簿
- 每行一个展示名;空行忽略。
- 同场去空白、忽略大小写后不能重复。
- 投票和计票都针对
campaign_candidate_options.id。 - 全量替换:先 DELETE 再 INSERT。关联分票级联删除。
不要依赖的开关
candidateCanVote / candidateHasVote 服务端恒为 false。code / candidateCode 仍查重,但没有加入页读取它们。