// 业务逻辑服务基类,提供基本的添删改查功能 // // 修改纪录 // 2016.06.06 版本:1.0 yy 新建账户分表结构的处理 package mydb import ( "encoding/json" "fmt" "reflect" "strconv" "strings" "dashoo.cn/utils" . "dashoo.cn/utils/db" // "github.com/go-xorm/xorm" ) type MyServiceBase struct { ServiceBase } type String_Id struct { Id string } type MyInt_Id struct { Id int } type Templatedata struct { Templdata string } // func (s *MyServiceBase) 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.DBE.Table(tableName).Limit(int(itemsPerPage), (int(pageIndex)-1)*int(itemsPerPage)).Asc(order).Find(entitiesPtr) } else { err = s.DBE.Table(tableName).Limit(int(itemsPerPage), (int(pageIndex)-1)*int(itemsPerPage)).Desc(order).Find(entitiesPtr) } //获取总记录数 sql := "SELECT COUNT(*) AS total FROM " + tableName resultsSlice, err = s.DBE.Query(sql) LogError(err) } else { if asc { err = s.DBE.Table(tableName).Where(where[0]).Limit(int(itemsPerPage), (int(pageIndex)-1)*int(itemsPerPage)).Asc(order).Find(entitiesPtr) } else { err = s.DBE.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.DBE.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 *MyServiceBase) GetPagingEntitiesWithoutAccCode(pageIndex, itemsPerPage int64, order string, asc bool, entitiesPtr interface{}, where ...string) (total int64) { var err error var resultsSlice []map[string][]byte //获取表名 tableName := GetTableName(entitiesPtr) if len(where) == 0 { if asc { err = s.DBE.Table(tableName).Limit(int(itemsPerPage), (int(pageIndex)-1)*int(itemsPerPage)).Asc(order).Find(entitiesPtr) } else { err = s.DBE.Table(tableName).Limit(int(itemsPerPage), (int(pageIndex)-1)*int(itemsPerPage)).Desc(order).Find(entitiesPtr) } //获取总记录数 sql := "SELECT COUNT(*) AS total FROM " + tableName resultsSlice, err = s.DBE.Query(sql) LogError(err) } else { if asc { err = s.DBE.Table(tableName).Where(where[0]).Limit(int(itemsPerPage), (int(pageIndex)-1)*int(itemsPerPage)).Asc(order).Find(entitiesPtr) } else { err = s.DBE.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.DBE.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 *MyServiceBase) InsertEntityBytbl(tablename string, entity interface{}) (affected int64, err error) { affected, err = s.DBE.Table(tablename).Insert(entity) LogError(err) return } func (s *MyServiceBase) GetEntityByIdBytbl(tablename string, id interface{}, entityPtr interface{}) (has bool) { has, err := s.DBE.Table(tablename).Id(id).Get(entityPtr) LogError(err) return } func (s *MyServiceBase) GetEntityByWhere(tablename string, where string, entityPtr interface{}) (has bool) { has, err := s.DBE.Table(tablename).Where(where).Get(entityPtr) LogError(err) return } func (s *MyServiceBase) GetEntitysByWhere(tablename string, where string, entityPtr interface{}) { err := s.DBE.Table(tablename).Where(where).Find(entityPtr) LogError(err) return } func (s *MyServiceBase) GetEntitysByOrderbyWhere(tablename, where, orderby string, entityPtr interface{}) { err := s.DBE.Table(tablename).Where(where).OrderBy(orderby).Find(entityPtr) LogError(err) return } //更新实体写入日志,会自动备份数据 func (s *MyServiceBase) 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 { session.Rollback() return err } _, err = s.DBE.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 } //根据条件修改数据,不记录日志 func (s *MyServiceBase) UpdateEntityBywheretbl(tablename string, entity interface{}, cols []string, where string) (err error) { _, err = s.DBE.Table(tablename).Where(where).Cols(cols...).Update(entity) //执行更新 return err } //更新实体写入日志,会自动备份数据 func (s *MyServiceBase) 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.DBE.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.DBE.Table(tablelogname).Insert(updatem) //保存到更新历史表 LogError(err) if err != nil { session.Rollback() return err } _, err = s.DBE.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 *MyServiceBase) 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.DBE.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.DBE.Table(tablelogname).Insert(deleted) //保存到更新历史表 LogError(err) if err != nil { session.Rollback() return err } _, err = s.DBE.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 *MyServiceBase) InsertSampleAndBuss(tblmain, tbldetail, tblbuss string, entitymain, entitydetail, entitybuss interface{}) (affected int64, err error) { session := s.DBE.NewSession() defer session.Close() err = session.Begin() affected, err = s.DBE.Table(tblmain).Insert(entitymain) LogError(err) if err != nil { session.Rollback() return 0, err } affected, err = s.DBE.Table(tbldetail).Insert(entitydetail) if err != nil { session.Rollback() return 0, err } affected, err = s.DBE.Table(tblbuss).Insert(entitybuss) if err != nil { session.Rollback() return 0, err } err = session.Commit() if err != nil { return 0, err } return } //主信息已存在,添加分管信息 func (s *MyServiceBase) 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.DBE.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.DBE.Table(tablelogname).Insert(updatem) //保存到更新历史表 LogError(err) if err != nil { session.Rollback() return 0, err } _, err = s.DBE.Table(tblmain).Id(id).Cols(cols...).Update(entitymain) //执行更新 LogError(err) if err != nil { session.Rollback() return 0, err } affected, err = s.DBE.Table(tbldetail).Insert(entitydetail) if err != nil { session.Rollback() return 0, err } affected, err = s.DBE.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 *MyServiceBase) InsertSamplePre(tblmain, tbldetail string, entitymain, entitydetail interface{}) (affected int64, err error) { session := s.DBE.NewSession() defer session.Close() err = session.Begin() affected, err = s.DBE.Table(tblmain).Insert(entitymain) LogError(err) if err != nil { session.Rollback() return 0, err } affected, err = s.DBE.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 *MyServiceBase) 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.DBE.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.DBE.Table(tablelogname).Insert(updatem) //保存到更新历史表 LogError(err) if err != nil { session.Rollback() return 0, err } _, err = s.DBE.Table(tblmain).Id(id).Cols(cols...).Update(entitymain) //执行更新 LogError(err) if err != nil { session.Rollback() return 0, err } affected, err = s.DBE.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 *MyServiceBase) 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.DBE.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.DBE.Table(tablelogname).Insert(updatem) //保存到更新历史表 LogError(err) if err != nil { session.Rollback() return 0, err } _, err = s.DBE.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.DBE.Table(tbldetail).Insert(entitydetail) if err != nil { session.Rollback() return 0, err } affected, err = s.DBE.Table(tblbuss).Insert(entitybuss) if err != nil { session.Rollback() return 0, err } err = session.Commit() if err != nil { return 0, err } return } //更改样本表 func (s *MyServiceBase) UpdateSample(tablename string, id interface{}, entity interface{}, cols []string) (err error) { // fmt.Println("=====") session := s.DBE.NewSession() defer session.Close() err = session.Begin() _, err = s.DBE.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 *MyServiceBase) UpdateDetailAndBuss(tbldetail, tblbuss string, id interface{}, entitydetail, entitybuss interface{}, colsdetail []string) (err error) { session := s.DBE.NewSession() defer session.Close() err = session.Begin() _, err = s.DBE.Table(tbldetail).Id(id).Cols(colsdetail...).Update(entitydetail) //执行更新 LogError(err) if err != nil { session.Rollback() return err } _, err = s.DBE.Table(tblbuss).Insert(entitybuss) if err != nil { session.Rollback() return err } err = session.Commit() if err != nil { return err } return } //更改样本表并写入日志 func (s *MyServiceBase) WriteSampleLog(tablelogname string, id interface{}, mid interface{}, entity interface{}, userid, username, acccode, samplecode, barcode string, sampletype int) (err error) { session := s.DBE.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.DBE.Table(tablelogname).Insert(updatem) //保存到更新历史表 LogError(err) if err != nil { session.Rollback() return err } err = session.Commit() if err != nil { return err } return } //写入样本删除日志 func (s *MyServiceBase) WriteDeleteSampleLog(tablelogname string, id interface{}, mid interface{}, entity interface{}, userid, username, acccode, samplecode, barcode string, sampletype int) (err error) { session := s.DBE.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.DBE.Table(tablelogname).Insert(updatem) //保存到更新历史表 LogError(err) if err != nil { session.Rollback() return err } err = session.Commit() if err != nil { return err } return } func StrSplit(s, sep string) []string { return strings.Split(s, sep) } func GetKuoZhan(entity interface{}, filedname string) string { sfiledtype, _ := reflect.TypeOf(entity).FieldByName(filedname) objV := reflect.ValueOf(entity).FieldByName(filedname) switch sfiledtype.Type.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return utils.ToStr(objV.Int()) case reflect.Float32, reflect.Float64: return utils.ToStr(utils.FloatPoint(objV.Float(), 2)) case reflect.String: return objV.String() case reflect.Struct: switch sfiledtype.Type.String() { case "time.Time": rfvalue := fmt.Sprintf("%v", objV) return rfvalue[0:19] } } return "" } func Boxlinename(x int) string { switch x { case 1: return "A" case 2: return "B" case 3: return "C" case 4: return "D" case 5: return "E" case 6: return "F" case 7: return "G" case 8: return "H" case 9: return "I" case 10: return "J" case 11: return "K" case 12: return "L" case 13: return "M" case 14: return "N" case 15: return "O" case 16: return "P" case 17: return "Q" case 18: return "R" case 19: return "S" case 20: return "T" default: return "A" } } func Boxlineumber(x string) int { switch x { case "A": return 1 case "B": return 2 case "C": return 3 case "D": return 4 case "E": return 5 case "F": return 6 case "G": return 7 case "H": return 8 case "I": return 9 case "J": return 10 case "K": return 11 case "L": return 12 case "M": return 13 case "N": return 14 case "O": return 15 case "P": return 16 case "Q": return 17 case "R": return 18 case "S": return 19 case "T": return 20 default: return 1 } } //更新实体写入日志,会自动备份数据 func (s *MyServiceBase) 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.DBE.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.DBE.Table(tablelogname).Insert(updatem) //保存到更新历史表 LogError(err) if err != nil { session.Rollback() return err } _, err = s.DBE.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 *MyServiceBase) 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.DBE.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.DBE.Table(tablelogname).Insert(deleted) //保存到更新历史表 LogError(err) if err != nil { session.Rollback() return err } _, err = s.DBE.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 *MyServiceBase) DeleteEntityBytbl(tablename string, where string) (err error) { if where == "" { where = "1=2" } sql := `delete from ` + tablename + ` where ` + where _, err = s.DBE.Exec(sql) return } func (s *MyServiceBase) GetTopNEntities(tablename string, topN int, where string, entitiesPtr interface{}) { err := s.DBE.Table(tablename).Where(where).Limit(topN, 0).Find(entitiesPtr) LogError(err) return } //按准入范围编码查询所有准入 func (s *MyServiceBase) FindGoodsByCode(tablename string, where string,entitiesPtr interface{} ){ err := s.DBE.Table(tablename).Where(where).Find(entitiesPtr) LogError(err) return } //按公司查找资质 func (s *MyServiceBase) FindFileByCompany(tablename string, where string,entitiesPtr interface{} ){ err := s.DBE.Table(tablename).Where(where).Find(entitiesPtr) LogError(err) return }