76 lines
1.5 KiB
Go
76 lines
1.5 KiB
Go
|
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, ®ions)
|
||
|
|
||
|
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
|
||
|
}
|