|
@@ -1,8 +1,12 @@
|
|
|
package customerService
|
|
|
|
|
|
+import "C"
|
|
|
import (
|
|
|
"errors"
|
|
|
"github.com/baiy/Cadmin-server-go/admin"
|
|
|
+ "github.com/tealeg/xlsx"
|
|
|
+ "io/ioutil"
|
|
|
+ "log"
|
|
|
qutil "qfw/util"
|
|
|
"util"
|
|
|
)
|
|
@@ -82,3 +86,110 @@ func SingleAdd(context *admin.Context) (interface{}, error) {
|
|
|
}
|
|
|
return nil, errors.New("添加失败,无此用户")
|
|
|
}
|
|
|
+
|
|
|
+func ImportUser(context *admin.Context) (interface{}, error) {
|
|
|
+ returnRs := map[string]interface{}{
|
|
|
+ "recordCount": 0, // 识别数量
|
|
|
+ "successCount": 0, // 成功数量
|
|
|
+ "errCount": 0, // 识别数量
|
|
|
+ "datalist": []interface{}{}, // 读取到的用户id信息
|
|
|
+ "errUrl": "", // 失败的原因
|
|
|
+ }
|
|
|
+ recordCount, successCount, errCount := 0, 0, 0
|
|
|
+ mf, _, err := context.HttpRequest.FormFile("file")
|
|
|
+ if err != nil {
|
|
|
+ log.Println(err, "获取表格失败")
|
|
|
+ return returnRs, errors.New("获取表格失败")
|
|
|
+ }
|
|
|
+ binary, err2 := ioutil.ReadAll(mf)
|
|
|
+ if err2 != nil {
|
|
|
+ log.Println("读取数据流失败", err2)
|
|
|
+ return returnRs, errors.New("读取数据流失败")
|
|
|
+ }
|
|
|
+ file, err3 := xlsx.OpenBinary(binary)
|
|
|
+ if err3 != nil || file == nil {
|
|
|
+ log.Println("读取表格失败", err3)
|
|
|
+ return returnRs, errors.New("读取表格失败")
|
|
|
+ }
|
|
|
+
|
|
|
+ fileData, err4 := file.ToSlice()
|
|
|
+ if err4 != nil {
|
|
|
+ log.Println("表格转换失败:", err4)
|
|
|
+ return returnRs, errors.New("请上传格式为EXCEL文件,扩展名:xlsx")
|
|
|
+ }
|
|
|
+ if len(fileData) == 0 || len(fileData[0]) < 7 {
|
|
|
+ return returnRs, errors.New("请确认内容是否正确,至少需要有一条用户信息")
|
|
|
+ }
|
|
|
+
|
|
|
+ userData := fileData[0][6:] // 截取有效id
|
|
|
+ userIds := map[string]bool{} // 用于判断是否重复导入用户
|
|
|
+ var saveData [][]interface{} // 用于写入错误原因文件的数据 数据结构: [[userId,errReason],...]
|
|
|
+ var selectUser []map[string]interface{} // 用户选择的数据 数据结构[{userId:"1",phone:"18238182402"}...]
|
|
|
+ //遍历用户id 验证数据有效性
|
|
|
+ log.Println(userData)
|
|
|
+ for _, v := range userData {
|
|
|
+ recordCount++ // 记录读取到的条数
|
|
|
+ // 判断是否超过2000条数据,原因:超过2000条以后的数据导入失败。
|
|
|
+ if len(userIds) == 2000 {
|
|
|
+ reason := []interface{}{
|
|
|
+ v[0], "超过2000条以后的数据导入失败",
|
|
|
+ }
|
|
|
+ errCount++ // 错误记录数量++
|
|
|
+ saveData = append(saveData, reason) // 保存到待生成错误文件的数据中
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ // 判断用户ID错误,无此用户,原因:用户ID错误,无此用户;
|
|
|
+ userRs, b := GetUserById(v[0])
|
|
|
+ var phone string
|
|
|
+ if b == true && userRs != nil && len(*userRs) > 0 {
|
|
|
+ //获取用户手机号信息
|
|
|
+ if qutil.ObjToString((*userRs)["s_phone"]) != "" {
|
|
|
+ phone = qutil.ObjToString((*userRs)["s_phone"])
|
|
|
+ } else {
|
|
|
+ phone = qutil.ObjToString((*userRs)["s_m_phone"])
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+ log.Println("未查询到该用户:", v[0])
|
|
|
+ reason := []interface{}{
|
|
|
+ v[0], "用户ID错误,无此用户",
|
|
|
+ }
|
|
|
+ errCount++ // 错误记录数量++
|
|
|
+ saveData = append(saveData, reason) // 保存到待生成错误文件的数据中
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ // 判断已选择用户“重复”导入,原因:重复导入;
|
|
|
+ if _, ok := userIds[v[0]]; ok {
|
|
|
+ reason := []interface{}{
|
|
|
+ v[0], "重复导入",
|
|
|
+ }
|
|
|
+ errCount++ // 错误记录数量++
|
|
|
+ saveData = append(saveData, reason) // 保存到待生成错误文件的数据中
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ userIds[v[0]] = true // 追加到已存在的用户id中
|
|
|
+ tmpData := map[string]interface{}{"userId": v[0], "phone": phone}
|
|
|
+ successCount++ // 成功的数量++
|
|
|
+ selectUser = append(selectUser, tmpData) // 追加选择的用户中
|
|
|
+
|
|
|
+ }
|
|
|
+ var url string
|
|
|
+ if len(saveData) > 0 {
|
|
|
+ dirs := "/static/xlsx/errReason/"
|
|
|
+ savePath := "./web/static/xlsx/errReason/"
|
|
|
+ templatePath := "./web/static/importUserErr.xlsx"
|
|
|
+ saveName := "导入失败数据"
|
|
|
+ url, err = SaveFile(saveData, templatePath, savePath, saveName, dirs)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("生成错误信息文件失败")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ returnRs = map[string]interface{}{
|
|
|
+ "recordCount": recordCount, // 识别数量
|
|
|
+ "successCount": successCount, // 成功数量
|
|
|
+ "errCount": 0, // 识别数量
|
|
|
+ "datalist": selectUser, // 读取到的用户id信息
|
|
|
+ "errUrl": url, // 失败的原因
|
|
|
+ }
|
|
|
+ return returnRs, nil
|
|
|
+}
|