// 业务逻辑服务基类,提供基本的添删改查功能 // // 修改纪录 // 2016.06.06 版本:1.0 yy 新建账户分表结构的处理 package mydb import ( "encoding/json" "fmt" "reflect" "strconv" . "dashoo.cn/utils/db" // "github.com/go-xorm/xorm" ) type MySessionBase struct { SessionBase } // func (s *MySessionBase) GetPagingEntitiesWithOrderBytbl(AccCode string, pageIndex, itemsPerPage int64, order string, asc bool, entitiesPtr interface{}, where ...string) (total int64) { var err error var resultsSlice []map[string][]byte //获取表名 tableName := AccCode + GetTableName(entitiesPtr) if len(where) == 0 { if asc { err = s.Session.Table(tableName).Limit(int(itemsPerPage), (int(pageIndex)-1)*int(itemsPerPage)).Asc(order).Find(entitiesPtr) } else { err = s.Session.Table(tableName).Limit(int(itemsPerPage), (int(pageIndex)-1)*int(itemsPerPage)).Desc(order).Find(entitiesPtr) } //获取总记录数 sql := "SELECT COUNT(*) AS total FROM " + tableName resultsSlice, err = s.Session.Query(sql) LogError(err) } else { if asc { err = s.Session.Table(tableName).Where(where[0]).Limit(int(itemsPerPage), (int(pageIndex)-1)*int(itemsPerPage)).Asc(order).Find(entitiesPtr) } else { err = s.Session.Table(tableName).Where(where[0]).Limit(int(itemsPerPage), (int(pageIndex)-1)*int(itemsPerPage)).Desc(order).Find(entitiesPtr) } sql := "SELECT COUNT(*) AS total FROM " + tableName + " where " + where[0] resultsSlice, err = s.Session.Query(sql) } LogError(err) if len(resultsSlice) > 0 { results := resultsSlice[0] for _, value := range results { total, err = strconv.ParseInt(string(value), 10, 64) LogError(err) break } } return total } //样本库分表 func (s *MySessionBase) InsertEntityBytbl(tablename string, entity interface{}) (affected int64, err error) { affected, err = s.Session.Table(tablename).Insert(entity) LogError(err) return } func (s *MySessionBase) GetEntityByIdBytbl(tablename string, id interface{}, entityPtr interface{}) (has bool) { has, err := s.Session.Table(tablename).Id(id).Get(entityPtr) LogError(err) return } func (s *MySessionBase) GetEntityByWhere(tablename string, where string, entityPtr interface{}) (has bool) { has, err := s.Session.Table(tablename).Where(where).Get(entityPtr) LogError(err) return } func (s *MySessionBase) GetEntitysByWhere(tablename string, where string, entityPtr interface{}) { err := s.Session.Table(tablename).Where(where).Find(entityPtr) LogError(err) return } func (s *MySessionBase) GetEntitysByOrderbyWhere(tablename, where, orderby string, entityPtr interface{}) { err := s.Session.Table(tablename).Where(where).OrderBy(orderby).Find(entityPtr) LogError(err) return } //更新实体写入日志,会自动备份数据 func (s *MySessionBase) UpdateEntityBytbl(tablename string, id interface{}, entity interface{}, cols []string) (err error) { //session := s.DBE.NewSession() //defer session.Close() //err = session.Begin() LogError(err) if err != nil { //s.Session.Rollback() return err } _, err = s.Session.Table(tablename).Id(id).Cols(cols...).Update(entity) //执行更新 LogError(err) if err != nil { //s.Session.Rollback() return err } //err = s.Session.Commit() if err != nil { return err } return } //根据条件修改数据,不记录日志 func (s *MySessionBase) UpdateEntityBywheretbl(tablename string, entity interface{}, cols []string, where string) (err error) { _, err = s.Session.Table(tablename).Where(where).Cols(cols...).Update(entity) //执行更新 return err } //更新实体写入日志,会自动备份数据 func (s *MySessionBase) UpdateDonorAndWriteLogBytbl(tablename string, tablelogname string, id interface{}, entity interface{}, entityEmpty interface{}, cols []string, userid, username, opdesc, acccode, sourcename string) (err error) { s.GetEntityByIdBytbl(tablename, id, entityEmpty) //session := s.Session.NewSession() //defer session.Close() //err = session.Begin() json, err := json.Marshal(entityEmpty) LogError(err) updatem := new(DonorsLog) //获取表名 objT := reflect.TypeOf(entity) objT = objT.Elem() tableName := objT.Name() updatem.TableName = tableName updatem.AccCode = acccode updatem.OpDesc = opdesc updatem.OpType = 1 updatem.SourceName = sourcename updatem.RecordId = fmt.Sprintf("%v", id) updatem.RecordData = string(json) updatem.CreateUserId = userid updatem.CreateBy = username _, err = s.Session.Table(tablelogname).Insert(updatem) //保存到更新历史表 LogError(err) if err != nil { //s.Session.Rollback() return err } _, err = s.Session.Table(tablename).Id(id).Cols(cols...).Update(entity) //执行更新 LogError(err) if err != nil { //s.Session.Rollback() return err } err = s.Session.Commit() if err != nil { return err } return } //删除实体并写入日志,会自动备份数据,entity为空的表结构 func (s *MySessionBase) DeleteDonorAndWriteLogBytbl(tablename string, tablelogname string, id interface{}, entity interface{}, entityEmpty interface{}, userid, username, opdesc, acccode, sourcename string) (err error) { has := s.GetEntityByIdBytbl(tablename, id, entity) if has { //session := s.Session.NewSession() //defer session.Close() //err := session.Begin() json, err := json.Marshal(entity) LogError(err) deleted := new(DonorsLog) //获取表名 objT := reflect.TypeOf(entity) objT = objT.Elem() tableName := objT.Name() deleted.TableName = tableName deleted.AccCode = acccode deleted.OpDesc = opdesc deleted.OpType = 2 deleted.SourceName = sourcename deleted.RecordId = fmt.Sprintf("%v", id) deleted.RecordData = string(json) deleted.CreateUserId = userid deleted.CreateBy = username _, err = s.Session.Table(tablelogname).Insert(deleted) //保存到更新历史表 LogError(err) if err != nil { //session.Rollback() return err } _, err = s.Session.Table(tablename).Id(id).Delete(entityEmpty) //执行删除 LogError(err) if err != nil { //session.Rollback() return err } //err = session.Commit() if err != nil { return err } } return } //主信息不存在,首次添加样本 func (s *MySessionBase) InsertSampleAndBuss(tblmain, tbldetail, tblbuss string, entitymain, entitydetail, entitybuss interface{}) (affected int64, err error) { //session := s.Session.NewSession() //defer session.Close() //err = session.Begin() affected, err = s.Session.Table(tblmain).Insert(entitymain) LogError(err) if err != nil { //session.Rollback() return 0, err } affected, err = s.Session.Table(tbldetail).Insert(entitydetail) if err != nil { //session.Rollback() return 0, err } affected, err = s.Session.Table(tblbuss).Insert(entitybuss) if err != nil { //session.Rollback() return 0, err } //err = session.Commit() if err != nil { return 0, err } return } //主信息已存在,添加分管信息 func (s *MySessionBase) InsertOtherSampleAndBuss(tblmain, tbldetail, tblbuss string, entitymain, entitydetail, entitybuss interface{}, cols []string, id interface{}, mainentityEmpty interface{}, tablelogname, acccode, userid, username, samplecode string, sampletype int) (affected int64, err error) { s.GetEntityByIdBytbl(tblmain, id, mainentityEmpty) //session := s.Session.NewSession() //defer session.Close() //err = session.Begin() json, err := json.Marshal(mainentityEmpty) LogError(err) updatem := new(SamplesLog) //获取表名 objT := reflect.TypeOf(entitymain) objT = objT.Elem() tableName := objT.Name() updatem.TableName = tableName updatem.AccCode = acccode updatem.OpType = 3 updatem.SampleCode = samplecode updatem.SampleType = sampletype updatem.MId = fmt.Sprintf("%v", id) updatem.RecordData = string(json) updatem.CreateUserId = userid updatem.CreateBy = username _, err = s.Session.Table(tablelogname).Insert(updatem) //保存到更新历史表 LogError(err) if err != nil { //session.Rollback() return 0, err } _, err = s.Session.Table(tblmain).Id(id).Cols(cols...).Update(entitymain) //执行更新 LogError(err) if err != nil { //session.Rollback() return 0, err } affected, err = s.Session.Table(tbldetail).Insert(entitydetail) if err != nil { //session.Rollback() return 0, err } affected, err = s.Session.Table(tblbuss).Insert(entitybuss) if err != nil { //session.Rollback() return 0, err } //err = session.Commit() if err != nil { return 0, err } return } //主信息不存在,首次添加样本 预录入新增,不写入buss func (s *MySessionBase) InsertSamplePre(tblmain, tbldetail string, entitymain, entitydetail interface{}) (affected int64, err error) { //session := s.Session.NewSession() //defer session.Close() //err = session.Begin() affected, err = s.Session.Table(tblmain).Insert(entitymain) LogError(err) if err != nil { //session.Rollback() return 0, err } affected, err = s.Session.Table(tbldetail).Insert(entitydetail) if err != nil { //session.Rollback() return 0, err } //err = session.Commit() if err != nil { return 0, err } return } //主信息已存在,添加分管信息 预录入新增,不写入buss func (s *MySessionBase) InsertOtherSamplePre(tblmain, tbldetail string, entitymain, entitydetail interface{}, cols []string, id interface{}, mainentityEmpty interface{}, tablelogname, acccode, userid, username, samplecode string, sampletype int) (affected int64, err error) { s.GetEntityByIdBytbl(tblmain, id, mainentityEmpty) //session := s.Session.NewSession() //defer session.Close() //err = session.Begin() json, err := json.Marshal(mainentityEmpty) LogError(err) updatem := new(SamplesLog) //获取表名 objT := reflect.TypeOf(entitymain) objT = objT.Elem() tableName := objT.Name() updatem.TableName = tableName updatem.AccCode = acccode updatem.OpType = 3 updatem.SampleCode = samplecode updatem.SampleType = sampletype updatem.MId = fmt.Sprintf("%v", id) updatem.RecordData = string(json) updatem.CreateUserId = userid updatem.CreateBy = username _, err = s.Session.Table(tablelogname).Insert(updatem) //保存到更新历史表 LogError(err) if err != nil { //session.Rollback() return 0, err } _, err = s.Session.Table(tblmain).Id(id).Cols(cols...).Update(entitymain) //执行更新 LogError(err) if err != nil { //session.Rollback() return 0, err } affected, err = s.Session.Table(tbldetail).Insert(entitydetail) if err != nil { //session.Rollback() return 0, err } //err = session.Commit() if err != nil { return 0, err } return } //出入库信息。修改主表和从表,添加buss表 func (s *MySessionBase) UpdateOtherSampleAndBuss(tblmain, tbldetail, tblbuss string, entitymain, entitydetail, entitybuss interface{}, cols, colsdetail []string, id interface{}, mainentityEmpty, detailentityEmpty interface{}, tablelogname, acccode, userid, username, samplecode string) (affected int64, err error) { s.GetEntityByIdBytbl(tblmain, id, mainentityEmpty) //session := s.Session.NewSession() //defer session.Close() //err = session.Begin() json, err := json.Marshal(mainentityEmpty) LogError(err) updatem := new(SamplesLog) //获取表名 objT := reflect.TypeOf(entitymain) objT = objT.Elem() tableName := objT.Name() updatem.TableName = tableName updatem.AccCode = acccode updatem.OpType = 1 updatem.SampleCode = samplecode updatem.BarCode = samplecode updatem.RecordId = fmt.Sprintf("%v", id) updatem.RecordData = string(json) updatem.CreateUserId = userid updatem.CreateBy = username _, err = s.Session.Table(tablelogname).Insert(updatem) //保存到更新历史表 LogError(err) if err != nil { //session.Rollback() return 0, err } _, err = s.Session.Table(tblmain).Id(id).Cols(cols...).Update(entitymain) //执行更新 LogError(err) if err != nil { //session.Rollback() return 0, err } s.GetEntityByIdBytbl(tbldetail, id, detailentityEmpty) affected, err = s.Session.Table(tbldetail).Insert(entitydetail) if err != nil { //session.Rollback() return 0, err } affected, err = s.Session.Table(tblbuss).Insert(entitybuss) if err != nil { //session.Rollback() return 0, err } //err = session.Commit() if err != nil { return 0, err } return } //更改样本表 func (s *MySessionBase) UpdateSample(tablename string, id interface{}, entity interface{}, cols []string) (err error) { // fmt.Println("=====") //session := s.Session.NewSession() //defer session.Close() //err = session.Begin() _, err = s.Session.Table(tablename).Id(id).Cols(cols...).Update(entity) //执行更新 LogError(err) if err != nil { //session.Rollback() return err } //err = session.Commit() if err != nil { return err } return } //复苏分装提取信息。修改从表,添加buss表 func (s *MySessionBase) UpdateDetailAndBuss(tbldetail, tblbuss string, id interface{}, entitydetail, entitybuss interface{}, colsdetail []string) (err error) { //session := s.Session.NewSession() //defer session.Close() //err = session.Begin() _, err = s.Session.Table(tbldetail).Id(id).Cols(colsdetail...).Update(entitydetail) //执行更新 LogError(err) if err != nil { //session.Rollback() return err } _, err = s.Session.Table(tblbuss).Insert(entitybuss) if err != nil { //session.Rollback() return err } //err = session.Commit() if err != nil { return err } return } //更改样本表并写入日志 func (s *MySessionBase) WriteSampleLog(tablelogname string, id interface{}, mid interface{}, entity interface{}, userid, username, acccode, samplecode, barcode string, sampletype int) (err error) { //session := s.Session.NewSession() //defer session.Close() //err = session.Begin() json, err := json.Marshal(entity) LogError(err) updatem := new(SamplesLog) //获取表名 updatem.TableName = "SamplesInfoShow" updatem.AccCode = acccode updatem.OpType = 1 updatem.SampleCode = samplecode updatem.BarCode = barcode updatem.RecordId = fmt.Sprintf("%v", id) updatem.MId = fmt.Sprintf("%v", mid) updatem.RecordData = string(json) updatem.CreateUserId = userid updatem.CreateBy = username updatem.SampleType = sampletype _, err = s.Session.Table(tablelogname).Insert(updatem) //保存到更新历史表 LogError(err) if err != nil { //session.Rollback() return err } //err = session.Commit() if err != nil { return err } return } //写入样本删除日志 func (s *MySessionBase) WriteDeleteSampleLog(tablelogname string, id interface{}, mid interface{}, entity interface{}, userid, username, acccode, samplecode, barcode string, sampletype int) (err error) { //session := s.Session.NewSession() //defer session.Close() //err = session.Begin() json, err := json.Marshal(entity) LogError(err) updatem := new(SamplesLog) //获取表名 updatem.TableName = "SamplesInfoShow" updatem.AccCode = acccode updatem.OpType = 2 updatem.SampleCode = samplecode updatem.BarCode = barcode updatem.RecordId = fmt.Sprintf("%v", id) updatem.MId = fmt.Sprintf("%v", mid) updatem.RecordData = string(json) updatem.CreateUserId = userid updatem.CreateBy = username updatem.SampleType = sampletype _, err = s.Session.Table(tablelogname).Insert(updatem) //保存到更新历史表 LogError(err) if err != nil { //session.Rollback() return err } //err = session.Commit() if err != nil { return err } return } //更新实体写入日志,会自动备份数据 func (s *MySessionBase) UpdateOperationAndWriteLogBytbl(tablename string, tablelogname string, id interface{}, entity interface{}, entityEmpty interface{}, cols []string, userid, username, opdesc, acccode, tabledesc string) (err error) { s.GetEntityByIdBytbl(tablename, id, entityEmpty) //session := s.Session.NewSession() //defer session.Close() //err = session.Begin() json, err := json.Marshal(entityEmpty) LogError(err) updatem := new(Base_OperationLog) //获取表名 objT := reflect.TypeOf(entity) objT = objT.Elem() tableName := objT.Name() updatem.TableName = tableName updatem.AccCode = acccode updatem.OpDesc = opdesc updatem.OpTage = 1 updatem.TableDesc = tabledesc updatem.RecordId = fmt.Sprintf("%v", id) updatem.RecordData = string(json) updatem.Createuserid = userid updatem.Createby = username _, err = s.Session.Table(tablelogname).Insert(updatem) //保存到更新历史表 LogError(err) if err != nil { //session.Rollback() return err } _, err = s.Session.Table(tablename).Id(id).Cols(cols...).Update(entity) //执行更新 LogError(err) if err != nil { //session.Rollback() return err } //err = session.Commit() if err != nil { return err } return } //删除实体并写入日志,会自动备份数据,entity为空的表结构 func (s *MySessionBase) DeleteOperationAndWriteLogBytbl(tablename string, tablelogname string, id interface{}, entity interface{}, entityEmpty interface{}, userid, username, opdesc, acccode, tabledesc string) (err error) { has := s.GetEntityByIdBytbl(tablename, id, entity) if has { //session := s.Session.NewSession() //defer session.Close() //err := session.Begin() json, err := json.Marshal(entity) LogError(err) deleted := new(Base_OperationLog) //获取表名 objT := reflect.TypeOf(entity) objT = objT.Elem() tableName := objT.Name() deleted.TableName = tableName deleted.AccCode = acccode deleted.OpDesc = opdesc deleted.OpTage = 2 deleted.TableDesc = tabledesc deleted.RecordId = fmt.Sprintf("%v", id) deleted.RecordData = string(json) deleted.Createuserid = userid deleted.Createby = username _, err = s.Session.Table(tablelogname).Insert(deleted) //保存到更新历史表 LogError(err) if err != nil { //session.Rollback() return err } _, err = s.Session.Table(tablename).Id(id).Delete(entityEmpty) //执行删除 LogError(err) if err != nil { //session.Rollback() return err } //err = session.Commit() if err != nil { return err } } return } //根据条件删除数据,不记录日志 func (s *MySessionBase) DeleteEntityBytbl(tablename string, where string) (err error) { if where == "" { where = "1=2" } sql := `delete from ` + tablename + ` where ` + where _, err = s.Session.Exec(sql) return } func (s *MySessionBase) GetTopNEntities(tablename string, topN int, where string, entitiesPtr interface{}) { err := s.Session.Table(tablename).Where(where).Limit(topN, 0).Find(entitiesPtr) LogError(err) return }