123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 |
- package dao
- import (
- "context"
- "fmt"
- "strconv"
- "strings"
- "time"
- model "go-common/app/interface/main/credit/model"
- "go-common/library/database/sql"
- "go-common/library/log"
- "go-common/library/xstr"
- "github.com/pkg/errors"
- )
- const (
- _addBlockedCasesSQL = "INSERT INTO blocked_case(status,mid,operator,origin_content,punish_result,origin_title,origin_type,origin_url,blocked_days,reason_type,relation_id,oper_id,business_time) VALUES %s"
- _insertVoteSQL = "INSERT INTO blocked_case_vote(mid,cid,expired) VALUES(?,?,?)"
- _updateVoteSQL = "INSERT INTO blocked_case_vote(mid,cid,vote) VALUES(?,?,?) ON DUPLICATE KEY UPDATE vote=?"
- _inBlockedCaseApplyLogSQL = "INSERT INTO blocked_case_apply_log(mid,case_id,apply_type,origin_reason,apply_reason) VALUES(?,?,?,?,?)"
- _updateCaseVoteTotalSQL = "UPDATE blocked_case SET %s=%s+? WHERE id=?"
- _getCaseByIDSQL = `SELECT id,mid,status,origin_content,punish_result,origin_title,origin_url,end_time,vote_rule,vote_break,vote_delete,origin_type,reason_type,judge_type,blocked_days,
- put_total,start_time,end_time,operator,ctime,mtime,relation_id,case_type FROM blocked_case WHERE id=? AND status IN (1,3,4,6)`
- _countCaseVoteSQL = "SELECT COUNT(*) FROM blocked_case_vote WHERE mid=? AND vote!=3"
- _isVoteByMIDSQL = "SELECT id FROM blocked_case_vote WHERE mid=? AND cid=? AND vote=0"
- _getVoteInfoSQL = "SELECT id,cid,mid,vote,expired,mtime FROM blocked_case_vote WHERE mid=? AND cid=?"
- _loadMidVoteIDSQL = "SELECT v.cid,c.case_type FROM blocked_case_vote v INNER JOIN blocked_case c ON v.cid=c.id WHERE v.mid =? AND v.ctime >=? ORDER BY v.id DESC"
- _getCaseByIDsSQL = `SELECT id,mid,status,origin_content,punish_result,origin_title,origin_url,end_time,vote_rule,vote_break,vote_delete,origin_type,reason_type,judge_type,blocked_days,
- put_total,start_time,end_time,operator,ctime,mtime,relation_id,case_type FROM blocked_case WHERE id IN(%s) AND status IN (1,3,4,6)`
- _caseRelationIDCountSQL = "SELECT COUNT(*) FROM blocked_case WHERE origin_type=? AND relation_id =?"
- _caseInfoIDsSQL = `SELECT id,mid,status,origin_content,punish_result,origin_title,origin_url,end_time,vote_rule,vote_break,vote_delete,origin_type,reason_type,judge_type,blocked_days,
- put_total,start_time,end_time,operator,ctime,mtime,relation_id,case_type FROM blocked_case WHERE id IN (%s)`
- _caseVotesMIDSQL = "SELECT id,cid,mid,vote,expired,mtime FROM blocked_case_vote WHERE id IN (%s)"
- _caseVoteIDMIDSQL = "SELECT id,cid FROM blocked_case_vote WHERE mid = ? ORDER BY mtime DESC LIMIT ?,?"
- _caseVoteIDTopSQL = "SELECT id,cid FROM blocked_case_vote WHERE mid = ? ORDER BY mtime DESC LIMIT 100"
- )
- // AddBlockedCases batch add blocked cases.
- func (d *Dao) AddBlockedCases(c context.Context, bc []*model.ArgJudgeCase) (err error) {
- l := len(bc)
- valueStrings := make([]string, 0, l)
- valueArgs := make([]interface{}, 0, l*13)
- for _, b := range bc {
- valueStrings = append(valueStrings, "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
- valueArgs = append(valueArgs, strconv.FormatInt(2, 10))
- valueArgs = append(valueArgs, strconv.FormatInt(b.MID, 10))
- valueArgs = append(valueArgs, b.Operator)
- valueArgs = append(valueArgs, b.OContent)
- valueArgs = append(valueArgs, strconv.FormatInt(int64(b.PunishResult), 10))
- valueArgs = append(valueArgs, b.OTitle)
- valueArgs = append(valueArgs, strconv.FormatInt(int64(b.OType), 10))
- valueArgs = append(valueArgs, b.OURL)
- valueArgs = append(valueArgs, strconv.FormatInt(int64(b.BlockedDays), 10))
- valueArgs = append(valueArgs, strconv.FormatInt(int64(b.ReasonType), 10))
- valueArgs = append(valueArgs, b.RelationID)
- valueArgs = append(valueArgs, strconv.FormatInt(b.OperID, 10))
- if b.BCTime != 0 {
- valueArgs = append(valueArgs, b.BCTime)
- } else {
- valueArgs = append(valueArgs, "1979-12-31 16:00:00")
- }
- }
- stmt := fmt.Sprintf(_addBlockedCasesSQL, strings.Join(valueStrings, ","))
- _, err = d.db.Exec(c, stmt, valueArgs...)
- if err != nil {
- log.Error("AddBlockedCases: db.Exec(bc(%+v)) error(%v)", bc, err)
- }
- return
- }
- // InsVote insert user vote.
- func (d *Dao) InsVote(c context.Context, mid int64, cid int64, t int64) (err error) {
- if _, err = d.db.Exec(c, _insertVoteSQL, mid, cid, time.Now().Add(time.Duration(t)*time.Minute)); err != nil {
- log.Error("InsVote: db.Exec(%d,%d) error(%v)", mid, cid, err)
- }
- return
- }
- // Setvote set user vote.
- func (d *Dao) Setvote(c context.Context, mid, cid, vote int64) (err error) {
- if _, err = d.db.Exec(c, _updateVoteSQL, mid, cid, vote, vote); err != nil {
- log.Error("Setvote: db.Exec(%d,%d,%d) error(%v)", mid, cid, vote, err)
- }
- return
- }
- // SetVoteTx set vote info by tx.
- func (d *Dao) SetVoteTx(tx *sql.Tx, mid, cid int64, vote int8) (affect int64, err error) {
- row, err := tx.Exec(_updateVoteSQL, mid, cid, vote, vote)
- if err != nil {
- log.Error("SetVoteTx err(%v)", err)
- return
- }
- return row.LastInsertId()
- }
- // AddCaseReasonApply add case reason apply log.
- func (d *Dao) AddCaseReasonApply(c context.Context, mid, cid int64, applyType, originReason, applyReason int8) (err error) {
- _, err = d.db.Exec(c, _inBlockedCaseApplyLogSQL, mid, cid, applyType, originReason, applyReason)
- if err != nil {
- log.Error("AddCaseReasonApply err(%v)", err)
- return
- }
- return
- }
- // AddCaseVoteTotal add case vote total.
- func (d *Dao) AddCaseVoteTotal(c context.Context, field string, cid int64, voteNum int8) (err error) {
- sql := fmt.Sprintf(_updateCaseVoteTotalSQL, field, field)
- if _, err = d.db.Exec(c, sql, voteNum, cid); err != nil {
- log.Error("AddCaseVoteTotal: db.Exec(%d) error(%v)", cid, err)
- }
- return
- }
- // CaseInfo jury get case info.
- func (d *Dao) CaseInfo(c context.Context, cid int64) (r *model.BlockedCase, err error) {
- row := d.db.QueryRow(c, _getCaseByIDSQL, cid)
- r = &model.BlockedCase{}
- if err = row.Scan(&r.ID, &r.MID, &r.Status, &r.OriginContent, &r.PunishResult, &r.OriginTitle, &r.OriginURL, &r.EndTime, &r.VoteRule, &r.VoteBreak, &r.VoteDelete, &r.OriginType, &r.ReasonType, &r.JudgeType, &r.BlockedDays, &r.PutTotal, &r.StartTime, &r.EndTime, &r.Operator, &r.CTime, &r.MTime, &r.RelationID, &r.CaseType); err != nil {
- if err == sql.ErrNoRows {
- err = nil
- r = nil
- return
- }
- }
- return
- }
- // CountCaseVote jury count case vote total.
- func (d *Dao) CountCaseVote(c context.Context, mid int64) (r int64, err error) {
- row := d.db.QueryRow(c, _countCaseVoteSQL, mid)
- if err = row.Scan(&r); err != nil {
- log.Error("row.Scan() error(%v)", err)
- }
- return
- }
- // IsVote jury user is vote.
- func (d *Dao) IsVote(c context.Context, mid int64, cid int64) (r int64, err error) {
- row := d.db.QueryRow(c, _isVoteByMIDSQL, mid, cid)
- if err = row.Scan(&r); err != nil {
- if err == sql.ErrNoRows {
- r = 0
- err = nil
- } else {
- log.Error("row.Scan() error(%v)", err)
- }
- }
- return
- }
- // VoteInfo jury user get vote info.
- func (d *Dao) VoteInfo(c context.Context, mid int64, cid int64) (r *model.VoteInfo, err error) {
- row := d.db.QueryRow(c, _getVoteInfoSQL, mid, cid)
- r = &model.VoteInfo{}
- if err = row.Scan(&r.ID, &r.CID, &r.MID, &r.Vote, &r.Expired, &r.Mtime); err != nil {
- if err == sql.ErrNoRows {
- err = nil
- r = nil
- }
- }
- return
- }
- // LoadVoteIDsMid load user vote case ids.
- func (d *Dao) LoadVoteIDsMid(c context.Context, mid int64, day int) (cases map[int64]*model.SimCase, err error) {
- now := time.Now()
- t := time.Date(now.Year(), now.Month(), now.Day()-day, 0, 0, 0, 0, now.Location())
- rows, err := d.db.Query(c, _loadMidVoteIDSQL, mid, t)
- if err != nil {
- log.Error("d.db.Query(%d %v) error(%v)", mid, t, err)
- return
- }
- defer rows.Close()
- cases = make(map[int64]*model.SimCase)
- for rows.Next() {
- mcase := &model.SimCase{}
- if err = rows.Scan(&mcase.ID, &mcase.CaseType); err != nil {
- log.Error("rows.Scan error(%v)", err)
- return
- }
- cases[mcase.ID] = mcase
- }
- return
- }
- // CaseVoteIDs get user's vote info by ids.
- func (d *Dao) CaseVoteIDs(c context.Context, ids []int64) (mbc map[int64]*model.BlockedCase, err error) {
- rows, err := d.db.Query(c, fmt.Sprintf(_getCaseByIDsSQL, xstr.JoinInts(ids)))
- if err != nil {
- err = errors.WithStack(err)
- return
- }
- defer rows.Close()
- mbc = make(map[int64]*model.BlockedCase, len(ids))
- for rows.Next() {
- r := new(model.BlockedCase)
- if err = rows.Scan(&r.ID, &r.MID, &r.Status, &r.OriginContent, &r.PunishResult, &r.OriginTitle, &r.OriginURL, &r.EndTime, &r.VoteRule, &r.VoteBreak, &r.VoteDelete, &r.OriginType, &r.ReasonType, &r.JudgeType, &r.BlockedDays, &r.PutTotal, &r.StartTime, &r.EndTime, &r.Operator, &r.CTime, &r.MTime, &r.RelationID, &r.CaseType); err != nil {
- if err == sql.ErrNoRows {
- mbc = nil
- err = nil
- return
- }
- err = errors.WithStack(err)
- return
- }
- mbc[r.ID] = r
- }
- err = rows.Err()
- return
- }
- // CaseRelationIDCount get case relation_id count.
- func (d *Dao) CaseRelationIDCount(c context.Context, tp int8, relationID string) (count int64, err error) {
- row := d.db.QueryRow(c, _caseRelationIDCountSQL, tp, relationID)
- if err = row.Scan(&count); err != nil {
- log.Error("d.caseRelationIDCount err(%v)", err)
- }
- return
- }
- // CaseInfoIDs get case info by ids.
- func (d *Dao) CaseInfoIDs(c context.Context, ids []int64) (cases map[int64]*model.BlockedCase, err error) {
- rows, err := d.db.Query(c, fmt.Sprintf(_caseInfoIDsSQL, xstr.JoinInts(ids)))
- if err != nil {
- log.Error("d.CaseInfoIDs err(%v)", err)
- return
- }
- defer rows.Close()
- cases = make(map[int64]*model.BlockedCase, len(ids))
- for rows.Next() {
- ca := &model.BlockedCase{}
- if err = rows.Scan(&ca.ID, &ca.MID, &ca.Status, &ca.OriginContent, &ca.PunishResult, &ca.OriginTitle, &ca.OriginURL, &ca.EndTime, &ca.VoteRule,
- &ca.VoteBreak, &ca.VoteDelete, &ca.OriginType, &ca.ReasonType, &ca.JudgeType, &ca.BlockedDays, &ca.PutTotal, &ca.StartTime, &ca.EndTime,
- &ca.Operator, &ca.CTime, &ca.MTime, &ca.RelationID, &ca.CaseType); err != nil {
- log.Error("row.Scan err(%v)", err)
- return
- }
- cases[ca.ID] = ca
- }
- return
- }
- // CaseVotesMID get user's vote case ids.
- func (d *Dao) CaseVotesMID(c context.Context, ids []int64) (mvo map[int64]*model.VoteInfo, err error) {
- rows, err := d.db.Query(c, fmt.Sprintf(_caseVotesMIDSQL, xstr.JoinInts(ids)))
- if err != nil {
- err = errors.WithStack(err)
- return
- }
- defer rows.Close()
- mvo = make(map[int64]*model.VoteInfo, len(ids))
- for rows.Next() {
- vo := new(model.VoteInfo)
- if err = rows.Scan(&vo.ID, &vo.CID, &vo.MID, &vo.Vote, &vo.Expired, &vo.Mtime); err != nil {
- if err == sql.ErrNoRows {
- mvo = nil
- err = nil
- return
- }
- err = errors.WithStack(err)
- return
- }
- mvo[vo.CID] = vo
- }
- err = rows.Err()
- return
- }
- // CaseVoteIDMID get user's vote case ids and cids.
- func (d *Dao) CaseVoteIDMID(c context.Context, mid, pn, ps int64) (vids []int64, cids []int64, err error) {
- rows, err := d.db.Query(c, _caseVoteIDMIDSQL, mid, (pn-1)*ps, ps)
- if err != nil {
- err = errors.WithStack(err)
- return
- }
- defer rows.Close()
- for rows.Next() {
- var vid, cid int64
- if err = rows.Scan(&vid, &cid); err != nil {
- if err == sql.ErrNoRows {
- vids = nil
- cids = nil
- err = nil
- return
- }
- err = errors.WithStack(err)
- return
- }
- vids = append(vids, vid)
- cids = append(cids, cid)
- }
- err = rows.Err()
- return
- }
- // CaseVoteIDTop get user's vote case ids and cids by top 100.
- func (d *Dao) CaseVoteIDTop(c context.Context, mid int64) (vids []int64, cids []int64, err error) {
- rows, err := d.db.Query(c, _caseVoteIDTopSQL, mid)
- if err != nil {
- err = errors.WithStack(err)
- return
- }
- defer rows.Close()
- for rows.Next() {
- var vid, cid int64
- if err = rows.Scan(&vid, &cid); err != nil {
- if err == sql.ErrNoRows {
- vids = nil
- cids = nil
- err = nil
- return
- }
- err = errors.WithStack(err)
- return
- }
- vids = append(vids, vid)
- cids = append(cids, cid)
- }
- err = rows.Err()
- return
- }
|