package taskmanagement import ( "appPlatform/api/version1/customerform" datacenter "appPlatform/api/version1/dataCenter" "appPlatform/api/version1/workWechat" "appPlatform/middleware/grocerystore" "appPlatform/models/customerForm" "appPlatform/models/modelAppPlatform" "appPlatform/models/modelshr" "appPlatform/overall" "appPlatform/overall/publicmethod" "encoding/json" "errors" "fmt" "regexp" "strconv" "strings" "time" "github.com/gin-gonic/gin" "gorm.io/gorm" ) /* * @ 作者: 秦东 @ 时间: 2023-09-27 14:21:08 @ 功能: 用户端自定义表单新增记录 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) AddFormAddData(c *gin.Context) { data, err := c.GetRawData() //接收表单提交得数据 if err != nil { publicmethod.Result(100, err, c) return } mapData := publicmethod.MapOut[string]() //初始化MAP err = json.Unmarshal(data, &mapData) //将接收的json字符串参数转换成Map if err != nil { publicmethod.Result(100, err, c) return } if _, ok := mapData["formId"]; !ok { publicmethod.Result(1, err, c, "非法表单!不能提交数据!") return } sendData := publicmethod.MapOut[string]() var formCont modelAppPlatform.CustomerFormView //获取指定版本的表单 err = formCont.GetCont(map[string]interface{}{"`id`": mapData["formId"]}) if err != nil { publicmethod.Result(107, err, c) return } var sunFormName []string //子表名称集合 if formCont.TableStructure != "" { //拆解获取子表名称 var sunFormStruct map[string]string err = json.Unmarshal([]byte(formCont.TableStructure), &sunFormStruct) if err == nil { for _, v := range sunFormStruct { if !publicmethod.IsInTrue[string](v, sunFormName) { sunFormName = append(sunFormName, v) } } } } masterField := publicmethod.MapOut[string]() sunFieldAry := publicmethod.MapOut[string]() for k, v := range mapData { if !publicmethod.IsInTrue[string](k, sunFormName) { if !publicmethod.IsInTrue[string](k, []string{"formId", "id"}) { masterField[k] = v } } else { sunFieldAry[k] = v } } context, _ := c.Get(overall.MyContJwt) var userCont modelshr.ManCont userCont.GetLoginCont(context) uuid := publicmethod.GetUUid(1) cureeTime := time.Now().Unix() master, sunTable, jsonerr := GainFormStruct(formCont.MastesFormJson) if jsonerr != nil { publicmethod.Result(104, err, c) return } // master, _, _ := GainFormStruct(formCont.MastesFormJson) masterWriteVal := MakeTableVal(uuid, userCont.Key, cureeTime, masterField, master) //任务列表 var taskCont modelAppPlatform.Task taskCont.MastersKey = uuid taskCont.Title = fmt.Sprintf("%v-%v(%v)-%v", formCont.Name, userCont.Name, userCont.Number, publicmethod.UnixTimeToDay(cureeTime, 14)) //标题"` taskCont.Creater = userCont.Key //创建人"` taskCont.CreaterTime = cureeTime //创建时间"` taskCont.EditTime = cureeTime //编辑时间"` taskCont.Types = 1 //类型(1:普通表单;2:流程表单)"` taskCont.VersionId = formCont.Id //来源于哪个表单"` taskCont.Status = 2 //判断是否 if len(sunFieldAry) > 0 { //有子表 err = WriteSunDatabase(uuid, userCont.Key, cureeTime, formCont.TableKey, masterWriteVal, sunFieldAry, sunTable) } else { //无子表 err = overall.CONSTANT_DB_CustomerForm.Table(formCont.TableKey).Create(masterWriteVal).Error } if err != nil { publicmethod.Result(104, err, c) return } overall.CONSTANT_DB_AppPlatform.Create(&taskCont) // sendData["err"] = err // sendData["data"] = data // sendData["mapData"] = mapData // sendData["formCont"] = formCont sendData["master"] = master sendData["sunTable"] = sunTable // sendData["jsonerr"] = jsonerr // sendData["jsondfg"] = jsondfg // sendData["formJsonCont"] = formJsonCont sendData["master_len"] = len(master) sendData["sunTable_len"] = len(sunTable) // sendData["masterWriteVal"] = masterWriteVal // sendData["sunFormName"] = sunFormName // sendData["sunFieldAry"] = sunFieldAry sendData["masterField"] = masterField publicmethod.Result(0, sendData, c) } /* * @ 作者: 秦东 @ 时间: 2023-09-28 09:37:49 @ 功能: 主表与子表数据写入 @ 参数 #uuid 唯一标识 #creater 创建人 #createrTime 创建时间 #masterTableName 主表标识 #masterDataCont 主表数据 #sunDataList 字表数据列表 @ 返回值 # @ 方法原型 # */ func WriteSunDatabase(uuid, creater, createrTime int64, masterTableName string, masterDataCont, sunDataList map[string]interface{}, sunTable map[string]map[string]customerform.MasterStruct) (err error) { if len(masterDataCont) > 0 { if len(sunDataList) > 0 { sunMasterMap := publicmethod.MapOut[string]() //子表存在时,执行主表和子表数据写入 for k, v := range sunDataList { // if k == "table1693811044212" { s, ok := v.([]interface{}) //获取值类型 if !ok { err = errors.New("表单数据错误!请验证后重新提交!") return } else { //判断是否有数据 if len(s) > 0 { var sunCont []map[string]interface{} for _, sv := range s { //拆分子表 if sdf, isOk := sv.(map[string]interface{}); isOk { if sunTableType, sunIsOk := sunTable[k]; sunIsOk { masterWriteVal := MakeFormMapData(uuid, creater, createrTime, sdf, sunTableType, 2) //转换数据表值 if len(masterWriteVal) > 0 { sunCont = append(sunCont, masterWriteVal) } } } } if len(sunCont) > 0 { sunMasterMap[k] = sunCont } } } } if len(sunMasterMap) > 0 { gormDb := overall.CONSTANT_DB_CustomerForm.Begin() masterErr := gormDb.Table(masterTableName).Create(masterDataCont).Error sunCreateIsOk := true for k, v := range sunMasterMap { sunErr := gormDb.Table(k).Create(v).Error if sunErr != nil { sunCreateIsOk = false break } } if masterErr == nil && sunCreateIsOk { err = gormDb.Commit().Error publicmethod.WriteLog("write", "写入自定义表单", err, masterDataCont, sunDataList) } else { gormDb.Rollback() err = errors.New("表单数据提交失败!请重新提交") publicmethod.WriteLog("e", "写入自定义表单", masterTableName, err) } } else { gormDb := overall.CONSTANT_DB_CustomerForm masterErr := gormDb.Table(masterTableName).Create(masterDataCont).Error if masterErr != nil { publicmethod.WriteLog("write", "写入自定义表单", masterTableName, masterErr) } } } else { //子表不存在时,写入主表数据 err = overall.CONSTANT_DB_CustomerForm.Table(masterTableName).Create(masterDataCont).Error publicmethod.WriteLog("write", "写入自定义表单", masterTableName, err) } } else { err = errors.New("表单数据提交失败!请重新提交") publicmethod.WriteLog("e", "写入自定义表单", masterTableName, err) } return } /* * @ 作者: 秦东 @ 时间: 2023-09-27 16:01:48 @ 功能: 组装数据表值 @ 参数 # @ 返回值 # @ 方法原型 # */ func MakeTableVal(uuid, userKey, cureeTime int64, fieldVal map[string]interface{}, subUnit map[string]customerform.MasterStruct) map[string]interface{} { keyAndVal := make(map[string]interface{}) keyAndVal["masters_key"] = uuid keyAndVal["creater"] = userKey keyAndVal["creater_time"] = cureeTime keyAndVal["edit_time"] = cureeTime for k, v := range fieldVal { if v != "" { if val, isOk := subUnit[k]; isOk { fielfInfoClass := customerform.AnalysisTable(val) // fmt.Printf("k--->%v\nv--->%T\nfielfInfoClass------>%v\n\n\n", k, v, fielfInfoClass) switch fielfInfoClass.Types { case "int", "bigint": //值类型是数组,并且需要分开存储 switch fielfInfoClass.ControlType { case "year", "month", "date", "datetime": if strVal, ok := v.(string); ok { localTime, _ := time.ParseInLocation(time.RFC3339, strVal, time.Local) keyAndVal[k] = localTime.Unix() } else { keyAndVal[k] = v } case "array": if fielfInfoClass.Signed { kEnd := fmt.Sprintf("%v_end", k) if strVal, ok := v.([]interface{}); ok { if len(strVal) >= 2 { if starTimeStr, tOk := strVal[0].(string); tOk { starTime, _ := time.ParseInLocation(time.RFC3339, starTimeStr, time.Local) keyAndVal[k] = starTime.Unix() } else { keyAndVal[k] = strVal[0] } if endTimeStr, tOk := strVal[len(strVal)-1].(string); tOk { endTime, _ := time.ParseInLocation(time.RFC3339, endTimeStr, time.Local) keyAndVal[kEnd] = endTime.Unix() } else { keyAndVal[kEnd] = strVal[len(strVal)-1] } } } } else { if strVal, ok := v.(string); ok { floatVal, _ := strconv.ParseInt(strVal, 10, 64) keyAndVal[k] = floatVal } else { keyAndVal[k] = v } } case "bigint": if strVal, ok := v.(string); ok { floatVal, _ := strconv.ParseInt(strVal, 10, 64) keyAndVal[k] = floatVal } else { keyAndVal[k] = v } case "int": if strVal, ok := v.(string); ok { floatVal, _ := strconv.Atoi(strVal) keyAndVal[k] = floatVal } else { keyAndVal[k] = v } case "booble": if strVal, ok := v.(string); ok { floatVal, _ := strconv.Atoi(strVal) keyAndVal[k] = floatVal } else if strVal, ok := v.(bool); ok { if strVal { keyAndVal[k] = fielfInfoClass.DefaultValue } else { keyAndVal[k] = fielfInfoClass.DefaultValuees } } else { keyAndVal[k] = v } default: } case "booble": if strVal, ok := v.(string); ok { floatVal, _ := strconv.Atoi(strVal) keyAndVal[k] = floatVal } else if strVal, ok := v.(bool); ok { if strVal { keyAndVal[k] = fielfInfoClass.DefaultValue } else { keyAndVal[k] = fielfInfoClass.DefaultValuees } } else { keyAndVal[k] = v } case "float": if strVal, ok := v.(string); ok { floatVal, _ := strconv.ParseFloat(strVal, 64) keyAndVal[k] = floatVal } else { keyAndVal[k] = v } case "decimal": if strVal, ok := v.(string); ok { floatVal, _ := strconv.ParseFloat(strVal, 64) keyAndVal[k] = floatVal } else { keyAndVal[k] = v } case "mediumtext", "longtext": if valAry, ok := v.([]interface{}); ok { if len(valAry) > 0 { valStrJson, _ := json.Marshal(valAry) keyAndVal[k] = string(valStrJson) } else { keyAndVal[k] = "" } } else { if fielfInfoClass.ControlType == "array" { if valStr, ok := v.(string); ok { valStrAry := strings.Split(valStr, ",") if len(valStrAry) > 0 { valStrJson, _ := json.Marshal(valStrAry) keyAndVal[k] = string(valStrJson) } else { keyAndVal[k] = "" } } else { keyAndVal[k] = v } } else { keyAndVal[k] = v } } default: if fielfInfoClass.Types != "" { if valAry, ok := v.([]interface{}); ok { if len(valAry) > 0 { valStrJson, _ := json.Marshal(valAry) keyAndVal[k] = string(valStrJson) } else { keyAndVal[k] = "" } } else { if fielfInfoClass.ControlType == "array" { if valStr, ok := v.(string); ok { valStrAry := strings.Split(valStr, ",") if len(valStrAry) > 0 { valStrJson, _ := json.Marshal(valStrAry) keyAndVal[k] = string(valStrJson) } else { keyAndVal[k] = "" } } else { keyAndVal[k] = v } } else { keyAndVal[k] = v } } } } } } // } else { // keyAndVal[k] = v // } } return keyAndVal } /* * @ 作者: 秦东 @ 时间: 2023-09-27 14:30:57 @ 功能: 获取组件结构体 @ 参数 # @ 返回值 # @ 方法原型 # */ func GainFormStruct(formTabelJson string) (master map[string]customerform.MasterStruct, sunTable map[string]map[string]customerform.MasterStruct, err error) { //将表格组件json数据转化成结构体 var formJsonCont customerform.CustomerFormMaster json.Unmarshal([]byte(formTabelJson), &formJsonCont) // fmt.Printf("将表格组件json数据转化成结构体---->%v---->%v\n", err, formTabelJson) // if err != nil { // return // } masterAry := make(map[string]customerform.MasterStruct) sunTableAry := make(map[string]map[string]customerform.MasterStruct) for _, v := range formJsonCont.List { switch v.Type { case "grid", "tabs": if len(v.Columns) > 0 { for _, cv := range v.Columns { for _, cvl := range cv.List { masterAry[cvl.Name] = cvl } } } case "card", "div": if len(v.List) > 0 { for _, cvl := range v.List { masterAry[cvl.Name] = cvl } } case "table", "flex": if len(v.List) > 0 { sunTableGd := make(map[string]customerform.MasterStruct) for _, vl := range v.List { sunTableGd[vl.Name] = vl } sunTableAry[v.Name] = sunTableGd } default: // fmt.Printf("获取组件结构体-->%v-->%v\n", v.Name, v) if v.Name != "" { masterAry[v.Name] = v } } } master = masterAry sunTable = sunTableAry return } /* * @ 作者: 秦东 @ 时间: 2023-10-07 13:18:35 @ 功能: 用户端自定义表单新增记录(新版) @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) AddFormAddNewData(c *gin.Context) { data, err := c.GetRawData() //接收表单提交得数据 if err != nil { publicmethod.Result(100, err, c) return } mapData := publicmethod.MapOut[string]() //初始化MAP err = json.Unmarshal(data, &mapData) //将接收的json字符串参数转换成Map if err != nil { publicmethod.Result(100, err, c) return } if _, ok := mapData["formId"]; !ok { publicmethod.Result(1, err, c, "非法表单!不能提交数据!") return } var formCont modelAppPlatform.CustomerFormView //获取指定版本的表单 err = formCont.GetCont(map[string]interface{}{"`id`": mapData["formId"]}) if err != nil { publicmethod.Result(107, err, c) return } var sunFormName []string //子表名称集合 if formCont.TableStructure != "" { //拆解获取子表名称 var sunFormStruct map[string]string err = json.Unmarshal([]byte(formCont.TableStructure), &sunFormStruct) if err == nil { for _, v := range sunFormStruct { if !publicmethod.IsInTrue[string](v, sunFormName) { sunFormName = append(sunFormName, v) } } } } masterField := publicmethod.MapOut[string]() //主表数据 sunFieldAry := publicmethod.MapOut[string]() //子表数据 for k, v := range mapData { if !publicmethod.IsInTrue[string](k, sunFormName) { if !publicmethod.IsInTrue[string](k, []string{"formId", "id"}) { masterField[k] = v } } else { sunFieldAry[k] = v } } context, _ := c.Get(overall.MyContJwt) var userCont modelshr.ManCont userCont.GetLoginCont(context) //当前操作人 uuid := publicmethod.GetUUid(1) //统一识别符 cureeTime := time.Now().Unix() //写入时间 var formJsonCont customerform.CustomerFormMaster json.Unmarshal([]byte(formCont.MastesFormJson), &formJsonCont) var formUnitCont customerform.FormUnitInfo formUnitCont.GainMasterAndSunFormUnit(formCont.TableKey, formJsonCont.List, true) masterUnitList := make(map[string]customerform.MasterStruct) for _, v := range formUnitCont.MasterInfo { masterUnitList[v.Name] = v } masrWriteMap := MakeFormMapData(uuid, userCont.Key, cureeTime, masterField, masterUnitList, 1) masrWriteMap["flowIsOpen"] = formCont.FlowIsOpen //任务列表 var taskCont modelAppPlatform.Task taskCont.MastersKey = uuid taskCont.Title = fmt.Sprintf("%v-%v(%v)-%v", formCont.Name, userCont.Name, userCont.Number, publicmethod.UnixTimeToDay(cureeTime, 14)) //标题"` taskCont.Creater = userCont.Key //创建人"` taskCont.CreaterTime = cureeTime //创建时间"` taskCont.EditTime = cureeTime //编辑时间"` taskCont.Types = formCont.Classify //类型(1:普通表单;2:流程表单)"` taskCont.VersionId = formCont.Id //来源于哪个表单"` taskCont.Status = 2 if formCont.Classify == 2 { taskCont.Status = 3 taskCont.FlowKey = formCont.Flowkey var flowInfo modelAppPlatform.FlowVersion flowInfo.GetCont(map[string]interface{}{"`key`": formCont.Flowkey, "`state`": 1}, "`id`") taskCont.FlowRunSing = flowInfo.Id } //判断是否 if len(sunFieldAry) > 0 { //有子表 sunTypeAry := make(map[string]map[string]customerform.MasterStruct) for _, v := range formUnitCont.SunFormInfo { sunTypeAry[v.TableName] = v.UbitInfo } err = WriteSunDatabase(uuid, userCont.Key, cureeTime, formCont.TableKey, masrWriteMap, sunFieldAry, sunTypeAry) } else { // //无子表 err = overall.CONSTANT_DB_CustomerForm.Table(formCont.TableKey).Create(masrWriteMap).Error } if err != nil { publicmethod.Result(104, err, c) return } taskCont.MastesForm = formCont.MastesForm taskCont.MastesFormJson = formCont.MastesFormJson err = overall.CONSTANT_DB_AppPlatform.Create(&taskCont).Error // for k, v := range masrWriteMap { // fmt.Printf("%v----> %T\n", k, v) // } sendData := publicmethod.MapOut[string]() sendData["uuid"] = strconv.FormatInt(uuid, 10) sendData["cureeTime"] = cureeTime sendData["formUnitCont"] = formUnitCont sendData["masterField"] = masterField sendData["sunFieldAry"] = sunFieldAry sendData["sunFieldAry_len"] = len(sunFieldAry) sendData["masrWriteMap"] = masrWriteMap sendData["sunFormName"] = sunFormName sendData["mapData"] = mapData publicmethod.Result(0, sendData, c) } /* * @ 作者: 秦东 @ 时间: 2023-10-07 15:35:07 @ 功能: 组装数据表新增数据 @ 参数 #uuid 统一识别符 #userKey 当前操作人 #cureeTime 操作时间 #fieldVal 提交数据得键值对 #subUnit 组件信息 #calss 1:新增;2:编辑 @ 返回值 # @ 方法原型 # */ func MakeFormMapData(uuid, userKey, cureeTime int64, fieldVal map[string]interface{}, subUnit map[string]customerform.MasterStruct, calss int) map[string]interface{} { keyAndVal := make(map[string]interface{}) if calss == 1 { keyAndVal["creater_time"] = cureeTime } keyAndVal["masters_key"] = uuid keyAndVal["creater"] = userKey keyAndVal["edit_time"] = cureeTime for k, v := range fieldVal { fmt.Printf("写入字段:%v->%v\n", k, v) if k == "id" { keyAndVal[k] = v } if v != "" { if val, isOk := subUnit[k]; isOk { fmt.Printf("写入字段--->:%v->%v\n", k, val) fielfInfoClass := customerform.AnalysisFormUnitClass(val) switch fielfInfoClass.FieldType { case "int": if strVal, ok := v.(string); ok { keyAndVal[k], _ = strconv.Atoi(strVal) } else { keyAndVal[k] = v } case "bigint": if fielfInfoClass.ValIsAry { //判断值是否为数组 endField := fmt.Sprintf("%v_end", k) if strVal, ok := v.([]interface{}); ok { if len(strVal) >= 2 { if starTimeStr, tOk := strVal[0].(string); tOk { keyAndVal[k], _ = strconv.ParseInt(starTimeStr, 10, 64) } else { keyAndVal[k] = strVal[0] } if endTimeStr, tOk := strVal[len(strVal)-1].(string); tOk { keyAndVal[endField], _ = strconv.ParseInt(endTimeStr, 10, 64) } else { keyAndVal[endField] = strVal[len(strVal)-1] } } } } else { if strVal, ok := v.(string); ok { fieldVal, _ := strconv.ParseInt(strVal, 10, 64) keyAndVal[k] = fieldVal } else { keyAndVal[k] = v } } case "float": if strVal, ok := v.(string); ok { floatVal, _ := strconv.ParseFloat(strVal, 64) keyAndVal[k] = floatVal } else { keyAndVal[k] = v } case "decimal": if strVal, ok := v.(string); ok { floatVal, _ := strconv.ParseFloat(strVal, 64) keyAndVal[k] = floatVal } else { keyAndVal[k] = v } case "mediumtext", "longtext": if valAry, ok := v.([]interface{}); ok { if len(valAry) > 0 { valStrJson, _ := json.Marshal(valAry) keyAndVal[k] = string(valStrJson) } else { keyAndVal[k] = "" } } else { if fielfInfoClass.ValIsAry && fielfInfoClass.UnitName != "upload" { if valStr, ok := v.(string); ok { valStrAry := strings.Split(valStr, ",") if len(valStrAry) > 0 { valStrJson, _ := json.Marshal(valStrAry) keyAndVal[k] = string(valStrJson) } else { keyAndVal[k] = "" } } else if valAry, ok := v.([]interface{}); ok { if len(valAry) > 0 { valStrJson, _ := json.Marshal(valAry) keyAndVal[k] = string(valStrJson) } else { keyAndVal[k] = "" } } else { keyAndVal[k] = v } } else { keyAndVal[k] = v } } case "varchar": if valAry, ok := v.([]interface{}); ok { if len(valAry) > 0 { valStrJson, _ := json.Marshal(valAry) keyAndVal[k] = string(valStrJson) } else { keyAndVal[k] = "" } } else { if fielfInfoClass.ValIsAry { if valStr, ok := v.(string); ok { valStrAry := strings.Split(valStr, ",") if len(valStrAry) > 0 { valStrJson, _ := json.Marshal(valStrAry) keyAndVal[k] = string(valStrJson) } else { keyAndVal[k] = "" } } else { keyAndVal[k] = v } } else { keyAndVal[k] = v } } default: } } } } return keyAndVal } /* * @ 作者: 秦东 @ 时间: 2024-04-03 09:40:31 @ 功能:用户端自定义表单新增记录(列表新版) @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) AddCustomerForm(c *gin.Context) { data, err := c.GetRawData() //接收表单提交得数据 if err != nil { publicmethod.Result(100, err, c) return } mapData := publicmethod.MapOut[string]() //初始化MAP err = json.Unmarshal(data, &mapData) //将接收的json字符串参数转换成Map if err != nil { publicmethod.Result(100, err, c) return } status := 2 if _, ok := mapData["formId"]; !ok { publicmethod.Result(1, err, c, "非法表单!不能提交数据!") return } var appKey int64 = 0 if appKeyVal, ok := mapData["appKey"]; ok { appKey, _ = publicmethod.StringToInt64(appKeyVal) } var tableKey int64 = 0 if tableVal, ok := mapData["versionId"]; ok { tableKey, _ = publicmethod.StringToInt64(tableVal) } if val, ok := mapData["status"]; !ok { if valInt, isTrue := val.(int); isTrue { status = valInt if valInt <= 0 { status = 2 } } } else { status = 2 } var formCont modelAppPlatform.CustomerFormView //获取指定版本的表单 err = formCont.GetCont(map[string]interface{}{"`id`": mapData["formId"]}) if err != nil { publicmethod.Result(107, err, c) return } var sunFormName []string //子表名称集合 if formCont.TableStructure != "" { //拆解获取子表名称 var sunFormStruct map[string]string err = json.Unmarshal([]byte(formCont.TableStructure), &sunFormStruct) if err == nil { for _, v := range sunFormStruct { if !publicmethod.IsInTrue[string](v, sunFormName) { sunFormName = append(sunFormName, v) } } } } var formJsonCont customerform.CustomerFormMaster json.Unmarshal([]byte(formCont.MastesFormJson), &formJsonCont) masterField := publicmethod.MapOut[string]() //主表数据 sunFieldAry := publicmethod.MapOut[string]() //子表数据 for k, v := range mapData { if !publicmethod.IsInTrue[string](k, sunFormName) { if !publicmethod.IsInTrue[string](k, []string{"formId", "id"}) { masterField[k] = v } } else { sunFieldAry[k] = v } } context, _ := c.Get(overall.MyContJwt) var userCont modelshr.ManCont userCont.GetLoginCont(context) //当前操作人 uuid := publicmethod.GetUUid(1) //统一识别符 cureeTime := time.Now().Unix() //写入时间 var formUnitCont customerform.FormUnitInfo formUnitCont.GainMasterAndSunFormUnit(formCont.TableKey, formJsonCont.List, true) masterUnitList := make(map[string]customerform.MasterStruct) for _, v := range formUnitCont.MasterInfo { masterUnitList[v.Name] = v } masrWriteMap := MakeFormMapData(uuid, userCont.Key, cureeTime, masterField, masterUnitList, 1) masrWriteMap["flowIsOpen"] = formCont.FlowIsOpen //任务列表 var taskCont customerForm.TaskRecord taskCont.MastersKey = uuid taskCont.Title = fmt.Sprintf("%v-%v(%v)-%v", formCont.Name, userCont.Name, userCont.Number, publicmethod.UnixTimeToDay(cureeTime, 14)) //标题"` taskCont.AppKey = appKey taskCont.TableKey = tableKey taskCont.Creater = userCont.Key //创建人"` taskCont.CreaterTime = cureeTime //创建时间"` taskCont.EditTime = cureeTime //编辑时间"` taskCont.Types = formCont.FlowIsOpen //类型(1:流程表单;2:普通表单)"` taskCont.VersionId = formCont.Id //来源于哪个表单"` taskCont.Status = status if formCont.FlowIsOpen == 1 { taskCont.Status = 3 taskCont.FlowKey = formCont.Flowkey var flowInfo modelAppPlatform.FlowVersion flowInfo.GetCont(map[string]interface{}{"`key`": formCont.Flowkey, "`state`": 1}, "`id`") taskCont.FlowRunSing = flowInfo.Id } if formJsonCont.Form.DataSource == "yes" { var sqlDb datacenter.DataBastType sqlDb.Type = formJsonCont.Form.DataSourceConfig.DSN.SqlType sqlDb.Ip = formJsonCont.Form.DataSourceConfig.DSN.Ip sqlDb.DataBaseName = formJsonCont.Form.DataSourceConfig.DSN.DataBaseName sqlDb.Port = formJsonCont.Form.DataSourceConfig.DSN.Port sqlDb.UserName = formJsonCont.Form.DataSourceConfig.DSN.UserName sqlDb.Pwd = formJsonCont.Form.DataSourceConfig.DSN.Password sqlDborm, err := sqlDb.StartDataBast() if err != nil { sqlDborm, err = datacenter.GainDataStorce(formJsonCont.Form.DataSourceConfig.Id) if err != nil { publicmethod.Result(0, sqlDb, c) return } } //判断是否 if len(sunFieldAry) > 0 { //有子表 sunTypeAry := make(map[string]map[string]customerform.MasterStruct) for _, v := range formUnitCont.SunFormInfo { sunTypeAry[v.TableName] = v.UbitInfo } err = WriteSunDatabaseSoucer(sqlDborm, uuid, userCont.Key, cureeTime, formJsonCont.Form.DataSourceConfig.TableKey, masrWriteMap, sunFieldAry, sunTypeAry) } else { // //无子表 err = sqlDborm.Table(formJsonCont.Form.DataSourceConfig.TableKey).Create(masrWriteMap).Error publicmethod.WriteLog("write", "写入自定义表单", formJsonCont.Form.DataSourceConfig.TableKey, err) } } else { //判断是否 if len(sunFieldAry) > 0 { //有子表 sunTypeAry := make(map[string]map[string]customerform.MasterStruct) for _, v := range formUnitCont.SunFormInfo { sunTypeAry[v.TableName] = v.UbitInfo } err = WriteSunDatabase(uuid, userCont.Key, cureeTime, formCont.TableKey, masrWriteMap, sunFieldAry, sunTypeAry) } else { // //无子表 err = overall.CONSTANT_DB_CustomerForm.Table(formCont.TableKey).Create(masrWriteMap).Error publicmethod.WriteLog("write", "写入自定义表单", formCont.TableKey, err) } } if err != nil { publicmethod.Result(104, err, c) return } taskCont.MastesForm = formCont.MastesForm taskCont.MastesFormJson = formCont.MastesFormJson err = overall.CONSTANT_DB_CustomerForm.Create(&taskCont).Error // for k, v := range masrWriteMap { // fmt.Printf("%v----> %T\n", k, v) // } publicmethod.WriteLog("write", "写入任务", err, taskCont) sendData := publicmethod.MapOut[string]() sendData["uuid"] = strconv.FormatInt(uuid, 10) sendData["cureeTime"] = cureeTime sendData["formUnitCont"] = formUnitCont sendData["masterField"] = masterField sendData["masterUnitList"] = masterUnitList sendData["sunFieldAry"] = sunFieldAry sendData["sunFieldAry_len"] = len(sunFieldAry) sendData["masrWriteMap"] = masrWriteMap sendData["sunFormName"] = sunFormName sendData["mapData"] = mapData //判断是否要发送信息 if formCont.ListJson != "" { var sendMsgInterface FormListInfo json.Unmarshal([]byte(formCont.ListJson), &sendMsgInterface) var sendMsgInfo SendMsgInfo sendMsgInfo = sendMsgInterface.SendMsg msgid, _ := sendMsgInfo.SendMsg(userCont, taskCont.Title, uuid, cureeTime, masterField, masrWriteMap, masterUnitList) fmt.Printf("发送返回信息------------->%v\n\n\n", msgid) if msgid != "" { //设定redis Key名称 redisKey := fmt.Sprintf("SendMsg:Work_WeChat_%v", uuid) redisClient := grocerystore.RunRedis(overall.CONSTANT_REDIS3) redisClient.SetRedisTime(86400) redisClient.Set(redisKey, msgid) } // sendConfig := sendMsgInterface.SendMsg // if sendConfig.Open { // msgTitle := taskCont.Title // if len(sendConfig.Title) > 0 { // } // sendData["msgTitle"] = msgTitle // switch sendConfig.SendRange { // } // } } publicmethod.Result(0, sendData, c) } /* * @ 作者: 秦东 @ 时间: 2025-03-28 09:17:29 @ 功能: 发送企业微信消息 @ 参数 #sendConfig //发送消息配置信息 #msgTitle //消息标题 #cureeTime //创建时间 #fieldVal //提交得数据已表字段 #subUnit //表单组件属性 @ 返回值 #msgid 消息id,用于撤回应用消息 #err 信息 @ 方法原型 # */ func (s *SendMsgInfo) SendMsg(userCont modelshr.ManCont, msgTitle string, uuid, cureeTime int64, fieldVal, masrWriteMap map[string]interface{}, subUnit map[string]customerform.MasterStruct) (msgid string, err error) { if s.Open { //开启发送信息 var sendMsg workWechat.SendMessage sendUserCount := 0 var sendUserAll []string isSend := true //Step 1: 获取消息的发送范围 switch s.SendRange { case 1: //全集团 sendMsg.Touser = "@all" case 2: //本公司 var myCompany modelshr.AdministrativeOrganization myCompany.GetCont(map[string]interface{}{"id": userCont.Company}, "`wechat_organization_id`") if myCompany.WechatOrganizationId != 0 { sendMsg.Toparty = strconv.FormatInt(myCompany.WechatOrganizationId, 10) } else { if userCont.Company != 0 { //获取该组织得所以下级 sendUserAll = GainOrgManWechat(userCont.Company) sendUserCount = len(sendUserAll) if sendUserCount <= 1000 && sendUserCount > 0 { sendMsg.Touser = strings.Join(sendUserAll, "|") } else { if sendUserCount == 0 { isSend = false } } // sendMsg.Touser = } else { if userCont.WorkWechat != "" { sendMsg.Touser = userCont.WorkWechat } else if userCont.Wechat != "" { sendMsg.Touser = userCont.Wechat } else { sendMsg.Touser = "@all" } } } case 3: //本部门 if userCont.MainDeparment != 0 { var myCompany modelshr.AdministrativeOrganization myCompany.GetCont(map[string]interface{}{"id": userCont.MainDeparment}, "`wechat_organization_id`") if myCompany.WechatOrganizationId != 0 { sendMsg.Toparty = strconv.FormatInt(myCompany.WechatOrganizationId, 10) } else { //获取该组织得所以下级 sendUserAll = GainOrgManWechat(userCont.MainDeparment) sendUserCount = len(sendUserAll) if sendUserCount <= 1000 && sendUserCount > 0 { sendMsg.Touser = strings.Join(sendUserAll, "|") } else { if sendUserCount == 0 { isSend = false } } } } else { if userCont.Wechat == "" && userCont.WorkWechat == "" { isSend = false } else { if userCont.WorkWechat != "" { sendMsg.Touser = userCont.WorkWechat } else { sendMsg.Touser = userCont.Wechat } } } case 4: //本行政组织 if userCont.AdminOrg != 0 { var myCompany modelshr.AdministrativeOrganization myCompany.GetCont(map[string]interface{}{"id": userCont.AdminOrg}, "`wechat_organization_id`") if myCompany.WechatOrganizationId != 0 { sendMsg.Toparty = strconv.FormatInt(myCompany.WechatOrganizationId, 10) } else { //获取该组织得所以下级 sendUserAll = GainOrgManWechat(userCont.AdminOrg) sendUserCount = len(sendUserAll) if sendUserCount <= 1000 && sendUserCount > 0 { sendMsg.Touser = strings.Join(sendUserAll, "|") } else { if sendUserCount == 0 { isSend = false } } } } else { if userCont.Wechat == "" && userCont.WorkWechat == "" { isSend = false } else { if userCont.WorkWechat != "" { sendMsg.Touser = userCont.WorkWechat } else { sendMsg.Touser = userCont.Wechat } } } case 5: //表格中指定 sendUserAll = s.TableFieldsSendMsg(fieldVal, userCont) sendUserCount = len(sendUserAll) if sendUserCount <= 1000 && sendUserCount > 0 { sendMsg.Touser = strings.Join(sendUserAll, "|") } else { if sendUserCount == 0 { isSend = false } } case 6: //自定义 sendUserAll = s.CustomizeSendMsg() sendUserCount = len(sendUserAll) if sendUserCount <= 1000 && sendUserCount > 0 { sendMsg.Touser = strings.Join(sendUserAll, "|") } else { if sendUserCount == 0 { isSend = false } } default: isSend = false } if isSend { switch s.Types { case "textcard": sendMsg.Msgtype = "textcard" sendMsg.Textcard.Title = s.SendMsgInfo(s.Title, msgTitle, fieldVal, masrWriteMap, subUnit) sendMsg.Textcard.Description = fmt.Sprintf("
%v
%v
请尽快阅读此信息
", publicmethod.UnixTimeToDay(time.Now().Unix(), 11), s.SendMsgInfo(s.Content, msgTitle, fieldVal, masrWriteMap, subUnit)) sendMsg.Textcard.Url = fmt.Sprintf("%v/#/work_wechat?masters_key=%v", overall.CONSTANT_CONFIG.Appsetup.WebKpiUrl, uuid) sendMsg.Textcard.Btntxt = "前往查看" case "news": sendMsg.Msgtype = "news" //图文内容 var imgMsgInfo workWechat.ArticlesList imgMsgInfo.Title = s.SendMsgInfo(s.Title, msgTitle, fieldVal, masrWriteMap, subUnit) imgMsgInfo.Description = s.SendMsgInfo(s.Content, msgTitle, fieldVal, masrWriteMap, subUnit) imgMsgInfo.Url = fmt.Sprintf("%v/#/work_wechat?masters_key=%v", overall.CONSTANT_CONFIG.Appsetup.WebKpiUrl, uuid) imgMsgInfo.PicUrl = s.GainOneField(s.Icon, msgTitle, fieldVal, subUnit) sendMsg.NewsMsg.Articles = append(sendMsg.NewsMsg.Articles, imgMsgInfo) // sendMsg.NewsMsg.Articles = s.SendMsgInfo(s.Title, msgTitle, fieldVal, subUnit) default: sendMsg.Msgtype = "text" sendMsg.TextMsg.Content = s.SendMsgInfo(s.Content, msgTitle, fieldVal, masrWriteMap, subUnit) } sendInitInfouser, _ := json.Marshal(sendUserAll) fmt.Printf("\n\n这是查看接收人信息-----》%v\n\n", string(sendInitInfouser)) sendInitInfo, _ := json.Marshal(sendMsg) fmt.Printf("\n\n这是查看输入信息-----》%v\n\n", string(sendInitInfo)) //判断当前人数是否曹组 if sendUserCount >= 1000 { fmt.Printf("\n\n--1---》%v\n\n", string(sendInitInfouser)) var msgidAry []string var msgToUser []string for i, v := range sendUserAll { if (i+1)%1000 == 0 { if len(msgToUser) > 0 { sendMsg.Touser = strings.Join(msgToUser, "|") msgidSte, errStr := sendMsg.SendMsg("stzl", 1) msgToUser = []string{} msgidAry = append(msgidAry, msgidSte) if errStr != nil { err = errStr } } } else { msgToUser = append(msgToUser, v) } } if len(msgToUser) > 0 { sendMsg.Touser = strings.Join(msgToUser, "|") msgidSte, errStr := sendMsg.SendMsg("stzl", 1) fmt.Printf("\n\n--3---》%v\n\n", string(sendInitInfouser)) msgToUser = []string{} msgidAry = append(msgidAry, msgidSte) if errStr != nil { err = errStr } } if len(msgidAry) > 0 { msgid = strings.Join(msgidAry, ",") } } else { fmt.Printf("\n\n--2---》%v\n\n", string(sendInitInfouser)) msgid, err = sendMsg.SendMsg("stzl", 1) } } } else { err = nil } return } /* * @ 作者: 秦东 @ 时间: 2025-03-31 13:54:38 @ 功能: 获取单一字段的数据 */ func (s *SendMsgInfo) GainOneField(fields string, msgTitle string, fieldVal map[string]interface{}, subUnit map[string]customerform.MasterStruct) string { var sendData interface{} if val, isOk := fieldVal[fields]; isOk { sendData = val } unitCont := GainFieldType(fields, subUnit) switch unitCont.Type { case "input", "password", "lowcodeImage": //单行文本 msgTitle = publicmethod.TypeToInterface(sendData) case "textarea", "tinymce": //多行文本,富文本 msgTitle = publicmethod.TypeToInterface(sendData) case "radio", "select": //单选框组、下拉选择框 val := publicmethod.TypeToInterface(sendData) if len(unitCont.Options) > 0 { for _, uv := range unitCont.Options { if uv.Value == val { msgTitle = uv.Label } } } case "checkbox", "cascader", "treeSelect", "upload": //checkbox,级联选择器,树形控件,图片/文件: , if valMap, isOk := sendData.([]int); isOk { if len(valMap) > 0 && len(unitCont.Options) > 0 { var titalMap []string for _, v := range valMap { for _, uv := range unitCont.Options { if uv.Value == strconv.Itoa(v) { titalMap = append(titalMap, uv.Label) } } } msgTitle = fmt.Sprintf("\"%v\"", strings.Join(titalMap, "、")) } } case "expand-user": //选择用户 val := publicmethod.TypeToInterface(sendData) var userNumber []string ruleSet := regexp.MustCompile(`\(([^)]+)\)`) valMap := ruleSet.FindAllStringSubmatch(val, -1) if len(valMap) > 0 { for _, v := range valMap { vLen := len(v) if vLen > 0 { if !publicmethod.IsInTrue(v[vLen-1], userNumber) { userNumber = append(userNumber, fmt.Sprintf("%v(%v)", v[0], v[vLen-1])) } } } } msgTitle = fmt.Sprintf("\"%v\"", strings.Join(userNumber, "、")) case "datePicker": //日期选择器 if strVal, ok := sendData.([]interface{}); ok { strValLen := len(strVal) if strValLen > 1 { startTimg, _ := publicmethod.StringToInt64(strVal[0]) endTime, _ := publicmethod.StringToInt64(strVal[strValLen-1]) msgTitle = fmt.Sprintf("%v 至 %v", publicmethod.TypeToClass(startTimg/1000, 14), publicmethod.TypeToClass(endTime/1000, 14)) } else if strValLen == 1 { startTimg, _ := publicmethod.StringToInt64(strVal[0]) msgTitle = publicmethod.TypeToClass(startTimg/1000, 14) } } else { startTimg, _ := publicmethod.StringToInt64(sendData) msgTitle = publicmethod.TypeToClass(startTimg, 14) } case "timePicker", "inputNumber": //时间选择器,计数器 if strVal, ok := sendData.([]interface{}); ok { strValLen := len(strVal) if strValLen > 1 { startTimg, _ := publicmethod.StringToInt64(strVal[0]) endTime, _ := publicmethod.StringToInt64(strVal[strValLen-1]) msgTitle = fmt.Sprintf("%v 至 %v", publicmethod.TypeToClass(startTimg/1000, 14), publicmethod.TypeToClass(endTime/1000, 14)) } else if strValLen == 1 { startTimg, _ := publicmethod.StringToInt64(strVal[0]) msgTitle = publicmethod.TypeToClass(startTimg/1000, 14) } } else { startTimg, _ := publicmethod.StringToInt64(sendData) msgTitle = publicmethod.TypeToClass(startTimg, 14) } case "colorPicker": //取色器 msgTitle = publicmethod.TypeToInterface(sendData) case "switch": //开关 startTimg, _ := publicmethod.StringToInt64(sendData) if startTimg == 1 { msgTitle = "是" } else { msgTitle = "否" } case "rate", "slider": //评分,滑块 msgTitle = publicmethod.TypeToInterface(sendData) case "txt", "button", "title", "table", "grid", "tabs", "card", "flex", "divider", "div": //文本,按钮,标题,表格,格栅,标签,卡片布局,弹性布局,分割线,容器 msgTitle = publicmethod.TypeToInterface(sendData) case "component": //自定义组件 (格式待定) msgTitle = publicmethod.TypeToInterface(sendData) default: msgTitle = publicmethod.TypeToInterface(sendData) } return msgTitle } /* * @ 作者: 秦东 @ 时间: 2025-03-28 15:48:28 @ 功能: 获取发送标题 */ func (s *SendMsgInfo) SendMsgInfo(fields []string, msgTitle string, fieldVal, masrWriteMap map[string]interface{}, subUnit map[string]customerform.MasterStruct) string { fmt.Printf("\n\n应获取的字段--->%v\n\n", fields) if len(fields) > 0 { biaotiYUneirong := "" for _, v := range fields { var sendData interface{} if val, isOk := fieldVal[v]; isOk { sendData = val } else if vals, isTrue := masrWriteMap[v]; isTrue { sendData = vals } unitCont := GainFieldType(v, subUnit) fmt.Printf("\n\n应获取的字段--1->%v--->%v\n\n", unitCont.Type, sendData) switch unitCont.Type { case "input", "password", "lowcodeImage": //单行文本 biaotiYUneirong = publicmethod.TypeToInterface(sendData) case "textarea", "tinymce": //多行文本,富文本 biaotiYUneirong = publicmethod.TypeToInterface(sendData) case "radio", "select": //单选框组、下拉选择框 val := publicmethod.TypeToInterface(sendData) if len(unitCont.Options) > 0 { for _, uv := range unitCont.Options { if uv.Value == val { biaotiYUneirong = uv.Label } } } case "checkbox", "cascader", "treeSelect", "upload": //checkbox,级联选择器,树形控件,图片/文件: , if valMap, isOk := sendData.([]int); isOk { if len(valMap) > 0 && len(unitCont.Options) > 0 { var titalMap []string for _, v := range valMap { for _, uv := range unitCont.Options { if uv.Value == strconv.Itoa(v) { titalMap = append(titalMap, uv.Label) } } } biaotiYUneirong = fmt.Sprintf("\"%v\"", strings.Join(titalMap, "、")) } } case "expand-user": //选择用户 val := publicmethod.TypeToInterface(sendData) var userNumber []string ruleSet := regexp.MustCompile(`\(([^)]+)\)`) valMap := ruleSet.FindAllStringSubmatch(val, -1) if len(valMap) > 0 { for _, v := range valMap { vLen := len(v) if vLen > 0 { if !publicmethod.IsInTrue(v[vLen-1], userNumber) { userNumber = append(userNumber, fmt.Sprintf("%v(%v)", v[0], v[vLen-1])) } } } } biaotiYUneirong = fmt.Sprintf("\"%v\"", strings.Join(userNumber, "、")) case "datePicker": //日期选择器 if strVal, ok := sendData.([]interface{}); ok { strValLen := len(strVal) if strValLen > 1 { startTimg, _ := publicmethod.StringToInt64(strVal[0]) endTime, _ := publicmethod.StringToInt64(strVal[strValLen-1]) biaotiYUneirong = fmt.Sprintf("%v 至 %v", publicmethod.TypeToClass(startTimg/1000, 14), publicmethod.TypeToClass(endTime/1000, 14)) } else if strValLen == 1 { startTimg, _ := publicmethod.StringToInt64(strVal[0]) biaotiYUneirong = publicmethod.TypeToClass(startTimg/1000, 14) } } else { startTimg, _ := publicmethod.StringToInt64(sendData) biaotiYUneirong = publicmethod.TypeToClass(startTimg, 14) } case "timePicker", "inputNumber": //时间选择器,计数器 if strVal, ok := sendData.([]interface{}); ok { strValLen := len(strVal) if strValLen > 1 { startTimg, _ := publicmethod.StringToInt64(strVal[0]) endTime, _ := publicmethod.StringToInt64(strVal[strValLen-1]) biaotiYUneirong = fmt.Sprintf("%v 至 %v", publicmethod.TypeToClass(startTimg/1000, 14), publicmethod.TypeToClass(endTime/1000, 14)) } else if strValLen == 1 { startTimg, _ := publicmethod.StringToInt64(strVal[0]) biaotiYUneirong = publicmethod.TypeToClass(startTimg/1000, 14) } } else { startTimg, _ := publicmethod.StringToInt64(sendData) biaotiYUneirong = publicmethod.TypeToClass(startTimg, 14) } case "colorPicker": //取色器 biaotiYUneirong = publicmethod.TypeToInterface(sendData) case "switch": //开关 startTimg, _ := publicmethod.StringToInt64(sendData) if startTimg == 1 { biaotiYUneirong = "是" } else { biaotiYUneirong = "否" } case "rate", "slider": //评分,滑块 biaotiYUneirong = publicmethod.TypeToInterface(sendData) case "txt", "button", "title", "table", "grid", "tabs", "card", "flex", "divider", "div": //文本,按钮,标题,表格,格栅,标签,卡片布局,弹性布局,分割线,容器 biaotiYUneirong = publicmethod.TypeToInterface(sendData) case "component": //自定义组件 (格式待定) biaotiYUneirong = publicmethod.TypeToInterface(sendData) default: biaotiYUneirong = publicmethod.TypeToInterface(sendData) } } fmt.Printf("\n\n应获取的字段-3-->%v\n\n", biaotiYUneirong) return biaotiYUneirong } return msgTitle } /* * @ 作者: 秦东 @ 时间: 2025-03-28 15:52:29 @ 功能: 获取字段类型 */ func GainFieldType(fields string, subUnit map[string]customerform.MasterStruct) (unitInfo customerform.MasterStruct) { if fields != "" { if val, isOk := subUnit[fields]; isOk { unitInfo = val } } return } /* * @ 作者: 秦东 @ 时间: 2025-03-28 15:10:14 @ 功能: 处理自定义人员 */ func (s *SendMsgInfo) CustomizeSendMsg() (wechatMap []string) { if len(s.SendRangeList) > 0 { var Recipient []string var orgAry []string var userAry []string for _, v := range s.SendRangeList { if v.Types == "masterOrg" { if !publicmethod.IsInTrue[string](v.Id, orgAry) { orgAry = append(orgAry, v.Id) } } else { if !publicmethod.IsInTrue[string](v.Id, userAry) { userAry = append(userAry, v.Id) } } } if len(orgAry) > 0 { for _, ov := range orgAry { val, _ := publicmethod.StringToInt64(ov) if val != 0 { //获取该组织得所以下级 Recipient = append(Recipient, GainOrgManWechat(val)...) } } } if len(userAry) > 0 { var orgManList []modelshr.PersonArchives overall.CONSTANT_DB_HR.Model(&modelshr.PersonArchives{}).Select("`wechat`,`work_wechat`").Where("`emp_type` BETWEEN 1 AND 10").Where("`state` = 1 AND `id` IN ?", userAry).Find(&orgManList) if len(orgManList) > 0 { for _, v := range orgManList { if v.Wechat != "" && !publicmethod.IsInTrue[string](v.Wechat, Recipient) { Recipient = append(Recipient, v.Wechat) } if v.WorkWechat != "" && !publicmethod.IsInTrue[string](v.WorkWechat, Recipient) { Recipient = append(Recipient, v.WorkWechat) } } } } //人员去重 if len(Recipient) > 0 { for _, v := range Recipient { if !publicmethod.IsInTrue[string](v, wechatMap) { wechatMap = append(wechatMap, v) } } } } return } /* @ 作者: 秦东 @ 时间: 2025-03-28 13:20:44 @ 功能: 处理自定义表格字段发送乏味 */ func (s *SendMsgInfo) TableFieldsSendMsg(fieldVal map[string]interface{}, userCont modelshr.ManCont) (wechatMap []string) { if len(s.SendRangeList) > 0 { var Recipient []string for _, v := range s.SendRangeList { for fi, fv := range fieldVal { if v.Id == fi { switch v.Types { case "orgCentent": //选择组织 val, _ := publicmethod.StringToInt64(fv) if val != 0 { //获取该组织得所以下级 Recipient = append(Recipient, GainOrgManWechat(val)...) } case "founder": //创建人 if userCont.WorkWechat != "" { Recipient = append(Recipient, userCont.WorkWechat) } else { Recipient = append(Recipient, userCont.Wechat) } case "owner": //拥有者 val := publicmethod.TypeToInterface(fv) if val != "" { if len(val) >= 10 { var orgMan modelshr.PersonArchives orgMan.GetCont(map[string]interface{}{"`key`": val}, "`wechat`", "`work_wechat`") if orgMan.WorkWechat != "" { Recipient = append(Recipient, orgMan.WorkWechat) } else if orgMan.Wechat != "" { Recipient = append(Recipient, orgMan.Wechat) } } } else { orgId, _ := strconv.ParseInt(val, 10, 64) Recipient = append(Recipient, GainOrgManWechat(orgId)...) } case "deptOrg": //所属部门 val, _ := publicmethod.StringToInt64(fv) if val != 0 { //获取该组织得所以下级 Recipient = append(Recipient, GainOrgManWechat(val)...) } case "pickpost": //岗位选择 val := publicmethod.TypeToInterface(fv) if val != "" { postMap := strings.Split(val, "#@#") if len(postMap) >= 2 { Recipient = append(Recipient, RecipientPost(postMap)...) } } case "pickrole": //角色选择 val := publicmethod.TypeToInterface(fv) if val != "" { Recipient = append(Recipient, RecipientRole(val)...) } case "expand-user": //选择用户 val := publicmethod.TypeToInterface(fv) if val != "" { Recipient = append(Recipient, RegexpToMap(val)...) } default: } } } } if len(Recipient) > 0 { for _, v := range Recipient { if !publicmethod.IsInTrue[string](v, wechatMap) { wechatMap = append(wechatMap, v) } } } } return } /* * @ 作者: 秦东 @ 时间: 2025-03-28 14:49:38 @ 功能: 通过角色获取接收人员 */ func RecipientRole(val string) (wechatMap []string) { if val != "" { var orgManList []modelshr.PersonArchives overall.CONSTANT_DB_HR.Model(&modelshr.PersonArchives{}).Select("`wechat`,`work_wechat`").Where("`emp_type` BETWEEN 1 AND 10").Where("`state` = 1 AND FIND_IN_SET(?,`role`)", val).Find(&orgManList) if len(orgManList) > 0 { for _, v := range orgManList { if v.Wechat != "" && !publicmethod.IsInTrue[string](v.Wechat, wechatMap) { wechatMap = append(wechatMap, v.Wechat) } if v.WorkWechat != "" && !publicmethod.IsInTrue[string](v.WorkWechat, wechatMap) { wechatMap = append(wechatMap, v.WorkWechat) } } } } return } /* * @ 作者: 秦东 @ 时间: 2025-03-28 14:41:25 @ 功能: 根据岗位获取接收人 */ func RecipientPost(val []string) (wechatMap []string) { vLen := len(val) if vLen > 0 { var orgManList []modelshr.PersonArchives overall.CONSTANT_DB_HR.Model(&modelshr.PersonArchives{}).Select("`wechat`,`work_wechat`").Where("`emp_type` BETWEEN 1 AND 10").Where("`state` = 1 AND `position` = ?", val[vLen-1]).Find(&orgManList) if len(orgManList) > 0 { for _, v := range orgManList { if v.Wechat != "" && !publicmethod.IsInTrue[string](v.Wechat, wechatMap) { wechatMap = append(wechatMap, v.Wechat) } if v.WorkWechat != "" && !publicmethod.IsInTrue[string](v.WorkWechat, wechatMap) { wechatMap = append(wechatMap, v.WorkWechat) } } } } return } /* * @ 作者: 秦东 @ 时间: 2025-03-28 13:59:42 @ 功能: 通过正则表达式获取人员编号 */ func RegexpToMap(val string) (wechatMap []string) { if val != "" { var userNumber []string ruleSet := regexp.MustCompile(`\(([^)]+)\)`) valMap := ruleSet.FindAllStringSubmatch(val, -1) if len(valMap) > 0 { for _, v := range valMap { vLen := len(v) if vLen > 0 { if !publicmethod.IsInTrue(v[vLen-1], userNumber) { userNumber = append(userNumber, v[vLen-1]) } } } } if len(userNumber) > 0 { var orgManList []modelshr.PersonArchives overall.CONSTANT_DB_HR.Model(&modelshr.PersonArchives{}).Select("`wechat`,`work_wechat`").Where("`emp_type` BETWEEN 1 AND 10").Where("`state` = 1 AND `number` IN ?", userNumber).Find(&orgManList) if len(orgManList) > 0 { for _, v := range orgManList { if v.Wechat != "" && !publicmethod.IsInTrue[string](v.Wechat, wechatMap) { wechatMap = append(wechatMap, v.Wechat) } if v.WorkWechat != "" && !publicmethod.IsInTrue[string](v.WorkWechat, wechatMap) { wechatMap = append(wechatMap, v.WorkWechat) } } } } } return } /* * @ 作者: 秦东 @ 时间: 2025-03-28 10:58:27 @ 功能: 根据行政组织获取所有下级人员 */ func GainOrgManWechat(orgId int64) (wechatMap []string) { var sunOrg publicmethod.GetOrgAllParent sunOrg.GetOrgSun(orgId) sunOrg.Id = append(sunOrg.Id, orgId) var orgManList []modelshr.PersonArchives overall.CONSTANT_DB_HR.Model(&modelshr.PersonArchives{}).Select("`wechat`,`work_wechat`").Where("`emp_type` BETWEEN 1 AND 10").Where("`state` = 1 AND `admin_org` IN ?", sunOrg.Id).Find(&orgManList) if len(orgManList) > 0 { for _, v := range orgManList { if v.Wechat != "" && !publicmethod.IsInTrue[string](v.Wechat, wechatMap) { wechatMap = append(wechatMap, v.Wechat) } if v.WorkWechat != "" && !publicmethod.IsInTrue[string](v.WorkWechat, wechatMap) { wechatMap = append(wechatMap, v.WorkWechat) } } } return } /* * @ 作者: 秦东 @ 时间: 2025-01-03 16:22:20 @ 功能: 处理有源数据库数据 @ 参数 #sqlDb 数据库句柄 #uuid 唯一标识 #creater 创建人 #createrTime 创建时间 #masterTableName 主表标识 #masterDataCont 主表数据 #sunDataList 字表数据列表 @ 返回值 # @ 方法原型 # */ func WriteSunDatabaseSoucer(sqlDb *gorm.DB, uuid, creater, createrTime int64, masterTableName string, masterDataCont, sunDataList map[string]interface{}, sunTable map[string]map[string]customerform.MasterStruct) (err error) { if len(masterDataCont) > 0 { if len(sunDataList) > 0 { sunMasterMap := publicmethod.MapOut[string]() //子表存在时,执行主表和子表数据写入 for k, v := range sunDataList { // if k == "table1693811044212" { s, ok := v.([]interface{}) //获取值类型 if !ok { err = errors.New("表单数据错误!请验证后重新提交!") return } else { //判断是否有数据 if len(s) > 0 { var sunCont []map[string]interface{} for _, sv := range s { //拆分子表 if sdf, isOk := sv.(map[string]interface{}); isOk { if sunTableType, sunIsOk := sunTable[k]; sunIsOk { masterWriteVal := MakeFormMapData(uuid, creater, createrTime, sdf, sunTableType, 2) //转换数据表值 if len(masterWriteVal) > 0 { sunCont = append(sunCont, masterWriteVal) } } } } if len(sunCont) > 0 { sunMasterMap[k] = sunCont } } } } if len(sunMasterMap) > 0 { gormDb := overall.CONSTANT_DB_CustomerForm masterErr := sqlDb.Table(masterTableName).Create(masterDataCont).Error sunCreateIsOk := true for k, v := range sunMasterMap { sunErr := gormDb.Table(k).Create(v).Error if sunErr != nil { sunCreateIsOk = false break } } if masterErr == nil && sunCreateIsOk { publicmethod.WriteLog("write", "写入自定义表单", err, masterDataCont, sunDataList) } else { err = errors.New("表单数据提交失败!请重新提交") publicmethod.WriteLog("e", "写入自定义表单", masterTableName, err) } } else { masterErr := sqlDb.Table(masterTableName).Create(masterDataCont).Error if masterErr != nil { publicmethod.WriteLog("write", "写入自定义表单", masterTableName, masterErr) } } } else { //子表不存在时,写入主表数据 err = sqlDb.Table(masterTableName).Create(masterDataCont).Error publicmethod.WriteLog("write", "写入自定义表单", masterTableName, err) } } else { err = errors.New("表单数据提交失败!请重新提交") publicmethod.WriteLog("e", "写入自定义表单", masterTableName, err) } return } /* * @ 作者: 秦东 @ 时间: 2025-04-01 13:11:07 @ 功能: 撤回发送的信息 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) RecalSendMsg(c *gin.Context) { var requestData publicmethod.PublicId err := c.ShouldBindJSON(&requestData) if err != nil || requestData.Id == "" { publicmethod.Result(10001, err, c) return } redisKey := fmt.Sprintf("SendMsg:Work_WeChat_%v", requestData.Id) redisClient := grocerystore.RunRedis(overall.CONSTANT_REDIS3) isTrue, msgId := redisClient.Get(redisKey) if !isTrue { publicmethod.Result(1, err, c, "数据撤回失败!") return } if workWechat.RecallWorkWechatMsg("stzl", msgId) { redisClient.DelKey(redisKey) publicmethod.Result(0, err, c) } else { publicmethod.Result(1, err, c, "数据撤回失败!") } }