Commit f19d9418 by zhangjiec

增加硬件请求亲情号

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