qnc-server-old/utils/parseIdCard.go

76 lines
1.5 KiB
Go
Raw Normal View History

2024-09-14 10:48:09 +08:00
package utils
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
"qnc-server/model/model"
"regexp"
"strconv"
"time"
)
func loadRegions(filename string) (map[string]model.Region, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
byteValue, _ := ioutil.ReadAll(file)
var regions map[string]model.Region
json.Unmarshal(byteValue, &regions)
return regions, nil
}
func ParseIDCard(id string) (model.IDInfo, error) {
if len(id) != 18 {
return model.IDInfo{}, fmt.Errorf("Invalid ID length")
}
// Validate the ID card number
validID, _ := regexp.MatchString(`^\d{17}[\dX]$`, id)
if !validID {
return model.IDInfo{}, fmt.Errorf("Invalid ID format")
}
regionCode := id[:6]
birthDate := id[6:14]
genderCode := id[16:17]
regions, err := loadRegions("processed.json")
if err != nil {
return model.IDInfo{}, fmt.Errorf("loadRegions error: %v", err)
}
region, exists := regions[regionCode]
if !exists {
return model.IDInfo{}, fmt.Errorf("Region code not found")
}
birth, err := time.Parse("20060102", birthDate)
if err != nil {
return model.IDInfo{}, fmt.Errorf("Invalid birth date")
}
gender, err := strconv.Atoi(genderCode)
if err != nil {
return model.IDInfo{}, fmt.Errorf("Invalid gender code")
}
genderStr := "男"
if gender%2 == 0 {
genderStr = "女"
}
return model.IDInfo{
Location: region.FullRegion,
BirthDate: birth.Format("2006年01月02日"),
Gender: genderStr,
}, nil
}