Files
subtrack/internal/web/templates/pages/package_form.html
T
subtrack bb923aab4d
build / build-and-test (push) Successful in 3m41s
fix(v1.8.2): 套餐计费方式切换时的显示/隐藏与默认值修复
按「any → 包时 / 按次 / 包赛季」规则检查后修复 3 处问题:

1) 包赛季套餐编辑时「按日」也被勾中
   - 赛季套餐在库里 unit='day' + season=1,模板只判断了 unit,导致按日/赛季两个 radio 都带 checked
   - 修正为「unit=day 且非赛季」才勾中按日

2) 客户开通表单:选中包赛季时仍显示且必填「开始日」
   - 赛季起止由套餐决定,开始日应隐藏
   - 表单加 data-start-wrap,JS 在赛季模式隐藏并取消 required,切回其它模式恢复

3) 按次开通时没有带出套餐默认有效期
   - 套餐选项新增 data-validity,选中按次且终止日为空时,自动按「开始日 + 默认有效期 - 1」带出到期日,仍可手改

现状(已逐项验证):
- 包时:默认量单位「天」,无有效期/赛季字段
- 按次:默认量单位「次」,显示「按次默认有效期(天)」,开单自动带出到期日
- 包赛季:显示赛季开始日/结束日(必填),隐藏默认量有效期与开始日;过期套餐下拉置灰

测试:
- 转换专项 10 项全过:三种模式的勾选状态、字段显示、按日→按次→赛季→按日 往返保存均正常
- 数据库未改动结构,往返保存后 unit/season/season_start/season_end 值正确
- 版本号 1.8.2
2026-10-19 19:57:12 +08:00

81 lines
4.1 KiB
HTML

{{define "content"}}
<div class="page narrow">
<header class="page-head">
<div>
<h1>{{if .D.IsNew}}新增套餐{{else}}编辑套餐{{end}}</h1>
<p class="muted">按日套餐用起止日期计算剩余天数;按次套餐记录剩余次数。</p>
</div>
</header>
<form method="post" class="form card" data-package-form
action="{{if .D.IsNew}}/packages{{else}}/packages/{{.D.Package.ID}}/edit{{end}}">
<label class="field"><span>套餐名称 <i>*</i></span>
<input name="name" required maxlength="32" value="{{.D.Package.Name}}" placeholder="例如 包月日常 / 赛季深渊 / 10 次副本">
</label>
<fieldset class="field">
<span>计费方式 <i>*</i></span>
<div class="radios">
<label><input type="radio" name="unit" value="day"{{if and (eq .D.Package.Unit "day") (not .D.Package.Season)}} checked{{end}}>
<b>按日</b><small>有开始日与结束日,每天一条待打任务,可打卡</small></label>
<label><input type="radio" name="unit" value="count"{{if and (eq .D.Package.Unit "count") (not .D.Package.Season)}} checked{{end}}>
<b>按次</b><small>记录剩余次数,排期完成时自动扣 1 次,有效期可选</small></label>
<label><input type="radio" name="unit" value="season"{{if .D.Package.Season}} checked{{end}}>
<b>包赛季</b><small>整段赛季一次完成;赛季结束日过后不能再开通</small></label>
</div>
</fieldset>
<div class="grid-2" data-season-wrap hidden>
<label class="field"><span>赛季开始日 <i>*</i></span><input type="date" name="season_start" value="{{.D.Package.SeasonStart}}"></label>
<label class="field"><span>赛季结束日 <i>*</i></span><input type="date" name="season_end" value="{{.D.Package.SeasonEnd}}"></label>
</div>
<div class="grid-2" data-validity-wrap hidden>
<label class="field"><span>按次默认有效期(天,0=不限)</span>
<input type="number" name="default_validity_days" min="0" max="3650" value="{{.D.Package.DefaultValidityDays}}">
</label>
</div>
<div class="grid-2">
<label class="field"><span>默认量 <i>*</i></span>
<div class="input-suffix">
<input type="number" name="default_amount" min="1" max="10000" value="{{.D.Package.DefaultAmount}}" required>
<b data-unit-label>{{if eq .D.Package.Unit "count"}}次{{else}}天{{end}}</b>
</div>
</label>
<label class="field"><span>参考价(元,可空)</span>
<input type="number" name="price" min="0" step="1" value="{{if .D.Package.HasPrice}}{{money .D.Package.PriceCents}}{{end}}" placeholder="例如 300">
</label>
</div>
<div class="grid-2">
<label class="field"><span>日历色签</span>
<input type="color" name="color" value="{{.D.Package.Color}}">
</label>
<label class="field"><span>标签(可选)</span>
<input type="text" name="tag" value="{{.D.Package.Tag}}" maxlength="20" list="pkg-tags" placeholder="例如:包月活动托">
<datalist id="pkg-tags">{{range .D.Tags}}<option value="{{.}}"></option>{{end}}</datalist>
<small class="muted">相同标签的套餐在日历里会合并成同一个页签</small>
</label>
<label class="field"><span>排序(小的靠前)</span>
<input type="number" name="sort_order" value="{{.D.Package.SortOrder}}">
</label>
</div>
<label class="check-line">
<input type="checkbox" name="calendar_separate" value="1"{{if .D.Package.CalendarSeparate}} checked{{end}}>
<span>在日历中独立显示<small>勾选后工作台和大屏的日历会为该套餐单独开一个标签页,便于把“每日任务”和其他委托分开看</small></span>
</label>
<label class="field"><span>说明</span>
<textarea name="note" rows="2" maxlength="200" placeholder="套餐包含什么、怎么个打法">{{.D.Package.Note}}</textarea>
</label>
<div class="actions">
<button class="btn btn-primary" type="submit">保存</button>
<a class="btn" href="/packages">取消</a>
</div>
</form>
</div>
{{end}}