openscrm / api-server Goto Github PK
View Code? Open in Web Editor NEWOpenSCRM是一套基于Go和React的高质量企业微信私域流量管理系统 。遵守Apache2.0协议,全网唯一免费商用。企业微信、私域流量、SCRM。
License: Apache License 2.0
OpenSCRM是一套基于Go和React的高质量企业微信私域流量管理系统 。遵守Apache2.0协议,全网唯一免费商用。企业微信、私域流量、SCRM。
License: Apache License 2.0
数据库连接不上
model目录下的mass_msg_staff.go文件的struct,建议将MassMsgId属性的gorm:"index;type:bigint"改为gorm:"index;type:varchar(64)",由于QueryExtStaffids方法中第一个where语句的mysql的in函数需要字段类型与in中类型匹配,前端MassMsgId是string类型,而mysql中是bigint类型,会导致搜索不匹配,后续不判空会报index [0] out of range 错误。
同理,file_size字段也是bigint,调用parse-url接口时前端填写的fileSize是空字符串”“,与数据库字段不匹配,素材库页面解析网页功能不可用,要么在前端改类型。
客户详情age字段前端没有限定num类型和长度,数据库是tinyint(3) ,修改基本信息时字段不匹配也会报错。
panic: x509: failed to parse private key (use ParsePKCS8PrivateKey instead for this key format)
将这个项目部署在 k8s 上,分配 3 个副本,如何保证只有 1 个副本在刷新 access_token ?
看了下源代码,是直接开一个协程在刷新 access_token,但是项目部署在 3 个副本时,每个副本都会启动刷新 access_token 的协程,那就意味着每个副本都在刷新 access_token?
func (t *Token) tokenRefresher(ctx context.Context) {
// refresh per 30m
const refreshTimeWindow = (2*60 - 30) * time.Minute
const minRefreshDuration = 5 * time.Second
var nextRefreshDuration time.Duration = 0
for {
select {
case <-time.After(nextRefreshDuration):
retryer := backoff.WithContext(backoff.NewExponentialBackOff(), ctx)
if err := backoff.Retry(t.syncToken, retryer); err != nil {
log.Println("retry getting access token failed", "err", err)
_ = err
}
nextRefreshDuration = t.LastRefresh.Add(t.ExpiresIn - refreshTimeWindow).Sub(t.LastRefresh)
if nextRefreshDuration < minRefreshDuration {
nextRefreshDuration = minRefreshDuration
}
case <-ctx.Done():
return
}
}
}
api_1 |
api_1 | 2022/01/06 11:00:00 /root/scrm/scrm/app/models/mass_msg_staff.go:121
api_1 | [4.555ms] [rows:0] SELECT mass_msg.ext_msg_id as ext_msg_id, mass_msg_staff.ext_staff_id as ext_staff_id, mass_msg_staff.id as id FROM `mass_msg` join mass_msg_staff on mass_msg_staff.mass_msg_id = mass_msg.id WHERE (mass_msg.ext_corp_id = 'ww17efc9574291cc91') AND is_sent = 0
api_1 |
api_1 | 2022/01/06 11:00:00 /root/scrm/scrm/app/models/staff.go:351 Error 1054: Unknown column 'ext_staff_id' in 'where clause'
api_1 | [0.745ms] [rows:0] UPDATE `staff` SET `enable_msg_arch`='1',`updated_at`='2022-01-06 11:00:00.563' WHERE ext_corp_id = 'ww17efc9574291cc91' and ext_staff_id in ('HuBoYu_zero')
api_1 | 2022-01-06T11:00:00.563+0800 ERROR tasks/message_arch.go:28 UpdateStaffMsgArchStatus failed {"err": "Error 1054: Unknown column 'ext_staff_id' in 'where clause'", "errVerbose": "Error 1054: Unknown column 'ext_staff_id' in 'where clause'\nopenscrm/app/services.StaffService.doUpdateMsgArchStatus\n\t/root/scrm/scrm/app/services/staff.go:696\nopenscrm/app/services.StaffService.UpdateStaffMsgArchStatus\n\t/root/scrm/scrm/app/services/staff.go:679\nopenscrm/app/tasks.Staff.UpdateMsgArchStatus\n\t/root/scrm/scrm/app/tasks/message_arch.go:26\ngithub.com/gogf/gf/os/gcron.(*Entry).check\n\t/root/.asdf/installs/golang/1.17.5/packages/pkg/mod/github.com/gogf/[email protected]/os/gcron/gcron_entry.go:146\ngithub.com/gogf/gf/os/gtimer.(*Entry).Run.func1\n\t/root/.asdf/installs/golang/1.17.5/packages/pkg/mod/github.com/gogf/[email protected]/os/gtimer/gtimer_entry.go:59\nruntime.goexit\n\t/root/.asdf/installs/golang/1.17.5/go/src/runtime/asm_amd64.s:1581\nopenscrm/app/services.StaffService.UpdateStaffMsgArchStatus\n\t/root/scrm/scrm/app/services/staff.go:681\nopenscrm/app/tasks.Staff.UpdateMsgArchStatus\n\t/root/scrm/scrm/app/tasks/message_arch.go:26\ngithub.com/gogf/gf/os/gcron.(*Entry).check\n\t/root/.asdf/installs/golang/1.17.5/packages/pkg/mod/github.com/gogf/[email protected]/os/gcron/gcron_entry.go:146\ngithub.com/gogf/gf/os/gtimer.(*Entry).Run.func1\n\t/root/.asdf/installs/golang/1.17.5/packages/pkg/mod/github.com/gogf/[email protected]/os/gtimer/gtimer_entry.go:59\nruntime.goexit\n\t/root/.asdf/installs/golang/1.17.5/go/src/runtime/asm_amd64.s:1581"}
api_1 | openscrm/app/tasks.Staff.UpdateMsgArchStatus
大佬,企业微信的官网文档UI大换血,脚本得改了
2024-03-05T22:30:12.053+0800 ERROR services/department.go:37 get all depar, Msg: "api forbidden for contact assistant, hint: [1709649011424270725404086], from work.weixin.qq.com/devtool/query?e=48009" }
openscrm/app/services.Department.Sync
D:/Porduct/GO/api-server/app/services/department.go:37
openscrm/app/services.Syncs
D:/Porduct/GO/api-server/app/services/init.go:19
main.init.0
D:/Porduct/GO/api-server/main.go:59
runtime.doInit
C:/Users/gaode/sdk/go1.19.10/src/runtime/proc.go:6330
runtime.main
C:/Users/gaode/sdk/go1.19.10/src/runtime/proc.go:233
panic: ClientError { Code: 48009, Msg: "api forbidden for contact assistant, hint: [1.127, more info at https://open.work.weixin.qq.com/devtool/query?e=48009" }
goroutine 1 [running]:
openscrm/app/services.Syncs()
D:/Porduct/GO/api-server/app/services/init.go:21 +0x30e
main.init.0()
D:/Porduct/GO/api-server/main.go:59 +0x485
核心问题是两个:
get all depar, Msg: "api forbidden for contact assistant, hint: [1709649011424270725404086], from work.weixin.qq.com/devtool/query?e=48009" }
panic: ClientError { Code: 48009, Msg: "api forbidden for contact assistant, hint: [1.127, more info at https://open.work.weixin.qq.com/devtool/query?e=48009" }
请问怎么解决?
// BatchFetchCustomers
// Description: 并发获取员工的外部客户ID
// Detail: 不用将员工与客户id数组对应
func (o CustomerService) BatchFetchCustomers(extStaff []*workwx.UserInfo) (totalExtCustomerIDs []string, err error)
哪位大佬知道怎么解决的啊。
staff.go单元,这段代码增加IFNULL处理
err = DB.Model(&GroupChat{}).Where("ext_corp_id = ?", extCorpID).
Pluck("IFNULL(sum(today_join_member_num),0) as today_groups_increase", &cs.TodayGroupsIncrease).Error
if err != nil {
err = errors.WithStack(err)
return
}
err = DB.Model(&GroupChat{}).Where("ext_corp_id = ?", extCorpID).
Pluck("IFNULL(sum(today_quit_member_num),0) as today_groups_decrease", &cs.TodayGroupsDecrease).Error
if err != nil {
err = errors.WithStack(err)
return
}
我没有时间维护这个项目,且没有使用场景。
有兴趣维护这个项目的同学可以一起来维护,成为contributor。
目前遇到一个问题, 回调域名设置dashboard的域名, 后台能正常使用, 不过配置了sidebar的域名后, 在聊天侧边栏打开会提示redirect_url不是可信域名, 但是应用的回调域名只能设置一个, 如果新建一个侧边栏应用的话, 项目里也不支持多应用, 请问一下 这个是怎么配置的呢
方便赞赏和部署交流,这个项目太好了,希望能够推广
一个包依赖:github.com/360EntSecGroup-Skylar/excelize/v2 现在 404 了,运行不了,有空改一下嘛?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.