74 lines
3.1 KiB
Go
74 lines
3.1 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
"freight-sfa-server/internal/auth"
|
|
)
|
|
|
|
// 默认选项字典(与前端 DEFAULT_OPTIONS 保持一致)
|
|
var defaultOptions = map[string][]string{
|
|
"clientType": {"同行货代", "国内直客(工厂/外贸)", "国外收货人", "国外海外代理", "供应商"},
|
|
"grade": {"A级核心", "B级重要", "C级普通"},
|
|
"flowStatus": {"待联系", "初次沟通", "询价中", "报价跟进", "谈判中", "已合作", "维护期", "流失"},
|
|
"source": {"陌拜", "展会", "网站询盘", "老客介绍", "LinkedIn", "微信群", "阿里国际站", "Made-in-China", "其他"},
|
|
"risk": {"账期超长", "付款拖延", "价格敏感", "纠纷历史", "资金紧张", "船期变动频繁"},
|
|
"customTags": {"VIP", "战略合作"},
|
|
"yesno": {"是", "否"},
|
|
"incoterm": {"FOB", "CIF", "CFR", "DDP", "DDU", "EXW", "DAP"},
|
|
"transport": {"直达", "中转"},
|
|
"containerType": {"20GP", "40GP", "40HQ", "45HQ", "20RF", "40RF", "特种柜", "散货"},
|
|
"inquiryStatus": {"询价中", "已报价", "确认订舱", "实单出货", "丢单"},
|
|
"lossReason": {"价格偏高", "船期不合适", "竞争对手胜出", "客户暂缓", "目的港服务不佳", "客户选择直签"},
|
|
"bookingStatus": {"待订舱", "已订舱", "已截关", "已开船", "已到港", "已清关", "已派送", "已完成", "异常"},
|
|
"currency": {"CNY", "USD", "EUR", "HKD"},
|
|
"paymentStatus": {"待回款", "已开票", "部分回款", "已回款", "逾期"},
|
|
"followupMethod": {"电话", "微信", "邮件", "面谈", "视频会议", "其他"},
|
|
"followupResult": {"继续跟进", "待报价", "待确认订舱", "已完成", "客户暂缓", "丢单"},
|
|
"peijiaList": {"+1庄家", "待补充"},
|
|
"ddpList": {"+1DDP", "待补充"},
|
|
}
|
|
|
|
func (s *Server) getOptions(w http.ResponseWriter, r *http.Request) {
|
|
var raw string
|
|
err := s.db.QueryRow(`SELECT data_json FROM options WHERE id=1`).Scan(&raw)
|
|
if err != nil {
|
|
// 未初始化:返回默认并落库
|
|
rawBytes, _ := json.Marshal(defaultOptions)
|
|
_, _ = s.db.Exec(`INSERT OR IGNORE INTO options (id, data_json, updated_at) VALUES (1,?,?)`,
|
|
string(rawBytes), nowStr())
|
|
raw = string(rawBytes)
|
|
}
|
|
var m map[string][]string
|
|
if json.Unmarshal([]byte(raw), &m) != nil {
|
|
m = defaultOptions
|
|
}
|
|
// 补全缺失的键
|
|
for k, v := range defaultOptions {
|
|
if _, ok := m[k]; !ok || m[k] == nil {
|
|
m[k] = v
|
|
}
|
|
}
|
|
writeJSON(w, http.StatusOK, m)
|
|
}
|
|
|
|
func (s *Server) updateOptions(w http.ResponseWriter, r *http.Request) {
|
|
if auth.Role(r) != "admin" {
|
|
writeErr(w, http.StatusForbidden, "仅管理员可修改选项")
|
|
return
|
|
}
|
|
var m map[string][]string
|
|
if err := decodeJSON(r, &m); err != nil {
|
|
writeErr(w, http.StatusBadRequest, "请求格式错误")
|
|
return
|
|
}
|
|
raw, _ := json.Marshal(m)
|
|
if _, err := s.db.Exec(`UPDATE options SET data_json=?, updated_at=? WHERE id=1`, string(raw), nowStr()); err != nil {
|
|
writeErr(w, http.StatusInternalServerError, "保存失败")
|
|
return
|
|
}
|
|
s.auditLog(r, "update", "options", "", "")
|
|
writeJSON(w, http.StatusOK, m)
|
|
}
|