Files
chain33-dtalk/service/backend/dao/versiondb.go
2022-03-17 15:59:24 +08:00

160 lines
5.5 KiB
Go

package dao
import (
xerror "gitlab.33.cn/chat/dtalk/pkg/error"
"gitlab.33.cn/chat/dtalk/pkg/util"
"gitlab.33.cn/chat/dtalk/service/backend/model"
"math"
)
const (
_InsertVersionInfo = `INSERT INTO dtalk_ver_backend ( platform, state, device_type, version_code, version_name, download_url, force_update,size,md5, description, ope_user, update_time, create_time)VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ,?,?)`
_UpdateVersionInfo = `UPDATE dtalk_ver_backend SET version_name=?,version_code=?,download_url=?,size=?,md5=?,description=?,force_update=?,update_time=?,ope_user=? WHERE id=?`
_ChangeVersionStatus = `UPDATE dtalk_ver_backend SET state=1,update_time=?,ope_user=? WHERE id=?`
_QueryOtherReleaseVersionInfo = `SELECT * FROM dtalk_ver_backend WHERE id!=? AND device_type=? AND platform=? AND state=1`
_ChangeOtherReleaseVersionStatus = `UPDATE dtalk_ver_backend SET state=0,update_time=?,ope_user=? WHERE id=?`
_GetVersionList = `SELECT * FROM dtalk_ver_backend WHERE platform LIKE ? AND device_type LIKE ? ORDER BY create_time DESC LIMIT ?,?`
_GetVersionCount = `SELECT COUNT(*) FROM dtalk_ver_backend WHERE platform LIKE ? AND device_type LIKE ?`
_GetForceVersionCount = `SELECT COUNT(*) AS force_num FROM dtalk_ver_backend WHERE force_update = 1 AND version_code > ? AND version_code < ?`
_GetReleaseVersionInfo = `SELECT * FROM dtalk_ver_backend WHERE device_type=? AND platform=? AND state = 1 ORDER BY id DESC LIMIT 1`
_QueryVersionInfoById = `SELECT * FROM dtalk_ver_backend WHERE id=?`
)
func (d *Dao) InsertVersion(form *model.VersionForm) (int64, int64, error) {
num, lastId, err := d.conn.Exec(_InsertVersionInfo, form.Platform, form.Status, form.DeviceType, form.VersionCode, form.VersionName, form.Url, form.Force, form.Size, form.Md5, form.Description.ToString(), form.OpeUser, form.UpdateTime, form.CreateTime)
return num, lastId, err
}
func (d *Dao) UpdateVersion(form *model.VersionForm) (*model.VersionForm, error) {
_, _, err := d.conn.Exec(_UpdateVersionInfo, form.VersionName, form.VersionCode, form.Url, form.Size, form.Md5, form.Description.ToString(), form.Force, form.UpdateTime, form.OpeUser, form.Id)
if err != nil {
return nil, err
}
records, err := d.conn.Query(_QueryVersionInfoById, form.Id)
if err != nil {
return nil, err
}
if len(records) < 1 {
return nil, xerror.NewError(xerror.ParamsError).SetExtMessage("无此id的记录")
}
record := records[0]
version, err := model.ConvertVersionForm(&record)
if err != nil {
return nil, err
}
return version, nil
}
func (d *Dao) ChangeVersionStatus(form *model.VersionForm) error {
tx, err := d.conn.NewTx()
if err != nil {
return err
}
_, _, err = tx.Exec(_ChangeVersionStatus, form.UpdateTime, form.OpeUser, form.Id)
if err != nil {
return err
}
records, err := tx.Query(_QueryVersionInfoById, form.Id)
if err != nil {
return err
}
if len(records) == 0 {
return xerror.NewError(xerror.ParamsError).SetExtMessage("无此id的记录")
}
deviceType := records[0]["device_type"]
platform := records[0]["platform"]
records, err = tx.Query(_QueryOtherReleaseVersionInfo, form.Id, deviceType, platform)
if err != nil {
return err
}
if len(records) == 0 {
err = tx.Commit()
if err != nil {
return err
}
return nil
}
id := util.ToInt64(records[0]["id"])
_, _, err = tx.Exec(_ChangeOtherReleaseVersionStatus, form.UpdateTime, form.OpeUser, id)
if err != nil {
return err
}
err = tx.Commit()
if err != nil {
return err
}
return nil
}
func (d *Dao) GetVersionList(form *model.VersionForm, page int64, size int64) (*[]model.VersionForm, int64, int64, error) {
var records []map[string]string
offset := page * size
records, err := d.conn.Query(_GetVersionList, form.Platform, form.DeviceType, offset, size)
if err != nil {
return nil, 0, 0, err
}
response, err := d.ConvertVersionList(&records)
if err != nil {
return nil, 0, 0, err
}
countRecords, err := d.conn.Query(_GetVersionCount, form.Platform, form.DeviceType)
if err != nil {
return nil, 0, 0, err
}
totalElements := util.ToInt64(countRecords[0]["COUNT(*)"])
totalPages := int64(math.Ceil(float64(totalElements) / float64(size)))
return response, totalElements, totalPages, nil
}
func (d *Dao) CheckAndUpdateVersion(form *model.VersionForm) (*model.VersionForm, error) {
records, err := d.conn.Query(_GetReleaseVersionInfo, form.DeviceType, form.Platform)
if err != nil {
return nil, err
}
if len(records) < 1 {
return &model.VersionForm{}, nil
}
record, err := model.ConvertVersionForm(&records[0])
if err != nil {
return nil, err
}
if !record.Force {
//判断期间是否包含强制更新版本
record.Force, _ = d.checkHaveForce(util.ToInt(form.VersionCode), util.ToInt(record.VersionCode))
}
return record, nil
}
func (d *Dao) ConvertVersionList(records *[]map[string]string) (*[]model.VersionForm, error) {
//var versionList []model.VersionForm
versionList := make([]model.VersionForm, len(*records), len(*records))
for i, record := range *records {
version, err := model.ConvertVersionForm(&record)
if err != nil {
return nil, err
}
versionList[i] = *version
}
return &versionList, nil
}
func (d *Dao) checkHaveForce(oldVer, newVer int) (bool, error) {
if oldVer >= newVer {
return false, nil
}
records, err := d.conn.Query(_GetForceVersionCount, oldVer, newVer)
if err != nil {
return false, err
}
if len(records) < 1 {
return false, nil
}
num := util.ToInt64(records[0]["force_num"])
return num > 0, nil
}