|
@@ -1,19 +1,29 @@
|
|
|
package customerService
|
|
|
|
|
|
-import "github.com/baiy/Cadmin-server-go/admin"
|
|
|
+import (
|
|
|
+ "errors"
|
|
|
+ "github.com/baiy/Cadmin-server-go/admin"
|
|
|
+ "github.com/baiy/Cadmin-server-go/system/utils"
|
|
|
+ "github.com/tealeg/xlsx"
|
|
|
+ "io/ioutil"
|
|
|
+ "log"
|
|
|
+ qutil "qfw/util"
|
|
|
+ "util"
|
|
|
+)
|
|
|
|
|
|
type customMsg struct {
|
|
|
- Id int `form:"id"` //消息id
|
|
|
- MsgType int `form:"msgType"` //消息类型
|
|
|
- Title string `form:"title"` //标题
|
|
|
- Content string `form:"content"` //内容
|
|
|
- Link string `form:"link"` //链接
|
|
|
- SendMode int `form:"sendMode"` //发送时效 发送模式 1- 定时 2-实时
|
|
|
- SendTime string `form:"sendTime"` // 发送时间
|
|
|
- AndroidUrl string `form:"androidUrl"` //安卓连接
|
|
|
- IosUrl string `form:"iosUrl"` //ios连接
|
|
|
- WeChatUrl string `form:"weChatUrl"` //微信连接
|
|
|
- UserIds string `form:"userIds"` //发送用户id
|
|
|
+ Id int `form:"id"` //消息id
|
|
|
+ MsgType int `form:"msgType"` //消息类型
|
|
|
+ Title string `form:"title"` //标题
|
|
|
+ Content string `form:"content"` //内容
|
|
|
+ Link string `form:"link"` //链接
|
|
|
+ SendMode int `form:"sendMode"` //发送时效 发送模式 1- 定时 2-实时
|
|
|
+ SendTime string `form:"sendTime"` // 发送时间
|
|
|
+ AndroidUrl string `form:"androidUrl"` //安卓连接
|
|
|
+ IosUrl string `form:"iosUrl"` //ios连接
|
|
|
+ WeChatUrl string `form:"weChatUrl"` //微信连接
|
|
|
+ UserIds string `form:"userIds"` //发送用户id
|
|
|
+ UserArr []map[string]interface{} `form:"userArr"`
|
|
|
}
|
|
|
|
|
|
func CustomSendMsg(context *admin.Context) (interface{}, error) {
|
|
@@ -34,3 +44,171 @@ func CustomSendMsg(context *admin.Context) (interface{}, error) {
|
|
|
"status": status,
|
|
|
}, err
|
|
|
}
|
|
|
+
|
|
|
+func MyCustomerList(context *admin.Context) (interface{}, error) {
|
|
|
+ param := new(struct {
|
|
|
+ State string `form:"state"` //客户状态
|
|
|
+ UpdateTimeStart string `form:"updateTimeStart"` //最近更新时间筛选开始时间
|
|
|
+ UpdateTimeEnd string `form:"updateTimeEnd"` //最近更新时间筛选结束时间
|
|
|
+ CompanyName string `form:"companyName"` //公司名称
|
|
|
+ Phone string `form:"phone"`
|
|
|
+ utils.Page
|
|
|
+ })
|
|
|
+ err := context.Form(param)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ adminPhone := context.User.Phone
|
|
|
+ count, data := MyCustomerService(param.State, param.UpdateTimeStart, param.UpdateTimeEnd, param.CompanyName, param.Phone, adminPhone, param.Page.Offset, param.Page.PageSize)
|
|
|
+ return map[string]interface{}{
|
|
|
+ "lists": data,
|
|
|
+ "total": count,
|
|
|
+ }, nil
|
|
|
+}
|
|
|
+
|
|
|
+func SingleAdd(context *admin.Context) (interface{}, error) {
|
|
|
+ param := new(struct {
|
|
|
+ UserId string `form:"userId"`
|
|
|
+ })
|
|
|
+ err := context.Form(param)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ //判断是否是剑鱼用户
|
|
|
+ //userData := &map[string]interface{}{}
|
|
|
+ userData, ok := util.MQFW.FindById("user", param.UserId, `"s_phone":1,"s_m_phone":1`)
|
|
|
+ if userData != nil && len(*userData) > 0 && ok {
|
|
|
+ phone := ""
|
|
|
+ if qutil.ObjToString((*userData)["s_phone"]) != "" {
|
|
|
+ phone = qutil.ObjToString((*userData)["s_phone"])
|
|
|
+ } else {
|
|
|
+ phone = qutil.ObjToString((*userData)["s_m_phone"])
|
|
|
+ }
|
|
|
+ return map[string]interface{}{
|
|
|
+ "userId": param.UserId,
|
|
|
+ "registerPhone": phone,
|
|
|
+ }, nil
|
|
|
+ }
|
|
|
+ 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": errCount, // 失败数量
|
|
|
+ "datalist": selectUser, // 读取到的用户id信息
|
|
|
+ "errUrl": url, // 失败的原因
|
|
|
+ }
|
|
|
+ return returnRs, nil
|
|
|
+}
|
|
|
+
|
|
|
+// GetUserInfo 消息记录中获取发送用户的信息
|
|
|
+func GetUserInfo(context *admin.Context) (interface{}, error) {
|
|
|
+ param := new(struct {
|
|
|
+ MsgId int `form:"msgId"`
|
|
|
+ utils.Page
|
|
|
+ })
|
|
|
+ err := context.Form(param)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ userData := FindUserInfo(param.MsgId, param.Page.Offset, param.Page.PageSize)
|
|
|
+ return userData, nil
|
|
|
+}
|