Commit f19d9418 by zhangjiec

增加硬件请求亲情号

parent 5a0b52e6
......@@ -3,7 +3,8 @@ package api_we
import (
"dc_golang_server_1/api"
"dc_golang_server_1/data_db_cache/cache"
"dc_golang_server_1/data_db_cache/dbdao"
"dc_golang_server_1/data_db_cache/dbcurd"
"dc_golang_server_1/data_db_cache/model"
"dc_golang_server_1/logger"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
......@@ -17,16 +18,16 @@ type creatCardUserRes struct {
// CreateCardUser 创建一个学生
// @Tags 家长微信
// @Summary 创建一个学生 (同一微信号并发创建学生,WechatCustomerMap缓存弱安全) [complete]
// @Summary 创建一个学生 [complete](同一微信号并发创建学生,WechatCustomerMap缓存弱安全)
// @Description 传新建学生信息至后台,后台返回学生id,以及对应校区的service
// @Accept json
// @Produce json
// @Param data body dbdao.InsertTableUserCardUser true "学生信息"
// @Param data body dbcurd.InsertTableUserCardUserStruct true "学生信息"
// @Success 0 {object} creatCardUserRes
// @Router /we/carduser [POST]
// @Security ApiKeyAuth
func CreateCardUser(c *gin.Context) {
var reqData dbdao.InsertTableUserCardUser
var reqData dbcurd.InsertTableUserCardUserStruct
err := c.ShouldBindJSON(&reqData)
if err != nil {
c.JSON(http.StatusOK, gin.H{
......@@ -43,12 +44,11 @@ func CreateCardUser(c *gin.Context) {
"data": api.CodeMsg[api.ErrorSystemErr],
})
logger.Log.Error("strconv.Atoi(c.Param(\"userID\")",
zap.String("c.Param(\"userID\")", c.Param("userID")),
zap.Error(err))
zap.String("c.Param(\"userID\")", c.Param("userID")))
return
}
newID := dbdao.InsertUserCardUserAndUserWeCardUser(reqData, weUserID) //插入数据库
newID := dbcurd.InsertUserCardUserAndUserWeCardUser(reqData, weUserID) //插入数据库
if newID == 0 {
c.JSON(http.StatusOK, gin.H{
"code": api.ErrorSystemErr,
......@@ -65,7 +65,7 @@ func CreateCardUser(c *gin.Context) {
return
}
//添加学生缓存
cache.CardUserMap.Store(newID, cache.CardUserType{
cache.CardUserMap.Store(newID, model.CacheCardUserStruct{
AreaID: reqData.AreaID,
Name: reqData.Name,
Sex: reqData.Sex,
......
......@@ -12,7 +12,7 @@ import (
// DeleteCardUser 主家长删除一个学生
// @Tags 家长微信
// @Summary 主家长删除一个学生
// @Summary 主家长删除一个学生,(当家长点删除时弹框二次确认)
// @Description 传学生ID至后台,后台返回成功失败
// @Produce json
// @Param id path integer true "学生ID"
......@@ -41,7 +41,7 @@ func DeleteCardUser(c *gin.Context) {
return
}
// 查出该学生信息
cardUserInfo, ok := cache.GetCardUserInfo(uint32(cardUserID))
cardUserInfo, ok := cache.GetUCardUserInfo(uint32(cardUserID))
if ok == false {
c.JSON(http.StatusOK, gin.H{
"code": api.ErrorSystemErr,
......@@ -56,16 +56,12 @@ func DeleteCardUser(c *gin.Context) {
})
return
}
if cardUserInfo.Recharge { //充过值不允许删除
c.JSON(http.StatusOK, gin.H{
"code": api.ErrorReqPara,
"message": api.CodeMsg[api.ErrorReqPara] + " 用户已充值",
})
return
}
// 删库
// 删缓存
// 软删除
// 先删库
// 再删缓存
c.JSON(http.StatusOK, gin.H{
"code": api.Success,
})
......
......@@ -3,16 +3,18 @@ package api_we
import (
"dc_golang_server_1/api"
"dc_golang_server_1/data_db_cache/cache"
"dc_golang_server_1/data_db_cache/dbdao"
"dc_golang_server_1/data_db_cache/dbcurd"
"dc_golang_server_1/data_db_cache/model"
"dc_golang_server_1/logger"
tencent2 "dc_golang_server_1/tencent"
"fmt"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
"net/http"
"time"
)
type WeSlaveLoginResUserInfoStruct struct {
type WeResUserInfoStruct struct {
ID uint32 `json:"id"` // 学生ID
Name string `json:"name"`
Sex uint8 `json:"sex"` // 0无意义 1女 2男
......@@ -20,17 +22,17 @@ type WeSlaveLoginResUserInfoStruct struct {
Grade int8 `json:"grade"` // 0无意义 "1~9对应一年级~九年级,10~12对应高一~高三"
Class int8 `json:"class"` // 0无意义
StuNum string `json:"stuNum"` // ""无意义
Service [6]uint8 `json:"service" example:"1,2,2,0,0,0"` // 对应6个数字对应公话、定位、饮水、卡消费、洗浴、洗衣机图标(0不显示,1正常,2显示但提示校区暂未开通该服务)
// Service [6]uint8 `json:"service" example:"1,2,2,0,0,0"` // 对应6个数字对应公话、定位、饮水、卡消费、洗浴、洗衣机图标(0不显示,1正常,2显示但提示校区暂未开通该服务)
// TopUp bool `json:"topUp"` // 是否已充值(已充值则不能删除,未充值可以删除)
}
type WeMasterLoginResUserInfoStruct struct {
WeSlaveLoginResUserInfoStruct
TopUp bool `json:"topUp"` // 是否已充值(已充值则不能删除,未充值可以删除)
type weUserListStruct struct {
Master []WeResUserInfoStruct `json:"master"` // 自己创建的学生列表(主家长)
Slave []WeResUserInfoStruct `json:"slave"` // 添加的学生列表(副家长)
}
type weLoginRes struct {
Master []WeMasterLoginResUserInfoStruct `json:"master"` // 自己创建的学生列表(主家长)
Slave []WeSlaveLoginResUserInfoStruct `json:"slave"` // 添加的学生列表(副家长)
weUserListStruct
WePhone bool `json:"wePhone"` // 是否已获取到微信电话
WeInfo bool `json:"weInfo"` // 是否已获取到微信用户信息
Token string `json:"token"`
......@@ -78,7 +80,7 @@ func WeLogin(c *gin.Context) {
if userID != 0 {
userInfo, haveInfo = cache.GetWechatCustomerInfoAndCanUpdateTokenTime(userID, nowTime)
if haveInfo {
dbdao.UpdateUWeCustomerLoginTime(userID)
dbcurd.UpdateUWeCustomerLoginTime(userID)
}
}
......@@ -105,7 +107,7 @@ func WeLogin(c *gin.Context) {
} else { // 已有用户
userInfo, haveInfo = cache.GetWechatCustomerInfoAndCanUpdateTokenTime(userID, nowTime)
if haveInfo {
dbdao.UpdateUWeCustomerLoginTime(userID)
dbcurd.UpdateUWeCustomerLoginTime(userID)
} else {
cache.WechatCustomerMap.Delete(userID)
cache.WechatCustomerUnionIDToIDMAP.Delete(unionID)
......@@ -129,18 +131,93 @@ func WeLogin(c *gin.Context) {
}
for _, cardUserID := range userInfo.MasterCardUserID {
if cardUserInfo, ok := cache.GetCardUserInfo(cardUserID); ok {
if cardUserInfo, ok := cache.GetUCardUserInfo(cardUserID); ok {
var areaInfo model.CacheBAreaStruct
var upInfo WeResUserInfoStruct
upInfo.ID = cardUserID
upInfo.Name = cardUserInfo.Name
upInfo.Sex = cardUserInfo.Sex
upInfo.Grade = cardUserInfo.Grade
upInfo.Class = cardUserInfo.Class
upInfo.StuNum = cardUserInfo.StuNum
// upInfo.Service = [6]uint8{1, 2, 2, 2, 2, 2}
if cache.GetAreaMapInfo(cardUserInfo.AreaID, &areaInfo) {
if areaInfo.Status == 1 || (areaInfo.Status == 2 && userInfo.TestRole) {
upInfo.Area = areaInfo.Name
}
}
res.Master = append(res.Master, upInfo)
}
}
for _, cardUserID := range userInfo.SlaveCardUserID {
if cardUserInfo, ok := cache.GetUCardUserInfo(cardUserID); ok {
var areaInfo model.CacheBAreaStruct
var upInfo WeResUserInfoStruct
upInfo.ID = cardUserID
upInfo.Name = cardUserInfo.Name
upInfo.Sex = cardUserInfo.Sex
upInfo.Grade = cardUserInfo.Grade
upInfo.Class = cardUserInfo.Class
upInfo.StuNum = cardUserInfo.StuNum
// upInfo.Service = [6]uint8{1, 2, 2, 2, 2, 2}
if cache.GetAreaMapInfo(cardUserInfo.AreaID, &areaInfo) {
if areaInfo.Status == 1 || (areaInfo.Status == 2 && userInfo.TestRole) {
upInfo.Area = areaInfo.Name
}
}
res.Slave = append(res.Slave, upInfo)
}
}
c.JSON(http.StatusOK, gin.H{
"code": api.Success,
"data": res,
})
}
// GetStudentList 获取学生列表
// @Tags 家长微信
// @Summary 获取学生列表 [complete]
// @Description 获取学生列表
// @Product json
// @Success 0 {object} weUserListStruct
// @Router /we/stulist [GET]
// @Security ApiKeyAuth
func GetStudentList(c *gin.Context) {
v, ok := c.Get("userID")
userID := v.(uint32)
if ok != true || userID == 0 {
c.JSON(http.StatusOK, gin.H{
"code": api.ErrorSystemErr,
"data": api.CodeMsg[api.ErrorSystemErr],
})
logger.Log.Error("strconv.Atoi(c.Param(\"userID\")",
zap.String("c.Param(\"userID\")", c.Param("userID")))
return
}
userInfo, ok := cache.GetWechatCustomerInfoAndCanUpdateTokenTime(userID, 0)
if ok == false { // 微信服务器登录
c.JSON(http.StatusOK, gin.H{
"code": api.ErrorSystemErr,
"message": api.CodeMsg[api.ErrorSystemErr],
})
return
}
var res weUserListStruct
for _, cardUserID := range userInfo.MasterCardUserID {
if cardUserInfo, ok := cache.GetUCardUserInfo(cardUserID); ok {
var areaInfo model.CacheBAreaStruct
var upInfo WeMasterLoginResUserInfoStruct
var upInfo WeResUserInfoStruct
upInfo.ID = cardUserID
upInfo.Name = cardUserInfo.Name
upInfo.Sex = cardUserInfo.Sex
upInfo.Grade = cardUserInfo.Grade
upInfo.Class = cardUserInfo.Class
upInfo.StuNum = cardUserInfo.StuNum
upInfo.TopUp = true
upInfo.Service = [6]uint8{1, 2, 2, 2, 2, 2}
fmt.Println("upInfo.Service", upInfo.Service)
// upInfo.Service = [6]uint8{1, 2, 2, 2, 2, 2}
if cache.GetAreaMapInfo(cardUserInfo.AreaID, &areaInfo) {
if areaInfo.Status == 1 || (areaInfo.Status == 2 && userInfo.TestRole) {
upInfo.Area = areaInfo.Name
......@@ -151,18 +228,16 @@ func WeLogin(c *gin.Context) {
}
for _, cardUserID := range userInfo.SlaveCardUserID {
if cardUserInfo, ok := cache.GetCardUserInfo(cardUserID); ok {
if cardUserInfo, ok := cache.GetUCardUserInfo(cardUserID); ok {
var areaInfo model.CacheBAreaStruct
var upInfo WeSlaveLoginResUserInfoStruct
var upInfo WeResUserInfoStruct
upInfo.ID = cardUserID
upInfo.Name = cardUserInfo.Name
upInfo.Sex = cardUserInfo.Sex
upInfo.Grade = cardUserInfo.Grade
upInfo.Class = cardUserInfo.Class
upInfo.StuNum = cardUserInfo.StuNum
//upInfo.TopUp = true
upInfo.Service = [6]uint8{1, 2, 2, 2, 2, 2}
fmt.Println("upInfo.Service", upInfo.Service)
// upInfo.Service = [6]uint8{1, 2, 2, 2, 2, 2}
if cache.GetAreaMapInfo(cardUserInfo.AreaID, &areaInfo) {
if areaInfo.Status == 1 || (areaInfo.Status == 2 && userInfo.TestRole) {
upInfo.Area = areaInfo.Name
......
......@@ -39,7 +39,8 @@ func InitRouter() { //*gin.Engine{
r.POST("we/login/:code", api_we.WeLogin)
wechat := r.Group("we/")
wechat.Use(api.JeffWTWechat())
{ // 需要token的
{ // 需要token的stulist
wechat.GET("stulist", api_we.GetStudentList) //获取学生列表
wechat.POST("carduser", api_we.CreateCardUser) //创建学生
wechat.DELETE("carduser/:id", api_we.DeleteCardUser) //删除学生
wechat.GET("trend/:id", api_we.GetCardUsersTrend) //获取学生最新动态
......
......@@ -10,9 +10,9 @@
#dbDSN = "user=postgres password=buzhidao123 dbname=dctest1 host=to-chengdu-office.168cad.top port=50032 sslmode=disable"
#ECS外网
dbDSN = "user=postgres password=buzhidao123. dbname=dcpgdb1 host=60.205.190.129 port=5432 sslmode=disable"
dbDSN = "user=postgres password=buzhidao123. dbname=jeff host=60.205.190.129 port=59999 sslmode=disable"
#ECS内网
#dbDSN = "user=postgres password=buzhidao123. dbname=testlog host=127.0.0.1 port=5432 sslmode=disable"
#dbDSN = "user=postgres password=buzhidao123. dbname=jeff host=127.0.0.1 port=59999 sslmode=disable"
[http_server]
#debug release
......
......@@ -6,6 +6,19 @@ import (
"time"
)
func Init() {
initBDistrictMaps() // 初始化行政区域省市区缓存
initAreaMapAndCountyAreaMap()
initWechatCustomerMap()
initUCardUserMapAndSiminfoMapNoFamilyNum()
initFamilyNumToSimInfoMap()
//initAreaServiceMap()
//initPhone20DeviceMap()
//initAdminMap()
//initOperatorMap()
}
// ProvinceMap /*********************************************************全国行政区域**/------------------------OK
var ProvinceMap []model.CacheBDistrictStruct // 省份列表[]model.CacheBDistrictStruct
var CityMap sync.Map // 城市列表map[uint32][]model.CacheBDistrictStruct //省份ID作为KEY
......@@ -41,11 +54,11 @@ var AreaMap sync.Map //area_id 作为KEY CacheBAreaStruct 作为VALUE
/*---------------------------------------------------------------*/
/*********************************************************运营商**/
var operatorMap sync.Map //运营商id作为KEY
type OperatorStruct struct {
ShortName string
// 可再添加运营商属性
}
//var operatorMap sync.Map //运营商id作为KEY
//type OperatorStruct struct {
// ShortName string
// // 可再添加运营商属性
//}
/*---------------------------------------------------------------*/
......@@ -62,27 +75,27 @@ type AreaServiceStruct struct { //
/*---------------------------------------------------------------*/
/******************************************************后台管理用户**/
var adminMap sync.Map //后台管理用户 LoginAccount(string) 作为KEY
type AdminStruct struct {
Password [16]byte
tokenCreatTime int64 // 初始化为0,则已有的token还有效
Name string
upAdminID uint32
//Phone string
//OperatorID []int
SystemAuth uint32 //系统角色权限
AreaServiceAuth [][]uint32 //area_service_id,admin_role_id
}
//var adminMap sync.Map //后台管理用户 LoginAccount(string) 作为KEY
//type AdminStruct struct {
// Password [16]byte
// tokenCreatTime int64 // 初始化为0,则已有的token还有效
// Name string
// upAdminID uint32
// //Phone string
// //OperatorID []int
// SystemAuth uint32 //系统角色权限
// AreaServiceAuth [][]uint32 //area_service_id,admin_role_id
//}
// todo 加锁var LockAreaMapAreaService bool
/*---------------------------------------------------------------*/
// roleAuthMap /****************************角色权限(包含区域和系统角色)*/
var adminRoleAuthMap sync.Map //admin_role_id 作为KEY
type RoleAuthStruct struct {
Name string
MenuRole map[uint32][]uint32 // 菜单、按钮权限
}
//var adminRoleAuthMap sync.Map //admin_role_id 作为KEY
//type RoleAuthStruct struct {
// Name string
// MenuRole map[uint32][]uint32 // 菜单、按钮权限
//}
// todo 加锁
/***************************************************微信用户(家长)**/ //------------------------OK
......@@ -103,54 +116,56 @@ var WechatCustomerMap sync.Map // 微信的Wech
//CardUserMap /***************************************************卡用户(学生、教师、职工)**/
var CardUserMap sync.Map //卡用户 CardUserID卡用户ID(uint32) 作为KEY 纯卡用户可以不绑定微信
type CardUserType struct {
MasterWechatUserID uint32
SlaveWechatUserID []uint32
Role uint8 //角色0学生,1教师,2职工,default0
AreaID uint32
Name string
Sex uint8 //0,无信息,1女,2男
// Birthday
Grade int8
Class int8
StuNum string
Recharge bool //是否充过值
SimCardID string
LocationCardID uint32
IcCardID uint32
}
//type CacheCardUserStruct struct {
// MasterWechatUserID uint32
// SlaveWechatUserID []uint32
// // Role uint8 //角色0学生,1教师,2职工,default0
// AreaID uint32
// Name string
// Sex uint8 //0,无信息,1女,2男
// // Birthday
// Grade int8
// Class int8
// StuNum string
// //Recharge bool //是否充过值
// SimCardID string
// LocationCardID uint32
// IcCardID uint32
//}
// todo 加锁SlaveWechatUserID
/*---------------------------------------------------------------*/
/********************************************************Sim卡信息(仅存学生绑定了的)**/
var simInfoMap sync.Map //sim_id(string) 作为KEY
//type CacheSimInfoStruct struct {
// CardUserID uint32 //卡用户ID
// AreaServiceID uint32
// Status int8 //0无数据 1 正常使用 2 已挂失
// MonthTalkMinutes uint16
// MonthPackageMinutes uint16
// ExpiryAt time.Time
// FamilyNum []CacheFamilyOnePerson // 如果一张sim卡,到多个学校绑定不一样的亲情号,则改成MAP,但是移动不允许。先这样。
//}
//type CacheFamilyOnePerson struct {
// Phone string
// Nickname string
//}
// todo 加锁FamilyNum
/*---------------------------------------------------------------*/
/*******************************************************电话设备**/
var phone20DeviceMap sync.Map //device_id 作为KEY Phone20DeviceStruct 作为VALUE
type Phone20DeviceStruct struct {
AreaServiceID uint32
AllowCallTime uint8 //允许通话时长,255表示不限制时长
Place string //安装位置
//Place string //安装位置
Status bool
}
/*---------------------------------------------------------------*/
/********************************************************Sim卡信息**/
var simInfoMap sync.Map //card_id 作为KEY
type SimInfoStruct struct {
CardUserID uint32 //卡用户ID
Status int8 //0无数据 1 正常使用 2 服务已到期 3 已挂失
MonthTalkMinutes uint16
MonthPackageMinutes uint16
FamilyNum []FamilyOnePerson // 如果一张sim卡,到多个学校绑定不一样的亲情号,则改成MAP,但是移动不允许。先这样。
}
type FamilyOnePerson struct {
Phone string
Nickname string
}
// todo 加锁FamilyNum
/*---------------------------------------------------------------*/
/***************************************************卡用户动态**/
var cardUserTrendMap sync.Map //卡用户 CardUserID卡用户ID(uint32) 作为KEY,[]CardUserTrendType作为VALUE
type CardUserTrendType struct {
......@@ -161,16 +176,3 @@ type CardUserTrendType struct {
}
/*---------------------------------------------------------------*/
func Init() {
initBDistrictMaps() // 初始化行政区域省市区缓存
initAreaMapAndCountyAreaMap()
initWechatCustomerMap()
initCardUserMap()
//initAdminMap()
//initOperatorMap()
//initAreaServiceMap()
//initPhone20DeviceMap()
//initSimFamilyNumMap()
}
package cache
import (
"dc_golang_server_1/data_db_cache/dbdao"
"dc_golang_server_1/data_db_cache/dbcurd"
"dc_golang_server_1/data_db_cache/model"
"dc_golang_server_1/logger"
"fmt"
......@@ -27,7 +27,7 @@ func initAreaMapAndCountyAreaMap() {
fmt.Println(time.Now(), "cache: initAreaMap begin")
var areaID uint32
var temp model.CacheBAreaStruct
rows, err := dbdao.PgDb.Query("SELECT id,county_id,name,longitude,latitude,status FROM b_area") //
rows, err := dbcurd.PgDb.Query("SELECT id,county_id,name,longitude,latitude,status FROM b_area") //
defer rows.Close()
if err != nil {
log.Panicln("SelectAreaToMap rows", err)
......
package cache
import (
"dc_golang_server_1/data_db_cache/dbdao"
"dc_golang_server_1/data_db_cache/dbcurd"
"dc_golang_server_1/logger"
"fmt"
"go.uber.org/zap"
"log"
"strings"
"time"
)
......@@ -13,7 +14,7 @@ func initAreaServiceMap() {
fmt.Println(time.Now(), "cache: initDeviceMap begin")
var areaID int32
var temp AreaServiceStruct
rows, err := dbdao.PgDb.Query("SELECT id,name,status FROM b_area") //todo
rows, err := dbcurd.PgDb.Query("SELECT id,name,status FROM b_area") //todo
defer rows.Close()
if err != nil {
log.Panicln("SelectAreaToMap rows", err)
......@@ -57,9 +58,16 @@ func GetAreaServiceInfo(areaServiceID uint32) (areaServiceInfo AreaServiceStruct
var err error
for i := 0; i < 10; i++ {
err = dbdao.PgDb.QueryRow("SELECT name,status FROM b_area WHERE id=$1",
err = dbcurd.PgDb.QueryRow("SELECT name,status FROM b_area WHERE id=$1",
areaServiceID).Scan(&areaServiceInfo.Name, &areaServiceInfo.Status) //todo
if err != nil {
if strings.Contains(err.Error(), "no rows in result") {
logger.Log.Error("GetAreaServiceInfo SELECT operator_id,status FROM b_area WHERE id=$1", //todo
zap.Uint32("areaServiceID", areaServiceID),
zap.Error(err),
zap.String("src", "GetAreaServiceInfo"))
return
}
fmt.Println("GetAreaInfo SELECT:", i, err)
time.Sleep(3 * time.Millisecond)
continue
......
package cache
import (
"dc_golang_server_1/data_db_cache/dbdao"
"dc_golang_server_1/data_db_cache/model"
"dc_golang_server_1/logger"
"fmt"
"go.uber.org/zap"
"log"
"sync"
"time"
)
// 初始化行政区域缓存
func initBDistrictMaps() {
fmt.Println(time.Now(), "cache: initBDistrictMaps begin")
go func() bool {
ProvinceMap = []model.CacheBDistrictStruct{} //先清空原来的缓存
var temp model.CacheBDistrictStruct
rows, err := dbdao.PgDb.Query("SELECT id,name,initial FROM b_district WHERE level=1 ORDER BY initial,sort")
defer rows.Close()
if err != nil {
log.Panicln("ProvinceMap SELECT b_district rows", err)
}
for rows.Next() {
err = rows.Scan(&temp.Id, &temp.Name, &temp.Initial)
if err != nil {
log.Panicln("ProvinceMap SELECT b_district rows.Scan", err)
}
ProvinceMap = append(ProvinceMap, temp)
}
// 处理完毕后,需要判断一次遍历过程中是否有错误产生
if err = rows.Err(); err != nil {
log.Panicln("cache: ProvinceMap rows.Err()", err)
}
return true
}()
selectToDistrictMap(2, &CityMap)
selectToDistrictMap(3, &CountyMap)
fmt.Println(time.Now(), "cache: initBDistrictMaps OK")
}
func selectToDistrictMap(level uint8, tempMap *sync.Map) bool {
// 清空
tempMap.Range(func(k, _ interface{}) bool {
tempMap.Delete(k)
return true
})
var parentID uint32
var temp model.CacheBDistrictStruct
rows, err := dbdao.PgDb.Query("SELECT id,name,parent_id,initial FROM b_district WHERE level=$1 ORDER BY initial,sort", level)
defer rows.Close()
if err != nil {
log.Panicln("SELECT b_district rows", err, level)
}
for rows.Next() {
err = rows.Scan(&temp.Id, &temp.Name, &parentID, &temp.Initial)
if err != nil {
log.Panicln("SELECT b_district rows.Scan", err, level)
}
var bufStruct []model.CacheBDistrictStruct
if v, ok := tempMap.Load(parentID); ok { //map已经有了
if bufStruct, ok = v.([]model.CacheBDistrictStruct); ok == false { //类型断言错误
tempMap.Delete(parentID)
logger.Log.Error("[]BDistrictStruct 类型断言错误",
zap.Uint8("level", level),
zap.String("src", "selectToDistrictMap"))
}
}
bufStruct = append(bufStruct, temp)
tempMap.Store(parentID, bufStruct)
}
// 处理完毕后,需要判断一次遍历过程中是否有错误产生
if err = rows.Err(); err != nil {
log.Panicln("cache: selectToDistrictMap rows.Err()", err, level)
}
return true
}
package cache
import (
"dc_golang_server_1/data_db_cache/dbdao"
"dc_golang_server_1/data_db_cache/dbcurd"
"dc_golang_server_1/data_db_cache/model"
"dc_golang_server_1/logger"
"fmt"
"go.uber.org/zap"
"log"
"strings"
"time"
)
//id integer NOT NULL DEFAULT nextval('u_card_user_id_seq'::regclass),
//role smallint 角色:0学生,1教师,2职工
//name character varying(16) COLLATE pg_catalog."default",
//sex smallint,
//area_id integer,
//grade smallint,
//class smallint,
//student_num character varying(32) COLLATE pg_catalog."default",
//create_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
//first_topup_at timestamp without time zone,
func initCardUserMap() {
fmt.Println(time.Now(), "cache: initCardUserMap begin")
func initUCardUserMapAndSiminfoMapNoFamilyNum() {
fmt.Println(time.Now(), "cache: initUCardUserMapAndSiminfoMapNoFamilyNum begin")
var cardUserID uint32
var temp CardUserType
rows, err := dbdao.PgDb.Query("SELECT id,role,name,sex,area_id,grade,class,student_num,first_topup_at is not null FROM u_card_user") //
var temp model.CacheCardUserStruct
// rows, err := dbcurd.PgDb.Query("SELECT id,role,name,sex,area_id,grade,class,student_num,first_topup_at is not null FROM u_card_user")
rows, err := dbcurd.PgDb.Query("SELECT id,name,sex,area_id,grade,class,student_num FROM u_card_user WHERE delete_at is null")
defer rows.Close()
if err != nil {
log.Panicln("Select u_card_user To Map rows", err)
}
var simInfo model.CacheSimInfoStruct
for rows.Next() {
err = rows.Scan(&cardUserID, &temp.Role, &temp.Name, &temp.Sex, &temp.AreaID, &temp.Grade, &temp.Class, &temp.StuNum, &temp.Recharge)
err = rows.Scan(&cardUserID, &temp.Name, &temp.Sex, &temp.AreaID, &temp.Grade, &temp.Class, &temp.StuNum)
if err != nil {
log.Panicln("initCardUserMap rows.Scan", err)
log.Panicln("initUCardUserMapAndSiminfoMapNoFamilyNum rows.Scan", err)
}
fmt.Println(cardUserID, temp)
err = dbcurd.PgDb.QueryRow("SELECT sim_id,area_service_id,month_talk_minutes,month_package_minutes,status,expiry_at FROM u_sim_info WHERE card_user_id=$1 AND area_service_id!=0 AND status!=0",
cardUserID).Scan(
&temp.SimCardID,
&simInfo.AreaServiceID,
&simInfo.MonthTalkMinutes,
&simInfo.MonthPackageMinutes,
&simInfo.Status,
&simInfo.ExpiryAt)
if err != nil {
if strings.Contains(err.Error(), "no rows in result") {
CardUserMap.Store(cardUserID, temp)
continue
}
log.Panicln("Select u_sim_info To temp.SimCardID", err)
}
// todo1 考虑校验area_service_id
simInfoMap.Store(temp.SimCardID, simInfo)
CardUserMap.Store(cardUserID, temp)
}
// 处理完毕后,需要判断一次遍历过程中是否有错误产生
if err = rows.Err(); err != nil {
log.Panicln(time.Now(), "initCardUserMap rows.Err()", err)
log.Panicln(time.Now(), "initUCardUserMapAndSiminfoMapNoFamilyNum rows.Err()", err)
}
// todo 读电话卡绑定信息
fmt.Println(time.Now(), "cache: initCardUserMap OK")
fmt.Println(time.Now(), "cache: initUCardUserMapAndSiminfoMapNoFamilyNum OK")
}
func GetCardUserInfo(cardUserID uint32) (CardUserType, bool) {
func GetUCardUserInfo(cardUserID uint32) (model.CacheCardUserStruct, bool) {
if s, ok := CardUserMap.Load(cardUserID); ok { // map有
if v, ok4 := s.(CardUserType); ok4 { //类型断言正确
if v, ok4 := s.(model.CacheCardUserStruct); ok4 { //类型断言正确
return v, true
} else { //类型断言失败
CardUserMap.Delete(cardUserID)
logger.Log.Error("CardUserMap 类型断言错误",
zap.Uint32("cardUserID", cardUserID),
zap.String("src", "GetCardUserInfo"))
zap.String("src", "GetUCardUserInfo"))
}
} else {
logger.Log.Error("CardUserMap 有问题,没数据",
zap.Uint32("cardUserID", cardUserID),
zap.String("src", "GetCardUserInfo"))
zap.String("src", "GetUCardUserInfo"))
}
var temp CardUserType
// todo 再去查一盘库
var temp model.CacheCardUserStruct
// todo1 再去查一盘库
return temp, false
}
package cache
import (
"dc_golang_server_1/data_db_cache/dbcurd"
"dc_golang_server_1/data_db_cache/model"
"dc_golang_server_1/logger"
"fmt"
"go.uber.org/zap"
"log"
"sync"
"time"
)
// 初始化行政区域缓存
func initBDistrictMaps() {
fmt.Println(time.Now(), "cache: initBDistrictMaps begin")
go func() bool {
ProvinceMap = []model.CacheBDistrictStruct{} //先清空原来的缓存
var temp model.CacheBDistrictStruct
rows, err := dbcurd.PgDb.Query("SELECT id,name,initial FROM b_district WHERE level=1 ORDER BY initial,sort")
defer rows.Close()
if err != nil {
log.Panicln("ProvinceMap SELECT b_district rows", err)
}
for rows.Next() {
err = rows.Scan(&temp.Id, &temp.Name, &temp.Initial)
if err != nil {
log.Panicln("ProvinceMap SELECT b_district rows.Scan", err)
}
ProvinceMap = append(ProvinceMap, temp)
}
// 处理完毕后,需要判断一次遍历过程中是否有错误产生
if err = rows.Err(); err != nil {
log.Panicln("cache: ProvinceMap rows.Err()", err)
}
return true
}()
selectToDistrictMap(2, &CityMap)
selectToDistrictMap(3, &CountyMap)
fmt.Println(time.Now(), "cache: initBDistrictMaps OK")
}
func selectToDistrictMap(level uint8, tempMap *sync.Map) bool {
// 清空
tempMap.Range(func(k, _ interface{}) bool {
tempMap.Delete(k)
return true
})
var parentID uint32
var temp model.CacheBDistrictStruct
rows, err := dbcurd.PgDb.Query("SELECT id,name,parent_id,initial FROM b_district WHERE level=$1 ORDER BY initial,sort", level)
defer rows.Close()
if err != nil {
log.Panicln("SELECT b_district rows", err, level)
}
for rows.Next() {
err = rows.Scan(&temp.Id, &temp.Name, &parentID, &temp.Initial)
if err != nil {
log.Panicln("SELECT b_district rows.Scan", err, level)
}
var bufStruct []model.CacheBDistrictStruct
if v, ok := tempMap.Load(parentID); ok { //map已经有了
if bufStruct, ok = v.([]model.CacheBDistrictStruct); ok == false { //类型断言错误
tempMap.Delete(parentID)
logger.Log.Error("[]BDistrictStruct 类型断言错误",
zap.Uint8("level", level),
zap.String("src", "selectToDistrictMap"))
}
}
bufStruct = append(bufStruct, temp)
tempMap.Store(parentID, bufStruct)
}
// 处理完毕后,需要判断一次遍历过程中是否有错误产生
if err = rows.Err(); err != nil {
log.Panicln("cache: selectToDistrictMap rows.Err()", err, level)
}
return true
}
package cache
func initOperatorMap() { //todo 查询b_operator表得到ID和short_name; 查询b_area表得到AreaID
}
func GetOperatorMap(id int) OperatorStruct {
var temp OperatorStruct
return temp
}
package cache
import (
"dc_golang_server_1/data_db_cache/dbdao"
"dc_golang_server_1/data_db_cache/dbcurd"
"dc_golang_server_1/logger"
"fmt"
"go.uber.org/zap"
"log"
"strings"
"time"
)
......@@ -13,7 +14,7 @@ func initPhone20DeviceMap() {
fmt.Println(time.Now(), "cache: initDeviceMap begin")
var devID uint32
var temp Phone20DeviceStruct
rows, err := dbdao.PgDb.Query("SELECT id,area_service_id,allow_call_time,status FROM d_device")
rows, err := dbcurd.PgDb.Query("SELECT id,area_service_id,allow_call_time,status FROM d_device")
defer rows.Close()
if err != nil {
log.Panicln("SelectDeviceToMap rows", err)
......@@ -49,10 +50,16 @@ func GetPhone20Info(devID uint32) Phone20DeviceStruct {
}
var temp Phone20DeviceStruct
var err error
for i := 0; i < 100; i++ {
err = dbdao.PgDb.QueryRow("SELECT area_service_id,allow_call_time,status FROM d_phone20 WHERE id=$1",
for i := 0; i < 5; i++ {
err = dbcurd.PgDb.QueryRow("SELECT area_service_id,allow_call_time,status FROM d_phone20 WHERE device_id=$1",
devID).Scan(&temp.AreaServiceID, &temp.AllowCallTime, &temp.Status)
if err != nil {
if strings.Contains(err.Error(), "no rows in result") {
logger.Log.Warn("d_phone20 设备表无数据",
zap.Uint32("devID", devID),
zap.Error(err))
return temp
}
fmt.Println("GetPhone20Info SELECT:", i, err)
time.Sleep(3 * time.Millisecond)
continue
......
package cache
import (
"dc_golang_server_1/data_db_cache/model"
"dc_golang_server_1/logger"
"fmt"
"go.uber.org/zap"
"time"
)
func initSimFamilyNumMap() {
//fmt.Println(time.Now(),"cache: initSimFamilyNumMap begin")
//var keyTemp simFamilyNumMapKeyStruct
//var newValue familyOnePerson
//var ok bool
//rows, err := model.PgDb.Query("SELECT card_id,phone,nickname,area_id FROM u_sim_family_num ORDER BY create_at")
//defer rows.Close()
//if err != nil{
// log.Panicln("SelectUserSimFamilyNumToMap rows",err)
//}
//for rows.Next() {
// var bufStruct SimFamilyNumStruct
// err = rows.Scan(&keyTemp.CardId,&newValue.Phone,&newValue.Nickname,&keyTemp.AreaId)
// if err != nil{
// log.Panicln("SelectUserSimFamilyNumToMap rows.Scan",err)
// }
// if bo,ok2 := simFamilyNumMap.Load(keyTemp); ok2 { //map已经有了,就不去查u_sim_info了
// if bufStruct, ok = bo.(SimFamilyNumStruct); ok == false { //类型断言错误
// simFamilyNumMap.Delete(keyTemp)
// logger.Log.Error("SimFamilyNumMap 类型断言错误",
// zap.String("cardId", keyTemp.CardId),
// zap.Int32("area_id", keyTemp.AreaId),
// zap.String("src", "InitSimFamilyNumMap"))
// err = model.PgDb.QueryRow("SELECT month_talk_minutes,month_package_minutes,status FROM u_sim_info WHERE card_id=$1",
// keyTemp.CardId).Scan(&bufStruct.MonthTalkMinutes,&bufStruct.MonthPackageMinutes,&bufStruct.Status)
// if err != nil {
// logger.Log.Error("已绑定亲情号码的卡号居然在u_sim_info查不到",
// zap.String("cardId", keyTemp.CardId),
// zap.Int32("area_id", keyTemp.AreaId),
// zap.String("src", "InitSimFamilyNumMap"))
// continue
// }
// }
// } else {
// err = model.PgDb.QueryRow("SELECT month_talk_minutes,month_package_minutes,status FROM u_sim_info WHERE card_id=$1",
// keyTemp.CardId).Scan(&bufStruct.MonthTalkMinutes,&bufStruct.MonthPackageMinutes,&bufStruct.Status)
// if err != nil {
// logger.Log.Error("已绑定亲情号码的卡号居然在u_sim_info查不到",
// zap.String("cardId", keyTemp.CardId),
// zap.Int32("area_id", keyTemp.AreaId),
// zap.String("src", "InitSimFamilyNumMap"))
// continue
// }
// }
// //map里还没有,新存一条
// bufStruct.Family = append(bufStruct.Family,newValue)
// simFamilyNumMap.Store(keyTemp,bufStruct)
//}
//// 处理完毕后,需要判断一次遍历过程中是否有错误产生
//if err = rows.Err();err != nil{
// logger.Log.Error("rows.Err()",
// zap.Error(err),
// zap.String("src", "InitSimFamilyNumMap"))
// fmt.Println(time.Now(),"initSimFamilyNumMap rows.Err()",err)
//} else {
// fmt.Println(time.Now(),"cache: initSimFamilyNumMap end")
//}
func initFamilyNumToSimInfoMap() {
fmt.Println(time.Now(), "cache: initFamilyNumToSimInfoMap begin")
fmt.Println(time.Now(), "cache: initFamilyNumToSimInfoMap end")
}
func GetSimInfo( /*areaId int32, */ cardId string) SimInfoStruct {
func GetSimInfo(cardId string) model.CacheSimInfoStruct {
if s, ok := simInfoMap.Load(cardId); ok { // map有
if family, ok4 := s.(SimInfoStruct); ok4 { //类型断言正确
if family, ok4 := s.(model.CacheSimInfoStruct); ok4 { //类型断言正确
return family
} else { //类型断言失败
simInfoMap.Delete(cardId)
......@@ -74,11 +24,14 @@ func GetSimInfo( /*areaId int32, */ cardId string) SimInfoStruct {
zap.String("cardId", cardId),
zap.String("src", "GetSimInfo"))
}
} else {
logger.Log.Warn("simInfoMap 里面居然没有数据",
zap.String("cardId", cardId),
zap.String("src", "GetSimInfo"))
}
var temp SimInfoStruct
//
//// todo 再去查一盘库
var temp model.CacheSimInfoStruct
//// todoN 再去查一盘库
return temp
}
......
package cache
import (
"dc_golang_server_1/data_db_cache/dbdao"
"dc_golang_server_1/data_db_cache/dbcurd"
"dc_golang_server_1/data_db_cache/model"
"dc_golang_server_1/logger"
"fmt"
......@@ -16,7 +16,7 @@ func initWechatCustomerMap() {
var unionID string
var temp model.CacheUWeCustomerStruct
// 1. 查u_we_customer表获得基础数据
rows, err := dbdao.PgDb.Query("SELECT id,unionid,phone,nickname,avatarurl,test_role FROM u_we_customer") //
rows, err := dbcurd.PgDb.Query("SELECT id,unionid,phone,nickname,avatarurl,test_role FROM u_we_customer") //
// defer rows.Close()
if err != nil {
rows.Close()
......@@ -42,7 +42,7 @@ func initWechatCustomerMap() {
rows.Close()
// 2. 查家长学生对应关系表u_we_card_user表,获得绑定的学生数据
rows, err = dbdao.PgDb.Query("SELECT we_user_id,card_user_id,master FROM u_we_card_user order by create_at") //
rows, err = dbcurd.PgDb.Query("SELECT we_user_id,card_user_id,master FROM u_we_card_user order by create_at") //
defer rows.Close()
if err != nil {
log.Panicln("Select u_we_card_user rows", err)
......@@ -139,7 +139,7 @@ func GetWechatCustomerTestRole(userID uint32) (bool, bool) {
}
// 再查一遍库
unionID := dbdao.SelectUWeCustomerByUserIDToCacheModel(userID, &data)
unionID := dbcurd.SelectUWeCustomerByUserIDToCacheModel(userID, &data)
if len(unionID) == 0 {
return false, false
}
......@@ -162,7 +162,7 @@ func GetWechatCustomerInfoAndCanUpdateTokenTime(weUserID uint32, newTime int64)
var data model.CacheUWeCustomerStruct
if v, ok := WechatCustomerMap.Load(weUserID); ok {
if data, ok = v.(model.CacheUWeCustomerStruct); ok {
if newTime != 0 {
if newTime > 0 {
data.TokenCreatTime = newTime
WechatCustomerMap.Store(weUserID, data)
}
......@@ -179,7 +179,7 @@ func GetWechatCustomerInfoAndCanUpdateTokenTime(weUserID uint32, newTime int64)
zap.Uint32("weUserID", weUserID))
}
// 再查一遍库
unionID := dbdao.SelectUWeCustomerByUserIDToCacheModel(weUserID, &data)
unionID := dbcurd.SelectUWeCustomerByUserIDToCacheModel(weUserID, &data)
if len(unionID) == 0 {
return data, false
}
......@@ -191,12 +191,12 @@ func GetWechatCustomerInfoAndCanUpdateTokenTime(weUserID uint32, newTime int64)
}
func InsertWechatCustomerMap(unionID string, userInfo *model.CacheUWeCustomerStruct) uint32 {
userID, res := dbdao.InsertUWeCustomerUnionID(unionID)
if res == dbdao.InsertSysErr {
userID, res := dbcurd.InsertUWeCustomerUnionID(unionID)
if res == dbcurd.InsertSysErr {
return 0
}
if res == dbdao.InsertDuplicate {
if userID = dbdao.SelectUWeCustomerByUnionIDToCacheModel(unionID, userInfo); userID == 0 {
if res == dbcurd.InsertDuplicate {
if userID = dbcurd.SelectUWeCustomerByUnionIDToCacheModel(unionID, userInfo); userID == 0 {
return 0
}
}
......@@ -230,7 +230,7 @@ func InsertNewStudentIDToWechatCustomerMap(weUserID uint32, cardUserID uint32, m
zap.Uint32("weUserID", weUserID))
}
// 再查一遍库,库里面已经添加了学生数据了,就不用再添加了
unionID := dbdao.SelectUWeCustomerByUserIDToCacheModel(weUserID, &data)
unionID := dbcurd.SelectUWeCustomerByUserIDToCacheModel(weUserID, &data)
if len(unionID) == 0 {
return false
}
......
package dbdao
package dbcurd
import (
"dc_golang_server_1/logger"
......
package dbdao
package dbcurd
//CREATE TABLE IF NOT EXISTS public.d_device
//(
......
package dbdao
package dbcurd
import (
"dc_golang_server_1/logger"
......@@ -22,6 +22,7 @@ import (
//}
func InsertDevCommandErr(devId uint32, ciphertext string, errMsg string) {
fmt.Println("InsertDevCommandErr", errMsg, devId, ciphertext)
var err error
for i := 0; i < 10; i++ {
_, err = PgDb.Exec("INSERT INTO d_command_err VALUES($1,$2,$3)", devId, ciphertext, errMsg)
......
package dbdao
package dbcurd
import (
"dc_golang_server_1/logger"
......@@ -34,7 +34,7 @@ func InsertDevCommandRecord(insertData TableDevHexCommandRecord) {
var err error
for i := 0; i < 10; i++ {
// _, err = StmtDevHexRecord.Exec(rData.DevID, rData.TimeUtc, strconv.FormatUint(uint64(rData.CtrlCode), 16), rData.Length, hex.EncodeToString(rData.Data[:rData.Length]), ciphertext, direction)
_, err = stmtInsertDevHexCommandRecord.Exec(insertData.DevID,
_, err = stmtInsertDevCommandRecord.Exec(insertData.DevID,
insertData.DevUtc,
insertData.CtrlCode,
insertData.DataLen,
......
package dbdao
package dbcurd
import (
"dc_golang_server_1/logger"
......@@ -13,7 +13,8 @@ import (
//state smallint NOT NULL,
//create_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP
//)
// state 0:新连接来了 1:设备正常离线 2:正常离线 3:新连接挤掉就连接 4:未知异常(连接池类型断言失败)
// DevConnectRecord state 0:新连接来了 1:设备正常离线 2:正常离线 3:新连接挤掉就连接 4:未知异常(连接池类型断言失败)
func DevConnectRecord(devId uint32, state uint8) {
var err error
for i := 0; i < 100; i++ {
......
package dbdao
package dbcurd
import (
"dc_golang_server_1/logger"
......@@ -17,6 +17,7 @@ import (
//firmware character varying(20) COLLATE pg_catalog."default",
//create_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP
//)
type TableDevHexResetRecord struct {
DevId uint32
DevUtc uint32
......@@ -30,7 +31,7 @@ type TableDevHexResetRecord struct {
func InsertDevResetRecord(insertData TableDevHexResetRecord) {
var err error
for i := 0; i < 100; i++ {
_, err = stmtInsertDevHexCommandRecord.Exec(
_, err = stmtInsertDevResetRecord.Exec(
insertData.DevId,
insertData.DevUtc,
insertData.ResetReason,
......
package dbcurd
import (
"database/sql"
"dc_golang_server_1/logger"
"dc_golang_server_1/util/config"
"fmt"
_ "github.com/lib/pq"
"go.uber.org/zap"
)
const ( //0 成功 1 唯一约束重复 9 系统繁忙
InsertOK uint8 = 0
InsertDuplicate uint8 = 1
InsertSysErr uint8 = 9
)
var PgDb *sql.DB
var stmtInsertDevConnectRecord *sql.Stmt // 硬件联网流水
var stmtInsertDevCommandRecord *sql.Stmt // 硬件通讯流水
var stmtInsertDevResetRecord *sql.Stmt // 硬件复位流水
var stmtUpdateWechatUserLogin *sql.Stmt // 微信登录时间和登录次数更新
func InitDb() {
var err error
fmt.Println("DBDSN", config.DbDSN)
PgDb, err = sql.Open("postgres", config.DbDSN)
if err != nil {
panic("数据库连接失败" + err.Error())
}
//PgDb.SetConnMaxLifetime()
//PgDb.SetConnMaxIdleTime()
//PgDb.SetMaxOpenConns()
//PgDb.Stats()
// 硬件通讯流水
stmtInsertDevCommandRecord, err = PgDb.Prepare("INSERT INTO d_command_record VALUES($1,$2,$3,$4,$5,$6,$7)")
if err != nil {
panic("stmtInsertDevCommandRecord:" + err.Error())
}
// 硬件联网流水
stmtInsertDevConnectRecord, err = PgDb.Prepare("INSERT INTO d_connect_record VALUES($1,$2)")
if err != nil {
panic("stmtInsertDevConnectRecord:" + err.Error())
}
// 硬件复位流水
stmtInsertDevResetRecord, err = PgDb.Prepare("INSERT INTO d_reset_record VALUES($1,$2,$3,$4,$5,$6,$7)")
if err != nil {
panic("stmtInsertDevResetRecord:" + err.Error())
}
// 微信登录时间和登录次数更新
stmtUpdateWechatUserLogin, err = PgDb.Prepare("UPDATE u_we_customer SET login_at=$1,login_count=login_count+1 WHERE id=$2")
if err != nil {
panic("建立stmtUpdateWechatUserLogin失败:" + err.Error())
}
}
func CloseDb() {
if stmtInsertDevCommandRecord != nil { // 硬件通讯流水
_ = stmtInsertDevCommandRecord.Close()
}
if stmtInsertDevConnectRecord != nil { // 硬件联网流水
_ = stmtInsertDevConnectRecord.Close()
}
if stmtInsertDevResetRecord != nil { // 硬件复位流水
_ = stmtInsertDevResetRecord.Close()
}
if stmtUpdateWechatUserLogin != nil { // 微信登录时间和登录次数更新
_ = stmtUpdateWechatUserLogin.Close()
}
_ = PgDb.Close()
}
func clearTransaction(tx *sql.Tx) {
err := tx.Rollback()
if err != sql.ErrTxDone && err != nil {
logger.Log.Error("clearTransaction",
zap.Error(err))
}
}
package dbdao
package dbcurd
import (
"database/sql"
"dc_golang_server_1/logger"
"go.uber.org/zap"
"strings"
"time"
)
//CREATE TABLE IF NOT EXISTS public.u_call_record
//(
//customer_id integer,
//customer_name character varying(64) COLLATE pg_catalog."default",
//customer_phone character varying(12) COLLATE pg_catalog."default",
//card_user_id integer,
//card_user_name character varying(32) COLLATE pg_catalog."default",
//card_code character varying(32) COLLATE pg_catalog."default",
//card_type smallint,
//called_number character varying(12) COLLATE pg_catalog."default",
//called_nickname character varying(32) COLLATE pg_catalog."default",
//call_start_at timestamp without time zone,
//talk_time smallint,
//area_id integer,
//operator_id integer,
//device_id bigint,
//telephone_package_id integer,
//state smallint,
//create_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP
//)
type TableUserCallRecord struct {
CustomerId int32 //会员ID
CustomerPhone string //会员手机号 //character varying(11) COLLATE pg_catalog."default",
CardUserId int32 //卡用户ID //integer,
CardUserName string //卡用户姓名 character varying(32) COLLATE pg_catalog."default",
CardID string //卡ID character varying(32) COLLATE pg_catalog."default",
CardType int8 //卡类型 smallint,
CalledNumber string //被叫号码 character varying(12) COLLATE pg_catalog."default",
CalledNickname string //被叫昵称 character varying(32) COLLATE pg_catalog."default",
CallStartAt string //time.Time //通话开始时间 without time zone, .Format("2006-01-02 15:04:05.000"),
TalkTime int16 //通话时长 //integer,
AreaId int32 //区域(校区)ID //integer,
OperatorId int32 //运营商ID //integer,
DeviceId uint32 //设备ID //bigint,
Status uint8 //通话状态 //smallint,
CreateAt time.Time // timestamp without time zone DEFAULT CURRENT_TIMESTAMP
type InsertTableUCallRecordStruct struct {
CardUserId uint32
DeviceId uint32
CallStartAt string
CardUserName string
SimID string
CalledNumber string
CalledNickname string
TalkTime uint16
AreaName string
AreaServiceID uint32
OperatorId uint32
Status uint8
}
func clearTransaction(tx *sql.Tx) {
err := tx.Rollback()
if err != sql.ErrTxDone && err != nil {
logger.Log.Error("clearTransaction",
zap.Error(err))
}
}
func InsertUCallRecordAndUpdateUSimInfo(insertData TableUserCallRecord) uint8 { //0 成功 1 唯一约束重复 9 系统繁忙
func InsertUCallRecordAndUpdateUSimInfo(insertData InsertTableUCallRecordStruct) uint8 { //0 成功 1 唯一约束重复 9 系统繁忙
tx, err := PgDb.Begin()
if err != nil {
logger.Log.Error("InsertUCallRecordAndUpdateUSimInfo PgDb.Begin():",
......@@ -63,30 +30,28 @@ func InsertUCallRecordAndUpdateUSimInfo(insertData TableUserCallRecord) uint8 {
}
defer clearTransaction(tx)
//先InsertUCallRecord
_, err = tx.Exec("INSERT INTO u_call_record(customer_id,customer_phone,card_user_id,card_user_name,card_id,card_type,called_number,called_nickname,call_start_at,talk_time,area_id,operator_id,device_id,status)VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14)",
insertData.CustomerId,
insertData.CustomerPhone,
_, err = tx.Exec("INSERT INTO u_call_record(card_user_id,device_id,call_start_at,card_user_name,sim_id,called_number,called_nickname,talk_time,area_name,area_service_id,operator_id,status)VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12)",
insertData.CardUserId,
insertData.DeviceId,
insertData.CallStartAt,
insertData.CardUserName,
insertData.CardID,
insertData.CardType,
insertData.SimID,
insertData.CalledNumber,
insertData.CalledNickname,
insertData.CallStartAt,
insertData.TalkTime,
insertData.AreaId,
insertData.AreaName,
insertData.AreaServiceID,
insertData.OperatorId,
insertData.DeviceId,
insertData.Status,
)
if err != nil {
if strings.Contains(err.Error(), "duplicate key value") { //todo 这里应考虑去查出来看看内容是不是一样的
if strings.Contains(err.Error(), "duplicate key value") { //todoN 这里应考虑去查出来看看内容是不是一样的
//fmt.Println("InsertUserCallRecord唯一约束重复", err)
return 1
return InsertDuplicate
}
logger.Log.Error("InsertUCallRecordAndUpdateUSimInfo InsertUserCallRecord:",
zap.Error(err))
return 9
return InsertSysErr
}
//rowAffected, err := rs.RowsAffected()
//if err != nil {
......@@ -95,11 +60,11 @@ func InsertUCallRecordAndUpdateUSimInfo(insertData TableUserCallRecord) uint8 {
//}
//fmt.Println(rowAffected)
_, err = tx.Exec("UPDATE u_sim_info SET total_talk_minutes=total_talk_minutes+$1 WHERE card_id=$2", (insertData.TalkTime+59)/60, insertData.CardID)
_, err = tx.Exec("UPDATE u_sim_info SET total_talk_minutes=total_talk_minutes+$1 WHERE card_id=$2", (insertData.TalkTime+59)/60, insertData.SimID)
if err != nil {
logger.Log.Error("InsertUCallRecordAndUpdateUSimInfo UPDATE u_sim_info:",
zap.Error(err))
return 9
return InsertSysErr
}
//rowAffected, err = rs.RowsAffected()
//if err != nil {
......@@ -111,8 +76,8 @@ func InsertUCallRecordAndUpdateUSimInfo(insertData TableUserCallRecord) uint8 {
if err = tx.Commit(); err != nil {
logger.Log.Error("InsertUCallRecordAndUpdateUSimInfo Commit:",
zap.Error(err))
return 9
return InsertSysErr
}
return 0
return InsertOK
}
package dbdao
package dbcurd
import (
"dc_golang_server_1/logger"
......@@ -16,7 +16,7 @@ import (
//create_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
//first_topup_at timestamp without time zone,
type InsertTableUserCardUser struct {
type InsertTableUserCardUserStruct struct {
Role uint8 `swaggerignore:"true"` // 后台添加选填,学生名字,角色:0学生,1教师,2职工
Name string `json:"name" example:"汤圆"` // 必填,学生名字,maxLen=16
AreaID uint32 `json:"areaID" example:"1"` // 必填,校区ID
......@@ -27,7 +27,7 @@ type InsertTableUserCardUser struct {
}
// InsertUserCardUserAndUserWeCardUser 事务处理两张表
func InsertUserCardUserAndUserWeCardUser(insertData InsertTableUserCardUser, weUserID uint32) (cardUserID uint32) {
func InsertUserCardUserAndUserWeCardUser(insertData InsertTableUserCardUserStruct, weUserID uint32) (cardUserID uint32) {
tx, err := PgDb.Begin()
if err != nil {
logger.Log.Error("InsertUCallRecordAndUpdateUSimInfo PgDb.Begin():",
......
package dbdao
package dbcurd
//CREATE TABLE IF NOT EXISTS public.u_sim_info
//(
......
package dbdao
package dbcurd
import (
"dc_golang_server_1/data_db_cache/model"
......
package dbdao
import (
"database/sql"
config2 "dc_golang_server_1/util/config"
_ "github.com/lib/pq"
)
const ( //0 成功 1 唯一约束重复 9 系统繁忙
InsertOK uint8 = 0
InsertDuplicate uint8 = 1
InsertSysErr uint8 = 9
)
var PgDb *sql.DB
var stmtUpdateWechatUserLogin *sql.Stmt // 微信登录时间和登录次数更新
var stmtInsertDevHexCommandRecord *sql.Stmt
var stmtInsertDevConnectRecord *sql.Stmt
var stmtInsertDevHexResetRecord *sql.Stmt
func InitDb() {
var err error
// fmt.Println("DBDSN",config.DbDSN)
PgDb, err = sql.Open("postgres", config2.DbDSN)
if err != nil {
panic("数据库连接失败" + err.Error())
}
//PgDb.SetConnMaxLifetime()
//PgDb.SetConnMaxIdleTime()
//PgDb.SetMaxOpenConns()
//PgDb.Stats()
// 建立常用的预处理
//stmtInsertDevHexCommandRecord, err = PgDb.Prepare("INSERT INTO d_command_record VALUES($1,$2,$3,$4,$5,$6,$7,$8)") //("INSERT INTO d_hex_command_record(device_id,ctrl_code,data_len,data_hex,ciphertext)VALUES($1,$2,$3,$4,$5)")
//if err != nil {
// panic("建立stmtDevHexCommandRecord失败:" + err.Error())
//}
//stmtInsertDevConnectRecord, err = PgDb.Prepare("INSERT INTO d_connect_record VALUES($1,$2)")
//if err != nil {
// panic("建立stmtDevHexConnectRecord失败:" + err.Error())
//}
//stmtInsertDevHexResetRecord, err = PgDb.Prepare("INSERT INTO d_reset_record VALUES($1,$2,$3,$4,point($5,$6),$7)")
//if err != nil {
// panic("建立stmtDevHexConnectRecord失败:" + err.Error())
//}
////stmtInsertUserCallRecord, err = PgDb.Prepare("INSERT INTO u_call_record VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16)")
////if err != nil {
//// panic("建立stmtUserCallRecord失败:" + err.Error())
////}
// 微信登录时间和登录次数更新
stmtUpdateWechatUserLogin, err = PgDb.Prepare("UPDATE u_we_customer SET login_at=$1,login_count=login_count+1 WHERE id=$2")
if err != nil {
panic("建立stmtUpdateWechatUserLogin失败:" + err.Error())
}
}
func CloseDb() {
if stmtUpdateWechatUserLogin != nil { // 微信登录时间和登录次数更新
_ = stmtUpdateWechatUserLogin.Close()
}
if stmtInsertDevHexCommandRecord != nil {
_ = stmtInsertDevHexCommandRecord.Close()
}
if stmtInsertDevConnectRecord != nil {
_ = stmtInsertDevConnectRecord.Close()
}
if stmtInsertDevHexResetRecord != nil {
_ = stmtInsertDevHexResetRecord.Close()
}
//if stmtInsertUCallRecordAndUpdateUSimInfo != nil {
// _ = stmtInsertUCallRecordAndUpdateUSimInfo.Close()
//}
//_ = stmtInsertUserCardUser.Close()
_ = PgDb.Close()
}
package devproduct
import (
"dc_golang_server_1/data_db_cache/dbdao"
"dc_golang_server_1/data_db_cache/dbcurd"
"dc_golang_server_1/logger"
"dc_golang_server_1/util"
"encoding/hex"
......@@ -37,7 +37,7 @@ type HexData struct {
}
func /*(d *DCLongTCPHex)*/ insertDevHexCommandRecord(data *HexData, ciphertext string, direction uint8) {
go dbdao.InsertDevCommandRecord(dbdao.TableDevHexCommandRecord{
go dbcurd.InsertDevCommandRecord(dbcurd.TableDevHexCommandRecord{
DevID: data.DevID,
DevUtc: data.TimeUtc,
CtrlCode: strconv.FormatUint(uint64(data.CtrlCode), 16),
......@@ -52,20 +52,20 @@ func (d *DCLongTCPHex) receiveResponse(conn *net.TCPConn, data []byte, nowConnDe
c, err := util.DecryptBase64ToBytes(data, d.password, d.iv)
if err != nil {
if nowConnDevID != 0 {
dbdao.InsertDevCommandErr(nowConnDevID, string(data), "Decrypt err")
dbcurd.InsertDevCommandErr(nowConnDevID, string(data), "Decrypt err")
}
return 0
}
if util.CheckCRC(c) == false {
dbdao.InsertDevCommandErr(nowConnDevID, string(data), "CheckCRC err")
dbcurd.InsertDevCommandErr(nowConnDevID, string(data), "CheckCRC err")
return 0
}
cLen := len(c)
if cLen < 12 {
dbdao.InsertDevCommandErr(nowConnDevID, string(data), "cLen<12")
dbcurd.InsertDevCommandErr(nowConnDevID, string(data), "cLen<12")
return 0
} else if int(c[9])+12 != cLen {
dbdao.InsertDevCommandErr(nowConnDevID, string(data), "cLen!=c[9]+12")
dbcurd.InsertDevCommandErr(nowConnDevID, string(data), "cLen!=c[9]+12")
return 0
}
......@@ -75,13 +75,13 @@ func (d *DCLongTCPHex) receiveResponse(conn *net.TCPConn, data []byte, nowConnDe
// 时间有效性判断
nowTimeUtc := uint32(time.Now().Unix())
if nowTimeUtc > rData.TimeUtc+300 || rData.TimeUtc > nowTimeUtc+300 {
dbdao.InsertDevCommandErr(nowConnDevID, string(data), "utc err:"+strconv.FormatUint(uint64(rData.TimeUtc), 10))
dbcurd.InsertDevCommandErr(nowConnDevID, string(data), "utc err:"+strconv.FormatUint(uint64(rData.TimeUtc), 10))
return 0
}
// 设备类型判断
if c[4] != d.devType {
dbdao.InsertDevCommandErr(nowConnDevID, string(data), "devType error")
dbcurd.InsertDevCommandErr(nowConnDevID, string(data), "devType error")
return 0
}
......
package devproduct
import (
"dc_golang_server_1/data_db_cache/dbdao"
"dc_golang_server_1/data_db_cache/dbcurd"
"dc_golang_server_1/logger"
config2 "dc_golang_server_1/util/config"
"go.uber.org/zap"
......@@ -93,7 +93,7 @@ func (s *TCPLongServer) connectionHandle(conn *net.TCPConn, callBack receiveCall
if co, ok := connMyID.(*net.TCPConn); ok { // 类型断言
if co == conn {
s.ConnectMap.Delete(myDevID)
dbdao.DevConnectRecord(myDevID, 1) // state 0:新连接来了 1:设备正常离线 2:正常离线 3:新连接挤掉就连接 4:未知异常(连接池类型断言失败)
dbcurd.DevConnectRecord(myDevID, 1) // state 0:新连接来了 1:设备正常离线 2:正常离线 3:新连接挤掉就连接 4:未知异常(连接池类型断言失败)
//logger.Log.Debug("device offline",
// zap.String("Src", "TCP-SERVER-connectionHandle"),
// zap.Uint32("DevID", myDevID),
......@@ -101,7 +101,7 @@ func (s *TCPLongServer) connectionHandle(conn *net.TCPConn, callBack receiveCall
// zap.String("State", "offline"))
} else {
// s.ConnectMap.Delete(myDevID) 这里人家存了新的,不能去删了噻
dbdao.DevConnectRecord(myDevID, 3) // state 0:新连接来了 1:设备正常离线 2:正常离线 3:新连接挤掉就连接 4:未知异常(连接池类型断言失败)
dbcurd.DevConnectRecord(myDevID, 3) // state 0:新连接来了 1:设备正常离线 2:正常离线 3:新连接挤掉就连接 4:未知异常(连接池类型断言失败)
//logger.Log.Debug("have a new link,close old link",
// zap.String("Src", "TCP-SERVER-connectionHandle"),
// zap.Uint32("DevID", myDevID),
......@@ -115,7 +115,7 @@ func (s *TCPLongServer) connectionHandle(conn *net.TCPConn, callBack receiveCall
// zap.Uint32("DevID", myDevID),
// zap.String("Conn", conn.RemoteAddr().String()),
// zap.String("State", "offline")) // 类型断言失败
dbdao.DevConnectRecord(myDevID, 4) // state 0:新连接来了 1:设备正常离线 2:正常离线 3:新连接挤掉就连接 4:未知异常(连接池类型断言失败)
dbcurd.DevConnectRecord(myDevID, 4) // state 0:新连接来了 1:设备正常离线 2:正常离线 3:新连接挤掉就连接 4:未知异常(连接池类型断言失败)
}
} else {
//logger.Log.Debug("map no have myDevID",
......@@ -123,7 +123,7 @@ func (s *TCPLongServer) connectionHandle(conn *net.TCPConn, callBack receiveCall
// zap.Uint32("DevID", myDevID),
// zap.String("Conn", conn.RemoteAddr().String()),
// zap.String("State", "offline"))
dbdao.DevConnectRecord(myDevID, 2) // state 0:新连接来了 1:设备正常离线 2:正常离线 3:新连接挤掉就连接 4:未知异常(连接池类型断言失败)
dbcurd.DevConnectRecord(myDevID, 2) // state 0:新连接来了 1:设备正常离线 2:正常离线 3:新连接挤掉就连接 4:未知异常(连接池类型断言失败)
}
}
......@@ -221,7 +221,7 @@ func (s *TCPLongServer) connectionHandle(conn *net.TCPConn, callBack receiveCall
}*/
}
// logger 新链接来的合法设备
dbdao.DevConnectRecord(newID, 0)
dbcurd.DevConnectRecord(newID, 0)
//logger.Log.Debug("a new link is coming",
// zap.String("Src", "TCP-SERVER-connectionHandle"),
// zap.Uint32("DevID", newID),
......
......@@ -48,7 +48,7 @@ var doc = `{
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/dbdao.TableBaseArea"
"$ref": "#/definitions/dbcurd.TableBaseArea"
}
}
],
......@@ -552,7 +552,7 @@ var doc = `{
"tags": [
"家长微信"
],
"summary": "创建一个学生 [complete](同一微信号并发创建学生,缓存WechatCustomerMap弱安全)",
"summary": "创建一个学生 [complete](同一微信号并发创建学生,WechatCustomerMap缓存弱安全)",
"parameters": [
{
"description": "学生信息",
......@@ -560,7 +560,7 @@ var doc = `{
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/dbdao.InsertTableUserCardUser"
"$ref": "#/definitions/dbcurd.InsertTableUserCardUserStruct"
}
}
],
......@@ -629,7 +629,7 @@ var doc = `{
"tags": [
"家长微信"
],
"summary": "主家长删除一个学生",
"summary": "主家长删除一个学生,(当家长点删除时弹框二次确认)",
"parameters": [
{
"type": "integer",
......@@ -917,6 +917,28 @@ var doc = `{
}
}
},
"/we/stulist": {
"get": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "获取学生列表",
"tags": [
"家长微信"
],
"summary": "获取学生列表 [complete]",
"responses": {
"0": {
"description": "",
"schema": {
"$ref": "#/definitions/api_we.weUserListStruct"
}
}
}
}
},
"/we/trend/{id}": {
"get": {
"security": [
......@@ -1006,59 +1028,7 @@ var doc = `{
}
}
},
"api_we.WeMasterLoginResUserInfoStruct": {
"type": "object",
"properties": {
"area": {
"description": "区域名字",
"type": "string",
"example": "温江实验中学"
},
"class": {
"description": "0无意义",
"type": "integer"
},
"grade": {
"description": "0无意义 \"1~9对应一年级~九年级,10~12对应高一~高三\"",
"type": "integer"
},
"id": {
"description": "学生ID",
"type": "integer"
},
"name": {
"type": "string"
},
"service": {
"description": "对应6个数字对应公话、定位、饮水、卡消费、洗浴、洗衣机图标(0不显示,1正常,2显示但提示校区暂未开通该服务)",
"type": "array",
"items": {
"type": "integer"
},
"example": [
1,
2,
2,
0,
0,
0
]
},
"sex": {
"description": "0无意义 1女 2男",
"type": "integer"
},
"stuNum": {
"description": "\"\"无意义",
"type": "string"
},
"topUp": {
"description": "是否已充值(已充值则不能删除,未充值可以删除)",
"type": "boolean"
}
}
},
"api_we.WeSlaveLoginResUserInfoStruct": {
"api_we.WeResUserInfoStruct": {
"type": "object",
"properties": {
"area": {
......@@ -1081,21 +1051,6 @@ var doc = `{
"name": {
"type": "string"
},
"service": {
"description": "对应6个数字对应公话、定位、饮水、卡消费、洗浴、洗衣机图标(0不显示,1正常,2显示但提示校区暂未开通该服务)",
"type": "array",
"items": {
"type": "integer"
},
"example": [
1,
2,
2,
0,
0,
0
]
},
"sex": {
"description": "0无意义 1女 2男",
"type": "integer"
......@@ -1295,14 +1250,14 @@ var doc = `{
"description": "自己创建的学生列表(主家长)",
"type": "array",
"items": {
"$ref": "#/definitions/api_we.WeMasterLoginResUserInfoStruct"
"$ref": "#/definitions/api_we.WeResUserInfoStruct"
}
},
"slave": {
"description": "添加的学生列表(副家长)",
"type": "array",
"items": {
"$ref": "#/definitions/api_we.WeSlaveLoginResUserInfoStruct"
"$ref": "#/definitions/api_we.WeResUserInfoStruct"
}
},
"token": {
......@@ -1318,6 +1273,25 @@ var doc = `{
}
}
},
"api_we.weUserListStruct": {
"type": "object",
"properties": {
"master": {
"description": "自己创建的学生列表(主家长)",
"type": "array",
"items": {
"$ref": "#/definitions/api_we.WeResUserInfoStruct"
}
},
"slave": {
"description": "添加的学生列表(副家长)",
"type": "array",
"items": {
"$ref": "#/definitions/api_we.WeResUserInfoStruct"
}
}
}
},
"api_we.wechatCardUsersTrendType": {
"type": "object",
"properties": {
......@@ -1339,7 +1313,7 @@ var doc = `{
}
}
},
"dbdao.InsertTableUserCardUser": {
"dbcurd.InsertTableUserCardUserStruct": {
"type": "object",
"properties": {
"areaID": {
......@@ -1370,7 +1344,7 @@ var doc = `{
}
}
},
"dbdao.TableBaseArea": {
"dbcurd.TableBaseArea": {
"type": "object",
"properties": {
"county_id": {
......
......@@ -537,7 +537,7 @@
"tags": [
"家长微信"
],
"summary": "创建一个学生 [complete](同一微信号并发创建学生,缓存WechatCustomerMap弱安全)",
"summary": "创建一个学生 [complete](同一微信号并发创建学生,WechatCustomerMap缓存弱安全)",
"parameters": [
{
"description": "学生信息",
......@@ -545,7 +545,7 @@
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/dbdao.InsertTableUserCardUser"
"$ref": "#/definitions/dbdao.InsertTableUserCardUserStruct"
}
}
],
......@@ -614,7 +614,7 @@
"tags": [
"家长微信"
],
"summary": "主家长删除一个学生",
"summary": "主家长删除一个学生,(当家长点删除时弹框二次确认)",
"parameters": [
{
"type": "integer",
......@@ -902,6 +902,28 @@
}
}
},
"/we/stulist": {
"get": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "获取学生列表",
"tags": [
"家长微信"
],
"summary": "获取学生列表 [complete]",
"responses": {
"0": {
"description": "",
"schema": {
"$ref": "#/definitions/api_we.weUserListStruct"
}
}
}
}
},
"/we/trend/{id}": {
"get": {
"security": [
......@@ -991,59 +1013,7 @@
}
}
},
"api_we.WeMasterLoginResUserInfoStruct": {
"type": "object",
"properties": {
"area": {
"description": "区域名字",
"type": "string",
"example": "温江实验中学"
},
"class": {
"description": "0无意义",
"type": "integer"
},
"grade": {
"description": "0无意义 \"1~9对应一年级~九年级,10~12对应高一~高三\"",
"type": "integer"
},
"id": {
"description": "学生ID",
"type": "integer"
},
"name": {
"type": "string"
},
"service": {
"description": "对应6个数字对应公话、定位、饮水、卡消费、洗浴、洗衣机图标(0不显示,1正常,2显示但提示校区暂未开通该服务)",
"type": "array",
"items": {
"type": "integer"
},
"example": [
1,
2,
2,
0,
0,
0
]
},
"sex": {
"description": "0无意义 1女 2男",
"type": "integer"
},
"stuNum": {
"description": "\"\"无意义",
"type": "string"
},
"topUp": {
"description": "是否已充值(已充值则不能删除,未充值可以删除)",
"type": "boolean"
}
}
},
"api_we.WeSlaveLoginResUserInfoStruct": {
"api_we.WeResUserInfoStruct": {
"type": "object",
"properties": {
"area": {
......@@ -1066,21 +1036,6 @@
"name": {
"type": "string"
},
"service": {
"description": "对应6个数字对应公话、定位、饮水、卡消费、洗浴、洗衣机图标(0不显示,1正常,2显示但提示校区暂未开通该服务)",
"type": "array",
"items": {
"type": "integer"
},
"example": [
1,
2,
2,
0,
0,
0
]
},
"sex": {
"description": "0无意义 1女 2男",
"type": "integer"
......@@ -1280,14 +1235,14 @@
"description": "自己创建的学生列表(主家长)",
"type": "array",
"items": {
"$ref": "#/definitions/api_we.WeMasterLoginResUserInfoStruct"
"$ref": "#/definitions/api_we.WeResUserInfoStruct"
}
},
"slave": {
"description": "添加的学生列表(副家长)",
"type": "array",
"items": {
"$ref": "#/definitions/api_we.WeSlaveLoginResUserInfoStruct"
"$ref": "#/definitions/api_we.WeResUserInfoStruct"
}
},
"token": {
......@@ -1303,6 +1258,25 @@
}
}
},
"api_we.weUserListStruct": {
"type": "object",
"properties": {
"master": {
"description": "自己创建的学生列表(主家长)",
"type": "array",
"items": {
"$ref": "#/definitions/api_we.WeResUserInfoStruct"
}
},
"slave": {
"description": "添加的学生列表(副家长)",
"type": "array",
"items": {
"$ref": "#/definitions/api_we.WeResUserInfoStruct"
}
}
}
},
"api_we.wechatCardUsersTrendType": {
"type": "object",
"properties": {
......@@ -1324,7 +1298,7 @@
}
}
},
"dbdao.InsertTableUserCardUser": {
"dbdao.InsertTableUserCardUserStruct": {
"type": "object",
"properties": {
"areaID": {
......
......@@ -40,7 +40,7 @@ definitions:
description: 选填,学号,字符串,maxLen=32
type: string
type: object
api_we.WeMasterLoginResUserInfoStruct:
api_we.WeResUserInfoStruct:
properties:
area:
description: 区域名字
......@@ -57,57 +57,6 @@ definitions:
type: integer
name:
type: string
service:
description: 对应6个数字对应公话、定位、饮水、卡消费、洗浴、洗衣机图标(0不显示,1正常,2显示但提示校区暂未开通该服务)
example:
- 1
- 2
- 2
- 0
- 0
- 0
items:
type: integer
type: array
sex:
description: 0无意义 1女 2男
type: integer
stuNum:
description: '""无意义'
type: string
topUp:
description: 是否已充值(已充值则不能删除,未充值可以删除)
type: boolean
type: object
api_we.WeSlaveLoginResUserInfoStruct:
properties:
area:
description: 区域名字
example: 温江实验中学
type: string
class:
description: 0无意义
type: integer
grade:
description: 0无意义 "1~9对应一年级~九年级,10~12对应高一~高三"
type: integer
id:
description: 学生ID
type: integer
name:
type: string
service:
description: 对应6个数字对应公话、定位、饮水、卡消费、洗浴、洗衣机图标(0不显示,1正常,2显示但提示校区暂未开通该服务)
example:
- 1
- 2
- 2
- 0
- 0
- 0
items:
type: integer
type: array
sex:
description: 0无意义 1女 2男
type: integer
......@@ -252,12 +201,12 @@ definitions:
master:
description: 自己创建的学生列表(主家长)
items:
$ref: '#/definitions/api_we.WeMasterLoginResUserInfoStruct'
$ref: '#/definitions/api_we.WeResUserInfoStruct'
type: array
slave:
description: 添加的学生列表(副家长)
items:
$ref: '#/definitions/api_we.WeSlaveLoginResUserInfoStruct'
$ref: '#/definitions/api_we.WeResUserInfoStruct'
type: array
token:
type: string
......@@ -268,6 +217,19 @@ definitions:
description: 是否已获取到微信电话
type: boolean
type: object
api_we.weUserListStruct:
properties:
master:
description: 自己创建的学生列表(主家长)
items:
$ref: '#/definitions/api_we.WeResUserInfoStruct'
type: array
slave:
description: 添加的学生列表(副家长)
items:
$ref: '#/definitions/api_we.WeResUserInfoStruct'
type: array
type: object
api_we.wechatCardUsersTrendType:
properties:
content:
......@@ -283,7 +245,7 @@ definitions:
description: 显示在第一行
type: string
type: object
dbdao.InsertTableUserCardUser:
dbdao.InsertTableUserCardUserStruct:
properties:
areaID:
description: 必填,校区ID
......@@ -686,7 +648,7 @@ paths:
name: data
required: true
schema:
$ref: '#/definitions/dbdao.InsertTableUserCardUser'
$ref: '#/definitions/dbdao.InsertTableUserCardUserStruct'
produces:
- application/json
responses:
......@@ -696,7 +658,7 @@ paths:
$ref: '#/definitions/api_we.creatCardUserRes'
security:
- ApiKeyAuth: []
summary: 创建一个学生 [complete](同一微信号并发创建学生,缓存WechatCustomerMap弱安全)
summary: 创建一个学生 [complete](同一微信号并发创建学生,WechatCustomerMap缓存弱安全)
tags:
- 家长微信
/we/carduser/{id}:
......@@ -715,7 +677,7 @@ paths:
description: ""
security:
- ApiKeyAuth: []
summary: 主家长删除一个学生
summary: 主家长删除一个学生,(当家长点删除时弹框二次确认)
tags:
- 家长微信
put:
......@@ -916,6 +878,19 @@ paths:
summary: 删除副家长(仅主家长有权限)
tags:
- 家长微信
/we/stulist:
get:
description: 获取学生列表
responses:
"0":
description: ""
schema:
$ref: '#/definitions/api_we.weUserListStruct'
security:
- ApiKeyAuth: []
summary: 获取学生列表 [complete]
tags:
- 家长微信
/we/trend/{id}:
get:
description: 微信学生首页,获取近20条用户最新动态
......
......@@ -3,7 +3,7 @@ package main
import (
"dc_golang_server_1/api/router"
"dc_golang_server_1/data_db_cache/cache"
"dc_golang_server_1/data_db_cache/dbdao"
"dc_golang_server_1/data_db_cache/dbcurd"
"dc_golang_server_1/devproduct/dcphone20"
"dc_golang_server_1/logger"
config2 "dc_golang_server_1/util/config"
......@@ -25,7 +25,6 @@ import (
func main() { //
fmt.Println(time.Now(), "system init")
runtime.GOMAXPROCS(runtime.NumCPU())
config2.Init()
logger.Init()
......@@ -33,13 +32,13 @@ func main() { //
osc := make(chan os.Signal, 1)
signal.Notify(osc, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL)
s := <-osc
dbdao.CloseDb()
dbcurd.CloseDb()
fmt.Println("程序退出:", s)
os.Exit(1)
}()
dbdao.InitDb()
// defer dbdao.CloseDb()
dbcurd.InitDb()
// defer dbcurd.CloseDb()
cache.Init()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment