Compare commits

..

1243 Commits

Author SHA1 Message Date
cjy
57e7629e2f Revert "增加一点日志"
This reverts commit 7ffede212d.
2026-02-09 09:03:22 +08:00
cjy
7ffede212d 增加一点日志 2026-02-06 14:31:01 +08:00
1d36eea47c 修改订单刷新 2026-02-06 14:11:14 +08:00
4773caf295 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-02-06 12:03:22 +08:00
54f4b5d62e Merge branch 'feature-four-daiyb' into dev 2026-02-06 12:03:21 +08:00
JNG
015ed265e6 Merge branch 'jng-contract-0205' into dev 2026-02-06 11:37:12 +08:00
JNG
8c2299ff38 Merge branch 'jng-contract-0205' into dev 2026-02-06 11:10:40 +08:00
cjy
da49041b5b update:更新pb 2026-02-05 20:28:47 +08:00
cjy
60beab01be fix:如果套餐为续费套餐直接失败 2026-02-05 20:24:55 +08:00
cjy
46b7762471 fix:创建竞品报告时,传入订单uuid 2026-02-05 20:24:37 +08:00
cjy
bb326bfe0d fix:更新也增加订单uuid 2026-02-05 20:24:00 +08:00
cjy
0bdf0f9648 feat:存入订单uuid
# Conflicts:
#	api/cast/cast.pb.go
#	api/cast/cast.pb.validate.go
2026-02-05 20:22:11 +08:00
f68e099d6e Merge branch 'feature-four-daiyb' into dev 2026-02-05 18:52:13 +08:00
ca4a5772d2 Merge branch 'feature-four-daiyb' into dev 2026-02-05 18:07:59 +08:00
6690717e77 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-02-05 18:04:39 +08:00
762fdd4b05 修改续费逻辑 2026-02-05 18:04:39 +08:00
JNG
4e4ab14d5a Merge branch 'jng-contract-0205' into dev 2026-02-05 17:29:05 +08:00
81c28c0bd4 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-02-05 17:07:52 +08:00
cf2e4067b9 脚本更新 2026-02-05 17:07:51 +08:00
jiaji.H
47699dec97 Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-05 16:20:06 +08:00
38117c3a08 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-02-05 15:50:04 +08:00
fee7728da9 Merge branch 'feature-four-daiyb' into dev 2026-02-05 15:50:00 +08:00
jiaji.H
ee190b4a96 Merge branch 'jng' into dev 2026-02-05 15:48:54 +08:00
fbe32fb485 套餐已过期 2026-02-05 15:44:55 +08:00
d0d5cd50a2 修改绑定订单 2026-02-05 15:38:48 +08:00
9ba37adb6b Merge branch 'feature-four-daiyb' into dev 2026-02-05 14:39:30 +08:00
cjy
2aa0a73041 fix:暂时注释 2026-02-05 13:15:02 +08:00
cjy
084df09c9b Merge branch 'feat-cjy-changeOperator' into dev
# Conflicts:
#	api/cast/cast.pb.go
#	api/cast/cast.pb.validate.go
2026-02-05 13:10:00 +08:00
cjy
be1b0d24ec fix:视频脚本为任务4 2026-02-05 11:36:08 +08:00
5d27d502c8 取消授权写入excel 2026-02-04 19:15:36 +08:00
jiaji.H
529e5e3f3c Updata:更新log 2026-02-04 16:48:07 +08:00
jiaji.H
20af43c9e2 Updata:增加调试log 2026-02-04 16:47:15 +08:00
jiaji.H
41880fd840 Updata:解决冲突 2026-02-04 16:41:31 +08:00
e0ff2b542a Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-02-04 16:09:15 +08:00
3940e5f9eb Merge branch 'feature-four-daiyb' into dev 2026-02-04 16:09:14 +08:00
jiaji.H
63e772596c Merge branch 'feat-hjj-OfficialManage#A161' into dev 2026-02-04 14:47:27 +08:00
jiaji.H
8962c73bfb Merge branch 'feat-hjj-OfficialManage#A161' into dev 2026-02-04 14:26:48 +08:00
jiaji.H
43b93c5443 Updata:解决冲突 2026-02-04 14:22:24 +08:00
jiaji.H
5ded15fbb0 Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-04 14:11:29 +08:00
jiaji.H
0a7e169a7e Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-04 14:09:28 +08:00
jiaji.H
566773b0f6 Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-04 14:00:07 +08:00
e767e47277 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-02-04 13:48:57 +08:00
7cca30c2a5 Merge branch 'fix-operator-daiyb' into dev 2026-02-04 13:48:53 +08:00
jiaji.H
38c1667614 Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-04 13:45:09 +08:00
jiaji.H
531fddc629 Updata:解决冲突 2026-02-04 13:23:24 +08:00
f0253f9805 Merge branch 'feat-zjy-fixbug-033' into dev 2026-02-04 13:09:13 +08:00
c85fbb0b81 fix: 调整创建订单的uuid 2026-02-04 12:24:23 +08:00
e323325a57 fix: 调整创建订单的uuid 2026-02-04 12:21:24 +08:00
bf09640ff0 Merge branch 'feat-zjy-fixbug-033' into dev
# Conflicts:
#	api/bundle/bundle.pb.go
#	api/bundle/bundle.validator.pb.go
#	api/bundle/bundle_triple.pb.go
#	pkg/service/bundle/pay.go
2026-02-04 12:20:18 +08:00
jiaji.H
3e454b4348 Updata:增加log 2026-02-04 11:46:32 +08:00
1344e1da8b fix: 222 2026-02-04 11:36:32 +08:00
jiaji.H
6f86e07650 Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-04 10:43:46 +08:00
jiaji.H
62c8cb0fa1 Updata:解决冲突 2026-02-04 10:27:09 +08:00
a947556202 fix: antomReq.OutTradeNo = uuidV4.String() 2026-02-04 10:11:20 +08:00
JNG
8197ac4b57 Merge branch 'jng' into dev 2026-02-03 19:41:57 +08:00
jiaji.H
5eb27a0b49 Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-03 17:33:35 +08:00
JNG
62fa35b029 解决冲突 2026-02-03 16:49:17 +08:00
jiaji.H
368078c543 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-02-03 16:21:35 +08:00
jiaji.H
982558afe3 Updata:更新判断 2026-02-03 16:21:30 +08:00
103fe91e8f Merge branch 'feature-four-daiyb' into dev 2026-02-03 16:21:25 +08:00
jiaji.H
e9d67c5cdc Updata:更新判断 2026-02-03 16:20:48 +08:00
jiaji.H
a9201e794c Updata:解决冲突 2026-02-03 16:19:27 +08:00
jiaji.H
6110dce131 Updata:解决冲突 2026-02-03 16:06:54 +08:00
jiaji.H
34810300da Updata:更新字段格式 2026-02-03 16:04:53 +08:00
jiaji.H
9704208f9d Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-03 15:09:02 +08:00
jiaji.H
63e57f1140 Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-03 14:50:46 +08:00
jiaji.H
802510ed45 Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-03 14:24:11 +08:00
jiaji.H
cba570d832 Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-03 14:15:35 +08:00
jiaji.H
d56ed7577b Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-03 13:42:02 +08:00
jiaji.H
48a4539f4b Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-03 13:29:56 +08:00
jiaji.H
638ff85367 Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-03 11:49:40 +08:00
afc0007984 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-02-03 09:45:51 +08:00
f39ca2179d Merge branch 'feature-four-daiyb' into dev 2026-02-03 09:45:50 +08:00
jiaji.H
e3075e48b9 Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-03 09:31:49 +08:00
jiaji.H
e4c21ef020 Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-02 20:26:18 +08:00
jiaji.H
3d7b70840a Updata:解决冲突 2026-02-02 20:03:11 +08:00
jiaji.H
1b06517403 Updata:更新pb文件 2026-02-02 19:47:46 +08:00
jiaji.H
7df053aa39 Updata:增加注释 2026-02-02 19:47:20 +08:00
jiaji.H
b18c9d6a8f Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-02 19:25:19 +08:00
jiaji.H
b47b872ab4 Merge branch 'feat-hjj-BundleOrderInvoice#A225' into dev 2026-02-02 19:17:11 +08:00
jiaji.H
1ead1952a1 Updata:解决冲突 2026-02-02 18:14:36 +08:00
jiaji.H
ac776576f2 Updata:增加log 2026-02-02 17:53:51 +08:00
jiaji.H
3a156b08f0 增加测试代码 2026-02-02 17:39:01 +08:00
jiaji.H
bcbddbec6f Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-02-02 17:11:50 +08:00
jiaji.H
a8e79d0877 Updata:去除返回 2026-02-02 17:11:44 +08:00
579fcb3667 Merge branch 'feature-four-daiyb' into dev 2026-02-02 16:50:51 +08:00
e5dedcaf91 Merge branch 'feature-four-daiyb' into dev 2026-02-02 16:46:26 +08:00
jiaji.H
a5dcdf2a75 Updata:更新pb文件 2026-02-02 15:29:00 +08:00
jiaji.H
0d54572111 Updata:解决冲突 2026-02-02 14:13:47 +08:00
jiaji.H
bc1ff822eb Updata:解决冲突 2026-02-02 13:43:20 +08:00
jiaji.H
7391e4c845 Updata:解决冲突 2026-02-02 11:23:23 +08:00
cjy
5e762104d9 fix:移除测试环境不必要的导入 2026-02-02 10:26:24 +08:00
cjy
e7f652371b fix:修复测试环境pb问题 2026-02-02 10:23:54 +08:00
cjy
61dbcd23ba fix: 修复pb文件
# Conflicts:
#	api/bundle/bundle.pb.go
#	api/bundle/bundle.validator.pb.go
#	api/bundle/bundle_triple.pb.go
2026-02-02 09:45:47 +08:00
bx1834938347-prog
9f3d4fab99 Merge branch 'wwq' into dev 2026-02-02 09:41:06 +08:00
cjy
28ea5ec412 fix:套餐过期后,只显示套餐过期的上一个套餐期间的竞品报告和数据分析 2026-02-02 09:35:22 +08:00
c87c1be186 Update work.go 2026-01-30 20:23:37 +08:00
c8c2202538 同步proto 2026-01-30 20:00:50 +08:00
e57dd03269 Update work.go 2026-01-30 19:53:05 +08:00
6f1277ec9b Update work.go 2026-01-30 19:49:44 +08:00
f6c5f53002 merge main 2026-01-30 19:44:34 +08:00
dee2b9d50c Update work.go 2026-01-30 19:40:52 +08:00
cjy
def4c797f2 fix:修改状态映射 2026-01-30 18:31:05 +08:00
cjy
ba19e65e7f Merge branch 'feat-cjy-report' into dev 2026-01-30 18:21:19 +08:00
cjy
a2703f907e fix:修复批量导入的时候,始终固定报告名 2026-01-30 17:29:10 +08:00
JNG
f7ba1e75ca Merge branch 'jng' into dev 2026-01-30 16:20:01 +08:00
JNG
971c3a8ea4 Merge branch 'jng' into dev 2026-01-30 16:15:02 +08:00
cjy
08e3bcd658 fix: 清除空格 2026-01-30 15:56:42 +08:00
JNG
ebd1b52326 11 2026-01-30 15:44:53 +08:00
JNG
2eb82a21cb 修改 2026-01-30 15:44:21 +08:00
cjy
84ba139fc8 feat: 增加推荐人列表接口
# Conflicts:
#	api/bundle/bundle.pb.go
2026-01-30 15:44:04 +08:00
JNG
8eb2476f95 11 2026-01-30 14:00:22 +08:00
cjy
c02af4d3ae feat: 更新pb 2026-01-30 13:23:56 +08:00
cjy
74bc61a51b feat: 增加合同管理接口和路由 2026-01-30 13:19:38 +08:00
7c45999a40 Merge branch 'feature-four-daiyb' into dev 2026-01-29 11:42:23 +08:00
2929e03eaf Merge branch 'feature-four-daiyb' into dev 2026-01-29 11:22:14 +08:00
4e69ab9731 Merge branch 'feature-four-daiyb' into dev 2026-01-29 11:16:38 +08:00
c6cf13465c Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-01-27 14:36:26 +08:00
e4c88feaef Merge branch 'feature-four-daiyb' into dev 2026-01-27 14:36:25 +08:00
cjy
12870fbf94 Merge branch 'feat-cjy-report' into dev 2026-01-27 13:24:43 +08:00
cjy
451fe4b2e2 Merge branch 'feat-cjy-report' into dev 2026-01-26 15:59:06 +08:00
cjy
889acc4e78 Merge branch 'feat-cjy-report' into dev 2026-01-26 15:27:42 +08:00
cjy
82fd06139a Merge branch 'feat-cjy-report' into dev 2026-01-26 15:01:09 +08:00
cjy
5a8e155807 Merge branch 'feat-cjy-report' into dev 2026-01-26 11:08:09 +08:00
cjy
294f3b8d95 Merge branch 'feat-cjy-report' into dev 2026-01-26 10:44:51 +08:00
cjy
ea7134053c Merge branch 'feat-cjy-report' into dev 2026-01-26 10:03:01 +08:00
cjy
bd5eb45371 Merge branch 'feat-cjy-report' into dev 2026-01-26 09:47:30 +08:00
cjy
cebf10a3e6 Merge branch 'feat-cjy-report' into dev 2026-01-26 09:25:01 +08:00
cjy
1277e0da8d Merge branch 'feat-cjy-report' into dev 2026-01-23 17:00:12 +08:00
cjy
5df90b156e Merge branch 'feat-cjy-report' into dev 2026-01-23 16:30:15 +08:00
cjy
acaa112c5b Merge branch 'feat-cjy-report' into dev 2026-01-23 14:43:47 +08:00
cjy
5179c9e597 Merge branch 'feat-cjy-report' into dev 2026-01-23 14:34:40 +08:00
cjy
861bafc837 Merge branch 'feat-cjy-report' into dev 2026-01-23 14:30:44 +08:00
cjy
b9b2ccbe0b Merge branch 'feat-cjy-report' into dev 2026-01-23 11:14:30 +08:00
28934436fe Update cast.pb.validate.go 2026-01-23 10:49:54 +08:00
c96bb04e55 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-01-23 10:49:52 +08:00
c273a2650c Merge branch 'feature-four-daiyb' into dev 2026-01-23 10:49:24 +08:00
cjy
193f6cd226 Merge branch 'feat-cjy-report' into dev 2026-01-23 10:20:42 +08:00
cjy
136af31283 Merge branch 'feat-cjy-report' into dev 2026-01-23 09:29:42 +08:00
JNG
fb2c5d0405 Merge branch 'jng' into dev 2026-01-22 16:04:55 +08:00
JNG
7227f1b05e Merge branch 'jng' into dev 2026-01-22 15:57:36 +08:00
cjy
eec3c75c75 Merge branch 'feat-cjy-report' into dev
# Conflicts:
#	api/cast/cast.pb.go
#	api/cast/cast.pb.validate.go
2026-01-22 11:54:19 +08:00
684e324238 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-01-22 09:55:02 +08:00
c29f26e582 Merge branch 'feature-four-daiyb' into dev 2026-01-22 09:55:01 +08:00
cjy
3806c57e90 Merge branch 'feat-cjy-report' into dev 2026-01-21 16:09:53 +08:00
cjy
e2dadb5bc9 Merge branch 'feat-cjy-report' into dev 2026-01-21 15:59:37 +08:00
cjy
ffaf09f4e2 Merge branch 'feat-cjy-report' into dev 2026-01-21 15:37:24 +08:00
bx1834938347-prog
e5782e4e6e Merge branch 'wwq' into dev 2026-01-21 15:04:59 +08:00
cjy
637b12d90f Merge branch 'feat-cjy-report' into dev 2026-01-21 14:59:11 +08:00
fbf649b8b1 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-01-21 14:18:29 +08:00
22de3d0ce9 Merge branch 'feature-four-daiyb' into dev 2026-01-21 14:18:21 +08:00
cjy
58aca68cd8 Merge branch 'feat-cjy-report' into dev 2026-01-21 14:12:30 +08:00
cjy
18fd0e56ce Merge branch 'feat-cjy-report' into dev 2026-01-21 10:03:14 +08:00
9050f98e67 修改套餐过期逻辑 2026-01-20 16:27:15 +08:00
cjy
a7b2de6ed9 Merge branch 'feat-cjy-report' into dev
# Conflicts:
#	api/cast/cast.pb.go
#	api/cast/cast.pb.validate.go
2026-01-19 11:49:26 +08:00
a2ea3e1143 Merge branch 'feature-four-daiyb' into dev 2026-01-19 10:36:34 +08:00
46eef08995 Merge branch 'feature-dm-daiyb' into dev 2026-01-16 23:29:26 +08:00
5bc1b12d9c Merge branch 'main' into dev 2026-01-16 20:39:26 +08:00
bd2f776a7f Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-01-16 17:20:45 +08:00
557e16a706 Merge branch 'feature-userinfo-daiyb' into dev 2026-01-16 17:20:44 +08:00
JNG
3c6705a9b0 Merge branch 'jng' into dev 2026-01-16 16:44:30 +08:00
JNG
7bb508ab4a Merge branch 'jng' into dev 2026-01-16 16:31:31 +08:00
JNG
564007d45d 解决冲突 2026-01-16 14:57:41 +08:00
cjy
1922ab583e Merge branch 'feat-cjy-tag' into dev 2026-01-16 13:25:22 +08:00
cjy
bc9e8b62db Merge branch 'feat-cjy-tag' into dev 2026-01-16 11:52:09 +08:00
cjy
07d2925278 Merge branch 'feat-cjy-tag' into dev 2026-01-16 10:55:01 +08:00
cjy
549bdb0c66 Merge branch 'feat-cjy-tag' into dev 2026-01-16 10:40:11 +08:00
cjy
10662c9ad3 Merge branch 'feat-cjy-tag' into dev 2026-01-16 10:06:15 +08:00
cjy
3bb30bb087 Merge branch 'feat-cjy-tag' into dev 2026-01-16 10:00:00 +08:00
cjy
ba3c821ff1 Merge branch 'feat-cjy-tag' into dev 2026-01-16 09:57:28 +08:00
192a6643d1 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-01-16 09:48:53 +08:00
6a2e27f39e Merge branch 'feature-userinfo-daiyb' into dev 2026-01-16 09:48:42 +08:00
bx1834938347-prog
9b0fbcae61 Merge branch 'wwq' into dev 2026-01-16 09:44:50 +08:00
196c244f8e 压缩图片 2026-01-15 19:12:04 +08:00
c5b86b862f Merge branch 'feature-userinfo-daiyb' into dev 2026-01-15 17:30:35 +08:00
4e2bb84419 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-01-15 16:52:58 +08:00
817ded18c7 Merge branch 'feature-userinfo-daiyb' into dev 2026-01-15 16:52:57 +08:00
cjy
a6271840ef Merge branch 'feat-cjy-report' into dev 2026-01-15 16:45:12 +08:00
8ecead8ac8 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-01-15 16:26:41 +08:00
b7e7b44741 Merge branch 'feature-userinfo-daiyb' into dev 2026-01-15 16:26:40 +08:00
JNG
5f2089fa53 Merge branch 'jng-supplier-0105' into dev 2026-01-15 16:13:20 +08:00
e60ca9c65f Merge branch 'feature-userinfo-daiyb' into dev 2026-01-15 16:05:32 +08:00
11e22d6e5f Merge branch 'feature-userinfo-daiyb' into dev 2026-01-15 15:48:28 +08:00
a2cd6774b1 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-01-15 15:42:12 +08:00
b952752e9d Merge branch 'feature-userinfo-daiyb' into dev 2026-01-15 15:42:11 +08:00
jiaji.H
ab79cd8833 Updata:解决冲突 2026-01-15 11:34:54 +08:00
cjy
9bd8e67116 Merge branch 'feat-cjy-report' into dev
# Conflicts:
#	pkg/model/cast/work.go
2026-01-14 17:43:51 +08:00
9d1adef700 修改任务列表 2026-01-14 13:52:01 +08:00
2425920d34 导出Excel 2026-01-14 10:09:10 +08:00
jiaji.H
a9dd32e450 Updata:更新导出 2026-01-13 16:17:06 +08:00
jiaji.H
b474856f35 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-01-13 16:12:37 +08:00
jiaji.H
0fd6319e34 Updata:更新导出 2026-01-13 16:12:32 +08:00
beac4f775d Update test.go 2026-01-13 16:07:55 +08:00
jiaji.H
1886935f4d Updata:更新导出 2026-01-13 16:00:32 +08:00
edebd161a1 Merge branch 'feature-h5-daiyb' into dev 2026-01-13 15:57:45 +08:00
f05e792b83 添加proto文件 2026-01-13 15:38:43 +08:00
2156a6fb59 数据统计的作品列表接口 2026-01-13 15:12:40 +08:00
jiaji.H
dca004ecc6 Updata:解决冲突 2026-01-13 14:17:54 +08:00
JNG
ff3c5c0312 Merge branch 'jng-supplier-0105' into dev 2026-01-13 11:27:35 +08:00
bx1834938347-prog
6ab28792ec Merge branch 'wwq' into dev 2026-01-13 11:15:59 +08:00
JNG
b7f8524861 Merge branch 'jng-supplier-0105' into dev 2026-01-13 10:49:34 +08:00
0881472841 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-01-13 10:04:54 +08:00
4a3be6bdd4 修改账号添加逻辑 2026-01-13 10:04:51 +08:00
cjy
cf6a932dbb Merge branch 'feat-cjy-tag' into dev 2026-01-12 16:49:23 +08:00
JNG
e5362cb262 解决冲突 2026-01-12 14:39:24 +08:00
e2e4df84fc Merge branch 'feature-userinfo-daiyb' into dev 2026-01-12 14:35:39 +08:00
jiaji.H
f23e68f948 Updata:解决冲突 2026-01-12 13:43:40 +08:00
jiaji.H
4c8db9bec8 Updata:移动余量更新定时任务至客户端 2026-01-12 13:37:30 +08:00
cjy
71aecaf454 Merge branch 'feat-cjy-tag' into dev 2026-01-12 13:34:57 +08:00
cjy
d2b7064dc0 Merge branch 'feat-cjy-tag' into dev
# Conflicts:
#	pkg/service/cast/work.go
2026-01-12 13:28:52 +08:00
c3eabff227 草稿不判断额度 2026-01-12 13:26:47 +08:00
48e55a7d32 Update work.go 2026-01-12 13:24:13 +08:00
627b08f0cd Update work.go 2026-01-12 13:16:11 +08:00
fa069d0d7d Merge branch 'feature-userinfo-daiyb' into dev 2026-01-12 13:10:24 +08:00
c019547992 Update work.go 2026-01-12 13:04:52 +08:00
d189ce2eae Update work.go 2026-01-12 13:04:11 +08:00
bx1834938347-prog
ba402065dd Merge branch 'wwq' into dev 2026-01-12 11:18:10 +08:00
JNG
ec2de470c4 Merge branch 'jng-supplier-0105' into dev 2026-01-09 14:39:49 +08:00
c53ec47ac7 Update bundle.pb.go 2026-01-09 14:03:21 +08:00
71c3e61b65 自动调整ins图片大小 2026-01-09 13:59:56 +08:00
jiaji.H
13b66debf3 Updata:解决冲突 2026-01-09 11:37:17 +08:00
cjy
869817f43c Merge branch 'feat-cjy-tag' into dev 2026-01-09 11:05:05 +08:00
cjy
e54af0d278 Merge branch 'feat-cjy-tag' into dev 2026-01-09 11:02:43 +08:00
cjy
266e4a6b94 Merge branch 'feat-cjy-tag' into dev 2026-01-09 10:56:24 +08:00
cjy
628d2b64fc Merge branch 'feat-cjy-tag' into dev 2026-01-09 10:39:29 +08:00
cjy
9c6808ec53 Merge branch 'feat-cjy-tag' into dev 2026-01-09 09:44:08 +08:00
cjy
7833d399fc Merge branch 'feat-cjy-tag' into dev 2026-01-08 16:44:38 +08:00
bx1834938347-prog
62c0bfcf3e Merge branch 'wwq' into dev 2026-01-08 15:21:10 +08:00
bx1834938347-prog
e2d8114144 Merge branch 'wwq' into dev 2026-01-08 15:20:23 +08:00
a3485401f5 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-01-08 15:08:16 +08:00
f6be7d7c82 Merge branch 'feature-userinfo-daiyb' into dev 2026-01-08 15:08:15 +08:00
cjy
156459cf32 Merge branch 'feat-cjy-tag' into dev 2026-01-08 14:57:30 +08:00
cjy
66287ee0d0 Merge branch 'feat-cjy-tag' into dev
# Conflicts:
#	api/cast/cast.pb.go
#	api/cast/cast.pb.validate.go
2026-01-08 14:49:11 +08:00
JNG
1714702304 Update upload.go 2026-01-08 13:58:01 +08:00
JNG
c69f7ddba8 Update upload.go 2026-01-08 13:37:49 +08:00
JNG
df06768936 Merge branch 'dev' of https://gitea-net.fontree.cn/fiee/fonchain-fiee into dev 2026-01-08 13:33:26 +08:00
JNG
771ec86506 Update upload.go 2026-01-08 13:33:21 +08:00
bx1834938347-prog
29d6a2e022 Merge branch 'wwq' into dev 2026-01-08 13:31:08 +08:00
JNG
b6ed2e4eac Update upload.go 2026-01-08 13:28:30 +08:00
bx1834938347-prog
34aea49f68 Merge branch 'wwq' into dev 2026-01-08 13:24:26 +08:00
JNG
5f3a8b6906 Merge branch 'jng-supplier-0105' into dev 2026-01-08 13:17:20 +08:00
JNG
1f7b864434 Update upload.go 2026-01-08 13:12:44 +08:00
JNG
30591a3014 Update upload.go 2026-01-08 12:00:16 +08:00
JNG
73661824e7 解决冲突 2026-01-08 11:42:58 +08:00
bx1834938347-prog
5e94f5efb8 Merge branch 'wwq' into dev 2026-01-08 11:26:17 +08:00
bx1834938347-prog
5e25b846cb feat:新增图文导入平台 2026-01-08 11:19:52 +08:00
cjy
ceb8a372ff Merge branch 'fix-main-upload' into dev 2026-01-07 15:26:40 +08:00
cjy
26b406f136 Merge branch 'feat-cjy-newTwoPlatform' into dev 2026-01-07 14:34:47 +08:00
cjy
82db383a96 Merge branch 'feat-cjy-newTwoPlatform' into dev 2026-01-07 14:25:47 +08:00
bx1834938347-prog
0bd919e3f0 Merge branch 'wwq' into dev 2026-01-07 11:32:07 +08:00
b14d665f61 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-01-07 10:08:51 +08:00
4797a03196 Merge branch 'feature-userinfo-daiyb' into dev 2026-01-07 10:08:50 +08:00
jiaji.H
e340c8beab Merge branch 'feat-hjj-OfficialManage#A161' into dev 2026-01-07 10:05:00 +08:00
6e78b8fa4e Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-01-07 09:44:55 +08:00
4192424b3c Merge branch 'feature-userinfo-daiyb' into dev 2026-01-07 09:44:54 +08:00
jiaji.H
9820cabd21 Updata:解决冲突 2026-01-07 09:34:35 +08:00
cfde535ac3 Update media.go 2026-01-07 09:19:29 +08:00
4e56dd50b1 添加自媒体账号过期 2026-01-06 16:28:16 +08:00
f66fe79f20 Update healthCheck.go 2026-01-06 16:16:21 +08:00
685930523b 添加过期提示 2026-01-06 16:12:57 +08:00
10957d6ca7 修改过期提示 2026-01-06 16:08:11 +08:00
2ac7a2a56c Merge branch 'feature-userinfo-daiyb' into dev 2026-01-06 15:49:41 +08:00
52ba00be76 Merge branch 'feature-userinfo-daiyb' into dev 2026-01-06 14:57:52 +08:00
67ded6e19a Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-01-06 14:40:47 +08:00
d5460ef912 优化同步 2026-01-06 14:40:46 +08:00
bx1834938347-prog
b981dcbede Merge branch 'wwq' into dev 2026-01-06 14:05:04 +08:00
jiaji.H
3dcaae2dca Updata 2026-01-06 14:00:45 +08:00
jiaji.H
c21c308be5 Updata:解决冲突 2026-01-06 13:52:57 +08:00
3086a9fa52 临时关闭同步ayr 2026-01-06 11:35:06 +08:00
JNG
2e47045d31 Merge branch 'jng-supplier-0105' into dev 2026-01-06 11:28:31 +08:00
fb93b0d227 Merge branch 'main' into dev 2026-01-06 11:24:00 +08:00
cjy
57c0dcc019 Merge branch 'feat-cjy-newTwoPlatform' into dev 2026-01-06 10:48:29 +08:00
JNG
8169a3ece8 Merge branch 'dev' of https://gitea-net.fontree.cn/fiee/fonchain-fiee into dev 2026-01-06 10:43:45 +08:00
JNG
0cdb696c9a Update init.go 2026-01-06 10:42:09 +08:00
bx1834938347-prog
49c5fb6196 Merge branch 'wwq' into dev 2026-01-06 10:40:55 +08:00
bx1834938347-prog
b6de8e0ee9 Merge branch 'wwq' into dev 2026-01-06 10:35:59 +08:00
jiaji.H
8efd9b6296 Merge branch 'feat-hjj-FileManager' into dev 2026-01-06 10:25:42 +08:00
cjy
3b6d843d12 Merge branch 'feat-cjy-tag' into dev 2026-01-06 10:11:20 +08:00
cjy
4840f86791 Merge branch 'feat-cjy-newTwoPlatform' into dev 2026-01-06 10:10:57 +08:00
JNG
ebdd4aa6f0 Merge branch 'dev' of https://gitea-net.fontree.cn/fiee/fonchain-fiee into dev 2026-01-06 09:53:50 +08:00
JNG
fe5a648441 Update init.go 2026-01-06 09:53:40 +08:00
jiaji.H
28d2e2f06c Merge branch 'feat-hjj-FileManager' into dev 2026-01-06 09:26:09 +08:00
JNG
ad11e9d61e Merge branch 'dev' of https://gitea-net.fontree.cn/fiee/fonchain-fiee into dev 2026-01-06 09:19:44 +08:00
JNG
3ec3bf097b 解决冲突 2026-01-06 09:18:00 +08:00
bx1834938347-prog
f1a094bb6d Merge branch 'wwq' into dev 2026-01-06 09:13:17 +08:00
cjy
639435a6f4 Merge branch 'feat-cjy-tag' into dev 2026-01-05 17:37:42 +08:00
cjy
ac46520b88 Merge branch 'feat-cjy-tag' into dev
# Conflicts:
#	api/cast/cast.pb.go
2026-01-05 16:40:29 +08:00
bx1834938347-prog
1612144609 Merge branch 'wwq' into dev 2026-01-05 16:17:11 +08:00
bx1834938347-prog
96e0422038 Merge branch 'wwq' into dev 2026-01-05 15:58:31 +08:00
bx1834938347-prog
b1223375b5 Merge branch 'wwq' into dev 2026-01-05 15:37:50 +08:00
bx1834938347-prog
6d9c515a7b Merge branch 'wwq' into dev 2026-01-05 15:31:00 +08:00
580c532c2f Merge branch 'feature-userinfo-daiyb' into dev 2026-01-05 14:57:45 +08:00
bx1834938347-prog
f5db257a20 Merge branch 'wwq' into dev 2026-01-05 11:53:31 +08:00
jiaji.H
bf4ccd87dd Updata:解决冲突 2026-01-05 11:47:07 +08:00
jiaji.H
4b581cce83 Updata解决冲突 2026-01-05 10:47:28 +08:00
7ac9106589 Merge branch 'feature-userinfo-daiyb' into dev 2026-01-04 16:46:02 +08:00
f505603710 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2026-01-04 16:28:03 +08:00
a888868e5f Merge branch 'feature-userinfo-daiyb' into dev 2026-01-04 16:27:56 +08:00
JNG
b9406c7f8a 解决冲突 2026-01-04 15:14:51 +08:00
d1269f9ec1 修改DM授权账号分配 2026-01-04 14:10:38 +08:00
5b6e72ee96 Merge branch 'feat-zjy-fixbug-022' into dev 2026-01-04 11:08:32 +08:00
236f3c0203 Revert "fix: 尝试修复带代码"
This reverts commit decf8ded5e.
2025-12-30 09:43:57 +08:00
d36f923418 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-29 16:20:28 +08:00
b33c2af027 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-29 16:20:27 +08:00
cjy
73c164ca63 Merge branch 'feat-cjy-newTwoPlatform' into dev 2025-12-29 15:23:55 +08:00
cf3e9e10c5 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-29 15:05:37 +08:00
51fe54a99d Merge branch 'feature-userinfo-daiyb' into dev 2025-12-29 14:34:18 +08:00
bfbaed3895 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-29 13:56:48 +08:00
5cafeeaf3a Merge branch 'feature-userinfo-daiyb' into dev 2025-12-29 13:56:44 +08:00
cjy
346c76f307 Merge branch 'feat-cjy-newTwoPlatform' into dev
# Conflicts:
#	api/cast/cast.pb.go
#	api/cast/cast.pb.validate.go
#	pkg/service/cast/work.go
2025-12-29 13:55:39 +08:00
ad3794a1dd Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-29 11:45:21 +08:00
9924e74633 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-29 11:45:19 +08:00
decf8ded5e fix: 尝试修复带代码 2025-12-29 10:57:17 +08:00
3ca58286b1 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-28 18:41:26 +08:00
6b575dac0d Merge branch 'feature-userinfo-daiyb' into dev 2025-12-28 18:16:53 +08:00
2465eaf56f 打开黄反修改批量发布 2025-12-28 17:46:08 +08:00
8319451cb4 Update security.go 2025-12-28 17:45:03 +08:00
5b489327e0 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-28 16:00:52 +08:00
039852b9a7 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-28 15:22:15 +08:00
cjy
445a81e198 feat: 完成任务时,记录日志
# Conflicts:
#	api/bundle/bundle.pb.go
#	api/bundle/bundle_triple.pb.go
2025-12-28 13:12:42 +08:00
539aee6fab Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-28 10:46:10 +08:00
7d1aee048a Merge branch 'feature-userinfo-daiyb' into dev 2025-12-28 10:46:06 +08:00
cjy
1de1540b15 Merge branch 'feat-cjy-data' into dev 2025-12-28 10:41:19 +08:00
51b981b10c 合并代码 2025-12-28 09:51:34 +08:00
cjy
06bc301d80 Merge branch 'feat-cjy-data' into dev 2025-12-26 19:52:36 +08:00
bx1834938347-prog
7d8f65fe07 feat:cron 2025-12-26 18:42:52 +08:00
cjy
9574f77eb7 Merge branch 'feat-cjy-data' into dev
# Conflicts:
#	pkg/model/cast/work.go
2025-12-26 18:15:48 +08:00
cjy
4e9d043bd1 发布的时候不检查余额 2025-12-26 17:41:21 +08:00
bx1834938347-prog
df7b7183cf Merge branch 'wwq' into dev 2025-12-26 14:53:14 +08:00
bx1834938347-prog
16929ac88d Merge branch 'wwq' into dev 2025-12-26 14:51:34 +08:00
020de78e1b Merge branch 'feature-userinfo-daiyb' into dev 2025-12-26 11:49:49 +08:00
6032b977b1 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-26 10:47:03 +08:00
e81b30ac6c Merge branch 'feature-userinfo-daiyb' into dev 2025-12-26 10:47:02 +08:00
JNG
792a07057c Merge branch 'jng-contract-1225' into dev 2025-12-26 10:45:07 +08:00
d5746221fb Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-26 10:44:10 +08:00
ae0639a0de Merge branch 'feature-userinfo-daiyb' into dev 2025-12-26 10:44:09 +08:00
JNG
f017aaa32e Merge branch 'jng-contract-1225' into dev 2025-12-26 10:40:51 +08:00
JNG
77c71b135d Merge branch 'jng-contract-1225' into dev 2025-12-26 10:25:20 +08:00
JNG
2c0cc0a075 Merge branch 'jng-contract-1225' into dev 2025-12-26 10:21:09 +08:00
JNG
37e05c5e70 Merge branch 'jng-contract-1225' into dev 2025-12-26 09:53:18 +08:00
a8ccc3ba74 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-26 09:17:21 +08:00
f490c4e42e Merge branch 'feature-userinfo-daiyb' into dev 2025-12-26 09:17:20 +08:00
JNG
4494e80665 Merge branch 'jng-contract-1225' into dev 2025-12-25 20:22:31 +08:00
JNG
4587bcb73c Merge branch 'jng-contract-1225' into dev 2025-12-25 20:17:53 +08:00
JNG
b8258c611f Merge branch 'jng-contract-1225' into dev 2025-12-25 20:14:35 +08:00
JNG
384d67f56d Merge branch 'jng-contract-1225' into dev 2025-12-25 20:11:06 +08:00
JNG
1a4d3224a1 Merge branch 'jng-contract-1225' into dev 2025-12-25 19:51:26 +08:00
JNG
5e17ed3890 Merge branch 'jng-contract-1225' into dev 2025-12-25 19:38:00 +08:00
JNG
943a3f58b7 解决冲突 2025-12-25 18:46:16 +08:00
dce69e150b Merge branch 'feature-userinfo-daiyb' into dev 2025-12-25 16:58:51 +08:00
fa68bf9ed4 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-25 16:41:29 +08:00
d3e91575f0 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-25 16:41:28 +08:00
cjy
6aac31847b Merge branch 'feat-cjy-data' into dev 2025-12-25 16:09:26 +08:00
jiaji.H
6e64748577 Updata:解决冲突 2025-12-25 15:53:37 +08:00
2b493c1647 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-25 15:37:51 +08:00
058ed862e0 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-25 14:33:28 +08:00
bf48f09be0 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-25 11:25:27 +08:00
b2c0de3ef9 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-25 10:49:38 +08:00
cjy
5e42dd2b7c Merge branch 'feat-cjy-data' into dev 2025-12-24 16:46:29 +08:00
498bdbebc2 Update task.go 2025-12-24 16:31:53 +08:00
751ccce50b Merge branch 'feature-userinfo-daiyb' into dev 2025-12-24 15:56:18 +08:00
c4ef8becb2 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-24 15:03:30 +08:00
0f0df7b23c Merge branch 'feature-userinfo-daiyb' into dev 2025-12-24 14:50:29 +08:00
7fbf05349e 修改并行发布 2025-12-24 14:30:14 +08:00
9538fe3dd0 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-24 12:31:40 +08:00
1aa0967f5b Merge branch 'feature-userinfo-daiyb' into dev 2025-12-24 12:27:44 +08:00
60eac91c61 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-24 12:01:13 +08:00
c48849f1c8 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-24 12:01:12 +08:00
jiaji.H
0b3344e367 Merge branch 'feat-hjj-AutoManuallyConfirmWorkTask' into dev 2025-12-24 11:46:33 +08:00
cjy
9b7eb1c0b6 Merge branch 'feat-cjy-dev-newTwoPlatform' into dev 2025-12-24 11:11:11 +08:00
cjy
f5d17f6821 移除无用的模板 2025-12-24 11:10:55 +08:00
cjy
539609d264 Merge branch 'feat-cjy-newTwoPlatform' into dev 2025-12-24 11:09:47 +08:00
cjy
a3a737ba88 Merge branch 'feat-cjy-dev-newTwoPlatform' into dev 2025-12-24 10:56:20 +08:00
cjy
5711e56111 feat: 批量导入账号增加两个平台 2025-12-24 10:55:42 +08:00
49fa119e80 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-24 10:44:14 +08:00
beec2958f2 修改消费 2025-12-24 10:44:13 +08:00
cjy
35d3a1f0ad Merge branch 'feat-cjy-data' into dev
# Conflicts:
#	pkg/service/cast/analysis.go
2025-12-23 19:41:26 +08:00
cjy
2e52be7d9b Merge branch 'feat-cjy-data' into dev
# Conflicts:
#	pkg/service/cast/analysis.go
2025-12-23 19:31:56 +08:00
jiaji.H
d8aeacb3a8 Merge branch 'feat-hjj-ExportManager' into dev 2025-12-23 16:57:03 +08:00
d5cb145bdd Merge branch 'feature-userinfo-daiyb' into dev 2025-12-23 16:24:47 +08:00
ad788732be Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-23 15:31:16 +08:00
1f81b6da70 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-23 15:31:15 +08:00
cjy
b48b74abb4 Merge branch 'feat-cjy-dev-newTwoPlatform' into dev 2025-12-23 14:31:22 +08:00
cjy
2109c916e8 feat: 作品列表导出增加两个字段 2025-12-23 14:30:58 +08:00
d613c33322 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-23 14:22:43 +08:00
87f9195baf Merge branch 'feature-userinfo-daiyb' into dev 2025-12-23 14:22:42 +08:00
cjy
fcbbdd8bba Merge branch 'feat-cjy-newTwoPlatform' into dev 2025-12-23 14:15:00 +08:00
cjy
4248cc091e feat: 移除没用的map 2025-12-23 14:13:28 +08:00
cjy
cab082a94a Merge branch 'feat-cjy-newTwoPlatform' into dev 2025-12-23 14:09:06 +08:00
cjy
4d13d5c1ab Merge branch 'feat-cjy-newTwoPlatform' into dev
# Conflicts:
#	pkg/model/cast/media.go
#	pkg/service/cast/work.go
2025-12-23 14:03:59 +08:00
cjy
1a460e4dac 更新pb 2025-12-23 10:52:21 +08:00
cjy
3983a27d4d feat: 增加youtube 和 bulesky 发布的特定配置 2025-12-23 10:51:07 +08:00
cjy
a04dae089e feat: 增加两个平台
# Conflicts:
#	pkg/service/cast/work.go
2025-12-23 10:51:07 +08:00
0ce34d54a1 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-23 10:44:39 +08:00
c6568fb76b Merge branch 'feature-userinfo-daiyb' into dev 2025-12-23 10:31:43 +08:00
fe2d1fc250 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-23 09:54:09 +08:00
06fde11152 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-22 17:02:33 +08:00
3cfc2e46e6 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-22 16:57:58 +08:00
291eb674f3 Merge branch 'fix-uploadas-daiyb' into dev 2025-12-22 16:22:22 +08:00
15d11999c2 Merge branch 'fix-uploadas-daiyb' into dev 2025-12-22 15:48:21 +08:00
bc42315df6 Merge branch 'fix-uploadas-daiyb' into dev 2025-12-22 15:47:30 +08:00
c1ba416722 Merge branch 'fix-uploadas-daiyb' into dev 2025-12-22 15:26:07 +08:00
2a6f855d27 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-22 15:05:29 +08:00
5cd2b0e378 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-22 14:25:57 +08:00
ab8e20f8f3 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-22 12:00:26 +08:00
4e4a432e9a Merge branch 'feature-userinfo-daiyb' into dev 2025-12-22 10:51:37 +08:00
a06f8d7ccc Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-22 10:44:45 +08:00
5f44a81c55 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-22 10:44:44 +08:00
cjy
af825ab37d Merge branch 'feat-cjy-data' into dev 2025-12-22 09:21:12 +08:00
7d6777c332 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-20 18:02:38 +08:00
7b60c31a7f Merge branch 'feature-userinfo-daiyb' into dev 2025-12-20 17:55:06 +08:00
bef316c85b 异步任务列表 2025-12-20 16:23:26 +08:00
e060bd78e3 临时去除黄反 2025-12-20 15:08:33 +08:00
bc3587f3b1 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-19 20:51:12 +08:00
7223c24d5b Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-19 16:00:27 +08:00
32737d322a Merge branch 'feature-userinfo-daiyb' into dev 2025-12-19 15:58:51 +08:00
bx1834938347-prog
60b20b6328 Merge branch 'wwq' into dev 2025-12-19 15:57:11 +08:00
cjy
42f247efe7 Merge branch 'feat-cjy-data' into dev 2025-12-19 15:28:15 +08:00
9cfa4316f0 Merge branch 'fix-approval-time' into dev 2025-12-19 14:27:56 +08:00
45f8f3cd5a Merge branch 'fix-approval-time' into dev 2025-12-19 14:24:56 +08:00
86fc7c1316 Merge branch 'fix-approval-time' into dev 2025-12-19 14:15:29 +08:00
b04753237f Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-19 14:06:24 +08:00
6bbe41429d 更新审批时间 2025-12-19 14:06:23 +08:00
bx1834938347-prog
4a479763ce Merge branch 'wwq' into dev 2025-12-19 13:45:58 +08:00
56c3b9b5e3 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-19 13:45:30 +08:00
c0a820af4b Merge branch 'fix-approval-time' into dev 2025-12-19 13:45:29 +08:00
cjy
9e6acf716d Merge branch 'feat-cjy-data' into dev
# Conflicts:
#	api/cast/cast.pb.go
#	api/cast/cast.pb.validate.go
2025-12-19 13:36:22 +08:00
8ef7d57791 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-19 10:07:47 +08:00
1239128a52 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-18 21:28:01 +08:00
1a31f0874a Update analysis.go 2025-12-18 21:05:10 +08:00
b80bb34494 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-18 21:01:02 +08:00
f61063e7a0 修改失败类型 2025-12-18 20:40:33 +08:00
5ee42b7137 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-18 20:03:00 +08:00
8e68bbe543 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-18 20:02:59 +08:00
jiaji.H
1e19761356 Updata:增加失败类型 2025-12-18 19:25:21 +08:00
ee749bac65 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-18 17:45:02 +08:00
d122130196 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-18 17:44:57 +08:00
jiaji.H
33d7bde337 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-18 17:36:53 +08:00
jiaji.H
2ebfe14652 Merge branch 'feat-hjj-BundleStratusInfo' into dev 2025-12-18 17:36:30 +08:00
000341d13a Merge branch 'feature-userinfo-daiyb' into dev 2025-12-18 17:36:26 +08:00
jiaji.H
6cd2077886 Updata:增加套餐过期判断 2025-12-18 17:36:09 +08:00
10ba57a049 修改判断余量 是否足够 2025-12-18 17:35:40 +08:00
bx1834938347-prog
682007dc8f Merge branch 'wwq' into dev 2025-12-18 16:41:20 +08:00
cjy
e8daefc672 Merge branch 'feat-cjy-data' into dev 2025-12-18 16:38:32 +08:00
be1af84920 互动管理接口 2025-12-18 16:00:56 +08:00
baf12aff14 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-18 15:59:59 +08:00
bx1834938347-prog
ec394c57f1 Merge branch 'wwq' into dev 2025-12-18 14:14:56 +08:00
bx1834938347-prog
11b278045d Update init.go 2025-12-18 11:46:52 +08:00
bx1834938347-prog
9ea6cbdbd7 Merge branch 'wwq' into dev 2025-12-18 11:46:21 +08:00
bx1834938347-prog
090625935e Merge branch 'wwq' into dev 2025-12-18 11:45:01 +08:00
bx1834938347-prog
ae5f9aea6f Update init.go 2025-12-18 11:44:10 +08:00
bx1834938347-prog
0556ab0109 Merge branch 'wwq' into dev 2025-12-18 11:43:56 +08:00
bx1834938347-prog
60d141d892 feat:解决冲突 2025-12-18 11:32:24 +08:00
cjy
766f1eddd1 Merge branch 'feat-cjy-data' into dev
# Conflicts:
#	api/cast/cast.pb.go
2025-12-18 10:42:03 +08:00
cjy
5463e7f44c Merge branch 'feat-cjy-data' into dev
# Conflicts:
#	api/aryshare/ayrshare.pb.go
#	api/aryshare/ayrshare.validator.pb.go
#	api/aryshare/ayrshare_triple.pb.go
#	pkg/cron/task.go
2025-12-17 19:33:21 +08:00
0191ed1219 Update cast_triple.pb.go 2025-12-17 17:05:11 +08:00
fc0484370a Merge branch 'feature-userinfo-daiyb' into dev 2025-12-17 17:05:09 +08:00
jiaji.H
c2b4114bd5 Updata:解决冲突 2025-12-17 16:24:53 +08:00
e2abc91367 Merge branch 'feature-upload-daiyb' into dev 2025-12-17 14:45:26 +08:00
ea4e66a2a3 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-17 14:08:13 +08:00
4e48fb3742 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-17 14:08:12 +08:00
cjy
62572aa23e Merge branch 'feat-cjy-data' into dev 2025-12-17 13:17:00 +08:00
jiaji.H
d53eee5f9e Merge branch 'feat-hjj-AutoManuallyConfirmWorkTask' into dev 2025-12-17 11:48:37 +08:00
cjy
13fa310b57 Merge branch 'feat-cjy-data' into dev 2025-12-17 11:45:41 +08:00
jiaji.H
41ff630b60 Updata:解决冲突 2025-12-17 11:02:58 +08:00
jiaji.H
6817a5bdf3 Merge branch 'feat-hjj-AutoManuallyConfirmWorkTask' into dev 2025-12-17 10:06:54 +08:00
jiaji.H
0eac0276f9 Merge branch 'feat-hjj-AutoManuallyConfirmWorkTask' into dev 2025-12-17 10:01:05 +08:00
jiaji.H
345bf66c43 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-17 09:14:09 +08:00
jiaji.H
eda7b21dcc Updata:解决冲突 2025-12-17 09:14:06 +08:00
8f14755364 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-16 20:28:04 +08:00
8a8e983dd2 修改定时发布机制 2025-12-16 20:28:03 +08:00
cjy
77e42deae0 Merge branch 'feat-cjy-data' into dev 2025-12-16 20:26:43 +08:00
cjy
f954df6bd6 Merge branch 'feat-cjy-data' into dev 2025-12-16 19:45:55 +08:00
cjy
4357edb29f Merge branch 'feat-cjy-data' into dev
# Conflicts:
#	api/cast/cast.pb.go
2025-12-16 19:40:04 +08:00
cjy
e481f61a53 Merge branch 'feat-cjy-data' into dev
# Conflicts:
#	api/cast/cast.pb.go
#	api/cast/cast.pb.validate.go
2025-12-16 19:33:48 +08:00
399aa08dd0 添加定时消费队列 2025-12-16 19:02:13 +08:00
43404ae283 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-16 17:59:38 +08:00
f234a97213 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-16 16:39:08 +08:00
a130bc03c8 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-16 16:39:07 +08:00
jiaji.H
7687495842 Updata:更新pb文件 2025-12-16 16:15:08 +08:00
1cb27a6589 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-16 16:11:24 +08:00
34a84bd481 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-16 15:39:30 +08:00
5a534936f6 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-16 15:27:58 +08:00
fb851cc393 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-16 15:22:13 +08:00
a4c48a1dba Merge branch 'feature-userinfo-daiyb' into dev 2025-12-16 15:22:12 +08:00
jiaji.H
6e5a914152 Updata:解决冲突 2025-12-16 14:44:58 +08:00
77d3f53039 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-16 14:32:13 +08:00
bd9df0a02b Merge branch 'feature-userinfo-daiyb' into dev 2025-12-16 13:49:50 +08:00
094fbb78ca Merge branch 'feature-userinfo-daiyb' into dev 2025-12-16 09:20:46 +08:00
626a4a4ed4 列表查询 2025-12-15 19:19:09 +08:00
4eb7a09df5 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-15 16:35:50 +08:00
90df2b1a9e 合并发布 2025-12-15 16:35:49 +08:00
30c1edd959 Merge branch 'feature-newApi-daiyb' into dev 2025-12-15 16:34:47 +08:00
jiaji.H
d958a9e100 Merge branch 'feat-hjj-CastWork#' into dev 2025-12-15 16:13:13 +08:00
jiaji.H
8fc0336932 Merge branch 'feat-hjj-CastWork#' into dev 2025-12-15 16:09:13 +08:00
jiaji.H
9f808bbcd4 Merge branch 'feat-hjj-CastWork#' into dev 2025-12-15 16:03:30 +08:00
jiaji.H
bd1b57ddb2 Merge branch 'feat-hjj-CastWork#' into dev 2025-12-15 15:57:27 +08:00
jiaji.H
3f81b11945 Merge branch 'feat-hjj-CastWork#' into dev 2025-12-15 15:49:43 +08:00
JNG
cd6806b562 Merge branch 'jng' into dev 2025-12-15 15:47:23 +08:00
JNG
3672dc876a Merge branch 'jng' into dev 2025-12-15 15:44:59 +08:00
jiaji.H
6223a476b1 Merge branch 'feat-hjj-CastWork#' into dev 2025-12-15 15:42:00 +08:00
JNG
80da315d7b Merge branch 'jng-1127' into dev 2025-12-15 12:00:30 +08:00
4195330c0c Merge branch 'feature-newApi-daiyb' into dev 2025-12-12 16:40:49 +08:00
e89e1f35de Update cast.pb.validate.go 2025-12-12 16:38:53 +08:00
64b9753ca1 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-12 16:38:51 +08:00
7cdd27ca03 Merge branch 'feature-newApi-daiyb' into dev 2025-12-12 16:38:28 +08:00
jiaji.H
ad00b442df Merge branch 'feat-hjj-filebrowser#Saas3' into dev 2025-12-12 15:35:19 +08:00
jiaji.H
01d54a8f96 Updata:解决冲突 2025-12-12 15:17:22 +08:00
jiaji.H
5bb7dbd802 Merge branch 'feat-hjj-filebrowser#Saas3' into dev 2025-12-12 15:09:45 +08:00
jiaji.H
403dd045ef Merge branch 'feat-hjj-filebrowser#Saas3' into dev 2025-12-12 14:47:05 +08:00
jiaji.H
db36eaca42 Updata:增加黄反接口 2025-12-12 14:40:25 +08:00
cjy
e399d2ef24 feat: 更新pb
# Conflicts:
#	api/cast/cast.pb.go
#	api/cast/cast.pb.validate.go
2025-12-12 14:11:51 +08:00
3e29816950 Merge branch 'feature-newApi-daiyb' into dev 2025-12-12 14:10:30 +08:00
53b26a3972 Merge branch 'feature-newApi-daiyb' into dev 2025-12-12 13:47:52 +08:00
91c6918e77 Merge branch 'feature-newApi-daiyb' into dev 2025-12-12 13:20:19 +08:00
e7e93ca3b0 修改授权 2025-12-12 11:45:33 +08:00
bx1834938347-prog
48916e945a Merge branch 'wwq' into dev 2025-12-12 09:52:06 +08:00
ce80e5f21e Merge branch 'feature-newApi-daiyb' into dev 2025-12-11 21:17:57 +08:00
32b334afe1 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-11 21:05:57 +08:00
345b417810 合并发布 2025-12-11 21:05:56 +08:00
jiaji.H
cfcb39eb72 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-12-11 19:12:29 +08:00
d00a71708d Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-11 16:01:12 +08:00
48343298ae Merge branch 'feature-newApi-daiyb' into dev 2025-12-11 16:01:10 +08:00
jiaji.H
0253043903 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-11 15:28:49 +08:00
jiaji.H
27f40676d8 Updata:去除异步 2025-12-11 15:28:48 +08:00
cjy
4e658732da Merge branch 'feat-cjy-data' into dev 2025-12-11 15:00:59 +08:00
6354c95bde Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-11 14:57:27 +08:00
d89404c607 Merge branch 'feature-newApi-daiyb' into dev 2025-12-11 14:57:26 +08:00
cjy
2aa015e5a7 Merge branch 'feat-cjy-data' into dev 2025-12-11 14:42:36 +08:00
bx1834938347-prog
ac9a180948 Merge branch 'wwq' into dev 2025-12-11 14:28:18 +08:00
jiaji.H
292550973e Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-12-11 13:58:13 +08:00
bb7c80b716 修改同步 2025-12-11 11:18:24 +08:00
jiaji.H
62e66da4d7 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-12-11 10:29:01 +08:00
cjy
cc0bccc584 Merge branch 'feat-cjy-data' into dev 2025-12-11 10:22:30 +08:00
cjy
00014cd6e5 Merge branch 'feat-cjy-data' into dev 2025-12-10 16:22:19 +08:00
cjy
59697ee6f0 Merge branch 'feat-cjy-data' into dev 2025-12-10 16:18:04 +08:00
cjy
ecce83737b Merge branch 'feat-cjy-data' into dev 2025-12-10 16:09:18 +08:00
jiaji.H
1794da7f35 Updata:解决冲突 2025-12-10 15:24:59 +08:00
jiaji.H
80de4346ad 更新配置文件 2025-12-10 15:16:57 +08:00
jiaji.H
5eda55648f Updata:解决冲突 2025-12-10 15:10:11 +08:00
cjy
6cc472a8f8 Merge branch 'feat-cjy-data' into dev
# Conflicts:
#	pkg/cron/task.go
2025-12-10 14:09:09 +08:00
jiaji.H
4a72b37ae4 Merge branch 'feat-hjj-filebrowser#Saas3' into dev 2025-12-10 13:36:50 +08:00
jiaji.H
61a7af83fc Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-12-10 11:21:52 +08:00
a92dd6961f Merge branch 'feature-newApi-daiyb' into dev 2025-12-10 09:50:19 +08:00
889b524f8f Merge branch 'feature-newApi-daiyb' into dev 2025-12-09 20:44:53 +08:00
77265be8f1 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-09 20:32:20 +08:00
137e4c9789 Merge branch 'feature-newApi-daiyb' into dev 2025-12-09 20:32:19 +08:00
cjy
99db707c85 Merge branch 'feat-cjy-data' into dev
# Conflicts:
#	api/cast/cast.pb.go
#	api/cast/cast.pb.validate.go
2025-12-09 18:23:59 +08:00
7375df728c Merge branch 'feature-newApi-daiyb' into dev 2025-12-09 17:13:01 +08:00
dac129d12e 合并最新代码 2025-12-09 16:15:18 +08:00
bc33671ac6 更新api发布 2025-12-09 16:09:43 +08:00
cjy
2927a4f179 Merge branch 'feat-cjy-data' into dev 2025-12-09 16:01:22 +08:00
cjy
137829c50a Merge branch 'feat-cjy-data' into dev 2025-12-09 15:58:05 +08:00
bx1834938347-prog
3af150054f Merge branch 'wwq' into dev 2025-12-09 14:56:40 +08:00
jiaji.H
7708e5c9a4 Updata:更新pb文件,修改导出表格格式 2025-12-09 13:36:17 +08:00
cjy
3f170c4091 Merge branch 'feat-cjy-data' into dev 2025-12-09 11:44:50 +08:00
JNG
39235ebc3c 解决冲突 2025-12-09 11:12:33 +08:00
jiaji.H
25df768960 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-12-09 10:58:56 +08:00
jiaji.H
001bd4337b Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-12-09 10:04:05 +08:00
bx1834938347-prog
b9b4c16c12 Merge branch 'wwq' into dev 2025-12-09 09:48:40 +08:00
jiaji.H
180a9ab2d5 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-09 09:43:52 +08:00
jiaji.H
07198e000d Updata:更新测试环境错误返回 2025-12-09 09:42:59 +08:00
bx1834938347-prog
43f62ea2c5 Merge branch 'wwq' into dev 2025-12-09 09:34:14 +08:00
jiaji.H
9f55832cae Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-12-09 09:33:05 +08:00
jiaji.H
0040dd1502 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-12-09 09:09:26 +08:00
jiaji.H
014a1fe478 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-12-08 19:55:42 +08:00
jiaji.H
c7546c8372 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-12-08 19:48:52 +08:00
jiaji.H
b9a24ea0e6 Updata:解决冲突 2025-12-08 19:46:29 +08:00
jiaji.H
100155a9fc Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-12-08 19:32:15 +08:00
bx1834938347-prog
1efe6848d7 Merge branch 'dev' into wwq 2025-12-08 17:10:29 +08:00
bx1834938347-prog
aa7b228dc5 Merge branch 'wwq' into dev 2025-12-08 16:54:50 +08:00
jiaji.H
ac68f3c4d0 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-12-08 16:37:25 +08:00
cjy
bfa1716fe1 Merge branch 'feat-cjy-data' into dev 2025-12-08 14:38:49 +08:00
jiaji.H
4eb8d2d055 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-12-08 14:37:06 +08:00
bx1834938347-prog
7c2e68c309 Merge branch 'wwq' into dev 2025-12-08 14:12:58 +08:00
bx1834938347-prog
c1c94d6f13 Merge branch 'wwq' into dev 2025-12-08 11:18:54 +08:00
cjy
6083ed9272 Merge branch 'feat-cjy-data' into dev
# Conflicts:
#	api/cast/cast.pb.go
#	api/cast/cast.pb.validate.go
#	api/cast/cast_triple.pb.go
2025-12-08 09:36:16 +08:00
jiaji.H
9027c81697 Updata:解决冲突 2025-12-08 09:27:57 +08:00
bx1834938347-prog
fb372200bb Merge branch 'wwq' into dev 2025-12-08 09:03:11 +08:00
bx1834938347-prog
fa5cd158dd Merge branch 'wwq' into dev 2025-12-05 19:12:25 +08:00
bx1834938347-prog
f9b4da20f6 Merge branch 'wwq' into dev 2025-12-05 17:06:44 +08:00
3a298a6d3a Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-05 16:41:55 +08:00
df6f0b791d Merge branch 'feature-userinfo-daiyb' into dev 2025-12-05 16:41:54 +08:00
bx1834938347-prog
a18463be54 Merge branch 'wwq' into dev 2025-12-05 16:23:10 +08:00
bx1834938347-prog
e57faa2948 Merge branch 'wwq' into dev 2025-12-05 16:19:38 +08:00
bx1834938347-prog
e8f5dcecc3 Merge branch 'wwq' into dev 2025-12-05 15:47:00 +08:00
bx1834938347-prog
17b91fc579 Merge branch 'wwq' into dev 2025-12-05 15:13:15 +08:00
bx1834938347-prog
06f7246d35 Merge branch 'wwq' into dev 2025-12-05 14:25:03 +08:00
bx1834938347-prog
2d03a13227 Merge branch 'wwq' into dev 2025-12-05 14:17:03 +08:00
bx1834938347-prog
3f55338f1d Merge branch 'wwq' into dev 2025-12-05 10:59:34 +08:00
bx1834938347-prog
de730bf9de Merge branch 'wwq' into dev 2025-12-05 10:52:45 +08:00
bx1834938347-prog
44bdbbf3c2 Merge branch 'wwq' into dev 2025-12-05 10:43:31 +08:00
bx1834938347-prog
2e8dd27aff Merge branch 'wwq' into dev 2025-12-05 10:29:12 +08:00
bx1834938347-prog
0b93a23d4e Merge branch 'wwq' into dev 2025-12-05 10:22:10 +08:00
jiaji.H
bbf81de56e Merge branch 'feat-hjj-filebrowser#Saas3' into dev 2025-12-05 09:07:06 +08:00
bx1834938347-prog
9d35de6b11 Merge branch 'wwq' into dev 2025-12-05 09:03:34 +08:00
jiaji.H
60a8ff39a6 Merge branch 'feat-hjj-filebrowser#Saas3' into dev 2025-12-04 19:26:27 +08:00
jiaji.H
d509b15973 Merge branch 'feat-hjj-filebrowser#Saas3' into dev 2025-12-04 16:01:10 +08:00
bx1834938347-prog
f5a97aee08 Merge branch 'wwq' into dev 2025-12-04 15:44:55 +08:00
8a1cac312e Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-04 15:33:33 +08:00
2c8ee193c3 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-04 15:33:32 +08:00
jiaji.H
9859b1ec0d Merge branch 'feat-hjj-filebrowser#Saas3' into dev 2025-12-04 15:33:19 +08:00
bx1834938347-prog
fc4c5d6f93 Merge branch 'wwq' into dev 2025-12-04 15:25:47 +08:00
bx1834938347-prog
d57089a79f Merge branch 'wwq' into dev 2025-12-04 14:59:53 +08:00
0db7945192 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-04 14:33:14 +08:00
3bbcc9f763 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-04 14:33:12 +08:00
bx1834938347-prog
da7e390fe8 Merge branch 'wwq' into dev 2025-12-04 11:20:08 +08:00
50ec31cbb5 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-03 18:35:23 +08:00
ac91a11820 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-03 16:25:34 +08:00
312f73c215 Merge branch 'feature-userinfo-daiyb' into dev 2025-12-03 16:16:12 +08:00
19d95d6efe Merge branch 'feature-userinfo-daiyb' into dev 2025-12-03 14:57:12 +08:00
7eda9a3d0b Merge branch 'feature-userinfo-daiyb' into dev 2025-12-03 13:56:56 +08:00
066c0b2067 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-12-03 13:49:57 +08:00
9b68c2434c Merge branch 'feature-userinfo-daiyb' into dev 2025-12-03 13:49:57 +08:00
jiaji.H
469fac745d Merge branch 'feat-hjj-filebrowser#Saas3' into dev 2025-12-01 13:56:08 +08:00
jiaji.H
c5ff922830 Merge branch 'feat-hjj-filebrowser#Saas3' into dev 2025-12-01 13:40:58 +08:00
jiaji.H
88ef2fc64f Merge branch 'feat-hjj-filebrowser#Saas3' into dev 2025-12-01 13:38:20 +08:00
jiaji.H
f9d15bf2e2 Merge branch 'feat-hjj-filebrowser#Saas3' into dev 2025-12-01 13:33:00 +08:00
jiaji.H
615739b8fb Merge branch 'feat-hjj-filebrowser#Saas3' into dev 2025-12-01 13:31:04 +08:00
jiaji.H
d7ea21e0ef Merge branch 'feat-hjj-filebrowser#Saas3' into dev 2025-12-01 13:11:48 +08:00
jiaji.H
e6802835da Updata:解决冲突 2025-12-01 12:00:12 +08:00
jiaji.H
6b8b993ceb Updata:解决冲突 2025-12-01 11:46:51 +08:00
cjy
360ff4652f Merge branch 'feat-cjy-taskBench2' into dev 2025-12-01 10:12:31 +08:00
cjy
245281849f Merge branch 'feat-cjy-taskBench2' into dev 2025-11-29 11:06:33 +08:00
cjy
de465b1503 Merge branch 'feat-cjy-taskBench2' into dev 2025-11-28 15:31:41 +08:00
jiaji.H
1a7cd0e135 Merge branch 'feat-hjj-CastWork#' into dev 2025-11-28 14:45:36 +08:00
jiaji.H
e37a2fe3db Merge branch 'feat-hjj-CastWork#' into dev 2025-11-28 14:38:25 +08:00
cjy
554be2058d Merge branch 'feat-cjy-taskBench2' into dev 2025-11-27 20:17:46 +08:00
jiaji.H
47500a2028 Merge branch 'feat-hjj-CastWork#' into dev 2025-11-27 17:59:04 +08:00
a2abf42113 Merge branch 'feature-userinfo-daiyb' into dev 2025-11-27 17:49:57 +08:00
54f42c2b5d Merge branch 'feature-userinfo-daiyb' into dev 2025-11-27 14:16:36 +08:00
9835138f5a Merge branch 'feature-userinfo-daiyb' into dev 2025-11-26 17:45:48 +08:00
634d143e2b Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-11-26 17:38:14 +08:00
e0b8d5cc6c Merge branch 'feature-userinfo-daiyb' into dev 2025-11-26 17:38:13 +08:00
cjy
e9a455eab8 feat: 增加撤消脚本数 2025-11-26 17:14:55 +08:00
cjy
5c764a9ee3 Merge branch 'feat-cjy-taskBench2' into dev 2025-11-26 16:29:16 +08:00
jiaji.H
1f4f24f9ef Updata:解决冲突 2025-11-26 13:26:15 +08:00
jiaji.H
1ae5d89d29 Merge branch 'feat-hjj-CastWork#' into dev 2025-11-26 11:47:35 +08:00
jiaji.H
4b21bfd759 Merge branch 'feat-hjj-CastWork#' into dev 2025-11-26 11:42:53 +08:00
cjy
b95507f3fd Merge branch 'feat-cjy-taskBench2' into dev 2025-11-25 16:44:21 +08:00
cjy
fa8b4f7fb0 Merge branch 'feat-cjy-taskBench2' into dev 2025-11-25 16:39:42 +08:00
JNG
047fd667ac Merge branch 'jng' into dev 2025-11-25 15:14:34 +08:00
cjy
36c559b5de Merge branch 'feat-cjy-taskBench2' into dev 2025-11-25 15:04:32 +08:00
cjy
be872194a4 Merge branch 'feat-cjy-taskBench2' into dev 2025-11-25 10:28:17 +08:00
f96492dd37 Merge branch 'feature-userinfo-daiyb' into dev 2025-11-24 16:41:52 +08:00
e174adbfe3 Merge branch 'feature-userinfo-daiyb' into dev 2025-11-24 16:11:22 +08:00
6cd77785cf Merge branch 'feature-userinfo-daiyb' into dev 2025-11-24 15:57:29 +08:00
479ae3a3d4 Merge branch 'feature-userinfo-daiyb' into dev 2025-11-24 15:52:21 +08:00
9bbee05199 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-11-24 15:06:50 +08:00
c7db716f70 Merge branch 'feature-userinfo-daiyb' into dev 2025-11-24 15:06:49 +08:00
jiaji.H
3cec6a41bf Updata:解决冲突 2025-11-24 12:00:53 +08:00
aeda4ecb61 Merge branch 'feature-userinfo-daiyb' into dev 2025-11-24 10:38:29 +08:00
6937b16808 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-11-21 15:48:54 +08:00
36218b8ba6 Merge branch 'feature-userinfo-daiyb' into dev 2025-11-21 15:48:53 +08:00
cjy
5bd9c6fbac Merge branch 'feat-cjy-taskBench2' into dev 2025-11-21 15:32:58 +08:00
cjy
ebfe9f69e0 Merge branch 'feat-cjy-taskBench2' into dev 2025-11-21 14:45:37 +08:00
acc03e03a6 Merge branch 'feature-userinfo-daiyb' into dev 2025-11-21 14:42:46 +08:00
ede34caddf Merge branch 'feature-userinfo-daiyb' into dev 2025-11-21 14:12:07 +08:00
3af6401b88 Merge branch 'feature-userinfo-daiyb' into dev 2025-11-21 14:10:49 +08:00
d593f9812b Merge branch 'feature-userinfo-daiyb' into dev 2025-11-21 14:07:25 +08:00
4865ce955b Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-11-20 10:23:17 +08:00
a8166a0cd2 Merge branch 'feature-userinfo-daiyb' into dev 2025-11-20 10:23:15 +08:00
cjy
5585ab8c1c Merge branch 'feat-cjy-taskBench2' into dev 2025-11-19 16:08:28 +08:00
b186705454 Merge branch 'feature-userinfo-daiyb' into dev 2025-11-19 14:47:28 +08:00
8b9b067145 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-11-18 18:34:06 +08:00
f356e389f5 Merge branch 'feature-userinfo-daiyb' into dev 2025-11-18 18:34:05 +08:00
cjy
d482d7757e Merge branch 'feat-cjy-taskBench2' into dev 2025-11-18 14:13:56 +08:00
d22aaa719e Merge branch 'feature-userinfo-daiyb' into dev 2025-11-18 10:03:54 +08:00
e36caaaff4 Merge branch 'feature-userinfo-daiyb' into dev 2025-11-18 09:35:39 +08:00
a1a3d229c5 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-11-17 18:16:47 +08:00
5d087d092b Merge branch 'feature-userinfo-daiyb' into dev 2025-11-17 18:16:46 +08:00
cjy
3dbcfe23ea Merge branch 'feat-cjy-taskBench2' into dev 2025-11-17 15:24:14 +08:00
cjy
0bb3edd373 Merge branch 'feat-cjy-taskBench2' into dev 2025-11-17 15:08:15 +08:00
4ea64ebd95 Update accountFiee.pb.go 2025-11-17 13:29:13 +08:00
bf9d22c0a3 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-11-17 13:28:37 +08:00
572e01fa9b 添加脚本 2025-11-17 13:28:11 +08:00
cjy
e74d95b70a Merge branch 'feat-cjy-taskBench2' into dev
# Conflicts:
#	api/bundle/bundle.pb.go
2025-11-17 11:41:22 +08:00
cjy
7c473dd6a5 更新pb 2025-11-17 11:24:26 +08:00
JNG
8bc95908a8 Merge branch 'jng' into dev 2025-11-17 11:12:59 +08:00
jiaji.H
97f01bc40a Merge branch 'feat-hjj-CastWork#' into dev 2025-11-16 18:59:49 +08:00
jiaji.H
023fbfbde5 Updata:解决冲突 2025-11-14 23:59:33 +08:00
f47d9480fd Merge branch 'feature-userinfo-daiyb' into dev 2025-11-14 20:30:48 +08:00
1e61a5d7c4 修改方式 2025-11-14 20:22:37 +08:00
jiaji.H
05a6693156 Merge branch 'feat-hjj-CastWork#' into dev 2025-11-14 15:42:16 +08:00
jiaji.H
7b5d166ffa Merge branch 'feat-hjj-CastWork#' into dev 2025-11-14 15:15:11 +08:00
cjy
0e45102207 Merge branch 'feat-cjy-taskBench2' into dev 2025-11-14 15:02:23 +08:00
cjy
1849d742c1 Merge branch 'feat-cjy-taskBench2' into dev
# Conflicts:
#	api/bundle/bundle.pb.go
#	api/bundle/bundle_triple.pb.go
2025-11-14 10:37:46 +08:00
bx1834938347-prog
dd76259175 Merge branch 'wwq' into dev 2025-11-13 10:28:31 +08:00
lzh
1b4f86d57e Merge branch 'dev-lzh-1029' into dev 2025-11-11 16:26:41 +08:00
lzh
aede8cbe97 Merge branch 'dev-lzh-1029' into dev 2025-11-11 15:55:00 +08:00
lzh
3afabc639b Merge branch 'dev-lzh-1029' into dev 2025-11-11 09:46:20 +08:00
JNG
7009d57f65 Merge branch 'jng' into dev 2025-11-10 19:45:31 +08:00
lzh
ec958a88b3 Merge branch 'dev-lzh-1029' into dev 2025-11-10 15:48:01 +08:00
lzh
e32b2e8b9a Merge branch 'dev-lzh-1029' into dev 2025-11-10 15:09:16 +08:00
lzh
5dfef7b70a Merge branch 'dev-lzh-1029' into dev 2025-11-10 11:14:54 +08:00
lzh
f6bad1d8e1 debug 2025-11-10 10:58:59 +08:00
lzh
4eb64cde93 Merge branch 'dev-lzh-1029' into dev 2025-11-10 10:56:31 +08:00
lzh
4e0becfd5c Merge branch 'dev-lzh-1029' into dev 2025-11-10 10:39:30 +08:00
lzh
616e98fcec Merge branch 'dev-lzh-1029' into dev 2025-11-10 10:34:07 +08:00
lzh
c31f3f8376 Merge branch 'dev-lzh-1029' into dev 2025-11-10 10:29:05 +08:00
lzh
c50b19fd10 Merge branch 'dev-lzh-1029' into dev 2025-11-10 10:22:13 +08:00
lzh
ca296bca49 Merge branch 'dev-lzh-1029' into dev 2025-11-10 10:16:03 +08:00
lzh
c9f032948e Merge branch 'dev-lzh-1029' into dev 2025-11-10 09:38:18 +08:00
lzh
5473324d2d Merge branch 'dev-lzh-1029' into dev 2025-11-07 13:50:32 +08:00
lzh
7b035e00d6 Merge branch 'dev-lzh-1029' into dev 2025-11-07 13:37:36 +08:00
JNG
13c27da618 Merge branch 'jng' into dev 2025-11-06 17:09:25 +08:00
JNG
82ed8b6c94 Merge branch 'jng' into dev 2025-11-06 17:03:40 +08:00
JNG
af03cc8f5b Merge branch 'jng' into dev 2025-11-06 16:29:48 +08:00
lzh
0974d2631e Merge branch 'dev-lzh-1029' into dev 2025-11-06 15:00:00 +08:00
lzh
6dc9f7469e Merge branch 'dev-lzh-1029' into dev 2025-11-05 09:57:21 +08:00
lzh
fb9315a201 Merge branch 'dev-lzh-1029' into dev 2025-11-03 16:44:40 +08:00
lzh
f9ee8101bf Merge branch 'dev-lzh-1029' into dev 2025-11-03 16:39:55 +08:00
lzh
c0ef075cfa Merge branch 'dev-lzh-1029' into dev 2025-11-03 16:33:04 +08:00
lzh
0dfc2b2daf Merge branch 'dev-lzh-1029' into dev 2025-11-03 16:27:22 +08:00
lzh
0c573ce93b Merge branch 'dev-lzh-1029' into dev 2025-11-03 16:16:22 +08:00
lzh
f84bc42bd6 Merge branch 'dev-lzh-1029' into dev 2025-11-03 16:12:39 +08:00
lzh
0ba2a78f73 Merge branch 'dev-lzh-1029' into dev 2025-11-03 16:07:02 +08:00
lzh
ce833dadf5 Merge branch 'dev-lzh-1029' into dev 2025-11-03 15:49:59 +08:00
lzh
6e0721e923 Merge branch 'dev-lzh-1029' into dev 2025-11-03 15:45:14 +08:00
lzh
8d3d21d0ea Merge branch 'dev-lzh-1029' into dev 2025-11-03 14:39:02 +08:00
lzh
3bdf010ed5 Merge branch 'dev-lzh-1029' into dev 2025-11-03 14:26:34 +08:00
lzh
f372b6953a Merge branch 'dev-lzh-1029' into dev 2025-11-03 14:13:04 +08:00
lzh
ae6f033a90 Merge branch 'dev-lzh-1029' into dev 2025-11-03 14:06:19 +08:00
lzh
ef876cb63c Merge branch 'dev-lzh-1029' into dev 2025-11-03 13:56:58 +08:00
lzh
6e475cd1e9 Merge branch 'dev-lzh-1029' into dev 2025-11-03 13:48:24 +08:00
lzh
e76541de23 Merge branch 'dev-lzh-1029' into dev 2025-11-03 13:23:38 +08:00
lzh
31d394627c Merge branch 'dev-lzh-1029' into dev 2025-11-03 13:15:59 +08:00
lzh
4040d22fe5 Merge branch 'dev-lzh-1029' into dev 2025-11-03 11:49:14 +08:00
lzh
5c43a2fa7b Merge branch 'dev-lzh-1029' into dev 2025-11-03 11:15:50 +08:00
lzh
70e60407e9 Merge branch 'dev-lzh-1029' into dev 2025-11-03 09:47:32 +08:00
jiaji.H
5b801a546b Updata:更新pb文件 2025-10-30 11:28:15 +08:00
lzh
9d8d900f74 Merge branch 'main' into dev 2025-10-30 11:02:38 +08:00
90bf6de27d 作品状态 2025-10-28 13:54:15 +08:00
lzh
14e5b3c49c Merge branch 'dev-lzh-0905' into dev 2025-10-24 17:06:48 +08:00
acb845a55f Merge branch 'feature-octTwo-daiyb' into dev 2025-10-24 16:50:34 +08:00
lzh
b0adf39e00 Merge branch 'dev-lzh-0905' into dev 2025-10-24 15:04:59 +08:00
d4646b3fbb Merge branch 'feature-octTwo-daiyb' into dev 2025-10-24 14:59:51 +08:00
517ee67733 Merge branch 'feature-octTwo-daiyb' into dev 2025-10-24 14:37:10 +08:00
3119718387 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-10-23 16:51:37 +08:00
9ef9ba8850 Merge branch 'feature-octTwo-daiyb' into dev 2025-10-23 16:51:36 +08:00
JNG
45769d59f9 Update conf.ini 2025-10-23 15:57:23 +08:00
JNG
a820439b7a Update dubbogo.yaml 2025-10-23 15:38:12 +08:00
JNG
251829bab3 Merge branch 'jng' into dev 2025-10-23 15:30:22 +08:00
cjy
20f8af09cb Merge branch 'feat-cjy-taskBench' into dev 2025-10-23 11:05:54 +08:00
cjy
23394a11b8 Merge branch 'feat-cjy-taskBench' into dev 2025-10-22 18:26:24 +08:00
cjy
e6082f61d9 Merge branch 'feat-cjy-taskBench' into dev 2025-10-21 20:46:17 +08:00
cjy
d7d20dbd0d Merge branch 'feat-cjy-taskBench' into dev
# Conflicts:
#	api/bundle/bundle.pb.go
2025-10-21 20:31:43 +08:00
lzh
36f1e4c609 Merge branch 'dev-lzh-0905' into dev 2025-10-21 15:49:23 +08:00
lzh
cdbb266503 Merge branch 'dev-lzh-0905' into dev 2025-10-21 14:59:43 +08:00
a34636ac80 Merge branch 'feature-octTwo-daiyb' into dev 2025-10-21 14:55:04 +08:00
103986b319 Merge branch 'feature-octTwo-daiyb' into dev 2025-10-21 10:57:36 +08:00
lzh
5a076cd523 Merge branch 'dev-lzh-0905' into dev 2025-10-20 17:11:34 +08:00
lzh
d81c6b7aad Merge branch 'dev-lzh-0905' into dev 2025-10-20 17:02:33 +08:00
JNG
2b7ad29482 解决冲突 2025-10-20 15:21:11 +08:00
lzh
3ac392f9d8 Merge branch 'dev-lzh-0905' into dev 2025-10-20 14:34:15 +08:00
cjy
f0c8044cc8 Merge branch 'feat-cjy-taskBench' into dev 2025-10-20 11:03:29 +08:00
cjy
6dd2a5a62b Merge branch 'feat-cjy-taskBench' into dev 2025-10-20 10:49:21 +08:00
cjy
dca97173bf Merge branch 'feat-cjy-taskBench' into dev
# Conflicts:
#	api/bundle/bundle.pb.go
2025-10-17 16:20:24 +08:00
lzh
b6929b602b Merge branch 'dev-lzh-0905' into dev 2025-10-17 16:00:53 +08:00
lzh
36c32752f9 Merge branch 'dev-lzh-0905' into dev 2025-10-17 15:41:07 +08:00
lzh
afec2dcc61 Merge branch 'dev-lzh-0905' into dev 2025-10-17 15:33:04 +08:00
lzh
3e1334bc3a Merge branch 'dev-lzh-0905' into dev 2025-10-17 15:17:08 +08:00
lzh
0a084828d6 Merge branch 'dev-lzh-0905' into dev 2025-10-17 15:01:17 +08:00
lzh
1623e06e13 Merge branch 'dev-lzh-0905' into dev 2025-10-17 14:50:41 +08:00
lzh
4047d10ed4 Merge branch 'dev-lzh-0905' into dev 2025-10-17 10:33:59 +08:00
lzh
2d44d0ba4d Merge branch 'dev-lzh-0905' into dev 2025-10-17 10:23:44 +08:00
lzh
e35c6365f4 Merge branch 'dev-lzh-0905' into dev 2025-10-16 17:00:04 +08:00
f17c039c1e Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-10-16 10:26:34 +08:00
a1b4472e7f Merge branch 'feature-octTwo-daiyb' into dev 2025-10-16 10:26:34 +08:00
lzh
1e6acd8c8e Merge branch 'dev-lzh-0905' into dev 2025-10-16 09:22:53 +08:00
lzh
cad92c6651 Merge branch 'dev-lzh-0905' into dev 2025-10-15 15:59:01 +08:00
f0ffd00a7d Merge branch 'feature-octTwo-daiyb' into dev 2025-10-11 16:21:30 +08:00
jiaji.H
03efe6030a Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-10-11 10:50:42 +08:00
jiaji.H
6527dbb5a3 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-10-11 10:25:05 +08:00
jiaji.H
625ccc125f Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-10-10 15:41:32 +08:00
lzh
98ce498830 Merge branch 'dev-lzh-1009' into dev 2025-10-10 14:17:00 +08:00
lzh
afdc647139 添加使用类型过滤 2025-10-10 14:15:19 +08:00
jiaji.H
6de56772dd Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-10-10 13:44:10 +08:00
lzh
11eda60e20 Merge branch 'dev-lzh-1009' into dev 2025-10-10 10:33:09 +08:00
10ce40fc64 Merge branch 'feature-costType-daiyb' into dev 2025-10-10 09:11:35 +08:00
lzh
2a030ca4a5 Merge branch 'dev-lzh-1009' into dev 2025-10-09 18:00:23 +08:00
e47c36692a Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-10-09 14:46:05 +08:00
30f653728d 导出 2025-10-09 14:46:04 +08:00
jiaji.H
6aa54dc7af Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-09-29 11:22:00 +08:00
jiaji.H
4a96a61958 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-09-29 10:12:22 +08:00
b8409502ee Merge branch 'feature-tiktok-daiyb' into dev 2025-09-28 19:14:03 +08:00
be45de4046 Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev 2025-09-28 17:55:24 +08:00
cc94f9bbe3 Merge branch 'feature-tiktok-daiyb' into dev 2025-09-28 17:55:22 +08:00
jiaji.H
f2d9a913ab Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-09-28 16:59:33 +08:00
jiaji.H
e969c95b8c Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-09-28 16:41:11 +08:00
jiaji.H
634a993e16 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-09-28 16:32:08 +08:00
JNG
9c9879553d Merge branch 'jng-0924' into dev 2025-09-28 15:08:56 +08:00
JNG
c153b9b8eb Merge branch 'jng-0924' into dev 2025-09-28 14:41:31 +08:00
jiaji.H
46521b10ca Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-09-28 13:54:14 +08:00
jiaji.H
5fcadaf742 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-09-28 10:28:36 +08:00
866049d95d Merge branch 'feature-tiktok-daiyb' into dev 2025-09-26 15:19:38 +08:00
bf973fa948 Merge branch 'feature-tiktok-daiyb' into dev 2025-09-26 12:28:34 +08:00
jiaji.H
9752b6584f Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-09-25 17:07:18 +08:00
jiaji.H
1aa4f73bdc Merge branch 'dev' of http://172.16.100.91:3000/fiee/fonchain-fiee into dev 2025-09-25 16:42:40 +08:00
jiaji.H
2fdcb9b131 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-09-25 16:42:16 +08:00
9d43a3c098 Merge branch 'feature-tiktok-daiyb' into dev 2025-09-25 16:41:36 +08:00
2e58f305fd Merge branch 'dev' of http://172.16.100.91:3000/fiee/fonchain-fiee into dev 2025-09-25 15:56:40 +08:00
a0eb009b07 Merge branch 'feature-tiktok-daiyb' into dev 2025-09-25 15:56:39 +08:00
jiaji.H
c977c9d435 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-09-25 15:53:52 +08:00
jiaji.H
5db101dde2 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-09-25 14:40:22 +08:00
jiaji.H
72c21ba4a0 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-09-25 13:24:27 +08:00
9a6f83c0ee Merge branch 'feature-tiktok-daiyb' into dev 2025-09-25 11:13:05 +08:00
cd1bee8ac7 Merge branch 'feature-tiktok-daiyb' into dev 2025-09-24 17:16:14 +08:00
7ff98e4fe8 Merge branch 'dev' of http://172.16.100.91:3000/fiee/fonchain-fiee into dev 2025-09-24 16:49:54 +08:00
2cf68ad47c Merge branch 'feature-tiktok-daiyb' into dev 2025-09-24 16:49:53 +08:00
jiaji.H
6e29a1ed60 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-09-24 15:58:29 +08:00
JNG
2d524b2a0b Merge branch 'jng' into dev 2025-09-24 15:50:58 +08:00
jiaji.H
4d153bcb37 Merge branch 'feat-hjj-OfficialManage#A161' into dev 2025-09-24 15:28:17 +08:00
18524598d4 Merge branch 'feature-tiktok-daiyb' into dev 2025-09-24 11:58:27 +08:00
7359d9cd57 Merge branch 'feature-tiktok-daiyb' into dev 2025-09-24 11:56:50 +08:00
c573defa3b Merge branch 'dev' of http://172.16.100.91:3000/fiee/fonchain-fiee into dev 2025-09-24 11:47:22 +08:00
f3367ccf22 Merge branch 'feature-tiktok-daiyb' into dev 2025-09-24 11:47:21 +08:00
lzh
5a672d72c4 Merge branch 'dev-lzh-0923' into dev 2025-09-24 11:24:31 +08:00
lzh
36a2da8e7c 修改proto文件 2025-09-24 11:24:00 +08:00
lzh
8b0e0edae8 Merge branch 'dev-lzh-0923' into dev 2025-09-23 14:26:39 +08:00
lzh
c4436f9be0 更新proto文科 2025-09-23 14:25:45 +08:00
79ecb8c90d Merge branch 'feature-tiktok-daiyb' into dev 2025-09-22 16:41:54 +08:00
c8d656bb62 Merge branch 'dev' of http://172.16.100.91:3000/fiee/fonchain-fiee into dev 2025-09-22 16:29:45 +08:00
8b0ac8df10 Merge branch 'feature-tiktok-daiyb' into dev 2025-09-22 16:29:44 +08:00
sxy
e3bc1a992f Merge branch 'feat-sxy-import919' into dev 2025-09-22 15:41:19 +08:00
sxy
971e6f5976 Merge branch 'feat-sxy-import919' into dev 2025-09-22 13:38:00 +08:00
sxy
f9597a2eac Merge branch 'feat-sxy-import919' into dev 2025-09-22 11:48:06 +08:00
sxy
010cf9b126 Merge branch 'feat-sxy-import919' into dev 2025-09-22 11:42:15 +08:00
sxy
3b96a4bef8 Merge branch 'feat-sxy-import919' into dev 2025-09-22 11:40:48 +08:00
sxy
7008642797 Merge branch 'feat-sxy-import919' into dev 2025-09-22 11:29:04 +08:00
46f1a12dee Merge branch 'feature-tiktok-daiyb' into dev 2025-09-22 11:12:26 +08:00
7deff19fca Merge branch 'feature-tiktok-daiyb' into dev 2025-09-22 10:02:54 +08:00
JNG
2784ef0144 Merge branch 'jng' into dev 2025-09-18 09:36:15 +08:00
JNG
6090cf92d6 解决冲突 2025-09-17 16:52:10 +08:00
jiaji.H
b88339488d Merge branch 'feat-hjj-pkManage#A116' into dev 2025-09-17 11:21:20 +08:00
jiaji.H
e527740ba3 Merge branch 'feat-hjj-pkManage#A116' into dev 2025-09-16 13:54:40 +08:00
jiaji.H
14a198ccac Merge branch 'feat-hjj-pkManage#A116' into dev 2025-09-16 13:47:27 +08:00
jiaji.H
94f156981c Merge branch 'feat-hjj-pkManage#A116' into dev 2025-09-15 15:10:21 +08:00
jiaji.H
b3b4e861aa Updata:解决冲突 2025-09-11 15:35:42 +08:00
jiaji.H
17a017616e Merge branch 'feat-hjj-pkManage#A116' into dev 2025-09-11 15:34:23 +08:00
sxy
c6bc85ecaa 修改 2025-09-11 15:06:35 +08:00
gy
9b07b6b973 Merge branch 'gy' of https://gitea-net.fontree.cn/fiee/fonchain-fiee into dev 2025-09-09 18:51:41 +08:00
jiaji.H
93abf25796 feat:解决冲突 2025-09-09 11:05:56 +08:00
cjy
4174a69ad7 Merge branch 'feat-cjy-taskBench' into dev 2025-09-04 18:34:21 +08:00
jiaji.H
0cb5d6e9ef feat:解决冲突 2025-09-04 11:43:50 +08:00
cjy
4a97727775 Merge branch 'feat-cjy-taskBench' into dev 2025-09-03 17:59:00 +08:00
cjy
7af0704d49 Merge branch 'feat-cjy-taskBench' into dev 2025-09-03 16:26:02 +08:00
a5df6f06bf Merge branch 'feature-tiktok-daiyb' into dev 2025-09-03 11:48:58 +08:00
2b98fefa69 Merge branch 'feat-xjj-aschatFunction#A116' into dev 2025-09-01 14:23:03 +08:00
9a9cb3b1f0 Merge branch 'feat-xjj-aschatFunction#A116' into dev 2025-09-01 14:16:32 +08:00
1ff87b20da Merge branch 'feat-xjj-aschatFunction#A116' into dev 2025-09-01 14:02:35 +08:00
6d8af40575 Merge branch 'feat-xjj-aschatFunction#A116' into dev 2025-09-01 13:52:14 +08:00
5f059c1d7c Merge branch 'feat-xjj-aschatFunction#A116' into dev 2025-09-01 11:15:31 +08:00
14956c06de Merge branch 'jng' into dev 2025-08-27 11:29:07 +08:00
a264630b2c Merge branch 'jng' into dev 2025-08-27 10:23:59 +08:00
0488918026 fix: 解决冲突 2025-08-21 14:25:16 +08:00
sxy
4616d066d8 Merge branch 'feat-sxy-import' into dev 2025-08-12 17:02:56 +08:00
69bbc5a090 Merge branch 'jng' into dev 2025-08-12 12:00:21 +08:00
sxy
db0c064828 Merge branch 'feat-sxy-import' into dev 2025-08-12 10:25:15 +08:00
sxy
6773cc62e7 Merge branch 'feat-sxy-import' into dev 2025-08-11 16:58:47 +08:00
sxy
454d40cfd9 Merge branch 'dev' of https://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-08-11 16:42:42 +08:00
sxy
935dc4bc2c Merge branch 'feat-sxy-import' into dev 2025-08-11 16:42:33 +08:00
2151020f1a 解决冲突 2025-08-11 16:29:05 +08:00
sxy
d48b6fae1b Merge branch 'feat-sxy-import' into dev 2025-08-11 16:08:47 +08:00
sxy
0e458dc4e7 Merge branch 'feat-sxy-import' into dev 2025-08-11 15:50:34 +08:00
sxy
a8e2e4dfe2 Merge branch 'feat-sxy-import' into dev 2025-08-11 15:30:09 +08:00
sxy
1a9d6c0ede Merge branch 'feat-sxy-import' into dev 2025-08-11 13:30:25 +08:00
11592d8c90 Merge branch 'feature-multicast-daiyb' into dev 2025-08-07 11:59:37 +08:00
2846cdc1b2 Merge branch 'jng' into dev 2025-07-16 17:54:38 +08:00
sxy
a68ba46e51 Merge branch 'sxy-sec' into dev
"修改symbol"
2025-07-16 10:45:03 +08:00
11bc39be1b Merge branch 'jng' into dev 2025-07-11 09:40:20 +08:00
ac7dd44fd9 Merge branch 'jng' into dev 2025-07-08 16:21:20 +08:00
b33a776f93 解决冲突 2025-07-08 16:14:17 +08:00
866cce5bb6 Merge branch 'feat-zjy-issue-013' into dev 2025-07-08 14:57:25 +08:00
fe6ac1be55 解决冲突 2025-07-08 14:20:38 +08:00
2c2c9499cc Merge branch 'feat-zjy-issue-013' into dev 2025-07-08 13:51:40 +08:00
b2012fbaba Merge branch 'feat-zjy-issue-013' into dev 2025-07-08 13:40:29 +08:00
sxy
bc9d7fe7ba Merge branch 'sxy-sec' into dev
"修改"
2025-07-08 13:03:13 +08:00
8e4a087310 Merge branch 'feat-zjy-issue-013' into dev 2025-07-08 11:59:33 +08:00
e9c46e4a64 Merge remote-tracking branch 'origin/dev' into dev 2025-07-08 11:52:00 +08:00
d55abc66db Merge branch 'feat-zjy-issue-013' into dev 2025-07-08 11:51:18 +08:00
sxy
4177a676b9 Merge branch 'sxy-sec' into dev
"修改sec"
2025-07-08 11:48:49 +08:00
2bc6a4f77c Merge branch 'feat-zjy-issue-013' into dev 2025-07-08 11:18:04 +08:00
d8c083f5b6 Merge branch 'feat-zjy-issue-013' into dev 2025-07-08 10:46:17 +08:00
0f1559f1cf Merge branch 'feat-zjy-issue-013' into dev 2025-07-08 10:23:58 +08:00
d4bc9bae54 Merge branch 'feat-zjy-issue-013' into dev 2025-07-08 09:46:35 +08:00
82e5f92be2 解决冲突 2025-07-07 19:37:04 +08:00
9f03ac444e 合并数据 2025-07-07 15:34:00 +08:00
lzh
dd25bb3f4e Merge branch 'dev-lzh' into dev 2025-07-07 10:48:37 +08:00
lzh
cd9cd0dbd1 更新proto 2025-07-07 10:48:06 +08:00
eda4d7dd91 Merge branch 'jng' into dev 2025-07-03 16:53:33 +08:00
b761411203 Merge branch 'jng' into dev 2025-07-03 16:06:30 +08:00
07309ab587 Merge branch 'jng' into dev 2025-07-03 16:02:28 +08:00
852d2fbed4 Merge branch 'jng' into dev 2025-07-03 15:51:15 +08:00
b458105c4c Merge branch 'jng' into dev 2025-07-02 15:33:47 +08:00
db193ce55a Merge branch 'jng' into dev 2025-07-02 14:02:33 +08:00
lzh
a16f0b6d54 Merge branch 'dev-lzh' into dev 2025-06-26 16:12:58 +08:00
87db2d6ce3 Merge branch 'feature-multicast-daiyb' into dev 2025-06-26 09:21:32 +08:00
lzh
5ae25cabc6 添加日志打印 2025-06-26 09:08:08 +08:00
lzh
e4d6b5de90 Merge branch 'dev-lzh' into dev 2025-06-25 16:52:19 +08:00
afcc29ba80 Merge branch 'jng' into dev 2025-06-25 16:31:32 +08:00
df3c90476b Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-25 15:51:30 +08:00
4cc70d4b2f Merge branch 'chat' into dev 2025-06-25 15:50:03 +08:00
ada34794e3 解决冲突 2025-06-25 15:34:14 +08:00
lzh
ea89bdbe02 Merge branch 'dev-lzh' into dev 2025-06-25 15:24:33 +08:00
0a9d8f628d Merge branch 'feature-multicast-daiyb' into dev 2025-06-25 11:09:30 +08:00
f26492218b Merge branch 'feature-multicast-daiyb' into dev 2025-06-24 18:28:17 +08:00
8f987dff52 Merge branch 'dev' of http://172.16.100.91:3000/fiee/fonchain-fiee into dev 2025-06-24 16:38:50 +08:00
0545372341 Merge branch 'feature-multicast-daiyb' into dev 2025-06-24 16:38:41 +08:00
sxy
ac18e084f3 Merge branch 'sxy' into dev 2025-06-24 16:05:03 +08:00
b2133c6d90 解决冲突 2025-06-24 15:54:18 +08:00
749ce934e8 Merge branch 'feature-multicast-daiyb' into dev 2025-06-24 15:44:16 +08:00
lzh
cd726f2987 Merge branch 'dev-lzh' into dev 2025-06-24 15:17:41 +08:00
00a9acdb9b Merge branch 'jng' into dev 2025-06-24 14:39:06 +08:00
sxy
b46400d15c Merge branch 'sxy' into dev 2025-06-24 14:26:53 +08:00
2b5dd8d977 Merge branch 'feature-multicast-daiyb' into dev 2025-06-24 13:56:56 +08:00
e48016fc4c 修改 2025-06-24 13:44:46 +08:00
953eb4b419 Merge branch 'feature-multicast-daiyb' into dev 2025-06-24 13:20:24 +08:00
b4c90f4d18 Merge branch 'jng' into dev 2025-06-24 10:59:42 +08:00
lzh
f8b5df1f42 Merge branch 'dev-lzh' into dev 2025-06-24 09:42:24 +08:00
lzh
1d3f2cd0f7 删除调试信息 2025-06-24 09:41:24 +08:00
lzh
cdf2af27ba 调试 2025-06-23 16:45:59 +08:00
lzh
c60e04454a 调试 2025-06-23 16:40:17 +08:00
lzh
9c97c426d6 删除调试 2025-06-23 16:31:10 +08:00
sxy
4f0fcc77a1 Merge branch 'sxy' into dev 2025-06-23 16:29:00 +08:00
lzh
5291bb489a 调试 2025-06-23 16:27:31 +08:00
lzh
8082f229f4 Merge branch 'dev-lzh' into dev 2025-06-23 16:17:19 +08:00
19baa34ca5 Merge branch 'feat-zjy-issue-008' into dev 2025-06-23 15:54:28 +08:00
d5546933f9 修改 2025-06-23 15:40:00 +08:00
80759ec111 解决冲突 2025-06-23 15:32:57 +08:00
5c92a1fef7 Merge branch 'jng' into dev 2025-06-23 15:15:46 +08:00
lzh
08a12459e6 更新proto 2025-06-23 14:14:18 +08:00
c34cc285bb Merge branch 'feature-multicast-daiyb' into dev 2025-06-20 16:42:04 +08:00
lzh
c0ff047f66 proto 更新 2025-06-20 16:28:21 +08:00
ae33bf910a 修改 2025-06-20 15:52:44 +08:00
sxy
df829bb4d9 Merge branch 'sxy' into dev 2025-06-20 15:30:38 +08:00
sxy
96b04aa609 Merge branch 'sxy' into dev 2025-06-20 14:58:06 +08:00
sxy
74f71fb0b6 Merge branch 'sxy' into dev 2025-06-20 13:12:01 +08:00
9cd32ec899 Merge remote-tracking branch 'origin/dev' into dev 2025-06-20 11:49:11 +08:00
18161e8528 Merge branch 'feat-zjy-issue-008' into dev 2025-06-20 11:48:42 +08:00
sxy
fa898aee00 Merge branch 'sxy' into dev 2025-06-20 11:42:21 +08:00
c56465dd18 Merge branch 'feat-zjy-issue-008' into dev 2025-06-20 11:27:21 +08:00
sxy
2b6c2123c9 Merge branch 'sxy' into dev 2025-06-20 11:15:16 +08:00
c478f4015a Merge remote-tracking branch 'origin/dev' into dev 2025-06-20 11:13:21 +08:00
1334fcaa4c Merge branch 'feature-multicast-daiyb' into dev 2025-06-20 11:12:10 +08:00
f1d81778d0 Merge branch 'feat-zjy-issue-008' into dev 2025-06-20 11:12:00 +08:00
9bb1cbc840 Merge branch 'feat-zjy-issue-008' into dev 2025-06-20 10:24:18 +08:00
lzh
139901467f Merge branch 'dev-lzh' into dev 2025-06-20 09:44:39 +08:00
851fdc5098 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-19 16:43:08 +08:00
8c2cff4973 Update handler.go 2025-06-19 16:42:42 +08:00
sxy
af9c443686 Merge branch 'sxy' into dev 2025-06-19 16:24:11 +08:00
0885aa1ed0 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-19 16:19:27 +08:00
5d8b72b499 fix: 解决冲突 2025-06-19 16:17:32 +08:00
9f7f818e79 修改 2025-06-19 16:05:12 +08:00
60498f8af9 解决冲突 2025-06-19 15:34:17 +08:00
lzh
cf95f2b9fe Merge branch 'dev-lzh' into dev 2025-06-19 15:13:41 +08:00
lzh
f3882fd709 更新proto 2025-06-19 15:11:05 +08:00
lzh
de98e69033 Merge branch 'dev-lzh' into dev 2025-06-19 15:06:08 +08:00
e03bd54b11 fix: 解决冲突 2025-06-19 14:41:13 +08:00
4c842559a7 Update chat.go 2025-06-19 14:14:11 +08:00
ef57eb0e89 Update chat.go 2025-06-19 14:09:37 +08:00
e994c11e29 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-19 14:05:00 +08:00
b1a7e1f2de Update robot.go 2025-06-19 14:04:41 +08:00
d1191753f3 Merge branch 'feat-zjy-issue-008' into dev 2025-06-19 13:57:52 +08:00
1723ba99dd Update robot.go 2025-06-19 13:56:53 +08:00
e66f33b1a9 Update ruler_keywords.go 2025-06-19 13:50:44 +08:00
a6c7544b91 fix: 增加日志 2025-06-19 13:43:07 +08:00
9bb4bec9f8 fix: 覆盖聊天相关代码 2025-06-19 13:23:56 +08:00
0e99dc7a0b Update chatRoom.go 2025-06-19 12:41:11 +08:00
ebaeac28fb Merge branch 'chat' into dev 2025-06-19 12:35:11 +08:00
fe755bbe13 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-19 11:55:04 +08:00
sxy
5c8a7ac056 Merge branch 'sxy' into dev 2025-06-19 11:53:58 +08:00
bc795d3f20 Update handler.go 2025-06-19 11:53:53 +08:00
55b6ae810d debug1 2025-06-19 11:45:55 +08:00
e0b15430be Update ruler_keywords.go 2025-06-19 11:41:31 +08:00
c4a50362f5 Update chat.go 2025-06-19 11:32:57 +08:00
2455067913 Merge branch 'chat' into dev 2025-06-19 11:31:46 +08:00
24b5560c9c Merge branch 'chat' into dev 2025-06-19 11:14:02 +08:00
d2eefbb646 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-19 11:12:52 +08:00
4afa15ee3f Merge branch 'chat' into dev 2025-06-19 11:12:27 +08:00
a093585416 Merge branch 'dev' of http://172.16.100.91:3000/fiee/fonchain-fiee into dev 2025-06-19 11:05:29 +08:00
9e1080659a Merge branch 'feature-multicast-daiyb' into dev 2025-06-19 11:05:21 +08:00
c0148238f0 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-19 11:04:32 +08:00
c33833b008 fix: 解决冲突 2025-06-19 11:04:13 +08:00
bacedd206f Merge branch 'jng' into dev 2025-06-19 10:34:02 +08:00
8ad6668748 Merge remote-tracking branch 'origin/dev' into dev 2025-06-19 09:53:44 +08:00
ca70a92538 fix: debug4 2025-06-19 09:52:34 +08:00
789c1dc81c Merge branch 'feat-zjy-issue-008' into dev 2025-06-19 09:52:32 +08:00
49c9232323 debug3 2025-06-19 09:50:41 +08:00
98bd564928 fix: debug2 2025-06-19 09:23:08 +08:00
d8a43a6720 fix: debug 2025-06-19 09:15:10 +08:00
e28cdceb50 Merge branch 'chat' into dev 2025-06-18 20:07:06 +08:00
76a0ea3c01 Merge branch 'chat' into dev 2025-06-18 19:57:58 +08:00
8cd7d57488 Merge branch 'chat' into dev 2025-06-18 19:53:20 +08:00
bfe244450b Merge branch 'chat' into dev 2025-06-18 19:50:02 +08:00
b858a599d0 Merge branch 'chat' into dev 2025-06-18 19:47:58 +08:00
345a93b149 Merge branch 'chat' into dev 2025-06-18 17:52:39 +08:00
b3900e0735 Merge branch 'chat' into dev 2025-06-18 16:58:07 +08:00
3983538606 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-18 16:43:52 +08:00
4664da0d1c Merge branch 'chat' into dev 2025-06-18 16:43:34 +08:00
492fdfeee2 Merge branch 'feat-zjy-issue-008' into dev 2025-06-18 16:28:30 +08:00
e47651247f Merge branch 'chat' into dev 2025-06-18 16:19:53 +08:00
79ec11f0de Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-18 16:12:30 +08:00
97753f0578 fix: 解决冲突 2025-06-18 16:12:10 +08:00
sxy
2b013f5269 Merge branch 'sxy' into dev 2025-06-18 15:51:52 +08:00
244901bf6a Merge branch 'chat' into dev 2025-06-18 15:33:20 +08:00
9b13f753e6 Merge branch 'chat' into dev 2025-06-18 15:27:38 +08:00
50851aa303 Merge branch 'chat' into dev 2025-06-18 15:17:35 +08:00
b89b86be5d Merge branch 'chat' into dev 2025-06-18 14:22:47 +08:00
f1db70cd83 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-18 12:04:56 +08:00
59ba69477b Merge branch 'chat' into dev 2025-06-18 12:04:36 +08:00
sxy
577e4d399c Merge branch 'sxy' into dev 2025-06-18 11:42:22 +08:00
sxy
e4554dd0ad Merge branch 'sxy-sec' into dev 2025-06-17 18:30:56 +08:00
4e9091bd4b Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-17 16:14:55 +08:00
b4960fb7c2 Merge branch 'chat' into dev 2025-06-17 16:14:35 +08:00
b2e9b0c2d1 Merge branch 'jng' into dev 2025-06-17 15:40:00 +08:00
sxy
ec7be8fde0 Merge branch 'sxy-sec' into dev 2025-06-17 14:46:24 +08:00
lzh
cb707c96e1 Merge branch 'dev-lzh' into dev 2025-06-17 14:28:29 +08:00
90504c8c0c Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-17 14:26:41 +08:00
13e19d8650 Merge branch 'chat' into dev 2025-06-17 14:26:26 +08:00
sxy
64f151d87f Merge branch 'sxy-sec' into dev 2025-06-17 14:21:33 +08:00
sxy
d4eebacbda Merge branch 'sxy-sec' into dev 2025-06-17 14:07:50 +08:00
8311d0cc99 Update logging.go 2025-06-17 11:31:53 +08:00
57b2e587e7 Merge branch 'chat' into dev 2025-06-17 11:28:09 +08:00
fad92b5991 Merge branch 'chat' into dev 2025-06-17 11:22:05 +08:00
086fe399e4 fix: 解决冲突 2025-06-17 10:55:54 +08:00
dc8a872e5e Update conf.ini 2025-06-17 10:28:07 +08:00
79a61043e9 Update conf.ini 2025-06-17 10:20:19 +08:00
17b8f61968 Merge branch 'chat' into dev 2025-06-17 10:14:40 +08:00
sxy
b59f4e9395 Merge branch 'sxy-sec' into dev 2025-06-17 10:07:53 +08:00
cc295e64b5 Merge branch 'chat' into dev 2025-06-17 10:06:38 +08:00
268bb183f4 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-17 09:32:23 +08:00
96ed290f62 Merge branch 'chat' into dev 2025-06-17 09:31:58 +08:00
sxy
96db32a381 Merge branch 'sxy' into dev 2025-06-17 09:27:42 +08:00
6d975266a6 Merge branch 'chat' into dev 2025-06-17 09:13:40 +08:00
dded072bad Update chatAutoReplyRulerHandler.go 2025-06-16 19:32:08 +08:00
55a2197ad4 Merge branch 'chat' into dev 2025-06-16 18:29:21 +08:00
47da1435ae Merge branch 'chat' into dev 2025-06-16 17:58:27 +08:00
7c75f0722a Merge branch 'chat' into dev 2025-06-16 16:18:17 +08:00
aecacb623b 解决冲突 2025-06-16 16:11:55 +08:00
0af5d7b5dc Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-16 15:52:58 +08:00
a38cc36e51 Merge branch 'chat' into dev 2025-06-16 15:52:06 +08:00
lzh
2dcdd8fb7f Merge branch 'dev-lzh' into dev 2025-06-16 15:33:04 +08:00
de557a8ac0 Merge branch 'chat' into dev 2025-06-16 15:22:57 +08:00
5a6c8591d2 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-16 15:04:57 +08:00
7fbf4864f1 Merge branch 'chat' into dev 2025-06-16 15:04:32 +08:00
sxy
6d3ec1ac10 Merge branch 'sxy-sec' into dev 2025-06-16 14:32:29 +08:00
sxy
4e44c0ca06 Merge branch 'sxy-sec' into dev 2025-06-16 14:26:18 +08:00
lzh
cfaaf818c8 Merge branch 'dev-lzh' into dev 2025-06-16 14:11:17 +08:00
48a85b000c Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-16 14:04:00 +08:00
4c758f2045 fix: 解决冲突 2025-06-16 14:03:38 +08:00
cebf285f8e Merge branch 'feat-zjy-issue-008' into dev 2025-06-16 13:57:49 +08:00
lzh
16661dfe33 Merge branch 'dev-lzh' into dev 2025-06-16 13:55:55 +08:00
lzh
24c3d1c894 Merge branch 'dev-lzh' into dev 2025-06-16 13:47:32 +08:00
lzh
653fe27066 冲突解决 2025-06-16 13:42:46 +08:00
lzh
bef76dc3f0 添加套餐金额类型 2025-06-16 13:35:46 +08:00
sxy
d0a93eb229 Merge branch 'sxy' into dev 2025-06-16 13:22:53 +08:00
lzh
2d793324f1 解决突出 2025-06-16 13:15:11 +08:00
lzh
909a44682b Merge branch 'dev-lzh' into dev 2025-06-16 13:09:37 +08:00
98b0893b0c Merge branch 'feat-zjy-issue-008' into dev 2025-06-16 13:06:01 +08:00
467b126590 Merge branch 'dev' of http://172.16.100.91:3000/fiee/fonchain-fiee into dev 2025-06-16 11:53:08 +08:00
505216a1b3 Merge branch 'feature-multicast-daiyb' into dev 2025-06-16 11:52:48 +08:00
sxy
8247a52343 Merge branch 'sxy-sec' into dev 2025-06-16 11:48:25 +08:00
7dcf40675f Merge branch 'feature-multicast-daiyb' into dev 2025-06-16 11:38:06 +08:00
a5d6e45cd1 Merge branch 'jng' into dev 2025-06-16 11:19:50 +08:00
40c0a9d65f Merge branch 'feature-multicast-daiyb' into dev 2025-06-16 11:06:32 +08:00
lzh
033d9ba023 Merge branch 'dev-lzh' into dev 2025-06-16 10:20:24 +08:00
fe8f3498cd fix: 调整代码,创建支付的时候加入创建对账单。支付成功通知时更新对账单 2025-06-16 10:04:27 +08:00
35712fdbe2 Merge branch 'feat-zjy-issue-008' into dev
# Conflicts:
#	api/bundle/bundle.pb.go
#	api/bundle/bundle_triple.pb.go
2025-06-16 10:03:06 +08:00
248d707026 Merge branch 'chat' into dev 2025-06-16 09:58:57 +08:00
eea71f6e5a Merge branch 'chat' into dev 2025-06-16 09:55:25 +08:00
d543628d86 Merge branch 'chat' into dev 2025-06-16 09:52:18 +08:00
d93c911334 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-16 09:44:33 +08:00
5954f86213 Merge branch 'chat' into dev 2025-06-16 09:44:06 +08:00
lzh
7747672842 Merge branch 'dev-lzh' into dev 2025-06-16 09:35:03 +08:00
sxy
1648689c02 Merge branch 'sxy-sec' into dev 2025-06-16 09:31:40 +08:00
43d3e83593 Merge branch 'chat' into dev 2025-06-16 00:17:17 +08:00
808f7cce3e Update wsMessageHandle.go 2025-06-16 00:16:48 +08:00
f9807d039a Update wsMessageHandle.go 2025-06-16 00:09:44 +08:00
33ce4c7123 Merge branch 'chat' into dev 2025-06-16 00:04:40 +08:00
6bbe1319b8 解决冲突 2025-06-15 23:57:57 +08:00
f3eba25a43 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-15 23:23:57 +08:00
b3c8008b29 解决冲突 2025-06-15 23:23:11 +08:00
49137828da Merge branch 'feat-zjy-issue-008' into dev 2025-06-15 20:57:25 +08:00
1988c49b82 Merge branch 'feature-multicast-daiyb' into dev 2025-06-15 20:46:23 +08:00
3b6e0e6310 Merge branch 'chat' into dev 2025-06-15 20:22:08 +08:00
e0644769f5 Merge branch 'chat' into dev 2025-06-15 20:16:45 +08:00
5fd70717d4 Update common.go 2025-06-15 20:11:53 +08:00
5131c182a5 Merge branch 'chat' into dev 2025-06-15 20:05:42 +08:00
c094790cd3 Update wsMessageHandle.go 2025-06-15 19:59:53 +08:00
01bd9736e0 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-15 19:56:48 +08:00
98c6a72f96 fix: 完成用户进入聊天室直接回复 2025-06-15 19:56:32 +08:00
aa6dca6f1f fix: 处理冲突 2025-06-15 19:22:55 +08:00
ce95cface5 Merge branch 'feat-zjy-issue-008' into dev
# Conflicts:
#	api/bundle/bundle.pb.go
#	pkg/router/bundle.go
#	pkg/service/bundle/bundleProfile.go
2025-06-15 19:22:14 +08:00
13b51cadf8 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-15 18:35:25 +08:00
63620fdda4 fix: 修复domain配置错误的问题 2025-06-15 18:35:08 +08:00
e23f39c6ac fix: detail接口增加addBundle的字段 2025-06-15 18:32:36 +08:00
2276144fc4 Merge branch 'feat-zjy-issue-008' into dev
# Conflicts:
#	api/bundle/bundle.pb.go
2025-06-15 18:31:52 +08:00
c347c7d81d fix: debug 2025-06-15 18:28:21 +08:00
8817680689 Update handler.go 2025-06-15 18:20:48 +08:00
e6920fe595 Update handler.go 2025-06-15 17:18:44 +08:00
21b0c2cc49 Merge branch 'chat' into dev 2025-06-15 17:07:34 +08:00
1979ac7530 Merge branch 'chat' into dev 2025-06-15 16:23:58 +08:00
a295762f37 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-15 16:03:08 +08:00
2151a8e42b Merge branch 'chat' into dev 2025-06-15 16:02:45 +08:00
f60f7c4a6a Merge branch 'jng' into dev 2025-06-15 15:59:46 +08:00
lzh
7e9f25fffe Merge branch 'dev-lzh' into dev 2025-06-15 15:54:04 +08:00
729c9e661c 解决冲突 2025-06-15 15:32:25 +08:00
lzh
aa08c15e2a Merge branch 'dev-lzh' into dev 2025-06-15 15:12:49 +08:00
8ad73a8874 fix: 调整配置文件,只能dev改,master上没有 2025-06-15 15:03:53 +08:00
lzh
c84fb621a9 作品状态判断 2025-06-15 15:00:14 +08:00
lzh
325d14d913 Merge branch 'dev-lzh' into dev 2025-06-15 14:58:36 +08:00
lzh
45a3751914 删除调试日志 2025-06-15 14:56:01 +08:00
1dd8ccf3b7 Merge remote-tracking branch 'origin/dev' into dev 2025-06-15 14:55:25 +08:00
2734e4572f fix: 处理proto冲突 2025-06-15 14:55:09 +08:00
15ddf58f55 Merge branch 'feat-zjy-issue-008' into dev
# Conflicts:
#	api/bundle/bundle.pb.go
#	api/bundle/bundle_triple.pb.go
#	docs/dev/dubbogo.yaml
#	pkg/service/init.go
2025-06-15 14:53:47 +08:00
lzh
4b9e6eb7bd 调试日志打印 2025-06-15 14:51:51 +08:00
lzh
549a557bf2 Merge branch 'dev-lzh' into dev 2025-06-15 14:28:40 +08:00
lzh
966790326e Merge branch 'dev-lzh' into dev 2025-06-15 13:58:15 +08:00
ef18264bf8 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-15 13:33:15 +08:00
426b65537f fix: update 2025-06-15 13:33:00 +08:00
lzh
0d46dd75d8 冲突解决 2025-06-15 12:56:05 +08:00
lzh
3fbc1e6ef4 冲突解决 2025-06-15 12:54:02 +08:00
3a00260038 Update common.go 2025-06-15 12:45:28 +08:00
lzh
26c0056b12 Merge branch 'dev-lzh' into dev 2025-06-15 12:22:38 +08:00
e8645e6515 Merge branch 'feature-multicast-daiyb' into dev 2025-06-15 12:13:04 +08:00
a413806363 Update common.go 2025-06-15 11:45:41 +08:00
f1d411c6bc Update wsMessageHandle.go 2025-06-15 11:37:15 +08:00
71ef73bec6 fix: 调试token 2025-06-15 11:24:49 +08:00
3f43441c4f Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-15 10:21:29 +08:00
c665b2190c Merge branch 'chat' into dev 2025-06-15 10:21:11 +08:00
abc498f656 解决冲突 2025-06-15 10:09:39 +08:00
5cfbfb687d Merge branch 'chat' into dev 2025-06-14 19:58:18 +08:00
0839151de0 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-14 19:54:15 +08:00
5f1b85bbb4 Merge branch 'chat' into dev 2025-06-14 19:53:58 +08:00
64f73ca075 Merge branch 'dev' of http://172.16.100.91:3000/fiee/fonchain-fiee into dev 2025-06-14 19:48:08 +08:00
ec631334d6 APP接口 2025-06-14 19:47:36 +08:00
87ebd0be56 Update common.go 2025-06-14 19:38:33 +08:00
342b49ab18 Merge branch 'chat' into dev 2025-06-14 19:31:00 +08:00
0b1c014533 Merge branch 'chat' into dev 2025-06-14 19:15:20 +08:00
2177d33587 Merge branch 'chat' into dev 2025-06-14 18:58:16 +08:00
f199ff7b3d Update common.go 2025-06-14 18:40:59 +08:00
eb5e30be88 Update common.go 2025-06-14 18:26:48 +08:00
e879989ef6 fix: update 2025-06-14 18:12:13 +08:00
c1ba3f348a Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-14 17:41:29 +08:00
8bacafbdfe Merge branch 'chat' into dev 2025-06-14 17:40:41 +08:00
sxy
0f59144fa8 Merge branch 'sxy' into dev 2025-06-14 17:40:19 +08:00
e100345bb8 Merge branch 'chat' into dev 2025-06-14 17:28:00 +08:00
f4ae80f326 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-14 17:20:11 +08:00
25d9db05ef Update accountFiee.proto 2025-06-14 17:18:37 +08:00
bc8d915944 Merge branch 'chat' into dev 2025-06-14 17:18:25 +08:00
sxy
b06f24d06e Merge branch 'sxy' into dev 2025-06-14 17:10:40 +08:00
sxy
9a0a28b633 Merge branch 'sxy' into dev 2025-06-14 17:09:33 +08:00
sxy
dcf041ad9d Merge branch 'sxy' into dev 2025-06-14 17:07:09 +08:00
sxy
623584225d Revert "Merge branch 'sxy' into dev"
This reverts commit 9301c78060, reversing
changes made to fe3f693925.
2025-06-14 16:43:59 +08:00
sxy
9301c78060 Merge branch 'sxy' into dev 2025-06-14 16:41:35 +08:00
fe3f693925 Merge branch 'chat' into dev 2025-06-14 16:32:48 +08:00
cbded7c26a Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-14 16:07:13 +08:00
lzh
8a441851b3 1 2025-06-14 16:04:48 +08:00
d564fd2c59 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-14 15:58:13 +08:00
1a207a8d53 Merge branch 'chat' into dev 2025-06-14 15:57:09 +08:00
lzh
380c7b95ce 1 2025-06-14 15:53:01 +08:00
lzh
9f27882072 Merge branch 'dev-lzh' into dev 2025-06-14 15:43:04 +08:00
b523c46cde 解决冲突 2025-06-14 15:25:09 +08:00
2b212d2903 Merge branch 'chat' into dev 2025-06-14 15:12:15 +08:00
13fc02b8ba Merge branch 'chat' into dev 2025-06-14 15:05:00 +08:00
8f137abf30 Merge branch 'chat' into dev 2025-06-14 14:59:25 +08:00
5706c238a4 Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-14 14:49:31 +08:00
75231bab91 fix: 解决冲突 2025-06-14 14:48:34 +08:00
cef7e50112 Merge branch 'dev' of http://172.16.100.91:3000/fiee/fonchain-fiee into dev 2025-06-14 14:45:11 +08:00
8de086333c Merge branch 'feature-multicast-daiyb' into dev 2025-06-14 14:45:04 +08:00
lzh
dbe63508f7 Merge branch 'dev-lzh' into dev 2025-06-14 14:27:18 +08:00
0084f27e1b Merge branch 'feature-multicast-daiyb' into dev 2025-06-14 14:11:43 +08:00
lzh
d1468434b6 Merge branch 'dev-lzh' into dev 2025-06-14 13:54:16 +08:00
lzh
4e89a5830a 添加时间扩展单位 2025-06-14 11:31:30 +08:00
58b0ca77e1 Merge branch 'jng' into dev 2025-06-14 11:29:27 +08:00
lzh
4f9f8e66db 解决冲突 2025-06-14 10:33:53 +08:00
8196e14159 Merge branch 'jng' into dev 2025-06-14 10:23:16 +08:00
lzh
d4e00229fa Merge branch 'dev-lzh' into dev 2025-06-14 09:50:35 +08:00
36dc2dd194 解决冲突 2025-06-13 22:39:14 +08:00
2b30a246c4 修改 2025-06-13 19:57:31 +08:00
ec0ad25aec 解决冲突 2025-06-13 19:29:19 +08:00
829928da9b 添加审批 2025-06-13 19:02:00 +08:00
sxy
fb4afd8441 Merge branch 'sxy' into dev 2025-06-13 16:49:29 +08:00
2e46cfaacd Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-13 15:29:37 +08:00
8570541f76 Merge branch 'chat' into dev 2025-06-13 15:29:12 +08:00
sxy
4cb62a474e Merge branch 'sxy-sec' into dev 2025-06-13 15:00:53 +08:00
sxy
1b1db8e0aa Merge branch 'sxy-sec' into dev 2025-06-13 14:44:43 +08:00
lzh
e0415bb4a2 解决冲突 2025-06-13 14:37:23 +08:00
lzh
d8ef69090d Merge branch 'dev-lzh' into dev 2025-06-13 14:35:27 +08:00
ebe28dc56c 修改 2025-06-13 14:32:41 +08:00
lzh
fd6d763431 添加扩展、余量接口 2025-06-13 14:23:06 +08:00
c22977816b 解决冲突 2025-06-13 14:16:35 +08:00
126360113d Merge branch 'dev' of http://gitea-inner.fontree.cn/fiee/fonchain-fiee into dev 2025-06-13 11:05:18 +08:00
3e80d15355 Merge branch 'chat' into dev 2025-06-13 11:04:47 +08:00
sxy
7ea561bb01 Merge branch 'sxy-sec' into dev 2025-06-13 10:54:13 +08:00
sxy
efdebf8949 Merge branch 'sxy-sec' into dev 2025-06-13 10:49:32 +08:00
0c7db6d312 Merge branch 'chat' into dev 2025-06-13 10:44:36 +08:00
71e504afc5 Merge branch 'chat' into dev 2025-06-13 10:30:23 +08:00
lzh
896145b718 Merge branch 'dev-lzh' into dev 2025-06-12 19:47:06 +08:00
lzh
f381ffa185 Merge branch 'dev-lzh' into dev 2025-06-12 19:42:19 +08:00
637cad4298 fix: 解决go.mod 冲突 2025-06-12 19:38:03 +08:00
lzh
f1100ddfc9 Merge branch 'dev-lzh' into dev 2025-06-12 19:23:49 +08:00
lzh
952d803bf8 Merge branch 'dev-lzh' into dev 2025-06-12 19:01:42 +08:00
9718cd7c67 临时注释 2025-06-12 18:50:28 +08:00
3fb1c12bef 解决冲突 2025-06-12 18:16:31 +08:00
a1679a8a24 解决冲突 2025-06-12 16:40:38 +08:00
lzh
7edf18a252 Merge branch 'dev-lzh' into dev 2025-06-12 14:36:37 +08:00
lzh
08434eca48 Merge branch 'dev-lzh' into dev 2025-06-12 13:46:49 +08:00
sxy
860da58df4 Merge branch 'sxy' into dev 2025-06-12 11:59:37 +08:00
b65f78dc12 Merge branch 'feature-multicast-daiyb' into dev 2025-06-12 11:38:43 +08:00
sxy
7241ff16c9 Merge branch 'sxy' into dev 2025-06-12 10:20:42 +08:00
lzh
4311ce978a Merge branch 'dev-lzh' into dev 2025-06-11 18:16:22 +08:00
lzh
da7b5edb6e Merge branch 'dev-lzh' into dev 2025-06-11 17:51:52 +08:00
2efd3f2b21 Merge branch 'dev' of http://172.16.100.91:3000/fiee/fonchain-fiee into dev 2025-06-11 17:03:13 +08:00
df8f611f5a Merge branch 'feature-multicast-daiyb' into dev 2025-06-11 17:02:42 +08:00
lzh
30a2a9d57c Merge branch 'dev-lzh' into dev 2025-06-11 16:56:33 +08:00
lzh
b8355c0e27 删除调试信息 2025-06-11 16:55:46 +08:00
080b475826 Merge branch 'dev' of http://172.16.100.91:3000/fiee/fonchain-fiee into dev 2025-06-11 16:52:29 +08:00
e1f4d82f31 Merge branch 'feature-multicast-daiyb' into dev 2025-06-11 16:52:22 +08:00
lzh
949be8efaa 添加调试信息 2025-06-11 16:48:38 +08:00
lzh
5aa145bf1a 添加调试信息 2025-06-11 16:44:37 +08:00
lzh
329098d07b 添加调试信息 2025-06-11 16:41:13 +08:00
sxy
56f2a8d40b Merge branch 'sxy' into dev 2025-06-11 16:24:01 +08:00
7dbef64c91 Merge branch 'dev' of http://172.16.100.91:3000/fiee/fonchain-fiee into dev 2025-06-11 16:11:38 +08:00
53127451c9 Merge branch 'feature-multicast-daiyb' into dev 2025-06-11 16:11:31 +08:00
lzh
3e62057d29 Merge branch 'dev-lzh' into dev 2025-06-11 15:57:28 +08:00
sxy
0ff31f98d3 Merge branch 'sxy' into dev 2025-06-11 15:56:08 +08:00
lzh
382f7fe980 Merge branch 'dev-lzh' into dev 2025-06-11 15:40:22 +08:00
lzh
feefda874a 删除无用依赖 2025-06-11 14:54:08 +08:00
a725fb7d98 解决冲突 2025-06-11 14:34:40 +08:00
lzh
9289953613 Merge branch 'dev-lzh' into dev 2025-06-11 14:14:04 +08:00
sxy
1b4e4e72a9 Merge branch 'sxy' into dev 2025-06-11 11:01:32 +08:00
sxy
7edf15d6a1 "修改输出格式" 2025-06-11 11:00:02 +08:00
7eb9c9cfe7 Merge branch 'feature-multicast-daiyb' into dev 2025-06-11 10:31:47 +08:00
1e9fdf8bb8 1 2025-06-11 10:03:43 +08:00
5d19fb261d 修改字段 2025-06-11 09:55:07 +08:00
69212549c5 合并 2025-06-11 09:22:49 +08:00
fb60eba3e9 合并 2025-06-11 09:19:55 +08:00
1fa862b85d 解决冲突 2025-06-10 16:17:09 +08:00
sxy
8629decdc0 Merge branch 'sxy' into dev 2025-06-10 15:03:04 +08:00
sxy
b9a6923511 修改冲突 2025-06-10 14:52:42 +08:00
sxy
289c5937c5 "套餐修改" 2025-06-10 14:05:57 +08:00
66 changed files with 8829 additions and 17868 deletions

2
.gitignore vendored
View File

@ -31,5 +31,3 @@
/cmd/logs/*.log
/cmd/runtime/log/*.log
/build/*
CLAUDE.md
.claude/settings.local.json

File diff suppressed because it is too large Load Diff

View File

@ -368,6 +368,12 @@ func (this *BatchGetValueAddServiceLangResponse) Validate() error {
}
return nil
}
func (this *UpdateBundleBalanceReq) Validate() error {
return nil
}
func (this *UpdateBundleBalanceResp) Validate() error {
return nil
}
func (this *BundleExtendRequest) Validate() error {
return nil
}
@ -487,12 +493,6 @@ func (this *GetBundleBalanceByUserIdReq) Validate() error {
func (this *GetBundleBalanceByUserIdResp) Validate() error {
return nil
}
func (this *GetBundleBalanceByOrderUUIDReq) Validate() error {
return nil
}
func (this *GetBundleBalanceByOrderUUIDResp) Validate() error {
return nil
}
func (this *OnlyAddValueListByOrderNoRequest) Validate() error {
return nil
}
@ -749,22 +749,6 @@ func (this *SetPendingTaskLayoutReq) Validate() error {
func (this *SetPendingTaskLayoutResp) Validate() error {
return nil
}
func (this *TaskWorkLogQueryRequest) Validate() error {
return nil
}
func (this *TaskWorkLogInfo) Validate() error {
return nil
}
func (this *TaskWorkLogQueryResponse) Validate() error {
for _, item := range this.Records {
if item != nil {
if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(item); err != nil {
return github_com_mwitkow_go_proto_validators.FieldError("Records", err)
}
}
}
return nil
}
func (this *CreateTaskWorkLogRequest) Validate() error {
return nil
}
@ -1065,9 +1049,6 @@ func (this *ExportWorkCastInfoResp) Validate() error {
}
return nil
}
func (this *OrderInfoByOrderUuidRequest) Validate() error {
return nil
}
func (this *GetInvoiceInfoByOrderNoReq) Validate() error {
return nil
}
@ -1090,67 +1071,6 @@ func (this *GetLastInvoiceNoReq) Validate() error {
func (this *GetLastInvoiceNoResp) Validate() error {
return nil
}
func (this *UpdataInvoiceInfoReq) Validate() error {
return nil
}
func (this *UpdataInvoiceInfoResp) Validate() error {
return nil
}
func (this *SendQuestionnaireSurveyRequest) Validate() error {
return nil
}
func (this *SendQuestionnaireSurveyResponse) Validate() error {
return nil
}
func (this *GetQuestionnaireSurveyInfoRequest) Validate() error {
return nil
}
func (this *SurveyBundleInfo) Validate() error {
return nil
}
func (this *GetQuestionnaireSurveyInfoResponse) Validate() error {
if this.BundleInfo != nil {
if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(this.BundleInfo); err != nil {
return github_com_mwitkow_go_proto_validators.FieldError("BundleInfo", err)
}
}
return nil
}
func (this *SurveyAnswer) Validate() error {
return nil
}
func (this *SurveyFeedback) Validate() error {
return nil
}
func (this *CreateQuestionnaireSurveyAnswerRequest) Validate() error {
if this.SurveyAnswer != nil {
if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(this.SurveyAnswer); err != nil {
return github_com_mwitkow_go_proto_validators.FieldError("SurveyAnswer", err)
}
}
if this.SurveyFeedback != nil {
if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(this.SurveyFeedback); err != nil {
return github_com_mwitkow_go_proto_validators.FieldError("SurveyFeedback", err)
}
}
return nil
}
func (this *CreateQuestionnaireSurveyAnswerResponse) Validate() error {
return nil
}
func (this *GetQuestionnaireSurveyListRequest) Validate() error {
return nil
}
func (this *SurveyListInfo) Validate() error {
return nil
}
func (this *GetQuestionnaireSurveyListResponse) Validate() error {
for _, item := range this.SurveyList {
if item != nil {
if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(item); err != nil {
return github_com_mwitkow_go_proto_validators.FieldError("SurveyList", err)
}
}
}
func (this *OrderInfoByOrderUuidRequest) Validate() error {
return nil
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -85,7 +85,6 @@ type CastClient interface {
GetArtist(ctx context.Context, in *GetArtistReq, opts ...grpc_go.CallOption) (*GetArtistResp, common.ErrorWithAttachment)
// 作品分析相关接口
CreateWorkAnalysis(ctx context.Context, in *CreateWorkAnalysisReq, opts ...grpc_go.CallOption) (*CreateWorkAnalysisResp, common.ErrorWithAttachment)
ImportWorkAnalysis(ctx context.Context, in *ImportWorkAnalysisReq, opts ...grpc_go.CallOption) (*ImportWorkAnalysisResp, common.ErrorWithAttachment)
UpdateWorkAnalysis(ctx context.Context, in *UpdateWorkAnalysisReq, opts ...grpc_go.CallOption) (*emptypb.Empty, common.ErrorWithAttachment)
UpdateWorkAnalysisStatus(ctx context.Context, in *UpdateWorkAnalysisStatusReq, opts ...grpc_go.CallOption) (*emptypb.Empty, common.ErrorWithAttachment)
GetWorkAnalysis(ctx context.Context, in *GetWorkAnalysisDetailReq, opts ...grpc_go.CallOption) (*GetWorkAnalysisDetailResp, common.ErrorWithAttachment)
@ -93,7 +92,6 @@ type CastClient interface {
ListWorkAnalysis(ctx context.Context, in *ListWorkAnalysisReq, opts ...grpc_go.CallOption) (*ListWorkAnalysisResp, common.ErrorWithAttachment)
DeleteWorkAnalysis(ctx context.Context, in *DeleteWorkAnalysisReq, opts ...grpc_go.CallOption) (*emptypb.Empty, common.ErrorWithAttachment)
UpdateWorkAnalysisApprovalID(ctx context.Context, in *UpdateWorkAnalysisApprovalIDReq, opts ...grpc_go.CallOption) (*emptypb.Empty, common.ErrorWithAttachment)
UpdateWorkAnalysisPdfUrl(ctx context.Context, in *UpdateWorkAnalysisReq, opts ...grpc_go.CallOption) (*emptypb.Empty, common.ErrorWithAttachment)
// 数据列表相关接口
ArtistDataList(ctx context.Context, in *ArtistDataListReq, opts ...grpc_go.CallOption) (*ArtistDataListResp, common.ErrorWithAttachment)
MediaDataList(ctx context.Context, in *MediaDataListReq, opts ...grpc_go.CallOption) (*MediaDataListResp, common.ErrorWithAttachment)
@ -138,11 +136,6 @@ type CastClient interface {
DeleteCompetitiveReport(ctx context.Context, in *DeleteCompetitiveReportReq, opts ...grpc_go.CallOption) (*emptypb.Empty, common.ErrorWithAttachment)
UpdateCompetitiveReportApprovalID(ctx context.Context, in *UpdateCompetitiveReportApprovalIDReq, opts ...grpc_go.CallOption) (*emptypb.Empty, common.ErrorWithAttachment)
CountCompetitiveReportByWorkUuids(ctx context.Context, in *CountCompetitiveReportByWorkUuidsReq, opts ...grpc_go.CallOption) (*CountCompetitiveReportByWorkUuidsResp, common.ErrorWithAttachment)
ImportCompetitiveReportHistory(ctx context.Context, in *ImportCompetitiveReportHistoryReq, opts ...grpc_go.CallOption) (*ImportCompetitiveReportHistoryResp, common.ErrorWithAttachment)
// 发布记录相关接口
ListPublishLog(ctx context.Context, in *ListPublishLogReq, opts ...grpc_go.CallOption) (*ListPublishLogResp, common.ErrorWithAttachment)
// 艺人作品统计快照接口
GetArtistWorkStats(ctx context.Context, in *GetArtistWorkStatsReq, opts ...grpc_go.CallOption) (*GetArtistWorkStatsResp, common.ErrorWithAttachment)
}
type castClient struct {
@ -202,7 +195,6 @@ type CastClientImpl struct {
UpdateArtist func(ctx context.Context, in *UpdateArtistReq) (*UpdateArtistResp, error)
GetArtist func(ctx context.Context, in *GetArtistReq) (*GetArtistResp, error)
CreateWorkAnalysis func(ctx context.Context, in *CreateWorkAnalysisReq) (*CreateWorkAnalysisResp, error)
ImportWorkAnalysis func(ctx context.Context, in *ImportWorkAnalysisReq) (*ImportWorkAnalysisResp, error)
UpdateWorkAnalysis func(ctx context.Context, in *UpdateWorkAnalysisReq) (*emptypb.Empty, error)
UpdateWorkAnalysisStatus func(ctx context.Context, in *UpdateWorkAnalysisStatusReq) (*emptypb.Empty, error)
GetWorkAnalysis func(ctx context.Context, in *GetWorkAnalysisDetailReq) (*GetWorkAnalysisDetailResp, error)
@ -210,7 +202,6 @@ type CastClientImpl struct {
ListWorkAnalysis func(ctx context.Context, in *ListWorkAnalysisReq) (*ListWorkAnalysisResp, error)
DeleteWorkAnalysis func(ctx context.Context, in *DeleteWorkAnalysisReq) (*emptypb.Empty, error)
UpdateWorkAnalysisApprovalID func(ctx context.Context, in *UpdateWorkAnalysisApprovalIDReq) (*emptypb.Empty, error)
UpdateWorkAnalysisPdfUrl func(ctx context.Context, in *UpdateWorkAnalysisReq) (*emptypb.Empty, error)
ArtistDataList func(ctx context.Context, in *ArtistDataListReq) (*ArtistDataListResp, error)
MediaDataList func(ctx context.Context, in *MediaDataListReq) (*MediaDataListResp, error)
DataOverview func(ctx context.Context, in *DataOverviewReq) (*DataOverviewResp, error)
@ -244,9 +235,6 @@ type CastClientImpl struct {
DeleteCompetitiveReport func(ctx context.Context, in *DeleteCompetitiveReportReq) (*emptypb.Empty, error)
UpdateCompetitiveReportApprovalID func(ctx context.Context, in *UpdateCompetitiveReportApprovalIDReq) (*emptypb.Empty, error)
CountCompetitiveReportByWorkUuids func(ctx context.Context, in *CountCompetitiveReportByWorkUuidsReq) (*CountCompetitiveReportByWorkUuidsResp, error)
ImportCompetitiveReportHistory func(ctx context.Context, in *ImportCompetitiveReportHistoryReq) (*ImportCompetitiveReportHistoryResp, error)
ListPublishLog func(ctx context.Context, in *ListPublishLogReq) (*ListPublishLogResp, error)
GetArtistWorkStats func(ctx context.Context, in *GetArtistWorkStatsReq) (*GetArtistWorkStatsResp, error)
}
func (c *CastClientImpl) GetDubboStub(cc *triple.TripleConn) CastClient {
@ -573,12 +561,6 @@ func (c *castClient) CreateWorkAnalysis(ctx context.Context, in *CreateWorkAnaly
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/CreateWorkAnalysis", in, out)
}
func (c *castClient) ImportWorkAnalysis(ctx context.Context, in *ImportWorkAnalysisReq, opts ...grpc_go.CallOption) (*ImportWorkAnalysisResp, common.ErrorWithAttachment) {
out := new(ImportWorkAnalysisResp)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/ImportWorkAnalysis", in, out)
}
func (c *castClient) UpdateWorkAnalysis(ctx context.Context, in *UpdateWorkAnalysisReq, opts ...grpc_go.CallOption) (*emptypb.Empty, common.ErrorWithAttachment) {
out := new(emptypb.Empty)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
@ -621,12 +603,6 @@ func (c *castClient) UpdateWorkAnalysisApprovalID(ctx context.Context, in *Updat
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/UpdateWorkAnalysisApprovalID", in, out)
}
func (c *castClient) UpdateWorkAnalysisPdfUrl(ctx context.Context, in *UpdateWorkAnalysisReq, opts ...grpc_go.CallOption) (*emptypb.Empty, common.ErrorWithAttachment) {
out := new(emptypb.Empty)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/UpdateWorkAnalysisPdfUrl", in, out)
}
func (c *castClient) ArtistDataList(ctx context.Context, in *ArtistDataListReq, opts ...grpc_go.CallOption) (*ArtistDataListResp, common.ErrorWithAttachment) {
out := new(ArtistDataListResp)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
@ -825,24 +801,6 @@ func (c *castClient) CountCompetitiveReportByWorkUuids(ctx context.Context, in *
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/CountCompetitiveReportByWorkUuids", in, out)
}
func (c *castClient) ImportCompetitiveReportHistory(ctx context.Context, in *ImportCompetitiveReportHistoryReq, opts ...grpc_go.CallOption) (*ImportCompetitiveReportHistoryResp, common.ErrorWithAttachment) {
out := new(ImportCompetitiveReportHistoryResp)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/ImportCompetitiveReportHistory", in, out)
}
func (c *castClient) ListPublishLog(ctx context.Context, in *ListPublishLogReq, opts ...grpc_go.CallOption) (*ListPublishLogResp, common.ErrorWithAttachment) {
out := new(ListPublishLogResp)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/ListPublishLog", in, out)
}
func (c *castClient) GetArtistWorkStats(ctx context.Context, in *GetArtistWorkStatsReq, opts ...grpc_go.CallOption) (*GetArtistWorkStatsResp, common.ErrorWithAttachment) {
out := new(GetArtistWorkStatsResp)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/GetArtistWorkStats", in, out)
}
// CastServer is the server API for Cast service.
// All implementations must embed UnimplementedCastServer
// for forward compatibility
@ -903,7 +861,6 @@ type CastServer interface {
GetArtist(context.Context, *GetArtistReq) (*GetArtistResp, error)
// 作品分析相关接口
CreateWorkAnalysis(context.Context, *CreateWorkAnalysisReq) (*CreateWorkAnalysisResp, error)
ImportWorkAnalysis(context.Context, *ImportWorkAnalysisReq) (*ImportWorkAnalysisResp, error)
UpdateWorkAnalysis(context.Context, *UpdateWorkAnalysisReq) (*emptypb.Empty, error)
UpdateWorkAnalysisStatus(context.Context, *UpdateWorkAnalysisStatusReq) (*emptypb.Empty, error)
GetWorkAnalysis(context.Context, *GetWorkAnalysisDetailReq) (*GetWorkAnalysisDetailResp, error)
@ -911,7 +868,6 @@ type CastServer interface {
ListWorkAnalysis(context.Context, *ListWorkAnalysisReq) (*ListWorkAnalysisResp, error)
DeleteWorkAnalysis(context.Context, *DeleteWorkAnalysisReq) (*emptypb.Empty, error)
UpdateWorkAnalysisApprovalID(context.Context, *UpdateWorkAnalysisApprovalIDReq) (*emptypb.Empty, error)
UpdateWorkAnalysisPdfUrl(context.Context, *UpdateWorkAnalysisReq) (*emptypb.Empty, error)
// 数据列表相关接口
ArtistDataList(context.Context, *ArtistDataListReq) (*ArtistDataListResp, error)
MediaDataList(context.Context, *MediaDataListReq) (*MediaDataListResp, error)
@ -956,11 +912,6 @@ type CastServer interface {
DeleteCompetitiveReport(context.Context, *DeleteCompetitiveReportReq) (*emptypb.Empty, error)
UpdateCompetitiveReportApprovalID(context.Context, *UpdateCompetitiveReportApprovalIDReq) (*emptypb.Empty, error)
CountCompetitiveReportByWorkUuids(context.Context, *CountCompetitiveReportByWorkUuidsReq) (*CountCompetitiveReportByWorkUuidsResp, error)
ImportCompetitiveReportHistory(context.Context, *ImportCompetitiveReportHistoryReq) (*ImportCompetitiveReportHistoryResp, error)
// 发布记录相关接口
ListPublishLog(context.Context, *ListPublishLogReq) (*ListPublishLogResp, error)
// 艺人作品统计快照接口
GetArtistWorkStats(context.Context, *GetArtistWorkStatsReq) (*GetArtistWorkStatsResp, error)
mustEmbedUnimplementedCastServer()
}
@ -1125,9 +1076,6 @@ func (UnimplementedCastServer) GetArtist(context.Context, *GetArtistReq) (*GetAr
func (UnimplementedCastServer) CreateWorkAnalysis(context.Context, *CreateWorkAnalysisReq) (*CreateWorkAnalysisResp, error) {
return nil, status.Errorf(codes.Unimplemented, "method CreateWorkAnalysis not implemented")
}
func (UnimplementedCastServer) ImportWorkAnalysis(context.Context, *ImportWorkAnalysisReq) (*ImportWorkAnalysisResp, error) {
return nil, status.Errorf(codes.Unimplemented, "method ImportWorkAnalysis not implemented")
}
func (UnimplementedCastServer) UpdateWorkAnalysis(context.Context, *UpdateWorkAnalysisReq) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method UpdateWorkAnalysis not implemented")
}
@ -1149,9 +1097,6 @@ func (UnimplementedCastServer) DeleteWorkAnalysis(context.Context, *DeleteWorkAn
func (UnimplementedCastServer) UpdateWorkAnalysisApprovalID(context.Context, *UpdateWorkAnalysisApprovalIDReq) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method UpdateWorkAnalysisApprovalID not implemented")
}
func (UnimplementedCastServer) UpdateWorkAnalysisPdfUrl(context.Context, *UpdateWorkAnalysisReq) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method UpdateWorkAnalysisPdfUrl not implemented")
}
func (UnimplementedCastServer) ArtistDataList(context.Context, *ArtistDataListReq) (*ArtistDataListResp, error) {
return nil, status.Errorf(codes.Unimplemented, "method ArtistDataList not implemented")
}
@ -1251,15 +1196,6 @@ func (UnimplementedCastServer) UpdateCompetitiveReportApprovalID(context.Context
func (UnimplementedCastServer) CountCompetitiveReportByWorkUuids(context.Context, *CountCompetitiveReportByWorkUuidsReq) (*CountCompetitiveReportByWorkUuidsResp, error) {
return nil, status.Errorf(codes.Unimplemented, "method CountCompetitiveReportByWorkUuids not implemented")
}
func (UnimplementedCastServer) ImportCompetitiveReportHistory(context.Context, *ImportCompetitiveReportHistoryReq) (*ImportCompetitiveReportHistoryResp, error) {
return nil, status.Errorf(codes.Unimplemented, "method ImportCompetitiveReportHistory not implemented")
}
func (UnimplementedCastServer) ListPublishLog(context.Context, *ListPublishLogReq) (*ListPublishLogResp, error) {
return nil, status.Errorf(codes.Unimplemented, "method ListPublishLog not implemented")
}
func (UnimplementedCastServer) GetArtistWorkStats(context.Context, *GetArtistWorkStatsReq) (*GetArtistWorkStatsResp, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetArtistWorkStats not implemented")
}
func (s *UnimplementedCastServer) XXX_SetProxyImpl(impl protocol.Invoker) {
s.proxyImpl = impl
}
@ -2796,35 +2732,6 @@ func _Cast_CreateWorkAnalysis_Handler(srv interface{}, ctx context.Context, dec
return interceptor(ctx, in, info, handler)
}
func _Cast_ImportWorkAnalysis_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(ImportWorkAnalysisReq)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("ImportWorkAnalysis", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
func _Cast_UpdateWorkAnalysis_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(UpdateWorkAnalysisReq)
if err := dec(in); err != nil {
@ -3028,35 +2935,6 @@ func _Cast_UpdateWorkAnalysisApprovalID_Handler(srv interface{}, ctx context.Con
return interceptor(ctx, in, info, handler)
}
func _Cast_UpdateWorkAnalysisPdfUrl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(UpdateWorkAnalysisReq)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("UpdateWorkAnalysisPdfUrl", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
func _Cast_ArtistDataList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(ArtistDataListReq)
if err := dec(in); err != nil {
@ -4014,93 +3892,6 @@ func _Cast_CountCompetitiveReportByWorkUuids_Handler(srv interface{}, ctx contex
return interceptor(ctx, in, info, handler)
}
func _Cast_ImportCompetitiveReportHistory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(ImportCompetitiveReportHistoryReq)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("ImportCompetitiveReportHistory", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
func _Cast_ListPublishLog_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(ListPublishLogReq)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("ListPublishLog", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
func _Cast_GetArtistWorkStats_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(GetArtistWorkStatsReq)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("GetArtistWorkStats", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
// Cast_ServiceDesc is the grpc_go.ServiceDesc for Cast service.
// It's only intended for direct use with grpc_go.RegisterService,
// and not to be introspected or modified (even as a copy)
@ -4316,10 +4107,6 @@ var Cast_ServiceDesc = grpc_go.ServiceDesc{
MethodName: "CreateWorkAnalysis",
Handler: _Cast_CreateWorkAnalysis_Handler,
},
{
MethodName: "ImportWorkAnalysis",
Handler: _Cast_ImportWorkAnalysis_Handler,
},
{
MethodName: "UpdateWorkAnalysis",
Handler: _Cast_UpdateWorkAnalysis_Handler,
@ -4348,10 +4135,6 @@ var Cast_ServiceDesc = grpc_go.ServiceDesc{
MethodName: "UpdateWorkAnalysisApprovalID",
Handler: _Cast_UpdateWorkAnalysisApprovalID_Handler,
},
{
MethodName: "UpdateWorkAnalysisPdfUrl",
Handler: _Cast_UpdateWorkAnalysisPdfUrl_Handler,
},
{
MethodName: "ArtistDataList",
Handler: _Cast_ArtistDataList_Handler,
@ -4484,18 +4267,6 @@ var Cast_ServiceDesc = grpc_go.ServiceDesc{
MethodName: "CountCompetitiveReportByWorkUuids",
Handler: _Cast_CountCompetitiveReportByWorkUuids_Handler,
},
{
MethodName: "ImportCompetitiveReportHistory",
Handler: _Cast_ImportCompetitiveReportHistory_Handler,
},
{
MethodName: "ListPublishLog",
Handler: _Cast_ListPublishLog_Handler,
},
{
MethodName: "GetArtistWorkStats",
Handler: _Cast_GetArtistWorkStats_Handler,
},
},
Streams: []grpc_go.StreamDesc{},
Metadata: "pb/fiee/cast.proto",

View File

@ -2049,116 +2049,6 @@ func (x *SecurityScanResp) GetProblemTimeFrame() string {
return ""
}
type SecurityScanByTextReq struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text"` // 文本
}
func (x *SecurityScanByTextReq) Reset() {
*x = SecurityScanByTextReq{}
if protoimpl.UnsafeEnabled {
mi := &file_files_proto_msgTypes[31]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *SecurityScanByTextReq) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*SecurityScanByTextReq) ProtoMessage() {}
func (x *SecurityScanByTextReq) ProtoReflect() protoreflect.Message {
mi := &file_files_proto_msgTypes[31]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use SecurityScanByTextReq.ProtoReflect.Descriptor instead.
func (*SecurityScanByTextReq) Descriptor() ([]byte, []int) {
return file_files_proto_rawDescGZIP(), []int{31}
}
func (x *SecurityScanByTextReq) GetText() string {
if x != nil {
return x.Text
}
return ""
}
type SecurityScanByTextResp struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
SecurityStatus string `protobuf:"bytes,1,opt,name=securityStatus,proto3" json:"securityStatus"` // 安全状态
Describe string `protobuf:"bytes,2,opt,name=describe,proto3" json:"describe"` // 描述
ProblemText string `protobuf:"bytes,3,opt,name=problemText,proto3" json:"problemText"` // 问题文本
}
func (x *SecurityScanByTextResp) Reset() {
*x = SecurityScanByTextResp{}
if protoimpl.UnsafeEnabled {
mi := &file_files_proto_msgTypes[32]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *SecurityScanByTextResp) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*SecurityScanByTextResp) ProtoMessage() {}
func (x *SecurityScanByTextResp) ProtoReflect() protoreflect.Message {
mi := &file_files_proto_msgTypes[32]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use SecurityScanByTextResp.ProtoReflect.Descriptor instead.
func (*SecurityScanByTextResp) Descriptor() ([]byte, []int) {
return file_files_proto_rawDescGZIP(), []int{32}
}
func (x *SecurityScanByTextResp) GetSecurityStatus() string {
if x != nil {
return x.SecurityStatus
}
return ""
}
func (x *SecurityScanByTextResp) GetDescribe() string {
if x != nil {
return x.Describe
}
return ""
}
func (x *SecurityScanByTextResp) GetProblemText() string {
if x != nil {
return x.ProblemText
}
return ""
}
type UpdateFileSecurityStatusReq struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@ -2170,7 +2060,7 @@ type UpdateFileSecurityStatusReq struct {
func (x *UpdateFileSecurityStatusReq) Reset() {
*x = UpdateFileSecurityStatusReq{}
if protoimpl.UnsafeEnabled {
mi := &file_files_proto_msgTypes[33]
mi := &file_files_proto_msgTypes[31]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -2183,7 +2073,7 @@ func (x *UpdateFileSecurityStatusReq) String() string {
func (*UpdateFileSecurityStatusReq) ProtoMessage() {}
func (x *UpdateFileSecurityStatusReq) ProtoReflect() protoreflect.Message {
mi := &file_files_proto_msgTypes[33]
mi := &file_files_proto_msgTypes[31]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -2196,7 +2086,7 @@ func (x *UpdateFileSecurityStatusReq) ProtoReflect() protoreflect.Message {
// Deprecated: Use UpdateFileSecurityStatusReq.ProtoReflect.Descriptor instead.
func (*UpdateFileSecurityStatusReq) Descriptor() ([]byte, []int) {
return file_files_proto_rawDescGZIP(), []int{33}
return file_files_proto_rawDescGZIP(), []int{31}
}
func (x *UpdateFileSecurityStatusReq) GetSecurityStatusData() []*SecurityStatusData {
@ -2215,7 +2105,7 @@ type UpdateFileSecurityStatusResp struct {
func (x *UpdateFileSecurityStatusResp) Reset() {
*x = UpdateFileSecurityStatusResp{}
if protoimpl.UnsafeEnabled {
mi := &file_files_proto_msgTypes[34]
mi := &file_files_proto_msgTypes[32]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -2228,7 +2118,7 @@ func (x *UpdateFileSecurityStatusResp) String() string {
func (*UpdateFileSecurityStatusResp) ProtoMessage() {}
func (x *UpdateFileSecurityStatusResp) ProtoReflect() protoreflect.Message {
mi := &file_files_proto_msgTypes[34]
mi := &file_files_proto_msgTypes[32]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -2241,7 +2131,7 @@ func (x *UpdateFileSecurityStatusResp) ProtoReflect() protoreflect.Message {
// Deprecated: Use UpdateFileSecurityStatusResp.ProtoReflect.Descriptor instead.
func (*UpdateFileSecurityStatusResp) Descriptor() ([]byte, []int) {
return file_files_proto_rawDescGZIP(), []int{34}
return file_files_proto_rawDescGZIP(), []int{32}
}
type ManualAntiReq struct {
@ -2255,7 +2145,7 @@ type ManualAntiReq struct {
func (x *ManualAntiReq) Reset() {
*x = ManualAntiReq{}
if protoimpl.UnsafeEnabled {
mi := &file_files_proto_msgTypes[35]
mi := &file_files_proto_msgTypes[33]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -2268,7 +2158,7 @@ func (x *ManualAntiReq) String() string {
func (*ManualAntiReq) ProtoMessage() {}
func (x *ManualAntiReq) ProtoReflect() protoreflect.Message {
mi := &file_files_proto_msgTypes[35]
mi := &file_files_proto_msgTypes[33]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -2281,7 +2171,7 @@ func (x *ManualAntiReq) ProtoReflect() protoreflect.Message {
// Deprecated: Use ManualAntiReq.ProtoReflect.Descriptor instead.
func (*ManualAntiReq) Descriptor() ([]byte, []int) {
return file_files_proto_rawDescGZIP(), []int{35}
return file_files_proto_rawDescGZIP(), []int{33}
}
func (x *ManualAntiReq) GetSecurityStatusData() []*SecurityStatusData {
@ -2300,7 +2190,7 @@ type ManualAntiResp struct {
func (x *ManualAntiResp) Reset() {
*x = ManualAntiResp{}
if protoimpl.UnsafeEnabled {
mi := &file_files_proto_msgTypes[36]
mi := &file_files_proto_msgTypes[34]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -2313,7 +2203,7 @@ func (x *ManualAntiResp) String() string {
func (*ManualAntiResp) ProtoMessage() {}
func (x *ManualAntiResp) ProtoReflect() protoreflect.Message {
mi := &file_files_proto_msgTypes[36]
mi := &file_files_proto_msgTypes[34]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -2326,7 +2216,7 @@ func (x *ManualAntiResp) ProtoReflect() protoreflect.Message {
// Deprecated: Use ManualAntiResp.ProtoReflect.Descriptor instead.
func (*ManualAntiResp) Descriptor() ([]byte, []int) {
return file_files_proto_rawDescGZIP(), []int{36}
return file_files_proto_rawDescGZIP(), []int{34}
}
type GetFileSecurityStatusReq struct {
@ -2341,7 +2231,7 @@ type GetFileSecurityStatusReq struct {
func (x *GetFileSecurityStatusReq) Reset() {
*x = GetFileSecurityStatusReq{}
if protoimpl.UnsafeEnabled {
mi := &file_files_proto_msgTypes[37]
mi := &file_files_proto_msgTypes[35]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -2354,7 +2244,7 @@ func (x *GetFileSecurityStatusReq) String() string {
func (*GetFileSecurityStatusReq) ProtoMessage() {}
func (x *GetFileSecurityStatusReq) ProtoReflect() protoreflect.Message {
mi := &file_files_proto_msgTypes[37]
mi := &file_files_proto_msgTypes[35]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -2367,7 +2257,7 @@ func (x *GetFileSecurityStatusReq) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetFileSecurityStatusReq.ProtoReflect.Descriptor instead.
func (*GetFileSecurityStatusReq) Descriptor() ([]byte, []int) {
return file_files_proto_rawDescGZIP(), []int{37}
return file_files_proto_rawDescGZIP(), []int{35}
}
func (x *GetFileSecurityStatusReq) GetUrl() string {
@ -2397,7 +2287,7 @@ type GetFileSecurityStatusResp struct {
func (x *GetFileSecurityStatusResp) Reset() {
*x = GetFileSecurityStatusResp{}
if protoimpl.UnsafeEnabled {
mi := &file_files_proto_msgTypes[38]
mi := &file_files_proto_msgTypes[36]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -2410,7 +2300,7 @@ func (x *GetFileSecurityStatusResp) String() string {
func (*GetFileSecurityStatusResp) ProtoMessage() {}
func (x *GetFileSecurityStatusResp) ProtoReflect() protoreflect.Message {
mi := &file_files_proto_msgTypes[38]
mi := &file_files_proto_msgTypes[36]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -2423,7 +2313,7 @@ func (x *GetFileSecurityStatusResp) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetFileSecurityStatusResp.ProtoReflect.Descriptor instead.
func (*GetFileSecurityStatusResp) Descriptor() ([]byte, []int) {
return file_files_proto_rawDescGZIP(), []int{38}
return file_files_proto_rawDescGZIP(), []int{36}
}
func (x *GetFileSecurityStatusResp) GetSecurityStatus() string {
@ -2462,7 +2352,7 @@ type SearchResp_Nested struct {
func (x *SearchResp_Nested) Reset() {
*x = SearchResp_Nested{}
if protoimpl.UnsafeEnabled {
mi := &file_files_proto_msgTypes[39]
mi := &file_files_proto_msgTypes[37]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -2475,7 +2365,7 @@ func (x *SearchResp_Nested) String() string {
func (*SearchResp_Nested) ProtoMessage() {}
func (x *SearchResp_Nested) ProtoReflect() protoreflect.Message {
mi := &file_files_proto_msgTypes[39]
mi := &file_files_proto_msgTypes[37]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -2742,118 +2632,102 @@ var file_files_proto_rawDesc = []byte{
0x08, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x6f,
0x62, 0x6c, 0x65, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20,
0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x54, 0x69, 0x6d, 0x65,
0x46, 0x72, 0x61, 0x6d, 0x65, 0x22, 0x2b, 0x0a, 0x15, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74,
0x79, 0x53, 0x63, 0x61, 0x6e, 0x42, 0x79, 0x54, 0x65, 0x78, 0x74, 0x52, 0x65, 0x71, 0x12, 0x12,
0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65,
0x78, 0x74, 0x22, 0x7e, 0x0a, 0x16, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63,
0x61, 0x6e, 0x42, 0x79, 0x54, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x26, 0x0a, 0x0e,
0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01,
0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74,
0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x54, 0x65, 0x78, 0x74, 0x18,
0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x54, 0x65,
0x78, 0x74, 0x22, 0x68, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65,
0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65,
0x71, 0x12, 0x49, 0x0a, 0x12, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61,
0x74, 0x75, 0x73, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e,
0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74,
0x61, 0x74, 0x75, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x12, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69,
0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x61, 0x74, 0x61, 0x22, 0x1e, 0x0a, 0x1c,
0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69,
0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x5a, 0x0a, 0x0d,
0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x41, 0x6e, 0x74, 0x69, 0x52, 0x65, 0x71, 0x12, 0x49, 0x0a,
0x12, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44,
0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, 0x69, 0x6c, 0x65,
0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
0x44, 0x61, 0x74, 0x61, 0x52, 0x12, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74,
0x61, 0x74, 0x75, 0x73, 0x44, 0x61, 0x74, 0x61, 0x22, 0x10, 0x0a, 0x0e, 0x4d, 0x61, 0x6e, 0x75,
0x61, 0x6c, 0x41, 0x6e, 0x74, 0x69, 0x52, 0x65, 0x73, 0x70, 0x22, 0x48, 0x0a, 0x18, 0x47, 0x65,
0x74, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61,
0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65,
0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65,
0x4e, 0x61, 0x6d, 0x65, 0x22, 0x8b, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65,
0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65,
0x73, 0x70, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74,
0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x63, 0x75,
0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65,
0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65,
0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65,
0x6d, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
0x52, 0x10, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x61,
0x6d, 0x65, 0x32, 0xe5, 0x08, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x4c,
0x69, 0x73, 0x74, 0x12, 0x12, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65,
0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e,
0x46, 0x69, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x31,
0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x46,
0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x66, 0x69, 0x6c,
0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x22,
0x00, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x10, 0x2e, 0x66, 0x69,
0x6c, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e,
0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70,
0x22, 0x00, 0x12, 0x2f, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x10, 0x2e, 0x66,
0x69, 0x6c, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11,
0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73,
0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x10, 0x2e,
0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x1a,
0x11, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65,
0x73, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x06, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x10,
0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71,
0x1a, 0x11, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52,
0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x09, 0x54, 0x75, 0x73, 0x43, 0x72, 0x65, 0x61,
0x74, 0x65, 0x12, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x54, 0x75, 0x73, 0x43, 0x72,
0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e,
0x54, 0x75, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12,
0x38, 0x0a, 0x09, 0x54, 0x75, 0x73, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, 0x66,
0x69, 0x6c, 0x65, 0x73, 0x2e, 0x54, 0x75, 0x73, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65,
0x71, 0x1a, 0x14, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x54, 0x75, 0x73, 0x55, 0x70, 0x6c,
0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x73,
0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1b,
0x46, 0x72, 0x61, 0x6d, 0x65, 0x22, 0x68, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46,
0x69, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75,
0x73, 0x52, 0x65, 0x71, 0x12, 0x49, 0x0a, 0x12, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79,
0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
0x32, 0x19, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74,
0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x12, 0x73, 0x65, 0x63,
0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x61, 0x74, 0x61, 0x22,
0x1e, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x63,
0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22,
0x5a, 0x0a, 0x0d, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x41, 0x6e, 0x74, 0x69, 0x52, 0x65, 0x71,
0x12, 0x49, 0x0a, 0x12, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74,
0x75, 0x73, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66,
0x69, 0x6c, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61,
0x74, 0x75, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x12, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74,
0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x61, 0x74, 0x61, 0x22, 0x10, 0x0a, 0x0e, 0x4d,
0x61, 0x6e, 0x75, 0x61, 0x6c, 0x41, 0x6e, 0x74, 0x69, 0x52, 0x65, 0x73, 0x70, 0x22, 0x48, 0x0a,
0x18, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79,
0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c,
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x66,
0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66,
0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x8b, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x46,
0x69, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75,
0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74,
0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73,
0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a,
0x08, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
0x08, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x6f,
0x62, 0x6c, 0x65, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20,
0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x54, 0x69, 0x6d, 0x65,
0x46, 0x72, 0x61, 0x6d, 0x65, 0x32, 0x90, 0x08, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x31,
0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x12, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x46,
0x69, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x66, 0x69, 0x6c,
0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22,
0x00, 0x12, 0x31, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x2e, 0x66, 0x69, 0x6c, 0x65,
0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e,
0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65,
0x73, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x10,
0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71,
0x1a, 0x11, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52,
0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12,
0x10, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65,
0x71, 0x1a, 0x11, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68,
0x12, 0x10, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52,
0x65, 0x71, 0x1a, 0x11, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63,
0x68, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x06, 0x55, 0x70, 0x6c, 0x6f, 0x61,
0x64, 0x12, 0x10, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64,
0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f,
0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x09, 0x54, 0x75, 0x73, 0x43,
0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x54, 0x75,
0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x66, 0x69, 0x6c,
0x65, 0x73, 0x2e, 0x54, 0x75, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70,
0x22, 0x00, 0x12, 0x38, 0x0a, 0x09, 0x54, 0x75, 0x73, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12,
0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x54, 0x75, 0x73, 0x55, 0x70, 0x6c, 0x6f, 0x61,
0x64, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x54, 0x75, 0x73,
0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x11,
0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65,
0x72, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61,
0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1c,
0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65,
0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x66, 0x69,
0x6c, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61,
0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x32, 0x0a, 0x07, 0x50,
0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x12, 0x11, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x50,
0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x66, 0x69, 0x6c, 0x65,
0x73, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12,
0x2f, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x66, 0x69, 0x6c, 0x65,
0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x66, 0x69,
0x6c, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00,
0x12, 0x40, 0x0a, 0x0b, 0x44, 0x69, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12,
0x15, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x44, 0x69, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c,
0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x44,
0x69, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00,
0x30, 0x01, 0x12, 0x2c, 0x0a, 0x05, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0f, 0x2e, 0x66, 0x69,
0x6c, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x66,
0x69, 0x6c, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00,
0x12, 0x41, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x61, 0x6e,
0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74,
0x79, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73,
0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x73,
0x70, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x12, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53,
0x63, 0x61, 0x6e, 0x42, 0x79, 0x54, 0x65, 0x78, 0x74, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65,
0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x61, 0x6e, 0x42, 0x79,
0x54, 0x65, 0x78, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e,
0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x61, 0x6e, 0x42, 0x79, 0x54, 0x65,
0x78, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61,
0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74,
0x61, 0x74, 0x75, 0x73, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64,
0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53,
0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73,
0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72,
0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12,
0x3b, 0x0a, 0x0a, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x41, 0x6e, 0x74, 0x69, 0x12, 0x14, 0x2e,
0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x41, 0x6e, 0x74, 0x69,
0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x6e, 0x75,
0x61, 0x6c, 0x41, 0x6e, 0x74, 0x69, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x15,
0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53,
0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x47, 0x65,
0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x32,
0x0a, 0x07, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x12, 0x11, 0x2e, 0x66, 0x69, 0x6c, 0x65,
0x73, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x66,
0x69, 0x6c, 0x65, 0x73, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x73, 0x70,
0x22, 0x00, 0x12, 0x2f, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x66,
0x69, 0x6c, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x11,
0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73,
0x70, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0b, 0x44, 0x69, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f,
0x61, 0x64, 0x12, 0x15, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x44, 0x69, 0x72, 0x44, 0x6f,
0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65,
0x73, 0x2e, 0x44, 0x69, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73,
0x70, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x05, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0f,
0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a,
0x10, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73,
0x70, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53,
0x63, 0x61, 0x6e, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75,
0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x66, 0x69,
0x6c, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x61, 0x6e,
0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74,
0x75, 0x73, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74,
0x65, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61,
0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x55,
0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74,
0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x3b, 0x0a,
0x0a, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x41, 0x6e, 0x74, 0x69, 0x12, 0x14, 0x2e, 0x66, 0x69,
0x6c, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x41, 0x6e, 0x74, 0x69, 0x52, 0x65,
0x71, 0x1a, 0x15, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c,
0x41, 0x6e, 0x74, 0x69, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x15, 0x47, 0x65,
0x74, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61,
0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x47,
0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74,
0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x2f,
0x3b, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x74, 0x75, 0x73, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x46,
0x69, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75,
0x73, 0x52, 0x65, 0x71, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74,
0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74,
0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x2f, 0x3b, 0x66,
0x69, 0x6c, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@ -2868,7 +2742,7 @@ func file_files_proto_rawDescGZIP() []byte {
return file_files_proto_rawDescData
}
var file_files_proto_msgTypes = make([]protoimpl.MessageInfo, 40)
var file_files_proto_msgTypes = make([]protoimpl.MessageInfo, 38)
var file_files_proto_goTypes = []interface{}{
(*FileListReq)(nil), // 0: files.FileListReq
(*Items)(nil), // 1: files.Items
@ -2901,21 +2775,19 @@ var file_files_proto_goTypes = []interface{}{
(*SecurityStatusData)(nil), // 28: files.SecurityStatusData
(*SecurityScanReq)(nil), // 29: files.SecurityScanReq
(*SecurityScanResp)(nil), // 30: files.SecurityScanResp
(*SecurityScanByTextReq)(nil), // 31: files.SecurityScanByTextReq
(*SecurityScanByTextResp)(nil), // 32: files.SecurityScanByTextResp
(*UpdateFileSecurityStatusReq)(nil), // 33: files.UpdateFileSecurityStatusReq
(*UpdateFileSecurityStatusResp)(nil), // 34: files.UpdateFileSecurityStatusResp
(*ManualAntiReq)(nil), // 35: files.ManualAntiReq
(*ManualAntiResp)(nil), // 36: files.ManualAntiResp
(*GetFileSecurityStatusReq)(nil), // 37: files.GetFileSecurityStatusReq
(*GetFileSecurityStatusResp)(nil), // 38: files.GetFileSecurityStatusResp
(*SearchResp_Nested)(nil), // 39: files.searchResp.Nested
(*UpdateFileSecurityStatusReq)(nil), // 31: files.UpdateFileSecurityStatusReq
(*UpdateFileSecurityStatusResp)(nil), // 32: files.UpdateFileSecurityStatusResp
(*ManualAntiReq)(nil), // 33: files.ManualAntiReq
(*ManualAntiResp)(nil), // 34: files.ManualAntiResp
(*GetFileSecurityStatusReq)(nil), // 35: files.GetFileSecurityStatusReq
(*GetFileSecurityStatusResp)(nil), // 36: files.GetFileSecurityStatusResp
(*SearchResp_Nested)(nil), // 37: files.searchResp.Nested
}
var file_files_proto_depIdxs = []int32{
2, // 0: files.FileListReq.sorting:type_name -> files.Sorting
1, // 1: files.FileListResp.items:type_name -> files.Items
2, // 2: files.FileListResp.sorting:type_name -> files.Sorting
39, // 3: files.searchResp.items:type_name -> files.searchResp.Nested
37, // 3: files.searchResp.items:type_name -> files.searchResp.Nested
28, // 4: files.UpdateFileSecurityStatusReq.securityStatusData:type_name -> files.SecurityStatusData
28, // 5: files.ManualAntiReq.securityStatusData:type_name -> files.SecurityStatusData
0, // 6: files.File.List:input_type -> files.FileListReq
@ -2932,30 +2804,28 @@ var file_files_proto_depIdxs = []int32{
24, // 17: files.File.DirDownload:input_type -> files.DirDownloadReq
26, // 18: files.File.Usage:input_type -> files.UsageReq
29, // 19: files.File.SecurityScan:input_type -> files.SecurityScanReq
31, // 20: files.File.SecurityScanByText:input_type -> files.SecurityScanByTextReq
33, // 21: files.File.UpdateFileSecurityStatus:input_type -> files.UpdateFileSecurityStatusReq
35, // 22: files.File.ManualAnti:input_type -> files.ManualAntiReq
37, // 23: files.File.GetFileSecurityStatus:input_type -> files.GetFileSecurityStatusReq
3, // 24: files.File.List:output_type -> files.FileListResp
19, // 25: files.File.Info:output_type -> files.FileInfoResp
5, // 26: files.File.Create:output_type -> files.CreateResp
7, // 27: files.File.Delete:output_type -> files.DeleteResp
11, // 28: files.File.Search:output_type -> files.searchResp
9, // 29: files.File.Upload:output_type -> files.UploadResp
13, // 30: files.File.TusCreate:output_type -> files.TusCreateResp
15, // 31: files.File.TusUpload:output_type -> files.TusUploadResp
17, // 32: files.File.ResumableTransfer:output_type -> files.ResumableTransferResp
21, // 33: files.File.Preview:output_type -> files.PreviewResp
23, // 34: files.File.Action:output_type -> files.ActionResp
25, // 35: files.File.DirDownload:output_type -> files.DirDownloadResp
27, // 36: files.File.Usage:output_type -> files.UsageResp
30, // 37: files.File.SecurityScan:output_type -> files.SecurityScanResp
32, // 38: files.File.SecurityScanByText:output_type -> files.SecurityScanByTextResp
34, // 39: files.File.UpdateFileSecurityStatus:output_type -> files.UpdateFileSecurityStatusResp
36, // 40: files.File.ManualAnti:output_type -> files.ManualAntiResp
38, // 41: files.File.GetFileSecurityStatus:output_type -> files.GetFileSecurityStatusResp
24, // [24:42] is the sub-list for method output_type
6, // [6:24] is the sub-list for method input_type
31, // 20: files.File.UpdateFileSecurityStatus:input_type -> files.UpdateFileSecurityStatusReq
33, // 21: files.File.ManualAnti:input_type -> files.ManualAntiReq
35, // 22: files.File.GetFileSecurityStatus:input_type -> files.GetFileSecurityStatusReq
3, // 23: files.File.List:output_type -> files.FileListResp
19, // 24: files.File.Info:output_type -> files.FileInfoResp
5, // 25: files.File.Create:output_type -> files.CreateResp
7, // 26: files.File.Delete:output_type -> files.DeleteResp
11, // 27: files.File.Search:output_type -> files.searchResp
9, // 28: files.File.Upload:output_type -> files.UploadResp
13, // 29: files.File.TusCreate:output_type -> files.TusCreateResp
15, // 30: files.File.TusUpload:output_type -> files.TusUploadResp
17, // 31: files.File.ResumableTransfer:output_type -> files.ResumableTransferResp
21, // 32: files.File.Preview:output_type -> files.PreviewResp
23, // 33: files.File.Action:output_type -> files.ActionResp
25, // 34: files.File.DirDownload:output_type -> files.DirDownloadResp
27, // 35: files.File.Usage:output_type -> files.UsageResp
30, // 36: files.File.SecurityScan:output_type -> files.SecurityScanResp
32, // 37: files.File.UpdateFileSecurityStatus:output_type -> files.UpdateFileSecurityStatusResp
34, // 38: files.File.ManualAnti:output_type -> files.ManualAntiResp
36, // 39: files.File.GetFileSecurityStatus:output_type -> files.GetFileSecurityStatusResp
23, // [23:40] is the sub-list for method output_type
6, // [6:23] is the sub-list for method input_type
6, // [6:6] is the sub-list for extension type_name
6, // [6:6] is the sub-list for extension extendee
0, // [0:6] is the sub-list for field type_name
@ -3340,30 +3210,6 @@ func file_files_proto_init() {
}
}
file_files_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SecurityScanByTextReq); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_files_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SecurityScanByTextResp); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_files_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*UpdateFileSecurityStatusReq); i {
case 0:
return &v.state
@ -3375,7 +3221,7 @@ func file_files_proto_init() {
return nil
}
}
file_files_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
file_files_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*UpdateFileSecurityStatusResp); i {
case 0:
return &v.state
@ -3387,7 +3233,7 @@ func file_files_proto_init() {
return nil
}
}
file_files_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
file_files_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ManualAntiReq); i {
case 0:
return &v.state
@ -3399,7 +3245,7 @@ func file_files_proto_init() {
return nil
}
}
file_files_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
file_files_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ManualAntiResp); i {
case 0:
return &v.state
@ -3411,7 +3257,7 @@ func file_files_proto_init() {
return nil
}
}
file_files_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
file_files_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*GetFileSecurityStatusReq); i {
case 0:
return &v.state
@ -3423,7 +3269,7 @@ func file_files_proto_init() {
return nil
}
}
file_files_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
file_files_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*GetFileSecurityStatusResp); i {
case 0:
return &v.state
@ -3435,7 +3281,7 @@ func file_files_proto_init() {
return nil
}
}
file_files_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
file_files_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SearchResp_Nested); i {
case 0:
return &v.state
@ -3454,7 +3300,7 @@ func file_files_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_files_proto_rawDesc,
NumEnums: 0,
NumMessages: 40,
NumMessages: 38,
NumExtensions: 0,
NumServices: 1,
},

View File

@ -135,12 +135,6 @@ func (this *SecurityScanReq) Validate() error {
func (this *SecurityScanResp) Validate() error {
return nil
}
func (this *SecurityScanByTextReq) Validate() error {
return nil
}
func (this *SecurityScanByTextResp) Validate() error {
return nil
}
func (this *UpdateFileSecurityStatusReq) Validate() error {
for _, item := range this.SecurityStatusData {
if item != nil {

View File

@ -43,7 +43,6 @@ type FileClient interface {
DirDownload(ctx context.Context, in *DirDownloadReq, opts ...grpc_go.CallOption) (File_DirDownloadClient, error)
Usage(ctx context.Context, in *UsageReq, opts ...grpc_go.CallOption) (*UsageResp, common.ErrorWithAttachment)
SecurityScan(ctx context.Context, in *SecurityScanReq, opts ...grpc_go.CallOption) (*SecurityScanResp, common.ErrorWithAttachment)
SecurityScanByText(ctx context.Context, in *SecurityScanByTextReq, opts ...grpc_go.CallOption) (*SecurityScanByTextResp, common.ErrorWithAttachment)
UpdateFileSecurityStatus(ctx context.Context, in *UpdateFileSecurityStatusReq, opts ...grpc_go.CallOption) (*UpdateFileSecurityStatusResp, common.ErrorWithAttachment)
ManualAnti(ctx context.Context, in *ManualAntiReq, opts ...grpc_go.CallOption) (*ManualAntiResp, common.ErrorWithAttachment)
GetFileSecurityStatus(ctx context.Context, in *GetFileSecurityStatusReq, opts ...grpc_go.CallOption) (*GetFileSecurityStatusResp, common.ErrorWithAttachment)
@ -68,7 +67,6 @@ type FileClientImpl struct {
DirDownload func(ctx context.Context, in *DirDownloadReq) (File_DirDownloadClient, error)
Usage func(ctx context.Context, in *UsageReq) (*UsageResp, error)
SecurityScan func(ctx context.Context, in *SecurityScanReq) (*SecurityScanResp, error)
SecurityScanByText func(ctx context.Context, in *SecurityScanByTextReq) (*SecurityScanByTextResp, error)
UpdateFileSecurityStatus func(ctx context.Context, in *UpdateFileSecurityStatusReq) (*UpdateFileSecurityStatusResp, error)
ManualAnti func(ctx context.Context, in *ManualAntiReq) (*ManualAntiResp, error)
GetFileSecurityStatus func(ctx context.Context, in *GetFileSecurityStatusReq) (*GetFileSecurityStatusResp, error)
@ -197,12 +195,6 @@ func (c *fileClient) SecurityScan(ctx context.Context, in *SecurityScanReq, opts
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/SecurityScan", in, out)
}
func (c *fileClient) SecurityScanByText(ctx context.Context, in *SecurityScanByTextReq, opts ...grpc_go.CallOption) (*SecurityScanByTextResp, common.ErrorWithAttachment) {
out := new(SecurityScanByTextResp)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/SecurityScanByText", in, out)
}
func (c *fileClient) UpdateFileSecurityStatus(ctx context.Context, in *UpdateFileSecurityStatusReq, opts ...grpc_go.CallOption) (*UpdateFileSecurityStatusResp, common.ErrorWithAttachment) {
out := new(UpdateFileSecurityStatusResp)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
@ -239,7 +231,6 @@ type FileServer interface {
DirDownload(*DirDownloadReq, File_DirDownloadServer) error
Usage(context.Context, *UsageReq) (*UsageResp, error)
SecurityScan(context.Context, *SecurityScanReq) (*SecurityScanResp, error)
SecurityScanByText(context.Context, *SecurityScanByTextReq) (*SecurityScanByTextResp, error)
UpdateFileSecurityStatus(context.Context, *UpdateFileSecurityStatusReq) (*UpdateFileSecurityStatusResp, error)
ManualAnti(context.Context, *ManualAntiReq) (*ManualAntiResp, error)
GetFileSecurityStatus(context.Context, *GetFileSecurityStatusReq) (*GetFileSecurityStatusResp, error)
@ -293,9 +284,6 @@ func (UnimplementedFileServer) Usage(context.Context, *UsageReq) (*UsageResp, er
func (UnimplementedFileServer) SecurityScan(context.Context, *SecurityScanReq) (*SecurityScanResp, error) {
return nil, status.Errorf(codes.Unimplemented, "method SecurityScan not implemented")
}
func (UnimplementedFileServer) SecurityScanByText(context.Context, *SecurityScanByTextReq) (*SecurityScanByTextResp, error) {
return nil, status.Errorf(codes.Unimplemented, "method SecurityScanByText not implemented")
}
func (UnimplementedFileServer) UpdateFileSecurityStatus(context.Context, *UpdateFileSecurityStatusReq) (*UpdateFileSecurityStatusResp, error) {
return nil, status.Errorf(codes.Unimplemented, "method UpdateFileSecurityStatus not implemented")
}
@ -737,35 +725,6 @@ func _File_SecurityScan_Handler(srv interface{}, ctx context.Context, dec func(i
return interceptor(ctx, in, info, handler)
}
func _File_SecurityScanByText_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(SecurityScanByTextReq)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("SecurityScanByText", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
func _File_UpdateFileSecurityStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(UpdateFileSecurityStatusReq)
if err := dec(in); err != nil {
@ -912,10 +871,6 @@ var File_ServiceDesc = grpc_go.ServiceDesc{
MethodName: "SecurityScan",
Handler: _File_SecurityScan_Handler,
},
{
MethodName: "SecurityScanByText",
Handler: _File_SecurityScanByText_Handler,
},
{
MethodName: "UpdateFileSecurityStatus",
Handler: _File_UpdateFileSecurityStatus_Handler,

View File

@ -190,9 +190,9 @@ type IsSecFilingExistReq struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
FilingDate string `protobuf:"bytes,1,opt,name=filingDate,proto3" json:"filingDate,omitempty"`
Form string `protobuf:"bytes,2,opt,name=form,proto3" json:"form,omitempty"`
FinalLink string `protobuf:"bytes,3,opt,name=finalLink,proto3" json:"finalLink,omitempty"`
FilingDate string `protobuf:"bytes,1,opt,name=filingDate,proto3" json:"filingDate"`
Form string `protobuf:"bytes,2,opt,name=form,proto3" json:"form"`
FinalLink string `protobuf:"bytes,3,opt,name=finalLink,proto3" json:"finalLink"`
}
func (x *IsSecFilingExistReq) Reset() {
@ -253,7 +253,7 @@ type IsSecFilingExistResp struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Exist bool `protobuf:"varint,1,opt,name=exist,proto3" json:"exist,omitempty"`
Exist bool `protobuf:"varint,1,opt,name=exist,proto3" json:"exist"`
}
func (x *IsSecFilingExistResp) Reset() {
@ -300,8 +300,8 @@ type CommonResp struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"`
FilingKey string `protobuf:"bytes,2,opt,name=filingKey,json=filing_key,proto3" json:"filingKey,omitempty"`
Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg"`
FilingKey string `protobuf:"bytes,2,opt,name=filingKey,json=filing_key,proto3" json:"filingKey"`
}
func (x *CommonResp) Reset() {
@ -355,22 +355,22 @@ type SecFiling struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Idx int32 `protobuf:"varint,1,opt,name=idx,proto3" json:"idx,omitempty"`
FilingKey string `protobuf:"bytes,2,opt,name=filingKey,json=filing_key,proto3" json:"filingKey,omitempty"`
FilingDate string `protobuf:"bytes,3,opt,name=filingDate,json=filing_date,proto3" json:"filingDate,omitempty"`
Form string `protobuf:"bytes,4,opt,name=form,proto3" json:"form,omitempty"`
Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"`
FormDescription string `protobuf:"bytes,6,opt,name=formDescription,json=form_description,proto3" json:"formDescription,omitempty"`
FileLink string `protobuf:"bytes,7,opt,name=fileLink,json=file_link,proto3" json:"fileLink,omitempty"`
DataFiles []*DataFiles `protobuf:"bytes,8,rep,name=dataFiles,json=data_files,proto3" json:"dataFiles,omitempty"`
PdfFile string `protobuf:"bytes,9,opt,name=pdfFile,json=pdf_file,proto3" json:"pdfFile,omitempty"`
WordFile string `protobuf:"bytes,10,opt,name=wordFile,json=word_file,proto3" json:"wordFile,omitempty"`
ExcelFile string `protobuf:"bytes,11,opt,name=excelFile,json=excel_file,proto3" json:"excelFile,omitempty"`
Status int32 `protobuf:"varint,12,opt,name=status,proto3" json:"status,omitempty"`
Operator string `protobuf:"bytes,13,opt,name=operator,proto3" json:"operator,omitempty"`
OperatorId int32 `protobuf:"varint,14,opt,name=operatorId,json=operator_id,proto3" json:"operatorId,omitempty"`
CreatedAt string `protobuf:"bytes,15,opt,name=createdAt,json=created_at,proto3" json:"createdAt,omitempty"`
UpdatedAt string `protobuf:"bytes,16,opt,name=updatedAt,json=updated_at,proto3" json:"updatedAt,omitempty"`
Idx int32 `protobuf:"varint,1,opt,name=idx,proto3" json:"idx"`
FilingKey string `protobuf:"bytes,2,opt,name=filingKey,json=filing_key,proto3" json:"filingKey"`
FilingDate string `protobuf:"bytes,3,opt,name=filingDate,json=filing_date,proto3" json:"filingDate"`
Form string `protobuf:"bytes,4,opt,name=form,proto3" json:"form"`
Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description"`
FormDescription string `protobuf:"bytes,6,opt,name=formDescription,json=form_description,proto3" json:"formDescription"`
FileLink string `protobuf:"bytes,7,opt,name=fileLink,json=file_link,proto3" json:"fileLink"`
DataFiles []*DataFiles `protobuf:"bytes,8,rep,name=dataFiles,json=data_files,proto3" json:"dataFiles"`
PdfFile string `protobuf:"bytes,9,opt,name=pdfFile,json=pdf_file,proto3" json:"pdfFile"`
WordFile string `protobuf:"bytes,10,opt,name=wordFile,json=word_file,proto3" json:"wordFile"`
ExcelFile string `protobuf:"bytes,11,opt,name=excelFile,json=excel_file,proto3" json:"excelFile"`
Status int32 `protobuf:"varint,12,opt,name=status,proto3" json:"status"`
Operator string `protobuf:"bytes,13,opt,name=operator,proto3" json:"operator"`
OperatorId int32 `protobuf:"varint,14,opt,name=operatorId,json=operator_id,proto3" json:"operatorId"`
CreatedAt string `protobuf:"bytes,15,opt,name=createdAt,json=created_at,proto3" json:"createdAt"`
UpdatedAt string `protobuf:"bytes,16,opt,name=updatedAt,json=updated_at,proto3" json:"updatedAt"`
}
func (x *SecFiling) Reset() {
@ -522,8 +522,8 @@ type DataFiles struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"`
FileUrl string `protobuf:"bytes,2,opt,name=fileUrl,json=file_url,proto3" json:"fileUrl,omitempty"`
Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description"`
FileUrl string `protobuf:"bytes,2,opt,name=fileUrl,json=file_url,proto3" json:"fileUrl"`
}
func (x *DataFiles) Reset() {
@ -577,17 +577,17 @@ type CreateSecFilingReq struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
FilingDate string `protobuf:"bytes,1,opt,name=filingDate,proto3" json:"filingDate,omitempty"`
Form string `protobuf:"bytes,2,opt,name=form,proto3" json:"form,omitempty"`
Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
FormDescription string `protobuf:"bytes,4,opt,name=formDescription,proto3" json:"formDescription,omitempty"`
FileLink string `protobuf:"bytes,5,opt,name=fileLink,proto3" json:"fileLink,omitempty"`
DataFiles []*DataFiles `protobuf:"bytes,6,rep,name=dataFiles,proto3" json:"dataFiles,omitempty"`
PdfFile string `protobuf:"bytes,7,opt,name=pdfFile,proto3" json:"pdfFile,omitempty"`
WordFile string `protobuf:"bytes,8,opt,name=wordFile,proto3" json:"wordFile,omitempty"`
ExcelFile string `protobuf:"bytes,9,opt,name=excelFile,proto3" json:"excelFile,omitempty"`
Operator string `protobuf:"bytes,10,opt,name=operator,proto3" json:"operator,omitempty"`
OperatorId int32 `protobuf:"varint,11,opt,name=operatorId,proto3" json:"operatorId,omitempty"`
FilingDate string `protobuf:"bytes,1,opt,name=filingDate,proto3" json:"filingDate"`
Form string `protobuf:"bytes,2,opt,name=form,proto3" json:"form"`
Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description"`
FormDescription string `protobuf:"bytes,4,opt,name=formDescription,proto3" json:"formDescription"`
FileLink string `protobuf:"bytes,5,opt,name=fileLink,proto3" json:"fileLink"`
DataFiles []*DataFiles `protobuf:"bytes,6,rep,name=dataFiles,proto3" json:"dataFiles"`
PdfFile string `protobuf:"bytes,7,opt,name=pdfFile,proto3" json:"pdfFile"`
WordFile string `protobuf:"bytes,8,opt,name=wordFile,proto3" json:"wordFile"`
ExcelFile string `protobuf:"bytes,9,opt,name=excelFile,proto3" json:"excelFile"`
Operator string `protobuf:"bytes,10,opt,name=operator,proto3" json:"operator"`
OperatorId int32 `protobuf:"varint,11,opt,name=operatorId,proto3" json:"operatorId"`
}
func (x *CreateSecFilingReq) Reset() {
@ -704,18 +704,18 @@ type UpdateSecFilingReq struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
FilingKey string `protobuf:"bytes,1,opt,name=filingKey,proto3" json:"filingKey,omitempty"`
Form string `protobuf:"bytes,2,opt,name=form,proto3" json:"form,omitempty"`
Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
FormDescription string `protobuf:"bytes,4,opt,name=formDescription,proto3" json:"formDescription,omitempty"`
FileLink string `protobuf:"bytes,5,opt,name=fileLink,proto3" json:"fileLink,omitempty"`
DataFiles []*DataFiles `protobuf:"bytes,6,rep,name=dataFiles,proto3" json:"dataFiles,omitempty"`
PdfFile string `protobuf:"bytes,7,opt,name=pdfFile,proto3" json:"pdfFile,omitempty"`
WordFile string `protobuf:"bytes,8,opt,name=wordFile,proto3" json:"wordFile,omitempty"`
ExcelFile string `protobuf:"bytes,9,opt,name=excelFile,proto3" json:"excelFile,omitempty"`
Operator string `protobuf:"bytes,10,opt,name=operator,proto3" json:"operator,omitempty"`
OperatorId int32 `protobuf:"varint,11,opt,name=operatorId,proto3" json:"operatorId,omitempty"`
FilingDate string `protobuf:"bytes,12,opt,name=filingDate,proto3" json:"filingDate,omitempty"`
FilingKey string `protobuf:"bytes,1,opt,name=filingKey,proto3" json:"filingKey"`
Form string `protobuf:"bytes,2,opt,name=form,proto3" json:"form"`
Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description"`
FormDescription string `protobuf:"bytes,4,opt,name=formDescription,proto3" json:"formDescription"`
FileLink string `protobuf:"bytes,5,opt,name=fileLink,proto3" json:"fileLink"`
DataFiles []*DataFiles `protobuf:"bytes,6,rep,name=dataFiles,proto3" json:"dataFiles"`
PdfFile string `protobuf:"bytes,7,opt,name=pdfFile,proto3" json:"pdfFile"`
WordFile string `protobuf:"bytes,8,opt,name=wordFile,proto3" json:"wordFile"`
ExcelFile string `protobuf:"bytes,9,opt,name=excelFile,proto3" json:"excelFile"`
Operator string `protobuf:"bytes,10,opt,name=operator,proto3" json:"operator"`
OperatorId int32 `protobuf:"varint,11,opt,name=operatorId,proto3" json:"operatorId"`
FilingDate string `protobuf:"bytes,12,opt,name=filingDate,proto3" json:"filingDate"`
}
func (x *UpdateSecFilingReq) Reset() {
@ -839,7 +839,7 @@ type DetailSecFilingReq struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
FilingKey string `protobuf:"bytes,1,opt,name=filingKey,proto3" json:"filingKey,omitempty"`
FilingKey string `protobuf:"bytes,1,opt,name=filingKey,proto3" json:"filingKey"`
}
func (x *DetailSecFilingReq) Reset() {
@ -886,8 +886,8 @@ type SecFilingDetailResp struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"`
Data *SecFiling `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg"`
Data *SecFiling `protobuf:"bytes,2,opt,name=data,proto3" json:"data"`
}
func (x *SecFilingDetailResp) Reset() {
@ -941,12 +941,12 @@ type ListSecFilingReq struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Page uint32 `protobuf:"varint,1,opt,name=page,proto3" json:"page,omitempty"`
PageSize uint32 `protobuf:"varint,2,opt,name=pageSize,proto3" json:"pageSize,omitempty"`
Form string `protobuf:"bytes,3,opt,name=form,proto3" json:"form,omitempty"`
FilingDateBegin string `protobuf:"bytes,4,opt,name=filingDateBegin,proto3" json:"filingDateBegin,omitempty"`
FilingDateEnd string `protobuf:"bytes,5,opt,name=filingDateEnd,proto3" json:"filingDateEnd,omitempty"`
Status int32 `protobuf:"varint,6,opt,name=status,proto3" json:"status,omitempty"`
Page uint32 `protobuf:"varint,1,opt,name=page,proto3" json:"page"`
PageSize uint32 `protobuf:"varint,2,opt,name=pageSize,proto3" json:"pageSize"`
Form string `protobuf:"bytes,3,opt,name=form,proto3" json:"form"`
FilingDateBegin string `protobuf:"bytes,4,opt,name=filingDateBegin,proto3" json:"filingDateBegin"`
FilingDateEnd string `protobuf:"bytes,5,opt,name=filingDateEnd,proto3" json:"filingDateEnd"`
Status int32 `protobuf:"varint,6,opt,name=status,proto3" json:"status"`
}
func (x *ListSecFilingReq) Reset() {
@ -1028,9 +1028,9 @@ type SecFilingListResp struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"`
Total uint32 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"`
Data []*SecFiling `protobuf:"bytes,3,rep,name=data,proto3" json:"data,omitempty"`
Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg"`
Total uint32 `protobuf:"varint,2,opt,name=total,proto3" json:"total"`
Data []*SecFiling `protobuf:"bytes,3,rep,name=data,proto3" json:"data"`
}
func (x *SecFilingListResp) Reset() {
@ -1233,9 +1233,9 @@ type DeleteSecFilingReq struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
FilingKey string `protobuf:"bytes,1,opt,name=filingKey,proto3" json:"filingKey,omitempty"`
Operator string `protobuf:"bytes,2,opt,name=operator,proto3" json:"operator,omitempty"`
OperatorId int32 `protobuf:"varint,3,opt,name=operatorId,proto3" json:"operatorId,omitempty"`
FilingKey string `protobuf:"bytes,1,opt,name=filingKey,proto3" json:"filingKey"`
Operator string `protobuf:"bytes,2,opt,name=operator,proto3" json:"operator"`
OperatorId int32 `protobuf:"varint,3,opt,name=operatorId,proto3" json:"operatorId"`
}
func (x *DeleteSecFilingReq) Reset() {
@ -1296,10 +1296,10 @@ type UpdateSecFilingStatusReq struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
FilingKey string `protobuf:"bytes,1,opt,name=filingKey,proto3" json:"filingKey,omitempty"`
Status int32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"`
Operator string `protobuf:"bytes,3,opt,name=operator,proto3" json:"operator,omitempty"`
OperatorId int32 `protobuf:"varint,4,opt,name=operatorId,proto3" json:"operatorId,omitempty"`
FilingKey string `protobuf:"bytes,1,opt,name=filingKey,proto3" json:"filingKey"`
Status int32 `protobuf:"varint,2,opt,name=status,proto3" json:"status"`
Operator string `protobuf:"bytes,3,opt,name=operator,proto3" json:"operator"`
OperatorId int32 `protobuf:"varint,4,opt,name=operatorId,proto3" json:"operatorId"`
}
func (x *UpdateSecFilingStatusReq) Reset() {

View File

@ -38,11 +38,4 @@ TelNum = "18021272627"
Password = "Gy.123456"
[service]
IsHTTPS = false
[zapLog]
level = "info"
filename = "logs/fiee_zap.log"
maxsize = 5
maxage = 30
maxbackups = 30
IsHTTPS = false

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -43,6 +43,6 @@ Webhookkey = "whsec_uOQpG6IZTqtfLuePIDtfLCGJPqedSCCN"
[zapLog]
level = "info"
filename = "logs/fiee_zap.log"
maxsize = 5
maxage = 30
maxbackups = 30
max_size = 5
max_age = 30
max_backups = 30

View File

@ -43,6 +43,6 @@ Webhookkey = "whsec_Mol32WD1KcKHUdYsSwap0LR03q2g9qNY"
[zapLog]
level = "info"
filename = "logs/fiee_zap.log"
maxsize = 5
maxage = 30
maxbackups = 30
max_size = 5
max_age = 30
max_backups = 30

View File

@ -19,6 +19,7 @@ BosUrl = ".bj.bcebos.com"
BosBaseDir = "fiee"
BosHttp = "https://"
BosDomain = "cdns.fontree.cn"
[oss]
AccessKeyId = "OSS_AK"
AccessKeySecret = "OSS_SK"
@ -29,7 +30,7 @@ CdnHost = "OSS_CDN"
[redis]
RedisDB = "2"
RedisAddr = "172.16.100.114:6379"
RedisAddr = "svc-fontree-redis-service:6379"
RedisPW = "kP6tW4tS3qB2dW4aE6uI5cX2"
RedisDBNAme = "2"
@ -44,6 +45,6 @@ Webhookkey = "whsec_uOQpG6IZTqtfLuePIDtfLCGJPqedSCCN"
[zapLog]
level = "info"
filename = "logs/fiee_zap.log"
maxsize = 5
maxage = 30
maxbackups = 30
max_size = 5
max_age = 30
max_backups = 30

View File

@ -4,7 +4,7 @@ dubbo:
protocol: zookeeper
timeout: 3s
# address: 121.229.45.214:9004
address: 172.16.100.93:2181
address: zookeeper:2181
# address: 127.0.0.1:2181
# address: 114.218.158.24:2181
consumer:
@ -47,13 +47,6 @@ dubbo:
protocol: tri
retries: 0
interface: com.fontree.microservices.fiee.SecFiling
AyrshareClientImpl:
request-timeout: 1800s
protocol: tri
interface: com.fontree.microservices.fiee.ayrshare
FieeCronClientImpl:
protocol: tri
interface: com.fontree.microservices.fiee.cron
FileClientImpl:
protocol: tri
retries: 0
@ -61,6 +54,13 @@ dubbo:
methods:
- name: SecurityScan
timeout: 120000
AyrshareClientImpl:
request-timeout: 1800s
protocol: tri
interface: com.fontree.microservices.fiee.ayrshare
FieeCronClientImpl:
protocol: tri
interface: com.fontree.microservices.fiee.cron
SupplierClientImpl:
protocol: tri
interface: com.fontree.microservices.common.supplier

1
go.mod
View File

@ -106,6 +106,7 @@ require (
github.com/BurntSushi/toml v1.2.1
github.com/PuerkitoBio/goquery v1.8.1
github.com/disintegration/imaging v1.6.2
github.com/duke-git/lancet/v2 v2.3.8
github.com/envoyproxy/protoc-gen-validate v0.1.0
github.com/fonchain/utils/security v0.0.0-00010101000000-000000000000
github.com/fonchain/utils/voice v0.0.0-00010101000000-000000000000

2
go.sum
View File

@ -258,6 +258,8 @@ github.com/dubbogo/net v0.0.4/go.mod h1:1CGOnM7X3he+qgGNqjeADuE5vKZQx/eMSeUkpU3u
github.com/dubbogo/triple v1.0.9/go.mod h1:1t9me4j4CTvNDcsMZy6/OGarbRyAUSY0tFXGXHCp7Iw=
github.com/dubbogo/triple v1.1.8 h1:yE+J3W1NTZCEPa1FoX+VWZH6UF1c0+A2MGfERlU2zbI=
github.com/dubbogo/triple v1.1.8/go.mod h1:9pgEahtmsY/avYJp3dzUQE8CMMVe1NtGBmUhfICKLJk=
github.com/duke-git/lancet/v2 v2.3.8 h1:dlkqn6Nj2LRWFuObNxttkMHxrFeaV6T26JR8jbEVbPg=
github.com/duke-git/lancet/v2 v2.3.8/go.mod h1:zGa2R4xswg6EG9I6WnyubDbFO/+A/RROxIbXcwryTsc=
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=

View File

@ -244,63 +244,7 @@ var DeDEMessages = map[string]string{
"系统提示:已经发送过,验证码尚可用": "Systemnachricht: Bereits gesendet, Verifizierungscode ist noch verfügbar",
"您的手机号当天发送次数过多,请联系管理员通过密码登录": "Ihre Telefonnummer wurde an diesem Tag zu oft gesendet. Bitte wenden Sie sich an den Administrator, um sich über das Passwort anzumelden",
"您的手机号验证码错误,请确认之后注册": "Ihre Telefonnummer Verifizierungscode ist falsch, bitte bestätigen und registrieren",
"手机号不合法": "Telefonnummer ungültig",
"手机号未更改": "Telefonnummer wurde nicht geändert",
"新手机号过期": "Neue Telefonnummer abgelaufen",
"验证码错误": "Verifizierungscode falsch",
"验证码未发送": "Der Verifizierungscode wurde nicht gesendet",
"账号不存在": "Konto existiert nicht",
"已实名": "In echt",
"实名审核中,请勿重复提交": "Während der Echtheitsprüfung bitte nicht wiederholen",
"用户状态异常,无法进行审核": "Der Benutzer ist abnorm und kann nicht geprüft werden. Verfahren",
"验证码已失效": "Der Verifizierungscode ist ungültig",
"服务器错误": "Serverfehler",
"验证失败,请控制拼图对齐缺口": "Überprüfung fehlgeschlagen, bitte Steuerung Puzzle-Ausrichtungslücke",
"滑块验证状态不存在,请退出重试": "Die krümmbestätigung existiert nicht. Bitte beenden sie den vorgang",
"语言不能为空": "Sprache darf nicht leer sein",
"排序参数需为正整数": "Sortierparameter muss eine positive ganze Zahl sein",
"请先创建中文版本套餐": "Bitte erstelle das Chinese Version-Paket",
"增值服务不存在": "Der Werbeangebot existiert nicht",
"所选增值服务币种与套餐币种不一致": "Die ausgewählte Währung des Werbeangebots stimmt nicht mit der Währung des Pakets überein",
"文件转换失败": "Datei-Umwandlung fehlgeschlagen",
"每种增值服务类型只可选择一个": "Jeder Werbeangebotstyp kann nur einmal ausgewählt werden",
"保存套餐与增值服务关联失败": "Fehler beim Speichern des Pakets mit Werbeangebot",
"删除套餐与增值服务关联失败": "Fehler beim Löschen des Pakets mit Werbeangebot",
"查询套餐与增值服务关联失败": "Fehler beim Abrufen des Pakets mit Werbeangebot",
"更新套餐与增值服务关联失败": "Fehler beim Aktualisieren des Pakets mit Werbeangebot",
"查询增值服务失败": "Fehler beim Abrufen des Werbeangebots",
"更新套餐状态失败": "Fehler beim Aktualisieren des Paketstatus",
"查询增值服务详情失败": "Fehler beim Abrufen der Werbeangebotsdetails",
"序列化转换失败": "Fehler beim Serialisieren",
"保存套餐历史记录失败": "Fehler beim Speichern des Pakethistorie",
"原价不能为空": "Der reguläre Preis darf nicht leer sein",
"原价格式转换失败": "Fehler beim Umwandeln des regulären Preises",
"数量参数需为0-99": "Die Anzahlsmusterparameter muss eine positive ganze Zahl sein",
"优惠单价需小于等于原价": "Der Rabattpreis muss kleiner oder gleich dem regulären Preis sein",
"请先创建中文版本增值服务": "Bitte erstelle das Chinese Version-Werbeangebot",
"保存增值服务失败": "Fehler beim Speichern des Werbeangebots",
"保存增值服务历史记录失败": "Fehler beim Speichern des Werbeangebots-Historie",
"更新增值服务失败": "Fehler beim Aktualisieren des Werbeangebots",
"查询增值服务列表失败": "Fehler beim Abrufen der Werbeangebotsliste",
"计算价格失败": "Fehler beim Berechnen des Preises",
"更新成功": "Aktualisierung erfolgreich",
"保存成功": "Speichern erfolgreich",
"优惠单价转换失败": "Rabatt-Einzelpreisumrechnung fehlgeschlagen",
"符号错误": "Symbolfehler",
"条件存在冲突,请重新设置": "Bedingungskonflikt vorhanden, bitte neu konfigurieren",
"币种已修改,已取消关联部分增值服务": "Währung wurde geändert, einige Mehrwertdienste wurden getrennt",
"币种已修改,已取消关联部分套餐": "Währung wurde geändert, einige Pakete wurden getrennt",
"新增增值服务成功": "Mehrwertdienst erfolgreich hinzugefügt",
"状态值无效": "Ungültiger Statuswert",
"套餐已上架,请勿重复操作": "Paket ist bereits veröffentlicht, bitte nicht wiederholen",
"套餐已下架,请勿重复操作": "Paket ist bereits zurückgezogen, bitte nicht wiederholen",
"请先实名": "Bitte, nur der name",
"实名审核中": "Contest läuft",
"实名审核失败": "Die confirmation hat versagt",
"未知实名状态": "Noch nicht registriert",
// Bundle related messages
"创建增值套餐失败": "Fehler beim Erstellen des Mehrwert-Bundles",
"增值套餐列表查询失败": "Fehler beim Abfragen der Mehrwert-Bundle-Liste",
"增值套餐详情查询失败": "Fehler beim Abfragen der Mehrwert-Bundle-Details",
"保存增值套餐失败": "Fehler beim Speichern des Mehrwert-Bundles",
@ -383,6 +327,61 @@ var DeDEMessages = map[string]string{
"套餐未绑定增值服务": "Bundle nicht an Mehrwertdienst gebunden",
"网络错误": "Netzwerkfehler",
"手机号不合法": "Telefonnummer ungültig",
"手机号未更改": "Telefonnummer wurde nicht geändert",
"新手机号过期": "Neue Telefonnummer abgelaufen",
"验证码错误": "Verifizierungscode falsch",
"验证码未发送": "Der Verifizierungscode wurde nicht gesendet",
"账号不存在": "Konto existiert nicht",
"已实名": "In echt",
"实名审核中,请勿重复提交": "Während der Echtheitsprüfung bitte nicht wiederholen",
"用户状态异常,无法进行审核": "Der Benutzer ist abnorm und kann nicht geprüft werden. Verfahren",
"验证码已失效": "Der Verifizierungscode ist ungültig",
"服务器错误": "Serverfehler",
"验证失败,请控制拼图对齐缺口": "Überprüfung fehlgeschlagen, bitte Steuerung Puzzle-Ausrichtungslücke",
"滑块验证状态不存在,请退出重试": "Die krümmbestätigung existiert nicht. Bitte beenden sie den vorgang",
"语言不能为空": "Sprache darf nicht leer sein",
"排序参数需为正整数": "Sortierparameter muss eine positive ganze Zahl sein",
"请先创建中文版本套餐": "Bitte erstelle das Chinese Version-Paket",
"增值服务不存在": "Der Werbeangebot existiert nicht",
"所选增值服务币种与套餐币种不一致": "Die ausgewählte Währung des Werbeangebots stimmt nicht mit der Währung des Pakets überein",
"文件转换失败": "Datei-Umwandlung fehlgeschlagen",
"每种增值服务类型只可选择一个": "Jeder Werbeangebotstyp kann nur einmal ausgewählt werden",
"保存套餐与增值服务关联失败": "Fehler beim Speichern des Pakets mit Werbeangebot",
"删除套餐与增值服务关联失败": "Fehler beim Löschen des Pakets mit Werbeangebot",
"查询套餐与增值服务关联失败": "Fehler beim Abrufen des Pakets mit Werbeangebot",
"更新套餐与增值服务关联失败": "Fehler beim Aktualisieren des Pakets mit Werbeangebot",
"查询增值服务失败": "Fehler beim Abrufen des Werbeangebots",
"更新套餐状态失败": "Fehler beim Aktualisieren des Paketstatus",
"查询增值服务详情失败": "Fehler beim Abrufen der Werbeangebotsdetails",
"序列化转换失败": "Fehler beim Serialisieren",
"保存套餐历史记录失败": "Fehler beim Speichern des Pakethistorie",
"原价不能为空": "Der reguläre Preis darf nicht leer sein",
"原价格式转换失败": "Fehler beim Umwandeln des regulären Preises",
"数量参数需为0-99": "Die Anzahlsmusterparameter muss eine positive ganze Zahl sein",
"优惠单价需小于等于原价": "Der Rabattpreis muss kleiner oder gleich dem regulären Preis sein",
"请先创建中文版本增值服务": "Bitte erstelle das Chinese Version-Werbeangebot",
"保存增值服务失败": "Fehler beim Speichern des Werbeangebots",
"保存增值服务历史记录失败": "Fehler beim Speichern des Werbeangebots-Historie",
"更新增值服务失败": "Fehler beim Aktualisieren des Werbeangebots",
"查询增值服务列表失败": "Fehler beim Abrufen der Werbeangebotsliste",
"计算价格失败": "Fehler beim Berechnen des Preises",
"更新成功": "Aktualisierung erfolgreich",
"保存成功": "Speichern erfolgreich",
"优惠单价转换失败": "Rabatt-Einzelpreisumrechnung fehlgeschlagen",
"符号错误": "Symbolfehler",
"条件存在冲突,请重新设置": "Bedingungskonflikt vorhanden, bitte neu konfigurieren",
"币种已修改,已取消关联部分增值服务": "Währung wurde geändert, einige Mehrwertdienste wurden getrennt",
"币种已修改,已取消关联部分套餐": "Währung wurde geändert, einige Pakete wurden getrennt",
"新增增值服务成功": "Mehrwertdienst erfolgreich hinzugefügt",
"状态值无效": "Ungültiger Statuswert",
"套餐已上架,请勿重复操作": "Paket ist bereits veröffentlicht, bitte nicht wiederholen",
"套餐已下架,请勿重复操作": "Paket ist bereits zurückgezogen, bitte nicht wiederholen",
"请先实名": "Bitte, nur der name",
"实名审核中": "Contest läuft",
"实名审核失败": "Die confirmation hat versagt",
"未知实名状态": "Noch nicht registriert",
// Website report related messages
"创建官网报告失败": "Fehler beim Erstellen des Website-Berichts",
"删除官网报告失败": "Fehler beim Löschen des Website-Berichts",
@ -463,7 +462,6 @@ var JaJPMessages = map[string]string{
"请先创建中文版本套餐": "最初に中国語バージョンのパッケージを作成してください",
"增值服务不存在": "付加サービスは存在しません",
"所选增值服务币种与套餐币种不一致": "選択した付加サービスの通貨とパッケージの通貨が一致しません",
"文件转换失败": "ファイル変換に失敗しました",
"每种增值服务类型只可选择一个": "各種付加サービスタイプは一つしか選択できません",
"保存套餐与增值服务关联失败": "パッケージと付加サービスの関連付けの保存に失敗しました",
"删除套餐与增值服务关联失败": "パッケージと付加サービスの関連付けの削除に失敗しました",
@ -618,17 +616,6 @@ var ZhTWMessages = map[string]string{
"删除套餐信息失败": "刪除套餐信息失敗",
"删除套餐信息成功": "刪除套餐信息成功",
"获取套餐信息失败": "獲取套餐信息失敗",
"创建订单信息失败": "創建訂單信息失敗",
"创建订单信息成功": "創建訂單信息成功",
"更新订单信息失败": "更新訂單信息失敗",
"更新订单信息成功": "更新訂單信息成功",
"获取订单信息失败": "獲取訂單信息失敗",
"获取订单列表失败": "獲取訂單列表失敗",
"缺少套餐UUID": "缺少套餐UUID",
"缺少客户签名信息": "缺少客戶簽名信息",
"插入签名失败": "插入簽名失敗",
"缺少订单号": "缺少訂單號",
"缺少订单信息": "缺少訂單信息",
"非当前用户订单信息不可操作": "非當前用戶訂單信息不可操作",
"订单已支付": "訂單已支付",
"您已购买过套餐,无法再次购买": "您已購買過套餐,無法再次購買",
@ -722,7 +709,6 @@ var ZhTWMessages = map[string]string{
"创建套餐失败": "創建套餐失敗",
"更新套餐失败": "更新套餐失敗",
"删除套餐失败": "刪除套餐失敗",
"套餐列表查询失败": "套餐列表查詢失敗",
"套餐详情查询失败": "套餐詳情查詢失敗",
"更新套餐上下架失败": "更新套餐上下架失敗",
"根据订单号查询增值套餐失败": "根據訂單號查詢增值套餐失敗",
@ -794,7 +780,6 @@ var ZhTWMessages = map[string]string{
"未知增值服务": "未知增值服務",
"套餐未绑定增值服务": "套餐未綁定增值服務",
"网络错误": "網絡錯誤",
// Website report related messages
"创建官网报告失败": "創建官網報告失敗",
"删除官网报告失败": "刪除官網報告失敗",

View File

@ -14,7 +14,6 @@ import (
"fonchain-fiee/pkg/service"
"fonchain-fiee/pkg/service/bundle/common"
serverCast "fonchain-fiee/pkg/service/cast"
"fonchain-fiee/pkg/utils/stime"
"log"
"math/rand"
"strconv"
@ -28,10 +27,10 @@ import (
// InitTasks 初始化定时任务
func InitTasks() error {
cm := GetCronManager()
err := cm.AddTask("refreshWorkApprovalStatus", "0 */5 * * * *", RefreshApprovalStatusTask)
err := cm.AddTask("refreshWorkApprovalStatus", "0 */5 * * * *", RefreshWorkApprovalStatusTask)
err = cm.AddTask("artistAutoConfirm", "0 */1 * * * *", ArtistAutoConfirmTask)
err = cm.AddTask("refreshPublishStatus", "0 */5 * * * *", PublishTask)
err = cm.AddTask("scheduledPublish", "0 */1 * * * *", ScheduledPublishTask) //FIXME
err = cm.AddTask("scheduledPublish", "0 */1 * * * *", ScheduledPublishTask) //FIXME正式30分钟一次
err = cm.AddTask("artistAutoConfirmAnalysis", "0 */1 * * * *", ArtistAutoConfirmAnalysisTask)
err = cm.AddTask("refreshWorkAnalysisApprovalStatus", "0 */5 * * * *", RefreshWorkAnalysisApprovalStatusTask)
@ -39,6 +38,9 @@ func InitTasks() error {
err = cm.AddTask("refreshCompetitiveReportApprovalStatus", "0 */5 * * * *", RefreshCompetitiveReportApprovalStatusTask)
err = cm.AddTask("refreshArtistOrder", "0 */5 * * * *", RefreshArtistOrderTask)
//余量表每月1号更新定时任务
err = cm.AddTask("updateBundleBalance", "0 0 0 1 * *", UpdateBundleBalance)
// 每天 00:30 和 12:30 执行 Ayrshare 指标采集任务
// err = cm.AddTask("ayrshareMetricsCollector", "0 30 0,12 * * *", AyrshareMetricsCollectorTask)
err = cm.AddTask("ayrshareMetricsCollector", "0 30 0 * * *", AyrshareMetricsCollectorTask)
@ -59,12 +61,6 @@ func InitTasks() error {
return nil
}
func RefreshApprovalStatusTask() {
go RefreshWorkApprovalStatusTask()
go RefreshScriptApprovalStatusTask()
}
// RefreshWorkApprovalStatusTask 刷新作品审批状态任务
func RefreshWorkApprovalStatusTask() {
resp, err := service.CastProvider.WorkList(context.Background(), &cast.WorkListReq{
Page: 1,
@ -81,50 +77,6 @@ func RefreshWorkApprovalStatusTask() {
serverCast.RefreshWorkApproval(nil, resp.Data)
}
// RefreshScriptApprovalStatusTask 刷新脚本审批状态任务
func RefreshScriptApprovalStatusTask() {
resp, err := service.CastProvider.ListVideoScripts(context.Background(), &cast.ListVideoScriptsReq{
Status: 2,
Page: 1,
PageSize: 9999,
})
if err != nil {
log.Printf("获取工作列表失败: %v", err)
return
}
if resp.Data == nil || len(resp.Data) == 0 {
return
}
var approvalIds []int
for _, v := range resp.Data {
if v.ApprovalID == "" {
continue
}
id, _ := strconv.ParseInt(v.ApprovalID, 10, 64)
approvalIds = append(approvalIds, int(id))
}
var data map[int]modelCast.Item
castService := new(serverCast.CastService)
data, err = castService.ApprovalDetail(approvalIds)
if err != nil {
return
}
for approvalID, v := range data {
var scriptReq cast.UpdateScriptStatusReq
scriptReq.ApprovalID = fmt.Sprint(approvalID)
uTimes, _ := stime.DatetimeToTimes(v.UpdatedAt, "2006-01-02 15:04:05")
if v.Status == 2 && int64(uTimes) <= time.Now().Unix() {
scriptReq.WorkAction = cast.WorkActionENUM_APPROVAL_PASS
}
if v.Status == 3 {
scriptReq.WorkAction = cast.WorkActionENUM_APPROVAL_REJECT
}
scriptReq.ApprovalReply = v.Reply
scriptReq.ApprovalTime = v.UpdatedAt
_, _ = service.CastProvider.UpdateScriptStatus(context.Background(), &scriptReq)
}
}
// AutoManuallyConfirmWorkTaskWithRandomInterval 以随机间隔3-7分钟执行自动确认任务
func AutoManuallyConfirmWorkTaskWithRandomInterval() {
@ -199,11 +151,10 @@ func AutoManuallyConfirmWorkTask() {
if balanceInfoRes.BundleStatus == common.BundleExpired {
_, err = service.CastProvider.UpdateStatus(context.Background(), &cast.UpdateStatusReq{
WorkAction: cast.WorkActionENUM_CONFIRM,
WorkUuid: req.WorkUuid,
ConfirmRemark: req.ConfirmRemark,
ConfirmStatus: 3,
ConfirmFailType: cast.ConfirmFailENUM_ConfirmFailENUM_EXPIRED,
WorkAction: cast.WorkActionENUM_CONFIRM,
WorkUuid: req.WorkUuid,
ConfirmRemark: req.ConfirmRemark,
ConfirmStatus: 3,
})
log.Printf("套餐已过期,作品uuid:"+req.WorkUuid, zap.Error(err))
continue
@ -222,11 +173,10 @@ func AutoManuallyConfirmWorkTask() {
//订单号不相同
//新购买的,直接扣除失败
_, err = service.CastProvider.UpdateStatus(context.Background(), &cast.UpdateStatusReq{
WorkAction: cast.WorkActionENUM_CONFIRM,
WorkUuid: req.WorkUuid,
ConfirmRemark: req.ConfirmRemark,
ConfirmStatus: 3,
ConfirmFailType: cast.ConfirmFailENUM_ConfirmFailENUM_EXPIRED,
WorkAction: cast.WorkActionENUM_CONFIRM,
WorkUuid: req.WorkUuid,
ConfirmRemark: req.ConfirmRemark,
ConfirmStatus: 3,
})
log.Printf("订单号不相同,作品uuid:"+req.WorkUuid, zap.Error(err))
continue
@ -246,11 +196,10 @@ func AutoManuallyConfirmWorkTask() {
{
if balanceInfoRes.ImageExtendConsumptionNumber >= balanceInfoRes.ImageExtendNumber { // 图文余量不足
_, err = service.CastProvider.UpdateStatus(context.Background(), &cast.UpdateStatusReq{
WorkAction: cast.WorkActionENUM_CONFIRM,
WorkUuid: req.WorkUuid,
ConfirmRemark: req.ConfirmRemark,
ConfirmStatus: 3,
ConfirmFailType: cast.ConfirmFailENUM_ConfirmFailENUM_NOTENOUGH,
WorkAction: cast.WorkActionENUM_CONFIRM,
WorkUuid: req.WorkUuid,
ConfirmRemark: req.ConfirmRemark,
ConfirmStatus: 3,
})
log.Printf("图文余量不足,作品uuid:"+req.WorkUuid, zap.Error(err))
continue
@ -261,11 +210,10 @@ func AutoManuallyConfirmWorkTask() {
{
if balanceInfoRes.VideoExtendConsumptionNumber >= balanceInfoRes.VideoExtendNumber { // 视频余量不足
_, err = service.CastProvider.UpdateStatus(context.Background(), &cast.UpdateStatusReq{
WorkAction: cast.WorkActionENUM_CONFIRM,
WorkUuid: req.WorkUuid,
ConfirmRemark: req.ConfirmRemark,
ConfirmStatus: 3,
ConfirmFailType: cast.ConfirmFailENUM_ConfirmFailENUM_NOTENOUGH,
WorkAction: cast.WorkActionENUM_CONFIRM,
WorkUuid: req.WorkUuid,
ConfirmRemark: req.ConfirmRemark,
ConfirmStatus: 3,
})
log.Printf("视频余量不足,作品uuid:"+req.WorkUuid, zap.Error(err))
continue
@ -352,6 +300,28 @@ func RefreshPublishStatusTask() {
//zap.L().Info("刷新发布状态成功")
}
func ArtistAutoConfirmAnalysisTask() {
now := float64(time.Now().Unix())
opt := redis.ZRangeBy{
Min: fmt.Sprintf("%d", 0),
Max: fmt.Sprintf("%f", now),
}
analysisUuids, err := cache.RedisClient.ZRangeByScore(modelCast.AutoConfirmAnalysisQueueKey, opt).Result()
if err != nil {
zap.L().Error("获取到期数据分析任务失败", zap.Error(err))
return
}
if len(analysisUuids) == 0 {
zap.L().Debug("没有到期的数据分析任务")
return
}
zap.L().Info("发现到期数据分析任务", zap.Int("count", len(analysisUuids)))
for _, analysisUuid := range analysisUuids {
serverCast.ProcessAnalysisTask(context.Background(), analysisUuid)
}
}
// ScheduledPublishTask 定时发布任务从Redis Sorted Set中获取所有workUuid并根据score判断处理
// PublishTask 定时发布任务从Redis Sorted Set中获取所有workUuid并根据score判断处理
func PublishTask() {
go RefreshPublishStatusTask() // 刷新发布状态
@ -625,25 +595,8 @@ func processBatchWorkPublishQueueData(batchData []string) error {
return nil
}
func ArtistAutoConfirmAnalysisTask() {
now := float64(time.Now().Unix())
opt := redis.ZRangeBy{
Min: fmt.Sprintf("%d", 0),
Max: fmt.Sprintf("%f", now),
}
analysisUuids, err := cache.RedisClient.ZRangeByScore(modelCast.AutoConfirmAnalysisQueueKey, opt).Result()
if err != nil {
zap.L().Error("获取到期数据分析任务失败", zap.Error(err))
return
}
if len(analysisUuids) == 0 {
zap.L().Debug("没有到期的数据分析任务")
return
}
zap.L().Info("发现到期数据分析任务", zap.Int("count", len(analysisUuids)))
for _, analysisUuid := range analysisUuids {
serverCast.ProcessAnalysisTask(context.Background(), analysisUuid)
}
func UpdateBundleBalance() {
service.BundleProvider.UpdateBundleBalance(context.Background(), &bundle.UpdateBundleBalanceReq{})
}
func ArtistAutoConfirmReportTask() {

View File

@ -1,7 +1,6 @@
package cast
import (
"fmt"
"fonchain-fiee/api/cast"
modelCast "fonchain-fiee/pkg/model/cast"
"strings"
@ -103,44 +102,3 @@ func (w *Work) ExportExcelWorkList(data []*cast.WorkListResp_Info) (*excelize.Fi
return f, nil
}
func (w *Work) ExportPublishLogList(data []*cast.PublishLogInfo, savePath string) error {
f := excelize.NewFile()
defer f.Close()
sheetName := "Sheet1"
f.SetSheetName("Sheet1", sheetName)
headers := []string{
"状态", "失败原因", "提交发布时间", "发布平台", "发布方式", "作品类型", "作品标题", "艺人", "用户编号",
}
for col, h := range headers {
cell, _ := excelize.CoordinatesToCellName(col+1, 1)
f.SetCellValue(sheetName, cell, h)
}
for rowIndex, info := range data {
row := rowIndex + 2
platformName := modelCast.PlatformNameKv[info.PlatformID]
if platformName == "" {
platformName = fmt.Sprintf("%d", info.PlatformID)
}
values := []interface{}{
modelCast.PublishStatusMM[int(info.PublishMediaStatus)],
info.Detail,
info.CreatedAt,
modelCast.PlatformNameKv[info.PlatformID],
modelCast.PublishSourceMM[int(info.PublishSource)],
modelCast.WorkCategoryMM[int(info.WorkCategory)],
info.Title,
info.ArtistName,
info.ArtistSubNum,
}
for col, v := range values {
cell, _ := excelize.CoordinatesToCellName(col+1, row)
f.SetCellValue(sheetName, cell, v)
}
}
return f.SaveAs(savePath)
}

View File

@ -163,7 +163,6 @@ func CheckWebLogin(provider *account.AccountClientImpl) gin.HandlerFunc {
Domain: info.Domain,
ID: info.ID,
Name: info.NickName,
//Account: info.Account,
//NickName: info.NickName,
//PositionUsers: qres.PositionUsers,
//Extend: infoRes.Info.Extend,

View File

@ -23,7 +23,6 @@ const (
AutoConfirmReportQueueKey = "auto_confirm:report:queue"
AutoConfirmReportLockKey = "auto_confirm:report:lock:%s"
// AyrshareMetricsCollectorLockKey Ayrshare 指标采集任务锁
AyrshareMetricsCollectorLockKey = "ayrshare:metrics:collector:lock"
)
@ -32,18 +31,6 @@ var WorkCategoryMM = map[int]string{
1: "图文",
2: "视频",
}
var PublishSourceMM = map[int]string{
1: "手动发布",
2: "定时任务",
3: "手动发布",
}
var PublishStatusMM = map[int]string{
1: "进行中",
2: "发布成功",
3: "发布失败",
4: "发布异常",
}
var WorkCostTypeMM = map[int]string{
1: "套餐",
@ -67,7 +54,7 @@ var WorkStatusMM = map[int]string{
6: "发布成功",
7: "发布失败",
8: "未知",
9: "验确认",
9: "验确认",
}
var ConfirmTypeMM = map[int]string{
1: "艺人确认",

View File

@ -31,10 +31,6 @@ func AnalysisRouter(r *gin.RouterGroup) {
analysis.POST("artist-metrics-single", serviceCast.ArtistMetricsDailyWindow) // 艺人指标日窗口
analysis.POST("tobe-confirmed-list", serviceCast.TobeConfirmedList) // 待确认数据列表
analysis.POST("update-approval-id", serviceCast.UpdateWorkAnalysisApprovalID) // 更新作品分析审批ID
analysis.POST("update-pdf-url", serviceCast.UpdateWorkAnalysisPdfUrl) // 更新作品分析PDF链接
// 刷数据专用的导入接口
analysis.POST("import-batch", serviceCast.ImportWorkAnalysisBatch) // Excel 批量导入数据分析
analysis.POST("trigger-ayrshare-metrics", serviceCast.TriggerAyrshareMetricsCollector) // 手动触发 Ayrshare 指标采集任务
}
@ -53,10 +49,6 @@ func AnalysisRouter(r *gin.RouterGroup) {
competitiveReport.POST("count-by-work-uuids", serviceCast.CountCompetitiveReportByWorkUuids) // 根据作品UUID统计竞品报告数量
competitiveReport.POST("export-list", serviceCast.ListCompetitiveReportExport) // 竞品报告列表导出
competitiveReport.POST("export-single-list", serviceCast.ListCompetitiveReportSingleExport) // 竞品报告单个列表导出
competitiveReport.POST("import-pdf-batch", serviceCast.ImportPdfBatch) // 批量导入PDF下载、重命名、上传
// 刷竞品报告专用的导入接口
competitiveReport.POST("import-history-batch", serviceCast.ImportCompetitiveReportHistoryBatch) // Excel 批量刷写竞品报告历史数据
}
// 员工任务相关路由需要App登录验证

View File

@ -20,9 +20,6 @@ func BundleRouter(r *gin.RouterGroup) {
{
bundleClientNoAuthRoute.POST("export/work-cast-info", bundle.ExportWorkCastInfo)
bundleClientNoAuthRoute.POST("export/bundle-price-info", bundle.ExportBundlePriceInfo)
bundleClientNoAuthRoute.POST("survey/is-send", bundle.IsSendSurvey)
bundleClientNoAuthRoute.POST("survey/bundleInfo", bundle.QuestionnaireSurveyBundleInfo)
bundleClientNoAuthRoute.POST("survey/create", bundle.QuestionnaireSurveyCreate)
}
bundleClientRoute := bundleRoute.Group("system")
{
@ -58,10 +55,6 @@ func BundleRouter(r *gin.RouterGroup) {
metrics.POST("export/balance-detail", bundle.MetricsBalanceDetailExport)
metrics.POST("export/balance-metrics", bundle.BalanceMetricsExport)
}
survey := bundleClientRoute.Group("survey")
{
survey.POST("list", bundle.QuestionnaireSurveyList)
}
}
bundleClientRouteV2 := bundleRoute.Group("system/v2")

View File

@ -22,7 +22,6 @@ func BundleOrderRouter(r *gin.RouterGroup) {
// 套餐
{
bundleOrderNoAuthRoute.POST("common/web/no-auth/reconciliation-list-download", bundle.GetReconciliationListDownload)
bundleOrderNoAuthRoute.POST("common/web/no-auth/creat-invoice", bundle.CreatInvoice)
bundleOrderClientWebRoute := bundleOrderWebRoute.Group("common/web")
{
bundleOrderClientWebRoute.POST("bundle-order-list", bundle.OrderRecordsList)
@ -48,7 +47,6 @@ func BundleOrderRouter(r *gin.RouterGroup) {
bundleOrderClientAppRoute.POST("invoice-express-info", bundle.GetInvoiceExpressInfo)
bundleOrderClientAppRoute.POST("invoice-list", bundle.GetInvoiceList)
bundleOrderClientAppRoute.GET("country-list", bundle.GetCountryList)
bundleOrderClientAppRoute.POST("download-invoice", bundle.CreateDownloadInvoice)
}
//bundleOrderWebRoute := bundleOrderRoute.Group("web")

View File

@ -50,13 +50,6 @@ func MediaRouter(r *gin.RouterGroup) {
work.POST("import-batch", serviceCast.ImportWorkBatch)
work.POST("list-published", serviceCast.WorkListPublished)
work.POST("update-work-script", serviceCast.UpdateWorkScript)
work.POST("publish-log-list", serviceCast.PublishLogList)
work.Any("publish-log-list-export", serviceCast.PublishLogListExport)
}
workNoAuth := noAuth.Group("work")
{
workNoAuth.POST("cron-republish", serviceCast.CronRePublish)
}
script := auth.Group("script")

View File

@ -68,15 +68,14 @@ func NewRouter() *gin.Engine {
}
//账号模块
{
privateGroup.POST("user/register", account.UserRegister) //h5注册登录
privateGroup.POST("user/login", account.UserLogin) //后台登录
privateGroup.POST("user/send", account.SendMsg) //发送验证码
privateGroup.POST("user/send/no-slider", account.SendMsgNoSlider) //发送验证码(不验证滑块)
privateGroup.POST("user/logout", account.UserLogout) //登出
privateGroup.POST("user/check/msg", account.CheckMsg) //校验验证码
privateGroup.POST("generate/captcha", account.GenerateCaptcha) //生成滑块验证码
privateGroup.POST("validate/captcha", account.ValidateCaptcha) //验证滑块验证码
privateGroup.POST("check/register", account.CheckRegister) //校验是否注册
privateGroup.POST("user/register", account.UserRegister) //h5注册登录
privateGroup.POST("user/login", account.UserLogin) //后台登录
privateGroup.POST("user/send", account.SendMsg) //发送验证码
privateGroup.POST("user/logout", account.UserLogout) //登出
privateGroup.POST("user/check/msg", account.CheckMsg) //校验验证码
privateGroup.POST("generate/captcha", account.GenerateCaptcha) //生成滑块验证码
privateGroup.POST("validate/captcha", account.ValidateCaptcha) //验证滑块验证码
privateGroup.POST("check/register", account.CheckRegister) //校验是否注册
acRoute := privateGroup.Group("/user")
acRoute.Use(middleware.CheckLogin(service.AccountFieeProvider))
{

View File

@ -50,9 +50,6 @@ func TaskBenchRouter(r *gin.RouterGroup) {
// 员工完成视频脚本带任务UUID
taskBenchRoute.POST("update-script-with-task-uuid", taskbench.UpdateVideoScriptWithUUID)
taskBenchRoute.POST("create-analysis-with-task-uuid", taskbench.CreateWorkAnalysisWithTaskUUID)
taskBenchRoute.POST("create-report-with-task-uuid", taskbench.CreateCompetitiveReportWithTaskUUID)
// 根据登录人信息查询被指派给该员工的任务
taskBenchRoute.POST("assigned-tasks", taskbench.GetEmployeeAssignedTasks)
@ -70,9 +67,6 @@ func TaskBenchRouter(r *gin.RouterGroup) {
// 查询待指派数据
taskBenchRoute.POST("pending-data-list", taskbench.GetPendingAssign)
// 查询指派任务中已完成任务
taskBenchRoute.POST("completed-list", taskbench.GetTaskWorkLogListItems)
}
}

View File

@ -15,7 +15,6 @@ import (
"fonchain-fiee/pkg/utils"
"io/ioutil"
"net/http"
"strings"
"time"
"github.com/fonchain_enterprise/utils/baidu"
@ -278,40 +277,6 @@ func dd(dateStr string) string {
}
func isValidMainlandID(id string) bool {
id = strings.TrimSpace(strings.ToUpper(id))
if len(id) != 18 {
return false
}
for i := 0; i < 17; i++ {
if id[i] < '0' || id[i] > '9' {
return false
}
}
last := id[17]
if (last < '0' || last > '9') && last != 'X' {
return false
}
birthday := id[6:14]
birthTime, err := time.Parse("20060102", birthday)
if err != nil {
return false
}
if birthTime.After(time.Now()) {
return false
}
weights := []int{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}
checkMap := "10X98765432"
sum := 0
for i := 0; i < 17; i++ {
sum += int(id[i]-'0') * weights[i]
}
checkCode := checkMap[sum%11]
return byte(checkCode) == last
}
// SendMsg 用户发送验证码
func SendMsg(c *gin.Context) {
var req account.SendMsgRequest
@ -413,54 +378,6 @@ func SendMsg(c *gin.Context) {
//}
}
// 用户发送验证码(不验证滑块)
func SendMsgNoSlider(c *gin.Context) {
var req account.SendMsgRequest
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
service.Error(c, err)
return
}
req.Project = "fiee"
req.TelNum = req.Zone + req.TelNum
//todo 审核使用账号
if req.TelNum == "8618888888888" {
service.Success1(c, "发送成功", &account.SendMsgStatusResponse{})
return
}
if req.Zone != e.ZoneCn && req.Zone != "" {
// ============================== redis检查ip开始
ip := c.ClientIP()
fmt.Println("当前ip", ip, ";手机号:", req.TelNum, ";domain", req.Domain)
tempReq := &account.SendNationMsgRequest{
Domain: req.Domain,
TelNum: req.TelNum,
Project: req.Project,
SignNo: req.SignNo,
MId: req.MId,
Scope: req.Scope,
}
res, err := service.AccountFieeProvider.SendNationMsg(context.Background(), tempReq)
if err != nil {
service.Error(c, err)
return
}
service.Success1(c, "发送成功", res)
return
} else {
res, err := service.AccountFieeProvider.SendMsg(context.Background(), &req)
if err != nil {
service.Error(c, err)
return
}
service.Success1(c, "发送成功", res)
return
}
}
func RealName(c *gin.Context) {
var req account.RealNameRequest
@ -471,14 +388,12 @@ func RealName(c *gin.Context) {
user := login.GetUserInfoFromC(c)
req.Id = user.ID
if req.DocumentType == 2 {
if req.Nationality == "中国大陆" {
if !isValidMainlandID(req.IdNumber) {
service.Error(c, errors.New("身份证号格式错误"))
return
}
if len(req.IdNumber) != 18 {
service.Error(c, errors.New("身份证号格式错误"))
return
}
} else {
if strings.TrimSpace(req.IdNumber) == "" {
if req.IdNumber == "" {
service.Error(c, errors.New("证件号码不能为空"))
return
}
@ -505,8 +420,7 @@ func CheckMsg(c *gin.Context) {
req.TelNum = req.Zone + req.TelNum
res, err := service.AccountFieeProvider.CheckMsg(context.Background(), &req)
if err != nil {
fmt.Println("CheckMsg error:", err)
service.Error(c, errors.New("验证码错误"))
service.Error(c, err)
return
}

View File

@ -1,7 +1,6 @@
package ai
import (
"encoding/json"
"errors"
"fmt"
"fonchain-fiee/pkg/common/qwen"
@ -38,7 +37,7 @@ func AIVideoVL(ctx *gin.Context) {
return
}
Prompt := "请你详细描述视频和图片中的内容分别是什么,包括画面内容、人物动作、场景等。如果有配乐或背景音乐,请详细描述配乐的节奏、风格和情感特点"
Prompt := "请你详细描述视频和图片中的内容分别是什么"
// 调用VL函数进行AI理解
result, err := qwen.VL(req.Videos, req.Images, Prompt, req.Model)
@ -71,183 +70,10 @@ type CompetitorReportRequest struct {
Model string `json:"model"` // 可选的模型名称,默认使用 qwen3-vl-plus
}
// CompetitorReportData 竞品报告数据(用于返回给前端)
type CompetitorReportData struct {
HighlightAnalysis HighlightAnalysisData `json:"highlight_analysis"`
DataPerformance DataPerformanceData `json:"data_performance_analysis"`
OverallSummary string `json:"overall_summary_and_optimization"`
}
type HighlightAnalysisData struct {
Summary string `json:"summary"`
Points PointsData `json:"points"`
}
type PointsData struct {
Theme string `json:"theme"`
Narrative string `json:"narrative"`
Content string `json:"content"`
Copywriting string `json:"copywriting"`
Data string `json:"data"`
Music string `json:"music,omitempty"`
}
type DataPerformanceData struct {
Views string `json:"views"`
Completion string `json:"completion_rate,omitempty"`
Engagement string `json:"engagement"`
}
// CompetitorReportResponse 竞品报告响应数据
type CompetitorReportResponse struct {
ImageURL string `json:"image_url,omitempty"` // 生成的图片URL1024*1024非必须返回
Text string `json:"text,omitempty"` // 竞品报告文本内容,非必须返回
JsonData *CompetitorReportData `json:"json_data,omitempty"` // 竞品报告JSON数据
}
// CompetitorReportJSON AI返回的JSON结构
type CompetitorReportJSON struct {
HighlightAnalysis HighlightAnalysis `json:"highlight_analysis"`
DataPerformance DataPerformance `json:"data_performance_analysis"`
OverallSummary string `json:"overall_summary_and_optimization"`
}
type HighlightAnalysis struct {
Summary string `json:"summary"`
Points Points `json:"points"`
}
type Points struct {
Theme string `json:"theme"`
Narrative string `json:"narrative"`
Content string `json:"content"`
Copywriting string `json:"copywriting"`
Data string `json:"data"`
Music string `json:"music,omitempty"`
}
type DataPerformance struct {
Views string `json:"views"`
Completion string `json:"completion_rate,omitempty"`
Engagement string `json:"engagement"`
}
// convertJSONToText 将 JSON 转换为纯文本格式
func convertJSONToText(data CompetitorReportJSON, isVideo bool) string {
var sb strings.Builder
// 一、亮点表现分析
sb.WriteString("一、亮点表现分析\n")
sb.WriteString(data.HighlightAnalysis.Summary)
sb.WriteString("\n\n")
sb.WriteString("1. 标题亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Theme)
sb.WriteString("\n")
sb.WriteString("2. 题材亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Narrative)
sb.WriteString("\n")
sb.WriteString("3. 内容亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Content)
sb.WriteString("\n")
sb.WriteString("4. 文案亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Copywriting)
sb.WriteString("\n")
sb.WriteString("5. 数据亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Data)
sb.WriteString("\n")
if isVideo && data.HighlightAnalysis.Points.Music != "" {
sb.WriteString("6. 配乐亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Music)
sb.WriteString("\n")
}
// 二、数据表现分析
sb.WriteString("\n二、数据表现分析\n")
sb.WriteString("1. 浏览量表现:")
sb.WriteString(data.DataPerformance.Views)
sb.WriteString("\n")
if isVideo && data.DataPerformance.Completion != "" {
sb.WriteString("2. 完播率表现:")
sb.WriteString(data.DataPerformance.Completion)
sb.WriteString("\n")
sb.WriteString("3. 点赞/分享/评论表现:")
} else {
sb.WriteString("2. 点赞/分享/评论表现:")
}
sb.WriteString(data.DataPerformance.Engagement)
sb.WriteString("\n")
// 三、整体总结及可优化建议
sb.WriteString("\n三、整体总结及可优化建议\n")
sb.WriteString(data.OverallSummary)
return sb.String()
}
// convertJSONToTextFromData 将 JSON 转换为纯文本格式(使用新的 CompetitorReportData 结构)
func convertJSONToTextFromData(data CompetitorReportData, isVideo bool) string {
var sb strings.Builder
// 一、亮点表现分析
sb.WriteString("一、亮点表现分析\n")
sb.WriteString(data.HighlightAnalysis.Summary)
sb.WriteString("\n\n")
sb.WriteString("1. 标题亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Theme)
sb.WriteString("\n")
sb.WriteString("2. 题材亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Narrative)
sb.WriteString("\n")
sb.WriteString("3. 内容亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Content)
sb.WriteString("\n")
sb.WriteString("4. 文案亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Copywriting)
sb.WriteString("\n")
sb.WriteString("5. 数据亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Data)
sb.WriteString("\n")
if isVideo && data.HighlightAnalysis.Points.Music != "" {
sb.WriteString("6. 配乐亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Music)
sb.WriteString("\n")
}
// 二、数据表现分析
sb.WriteString("\n二、数据表现分析\n")
sb.WriteString("1. 浏览量表现:")
sb.WriteString(data.DataPerformance.Views)
sb.WriteString("\n")
if isVideo && data.DataPerformance.Completion != "" {
sb.WriteString("2. 完播率表现:")
sb.WriteString(data.DataPerformance.Completion)
sb.WriteString("\n")
sb.WriteString("3. 点赞/分享/评论表现:")
} else {
sb.WriteString("2. 点赞/分享/评论表现:")
}
sb.WriteString(data.DataPerformance.Engagement)
sb.WriteString("\n")
// 三、整体总结及可优化建议
sb.WriteString("\n三、整体总结及可优化建议\n")
sb.WriteString(data.OverallSummary)
return sb.String()
ImageURL string `json:"image_url,omitempty"` // 生成的图片URL1024*1024非必须返回
Text string `json:"text,omitempty"` // 竞品报告文本内容,非必须返回
}
// AICompetitorReport 生成竞品报告接口
@ -275,7 +101,7 @@ func AICompetitorReport(ctx *gin.Context) {
}
// 第一步调用AI理解视频/图片内容
vlPrompt := "请你详细描述这些视频或者这些图片中的内容分别是什么,请详细描述,不要遗漏任何细节。如果有配乐或背景音乐,请详细描述配乐的节奏、风格和情感特点"
vlPrompt := "请你详细描述这些视频或者这些图片中的内容分别是什么,请详细描述,不要遗漏任何细节"
vlResult, err := qwen.VL(req.Videos, req.Images, vlPrompt, req.Model)
if err != nil {
// 检查是否是文件下载超时错误(内容过大)
@ -317,43 +143,8 @@ func AICompetitorReport(ctx *gin.Context) {
if needText {
textChan = make(chan textResult, 1)
go func() {
// 根据是否有视频来判断作品类型
isVideo := len(req.Videos) > 0
// 构建文本生成提示词:理解内容 + 用户要求JSON格式
// 重要必须明确要求使用英文标点符号确保返回的JSON符合规范
// 重要:必须基于内容给出分析性回复,即使没有提供具体数据
var textPrompt string
if isVideo {
textPrompt = fmt.Sprintf(`你必须严格输出以下JSON格式不要输出任何其他内容输出必须以 { 开头并以 } 结束
重要提示
1. 所有字符串值必须使用英文标点符号包括英文逗号, 英文句号. 英文冒号: 英文引号" 禁止使用中文标点符号
2. 即使没有提供具体数据也要基于视频和图片内容给出分析性回复禁止回复"未提供数据""暂无数据"等类似内容而应该根据内容分析数据表现如根据时长分析完播率潜力根据内容质量分析互动潜力等
3. 配乐亮点(music字段)禁止回复"未提供配乐信息""没有配乐信息"等类似内容即使没有识别到配乐也要根据视频整体风格和内容特点编写合理的配乐分析根据视频风格推断适合的配乐类型根据内容节奏分析配乐潜力等
基于以下视频和图片的内容描述
%s
用户要求仅作为内容参考不会改变JSON结构
%s
JSON结构是固定的请将内容填充到对应的value中禁止修改key禁止添加额外字段禁止输出任何说明文字
{"highlight_analysis":{"summary":"[78字以内的概述]","points":{"theme":"[标题亮点最多60字]","narrative":"[题材亮点最多60字]","content":"[内容亮点最多60字]","copywriting":"[文案亮点最多60字]","data":"[数据亮点最多60字]","music":"[配乐亮点仅视频最多60字]"}},"data_performance_analysis":{"views":"[浏览量表现最多60字]","completion_rate":"[完播率表现仅视频最多60字]","engagement":"[点赞/分享/评论表现最多60字]"},"overall_summary_and_optimization":"[整体总结及可优化建议最多300字]"}`, vlContent, req.TextPrompt)
} else {
textPrompt = fmt.Sprintf(`你必须严格输出以下JSON格式不要输出任何其他内容输出开头并以 }必须以 { 结束
重要提示
1. 所有字符串值必须使用英文标点符号包括英文逗号, 英文句号. 英文冒号: 英文引号" 禁止使用中文标点符号
2. 即使没有提供具体数据也要基于视频和图片内容给出分析性回复禁止回复"未提供数据""暂无数据"等类似内容而应该根据内容分析数据表现如根据内容质量分析互动潜力等
基于以下视频和图片的内容描述
%s
用户要求仅作为内容参考不会改变JSON结构
%s
JSON结构是固定的请将内容填充到对应的value中禁止修改key禁止添加额外字段禁止输出任何说明文字
{"highlight_analysis":{"summary":"[100字以内的概述]","points":{"theme":"[标题亮点最多60字]","narrative":"[题材亮点最多60字]","content":"[内容亮点最多60字]","copywriting":"[文案亮点最多60字]","data":"[数据亮点最多60字]"}},"data_performance_analysis":{"views":"[浏览量表现最多60字]","engagement":"[点赞/分享/评论表现最多60字]"},"overall_summary_and_optimization":"[整体总结及可优化建议最多300字]"}`, vlContent, req.TextPrompt)
}
// 构建文本生成提示词:理解内容 + 用户要求
textPrompt := fmt.Sprintf("基于以下视频和图片的内容描述:\n%s\n\n请根据以下要求生成竞品报告注意不要输出markdown格式来进行排版请直接输出纯文本。只需要回复竞品报告的内容其他无关的内容不要输出输出的内容第一行不要标题直接输出竞品报告的正文即可\n我的要求是\n%s", vlContent, req.TextPrompt)
chatReq, err := buildChatRequest(textPrompt, nil)
if err != nil {
@ -372,13 +163,7 @@ JSON结构是固定的请将内容填充到对应的value中禁止修改ke
return
}
// 打印 AI 返回的原始内容(用于调试)
aiText := chatResp.Choices[0].Message.Content
fmt.Println("========== AI 返回的原始内容 ==========")
fmt.Println(aiText)
fmt.Println("=========================================")
textChan <- textResult{text: aiText}
textChan <- textResult{text: chatResp.Choices[0].Message.Content}
}()
}
@ -387,7 +172,7 @@ JSON结构是固定的请将内容填充到对应的value中禁止修改ke
imageChan = make(chan imageResult, 1)
go func() {
// 先请求聊天获取图片提示词
imagePromptText := fmt.Sprintf("基于以下视频和图片的内容描述:\n%s\n\n请根据以下要求生成竞品报告图片的提示词\n%s\n\n重要提示生成的图片内容中不要包含任何文字仅仅是根据内容生成一张配图即可", vlContent, req.ImagePrompt)
imagePromptText := fmt.Sprintf("基于以下视频和图片的内容描述:\n%s\n\n请根据以下要求生成竞品报告图片的提示词\n%s", vlContent, req.ImagePrompt)
chatReq, err := buildChatRequest(imagePromptText, nil)
if err != nil {
@ -482,29 +267,7 @@ JSON结构是固定的请将内容填充到对应的value中禁止修改ke
// 返回结果(只返回实际生成的内容)
result := CompetitorReportResponse{}
if needText {
// 将 JSON 解析为结构化数据
fmt.Println("========== 开始解析 JSON ==========")
fmt.Println("原始内容是否以 { 开头:", strings.HasPrefix(strings.TrimSpace(textRes.text), "{"))
fmt.Println("原始内容前100字符:", strings.TrimSpace(textRes.text)[:min(100, len(strings.TrimSpace(textRes.text)))])
var jsonData CompetitorReportData
if err := json.Unmarshal([]byte(textRes.text), &jsonData); err != nil {
// 如果解析失败,直接报错
fmt.Println("========== JSON 解析失败 ==========")
fmt.Println("解析错误:", err)
fmt.Println("===================================")
service.Error(ctx, errors.New("AI生成格式错误请重试"))
return
} else {
fmt.Println("========== JSON 解析成功 ==========")
fmt.Println("Summary:", jsonData.HighlightAnalysis.Summary)
fmt.Println("==================================")
// 赋值结构体到 JsonData 中
result.JsonData = &jsonData
result.Text = convertJSONToTextFromData(jsonData, len(req.Videos) > 0)
}
result.Text = textRes.text
}
if needImage {
result.ImageURL = imageRes.imageURL

View File

@ -1,7 +1,6 @@
package cast
import (
"context"
"fmt"
"fonchain-fiee/api/cast"
"fonchain-fiee/cmd/config"
@ -20,9 +19,7 @@ func UserAccounts(ctx *gin.Context) {
} else {
req.ArtistUuid = "1234"
}
go func() {
_, _ = service.CastProvider.Tools(context.Background(), &cast.ToolsReq{Action: "artistOrderInfo", ArtistUuid: req.ArtistUuid})
}()
if err = ctx.ShouldBind(&req); err != nil {
service.Error(ctx, err)
return

View File

@ -134,6 +134,9 @@ func (cr ChatHandler) NewMessage(c *gin.Context) {
service.ErrWithCode(c, code)
return
}
if request.LocalStamp == 0 {
request.LocalStamp = time.Now().Unix()
}
err := logic.NewMessage(c, &cr.cache, chatUser, request)
if err != nil {
service.Error(c, err)
@ -260,8 +263,9 @@ func (cr ChatHandler) MessageList(c *gin.Context) {
// return
// }
//}
messages := cr.cache.GetChatRecord(request.SessionId)
//messages := []*accountFiee.ChatRecordData{}
// 启用或禁用缓存
//messages := cr.cache.GetChatRecord(request.SessionId)
messages := []*accountFiee.ChatRecordData{}
var returnDataIdList = make([]int64, 0)
defer func() {
//获取最新数据时,重置新消息数量统计
@ -277,6 +281,7 @@ func (cr ChatHandler) MessageList(c *gin.Context) {
}
}
}
fmt.Println("defer CoverChatRecord , message len:", len(messages))
err := cr.cache.CoverChatRecord(request.SessionId, messages)
if err != nil {
log.Print("设置消息已读失败", zap.Error(err))
@ -302,6 +307,7 @@ func (cr ChatHandler) MessageList(c *gin.Context) {
return
}
messages = recordResp.List
fmt.Println("GetChatRecordList len:", len(messages))
err = cr.cache.CoverChatRecord(request.SessionId, messages)
if err != nil {
log.Print("覆盖聊天记录失败", zap.Error(err))
@ -332,7 +338,7 @@ func (cr ChatHandler) MessageList(c *gin.Context) {
return messages[i].ID > messages[j].ID
}
})
fmt.Printf("data is %+v\n", messages)
//fmt.Printf("data is %+v\n", messages)
total := 0
for i, message := range messages {
switch request.Direction {
@ -367,8 +373,6 @@ func (cr ChatHandler) MessageList(c *gin.Context) {
resp[i].Message.Media = []dto.MessageMedia{}
}
}
if accessUser.Role == 1 {
}
service.Success(c, resp)
}

View File

@ -42,6 +42,7 @@ func NewMessage(ctx context.Context, cache *chatCache.ChatCache, sender *account
fmt.Println(request.LocalStamp - msgRecord.LocalStamp)
if msgRecord.Message.Text == request.Message.Text && request.LocalStamp-msgRecord.LocalStamp < 1 { //秒级
cacheMap[request.AtUserId] = request
fmt.Println("\n\n跳过消息发送\n\t跳过消息发送\n\t\t跳过消息发送\n\n")
return nil
} else {
cacheMap[request.AtUserId] = request

View File

@ -177,10 +177,12 @@ func (r *Robot) Run() {
if hit {
hasHit = true
if rule.RunTime().IsZero() {
err := rule.Run(r.cache)
if err != nil {
log.Printf("robot 执行任务失败:%v\n", err)
}
go func() {
err := rule.Run(r.cache)
if err != nil {
log.Printf("robot 执行任务失败:%v\n", err)
}
}()
} else {
r.RegisterDelayTask(rule)
}

View File

@ -27,6 +27,12 @@ func NewReplyWhenHitKeywords(title string, keywords []string) IRobotTask {
return &RobotTaskWithKeyworkds{title: title, keywords: keywords}
}
func (r *RobotTaskWithKeyworkds) Hit(event ws.ListenEventData, sender *accountFiee.ChatUserData) (hit bool) {
//fmt.Printf("event.EventType != ws.EventChatMessage:%v\n", event.EventType != ws.EventChatMessage)
//fmt.Printf("event.Msg: %v\n", event.Msg == "")
//fmt.Printf("event.Client == nil: %v\n", event.Client == nil)
//fmt.Printf("event.ChatUser == nil: %v\n", event.ChatUser == nil)
//fmt.Printf("event.ChatUser.Role != 1: %v\n", event.ChatUser.Role != 1)
//fmt.Printf("r.keywords: %+v\n", r.keywords)
if event.EventType != ws.EventChatMessage || event.Msg == "" || event.Client == nil || event.ChatUser == nil {
return
}

View File

@ -11,6 +11,7 @@ import (
"fonchain-fiee/pkg/service/bundle/common"
"fonchain-fiee/pkg/utils"
"io"
"log"
"strconv"
"strings"
"time"
@ -166,7 +167,7 @@ func WorkConfirm(c *gin.Context) { // 确认作品并扣除余量
service.Error(c, err)
return
}
log.Print("req.ConfirmRemark:", req.ConfirmRemark)
if req.ConfirmStatus == 2 { // 驳回完直接结束
res, err := service.CastProvider.UpdateStatus(c, &cast.UpdateStatusReq{
WorkAction: cast.WorkActionENUM_CONFIRM,
@ -189,6 +190,22 @@ func WorkConfirm(c *gin.Context) { // 确认作品并扣除余量
service.Error(c, errors.New(common.GetUserBalanceFailed))
return
}
//判断套餐是否过期
if balanceInfoRes.BundleStatus == common.BundleExpired {
_, err = service.CastProvider.UpdateStatus(c, &cast.UpdateStatusReq{
WorkAction: cast.WorkActionENUM_CONFIRM,
WorkUuid: req.WorkUuid,
ConfirmRemark: req.ConfirmRemark,
ConfirmStatus: 3,
ConfirmFailType: cast.ConfirmFailENUM_ConfirmFailENUM_EXPIRED,
})
if err != nil {
service.Error(c, errors.New(common.UpdateWorkStatusFailed))
return
}
service.Error(c, errors.New("套餐已过期"))
return
}
wordInfoRes, err := service.CastProvider.WorkDetail(c, &cast.WorkDetailReq{
WorkUuid: req.WorkUuid,
@ -200,11 +217,10 @@ func WorkConfirm(c *gin.Context) { // 确认作品并扣除余量
if balanceInfoRes.BundleStatus == common.BundleExpired {
_, err = service.CastProvider.UpdateStatus(c, &cast.UpdateStatusReq{
WorkAction: cast.WorkActionENUM_CONFIRM,
WorkUuid: req.WorkUuid,
ConfirmRemark: req.ConfirmRemark,
ConfirmStatus: 3,
ConfirmFailType: cast.ConfirmFailENUM_ConfirmFailENUM_EXPIRED,
WorkAction: cast.WorkActionENUM_CONFIRM,
WorkUuid: req.WorkUuid,
ConfirmRemark: req.ConfirmRemark,
ConfirmStatus: 3,
})
service.Error(c, errors.New("套餐已过期"))
return
@ -216,18 +232,16 @@ func WorkConfirm(c *gin.Context) { // 确认作品并扣除余量
//订单号不相同
//新购买的,直接扣除失败
_, err = service.CastProvider.UpdateStatus(c, &cast.UpdateStatusReq{
WorkAction: cast.WorkActionENUM_CONFIRM,
WorkUuid: req.WorkUuid,
ConfirmRemark: req.ConfirmRemark,
ConfirmStatus: 3,
ConfirmFailType: cast.ConfirmFailENUM_ConfirmFailENUM_EXPIRED,
WorkAction: cast.WorkActionENUM_CONFIRM,
WorkUuid: req.WorkUuid,
ConfirmRemark: req.ConfirmRemark,
ConfirmStatus: 3,
})
service.Error(c, errors.New("套餐为新套餐,确认失败"))
return
}
//相同着正常走流程
}
if wordInfoRes.WorkStatus != 4 {
service.Error(c, errors.New("作品不是待确认状态"))
return
@ -240,13 +254,17 @@ func WorkConfirm(c *gin.Context) { // 确认作品并扣除余量
case 1:
{
if balanceInfoRes.ImageExtendConsumptionNumber >= balanceInfoRes.ImageExtendNumber { // 图文余量不足
_, err = service.CastProvider.UpdateStatus(c, &cast.UpdateStatusReq{
_, err = service.CastProvider.UpdateStatus(context.Background(), &cast.UpdateStatusReq{
WorkAction: cast.WorkActionENUM_CONFIRM,
WorkUuid: req.WorkUuid,
ConfirmRemark: req.ConfirmRemark,
ConfirmStatus: 3,
ConfirmFailType: cast.ConfirmFailENUM_ConfirmFailENUM_EXPIRED,
ConfirmFailType: cast.ConfirmFailENUM_ConfirmFailENUM_NOTENOUGH,
})
if err != nil {
service.Error(c, errors.New(common.UpdateWorkStatusFailed))
return
}
service.Error(c, errors.New("图文余量不足"))
return
}
@ -255,13 +273,17 @@ func WorkConfirm(c *gin.Context) { // 确认作品并扣除余量
case 2:
{
if balanceInfoRes.VideoExtendConsumptionNumber >= balanceInfoRes.VideoExtendNumber { // 视频余量不足
_, err = service.CastProvider.UpdateStatus(c, &cast.UpdateStatusReq{
_, err = service.CastProvider.UpdateStatus(context.Background(), &cast.UpdateStatusReq{
WorkAction: cast.WorkActionENUM_CONFIRM,
WorkUuid: req.WorkUuid,
ConfirmRemark: req.ConfirmRemark,
ConfirmStatus: 3,
ConfirmFailType: cast.ConfirmFailENUM_ConfirmFailENUM_EXPIRED,
ConfirmFailType: cast.ConfirmFailENUM_ConfirmFailENUM_NOTENOUGH,
})
if err != nil {
service.Error(c, errors.New(common.UpdateWorkStatusFailed))
return
}
service.Error(c, errors.New("视频余量不足"))
return
}
@ -323,17 +345,6 @@ func WorkAnalysisConfirm(c *gin.Context) { // 确认数据分析并扣除余量
return
}
analysisInfoRes, err := service.CastProvider.GetWorkAnalysis(c, &cast.GetWorkAnalysisDetailReq{
Uuid: req.Uuid,
})
if err != nil {
service.Error(c, errors.New(common.GetWorkDetailFailed))
return
}
if analysisInfoRes == nil {
service.Error(c, errors.New("数据分析不存在"))
}
if balanceInfoRes.BundleStatus == common.BundleExpired {
// 套餐过期的话直接失败
_, err := service.CastProvider.UpdateWorkAnalysisStatus(c, &cast.UpdateWorkAnalysisStatusReq{
@ -350,6 +361,13 @@ func WorkAnalysisConfirm(c *gin.Context) { // 确认数据分析并扣除余量
return
}
analysisInfoRes, err := service.CastProvider.GetWorkAnalysis(c, &cast.GetWorkAnalysisDetailReq{
Uuid: req.Uuid,
})
if err != nil {
service.Error(c, errors.New(common.GetWorkDetailFailed))
return
}
if analysisInfoRes.WorkAnalysisStatus != 4 {
service.Error(c, errors.New("数据分析不是待确认状态"))
return

View File

@ -13,6 +13,7 @@ import (
"fonchain-fiee/pkg/service/bundle/common"
serviceCast "fonchain-fiee/pkg/service/cast"
"fonchain-fiee/pkg/utils"
"log"
"reflect"
"strings"
"time"
@ -298,12 +299,14 @@ func MetricsVideoSubmitExport(ctx *gin.Context) {
}
}
if err != nil {
log.Printf("获取作品列表err: %v\n", err)
service.Error(ctx, errors.New(common.MetricsVideoSubmitExportFailed))
return
}
var loigcCastWork = new(logicCast.Work)
excelFile, err := loigcCastWork.ExportExcelWorkList(allData)
if err != nil {
log.Printf("导出作品列表err: %v\n", err)
service.Error(ctx, errors.New(common.MetricsVideoSubmitExportFailed))
return
}

View File

@ -12,7 +12,6 @@ import (
"fonchain-fiee/pkg/service"
"fonchain-fiee/pkg/service/bundle/common"
"fonchain-fiee/pkg/service/bundle/logic"
"fonchain-fiee/pkg/service/bundle/model"
bundleModel "fonchain-fiee/pkg/service/bundle/model"
"fonchain-fiee/pkg/service/upload"
"strconv"
@ -1212,63 +1211,3 @@ func ExportOrderInfoOss(c *gin.Context) {
service.Success(c, &bundleModel.ExportResponse{ExportUrl: exportUrl})
}
func CreatInvoice(c *gin.Context) {
var orderInof model.InvoiceInfo
if err := c.ShouldBindBodyWith(&orderInof, binding.JSON); err != nil {
service.Error(c, err)
return
}
//生成发票
orderRecord, err := service.BundleProvider.GetOrderInfoByOrderNo(context.Background(), &bundle.GetOrderInfoByOrderNoReq{
Uuid: orderInof.OrderUUID,
})
if err != nil {
service.Error(c, err)
return
}
amountType := strconv.FormatInt(orderRecord.AmountType, 10)
applyTime := orderInof.ApplyTime
payTime, _ := time.Parse("2006-01-02 15:04:05", applyTime)
payTimeString := payTime.Format("20060102")
fmt.Println("发票payTimeString :", payTimeString, "发票applyTime :", applyTime, "发票payTime :", payTime)
fmt.Println("发票时间数据获取完成")
err = createInvoice(orderRecord.UserId, orderRecord.UserNum, orderRecord.UserName, orderRecord.Address, orderRecord.Phone, orderRecord.BundleName, orderRecord.OrderNo, "1", amountType, orderRecord.TotalAmount, payTimeString, payTimeString, applyTime)
if err != nil {
fmt.Println("生成发票失败:", err)
service.Error(c, errors.New("生成发票失败:"+err.Error()))
return
}
service.Success(c, "生成发票成功")
}
func CreateDownloadInvoice(c *gin.Context) {
var orderInof model.InvoiceDownloadInfo
if err := c.ShouldBindBodyWith(&orderInof, binding.JSON); err != nil {
service.Error(c, err)
return
}
fmt.Println("下载对应发票订单编号 :", orderInof.OrderNo)
//生成发票
orderRecord, err := service.BundleProvider.GetOrderInfoByOrderNo(context.Background(), &bundle.GetOrderInfoByOrderNoReq{
OrderNo: orderInof.OrderNo,
})
if err != nil {
service.Error(c, err)
return
}
amountType := strconv.FormatInt(orderRecord.AmountType, 10)
applyTime := orderRecord.PayTime
payTime, _ := time.Parse("2006-01-02 15:04:05", applyTime)
payTimeString := payTime.Format("20060102")
fmt.Println("发票payTimeString :", payTimeString, "发票applyTime :", applyTime, "发票payTime :", payTime)
fmt.Println("发票时间数据获取完成")
invoiceUrl, err := createDownloadInvoice(orderRecord.UserId, orderRecord.UserNum, orderRecord.UserName, orderRecord.Address, orderRecord.Phone, orderRecord.BundleName, orderRecord.OrderNo, "1", amountType, orderRecord.TotalAmount, payTimeString, payTimeString, applyTime)
if err != nil {
fmt.Println("生成发票失败:", err)
service.Error(c, errors.New("生成发票失败:"+err.Error()))
return
}
service.Success(c, &bundleModel.ExportResponse{ExportUrl: invoiceUrl})
}

View File

@ -110,8 +110,6 @@ const (
GetWorkDetailFailed = "获取作品详情失败"
)
//用户套餐状态
// 余量
const (
BundleExtendFailed = "套餐扩展失败"

View File

@ -177,4 +177,5 @@ func HealthCheck(c *gin.Context) {
}
c.JSON(httpStatus, healthStatus)
// service.Success(c, healthStatus)
}

View File

@ -13,12 +13,3 @@ const (
type ExportResponse struct {
ExportUrl string `json:"exportUrl"`
}
type InvoiceInfo struct {
ApplyTime string `json:"applyTime"`
OrderUUID string `json:"orderUuid"`
}
type InvoiceDownloadInfo struct {
OrderNo string `json:"orderNo"`
}

View File

@ -1,35 +0,0 @@
package model
type QuestionnairePDFData struct {
// 基本信息
CustomerNum string `json:"customerNum"`
CustomerName string `json:"customerName"`
BundleName string `json:"bundleName"`
BundleStartDate string `json:"bundleStartDate"`
BundleEndDate string `json:"bundleEndDate"`
VideoNum string `json:"videoNum"`
AccountNum string `json:"accountNum"`
ImagesNum string `json:"imagesNum"`
DataAnalysisNum string `json:"dataAnalysisNum"`
CompetitiveNum string `json:"competitiveNum"`
ValueAddVideoNum string `json:"valueAddVideoNum"`
// 评分1-5
Score1 int `json:"score1"`
Score2 int `json:"score2"`
Score3 int `json:"score3"`
Score4 int `json:"score4"`
Score5 int `json:"score5"`
Score6 int `json:"score6"`
Score7 int `json:"score7"`
// 意见
Opinion1 string `json:"opinion1"`
Opinion2 string `json:"opinion2"`
Opinion3 string `json:"opinion3"`
// 提交信息
Submitter string `json:"submitter"`
SubmissionDate string `json:"submissionDate"`
Address string `json:"address"`
}

View File

@ -356,11 +356,7 @@ func CreateAntomPay(c *gin.Context) {
service.Error(c, err)
return
}
//获取上一笔订单信息:如果没有查询到代表首次购买 需要判断异常情况
lastOrderInfo, _ := service.BundleProvider.OrderRecordsDetail(context.Background(), &bundle.OrderRecordsDetailRequest{
CustomerID: strconv.FormatUint(orderLimit.UserId, 10),
Status: 2,
})
_, updateStatusErr := service.BundleProvider.UpdateOrderRecordByOrderNo(context.Background(), &bundle.OrderRecord{
OrderNo: req.OutTradeNo,
PayTime: common.GetBeijingTime(),
@ -462,7 +458,6 @@ func CreateAntomPay(c *gin.Context) {
service.Error(c, err)
return
}
handleMediaAccountBinding(orderLimit.UserId, orderLimit.PurchaseType, int(orderLimit.AccountNumber), lastOrderInfo)
service.Success(c)
return
@ -677,19 +672,13 @@ func AntomWebhook(c *gin.Context) {
return
}
//添加余额
// orderLimit, err = service.BundleProvider.OrderListByOrderUuid(context.Background(), &bundle.OrderInfoByOrderUuidRequest{
// OrderUuid: resp.OutTradeNo,
// })
// if err != nil {
// service.Error(c, err)
// return
// }
//生成发票
fmt.Println("开始生成发票")
//添加余额
orderRecord, err := service.BundleProvider.GetOrderInfoByOrderNo(context.Background(), &bundle.GetOrderInfoByOrderNoReq{
Uuid: resp.OutTradeNo, //因为需求更新实际传入的是订单的uuid
})
if err != nil {
service.Error(c, err)
return
@ -701,14 +690,15 @@ func AntomWebhook(c *gin.Context) {
fmt.Println("发票payTimeString :", payTimeString, "发票applyTime :", applyTime, "发票payTime :", payTime)
fmt.Println("发票时间数据获取完成")
err = createInvoice(orderRecord.UserId, orderRecord.UserNum, orderRecord.UserName, orderRecord.Address, orderRecord.Phone, orderRecord.BundleName, orderRecord.OrderNo, "1", amountType, orderRecord.TotalAmount, payTimeString, payTimeString, applyTime)
if err != nil {
service.Error(c, errors.New("生成发票失败"))
return
}
go func() {
_, _ = service.CastProvider.Tools(context.Background(), &cast.ToolsReq{Action: "artistOrderInfo", ArtistUuid: fmt.Sprint(orderLimit.UserId)})
}()
//购买套餐
switch orderLimit.Type {
case common.OrderTypePackage:
fmt.Println("开始创建套餐信息OrderUUID:", orderLimit.OrderUUID)
//如果是购买套餐 1:创建新的余量信息CreateBundleBalance 2 添加扩展记录BundleExtend
_, err = service.BundleProvider.CreateBundleBalance(context.Background(), &bundle.CreateBundleBalanceReq{
UserId: int32(orderLimit.UserId),
@ -720,9 +710,11 @@ func AntomWebhook(c *gin.Context) {
ExpansionPacksNumber: 1,
})
if err != nil {
fmt.Println("=============== antom回调创建套餐信息报错", err)
service.Error(c, err)
return
}
fmt.Println("创建套餐信息完成")
case common.OrderTypeAddon:
//如果是购买增值服务 1:修改余量信息AddBundleBalance 2 添加扩展记录BundleExtend
//_, err = service.BundleProvider.AddBundleBalance(context.Background(), &bundle.AddBundleBalanceReq{
@ -840,99 +832,6 @@ func HomePageRoll(c *gin.Context) {
return
}
func createInvoice(userId, userNum, userName, address, phone, bundleName, orderNo, spec, priceType, totalAmount, transactionDate, invoiceDate, applyTime string) error {
// InvoiceInfo 发票信息
InvoiceResp, err := service.BundleProvider.GetLastInvoiceNo(context.Background(), &bundle.GetLastInvoiceNoReq{})
if err != nil {
fmt.Println("获取最后一张发票号码失败:", err)
return err
}
lastestInvoiceNo := ""
if InvoiceResp.LastNo != "" {
lastestInvoiceNo = InvoiceResp.LastNo
}
currentInvoiceNo := ""
// 获取 lastestInvoiceNo CNY-ART-202501010001的 长度
if priceType == "1" {
priceType = "CNY"
//人民币
if lastestInvoiceNo == "" {
currentInvoiceNo = fmt.Sprintf("CNY-MDA-%s0001", transactionDate)
} else {
lastestSeq := lastestInvoiceNo[16:]
var seqNum int
_, err = fmt.Sscanf(lastestSeq, "%d", &seqNum)
if err != nil {
return err
}
seqNum++
currentInvoiceNo = fmt.Sprintf("CNY-MDA-%s%04d", transactionDate, seqNum)
}
} else if priceType == "2" {
priceType = "USD"
//美元
if lastestInvoiceNo == "" {
currentInvoiceNo = fmt.Sprintf("USD-MDA-%s0001", transactionDate)
} else {
lastestSeq := lastestInvoiceNo[16:]
var seqNum int
_, err = fmt.Sscanf(lastestSeq, "%d", &seqNum)
if err != nil {
return err
}
seqNum++
currentInvoiceNo = fmt.Sprintf("USD-MDA-%s%04d", transactionDate, seqNum)
}
} else {
//默认美元
priceType = "USD"
if lastestInvoiceNo == "" {
currentInvoiceNo = fmt.Sprintf("USD-MDA-%s0001", transactionDate)
} else {
lastestSeq := lastestInvoiceNo[16:]
var seqNum int
_, err = fmt.Sscanf(lastestSeq, "%d", &seqNum)
if err != nil {
return err
}
seqNum++
currentInvoiceNo = fmt.Sprintf("USD-MDA-%s%04d", transactionDate, seqNum)
}
}
fmt.Println("当前发票号码:", currentInvoiceNo)
payTime, _ := time.Parse("2006-01-02 15:04:05", applyTime)
transactionDate = payTime.Format("2006-01-02")
invoiceUrl, err := invoice.MakeInvoice(currentInvoiceNo, userName, address, phone, bundleName, spec, priceType, totalAmount, transactionDate, "")
if err != nil {
return err
}
fmt.Println("发票生成成功URL:", invoiceUrl)
_, err = service.BundleProvider.CreateInvoice(context.Background(), &bundle.CreateInvoiceReq{
UserId: userId,
UserNum: userNum,
UserName: userName,
OrderNo: orderNo,
ApplyTime: applyTime,
InvoiceType: 1,
InvoiceNo: currentInvoiceNo,
InvoiceUrl: invoiceUrl,
PaperInvocieStatus: 1,
Remark: "系统自动生成发票",
})
if err != nil {
return err
}
return nil
}
// MediaAccount 媒体账号信息
type MediaAccount struct {
UUID string
@ -1085,45 +984,97 @@ func handleMediaAccountBinding(userId uint64, purchaseType int32, currentAccount
logger.Infof("Unbind completed for user %d: success=%d, fail=%d", userId, successCount, failCount)
}
}
func createDownloadInvoice(userId, userNum, userName, address, phone, bundleName, orderNo, spec, priceType, totalAmount, transactionDate, invoiceDate, applyTime string) (string, error) {
func createInvoice(userId, userNum, userName, address, phone, bundleName, orderNo, spec, priceType, totalAmount, transactionDate, invoiceDate, applyTime string) error {
// InvoiceInfo 发票信息
fmt.Println("发票applyTime :", applyTime, "发票transactionDate :", transactionDate, "发票invoiceDate :", invoiceDate)
InvoiceResp, err := service.BundleProvider.GetLastInvoiceNo(context.Background(), &bundle.GetLastInvoiceNoReq{})
if err != nil {
return err
}
lastestInvoiceNo := ""
if InvoiceResp.LastNo != "" {
lastestInvoiceNo = InvoiceResp.LastNo
}
currentInvoiceNo := ""
// 获取 lastestInvoiceNo CNY-ART-202501010001的 长度
InvoiceInfo, err := service.BundleProvider.GetInvoiceInfoByOrderNo(context.Background(), &bundle.GetInvoiceInfoByOrderNoReq{
UserId: userId,
OrderNo: orderNo,
})
if err != nil {
return "", err
}
if InvoiceInfo.Data[0].InvoiceNo != "" {
currentInvoiceNo = InvoiceInfo.Data[0].InvoiceNo
} else {
fmt.Println("获取发票号码失败:没有找到发票号码")
return "", errors.New("获取发票号码失败:没有找到发票号码")
}
if priceType == "1" {
priceType = "CNY"
//人民币
if lastestInvoiceNo == "" {
currentInvoiceNo = fmt.Sprintf("CNY-MDA-%s0001", transactionDate)
} else {
lastestSeq := lastestInvoiceNo[16:]
var seqNum int
_, err = fmt.Sscanf(lastestSeq, "%d", &seqNum)
if err != nil {
return err
}
seqNum++
currentInvoiceNo = fmt.Sprintf("CNY-MDA-%s%04d", transactionDate, seqNum)
}
} else if priceType == "2" {
priceType = "USD"
//美元
if lastestInvoiceNo == "" {
currentInvoiceNo = fmt.Sprintf("USD-MDA-%s0001", transactionDate)
} else {
lastestSeq := lastestInvoiceNo[16:]
var seqNum int
_, err = fmt.Sscanf(lastestSeq, "%d", &seqNum)
if err != nil {
return err
}
seqNum++
currentInvoiceNo = fmt.Sprintf("USD-MDA-%s%04d", transactionDate, seqNum)
}
} else {
//默认美元
priceType = "USD"
if lastestInvoiceNo == "" {
currentInvoiceNo = fmt.Sprintf("USD-MDA-%s0001", transactionDate)
} else {
lastestSeq := lastestInvoiceNo[16:]
var seqNum int
_, err = fmt.Sscanf(lastestSeq, "%d", &seqNum)
if err != nil {
return err
}
seqNum++
currentInvoiceNo = fmt.Sprintf("USD-MDA-%s%04d", transactionDate, seqNum)
}
}
fmt.Println("当前发票号码:", currentInvoiceNo)
payTime, _ := time.Parse("2006-01-02 15:04:05", applyTime)
transactionDate = payTime.Format("2006-01-02")
invoiceDate = time.Now().Format("2006-01-02")
invoiceDate = time.Now().Format("20060102")
invoiceUrl, err := invoice.MakeInvoice(currentInvoiceNo, userName, address, phone, bundleName, spec, priceType, totalAmount, transactionDate, invoiceDate)
if err != nil {
return "", err
return err
}
fmt.Println("发票生成成功URL:", invoiceUrl)
_, err = service.BundleProvider.CreateInvoice(context.Background(), &bundle.CreateInvoiceReq{
UserId: userId,
UserNum: userNum,
UserName: userName,
OrderNo: orderNo,
ApplyTime: applyTime,
InvoiceType: 1,
InvoiceNo: currentInvoiceNo,
InvoiceUrl: invoiceUrl,
PaperInvocieStatus: 1,
Remark: "系统自动生成发票",
})
if err != nil {
return err
}
return invoiceUrl, nil
fmt.Println("创建发票数据成功")
return nil
}

View File

@ -1,136 +0,0 @@
package bundle
import (
"context"
"errors"
"fonchain-fiee/api/bundle"
"fonchain-fiee/pkg/service"
"fonchain-fiee/pkg/service/bundle/model"
"fonchain-fiee/pkg/service/upload"
"fonchain-fiee/pkg/utils"
"strconv"
"time"
m "fonchain-fiee/pkg/model"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
)
func IsSendSurvey(c *gin.Context) {
var req bundle.SendQuestionnaireSurveyRequest
if err := c.ShouldBindJSON(&req); err != nil {
service.Error(c, err)
return
}
res, err := service.BundleProvider.SendQuestionnaireSurvey(context.Background(), &req)
if err != nil {
service.Error(c, err)
return
}
service.Success(c, res)
}
func QuestionnaireSurveyList(c *gin.Context) {
var req bundle.GetQuestionnaireSurveyListRequest
if err := c.ShouldBindJSON(&req); err != nil {
service.Error(c, err)
return
}
res, err := service.BundleProvider.GetQuestionnaireSurveyList(context.Background(), &req)
if err != nil {
service.Error(c, err)
return
}
service.Success(c, res)
}
func QuestionnaireSurveyBundleInfo(c *gin.Context) {
var req bundle.GetQuestionnaireSurveyInfoRequest
if err := c.ShouldBindJSON(&req); err != nil {
service.Error(c, err)
return
}
res, err := service.BundleProvider.GetQuestionnaireSurveyInfo(context.Background(), &req)
if err != nil {
service.Error(c, err)
return
}
service.Success(c, res)
}
func QuestionnaireSurveyCreate(c *gin.Context) {
var req bundle.CreateQuestionnaireSurveyAnswerRequest
if err := c.ShouldBindJSON(&req); err != nil {
service.Error(c, err)
return
}
ip := c.ClientIP()
address, err := utils.GetAddressByIP(ip)
if err != nil {
service.Error(c, errors.New("获取地址失败"))
return
}
//if req.Longitude == "" || req.Latitude == "" {
// service.Error(c, errors.New("获取定位失败"))
// return
//}
//address, err := utils.ReverseGeo(req.Longitude, req.Latitude, "ZhCN")
//if err != nil {
// service.Error(c, errors.New("获取地址失败"))
// return
//}
surveyInfo, err := service.BundleProvider.GetQuestionnaireSurveyInfo(c, &bundle.GetQuestionnaireSurveyInfoRequest{UserTel: req.UserTel})
if err != nil {
service.Error(c, err)
return
}
templateDir := "./data/满意度调成报告模板.pdf"
outputPath := m.MediaPath + "questionnaire_" + uuid.NewString() + ".pdf"
err = utils.QuestionnaireSurveyPDF(templateDir, outputPath, &model.QuestionnairePDFData{
//CustomerNum: surveyInfo.BundleInfo.,
CustomerName: surveyInfo.UserName,
BundleName: surveyInfo.BundleInfo.BundleName,
BundleStartDate: surveyInfo.BundleInfo.StartAt,
BundleEndDate: surveyInfo.BundleInfo.ExpiredAt,
VideoNum: strconv.FormatInt(int64(surveyInfo.BundleInfo.BundleVideoNumber), 10),
AccountNum: strconv.FormatInt(int64(surveyInfo.BundleInfo.BundleAccountNumber), 10),
ImagesNum: strconv.FormatInt(int64(surveyInfo.BundleInfo.BundleImageNumber), 10),
DataAnalysisNum: strconv.FormatInt(int64(surveyInfo.BundleInfo.BundleDataNumber), 10),
CompetitiveNum: strconv.FormatInt(int64(surveyInfo.BundleInfo.BundleCompetitiveNumber), 10),
ValueAddVideoNum: strconv.FormatInt(int64(surveyInfo.BundleInfo.IncreaseVideoNumber), 10),
Score1: int(req.SurveyAnswer.BundleAccountScore),
Score2: int(req.SurveyAnswer.BundleAccountScore),
Score3: int(req.SurveyAnswer.BundleImageScore),
Score4: int(req.SurveyAnswer.BundleDataScore),
Score5: int(req.SurveyAnswer.IncreaseVideoScore),
Score6: int(req.SurveyAnswer.ServiceResponseSpeed),
Score7: int(req.SurveyAnswer.ServiceStaffProfessionalism),
Opinion1: req.SurveyFeedback.MeritsReview,
Opinion2: req.SurveyFeedback.SuggestionsorImprovements,
Opinion3: req.SurveyFeedback.AdditionalComments,
Submitter: surveyInfo.UserName,
SubmissionDate: time.Now().Format(time.DateOnly),
Address: address,
})
if err != nil {
service.Error(c, err)
return
}
outputUrl, ossErr := upload.PutBos(outputPath, upload.PdfType, true)
if ossErr != nil {
service.Error(c, err)
return
}
//service.Success(c, outputUrl)
//return
req.SurveyUrl = outputUrl
res, err := service.BundleProvider.CreateQuestionnaireSurveyAnswer(context.Background(), &req)
if err != nil {
service.Error(c, err)
return
}
service.Success(c, res)
}

View File

@ -253,16 +253,14 @@ func AutoCreateUserAndOrder(c *gin.Context) {
reportUuid := ""
accountUuid := ""
durationUuid := ""
bundleVideoUuid := ""
if config.AppConfig.System.AppMode == "prod" {
BundleName = "全球尊享版"
BundleUuid = "ac4c99c2951c2fcdbf417928d321554d"
videoUuid = "355aae784d77280197c92ff56733459d" // 增值视频
textAndImagesUuid = "41a7753d210d22f8972dc273ff1360c4" // 套餐图文
reportUuid = "069497de55852c24a3b0f702c1250900" // 套餐数据
accountUuid = "1e04078d2a8824d18be1c281bc3167a8" // 套餐账号
durationUuid = "e3ad8f15aa022b12afe47170c9051db9" // 套餐时长
bundleVideoUuid = "fdbef018707e2a8ebc82a22e257abaff" // 套餐视频
videoUuid = "a29a1fa2862b2cdda1377b19066c8eb7"
textAndImagesUuid = "dfba176a40ae2d23aa4ef9b30b646bc8"
reportUuid = "1727557a85c92957a3e3332d18c713aa"
accountUuid = "e1cc219e4f682b3d8cb85929e540a0de"
durationUuid = "f002449ac57a2e71b0673da938c0354e"
} else {
BundleName = "测试导入全球尊享版"
BundleUuid = "5e84f86cb7f92a4ab785271e4a383aa5"
@ -309,21 +307,7 @@ func AutoCreateUserAndOrder(c *gin.Context) {
f64, err := strconv.ParseFloat(unfinishInfo.OrderPayAmount, 32)
TotalPrice = float32(f64)
addRecords = append(addRecords,
&bundle.OrderCreateAddRecord{ // 套餐视频
ServiceType: 1,
ValueUid: bundleVideoUuid,
CurrencyType: 2, //美元
Amount: 0, //增值服务金额
Num: 24,
Unit: "个",
Source: 1,
PaymentStatus: 1,
HandlingFee: unfinishInfo.OrderFeeAmount,
EquityType: 1,
QuotaType: 2,
QuotaValue: 2,
},
&bundle.OrderCreateAddRecord{ //视频增值
&bundle.OrderCreateAddRecord{
ServiceType: 1,
ValueUid: videoUuid,
CurrencyType: 2, //美元
@ -333,8 +317,6 @@ func AutoCreateUserAndOrder(c *gin.Context) {
Source: 1,
PaymentStatus: 1,
HandlingFee: unfinishInfo.OrderFeeAmount,
EquityType: 2,
QuotaType: 1,
}, &bundle.OrderCreateAddRecord{ //图文
ServiceType: 2,
ValueUid: textAndImagesUuid,
@ -345,9 +327,6 @@ func AutoCreateUserAndOrder(c *gin.Context) {
Source: 1,
PaymentStatus: 1,
HandlingFee: unfinishInfo.OrderFeeAmount,
EquityType: 1,
QuotaType: 2,
QuotaValue: 10,
}, &bundle.OrderCreateAddRecord{ //数据报表
ServiceType: 3,
ValueUid: reportUuid,
@ -358,9 +337,6 @@ func AutoCreateUserAndOrder(c *gin.Context) {
Source: 1,
PaymentStatus: 1,
HandlingFee: unfinishInfo.OrderFeeAmount,
EquityType: 1,
QuotaType: 2,
QuotaValue: 1,
}, &bundle.OrderCreateAddRecord{ //账号数
ServiceType: 4,
ValueUid: accountUuid,
@ -371,20 +347,16 @@ func AutoCreateUserAndOrder(c *gin.Context) {
Source: 1,
PaymentStatus: 1,
HandlingFee: unfinishInfo.OrderFeeAmount,
EquityType: 1,
QuotaType: 1,
}, &bundle.OrderCreateAddRecord{ //可用时长
ServiceType: 5,
ValueUid: durationUuid,
CurrencyType: 2, //美元
Amount: 0, //增值服务金额
Num: 1,
Num: 10,
Unit: "年",
Source: 1,
PaymentStatus: 1,
HandlingFee: unfinishInfo.OrderFeeAmount,
EquityType: 1,
QuotaType: 1,
},
)
// 当前 未将 签名 写入合同中 todo 金额和有效时间待修改
@ -492,26 +464,6 @@ func AutoCreateUserAndOrder(c *gin.Context) {
return
}
//生成发票
orderRecord, err := service.BundleProvider.GetOrderInfoByOrderNo(context.Background(), &bundle.GetOrderInfoByOrderNoReq{
OrderNo: unfinishInfo.OrderNo, //因为需求更新实际传入的是订单的uuid
})
if err != nil {
service.Error(c, err)
return
}
amountType := strconv.FormatInt(orderRecord.AmountType, 10)
applyTime := unfinishInfo.PayTime
payTime, _ := time.Parse("2006-01-02 15:04:05", applyTime)
payTimeString := payTime.Format("20060102")
fmt.Println("发票payTimeString :", payTimeString, "发票applyTime :", applyTime, "发票payTime :", payTime)
fmt.Println("发票时间数据获取完成")
err = createInvoice(orderRecord.UserId, orderRecord.UserNum, orderRecord.UserName, orderRecord.Address, orderRecord.Phone, orderRecord.BundleName, orderRecord.OrderNo, "1", amountType, orderRecord.TotalAmount, payTimeString, payTimeString, applyTime)
if err != nil {
service.Error(c, errors.New("生成发票失败"))
return
}
//如果是购买套餐 1:创建新的余量信息CreateBundleBalance 2 添加扩展记录BundleExtend
_, err = service.BundleProvider.CreateBundleBalance(context.Background(), &bundle.CreateBundleBalanceReq{
UserId: int32(userResp.UserId),

View File

@ -1,37 +1,28 @@
package cast
import (
"bytes"
"context"
"encoding/json"
"errors"
"fmt"
"fonchain-fiee/api/accountFiee"
"fonchain-fiee/api/aryshare"
"fonchain-fiee/api/bundle"
"fonchain-fiee/api/cast"
"fonchain-fiee/pkg/cache"
"fonchain-fiee/pkg/common/qwen"
"fonchain-fiee/pkg/e"
modelCast "fonchain-fiee/pkg/model/cast"
"fonchain-fiee/pkg/model/login"
modelQwen "fonchain-fiee/pkg/model/qwen"
"fonchain-fiee/pkg/service"
"fonchain-fiee/pkg/service/bundle/common"
"fonchain-fiee/pkg/utils"
"fonchain-fiee/pkg/utils/stime"
"path/filepath"
"strconv"
"strings"
"sync"
"time"
"math/rand"
"dubbo.apache.org/dubbo-go/v3/common/constant"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"github.com/xuri/excelize/v2"
"go.uber.org/zap"
)
@ -43,7 +34,31 @@ func CreateWorkAnalysis(ctx *gin.Context) {
service.Error(ctx, err)
return
}
resp, err := CreateWorkAnalysisCore(ctx, req)
newCtx := NewCtxWithUserInfo(ctx)
artistID, _ := strconv.ParseUint(req.ArtistID, 10, 64)
if _, err = CheckUserBundleBalance(int32(artistID), modelCast.BalanceTypeDataValue); err != nil {
if err != nil && err.Error() == e.ErrorBalanceInsufficient {
service.Error(ctx, errors.New("该艺人数据可用次数为0"))
return
}
service.Error(ctx, err)
return
}
// 获取套餐订单uuid
resp1, err := service.BundleProvider.GetBundleBalanceByUserId(context.Background(), &bundle.GetBundleBalanceByUserIdReq{UserId: int32(artistID)})
if err != nil {
err = errors.New("获取套餐订单失败")
service.Error(ctx, err)
zap.L().Error("CheckUserBundleBalance", zap.Any("err", err))
return
}
if resp1.OrderUUID == "" {
err = errors.New("订单不存在")
service.Error(ctx, err)
return
}
req.BundleOrderUuid = resp1.OrderUUID
resp, err := service.CastProvider.CreateWorkAnalysis(newCtx, req)
if err != nil {
service.Error(ctx, err)
return
@ -52,350 +67,6 @@ func CreateWorkAnalysis(ctx *gin.Context) {
return
}
func CreateWorkAnalysisCore(ctx *gin.Context, req *cast.CreateWorkAnalysisReq) (*cast.CreateWorkAnalysisResp, error) {
newCtx := NewCtxWithUserInfo(ctx)
if req.SubNum == "" {
return nil, errors.New("艺人编号不能为空")
}
// 根据 subNum 查询艺人 artistUuid
subInfoResp, err := service.AccountFieeProvider.SubNumGetInfo(context.Background(), &accountFiee.SubNumGetInfoRequest{
SubNum: req.SubNum,
Domain: "app",
})
if err != nil {
zap.L().Error("AccountFieeProvider.SubNumGetInfo", zap.Error(err), zap.String("subNum", req.SubNum))
return nil, errors.New("自媒体用户查询失败")
}
if subInfoResp == nil || subInfoResp.Id == 0 {
return nil, errors.New("自媒体用户不存在")
}
req.ArtistID = fmt.Sprint(subInfoResp.Id)
req.ArtistName = subInfoResp.Name
req.ArtistPhone = subInfoResp.TelNum
artistID := uint64(subInfoResp.Id)
if _, err = CheckUserBundleBalance(int32(artistID), modelCast.BalanceTypeDataValue); err != nil {
if err.Error() == e.ErrorBalanceInsufficient {
return nil, errors.New("该艺人数据可用次数为0")
}
return nil, err
}
resp1, err := service.BundleProvider.GetBundleBalanceByUserId(context.Background(), &bundle.GetBundleBalanceByUserIdReq{UserId: int32(artistID)})
if err != nil {
zap.L().Error("GetBundleBalanceByUserId", zap.Error(err), zap.Uint64("artistID", artistID))
return nil, errors.New("获取套餐订单失败")
}
if resp1.OrderUUID == "" {
return nil, errors.New("订单不存在")
}
req.BundleOrderUuid = resp1.OrderUUID
resp, err := service.CastProvider.CreateWorkAnalysis(newCtx, req)
if err != nil {
return nil, err
}
return resp, nil
}
// ImportWorkAnalysisBatch 通过 Excel 批量导入数据分析
// Excel 列顺序SubNum | ArtistName | SubmitTime | PeriodTypeFans | PeriodTypeViews | PeriodTypeLikes | PeriodTypeComments | PeriodTypeShares | IsRefreshData(1=false,2=true)
func ImportWorkAnalysisBatch(ctx *gin.Context) {
excelFile, err := ctx.FormFile("file")
if err != nil {
service.Error(ctx, err)
return
}
loginInfo := login.GetUserInfoFromC(ctx)
lockKey := fmt.Sprintf("import_work_analysis_batch:%d", loginInfo.ID)
replay := cache.RedisClient.SetNX(lockKey, time.Now().Format("20060102150405"), 5*time.Minute)
if !replay.Val() {
service.Error(ctx, errors.New("有导入任务正在进行,请稍后再试"))
return
}
defer cache.RedisClient.Del(lockKey)
tempDir := "./runtime/report_pdf"
_, err = utils.CheckDirPath(tempDir, true)
if err != nil {
service.Error(ctx, err)
return
}
fileName := fmt.Sprintf("%d_work_analysis.xlsx", time.Now().UnixMicro())
excelPath := filepath.Join(tempDir, fileName)
if err = ctx.SaveUploadedFile(excelFile, excelPath); err != nil {
service.Error(ctx, err)
return
}
excelData, err := excelize.OpenFile(excelPath)
if err != nil {
service.Error(ctx, err)
return
}
defer excelData.Close()
rows, err := excelData.GetRows("Sheet1")
if err != nil {
service.Error(ctx, err)
return
}
newCtx := NewCtxWithUserInfo(ctx)
// 写入表头
_ = excelData.SetCellValue("Sheet1", "J1", "DateInt")
_ = excelData.SetCellValue("Sheet1", "K1", "ConfirmType")
_ = excelData.SetCellValue("Sheet1", "L1", "结果")
successCount := 0
for line, row := range rows {
if line == 0 {
continue // 跳过表头
}
if len(row) == 0 {
continue
}
// Excel 行号1-basedline=1 → 行号 2
cellL := fmt.Sprintf("L%d", line+1)
// 第一列SubNum
subNum := ""
if len(row) > 0 {
subNum = utils.CleanString(row[0])
}
if subNum == "" {
_ = excelData.SetCellValue("Sheet1", cellL, "SubNum 不能为空")
continue
}
// 第二列ArtistName
artistName := ""
if len(row) > 1 {
artistName = utils.CleanString(row[1])
}
// 第三列SubmitTime
submitTime := ""
if len(row) > 2 {
submitTime = row[2]
}
// 第四列PeriodTypeFans
var periodTypeFans uint32
if len(row) > 3 && utils.CleanString(row[3]) != "" {
v, _ := strconv.ParseUint(utils.CleanString(row[3]), 10, 32)
periodTypeFans = uint32(v)
}
// 第五列PeriodTypeViews
var periodTypeViews uint32
if len(row) > 4 && utils.CleanString(row[4]) != "" {
v, _ := strconv.ParseUint(utils.CleanString(row[4]), 10, 32)
periodTypeViews = uint32(v)
}
// 第六列PeriodTypeLikes
var periodTypeLikes uint32
if len(row) > 5 && utils.CleanString(row[5]) != "" {
v, _ := strconv.ParseUint(utils.CleanString(row[5]), 10, 32)
periodTypeLikes = uint32(v)
}
// 第七列PeriodTypeComments
var periodTypeComments uint32
if len(row) > 6 && utils.CleanString(row[6]) != "" {
v, _ := strconv.ParseUint(utils.CleanString(row[6]), 10, 32)
periodTypeComments = uint32(v)
}
// 第八列PeriodTypeShares
var periodTypeShares uint32
if len(row) > 7 && utils.CleanString(row[7]) != "" {
v, _ := strconv.ParseUint(utils.CleanString(row[7]), 10, 32)
periodTypeShares = uint32(v)
}
// 第九列IsRefreshData1 → false, 2 → true
isRefreshData := false
if len(row) > 8 && utils.CleanString(row[8]) == "2" {
isRefreshData = true
}
// 第十列DateIntYYYYMMDD 格式,直接从 Excel 读取)
var dateInt int32
if len(row) > 9 && utils.CleanString(row[9]) != "" {
v, _ := strconv.ParseInt(utils.CleanString(row[9]), 10, 32)
dateInt = int32(v)
}
// 第十一列ConfirmType1 艺人确认2 系统自动确认)
var confirmType int32
if len(row) > 10 && utils.CleanString(row[10]) != "" {
v, _ := strconv.ParseInt(utils.CleanString(row[10]), 10, 32)
confirmType = int32(v)
}
// 根据 subNum 查询艺人信息
subInfoResp, err := service.AccountFieeProvider.SubNumGetInfo(context.Background(), &accountFiee.SubNumGetInfoRequest{
SubNum: subNum,
Domain: "app",
})
if err != nil {
zap.L().Error("ImportWorkAnalysisBatch SubNumGetInfo", zap.Error(err), zap.String("subNum", subNum))
_ = excelData.SetCellValue("Sheet1", cellL, fmt.Sprintf("自媒体用户查询失败:%s", err.Error()))
continue
}
if subInfoResp == nil || subInfoResp.Id == 0 {
_ = excelData.SetCellValue("Sheet1", cellL, "自媒体用户不存在")
continue
}
artistID := uint64(subInfoResp.Id)
// 查询艺人套餐订单
balanceResp, err := service.BundleProvider.GetBundleBalanceByUserId(context.Background(), &bundle.GetBundleBalanceByUserIdReq{
UserId: int32(artistID),
})
if err != nil {
zap.L().Error("ImportWorkAnalysisBatch GetBundleBalanceByUserId", zap.Error(err), zap.Uint64("artistID", artistID))
_ = excelData.SetCellValue("Sheet1", cellL, fmt.Sprintf("获取套餐订单失败:%s", err.Error()))
continue
}
if balanceResp.OrderUUID == "" {
_ = excelData.SetCellValue("Sheet1", cellL, "订单不存在")
continue
}
// 若 artistName 为空则使用账号服务中的姓名
if artistName == "" {
artistName = subInfoResp.Name
}
// 将 submitTimeYYYY-MM-DD 00:00:00加随机 9~15 小时、0~59 分钟、0~59 秒,使提交时间更真实
if submitTime != "" {
if parsedTime, parseErr := time.Parse("2006-01-02 15:04:05", submitTime); parseErr == nil {
randomDuration := time.Duration(rand.Intn(7)+9)*time.Hour +
time.Duration(rand.Intn(60))*time.Minute +
time.Duration(rand.Intn(60))*time.Second
submitTime = parsedTime.Add(randomDuration).Format("2006-01-02 15:04:05")
}
}
// 提升到外部作用域,供 importReq 使用
var aiAnalysis string
var mediaAccountCount int32
var workVideoCount, workImageCount int32
// 调用 ArtistMetricsSeries 获取艺人指标数据并写入 Analysis
metricsReq := &cast.ArtistMetricsSeriesReq{
ArtistUUID: fmt.Sprint(subInfoResp.Id),
Date: dateInt,
PeriodTypeFans: periodTypeFans,
PeriodTypeViews: periodTypeViews,
PeriodTypeLikes: periodTypeLikes,
PeriodTypeComments: periodTypeComments,
PeriodTypeShares: periodTypeShares,
}
// 并行调用 ArtistMetricsSeries 和 GetArtistWorkStats
var metricsResp *cast.ArtistMetricsSeriesResp
var workStatsResp *cast.GetArtistWorkStatsResp
var metricsErr, workStatsErr error
wg := sync.WaitGroup{}
wg.Add(2)
go func() {
defer wg.Done()
metricsResp, metricsErr = service.CastProvider.ArtistMetricsSeries(context.Background(), metricsReq)
}()
go func() {
defer wg.Done()
workStatsResp, workStatsErr = service.CastProvider.GetArtistWorkStats(newCtx, &cast.GetArtistWorkStatsReq{
ArtistUuid: fmt.Sprint(subInfoResp.Id),
StatusUpdateTime: submitTime,
})
}()
wg.Wait()
if workStatsErr == nil && workStatsResp != nil {
mediaAccountCount = int32(workStatsResp.AccountCount)
workVideoCount = int32(workStatsResp.VideoCount)
workImageCount = int32(workStatsResp.ImageCount)
} else if workStatsErr != nil {
zap.L().Warn("ImportWorkAnalysisBatch GetArtistWorkStats failed", zap.Error(workStatsErr), zap.String("subNum", subNum))
}
if metricsErr != nil {
zap.L().Warn("ImportWorkAnalysisBatch ArtistMetricsSeries failed", zap.Error(metricsErr), zap.String("subNum", subNum))
} else if metricsResp != nil {
// 构建与 ArtistMetricsSeries HTTP 接口相同的 respMap
raw, _ := json.Marshal(metricsResp)
respMap := make(map[string]interface{})
_ = json.Unmarshal(raw, &respMap)
respMap["accountConsumptionNumber"] = mediaAccountCount
respMap["videoCount"] = workVideoCount
respMap["imageCount"] = workImageCount
// 调用 AI 生成分析文本
aiAnalysis, _ = generateArtistMetricsAnalysis(metricsResp)
if aiAnalysis == "" {
zap.L().Warn("ImportWorkAnalysisBatch generateArtistMetricsAnalysis returned empty", zap.String("subNum", subNum))
}
respMap["analysis"] = aiAnalysis
}
importReq := &cast.ImportWorkAnalysisReq{
SubNum: subNum,
ArtistID: fmt.Sprint(subInfoResp.Id),
ArtistName: artistName,
ArtistPhone: subInfoResp.TelNum,
BundleOrderUuid: balanceResp.OrderUUID,
SubmitTime: submitTime,
PeriodTypeFans: periodTypeFans,
PeriodTypeViews: periodTypeViews,
PeriodTypeLikes: periodTypeLikes,
PeriodTypeComments: periodTypeComments,
PeriodTypeShares: periodTypeShares,
IsRefreshData: isRefreshData,
Analysis: aiAnalysis,
MediaAccountCount: mediaAccountCount,
WorkVideoCount: workVideoCount,
WorkImageCount: workImageCount,
Views: 1,
Likes: 1,
Comments: 1,
Shares: 1,
FansCount: 1,
MostActiveDay: 1,
BestPostTime: 1,
Date: dateInt,
ConfirmType: confirmType,
}
importResp, err := service.CastProvider.ImportWorkAnalysis(newCtx, importReq)
if err != nil {
zap.L().Error("ImportWorkAnalysisBatch ImportWorkAnalysis", zap.Error(err), zap.String("subNum", subNum))
_ = excelData.SetCellValue("Sheet1", cellL, fmt.Sprintf("导入失败:%s", err.Error()))
continue
}
// 导入成功,将返回的 UUID 写入 L 列
_ = excelData.SetCellValue("Sheet1", cellL, importResp.Uuid)
successCount++
}
// 将修改后的 Excel 写入 buffer 并返回给客户端下载
buf, err := excelData.WriteToBuffer()
if err != nil {
service.Error(ctx, err)
return
}
utils.ResponseXls(ctx, bytes.NewReader(buf.Bytes()), fmt.Sprintf("数据分析导入结果_%d成功", successCount))
}
// UpdateWorkAnalysis 更新作品分析
func UpdateWorkAnalysis(ctx *gin.Context) {
var req *cast.UpdateWorkAnalysisReq
@ -521,24 +192,11 @@ func ListWorkAnalysisForApp(ctx *gin.Context) {
// 套餐未过期的话,传入 subNum ,只获取该套餐的有效期内数据
if balanceInfoRes.BundleStatus == common.BundleNotExpired {
zap.L().Info("ListWorkAnalysisForApp BundleNotExpired", zap.Any("loginInfo", loginInfo))
// 调用GetBundleBalanceByOrderUUID接口
resp1, err := service.BundleProvider.GetBundleBalanceByOrderUUID(context.Background(), &bundle.GetBundleBalanceByOrderUUIDReq{OrderUUID: balanceInfoRes.OrderUUID})
if err != nil {
err = errors.New("获取最初非续费订单失败")
service.Error(ctx, err)
return
}
fmt.Println("resp1", resp1)
req.SubmitStartTime = time.Unix(resp1.StartTime, 0).Format("2006-01-02 15:04:05")
req.SubmitEndTime = time.UnixMilli(balanceInfoRes.ExpiredTime).Format("2006-01-02 15:04:05")
if resp1.Status == 1 {
// 说明查询失败,采用当前套餐的开始时间
req.SubmitStartTime = time.UnixMilli(balanceInfoRes.StartTime).Format("2006-01-02 15:04:05")
}
req.SubNum = loginInfo.SubNum
}
if balanceInfoRes.BundleStatus == common.BundleExpired {
req.SubmitStartTime = time.UnixMilli(balanceInfoRes.StartTime).Format("2006-01-02 15:04:05")
req.SubmitEndTime = time.UnixMilli(balanceInfoRes.ExpiredTime).Format("2006-01-02 15:04:05")
req.SubmitStartTime = time.Unix(balanceInfoRes.PayTime, 0).Format("2006-01-02 15:04:05")
req.SubmitEndTime = time.Unix(balanceInfoRes.ExpiredTime, 0).Format("2006-01-02 15:04:05")
}
resp, err := service.CastProvider.ListWorkAnalysis(newCtx, req)
if err != nil {
@ -638,13 +296,6 @@ func DeleteWorkAnalysis(ctx *gin.Context) {
service.Error(ctx, err)
return
}
if service.BundleProvider != nil {
if _, e := service.BundleProvider.RevertTaskCompletionByUUIDItem(context.Background(), &bundle.RevertTaskCompletionByUUIDItemRequest{Uuid: req.Uuid}); e != nil {
zap.L().Error("回撤数量失败", zap.Error(e))
}
} else {
zap.L().Warn("BundleProvider is nil, skipping RevertTaskCompletionByUUIDItem")
}
service.Success(ctx, nil)
return
}
@ -838,204 +489,16 @@ func ArtistMetricsSeries(ctx *gin.Context) {
service.Error(ctx, err)
return
}
if req.ArtistUUID == "" {
service.Error(ctx, errors.New("参数错误"))
return
}
subNum := ""
if strings.HasPrefix(strings.ToUpper(req.ArtistUUID), "FE") {
subNum = req.ArtistUUID
} else {
artistID, err := strconv.ParseUint(req.ArtistUUID, 10, 64)
if err != nil {
service.Error(ctx, errors.New("艺人编号格式不正确"))
return
}
infoResp, err := service.AccountFieeProvider.Info(context.Background(), &accountFiee.InfoRequest{
ID: artistID,
Domain: "app",
})
if err != nil {
service.Error(ctx, errors.New("自媒体用户查询失败"))
return
}
if infoResp == nil || infoResp.SubNum == "" {
service.Error(ctx, errors.New("自媒体用户不存在"))
return
}
subNum = infoResp.SubNum
}
var subInfoResp *accountFiee.UserInfoResponse
var subInfoErr error
var workStatsResp *cast.GetArtistWorkStatsResp
var metricsResp *cast.ArtistMetricsSeriesResp
var workStatsErr, metricsErr error
wg := sync.WaitGroup{}
wg.Add(2)
// 并行调用 SubNumGetInfo、ArtistMetricsSeries
go func() {
defer wg.Done()
subInfoResp, subInfoErr = service.AccountFieeProvider.SubNumGetInfo(context.Background(), &accountFiee.SubNumGetInfoRequest{
SubNum: subNum,
Domain: "app",
})
}()
go func() {
defer wg.Done()
metricsResp, metricsErr = service.CastProvider.ArtistMetricsSeries(context.Background(), req)
}()
wg.Wait()
if subInfoErr != nil {
service.Error(ctx, errors.New("自媒体用户查询失败"))
return
}
if subInfoResp == nil || subInfoResp.Id == 0 {
service.Error(ctx, errors.New("自媒体用户不存在"))
return
}
req.ArtistUUID = fmt.Sprint(subInfoResp.Id)
// 将 ArtistMetricsSeriesReq 中 int 类型日期YYYYMMDD格式化为时间字符串作为快照截止时间
statusUpdateTime := ""
if req.Date > 0 {
parsedDate, parseErr := time.Parse("20060102", strconv.Itoa(int(req.Date)))
if parseErr == nil {
statusUpdateTime = parsedDate.Add(17 * time.Hour).Format("2006-01-02 15:04:05")
}
}
newCtx := NewCtxWithUserInfo(ctx)
workStatsResp, workStatsErr = service.CastProvider.GetArtistWorkStats(newCtx, &cast.GetArtistWorkStatsReq{
ArtistUuid: req.ArtistUUID,
StatusUpdateTime: statusUpdateTime,
})
var accountConsumptionNumber int32
var videoCount int64
var imageCount int64
if workStatsErr == nil && workStatsResp != nil {
accountConsumptionNumber = int32(workStatsResp.AccountCount)
videoCount = workStatsResp.VideoCount
imageCount = workStatsResp.ImageCount
} else if workStatsErr != nil {
zap.L().Warn("GetArtistWorkStats failed", zap.Error(workStatsErr), zap.String("artistUUID", req.ArtistUUID), zap.String("statusUpdateTime", statusUpdateTime))
}
if metricsErr != nil {
service.Error(ctx, errors.New("查询失败"))
resp, err := service.CastProvider.ArtistMetricsSeries(newCtx, req)
if err != nil {
service.Error(ctx, err)
return
}
resp := metricsResp
raw, _ := json.Marshal(resp)
respMap := make(map[string]interface{})
_ = json.Unmarshal(raw, &respMap)
respMap["accountConsumptionNumber"] = accountConsumptionNumber
respMap["videoCount"] = videoCount
respMap["imageCount"] = imageCount
// 调用 AI 分析数据
analysis, err := generateArtistMetricsAnalysis(resp)
if err != nil {
zap.L().Error("生成艺人指标分析失败", zap.Error(err))
// AI 分析失败不影响主业务,返回空字符串
respMap["analysis"] = ""
} else {
respMap["analysis"] = analysis
}
service.Success(ctx, respMap)
service.Success(ctx, resp)
return
}
// generateArtistMetricsAnalysis 调用 AI 分析艺人指标数据
func generateArtistMetricsAnalysis(resp *cast.ArtistMetricsSeriesResp) (string, error) {
if resp == nil {
return "", errors.New("数据为空")
}
// 构建分析用的数据摘要
var dataSummary strings.Builder
dataSummary.WriteString("艺人各平台数据表现如下:\n")
// 粉丝数
if resp.FansSeries != nil {
dataSummary.WriteString(fmt.Sprintf("粉丝数总数: %d (周期类型: %d, 开始日期: %d, 结束日期: %d)\n",
resp.FansSeries.FansCount, resp.FansSeries.PeriodType, resp.FansSeries.StartDate, resp.FansSeries.EndDate))
}
// 播放量
if resp.ViewsSeries != nil {
dataSummary.WriteString(fmt.Sprintf("播放量总数: %d (周期类型: %d, 开始日期: %d, 结束日期: %d)\n",
resp.ViewsSeries.ViewsCount, resp.ViewsSeries.PeriodType, resp.ViewsSeries.StartDate, resp.ViewsSeries.EndDate))
}
// 点赞数
if resp.LikesSeries != nil {
dataSummary.WriteString(fmt.Sprintf("点赞数总数: %d (周期类型: %d, 开始日期: %d, 结束日期: %d)\n",
resp.LikesSeries.LikesCount, resp.LikesSeries.PeriodType, resp.LikesSeries.StartDate, resp.LikesSeries.EndDate))
}
// 评论数
if resp.CommentsSeries != nil {
dataSummary.WriteString(fmt.Sprintf("评论数总数: %d (周期类型: %d, 开始日期: %d, 结束日期: %d)\n",
resp.CommentsSeries.CommentsCount, resp.CommentsSeries.PeriodType, resp.CommentsSeries.StartDate, resp.CommentsSeries.EndDate))
}
// 分享数
if resp.SharesSeries != nil {
dataSummary.WriteString(fmt.Sprintf("分享数总数: %d (周期类型: %d, 开始日期: %d, 结束日期: %d)\n",
resp.SharesSeries.SharesCount, resp.SharesSeries.PeriodType, resp.SharesSeries.StartDate, resp.SharesSeries.EndDate))
}
// 最佳发布时间
if resp.BestPostTime != nil {
dataSummary.WriteString(fmt.Sprintf("最佳发布时间: %s\n", resp.BestPostTime.DetailJSON))
}
// 最活跃日期
if resp.MostActiveDay != nil {
dataSummary.WriteString(fmt.Sprintf("最活跃日期: %s\n", resp.MostActiveDay.DetailJSON))
}
// 构建 prompt
prompt := fmt.Sprintf(`根据以下艺人各平台运营数据分析各平台数据表现结合相关数据简要表述优点文字内容在150-200字之间标点符号不计入字数回复时不需要返回具体字数。注意回复时请使用平台名称如TIKTOK、INS等而非数字。重要不要逐一列举所有平台名称只需提及有亮点的平台即可\n%s`, dataSummary.String())
// 调用 AI
req := modelQwen.ChatRequest{
Model: "qwen-plus",
Messages: []modelQwen.Message{
{
Role: "user",
Content: []modelQwen.Content{
{
Type: "text",
Text: prompt,
},
},
},
},
}
respAI, err := qwen.Chat(req)
if err != nil {
return "", err
}
if respAI == nil || len(respAI.Choices) == 0 {
return "", errors.New("AI 返回结果为空")
}
return respAI.Choices[0].Message.Content, nil
}
// ArtistMetricsDailyWindow 艺人指标日窗口
func ArtistMetricsDailyWindow(ctx *gin.Context) {
var req *cast.ArtistMetricsDailyWindowReq
@ -1065,39 +528,6 @@ func TobeConfirmedList(ctx *gin.Context) {
userInfo := login.GetUserInfoFromC(ctx)
req.ArtistUuid = strconv.Itoa(int(userInfo.ID))
newCtx := NewCtxWithUserInfo(ctx)
loginInfo := login.GetUserInfoFromC(ctx)
// 查询用户套餐有没有过期
balanceInfoRes, err := service.BundleProvider.GetBundleBalanceByUserId(context.Background(), &bundle.GetBundleBalanceByUserIdReq{
UserId: int32(loginInfo.ID),
})
if err != nil {
zap.L().Error("TobeConfirmedList GetBundleBalanceByUserId", zap.Any("err", err))
service.Error(ctx, errors.New(common.GetUserBalanceFailed))
return
}
// 套餐未过期的话,获取套餐的开始时间和结束时间
if balanceInfoRes.BundleStatus == common.BundleNotExpired {
zap.L().Info("TobeConfirmedList BundleNotExpired", zap.Any("loginInfo", loginInfo))
// 调用GetBundleBalanceByOrderUUID接口
resp1, err := service.BundleProvider.GetBundleBalanceByOrderUUID(context.Background(), &bundle.GetBundleBalanceByOrderUUIDReq{OrderUUID: balanceInfoRes.OrderUUID})
if err != nil {
err = errors.New("获取最初非续费订单失败")
service.Error(ctx, err)
return
}
fmt.Println("resp1", resp1)
req.StartAt = time.Unix(resp1.StartTime, 0).Format("2006-01-02 15:04:05")
req.ExpiredAt = time.UnixMilli(balanceInfoRes.ExpiredTime).Format("2006-01-02 15:04:05")
if resp1.Status == 1 {
// 说明查询失败,采用当前套餐的开始时间的前两天时间
req.StartAt = time.UnixMilli(balanceInfoRes.StartTime - 2*24*60*60*1000).Format("2006-01-02 15:04:05")
}
}
// 如果过期的话,获取套餐的开始时间和结束时间
if balanceInfoRes.BundleStatus == common.BundleExpired {
req.StartAt = time.UnixMilli(balanceInfoRes.StartTime).Format("2006-01-02 15:04:05")
req.ExpiredAt = time.UnixMilli(balanceInfoRes.ExpiredTime).Format("2006-01-02 15:04:05")
}
resp, err := service.CastProvider.TobeConfirmedList(newCtx, req)
if err != nil {
service.Error(ctx, err)
@ -1125,24 +555,6 @@ func UpdateWorkAnalysisApprovalID(ctx *gin.Context) {
return
}
// UpdateWorkAnalysisPdfUrl 更新作品分析PDF链接
func UpdateWorkAnalysisPdfUrl(ctx *gin.Context) {
var req *cast.UpdateWorkAnalysisReq
var err error
if err = ctx.ShouldBind(&req); err != nil {
service.Error(ctx, err)
return
}
newCtx := NewCtxWithUserInfo(ctx)
_, err = service.CastProvider.UpdateWorkAnalysisPdfUrl(newCtx, req)
if err != nil {
service.Error(ctx, err)
return
}
service.Success(ctx, nil)
return
}
type CheckBundleBalanceReq struct {
ArtistID string `protobuf:"bytes,4,opt,name=artistID,proto3" json:"artistID"` // 艺人ID
BalanceType modelCast.BalanceTypeEnum `json:"balanceType"` // 套餐类型
@ -1253,11 +665,6 @@ func autoConfirmAnalysis(ctx context.Context, analysisUuid string) (err error) {
isFailed = true
}
if infoResp == nil {
zap.L().Error("autoConfirmAnalysis GetWorkAnalysis返回nil")
return
}
if infoResp.WorkAnalysisStatus != 4 { // 4是待确认状态需要根据实际情况调整
return
}

View File

@ -1,126 +0,0 @@
package cast
import (
"context"
"errors"
"fmt"
"strings"
"time"
"fonchain-fiee/api/cast"
"fonchain-fiee/pkg/cache"
logicCast "fonchain-fiee/pkg/logic/cast"
"fonchain-fiee/pkg/model/login"
"fonchain-fiee/pkg/service"
"fonchain-fiee/pkg/utils"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
// PublishLogList 查询发布记录列表
func PublishLogList(ctx *gin.Context) {
var req cast.ListPublishLogReq
if err := ctx.ShouldBind(&req); err != nil {
service.Error(ctx, err)
return
}
resp, err := service.CastProvider.ListPublishLog(context.Background(), &req)
if err != nil {
service.Error(ctx, err)
return
}
service.Success(ctx, resp)
}
// PublishLogListExport 导出发布记录列表 Excel
func PublishLogListExport(ctx *gin.Context) {
var req cast.ListPublishLogReq
if err := ctx.ShouldBind(&req); err != nil {
service.Error(ctx, errors.New("绑定参数失败"))
return
}
loginInfo := login.GetUserInfoFromC(ctx)
newCtx := NewCtxWithUserInfo(ctx)
lockKey := "PublishLogListExport" + fmt.Sprint(loginInfo.ID)
replay := cache.RedisClient.SetNX(lockKey, time.Now().Unix(), time.Minute*30)
if !replay.Val() {
service.Error(ctx, errors.New("已有导出任务在进行中,请稍后再试"))
return
}
defer cache.RedisClient.Del(lockKey)
const batchSize = 5000
var allData []*cast.PublishLogInfo
page := int32(1)
if req.Page > 0 {
page = req.Page
}
originalPageSize := req.PageSize
req.PageSize = batchSize
zap.L().Info("开始分批导出发布记录列表", zap.Int32("batchSize", batchSize))
for {
req.Page = page
zap.L().Info("获取第 N 页数据", zap.Int32("page", page), zap.Int32("pageSize", req.PageSize))
resp, err := service.CastProvider.ListPublishLog(newCtx, &req)
if err != nil {
zap.L().Error("获取发布记录失败", zap.Error(err), zap.Int32("page", page))
service.Error(ctx, errors.New("获取发布记录失败"))
return
}
if resp == nil || len(resp.Data) == 0 {
zap.L().Info("没有更多数据", zap.Int32("page", page))
break
}
allData = append(allData, resp.Data...)
zap.L().Info("获取数据成功",
zap.Int32("page", page),
zap.Int("本批次数量", len(resp.Data)),
zap.Int("累计总数", len(allData)))
if len(resp.Data) < batchSize {
zap.L().Info("已到最后一页", zap.Int32("page", page))
break
}
page++
}
req.PageSize = originalPageSize
zap.L().Info("数据获取完成开始生成Excel", zap.Int("总数据量", len(allData)))
if len(allData) == 0 {
service.Error(ctx, errors.New("没有数据可导出"))
return
}
fileName := fmt.Sprintf("发布记录_%s.xlsx", time.Now().Format("20060102150405"))
filePath := fmt.Sprintf("./runtime/%d/%s", loginInfo.ID, fileName)
utils.CheckDirPath("./runtime/"+fmt.Sprint(loginInfo.ID), true)
var logicWork = new(logicCast.Work)
if err := logicWork.ExportPublishLogList(allData, filePath); err != nil {
zap.L().Error("生成Excel失败", zap.Error(err))
service.Error(ctx, err)
return
}
scheme := "http"
if ctx.GetHeader("X-Forwarded-Proto") == "https" {
scheme = "https"
}
exportUrl := fmt.Sprintf("%s://%s/api/fiee/static/%s", scheme, ctx.Request.Host, strings.Replace(filePath, "./runtime/", "", 1))
zap.L().Info("Excel导出成功", zap.String("文件名", fileName), zap.Int("记录数", len(allData)))
service.Success(ctx, map[string]interface{}{
"url": exportUrl,
})
}

View File

@ -1,7 +1,6 @@
package cast
import (
"bytes"
"context"
"errors"
"fmt"
@ -18,14 +17,12 @@ import (
"fonchain-fiee/pkg/service/upload"
"fonchain-fiee/pkg/utils"
"fonchain-fiee/pkg/utils/stime"
"math/rand"
"net/url"
"os"
"path/filepath"
"strconv"
"strings"
"time"
"unicode/utf8"
"github.com/google/uuid"
@ -35,37 +32,21 @@ import (
"go.uber.org/zap"
)
// CreateCompetitiveReportReqEx 扩展的竞品报告请求包含AI生成的JSON数据
type CreateCompetitiveReportReqEx struct {
*cast.CreateCompetitiveReportReq // 嵌入原有请求
ReportData utils.CompetitorReportData `json:"json_data"` // AI生成的竞品报告数据支持 reportData 和 json_data 两种字段名)
}
// CreateCompetitiveReport 创建竞品报告
func CreateCompetitiveReport(ctx *gin.Context) {
var reqEx CreateCompetitiveReportReqEx
var req *cast.CreateCompetitiveReportReq
var err error
if err = ctx.ShouldBindJSON(&reqEx); err != nil {
if err = ctx.ShouldBind(&req); err != nil {
service.Error(ctx, err)
return
}
// 转换为原有类型
req := reqEx.CreateCompetitiveReportReq
resp, err := CreateCompetitiveReportCore(ctx, req, reqEx.ReportData)
if err != nil {
service.Error(ctx, err)
return
}
service.Success(ctx, resp)
return
}
func CreateCompetitiveReportCore(ctx *gin.Context, req *cast.CreateCompetitiveReportReq, reportData utils.CompetitorReportData) (*cast.CreateCompetitiveReportResp, error) {
loginInfo := login.GetUserInfoFromC(ctx)
lockKey := fmt.Sprintf("lock_create_competitive_report_%d", loginInfo.ID)
reply := cache.RedisClient.SetNX(lockKey, time.Now().Format("2006-01-02 15:04:05"), time.Second*5)
if !reply.Val() {
return nil, errors.New("请勿重复提交")
service.Error(ctx, errors.New("请勿重复提交"))
return
}
defer func() {
cache.RedisClient.Del(lockKey)
@ -74,8 +55,8 @@ func CreateCompetitiveReportCore(ctx *gin.Context, req *cast.CreateCompetitiveRe
newCtx := NewCtxWithUserInfo(ctx)
artistID, _ := strconv.ParseUint(req.ArtistID, 10, 64)
// 通过接口查询艺人信息,自动填充艺人名字、手机号等信息
var infoResp *accountFiee.UserInfoResponse
var err error
if config.AppConfig.System.AppMode != "dev" {
infoResp, err = service.AccountFieeProvider.Info(context.Background(), &accountFiee.InfoRequest{
ID: artistID,
@ -83,7 +64,8 @@ func CreateCompetitiveReportCore(ctx *gin.Context, req *cast.CreateCompetitiveRe
})
zap.L().Info("CreateCompetitiveReport", zap.Any("infoResp", infoResp))
if err != nil {
return nil, err
service.Error(ctx, err)
return
}
} else {
infoResp = &accountFiee.UserInfoResponse{
@ -93,6 +75,7 @@ func CreateCompetitiveReportCore(ctx *gin.Context, req *cast.CreateCompetitiveRe
}
}
// 填充艺人信息到请求中
req.ArtistName = infoResp.Name
req.ArtistPhone = infoResp.TelNum
req.SubNum = infoResp.SubNum
@ -100,93 +83,100 @@ func CreateCompetitiveReportCore(ctx *gin.Context, req *cast.CreateCompetitiveRe
if _, err = CheckUserBundleBalance(int32(artistID), modelCast.BalanceTypeCompetitiveValue); err != nil {
if err != nil && err.Error() == e.ErrorBalanceInsufficient {
return nil, errors.New("该艺人竞品报告可用次数为0")
service.Error(ctx, errors.New("该艺人竞品报告可用次数为0"))
return
}
return nil, err
service.Error(ctx, err)
return
}
// 获取套餐订单uuid
resp1, err := service.BundleProvider.GetBundleBalanceByUserId(context.Background(), &bundle.GetBundleBalanceByUserIdReq{UserId: int32(artistID)})
if err != nil {
return nil, err
service.Error(ctx, err)
return
}
if resp1.OrderUUID == "" {
return nil, errors.New("订单不存在")
service.Error(ctx, errors.New("订单不存在"))
return
}
req.BundleOrderUuid = resp1.OrderUUID
// 验证:必须传入 json_data使用模板方式生成PDF
hasReportData := reportData.OverallSummary != "" || reportData.HighlightAnalysis.Summary != ""
if !hasReportData {
return nil, errors.New("参数错误")
if req.ReportContent == "" && req.ImageUrl == "" {
err = errors.New("报告内容和图片不能同时为空")
service.Error(ctx, err)
return
}
// 检查图片URL是否包含阿里云如果包含则下载并重新上传到OSS
if req.ImageUrl != "" {
newImageUrl, err := checkAndReuploadImageForReport(req.ImageUrl)
if err != nil {
zap.L().Error("图片重新上传失败", zap.String("imageUrl", req.ImageUrl), zap.Error(err))
return nil, fmt.Errorf("图片处理失败: %v", err)
service.Error(ctx, fmt.Errorf("图片处理失败: %v", err))
return
}
req.ImageUrl = newImageUrl
}
// 使用模板方式生成PDF
zap.L().Info("reportData内容", zap.Any("reportData", reportData))
fmt.Println(reportData)
// 如果提供了报告内容和图片URL则生成PDF并上传
if req.ReportContent != "" {
// 生成临时PDF文件路径
today := time.Now().Format("20060102")
timestamp := time.Now().UnixMicro()
pdfFileName := fmt.Sprintf("%s%s老师的竞品报告%d.pdf", today, req.ArtistName, timestamp)
pdfFilePath := "./runtime/report_pdf/" + pdfFileName
// 直接使用传入的结构体数据
competitorReportData := reportData
// 如果有图片URL设置到reportData中
if req.ImageUrl != "" {
competitorReportData.ImageURL = req.ImageUrl
}
// 截断超长字段按AI生成的字段长度要求
competitorReportData = truncateCompetitorReportData(competitorReportData)
zap.L().Info("解析成功", zap.Any("competitorReportData", competitorReportData))
// 生成PDF文件名使用报告标题命名
pdfFileName := generateReportFileName(req.Title, req.ArtistName) + ".pdf"
pdfFilePath := "./runtime/report_pdf/" + pdfFileName
_, err = utils.CheckDirPath("./runtime/report_pdf/", true)
if err != nil {
return nil, fmt.Errorf("创建PDF目录失败: %v", err)
}
// 模板路径
templatePath := "./data/竞品报告pdf模板.pdf"
// 调用 GenerateCompetitorReportPDF
err = utils.GenerateCompetitorReportPDF(templatePath, pdfFilePath, competitorReportData)
if err != nil {
zap.L().Error("生成PDF失败", zap.Error(err))
return nil, errors.New("生成PDF失败")
}
defer func() {
if _, err := os.Stat(pdfFilePath); err == nil {
if err := os.Remove(pdfFilePath); err != nil {
zap.L().Warn("删除临时PDF文件失败", zap.String("path", pdfFilePath), zap.Error(err))
} else {
zap.L().Info("删除临时PDF文件成功", zap.String("path", pdfFilePath))
}
// 确保目录存在
_, err = utils.CheckDirPath("./runtime/report_pdf/", true)
if err != nil {
service.Error(ctx, fmt.Errorf("创建PDF目录失败: %v", err))
return
}
}()
pdfUrl, uploadErr := upload.PutBos(pdfFilePath, upload.PdfType, true)
if uploadErr != nil {
zap.L().Error("上传PDF失败: %v", zap.Error(uploadErr))
return nil, errors.New("上传PDF失败")
// 生成PDF文件
fontPath := "./data/simfang.ttf"
err = utils.GeneratePDF(req.ReportContent, req.ImageUrl, pdfFilePath, fontPath)
if err != nil {
fmt.Println("生成PDF失败", err)
zap.L().Error("生成PDF失败", zap.Error(err))
service.Error(ctx, errors.New("生成PDF失败"))
return
}
fmt.Println("生成PDF成功", pdfFilePath)
defer func() {
// 检查文件是否存在,存在才删除
if _, err := os.Stat(pdfFilePath); err == nil {
if err := os.Remove(pdfFilePath); err != nil {
zap.L().Warn("删除临时PDF文件失败", zap.String("path", pdfFilePath), zap.Error(err))
} else {
zap.L().Info("删除临时PDF文件成功", zap.String("path", pdfFilePath))
}
}
}()
// 上传PDF到OSS
pdfUrl, uploadErr := upload.PutBos(pdfFilePath, upload.PdfType, true)
if uploadErr != nil {
zap.L().Error("上传PDF失败: %v", zap.Error(uploadErr))
service.Error(ctx, errors.New("上传PDF失败"))
return
}
// 将上传后的PDF链接设置到请求中
req.PdfUrl = pdfUrl
} else {
req.PdfUrl = req.ImageUrl
}
req.PdfUrl = pdfUrl
resp, err := service.CastProvider.CreateCompetitiveReport(newCtx, req)
if err != nil {
return nil, err
service.Error(ctx, err)
return
}
return resp, nil
service.Success(ctx, resp)
return
}
// ImportCompetitiveReportBatch 批量导入竞品报告
@ -336,94 +326,14 @@ func ImportCompetitiveReportBatch(ctx *gin.Context) {
temp.Title = nowDate + temp.ArtistName + "老师竞品报告"
}
}
// 构建竞品报告数据(新模板格式)
// D列row[3]):亮点表现分析 - 对应Summary字段
// E列row[4]):标题亮点
// F列row[5]):题材亮点
// G列row[6]):内容亮点
// H列row[7]):文案亮点
// I列row[8]):数据亮点
// J列row[9]):配乐亮点
// K列row[10]):浏览量
// L列row[11]):完播率
// M列row[12]):点赞/分享/评论
// N列row[13]):整体总结及可优化建议
// O列row[14]):图片
var competitorReportData utils.CompetitorReportData
// 解析亮点表现分析
highlightAnalysis := utils.HighlightAnalysisData{
Points: utils.PointsData{},
}
// 亮点表现分析摘要D列row[3]
// 解析报告内容D列row[3]
if len(row) > 3 {
highlightAnalysis.Summary = utils.CleanString(row[3])
temp.ReportContent = row[3]
}
// 标题亮点E列row[4]
if len(row) > 4 {
highlightAnalysis.Points.Theme = utils.CleanString(row[4])
}
// 题材亮点F列row[5]
if len(row) > 5 {
highlightAnalysis.Points.Narrative = utils.CleanString(row[5])
}
// 内容亮点G列row[6]
if len(row) > 6 {
highlightAnalysis.Points.Content = utils.CleanString(row[6])
}
// 文案亮点H列row[7]
if len(row) > 7 {
highlightAnalysis.Points.Copywriting = utils.CleanString(row[7])
}
// 数据亮点I列row[8]
if len(row) > 8 {
highlightAnalysis.Points.Data = utils.CleanString(row[8])
}
// 配乐亮点J列row[9]
if len(row) > 9 {
highlightAnalysis.Points.Music = utils.CleanString(row[9])
}
// 解析数据表现
dataPerformance := utils.DataPerformanceData{}
// 浏览量K列row[10]
if len(row) > 10 {
dataPerformance.Views = utils.CleanString(row[10])
}
// 完播率L列row[11]
if len(row) > 11 {
dataPerformance.Completion = utils.CleanString(row[11])
}
// 点赞/分享/评论M列row[12]
if len(row) > 12 {
dataPerformance.Engagement = utils.CleanString(row[12])
}
// 整体总结及可优化建议N列row[13]
if len(row) > 13 {
competitorReportData.OverallSummary = utils.CleanString(row[13])
}
// 图片URLO列row[14]
if len(row) > 14 && utils.CleanString(row[14]) != "" {
competitorReportData.ImageURL = utils.CleanString(row[14])
}
competitorReportData.HighlightAnalysis = highlightAnalysis
competitorReportData.DataPerformance = dataPerformance
// 截断超长字段按AI生成的字段长度要求
competitorReportData = truncateCompetitorReportData(competitorReportData)
// 验证标题长度数据库字段为varchar(50),按字符数计算)
if utf8.RuneCountInString(temp.Title) > 50 {
temp.Remark = "标题长度超出限制"
req.Reports = append(req.Reports, temp)
continue
// 解析图片URLE列row[4]
if len(row) > 4 && utils.CleanString(row[4]) != "" {
temp.ImageUrl = utils.CleanString(row[4])
}
// 验证必填字段
@ -433,133 +343,82 @@ func ImportCompetitiveReportBatch(ctx *gin.Context) {
continue
}
// 验证亮点表现分析D列Summary
if highlightAnalysis.Summary == "" {
temp.Remark = "亮点表现分析摘要不能为空"
// 验证报告内容和图片不能同时为空
if temp.ReportContent == "" && temp.ImageUrl == "" {
temp.Remark = "报告内容和图片不能同时为空"
req.Reports = append(req.Reports, temp)
continue
}
// 验证标题亮点E列
if highlightAnalysis.Points.Theme == "" {
temp.Remark = "标题亮点不能为空"
// 如果已经有错误信息跳过PDF生成
if temp.Remark != "" {
req.Reports = append(req.Reports, temp)
continue
}
// 验证题材亮点F列
if highlightAnalysis.Points.Narrative == "" {
temp.Remark = "题材亮点不能为空"
req.Reports = append(req.Reports, temp)
continue
}
// 验证内容亮点G列
if highlightAnalysis.Points.Content == "" {
temp.Remark = "内容亮点不能为空"
req.Reports = append(req.Reports, temp)
continue
}
// 验证文案亮点H列
if highlightAnalysis.Points.Copywriting == "" {
temp.Remark = "文案亮点不能为空"
req.Reports = append(req.Reports, temp)
continue
}
// 验证数据亮点I列
if highlightAnalysis.Points.Data == "" {
temp.Remark = "数据亮点不能为空"
req.Reports = append(req.Reports, temp)
continue
}
// 验证浏览量K列
if dataPerformance.Views == "" {
temp.Remark = "浏览量不能为空"
req.Reports = append(req.Reports, temp)
continue
}
// 验证点赞/分享/评论M列
if dataPerformance.Engagement == "" {
temp.Remark = "点赞/分享/评论不能为空"
req.Reports = append(req.Reports, temp)
continue
}
// 验证整体总结及可优化建议N列
if competitorReportData.OverallSummary == "" {
temp.Remark = "整体总结及可优化建议不能为空"
req.Reports = append(req.Reports, temp)
continue
}
// 处理图片URL
if competitorReportData.ImageURL != "" {
newImageUrl, err := checkAndReuploadImageForReport(competitorReportData.ImageURL)
// 检查图片URL是否包含阿里云如果包含则下载并重新上传到OSS
if temp.ImageUrl != "" {
newImageUrl, err := checkAndReuploadImageForReport(temp.ImageUrl)
if err != nil {
temp.Remark = fmt.Sprintf("图片处理失败: %v", err)
zap.L().Error("图片重新上传失败", zap.String("imageUrl", competitorReportData.ImageURL), zap.Error(err))
zap.L().Error("图片重新上传失败", zap.String("imageUrl", temp.ImageUrl), zap.Error(err))
req.Reports = append(req.Reports, temp)
continue
}
competitorReportData.ImageURL = newImageUrl
temp.ImageUrl = newImageUrl
}
// 生成PDF并上传
// 生成临时PDF文件路径使用报告标题命名
pdfFileName := generateReportFileName(temp.Title, temp.ArtistName) + ".pdf"
pdfFilePath := "./runtime/report_pdf/" + pdfFileName
// 如果提供了报告内容则生成PDF并上传
if temp.ReportContent != "" {
// 生成临时PDF文件路径
today := time.Now().Format("20060102")
timestamp := time.Now().UnixMicro()
pdfFileName := fmt.Sprintf("%s%s老师的竞品报告%d.pdf", today, temp.ArtistName, timestamp)
pdfFilePath := "./runtime/report_pdf/" + pdfFileName
// 确保目录存在
_, err = utils.CheckDirPath("./runtime/report_pdf/", true)
if err != nil {
temp.Remark = fmt.Sprintf("创建PDF目录失败: %v", err)
req.Reports = append(req.Reports, temp)
continue
}
// 确保目录存在
_, err = utils.CheckDirPath("./runtime/report_pdf/", true)
if err != nil {
temp.Remark = fmt.Sprintf("创建PDF目录失败: %v", err)
req.Reports = append(req.Reports, temp)
continue
}
// 模板路径
templatePath := "./data/竞品报告pdf模板.pdf"
// 生成PDF文件
fontPath := "./data/simfang.ttf"
err = utils.GeneratePDF(temp.ReportContent, temp.ImageUrl, pdfFilePath, fontPath)
if err != nil {
zap.L().Error("生成PDF失败", zap.Error(err))
temp.Remark = "生成PDF失败"
req.Reports = append(req.Reports, temp)
continue
}
// 使用新的 GenerateCompetitorReportPDF 生成PDF
err = utils.GenerateCompetitorReportPDF(templatePath, pdfFilePath, competitorReportData)
if err != nil {
zap.L().Error("生成PDF失败", zap.Error(err))
temp.Remark = "生成PDF失败"
req.Reports = append(req.Reports, temp)
continue
}
// 上传PDF到OSS
pdfUrl, uploadErr := upload.PutBos(pdfFilePath, upload.PdfType, true)
if uploadErr != nil {
zap.L().Error("上传PDF失败", zap.Error(uploadErr))
temp.Remark = "上传PDF失败"
req.Reports = append(req.Reports, temp)
// 清理临时PDF文件
if _, err := os.Stat(pdfFilePath); err == nil {
os.Remove(pdfFilePath)
}
continue
}
// 将上传后的PDF链接设置到请求中
temp.PdfUrl = pdfUrl
// 上传PDF到OSS
pdfUrl, uploadErr := upload.PutBos(pdfFilePath, upload.PdfType, true)
if uploadErr != nil {
zap.L().Error("上传PDF失败", zap.Error(uploadErr))
temp.Remark = "上传PDF失败"
req.Reports = append(req.Reports, temp)
// 清理临时PDF文件
if _, err := os.Stat(pdfFilePath); err == nil {
os.Remove(pdfFilePath)
}
continue
}
// 将上传后的PDF链接设置到请求中
temp.PdfUrl = pdfUrl
// 生成竞品报告正文
// 判断是否为视频如果有图片URL则为图片否则根据配乐亮点和完播率是否有值来判断
isVideo := competitorReportData.HighlightAnalysis.Points.Music != "" || competitorReportData.DataPerformance.Completion != ""
temp.ReportContent = utils.ConvertCompetitorReportToText(competitorReportData, isVideo)
// 清理临时PDF文件
if _, err := os.Stat(pdfFilePath); err == nil {
if err := os.Remove(pdfFilePath); err != nil {
zap.L().Warn("删除临时PDF文件失败", zap.String("path", pdfFilePath), zap.Error(err))
if err := os.Remove(pdfFilePath); err != nil {
zap.L().Warn("删除临时PDF文件失败", zap.String("path", pdfFilePath), zap.Error(err))
}
}
} else {
// 如果没有报告内容则将图片URL设置为PDF URL
temp.PdfUrl = temp.ImageUrl
}
req.Reports = append(req.Reports, temp)
@ -592,7 +451,7 @@ func ImportCompetitiveReportBatch(ctx *gin.Context) {
// 通过请求对象找到对应的Excel行号
if excelRowNum, ok := reportRowMap[reqReport]; ok {
// 将错误信息写入最后一列F列
excelData.SetCellValue("Sheet1", fmt.Sprintf("P%d", excelRowNum), v.Remark)
excelData.SetCellValue("Sheet1", fmt.Sprintf("F%d", excelRowNum), v.Remark)
hasValueRows[excelRowNum] = true
}
}
@ -859,24 +718,11 @@ func ListReportByArtistUuidForApp(ctx *gin.Context) {
// 套餐未过期的话,传入 subNum ,只获取该套餐的有效期内数据
if balanceInfoRes.BundleStatus == common.BundleNotExpired {
zap.L().Info("ListReportByArtistUuidForApp BundleNotExpired", zap.Any("loginInfo", loginInfo))
// 调用GetBundleBalanceByOrderUUID接口
resp1, err := service.BundleProvider.GetBundleBalanceByOrderUUID(context.Background(), &bundle.GetBundleBalanceByOrderUUIDReq{OrderUUID: balanceInfoRes.OrderUUID})
if err != nil {
err = errors.New("获取最初非续费订单失败")
service.Error(ctx, err)
return
}
fmt.Println("resp1", resp1)
req.SubmitStartTime = time.Unix(resp1.StartTime, 0).Format("2006-01-02 15:04:05")
req.SubmitEndTime = time.UnixMilli(balanceInfoRes.ExpiredTime).Format("2006-01-02 15:04:05")
if resp1.Status == 1 {
// 说明查询失败,采用当前套餐的开始时间
req.SubmitStartTime = time.UnixMilli(balanceInfoRes.StartTime).Format("2006-01-02 15:04:05")
}
req.SubNum = loginInfo.SubNum
}
if balanceInfoRes.BundleStatus == common.BundleExpired {
req.SubmitStartTime = time.UnixMilli(balanceInfoRes.StartTime).Format("2006-01-02 15:04:05")
req.SubmitEndTime = time.UnixMilli(balanceInfoRes.ExpiredTime).Format("2006-01-02 15:04:05")
req.SubmitStartTime = time.Unix(balanceInfoRes.PayTime, 0).Format("2006-01-02 15:04:05")
req.SubmitEndTime = time.Unix(balanceInfoRes.ExpiredTime, 0).Format("2006-01-02 15:04:05")
}
resp, err := service.CastProvider.ListCompetitiveReport(newCtx, req)
@ -903,13 +749,6 @@ func DeleteCompetitiveReport(ctx *gin.Context) {
service.Error(ctx, err)
return
}
if service.BundleProvider != nil {
if _, e := service.BundleProvider.RevertTaskCompletionByUUIDItem(context.Background(), &bundle.RevertTaskCompletionByUUIDItemRequest{Uuid: req.Uuid}); e != nil {
zap.L().Error("回撤数量失败", zap.Error(e))
}
} else {
zap.L().Warn("BundleProvider is nil, skipping RevertTaskCompletionByUUIDItem")
}
service.Success(ctx, nil)
return
}
@ -1323,340 +1162,3 @@ func checkAndReuploadImageForReport(imageUrl string) (string, error) {
return compressUrl, nil
}
// generateReportFileName 生成竞品报告PDF文件名
// 始终使用标题+时间戳格式避免文件名冲突导致OSS覆盖
func generateReportFileName(title, artistName string) string {
timestamp := time.Now().UnixMicro()
// 如果有标题,使用标题+时间戳
if title != "" {
// 替换标题中的特殊字符为合法字符
fileName := strings.NewReplacer(
"/", "",
"\\", "",
":", "",
"*", "",
"?", "",
"\"", "",
"<", "",
">", "",
"|", "",
" ", "_",
).Replace(title)
// 限制文件名长度,避免过长(预留时间戳的空间)
if len(fileName) > 80 {
fileName = fileName[:80]
}
return fmt.Sprintf("%s_%d", fileName, timestamp)
}
// 没有标题时使用默认格式
today := time.Now().Format("20060102")
return fmt.Sprintf("%s%s老师的竞品报告%d", today, artistName, timestamp)
}
// ImportPdfBatch 批量导入 PDF下载、重命名、上传
func ImportPdfBatch(ctx *gin.Context) {
// 获取上传的Excel文件
excelFile, err := ctx.FormFile("file")
if err != nil {
service.Error(ctx, err)
return
}
loginInfo := login.GetUserInfoFromC(ctx)
lockKey := fmt.Sprintf("import_pdf_batch:%d", loginInfo.ID)
replay := cache.RedisClient.SetNX(lockKey, time.Now().Format("20060102150405"), 5*time.Minute)
if !replay.Val() {
service.Error(ctx, errors.New("有导入任务正在进行,请稍后再试"))
return
}
defer cache.RedisClient.Del(lockKey)
tempDir := "./runtime/pdf_import"
_, err = utils.CheckDirPath(tempDir, true)
if err != nil {
service.Error(ctx, err)
return
}
// 生成文件名并保存文件
fileName := fmt.Sprintf("%d_pdf_import.xlsx", time.Now().UnixMicro())
excelPath := filepath.Join(tempDir, fileName)
if err = ctx.SaveUploadedFile(excelFile, excelPath); err != nil {
service.Error(ctx, err)
return
}
// 打开Excel文件
excelData, err := excelize.OpenFile(excelPath)
if err != nil {
service.Error(ctx, err)
return
}
defer excelData.Close()
// 解析Excel中的数据
rows, err := excelData.GetRows("Sheet1")
if err != nil {
service.Error(ctx, err)
return
}
// 生成结果文件URL
urlHost := config.AppConfig.System.FieeHost
urlResult := fmt.Sprintf("%s/api/fiee/static/pdf_import/%s", urlHost, fileName)
// 确保临时目录存在
_, err = utils.CheckDirPath("./runtime/pdf_import/", true)
if err != nil {
service.Error(ctx, err)
return
}
// 记录处理结果
successCount := 0
failCount := 0
for line, row := range rows {
// 跳过表头
if line == 0 {
continue
}
// 跳过空行
if len(row) == 0 {
continue
}
// A列PDF URL
pdfUrl := utils.CleanString(row[0])
// B列新文件名
newFileName := utils.CleanString(row[1])
// 验证必填字段
if pdfUrl == "" {
excelData.SetCellValue("Sheet1", fmt.Sprintf("D%d", line+1), "PDF URL不能为空")
failCount++
continue
}
if newFileName == "" {
excelData.SetCellValue("Sheet1", fmt.Sprintf("D%d", line+1), "新文件名不能为空")
failCount++
continue
}
// 下载 PDF保存到 runtime 目录,加入时间戳避免文件名冲突,上传后 URL 不包含 pdf_import 路径)
timestamp := time.Now().UnixMicro()
fullPath, err := utils.SaveUrlFileDisk(pdfUrl, "runtime", fmt.Sprintf("%s_%d.pdf", newFileName, timestamp))
if err != nil {
zap.L().Error("下载PDF失败", zap.String("pdfUrl", pdfUrl), zap.Error(err))
excelData.SetCellValue("Sheet1", fmt.Sprintf("D%d", line+1), fmt.Sprintf("下载PDF失败: %s", err.Error()))
failCount++
continue
}
// 上传到 OSS
uploadUrl, uploadErr := upload.PutBos(fullPath, upload.PdfType, true)
if uploadErr != nil {
zap.L().Error("上传PDF失败", zap.Error(uploadErr))
excelData.SetCellValue("Sheet1", fmt.Sprintf("D%d", line+1), fmt.Sprintf("上传PDF失败: %s", uploadErr.Error()))
failCount++
// 清理临时文件
if _, err := os.Stat(fullPath); err == nil {
os.Remove(fullPath)
}
continue
}
// 写入新URL到C列
excelData.SetCellValue("Sheet1", fmt.Sprintf("C%d", line+1), uploadUrl)
successCount++
zap.L().Info("PDF处理成功", zap.String("pdfUrl", pdfUrl), zap.String("newUrl", uploadUrl))
}
// 保存结果文件
resultPath := fmt.Sprintf("./runtime/pdf_import/%s", fileName)
if err = excelData.SaveAs(resultPath); err != nil {
service.Error(ctx, err)
return
}
// 返回结果
service.Success(ctx, map[string]interface{}{
"successCount": successCount,
"failCount": failCount,
"resultUrl": urlResult,
})
return
}
// ImportCompetitiveReportHistoryBatch 通过 Excel 批量刷写竞品报告历史数据
// Excel 列顺序ReportUuid | Title可为空| SubmitTime | ConfirmType | 结果(空,由接口写入)
func ImportCompetitiveReportHistoryBatch(ctx *gin.Context) {
excelFile, err := ctx.FormFile("file")
if err != nil {
service.Error(ctx, err)
return
}
loginInfo := login.GetUserInfoFromC(ctx)
lockKey := fmt.Sprintf("import_competitive_report_history_batch:%d", loginInfo.ID)
replay := cache.RedisClient.SetNX(lockKey, time.Now().Format("20060102150405"), 5*time.Minute)
if !replay.Val() {
service.Error(ctx, errors.New("有导入任务正在进行,请稍后再试"))
return
}
defer cache.RedisClient.Del(lockKey)
tempDir := "./runtime/report_pdf"
_, err = utils.CheckDirPath(tempDir, true)
if err != nil {
service.Error(ctx, err)
return
}
fileName := fmt.Sprintf("%d_competitive_report_history.xlsx", time.Now().UnixMicro())
excelPath := filepath.Join(tempDir, fileName)
if err = ctx.SaveUploadedFile(excelFile, excelPath); err != nil {
service.Error(ctx, err)
return
}
excelData, err := excelize.OpenFile(excelPath)
if err != nil {
service.Error(ctx, err)
return
}
defer excelData.Close()
rows, err := excelData.GetRows("Sheet1")
if err != nil {
service.Error(ctx, err)
return
}
newCtx := NewCtxWithUserInfo(ctx)
// 写入表头(第 4 列 ConfirmType第 5 列 结果)
_ = excelData.SetCellValue("Sheet1", "D1", "ConfirmType")
_ = excelData.SetCellValue("Sheet1", "E1", "结果")
successCount := 0
for line, row := range rows {
if line == 0 {
continue // 跳过表头
}
if len(row) == 0 {
continue
}
// Excel 行号1-basedline=1 → 行号 2
cellE := fmt.Sprintf("E%d", line+1)
// 第一列ReportUuid
reportUuid := ""
if len(row) > 0 {
reportUuid = utils.CleanString(row[0])
}
if reportUuid == "" {
_ = excelData.SetCellValue("Sheet1", cellE, "ReportUuid 不能为空")
continue
}
// 第二列Title可为空
title := ""
if len(row) > 1 {
title = utils.CleanString(row[1])
}
// 第三列SubmitTime
submitTime := ""
if len(row) > 2 {
submitTime = row[2]
}
// 第四列ConfirmType1 艺人确认2 系统自动确认)
var confirmType int32
if len(row) > 3 && utils.CleanString(row[3]) != "" {
v, _ := strconv.ParseInt(utils.CleanString(row[3]), 10, 32)
confirmType = int32(v)
}
// 将 submitTimeYYYY-MM-DD 00:00:00加随机 9~15 小时、0~59 分钟、0~59 秒,使提交时间更真实
if submitTime != "" {
if parsedTime, parseErr := time.Parse("2006-01-02 15:04:05", submitTime); parseErr == nil {
randomDuration := time.Duration(rand.Intn(7)+9)*time.Hour +
time.Duration(rand.Intn(60))*time.Minute +
time.Duration(rand.Intn(60))*time.Second
submitTime = parsedTime.Add(randomDuration).Format("2006-01-02 15:04:05")
}
}
// 构造请求
importReq := &cast.ImportCompetitiveReportHistoryReq{
ReportUuid: reportUuid,
SubmitTime: submitTime,
ConfirmType: confirmType,
}
if title != "" {
importReq.Title = title
}
importResp, err := service.CastProvider.ImportCompetitiveReportHistory(newCtx, importReq)
if err != nil {
zap.L().Error("ImportCompetitiveReportHistoryBatch ImportCompetitiveReportHistory",
zap.Error(err), zap.String("reportUuid", reportUuid))
_ = excelData.SetCellValue("Sheet1", cellE, fmt.Sprintf("导入失败:%s", err.Error()))
continue
}
// 导入成功,将返回的 report_uuid 写入第 5 列
_ = excelData.SetCellValue("Sheet1", cellE, importResp.ReportUuid)
successCount++
}
// 将修改后的 Excel 写入 buffer 并返回给客户端下载
buf, err := excelData.WriteToBuffer()
if err != nil {
service.Error(ctx, err)
return
}
utils.ResponseXls(ctx, bytes.NewReader(buf.Bytes()), fmt.Sprintf("竞品报告历史导入结果_%d成功", successCount))
}
// truncateCompetitorReportData 截断竞品报告数据中超长的字段
// 字段长度要求参考 AI 生成竞品报告的限制
func truncateCompetitorReportData(data utils.CompetitorReportData) utils.CompetitorReportData {
// 字段长度限制
const (
MaxSummary = 100 // 概述
MaxPointField = 60 // 标题/题材/内容/文案/数据/配乐亮点
MaxViews = 60 // 浏览量
MaxCompletion = 60 // 完播率
MaxEngagement = 60 // 点赞/分享/评论
MaxOverallSummary = 300 // 整体总结及可优化建议
)
// 截断亮点分析摘要
data.HighlightAnalysis.Summary = utils.TruncateTextByRune(data.HighlightAnalysis.Summary, MaxSummary)
// 截断各亮点字段
data.HighlightAnalysis.Points.Theme = utils.TruncateTextByRune(data.HighlightAnalysis.Points.Theme, MaxPointField)
data.HighlightAnalysis.Points.Narrative = utils.TruncateTextByRune(data.HighlightAnalysis.Points.Narrative, MaxPointField)
data.HighlightAnalysis.Points.Content = utils.TruncateTextByRune(data.HighlightAnalysis.Points.Content, MaxPointField)
data.HighlightAnalysis.Points.Copywriting = utils.TruncateTextByRune(data.HighlightAnalysis.Points.Copywriting, MaxPointField)
data.HighlightAnalysis.Points.Data = utils.TruncateTextByRune(data.HighlightAnalysis.Points.Data, MaxPointField)
data.HighlightAnalysis.Points.Music = utils.TruncateTextByRune(data.HighlightAnalysis.Points.Music, MaxPointField)
// 截断数据表现字段
data.DataPerformance.Views = utils.TruncateTextByRune(data.DataPerformance.Views, MaxViews)
data.DataPerformance.Completion = utils.TruncateTextByRune(data.DataPerformance.Completion, MaxCompletion)
data.DataPerformance.Engagement = utils.TruncateTextByRune(data.DataPerformance.Engagement, MaxEngagement)
// 截断整体总结
data.OverallSummary = utils.TruncateTextByRune(data.OverallSummary, MaxOverallSummary)
return data
}

View File

@ -8,7 +8,6 @@ import (
"fonchain-fiee/api/bundle"
"fonchain-fiee/api/cast"
"fonchain-fiee/cmd/config"
"fonchain-fiee/pkg/cache"
"fonchain-fiee/pkg/e"
"fonchain-fiee/pkg/model/login"
"fonchain-fiee/pkg/service"
@ -24,30 +23,14 @@ import (
"go.uber.org/zap"
)
const (
// scriptImportLockKey Redis分布式锁的key
scriptImportLockKey = "script:import:lock"
// scriptImportLockExpire 锁的过期时间(秒),防止死锁
scriptImportLockExpire = 600 // 10分钟根据实际导入时长调整
)
func UpdateVideoScriptCore(ctx *gin.Context, req *cast.UpdateVideoScriptReq) (*cast.UpdateVideoScriptResp, error) {
// UpdateVideoScript 更新视频脚本
func UpdateVideoScript(ctx *gin.Context) {
var req *cast.UpdateVideoScriptReq
var infoResp *accountFiee.UserInfoResponse
var err error
// 检查并截取 title 和 content 长度(支持中文)
titleRunes := []rune(req.Title)
if len(titleRunes) > 600 {
req.Title = string(titleRunes[:600])
}
contentRunes := []rune(req.Content)
if len(contentRunes) > 600 {
req.Content = string(contentRunes[:600])
}
if err = SecurityText(req.Title); err != nil {
return nil, errors.New(fmt.Sprintf("标题未通过黄反,原因:%s", err.Error()))
}
if err = SecurityText(req.Content); err != nil {
return nil, errors.New(fmt.Sprintf("内容未通过黄反,原因:%s", err.Error()))
if err = ctx.ShouldBind(&req); err != nil {
service.Error(ctx, err)
return
}
newCtx := NewCtxWithUserInfo(ctx)
artistId, _ := strconv.ParseUint(req.ArtistUuid, 10, 64)
@ -56,30 +39,17 @@ func UpdateVideoScriptCore(ctx *gin.Context, req *cast.UpdateVideoScriptReq) (*c
Domain: "app",
})
if err != nil {
return nil, err
service.Error(ctx, err)
return
}
if infoResp.Id == 0 {
return nil, errors.New(e.GetMsg(e.NOTDATA))
service.Error(ctx, errors.New(e.GetMsg(e.NOTDATA)))
return
}
req.ArtistName = infoResp.Name
req.ArtistPhone = infoResp.TelNum
req.ArtistNum = infoResp.SubNum
resp, err := service.CastProvider.UpdateVideoScript(newCtx, req)
if err != nil {
return nil, err
}
return resp, nil
}
// UpdateVideoScript 更新视频脚本
func UpdateVideoScript(ctx *gin.Context) {
var req *cast.UpdateVideoScriptReq
var err error
if err = ctx.ShouldBind(&req); err != nil {
service.Error(ctx, err)
return
}
resp, err := UpdateVideoScriptCore(ctx, req)
if err != nil {
service.Error(ctx, err)
return
@ -150,29 +120,7 @@ func DeleteVideoScript(ctx *gin.Context) {
}
func ImportBatch(ctx *gin.Context) {
loginInfo := login.GetUserInfoFromC(ctx)
lockValue := fmt.Sprintf("%d", loginInfo.ID)
locked, err := cache.RedisClient.SetNX(scriptImportLockKey, lockValue, scriptImportLockExpire*time.Second).Result()
if err != nil {
zap.L().Error("获取导入锁失败", zap.Error(err))
service.Error(ctx, errors.New("系统繁忙,请稍后再试"))
return
}
if !locked {
zap.L().Warn("当前有导入任务正在进行中,本次请求被拒绝")
service.Error(ctx, errors.New("当前有导入任务正在进行中,请稍后再试"))
return
}
defer func() {
// 只有当锁的值匹配时才删除,防止误删其他请求的锁
val, err := cache.RedisClient.Get(scriptImportLockKey).Result()
if err == nil && val == lockValue {
cache.RedisClient.Del(scriptImportLockKey)
zap.L().Info("导入任务结束,释放分布式锁")
}
}()
zap.L().Info("开始执行导入任务", zap.String("lockValue", lockValue))
//接收form表单的Excel保存到本地进行解析
excelFile, err := ctx.FormFile("file")
if err != nil {
service.Error(ctx, err)
@ -233,17 +181,6 @@ func ImportBatch(ctx *gin.Context) {
req.Data = append(req.Data, &temp)
continue
}
// 检查并截取 title 和 content 长度(支持中文)
titleRunes := []rune(temp.Title)
if len(titleRunes) > 600 {
temp.Title = string(titleRunes[:600])
}
contentRunes := []rune(temp.Content)
if len(contentRunes) > 600 {
temp.Content = string(contentRunes[:600])
}
if utf8.RuneCountInString(temp.Title) > 50 {
temp.Remark = "脚本标题过长限制50字以内"
req.Data = append(req.Data, &temp)
@ -254,18 +191,6 @@ func ImportBatch(ctx *gin.Context) {
req.Data = append(req.Data, &temp)
continue
}
err = SecurityText(temp.Title)
if err != nil {
temp.Remark = fmt.Sprintf("标题未通过黄反,原因:%s", err.Error())
req.Data = append(req.Data, &temp)
continue
}
err = SecurityText(temp.Content)
if err != nil {
temp.Remark = fmt.Sprintf("内容未通过黄反,原因:%s", err.Error())
req.Data = append(req.Data, &temp)
continue
}
var subInfoResp *accountFiee.UserInfoResponse
subInfoResp, err = service.AccountFieeProvider.SubNumGetInfo(context.Background(), &accountFiee.SubNumGetInfoRequest{
SubNum: row[2],

View File

@ -7,19 +7,138 @@ import (
"fonchain-fiee/api/aryshare"
"fonchain-fiee/api/cast"
"fonchain-fiee/cmd/config"
"fonchain-fiee/pkg/common/qwen"
modelQwen "fonchain-fiee/pkg/model/qwen"
"fonchain-fiee/pkg/service"
"fonchain-fiee/pkg/service/check"
"fonchain-fiee/pkg/utils"
"time"
"github.com/gin-gonic/gin"
"github.com/xuri/excelize/v2"
)
func Test(ctx *gin.Context) {
action := ctx.PostForm("action")
if action == "" {
// 打开Excel文件
excelPath := "./data/脚本.xlsx"
f, err := excelize.OpenFile(excelPath)
if err != nil {
service.Error(ctx, fmt.Errorf("打开Excel文件失败: %v", err))
return
}
defer f.Close()
// 获取第一个工作表名称
sheets := f.GetSheetList()
if len(sheets) == 0 {
service.Error(ctx, errors.New("Excel文件中没有工作表"))
return
}
sheetName := sheets[0]
// 读取所有行
rows, err := f.GetRows(sheetName)
if err != nil {
service.Error(ctx, fmt.Errorf("读取工作表失败: %v", err))
return
}
if len(rows) < 2 {
service.Error(ctx, errors.New("Excel文件中没有数据行"))
return
}
// 找到"标题"和"脚本"列的索引
header := rows[0]
titleColIndex := -1
scriptColIndex := -1
for i, cell := range header {
if cell == "标题" {
titleColIndex = i
}
if cell == "脚本" {
scriptColIndex = i
}
}
if titleColIndex == -1 || scriptColIndex == -1 {
service.Error(ctx, errors.New("未找到'标题'或'脚本'列"))
return
}
// 统计处理信息
processedCount := 0
errorCount := 0
// 遍历数据行从第2行开始跳过表头
for i := 1; i < len(rows); i++ {
row := rows[i]
// 确保行有足够的列
if len(row) <= titleColIndex || len(row) <= scriptColIndex {
continue
}
title := row[titleColIndex]
script := ""
if len(row) > scriptColIndex {
script = row[scriptColIndex]
}
// 如果脚本列为空且标题不为空则请求千问API
if script == "" && title != "" {
// 调用千问API生成脚本
resp, err := qwen.Chat(modelQwen.ChatRequest{
Model: "qwen3-max",
Messages: []modelQwen.Message{
{
Role: "user",
Content: []modelQwen.Content{
{
Type: "text",
Text: fmt.Sprintf("请为以下标题生成一个视频脚本:\n%s", title),
},
},
},
},
Seed: 0,
EnableSearch: false,
})
if err != nil {
// 记录错误但继续处理下一行
errorCount++
continue
}
// 获取生成的脚本内容
generatedScript := ""
if len(resp.Choices) > 0 {
generatedScript = resp.Choices[0].Message.Content
}
// 将生成的脚本写入Excel
cellName, _ := excelize.CoordinatesToCellName(scriptColIndex+1, i+1)
if err := f.SetCellValue(sheetName, cellName, generatedScript); err != nil {
errorCount++
continue
}
processedCount++
}
}
// 保存Excel文件
if err := f.Save(); err != nil {
service.Error(ctx, fmt.Errorf("保存Excel文件失败: %v", err))
return
}
service.Success(ctx, map[string]interface{}{
"now": time.Now().Unix(),
"message": "处理完成",
"processed": processedCount,
"errors": errorCount,
})
return
}
@ -120,28 +239,10 @@ func Test(ctx *gin.Context) {
service.CastProvider.Tools(context.Background(), &cast.ToolsReq{Action: action})
return
}
//刷新订单
if action == "artistOrderInfo" {
service.CastProvider.Tools(context.Background(), &cast.ToolsReq{Action: action})
return
}
//刷新审批状态
if action == "refreshApprovalStatus" {
/* resp, err := service.CastProvider.WorkList(context.Background(), &cast.WorkListReq{
Page: 1,
WorkStatus: uint32(cast.WorkActionENUM_APPROVAL),
PageSize: 9999,
})
if err != nil {
return
}
if resp.Data == nil || len(resp.Data) == 0 {
return
}
serverCast.RefreshWorkApproval(nil, resp.Data)
service.Success(ctx, resp.Data)
return*/
}
if action == "SecurityText" {
val := ctx.PostForm("val")
ok, err := check.SecurityFile(val)
@ -189,14 +290,6 @@ func Test(ctx *gin.Context) {
return
}
if action == "addDecodoProxies" {
service.CastProvider.Tools(context.Background(), &cast.ToolsReq{Action: action, CfgLinks: []string{
"http://spd7b09ho0:sqx_1MlQ1rN5gfm2Dx@isp.decodo.com:10001",
"http://spd7b09ho0:sqx_1MlQ1rN5gfm2Dx@isp.decodo.com:10002",
"http://spd7b09ho0:sqx_1MlQ1rN5gfm2Dx@isp.decodo.com:10003",
}})
}
service.Success(ctx, "unknow")
return
}

View File

@ -64,21 +64,6 @@ func UpdateWorkImageCore(ctx *gin.Context, req *cast.UpdateWorkImageReq) (*cast.
cache.RedisClient.Del(lockKey)
}()
fmt.Println(ok)
// 检查并截取 title 和 content 长度(支持中文)
titleRunes := []rune(req.Title)
if len(titleRunes) > 600 {
req.Title = string(titleRunes[:600])
}
contentRunes := []rune(req.Content)
if len(contentRunes) > 600 {
req.Content = string(contentRunes[:600])
}
if err = SecurityText(req.Title); err != nil {
return nil, errors.New(fmt.Sprintf("标题未通过黄反,原因:%s", err.Error()))
}
if err = SecurityText(req.Content); err != nil {
return nil, errors.New(fmt.Sprintf("内容未通过黄反,原因:%s", err.Error()))
}
// 图片鉴定
/*for _, v := range req.Images {
ok, err = check.SecurityFile(v)
@ -137,7 +122,6 @@ func UpdateWorkImageCore(ctx *gin.Context, req *cast.UpdateWorkImageReq) (*cast.
//if _, err = CheckUserBundleBalance(int32(artistID), modelCast.BalanceTypeImageValue); err != nil {
// return nil, err
//}
// 处理内容中的标签:提取、验证并批量导入,以及自动生成标签
content, err := processContentAndAutoTags(ctx, req.Content)
if err != nil {
@ -145,6 +129,7 @@ func UpdateWorkImageCore(ctx *gin.Context, req *cast.UpdateWorkImageReq) (*cast.
}
// 将自动生成标签后的内容更新到请求中
req.Content = content
zap.L().Debug("UpdateWorkImage infoResp3", zap.Any("infoResp", req))
newCtx := NewCtxWithUserInfo(ctx)
req.Source = 1
resp, err := service.CastProvider.UpdateWorkImage(newCtx, req)
@ -285,6 +270,7 @@ func processContentAndAutoTags(ctx *gin.Context, content string) (string, error)
if resp.Post == "" {
return content, nil
}
zap.L().Info("processContentAndAutoTags ", zap.Any("resp", resp))
return resp.Post, nil
}
@ -292,6 +278,7 @@ func processContentAndAutoTags(ctx *gin.Context, content string) (string, error)
func UpdateWorkVideoCore(ctx *gin.Context, req *cast.UpdateWorkVideoReq) (*cast.UpdateWorkVideoResp, error) {
var infoResp *accountFiee.UserInfoResponse
var err error
var ok bool
if req.CoverUrl != "" {
if filepath.Ext(req.CoverUrl) != ".jpg" && filepath.Ext(req.CoverUrl) != ".jpeg" {
return nil, errors.New("图片格式只支持jpg")
@ -306,21 +293,7 @@ func UpdateWorkVideoCore(ctx *gin.Context, req *cast.UpdateWorkVideoReq) (*cast.
defer func() {
cache.RedisClient.Del(lockKey)
}()
// 检查并截取 title 和 content 长度(支持中文)
titleRunes := []rune(req.Title)
if len(titleRunes) > 600 {
req.Title = string(titleRunes[:600])
}
contentRunes := []rune(req.Content)
if len(contentRunes) > 600 {
req.Content = string(contentRunes[:600])
}
if err = SecurityText(req.Title); err != nil {
return nil, errors.New(fmt.Sprintf("标题未通过黄反,原因:%s", err.Error()))
}
if err = SecurityText(req.Content); err != nil {
return nil, errors.New(fmt.Sprintf("内容未通过黄反,原因:%s", err.Error()))
}
fmt.Println(ok)
/* ok, err = check.SecurityText(req.Title)
if err != nil {
return nil, err
@ -342,6 +315,19 @@ func UpdateWorkVideoCore(ctx *gin.Context, req *cast.UpdateWorkVideoReq) (*cast.
if !ok {
return nil, errors.New("图片鉴定未通过")
}*/
if req.VideoUrl != "" && false {
//请求接口判断
fileResp, errs := service.FilesProvider.GetFileSecurityStatus(ctx, &files.GetFileSecurityStatusReq{
Url: req.VideoUrl,
FileName: "",
})
if errs != nil {
return nil, errs
}
if fileResp.SecurityStatus == "high" {
return nil, errors.New("视频鉴定未通过")
}
}
if config.AppConfig.System.AppMode != "dev" {
artistId, _ := strconv.ParseUint(req.ArtistUuid, 10, 64)
infoResp, err = service.AccountFieeProvider.Info(context.Background(), &accountFiee.InfoRequest{
@ -710,7 +696,7 @@ func PostAS(ctx context.Context, workUuid string, publishSource cast.PublishSour
var err error
//检查封面
_ = CheckImage(workUuid)
_, err = service.CastProvider.Publish(ctx, &cast.PublishReq{WorkUuids: []string{workUuid}, PublishSource: publishSource})
_, err = service.CastProvider.Publish(ctx, &cast.PublishReq{WorkUuids: []string{workUuid}})
if err != nil {
zap.L().Error("Publish err", zap.String("workUuid", workUuid), zap.Error(err))
return err
@ -735,10 +721,10 @@ func PostAS(ctx context.Context, workUuid string, publishSource cast.PublishSour
return nil
//return errors.New("作品无发布平台")
}
zap.L().Info("post 2", zap.Any("workUuid", workUuid), zap.Any("needPlatformIDs", needPlatformIDs))
zap.L().Info("post 2", zap.Any("workUuid", workUuid))
var mediaUrls []string
var isVideo bool
//var urlResp *UploadMediaResponse
// var urlResp *UploadMediaResponse
if workDetail.WorkCategory == 1 {
isVideo = false
// 先用服务器上的文件,不上传到第三方
@ -893,12 +879,11 @@ func PostAS(ctx context.Context, workUuid string, publishSource cast.PublishSour
}
if _err != nil {
_, errS := service.CastProvider.UpdateWorkPublishLog(context.Background(), &cast.UpdateWorkPublishLogReq{
WorkUuid: workUuid,
PlatformID: cast.PlatformIDENUM(platformID),
Action: "post",
Detail: _err.Error(),
PublishSource: publishSource,
PublishMediaStatus: cast.PublishStatusENUM_PublishMediaStatus_EXCEPTION,
WorkUuid: workUuid,
PlatformID: cast.PlatformIDENUM(platformID),
Action: "post",
Detail: _err.Error(),
PublishSource: publishSource,
})
if errS != nil {
zap.L().Error("PostAs UpdateWorkPublishLog err", zap.Error(errS), zap.Any("WorkUuid", workDetail.WorkUuid))
@ -979,22 +964,12 @@ func PostAS(ctx context.Context, workUuid string, publishSource cast.PublishSour
Remark: string(postData),
PublishSource: publishSource,
})
_, _ = service.CastProvider.UpdateWorkPublishLog(context.Background(), &cast.UpdateWorkPublishLogReq{
PlatformID: cast.PlatformIDENUM(platformID),
WorkUuid: workUuid,
Action: "post",
Detail: string(postData),
PublishSource: publishSource,
PublishMediaStatus: publishStatus,
PublishMediaID: postResp.Posts[0].Id,
})
}
zap.L().Info("post 10", zap.Any("workUuid", workUuid), zap.Any("platformID", platformID))
_, err = service.CastProvider.UpdateWorkPlatformInfo(context.Background(), infoReq)
if err != nil {
zap.L().Error("Publish UpdateWorkPlatformInfo failed", zap.String("workUuid", workUuid), zap.Error(err))
}
zap.L().Info("Publish Ayrshare PostResp", zap.Any("postResp", postResp))
}
zap.L().Info("post 5.1", zap.Any("workUuid", workUuid))
@ -1003,7 +978,8 @@ func PostAS(ctx context.Context, workUuid string, publishSource cast.PublishSour
func RePublish(ctx *gin.Context) {
var (
req *cast.RePublishReq
req *cast.RePublishReq
resp *cast.RePublishResp
//workInfoResp *cast.WorkInfoResp
)
var err error
@ -1015,38 +991,57 @@ func RePublish(ctx *gin.Context) {
req.PublishSource = cast.PublishSourceENUM_RePublishType_MANUAL
}
newCtx := NewCtxWithUserInfo(ctx)
err = republishCore(ctx, newCtx, req)
if err != nil {
/* workInfoResp, err = service.CastProvider.WorkInfo(context.Background(), &cast.WorkInfoReq{
WorkUuid: req.WorkUuid,
})
if err != nil {
service.Error(ctx, err)
return
}
fmt.Println(workInfoResp)*/
/*artistID, _ := strconv.ParseInt(workInfoResp.ArtistUuid, 10, 64)
if err = CheckUserBundleBalance(int32(artistID), modelCast.BalanceTypeVideoValue); err != nil {
service.Error(ctx, err)
return
}
service.Success(ctx, req)
return
}
func republishCore(gCtx *gin.Context, newCtx context.Context, req *cast.RePublishReq) error {
zap.L().Info("republishCore", zap.Any("req", req))
var resp *cast.RePublishResp
var err error
balanceReq := &bundle.AddBundleBalanceReq{
UserId: int32(artistID),
}
if workInfoResp.WorkCategory == 1 {
balanceReq.ImageConsumptionNumber = 1
}
if workInfoResp.WorkCategory == 2 {
balanceReq.VideoConsumptionNumber = 1
}
_, err = service.BundleProvider.AddBundleBalance(context.Background(), balanceReq)
if err != nil {
service.Error(ctx, err)
return
}*/
if len(req.PlatformIDs) == 0 && len(req.MediaAccountUuids) == 0 {
return errors.New("请选择发布平台或账号")
service.Error(ctx, errors.New("请选择发布平台或账号"))
return
}
if len(req.MediaAccountUuids) == 0 {
if len(req.WorkUuids) != 1 {
return errors.New("只选择平台时只能单个作品重发")
service.Error(ctx, errors.New("只选择平台时只能单个作品重发"))
return
}
workInfo, _err := service.CastProvider.WorkInfo(context.Background(), &cast.WorkInfoReq{WorkUuid: req.WorkUuids[0]})
if _err != nil {
return _err
service.Error(ctx, _err)
return
}
accountResp, _err := service.CastProvider.MediaAccounts(context.Background(), &cast.MediaAccountsReq{
ArtistUuid: workInfo.ArtistUuid,
})
if _err != nil {
return _err
service.Error(ctx, _err)
return
}
if accountResp == nil || len(accountResp.Data) == 0 {
return errors.New("该艺人无可用媒体账号")
service.Error(ctx, errors.New("该艺人无可用媒体账号"))
return
}
for _, platformId := range req.PlatformIDs {
for _, v := range accountResp.Data {
@ -1058,12 +1053,10 @@ func republishCore(gCtx *gin.Context, newCtx context.Context, req *cast.RePublis
}
resp, err = service.CastProvider.RePublish(newCtx, req)
if err != nil {
return err
}
var loginInfo login.Info
if gCtx != nil {
loginInfo = login.GetUserInfoFromC(gCtx)
service.Error(ctx, err)
return
}
loginInfo := login.GetUserInfoFromC(ctx)
var extraBytes []byte
extraBytes, _ = json.Marshal(req)
_, err = service.CastProvider.UpsertTaskList(newCtx, &cast.UpsertTaskListReq{
@ -1076,57 +1069,14 @@ func republishCore(gCtx *gin.Context, newCtx context.Context, req *cast.RePublis
})
if err != nil {
zap.L().Error("RePublish UpsertTaskList failed", zap.Error(err))
return err
service.Error(ctx, err)
return
}
if err = PublishWork(newCtx, &cast.PublishReq{WorkUuids: resp.WorkUuids}); err != nil {
return err
}
return nil
}
// CronRePublish 定时重发布接口不走登录校验通过header校验
func CronRePublish(ctx *gin.Context) {
// 从 header 中获取 API Key
apiNoAuthKey := ctx.GetHeader("X-Api-Key")
if apiNoAuthKey == "" {
service.Error(ctx, errors.New("非法请求!"))
return
}
// 从配置文件中获取预设的 API Key
expectedKey := "c8a2512cea2274a0f3d34520d82d51b3b149e7edc571e5f46854b8c6c0575920"
if apiNoAuthKey != expectedKey {
service.Error(ctx, errors.New("非法请求!!"))
return
}
// 校验通过,调用 RePublish 逻辑
var (
req *cast.RePublishReq
)
var err error
if err = ctx.ShouldBind(&req); err != nil {
service.Error(ctx, err)
return
}
// 设置发布源为定时任务
if req.PublishSource == cast.PublishSourceENUM_RePublishType_UNKNOW {
req.PublishSource = cast.PublishSourceENUM_RePublishType_SCHEDULED_RETRY
}
// 创建系统用户上下文(因为没有登录用户信息)
var mm = make(map[string]interface{}, 3)
mm["userid"] = ""
mm["name"] = "定时任务补发"
mm["phone"] = ""
newCtx := context.WithValue(context.Background(), constant.DubboCtxKey("attachment"), mm)
// 调用重发布服务
err = republishCore(nil, newCtx, req)
if err != nil {
service.Error(ctx, err)
return
}
service.Success(ctx, nil)
service.Success(ctx, req)
return
}
@ -1624,13 +1574,9 @@ func ImportWorkBatch(ctx *gin.Context) {
temp.ArtistPhoneAreaCode = subInfoResp.TelAreaCode
temp.ArtistSubNum = subInfoResp.SubNum
}
if len(row) > 7 {
temp.Title = utils.CleanString(row[7])
// 检查并截取 title 长度(支持中文)
titleRunes := []rune(temp.Title)
if len(titleRunes) > 600 {
temp.Title = string(titleRunes[:600])
}
ok, _err := check.SecurityText(temp.Title)
if _err != nil {
temp.Remark = _err.Error()
@ -1646,11 +1592,6 @@ func ImportWorkBatch(ctx *gin.Context) {
if len(row) > 8 {
temp.Content = utils.CleanString(row[8])
if temp.Content != "" {
// 检查并截取 content 长度(支持中文)
contentRunes := []rune(temp.Content)
if len(contentRunes) > 600 {
temp.Content = string(contentRunes[:600])
}
ok, _err := check.SecurityText(temp.Content)
if _err != nil {
temp.Remark = _err.Error()
@ -1710,6 +1651,11 @@ func ImportWorkBatch(ctx *gin.Context) {
req.ImageWorks = append(req.ImageWorks, temp)
continue
}
if mediaInfoResp.Info.Expired != 1 {
temp.Remark = fmt.Sprintf("TIKTOK账号名的套餐已过期")
req.ImageWorks = append(req.ImageWorks, temp)
continue
}
temp.PublishConfig1 = &cast.PublishConfig{
ForbidComment: 1,
PublicType: 1,
@ -1734,6 +1680,11 @@ func ImportWorkBatch(ctx *gin.Context) {
req.ImageWorks = append(req.ImageWorks, temp)
continue
}
if mediaInfoResp.Info.Expired != 1 {
temp.Remark = fmt.Sprintf("INS账号名的套餐已过期")
req.ImageWorks = append(req.ImageWorks, temp)
continue
}
temp.PublishConfig1 = &cast.PublishConfig{
ForbidComment: 1,
PublicType: 1,
@ -1816,6 +1767,11 @@ func ImportWorkBatch(ctx *gin.Context) {
req.ImageWorks = append(req.ImageWorks, temp)
continue
}
if mediaInfoResp.Info.Expired != 1 {
temp.Remark = fmt.Sprintf("Bluesky账号名的套餐已过期")
req.ImageWorks = append(req.ImageWorks, temp)
continue
}
temp.PublishConfig1 = &cast.PublishConfig{
ForbidComment: 1,
PublicType: 1,
@ -1985,15 +1941,6 @@ func RefreshPublish() error {
PlatformUuid: platformInfo.PlatformUuid,
})
_, _ = service.CastProvider.UpdateWorkPlatformInfo(context.Background(), infoReq)
go func(work *cast.RefreshWorkListResp_Info, platform *cast.RefreshWorkListResp_Info_PlatformInfo, postResult string) {
_, _ = service.CastProvider.UpdateWorkPublishLog(context.Background(), &cast.UpdateWorkPublishLogReq{
PlatformID: platform.PlatformID,
WorkUuid: work.WorkUuid,
Action: "getPost",
Detail: postResult,
PublishMediaID: platform.PublishMediaID,
})
}(workInfo, platformInfo, string(dmData))
} else {
// 未发布的先不管,不能标记失败
/*infoReq.PlatformInfoData = append(infoReq.PlatformInfoData, &cast.PlatformInfo{
@ -2016,16 +1963,15 @@ func RefreshPublish() error {
ProfileKey: workInfo.ProfileKey,
})
go func(work *cast.RefreshWorkListResp_Info, platform *cast.RefreshWorkListResp_Info_PlatformInfo, post *aryshare.GetPostResponse) {
postBytes, _ := json.Marshal(post)
go func() {
postBytes, _ := json.Marshal(postResp)
_, _ = service.CastProvider.UpdateWorkPublishLog(context.Background(), &cast.UpdateWorkPublishLogReq{
PlatformID: platform.PlatformID,
WorkUuid: work.WorkUuid,
Action: "getPost",
Detail: string(postBytes),
PublishMediaID: platform.PublishMediaID,
PlatformID: platformInfo.PlatformID,
WorkUuid: workInfo.WorkUuid,
Action: "getPost",
Detail: string(postBytes),
})
}(workInfo, platformInfo, postResp)
}()
if _err != nil {
zap.L().Error("GetPost err", zap.Error(_err))
@ -2153,6 +2099,26 @@ func checkAndReuploadImage(imageUrl string, mediaType string) (string, error) {
return compressUrl, nil
}
// WorkListPublished 获取已发布的作品列表
func WorkListPublished(ctx *gin.Context) {
var (
req *cast.WorkListPublishedReq
resp *cast.WorkListPublishedResp
)
var err error
if err = ctx.ShouldBind(&req); err != nil {
service.Error(ctx, err)
return
}
newCtx := NewCtxWithUserInfo(ctx)
resp, err = service.CastProvider.WorkListPublished(newCtx, req)
if err != nil {
service.Error(ctx, err)
return
}
service.Success(ctx, resp)
return
}
func ProcessImg(imgs []string) ([]string, error) {
var newImgs []string
for _, img := range imgs {
@ -2188,42 +2154,6 @@ func ProcessImg(imgs []string) ([]string, error) {
return newImgs, nil
}
// WorkListPublished 获取已发布的作品列表
func WorkListPublished(ctx *gin.Context) {
var (
req *cast.WorkListPublishedReq
resp *cast.WorkListPublishedResp
)
var err error
if err = ctx.ShouldBind(&req); err != nil {
service.Error(ctx, err)
return
}
newCtx := NewCtxWithUserInfo(ctx)
if req.ArtistUuid != "" && strings.HasPrefix(strings.ToUpper(req.ArtistUuid), "FE") {
subInfoResp, err := service.AccountFieeProvider.SubNumGetInfo(context.Background(), &accountFiee.SubNumGetInfoRequest{
SubNum: req.ArtistUuid,
Domain: "app",
})
if err != nil {
service.Error(ctx, errors.New("自媒体用户查询失败"))
return
}
if subInfoResp == nil || subInfoResp.Id == 0 {
service.Error(ctx, errors.New("自媒体用户不存在"))
return
}
req.ArtistUuid = fmt.Sprint(subInfoResp.Id)
}
resp, err = service.CastProvider.WorkListPublished(newCtx, req)
if err != nil {
service.Error(ctx, err)
return
}
service.Success(ctx, resp)
return
}
func UpdateWorkScript(ctx *gin.Context) {
var (
req *cast.UpdateWorkScriptReq
@ -2242,24 +2172,3 @@ func UpdateWorkScript(ctx *gin.Context) {
service.Success(ctx, nil)
return
}
func SecurityText(keywords string) error {
if keywords == "" {
return nil
}
secResp, err := service.FilesProvider.SecurityScanByText(context.Background(), &files.SecurityScanByTextReq{
Text: keywords,
})
if err != nil {
return errors.New("内容安全检测服务异常")
}
if secResp.SecurityStatus == "high" {
problemText := secResp.ProblemText
runes := []rune(problemText)
if len(runes) > 10 {
problemText = string(runes[:10]) + "..."
}
return errors.New(problemText)
}
return nil
}

View File

@ -131,12 +131,11 @@ func ExportExcelExecutionResult(c *gin.Context) {
}
titleList := []string{
"开始时间", "任务标题", "艺人编号", "艺人姓名", "内容类型", "内容标题", "执行结果", "原因", "TIKTOK", "YOUTUBE", "INS", "DM", "BULESKY",
"任务标题", "艺人编号", "艺人姓名", "内容类型", "内容标题", "执行结果", "原因", "TIKTOK", "YOUTUBE", "INS", "DM", "BULESKY",
}
var dataList []interface{}
for _, task := range res.Data {
data := []interface{}{
task.StartTime,
task.TaskTitle,
idFindSubName[uint64(task.ArtistId)],
task.ArtistName,

View File

@ -39,10 +39,10 @@ var PressReleasesProvider = new(pressreleases.PressReleasesClientImpl)
var SecFilingProvider = new(secFilings.SecFilingsClientImpl)
var AyrshareProvider = new(aryshare.AyrshareClientImpl)
var CronProvider = new(cron.CronClientImpl)
var SupplierProvider = new(supplier.SupplierClientImpl)
var ReportsProvider = new(reports.ReportsClientImpl)
var EmailAlertsProvider = new(emailAlerts.EmailAlertsClientImpl)
var MembersProvider = new(members.MembersClientImpl)
var SupplierProvider = new(supplier.SupplierClientImpl)
func init() {
config.SetConsumerService(BundleProvider)
@ -55,12 +55,12 @@ func init() {
config.SetConsumerService(GovernanceProvider)
config.SetConsumerService(PressReleasesProvider)
config.SetConsumerService(SecFilingProvider)
config.SetConsumerService(AyrshareProvider)
config.SetConsumerService(CronProvider)
config.SetConsumerService(SupplierProvider)
config.SetConsumerService(ReportsProvider)
config.SetConsumerService(EmailAlertsProvider)
config.SetConsumerService(MembersProvider)
config.SetConsumerService(AyrshareProvider)
config.SetConsumerService(CronProvider)
config.SetConsumerService(SupplierProvider)
if err := config.Load(); err != nil {
panic(err)

View File

@ -3,7 +3,6 @@ package invoice
import (
"errors"
"fmt"
"time"
"fonchain-fiee/pkg/service/upload"
@ -100,7 +99,7 @@ func MakeInvoice(invoiceNo, customerName, address, phone, bundleName, spec, pric
pdf.SetY(772)
pdf.Cell(nil, invoiceDate)
outputPath := fmt.Sprintf("./data/invoice_%s_%s.pdf", invoiceNo, time.Now().Format("20060102150405"))
outputPath := fmt.Sprintf("./data/invoice_%s.pdf", invoiceNo)
// 生成新的 PDF
if err = pdf.WritePdf(outputPath); err != nil {

View File

@ -8,7 +8,6 @@ import (
"fonchain-fiee/api/pressreleases"
"fonchain-fiee/pkg/model/login"
"fonchain-fiee/pkg/service"
"fonchain-fiee/pkg/service/bundle/common"
)
func Create(ctx *gin.Context) {
@ -22,7 +21,7 @@ func Create(ctx *gin.Context) {
req.OperatorId = int32(user.ID)
resp, err := service.PressReleasesProvider.Create(ctx, &req)
if err != nil {
service.Error(ctx, errors.New(common.CreatePressReleasesFailed))
service.Error(ctx, err)
return
}
service.Success(ctx, resp)
@ -36,7 +35,7 @@ func Delete(ctx *gin.Context) {
}
resp, err := service.PressReleasesProvider.Delete(ctx, &req)
if err != nil {
service.Error(ctx, errors.New(common.DisplayPressReleasesFailed))
service.Error(ctx, err)
return
}
service.Success(ctx, resp)
@ -54,7 +53,7 @@ func Display(ctx *gin.Context) {
}
resp, err := service.PressReleasesProvider.Display(ctx, &req)
if err != nil {
service.Error(ctx, errors.New(common.ListPressReleasesFailed))
service.Error(ctx, err)
return
}
service.Success(ctx, resp)
@ -96,7 +95,7 @@ func List(ctx *gin.Context) {
}
resp, err := service.PressReleasesProvider.List(ctx, &req)
if err != nil {
service.Error(ctx, errors.New(common.EditPressReleasesFailed))
service.Error(ctx, err)
return
}
service.Success(ctx, resp)
@ -113,7 +112,7 @@ func Edit(ctx *gin.Context) {
req.OperatorId = int32(user.ID)
resp, err := service.PressReleasesProvider.Edit(ctx, &req)
if err != nil {
service.Error(ctx, errors.New(common.EditPressReleasesFailed))
service.Error(ctx, err)
return
}
service.Success(ctx, resp)
@ -135,7 +134,7 @@ func Get(ctx *gin.Context) {
req.LangType = langType
resp, err := service.PressReleasesProvider.Get(ctx, &req)
if err != nil {
service.Error(ctx, errors.New(common.GetPressReleasesFailed))
service.Error(ctx, err)
return
}
service.Success(ctx, resp)

View File

@ -9,6 +9,7 @@ import (
"fonchain-fiee/api/bundle"
"fonchain-fiee/api/cast"
"fonchain-fiee/cmd/config"
"fonchain-fiee/pkg/e"
"fonchain-fiee/pkg/model/login"
"fonchain-fiee/pkg/service"
castService "fonchain-fiee/pkg/service/cast"
@ -21,27 +22,6 @@ import (
"go.uber.org/zap"
)
type TaskWorkLogListHTTPReq struct {
AssignRecordsUUID string `json:"assignRecordsUUID" binding:"required"`
TaskType int32 `json:"taskType" binding:"required"`
Page int32 `json:"page" binding:"required"`
PageSize int32 `json:"pageSize" binding:"required"`
}
type CompletedItem struct {
Uuid string `json:"uuid"`
Title string `json:"title"`
ScriptUuid string `json:"scriptUuid,omitempty"`
ScriptTitle string `json:"scriptTitle,omitempty"`
SubmitTime string `json:"submitTime"`
PdfUrl string `json:"pdfUrl,omitempty"`
}
type CompletedListResp struct {
Data []*CompletedItem `json:"data"`
Count int64 `json:"count"`
}
func GetPendingTaskLayout(c *gin.Context) {
res, err := service.BundleProvider.GetPendingTaskLayout(context.Background(), &bundle.GetPendingTaskLayoutReq{})
if err != nil {
@ -74,32 +54,6 @@ func AssignTask(c *gin.Context) {
service.Error(c, err)
return
}
if req.SubNum == "" {
err2 := errors.New("艺人编号不能为空")
service.Error(c, err2)
return
}
// 根据 subNum 查询艺人 artistUuid
subInfoResp, err1 := service.AccountFieeProvider.SubNumGetInfo(context.Background(), &accountFiee.SubNumGetInfoRequest{
SubNum: req.SubNum,
Domain: "app",
})
if err1 != nil {
fmt.Println("SubNumGetInfo err")
fmt.Println(err1)
err1 = errors.New("自媒体用户查询失败")
service.Error(c, err1)
return
}
if subInfoResp == nil || subInfoResp.Id == 0 {
err1 = errors.New("自媒体用户不存在")
service.Error(c, err1)
return
}
req.UserID = int32(subInfoResp.Id)
req.ArtistName = subInfoResp.Name
req.TelNum = subInfoResp.TelNum
res, err := service.BundleProvider.AssignTask(context.Background(), &req)
if err != nil {
@ -127,32 +81,6 @@ func BatchAssignTask(c *gin.Context) {
item.Operator = userInfo.Name
item.OperatorNum = userInfo.TelNum
if item.SubNum == "" {
err2 := errors.New("艺人编号不能为空")
service.Error(c, err2)
return
}
subInfoResp, err1 := service.AccountFieeProvider.SubNumGetInfo(context.Background(), &accountFiee.SubNumGetInfoRequest{
SubNum: item.SubNum,
Domain: "app",
})
if err1 != nil {
fmt.Println("SubNumGetInfo err")
fmt.Println(err1)
err1 = errors.New("自媒体用户查询失败")
service.Error(c, err1)
return
}
if subInfoResp == nil || subInfoResp.Id == 0 {
err1 = errors.New("自媒体用户不存在")
service.Error(c, err1)
return
}
item.UserID = int32(subInfoResp.Id)
item.ArtistName = subInfoResp.Name
item.TelNum = subInfoResp.TelNum
}
@ -298,7 +226,7 @@ func GetTaskAssignRecordsListDownload(c *gin.Context) {
return
}
req.Page = 1
req.PageSize = 999999
req.PageSize = 999999999
detail, detailErr := service.BundleProvider.GetTaskAssignRecordsList(context.Background(), &req)
if detailErr != nil {
@ -307,7 +235,7 @@ func GetTaskAssignRecordsListDownload(c *gin.Context) {
}
titleList := []string{
"用户编号", "艺人", "艺人手机号", "任务批次", "状态", "实际完成状态", "待上传视频脚本数", "待上传视频数", "待上传图文数", "待上传数据数", "待上传竞品报告数", "实际上传视频脚本数", "实际上传视频数", "实际上传图文数", "实际上传数据数", "实际上传竞品报告数", "指派人", "操作人账号", "操作人", "操作时间",
"用户编号", "艺人", "艺人手机号", "任务批次", "状态", "实际完成状态", "待上传视频脚本数", "待上传视频数", "待上传图文数", "待上传数据数", "实际上传视频脚本数", "实际上传视频数", "实际上传图文数", "实际上传数据数", "指派人", "操作人账号", "操作人", "操作时间",
}
var dataList []interface{}
@ -325,12 +253,10 @@ func GetTaskAssignRecordsListDownload(c *gin.Context) {
i.PendingVideoCount,
i.PendingPostCount,
i.PendingDataCount,
i.PendingReportCount,
i.CompleteVideoScriptCount,
i.CompleteVideoCount,
i.CompletePostCount,
i.CompleteDataCount,
i.CompleteReportCount,
i.TaskAssignee,
i.OperatorNum,
i.Operator,
@ -376,17 +302,6 @@ type UpdateVideoScriptWithTaskUUIDReq struct {
AssignRecordsUUID string `json:"assignRecordsUUID"`
}
type CreateWorkAnalysisWithTaskUUIDReq struct {
*cast.CreateWorkAnalysisReq
AssignRecordsUUID string `json:"assignRecordsUUID"`
}
type CreateCompetitiveReportWithTaskUUIDReq struct {
*cast.CreateCompetitiveReportReq
AssignRecordsUUID string `json:"assignRecordsUUID"`
ReportData utils.CompetitorReportData `json:"json_data"` // AI生成的竞品报告数据
}
func UpdateWorkImageWithTaskUUID(ctx *gin.Context) {
var req UpdateWorkImageWithTaskUUIDReq
var infoResp *accountFiee.UserInfoResponse
@ -475,170 +390,6 @@ func UpdateWorkImageWithTaskUUID(ctx *gin.Context) {
return
}
func CreateWorkAnalysisWithTaskUUID(ctx *gin.Context) {
var req CreateWorkAnalysisWithTaskUUIDReq
var infoResp *accountFiee.UserInfoResponse
var err error
if err = ctx.ShouldBind(&req); err != nil {
service.Error(ctx, err)
return
}
res, err := service.BundleProvider.GetTaskActualStatusByUUID(context.Background(), &bundle.GetTaskActualStatusByUUIDRequest{
AssignRecordsUUID: req.AssignRecordsUUID,
})
if err != nil {
service.Error(ctx, err)
return
}
if res.ActualStatus == 3 {
service.Error(ctx, errors.New("任务已中止"))
return
}
resp, err := castService.CreateWorkAnalysisCore(ctx, req.CreateWorkAnalysisReq)
if err != nil {
service.Error(ctx, err)
return
}
if config.AppConfig.System.AppMode != "dev" {
artistId, _ := strconv.ParseUint(req.ArtistID, 10, 64)
infoResp, err = service.AccountFieeProvider.Info(context.Background(), &accountFiee.InfoRequest{
ID: artistId,
Domain: "app",
})
if err != nil {
service.Error(ctx, err)
return
}
} else {
infoResp = &accountFiee.UserInfoResponse{
Name: "小波",
TelNum: "18288888888",
TelAreaCode: "86",
}
}
userInfo := login.GetUserInfoFromC(ctx)
resp1, err := service.BundleProvider.UpdateTaskProgress(context.Background(), &bundle.UpdateTaskProgressRequest{
AssignRecordsUUID: req.AssignRecordsUUID,
EmployeeName: userInfo.Name,
EmployeeNum: userInfo.TelNum,
TaskType: "data",
CompleteCount: 1,
Uuid: resp.Uuid,
})
if err != nil {
service.Error(ctx, err)
return
}
zap.L().Info("UpdateTaskProgress", zap.Any("resp", resp1))
logReq := &bundle.CreateTaskWorkLogRequest{
AssignRecordsUUID: req.AssignRecordsUUID,
WorkUUID: resp.Uuid,
Title: req.Title,
ArtistUUID: req.ArtistID,
SubNum: infoResp.SubNum,
TelNum: infoResp.TelNum,
ArtistName: infoResp.Name,
OperationType: 3, // 完成任务
TaskType: 3, // 数据分析
TaskCount: 1,
OperatorName: userInfo.Name,
OperatorNum: userInfo.TelNum,
}
zap.L().Info("CreateTaskWorkLog request", zap.Any("req", logReq))
logResp, err := service.BundleProvider.CreateTaskWorkLog(context.Background(), logReq)
if err != nil {
zap.L().Error("CreateTaskWorkLog failed", zap.Error(err), zap.Any("req", logReq))
} else {
zap.L().Info("CreateTaskWorkLog success", zap.Any("resp", logResp))
}
service.Success(ctx, resp)
return
}
func CreateCompetitiveReportWithTaskUUID(ctx *gin.Context) {
var req CreateCompetitiveReportWithTaskUUIDReq
var infoResp *accountFiee.UserInfoResponse
var err error
if err = ctx.ShouldBind(&req); err != nil {
service.Error(ctx, err)
return
}
res, err := service.BundleProvider.GetTaskActualStatusByUUID(context.Background(), &bundle.GetTaskActualStatusByUUIDRequest{
AssignRecordsUUID: req.AssignRecordsUUID,
})
if err != nil {
service.Error(ctx, err)
return
}
if res.ActualStatus == 3 {
service.Error(ctx, errors.New("任务已中止"))
return
}
resp, err := castService.CreateCompetitiveReportCore(ctx, req.CreateCompetitiveReportReq, req.ReportData)
if err != nil {
service.Error(ctx, err)
return
}
if config.AppConfig.System.AppMode != "dev" {
artistId, _ := strconv.ParseUint(req.ArtistID, 10, 64)
infoResp, err = service.AccountFieeProvider.Info(context.Background(), &accountFiee.InfoRequest{
ID: artistId,
Domain: "app",
})
if err != nil {
service.Error(ctx, err)
return
}
} else {
infoResp = &accountFiee.UserInfoResponse{
Name: "小波",
TelNum: "18288888888",
TelAreaCode: "86",
}
}
userInfo := login.GetUserInfoFromC(ctx)
resp1, err := service.BundleProvider.UpdateTaskProgress(context.Background(), &bundle.UpdateTaskProgressRequest{
AssignRecordsUUID: req.AssignRecordsUUID,
EmployeeName: userInfo.Name,
EmployeeNum: userInfo.TelNum,
TaskType: "report",
CompleteCount: 1,
Uuid: resp.Uuid,
})
if err != nil {
service.Error(ctx, err)
return
}
zap.L().Info("UpdateTaskProgress", zap.Any("resp", resp1))
logReq := &bundle.CreateTaskWorkLogRequest{
AssignRecordsUUID: req.AssignRecordsUUID,
WorkUUID: resp.Uuid,
Title: req.Title,
ArtistUUID: req.ArtistID,
SubNum: infoResp.SubNum,
TelNum: infoResp.TelNum,
ArtistName: infoResp.Name,
OperationType: 3,
TaskType: 5,
TaskCount: 1,
OperatorName: userInfo.Name,
OperatorNum: userInfo.TelNum,
}
zap.L().Info("CreateTaskWorkLog request", zap.Any("req", logReq))
logResp, err := service.BundleProvider.CreateTaskWorkLog(context.Background(), logReq)
if err != nil {
zap.L().Error("CreateTaskWorkLog failed", zap.Error(err), zap.Any("req", logReq))
} else {
zap.L().Info("CreateTaskWorkLog success", zap.Any("resp", logResp))
}
service.Success(ctx, resp)
return
}
func UpdateWorkVideoWithUUID(ctx *gin.Context) {
var req UpdateWorkVideoWithUUIDReq
var infoResp *accountFiee.UserInfoResponse
@ -753,7 +504,7 @@ func GetArtistUploadStatsListDownload(c *gin.Context) {
}
// 拉取所有数据
req.Page = 1
req.PageSize = 999999
req.PageSize = 999999999
detail, detailErr := service.BundleProvider.GetArtistUploadStatsList(context.Background(), &req)
if detailErr != nil {
@ -762,7 +513,7 @@ func GetArtistUploadStatsListDownload(c *gin.Context) {
}
titleList := []string{
"用户编号", "艺人", "手机号", "最近一次指派人", "可指派视频脚本数", "可上传视频脚本数", "已上传视频脚本数", "可指派视频数", "可上传视频数", "已上传视频数", "已释放视频额度", "套餐视频总数", "增值视频总数", "可指派图文数", "可上传图文数", "已上传图文数", "已释放图文额度", "套餐图文总数", "增值图文总数", "可指派数据数", "可上传数据数", "已上传数据数", "已释放数据额度", "套餐数据总数", "增值数据总数", "可指派竞品报告数", "可上传竞品报告数", "已上传竞品报告数", "已释放竞品报告额度", "套餐竞品报告总数", "增值竞品报告总数", "进行中任务数", "已完成任务数",
"用户编号", "艺人", "手机号", "最近一次指派人", "可指派视频脚本数", "可上传视频脚本数", "已上传视频脚本数", "可指派视频数", "可上传视频数", "已上传视频数", "已释放视频额度", "套餐视频总数", "增值视频总数", "可指派图文数", "可上传图文数", "已上传图文数", "已释放图文额度", "套餐图文总数", "增值图文总数", "可指派数据数", "可上传数据数", "已上传数据数", "已释放数据额度", "套餐数据总数", "增值数据总数", "进行中任务数", "已完成任务数",
}
var dataList []interface{}
@ -793,12 +544,6 @@ func GetArtistUploadStatsListDownload(c *gin.Context) {
i.ReleasedDataAnalysisTotal,
i.BundleDataAnalysisTotal,
i.IncreaseDataAnalysisTotal,
i.AllowReportCount,
i.PendingReportCount,
i.UploadedReportCount,
i.ReleasedReportTotal,
i.BundleReportTotal,
i.IncreaseReportTotal,
i.ProgressTaskCount,
i.CompleteTaskCount,
}
@ -837,27 +582,27 @@ func UpdateVideoScriptWithUUID(ctx *gin.Context) {
return
}
resp, err := castService.UpdateVideoScriptCore(ctx, req.UpdateVideoScriptReq)
newCtx := castService.NewCtxWithUserInfo(ctx)
artistId, _ := strconv.ParseUint(req.ArtistUuid, 10, 64)
infoResp, err = service.AccountFieeProvider.Info(context.Background(), &accountFiee.InfoRequest{
ID: artistId,
Domain: "app",
})
if err != nil {
service.Error(ctx, err)
return
}
if config.AppConfig.System.AppMode != "dev" {
artistId, _ := strconv.ParseUint(req.ArtistUuid, 10, 64)
infoResp, err = service.AccountFieeProvider.Info(context.Background(), &accountFiee.InfoRequest{
ID: artistId,
Domain: "app",
})
if err != nil {
service.Error(ctx, err)
return
}
} else {
infoResp = &accountFiee.UserInfoResponse{
Name: "小波",
TelNum: "18288888888",
TelAreaCode: "86",
}
if infoResp.Id == 0 {
service.Error(ctx, errors.New(e.GetMsg(e.NOTDATA)))
return
}
req.ArtistName = infoResp.Name
req.ArtistPhone = infoResp.TelNum
req.ArtistNum = infoResp.SubNum
resp, err := service.CastProvider.UpdateVideoScript(newCtx, req.UpdateVideoScriptReq)
if err != nil {
service.Error(ctx, err)
return
}
// EmployeeName 和 EmployeeNum 从 toekn 里面拿
userInfo := login.GetUserInfoFromC(ctx)
@ -920,195 +665,3 @@ func GetPendingAssign(c *gin.Context) {
service.Success(c, res)
}
func GetTaskWorkLogListItems(c *gin.Context) {
var req TaskWorkLogListHTTPReq
if err := c.ShouldBindJSON(&req); err != nil {
service.Error(c, err)
return
}
if req.AssignRecordsUUID == "" {
err := errors.New("参数错误")
service.Error(c, err)
return
}
if req.TaskType == 0 {
err := errors.New("参数错误")
service.Error(c, err)
return
}
if req.Page <= 0 {
req.Page = 1
}
if req.PageSize <= 0 {
req.PageSize = 10
}
workLogResp, err := service.BundleProvider.GetTaskWorkLogList(context.Background(), &bundle.TaskWorkLogQueryRequest{
AssignRecordsUUID: req.AssignRecordsUUID,
OperationType: 3, // 类型,完成任务
TaskType: req.TaskType,
Page: 1,
PageSize: 9999,
})
if err != nil {
err := errors.New("查询失败")
service.Error(c, err)
return
}
uuidMap := make(map[string]struct{})
var uuids []string
for _, r := range workLogResp.Records {
if r == nil || r.WorkUUID == "" {
continue
}
if _, ok := uuidMap[r.WorkUUID]; ok {
continue
}
uuidMap[r.WorkUUID] = struct{}{}
uuids = append(uuids, r.WorkUUID)
}
items := make([]*CompletedItem, 0)
ctx := castService.NewCtxWithUserInfo(c)
switch req.TaskType {
case 1, 2:
if len(uuids) == 0 {
service.Success(c, &CompletedListResp{Data: items, Count: int64(len(items))})
return
}
resp, err := service.CastProvider.WorkList(ctx, &cast.WorkListReq{
WorkUuids: uuids,
Page: req.Page,
PageSize: int32(req.PageSize),
})
if err != nil {
err := errors.New("查询失败")
service.Error(c, err)
return
}
workMap := make(map[string]*cast.WorkListResp_Info)
for _, w := range resp.Data {
if w == nil {
continue
}
workMap[w.WorkUuid] = w
}
for _, uuid := range uuids {
w, ok := workMap[uuid]
if !ok {
continue
}
items = append(items, &CompletedItem{
Uuid: w.WorkUuid,
Title: w.Title,
ScriptUuid: w.ScriptUuid,
ScriptTitle: w.ScriptTitle,
SubmitTime: w.SubmitTime,
})
}
case 3:
if len(uuids) == 0 {
service.Success(c, &CompletedListResp{Data: items, Count: int64(len(items))})
return
}
resp, err := service.CastProvider.ListWorkAnalysis(ctx, &cast.ListWorkAnalysisReq{
UuidList: uuids,
Page: req.Page,
PageSize: int32(req.PageSize),
})
if err != nil {
err := errors.New("查询失败")
service.Error(c, err)
return
}
analysisMap := make(map[string]*cast.WorkAnalysisInfo)
for _, a := range resp.Data {
if a == nil {
continue
}
analysisMap[a.Uuid] = a
}
for _, uuid := range uuids {
a, ok := analysisMap[uuid]
if !ok {
continue
}
items = append(items, &CompletedItem{
Uuid: a.Uuid,
Title: a.Title,
SubmitTime: a.SubmitTime,
PdfUrl: a.PdfUrl,
})
}
case 4:
if len(uuids) == 0 {
service.Success(c, &CompletedListResp{Data: items, Count: int64(len(items))})
return
}
resp, err := service.CastProvider.ListVideoScripts(ctx, &cast.ListVideoScriptsReq{
ScriptUuids: uuids,
Page: req.Page,
PageSize: int32(req.PageSize),
})
if err != nil {
err := errors.New("查询失败")
service.Error(c, err)
return
}
scriptMap := make(map[string]*cast.VideoScriptInfo)
for _, s := range resp.Data {
if s == nil {
continue
}
scriptMap[s.Uuid] = s
}
for _, uuid := range uuids {
s, ok := scriptMap[uuid]
if !ok {
continue
}
items = append(items, &CompletedItem{
Uuid: s.Uuid,
Title: s.Title,
SubmitTime: s.CreatedDate,
})
}
case 5:
if len(uuids) == 0 {
service.Success(c, &CompletedListResp{Data: items, Count: int64(len(items))})
return
}
resp, err := service.CastProvider.ListCompetitiveReport(ctx, &cast.ListCompetitiveReportReq{
UuidList: uuids,
Page: req.Page,
PageSize: int32(req.PageSize),
})
if err != nil {
err := errors.New("查询失败")
service.Error(c, err)
return
}
reportMap := make(map[string]*cast.CompetitiveReportInfo)
for _, r := range resp.Data {
if r == nil {
continue
}
reportMap[r.Uuid] = r
}
for _, uuid := range uuids {
r, ok := reportMap[uuid]
if !ok {
continue
}
items = append(items, &CompletedItem{
Uuid: r.Uuid,
Title: r.Title,
SubmitTime: r.SubmitTime,
PdfUrl: r.PdfUrl,
})
}
default:
service.Error(c, errors.New("参数错误"))
return
}
service.Success(c, &CompletedListResp{Data: items, Count: int64(len(items))})
}

View File

@ -15,7 +15,6 @@ import (
"io"
cmdConf "fonchain-fiee/cmd/config"
"github.com/disintegration/imaging"
"github.com/fonchain_enterprise/utils/objstorage"
"github.com/gin-gonic/gin"
@ -271,6 +270,7 @@ func BaiduCheckImage(imageByte []byte) (err error) {
}
func PutBos(filePath string, mediaType string, needRemove bool) (url string, err error) {
BOSClient, err := objstorage.NewOSS(os.Getenv(config.ConfigData.Oss.AccessKeyId), os.Getenv(config.ConfigData.Oss.AccessKeySecret), os.Getenv(config.ConfigData.Oss.Endpoint))
//BOSClient, err := objstorage.NewOSS(config.ConfigData.Oss.AccessKeyId, config.ConfigData.Oss.AccessKeySecret, config.ConfigData.Oss.Endpoint)
if err != nil {
fmt.Println("=== PutBos NewOss err ", err)
//logger.Errorf("PutBos NewOss err ", err)
@ -296,6 +296,7 @@ func PutBos(filePath string, mediaType string, needRemove bool) (url string, err
filePath = strings.Replace(filePath, model.MediaPath, "", 1)
var objectName string = fmt.Sprintf("%s/%s%s", config.ConfigData.Oss.BaseDir, cmdConf.AppConfig.System.AppMode, filePath)
_, err = BOSClient.PutObjectFromBytes(os.Getenv(config.ConfigData.Oss.BucketName), objectName, fileBytes)
//_, err = BOSClient.PutObjectFromBytes(config.ConfigData.Oss.BucketName, objectName, fileBytes)
if err != nil {
fmt.Println("=== PutBos PutObject err ", err)
//logger.Errorf("PutBos PutObject err %+v", err.Error())
@ -304,6 +305,7 @@ func PutBos(filePath string, mediaType string, needRemove bool) (url string, err
}
//url = fmt.Sprintf("%s%s%s/%s", config.BosHttp, config.BosBucketName, config.BosUrl, objectName)
url = fmt.Sprintf("%s/%s", os.Getenv(config.ConfigData.Oss.CdnHost), objectName)
//url = fmt.Sprintf("%s/%s", config.ConfigData.Oss.CdnHost, objectName)
return
}
func GetSnapshot(videoPath, snapshotPath string, frameNum int) (snapshotName string, err error) {

View File

@ -1,152 +0,0 @@
package utils
import (
"encoding/json"
"fmt"
"io"
"io/ioutil"
"net/http"
"net/url"
"strings"
"time"
)
const baiduIPLocationAPI = "https://api.map.baidu.com/location/ip"
// 建议把 ak 放配置;这里先保留你给的 key后续可改为从配置读取。
const baiduMapAK = "T8DGBYxbZ1iAeXx1J57McKigyHJHulPQ"
type baiduIPResp struct {
Status int `json:"status"`
Address string `json:"address"`
Content struct {
Address string `json:"address"`
} `json:"content"`
Message string `json:"message"`
}
type ReverseGeocodingReq struct {
Ak string `json:"ak"`
Coordtype string `json:"coordtype"`
RetCoordtype string `json:"retCoordtype"`
Location string `json:"location"`
Output string `json:"output"`
Language string `json:"language"`
}
type ReverseGeocodingRes struct {
Status int `json:"status"`
Result struct {
Location struct {
Lng float64 `json:"lng"`
Lat float64 `json:"lat"`
} `json:"location"`
FormattedAddress string `json:"formatted_address"`
Edz struct {
Name string `json:"name"`
} `json:"edz"`
Business string `json:"business"`
AddressComponent struct {
Country string `json:"country"`
CountryCodeIso string `json:"country_code_iso"`
CountryCodeIso2 string `json:"country_code_iso2"`
CountryCode int `json:"country_code"`
Province string `json:"province"`
City string `json:"city"`
CityLevel int `json:"city_level"`
District string `json:"district"`
Town string `json:"town"`
TownCode string `json:"town_code"`
Distance string `json:"distance"`
Direction string `json:"direction"`
Adcode string `json:"adcode"`
Street string `json:"street"`
StreetNumber string `json:"street_number"`
} `json:"addressComponent"`
} `json:"result"`
}
// ReverseGeo 经纬度逆编码
func ReverseGeo(longitude, latitude string, language string) (address string, err error) {
var reverseGeocodingReq ReverseGeocodingReq
reverseGeocodingReq.Ak = "3bAjKGA0pv7qvszGe98RsVZ04Ob5r4ZZ"
reverseGeocodingReq.Coordtype = "gcj02ll"
reverseGeocodingReq.Output = "json"
reverseGeocodingReq.RetCoordtype = "gcj02ll"
reverseGeocodingReq.Location = strings.Join([]string{latitude, longitude}, ",")
reverseGeocodingReq.Language = language
url := "https://api.map.baidu.com/reverse_geocoding/v3/?ak=" + reverseGeocodingReq.Ak + "&output=" + reverseGeocodingReq.Output + "&coordtype=" + reverseGeocodingReq.Coordtype + "&location=" + reverseGeocodingReq.Location + "&ret_coordtype=" + reverseGeocodingReq.RetCoordtype + "&language=" + reverseGeocodingReq.Language
resp, err := http.Get(url)
if err != nil {
return "", err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", err
}
var results ReverseGeocodingRes
err = json.Unmarshal(body, &results)
if err != nil {
return "", err
}
if results.Status != 0 {
address = "未知地址"
return address, err
}
address = results.Result.FormattedAddress
return address, nil
}
func GetAddressByIP(ip string) (string, error) {
ip = strings.TrimSpace(ip)
if ip == "" {
return "", fmt.Errorf("ip is empty")
}
q := url.Values{}
q.Set("ip", ip)
q.Set("coor", "bd09ll")
q.Set("ak", baiduMapAK)
reqURL := baiduIPLocationAPI + "?" + q.Encode()
client := &http.Client{Timeout: 5 * time.Second}
resp, err := client.Get(reqURL)
if err != nil {
return "", err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return "", fmt.Errorf("baidu api status: %d", resp.StatusCode)
}
body, err := io.ReadAll(resp.Body)
if err != nil {
return "", err
}
var r baiduIPResp
if err := json.Unmarshal(body, &r); err != nil {
return "", err
}
if r.Status != 0 {
if r.Message == "" {
r.Message = "baidu api error"
}
return "", fmt.Errorf("%s", r.Message)
}
if strings.TrimSpace(r.Content.Address) != "" {
return r.Content.Address, nil
}
if strings.TrimSpace(r.Address) != "" {
return r.Address, nil
}
return "", nil
}

View File

@ -3,21 +3,14 @@ package utils
import (
"errors"
"fmt"
"fonchain-fiee/pkg/service/bundle/model"
"image"
"io"
"net/http"
"net/url"
"os"
"path/filepath"
"strings"
"time"
"unicode"
"unicode/utf8"
"github.com/phpdave11/gofpdf"
"github.com/signintech/gopdf"
"go.uber.org/zap"
)
// cleanTextForPDF 清理文本移除PDF不支持的字符如emoji
@ -179,715 +172,3 @@ func GeneratePDF(text, imageURL, outputPath, fontPath string) error {
return nil
}
// CompetitorReportData 竞品报告数据
type CompetitorReportData struct {
HighlightAnalysis HighlightAnalysisData `json:"highlight_analysis"`
DataPerformance DataPerformanceData `json:"data_performance_analysis"`
OverallSummary string `json:"overall_summary_and_optimization"`
ImageURL string `json:"image_url"` // 图片URL如果有图片则生成单独一页PDF
}
type HighlightAnalysisData struct {
Summary string `json:"summary"`
Points PointsData `json:"points"`
}
type PointsData struct {
Theme string `json:"theme"`
Narrative string `json:"narrative"`
Content string `json:"content"`
Copywriting string `json:"copywriting"`
Data string `json:"data"`
Music string `json:"music,omitempty"`
}
type DataPerformanceData struct {
Views string `json:"views"`
Completion string `json:"completion_rate,omitempty"`
Engagement string `json:"engagement"`
}
// GenerateCompetitorReportPDF 生成竞品报告PDF
// 参数:
// - templatePath: 模板文件路径(保留参数以兼容现有调用,传空则不使用模板)
// - outputPath: 输出PDF路径
// - data: 竞品报告数据
//
// 返回: 错误信息
func GenerateCompetitorReportPDF(templatePath, outputPath string, data CompetitorReportData) error {
fmt.Println("================================templatePath:", templatePath)
fmt.Println("================================outputPath:", outputPath)
pdf := gopdf.GoPdf{}
pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4})
// 如果有模板路径,则导入模板
if templatePath != "" {
err := pdf.ImportPagesFromSource(templatePath, "/MediaBox")
if err != nil {
return fmt.Errorf("无法导入页面: %v", err)
}
}
// 获取模板文件的总页数(如果有模板)
totalPages := pdf.GetNumberOfPages()
fmt.Printf("模板文件的总页数: %d\n", totalPages)
// 确定字体路径
var fontPath string
if templatePath != "" {
dir := filepath.Dir(templatePath)
fontPath = filepath.Join(dir, "simfang.ttf")
if _, err := os.Stat(fontPath); err != nil {
fontPath = filepath.Join("data", "simfang.ttf")
}
} else {
fontPath = filepath.Join("data", "simfang.ttf")
}
fmt.Printf("字体文件路径: %s\n", fontPath)
// 加载中文字体
ttfErr := pdf.AddTTFFont("simfang", fontPath)
if ttfErr != nil {
zap.L().Error("加载字体失败", zap.String("fontPath", fontPath), zap.Error(ttfErr))
return fmt.Errorf("加载中文字体失败: %v", ttfErr)
}
// 设置字体和字号
err := pdf.SetFont("simfang", "", 10)
if err != nil {
return fmt.Errorf("设置字体失败: %v", err)
}
// 行高15pt
lineHeight := 15.0
// 如果有内容要写入,确保在第一页
if totalPages > 0 || (data.HighlightAnalysis.Summary != "" || data.OverallSummary != "") {
pdf.SetPage(1)
// 概述 - 使用逐行写入一行最多35个字
pdf.SetXY(200, 104)
summaryLines := splitTextByRune(cleanTextForPDF(data.HighlightAnalysis.Summary), 35.0)
for i, line := range summaryLines {
pdf.SetXY(200, 104+float64(i)*lineHeight)
pdf.Cell(nil, line)
}
// 标题亮点 - 一行最多9个字
pdf.SetXY(200, 184)
themeLines := splitTextByRune(cleanTextForPDF(data.HighlightAnalysis.Points.Theme), 9.0)
for i, line := range themeLines {
pdf.SetXY(200, 184+float64(i)*lineHeight)
pdf.Cell(nil, line)
}
// 题材亮点 - 一行最多9个字
pdf.SetXY(330, 184)
narrativeLines := splitTextByRune(cleanTextForPDF(data.HighlightAnalysis.Points.Narrative), 9.0)
for i, line := range narrativeLines {
pdf.SetXY(330, 184+float64(i)*lineHeight)
pdf.Cell(nil, line)
}
// 内容亮点 - 一行最多9个字
pdf.SetXY(460, 184)
contentLines := splitTextByRune(cleanTextForPDF(data.HighlightAnalysis.Points.Content), 9.0)
for i, line := range contentLines {
pdf.SetXY(460, 184+float64(i)*lineHeight)
pdf.Cell(nil, line)
}
// 文案亮点 - 一行最多9个字
pdf.SetXY(200, 323)
copywritingLines := splitTextByRune(cleanTextForPDF(data.HighlightAnalysis.Points.Copywriting), 9.0)
for i, line := range copywritingLines {
pdf.SetXY(200, 323+float64(i)*lineHeight)
pdf.Cell(nil, line)
}
// 数据亮点 - 一行最多9个字
pdf.SetXY(330, 323)
dataLines := splitTextByRune(cleanTextForPDF(data.HighlightAnalysis.Points.Data), 9.0)
for i, line := range dataLines {
pdf.SetXY(330, 323+float64(i)*lineHeight)
pdf.Cell(nil, line)
}
// 配乐亮点(仅视频) - 一行最多9个字
if data.HighlightAnalysis.Points.Music != "" {
pdf.SetXY(460, 323)
musicLines := splitTextByRune(cleanTextForPDF(data.HighlightAnalysis.Points.Music), 9.0)
for i, line := range musicLines {
pdf.SetXY(460, 323+float64(i)*lineHeight)
pdf.Cell(nil, line)
}
}
// 浏览量 - 一行最多35个字
pdf.SetXY(200, 474)
viewsLines := splitTextByRune(cleanTextForPDF(data.DataPerformance.Views), 35.0)
for i, line := range viewsLines {
pdf.SetXY(200, 474+float64(i)*lineHeight)
pdf.Cell(nil, line)
}
// 完播率 - 一行最多35个字
pdf.SetXY(200, 539)
if data.DataPerformance.Completion != "" {
completionLines := splitTextByRune(cleanTextForPDF(data.DataPerformance.Completion), 35.0)
for i, line := range completionLines {
pdf.SetXY(200, 539+float64(i)*lineHeight)
pdf.Cell(nil, line)
}
}
// 点赞/分享/评论 - 一行最多35个字
pdf.SetXY(200, 600)
engagementLines := splitTextByRune(cleanTextForPDF(data.DataPerformance.Engagement), 35.0)
for i, line := range engagementLines {
pdf.SetXY(200, 600+float64(i)*lineHeight)
pdf.Cell(nil, line)
}
// 整体总结及可优化建议 - 一行最多35个字
pdf.SetXY(200, 676)
overallSummaryLines := splitTextByRune(cleanTextForPDF(data.OverallSummary), 35.0)
for i, line := range overallSummaryLines {
pdf.SetXY(200, 676+float64(i)*lineHeight)
pdf.Cell(nil, line)
}
}
// 如果有图片URL添加新页面并居中显示图片
if data.ImageURL != "" {
// 添加新页面
pdf.AddPage()
// 下载图片
resp, err := http.Get(data.ImageURL)
if err != nil {
return fmt.Errorf("下载图片失败: %v", err)
}
defer resp.Body.Close()
imageData, err := io.ReadAll(resp.Body)
if err != nil {
return fmt.Errorf("读取图片数据失败: %v", err)
}
// 解析URL获取文件扩展名
u, err := url.Parse(data.ImageURL)
if err != nil {
return fmt.Errorf("图片链接解析错误: %v", err)
}
fileExt := filepath.Ext(u.Path)
if fileExt == "" {
fileExt = ".jpg"
}
// 保存到临时文件
tmpFile, err := os.CreateTemp("", "pdf_image_*"+fileExt)
if err != nil {
return fmt.Errorf("创建临时文件失败: %v", err)
}
defer os.Remove(tmpFile.Name())
defer tmpFile.Close()
_, err = tmpFile.Write(imageData)
if err != nil {
return fmt.Errorf("写入临时文件失败: %v", err)
}
tmpFile.Close()
// 使用 image 包获取图片原始尺寸
imgFile, err := os.Open(tmpFile.Name())
if err != nil {
return fmt.Errorf("打开图片文件失败: %v", err)
}
defer imgFile.Close()
config, format, err := image.DecodeConfig(imgFile)
if err != nil {
return fmt.Errorf("获取图片尺寸失败: %v", err)
}
_ = format // 忽略格式
// A4页面宽度595pt210mm高度842pt297mm
pageWidth := 595.0
pageHeight := 842.0
margin := 20.0
// 计算可用宽度
availableWidth := pageWidth - 2*margin
// 计算缩放后的图片尺寸保持宽高比宽度为可用宽度的80%
imageWidth := availableWidth * 0.8
originalWidth := float64(config.Width)
originalHeight := float64(config.Height)
imageHeight := (imageWidth / originalWidth) * originalHeight
// 计算居中位置
imageX := (pageWidth - imageWidth) / 2
imageY := (pageHeight - imageHeight) / 2
// 使用 ImageHolderByBytes 添加图片
imgH1, err := gopdf.ImageHolderByBytes(imageData)
if err != nil {
return fmt.Errorf("创建图片Holder失败: %v", err)
}
// 绘制图片
err = pdf.ImageByHolder(imgH1, imageX, imageY, &gopdf.Rect{W: imageWidth, H: imageHeight})
if err != nil {
return fmt.Errorf("绘制图片失败: %v", err)
}
}
// 生成新的 PDF
if err := pdf.WritePdf(outputPath); err != nil {
return fmt.Errorf("error writing final PDF: %v", err)
}
return nil
}
// getCharWidth 获取字符的宽度权重
// 英文字母、数字、英文符号返回 0.5,其他字符返回 1.0
func getCharWidth(r rune) float64 {
// 英文字母 (A-Z, a-z)
if (r >= 'A' && r <= 'Z') || (r >= 'a' && r <= 'z') {
return 0.5
}
// 数字 (0-9)
if r >= '0' && r <= '9' {
return 0.5
}
// 英文符号
if (r >= 0x21 && r <= 0x2F) || // ! " # $ % & ' ( ) * + , - . /
(r >= 0x3A && r <= 0x40) || // : ; < = > ? @
(r >= 0x5B && r <= 0x60) || // [ \ ] ^ _ `
(r >= 0x7B && r <= 0x7E) { // { | } ~
return 0.5
}
return 1.0
}
// splitTextByRune 将文本按指定字符宽度拆分成多行
// 按每行最大宽度拆分,英文字母/数字/英文符号按0.5计算其他按1计算
func splitTextByRune(text string, maxWidth float64) []string {
if text == "" {
return []string{}
}
runes := []rune(text)
var lines []string
currentLine := ""
currentWidth := 0.0
for _, r := range runes {
charWidth := getCharWidth(r)
// 检查加上这个字符是否会超过最大宽度
if currentWidth+charWidth > maxWidth {
// 超过最大宽度,保存当前行并开始新行
if currentLine != "" {
lines = append(lines, currentLine)
}
currentLine = string(r)
currentWidth = charWidth
} else {
currentLine += string(r)
currentWidth += charWidth
}
}
// 添加最后一行
if currentLine != "" {
lines = append(lines, currentLine)
}
return lines
}
// TruncateTextByRune 按字符权重截断文本
// 中文字符算1.0,英文字母/数字/英文符号算0.5
// 返回截断后的文本确保总权重不超过maxWidth
func TruncateTextByRune(text string, maxWidth float64) string {
if text == "" {
return ""
}
runes := []rune(text)
var result []rune
currentWidth := 0.0
for _, r := range runes {
charWidth := getCharWidth(r)
if currentWidth+charWidth > maxWidth {
break
}
result = append(result, r)
currentWidth += charWidth
}
return string(result)
}
// ConvertCompetitorReportToText 将竞品报告数据转换为文本格式
// 参数:
// - data: 竞品报告数据
// - isVideo: 是否为视频(视频需要包含完播率和配乐亮点)
//
// 返回: 转换后的文本内容
func ConvertCompetitorReportToText(data CompetitorReportData, isVideo bool) string {
var sb strings.Builder
// 一、亮点表现分析
sb.WriteString("一、亮点表现分析\n")
sb.WriteString(data.HighlightAnalysis.Summary)
sb.WriteString("\n\n")
sb.WriteString("1. 标题亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Theme)
sb.WriteString("\n")
sb.WriteString("2. 题材亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Narrative)
sb.WriteString("\n")
sb.WriteString("3. 内容亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Content)
sb.WriteString("\n")
sb.WriteString("4. 文案亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Copywriting)
sb.WriteString("\n")
sb.WriteString("5. 数据亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Data)
sb.WriteString("\n")
if isVideo && data.HighlightAnalysis.Points.Music != "" {
sb.WriteString("6. 配乐亮点:")
sb.WriteString(data.HighlightAnalysis.Points.Music)
sb.WriteString("\n")
}
// 二、数据表现分析
sb.WriteString("\n二、数据表现分析\n")
sb.WriteString("1. 浏览量表现:")
sb.WriteString(data.DataPerformance.Views)
sb.WriteString("\n")
if isVideo && data.DataPerformance.Completion != "" {
sb.WriteString("2. 完播率表现:")
sb.WriteString(data.DataPerformance.Completion)
sb.WriteString("\n")
sb.WriteString("3. 点赞/分享/评论表现:")
} else {
sb.WriteString("2. 点赞/分享/评论表现:")
}
sb.WriteString(data.DataPerformance.Engagement)
sb.WriteString("\n")
// 三、整体总结及可优化建议
sb.WriteString("\n三、整体总结及可优化建议\n")
sb.WriteString(data.OverallSummary)
return sb.String()
}
//生成问卷调查pdf
func QuestionnaireSurveyPDF(templatePath, outputPath string, data *model.QuestionnairePDFData) error {
pdf := gopdf.GoPdf{}
pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4})
if err := pdf.ImportPagesFromSource(templatePath, "/MediaBox"); err != nil {
return fmt.Errorf("导入模板失败: %w", err)
}
if err := pdf.AddTTFFont("simfang", "./data/simfang.ttf"); err != nil {
return fmt.Errorf("加载字体失败: %w", err)
}
if err := pdf.SetFont("simfang", "", 12); err != nil {
return fmt.Errorf("设置字体失败: %w", err)
}
startTime, err := parseFlexibleDate(data.BundleStartDate)
if err != nil {
return fmt.Errorf("BundleStartDate格式错误: %w", err)
}
endTime, err := parseFlexibleDate(data.BundleEndDate)
if err != nil {
return fmt.Errorf("BundleEndDate格式错误: %w", err)
}
submissionDate, err := parseFlexibleDate(data.SubmissionDate)
if err != nil {
return fmt.Errorf("SubmissionDate格式错误: %w", err)
}
nowTime := time.Now().Format(time.DateTime)
onePage := 1
twoPage := 2
threePage := 3
fourPage := 4
// 第1页客户基本信息
pdf.SetPage(onePage)
//姓名
pdf.SetX(165)
pdf.SetY(420)
pdf.Cell(nil, data.CustomerName)
//套餐名称
pdf.SetX(205)
pdf.SetY(443)
pdf.Cell(nil, data.BundleName)
//开始日期
pdf.SetX(205)
pdf.SetY(467)
pdf.Cell(nil, startTime.Format("2006"))
pdf.SetX(260)
pdf.SetY(467)
pdf.Cell(nil, startTime.Format("01"))
pdf.SetX(300)
pdf.SetY(467)
pdf.Cell(nil, startTime.Format("02"))
//结束日期
pdf.SetX(350)
pdf.SetY(467)
pdf.Cell(nil, endTime.Format("2006"))
pdf.SetX(398)
pdf.SetY(467)
pdf.Cell(nil, endTime.Format("01"))
pdf.SetX(437)
pdf.SetY(467)
pdf.Cell(nil, endTime.Format("02"))
//视频数
pdf.SetX(220)
pdf.SetY(583)
pdf.Cell(nil, data.VideoNum)
//"账号数: "+
pdf.SetX(230)
pdf.SetY(625)
pdf.Cell(nil, data.AccountNum)
// "图文数: "+
pdf.SetX(253)
pdf.SetY(667)
pdf.Cell(nil, data.ImagesNum)
//"数据分析数: "+
pdf.SetX(280)
pdf.SetY(727)
pdf.Cell(nil, data.DataAnalysisNum)
// 第1页内容写完后
if err = addWatermark(&pdf, "确认地址:"+data.Address+"\n确认时间"+nowTime); err != nil {
return err
}
// 第2页服务数量
pdf.SetPage(twoPage)
//"竞品分析数: "+
pdf.SetX(205)
pdf.SetY(72)
pdf.Cell(nil, data.CompetitiveNum)
//"增值视频数: "+
pdf.SetX(270)
pdf.SetY(156)
pdf.Cell(nil, data.ValueAddVideoNum)
//"评分1: "+
pdf.SetX(123)
pdf.SetY(485)
pdf.Cell(nil, scoreStars(data.Score1))
//"评分2: "+
pdf.SetX(343)
pdf.SetY(526)
pdf.Cell(nil, scoreStars(data.Score2))
//"评分3: "+
pdf.SetX(230)
pdf.SetY(568)
pdf.Cell(nil, scoreStars(data.Score3))
//"评分4: "+
pdf.SetX(362)
pdf.SetY(610)
pdf.Cell(nil, scoreStars(data.Score4))
//"评分5: "+
pdf.SetX(220)
pdf.SetY(652)
pdf.Cell(nil, scoreStars(data.Score5))
//"评分6: "+
pdf.SetX(164)
pdf.SetY(694)
pdf.Cell(nil, scoreStars(data.Score6))
//"评分7: "+
pdf.SetX(197)
pdf.SetY(735)
pdf.Cell(nil, scoreStars(data.Score7))
//水印
if err = addWatermark(&pdf, "确认地址:"+data.Address+"\n确认时间"+nowTime); err != nil {
return err
}
// 第3页评分与意见
pdf.SetPage(threePage)
// Opinion 超过100字符时自动换行每行约20个中文字符行高18pt
drawWrappedText(&pdf, data.Opinion1, 90, 145, 24, 34)
drawWrappedText(&pdf, data.Opinion2, 90, 377, 24, 34)
drawWrappedText(&pdf, data.Opinion3, 90, 574, 24, 34)
//水印
if err = addWatermark(&pdf, "确认地址:"+data.Address+"\n确认时间"+nowTime); err != nil {
return err
}
// 第4页提交信息
pdf.SetPage(fourPage)
//"提交人: "+
pdf.SetX(135)
pdf.SetY(103)
pdf.Cell(nil, data.Submitter)
//提交时间: "
pdf.SetX(148)
pdf.SetY(128)
pdf.Cell(nil, submissionDate.Format("2006"))
pdf.SetX(207)
pdf.SetY(128)
pdf.Cell(nil, submissionDate.Format("01"))
pdf.SetX(260)
pdf.SetY(128)
pdf.Cell(nil, submissionDate.Format("02"))
//水印
if err = addWatermark(&pdf, "确认地址:"+data.Address+"\n确认时间"+nowTime); err != nil {
return err
}
if err := pdf.WritePdf(outputPath); err != nil {
return fmt.Errorf("写入PDF失败: %w", err)
}
return nil
}
// addWatermark 在当前页叠加浅色斜向双行水印,并在结束后恢复样式
func addWatermark(pdf *gopdf.GoPdf, text string) error {
const normalFontSize = 12
const watermarkFontSize = 22
const lineHeight = 32.0 // 水印行间距
// 设置水印样式
pdf.SetGrayFill(0.85)
if err := pdf.SetFont("simfang", "", watermarkFontSize); err != nil {
return fmt.Errorf("设置水印字体失败: %w", err)
}
// 按换行拆分逐行绘制Cell 不负责自动换行)
lines := strings.Split(text, "\n")
if len(lines) == 0 {
lines = []string{text}
}
drawBlock := func(x, y, cx, cy float64) {
pdf.Rotate(35, cx, cy)
for i, line := range lines {
pdf.SetX(x)
pdf.SetY(y + float64(i)*lineHeight)
pdf.Cell(nil, line)
}
pdf.RotateReset()
}
// 两处重复水印
drawBlock(90, 420, 300, 420)
drawBlock(130, 620, 300, 420)
// 恢复样式,避免影响后续正文
pdf.SetGrayFill(0)
if err := pdf.SetFont("simfang", "", normalFontSize); err != nil {
return fmt.Errorf("恢复字体失败: %w", err)
}
return nil
}
// drawWrappedText 在 PDF 上绘制自动换行的文字
// pdf: GoPdf 实例, text: 文字内容, startX/startY: 起始坐标
// maxWidth: 最大宽度pt, lineHeight: 行高pt, charsPerLine: 每行最多字符数(按中文字符计)
func drawWrappedText(pdf *gopdf.GoPdf, text string, startX, startY, lineHeight float64, charsPerLine int) {
runes := []rune(text)
total := len(runes)
if total == 0 {
return
}
lineStart := 0
currentLine := 0
for lineStart < total {
end := lineStart + charsPerLine
if end > total {
end = total
}
// 计算实际宽度以决定换行点按字节估算ASCII=0.5中文字符宽)
charCount := 0
splitAt := lineStart
for i := lineStart; i < total; i++ {
r := runes[i]
runeBytes := utf8.RuneLen(r)
if runeBytes > 1 {
charCount += 2 // 中文等宽字符算2个单位
} else {
charCount += 1 // ASCII 算1个单位
}
if charCount > charsPerLine*2 {
break
}
splitAt = i + 1
}
if splitAt == lineStart {
splitAt = lineStart + 1
}
line := string(runes[lineStart:splitAt])
pdf.SetX(startX)
pdf.SetY(startY + float64(currentLine)*lineHeight)
pdf.Cell(nil, line)
lineStart = splitAt
currentLine++
}
}
func scoreStars(score int) string {
switch {
case score <= 1:
return "★☆☆☆☆"
case score == 2:
return "★★☆☆☆"
case score == 3:
return "★★★☆☆"
case score == 4:
return "★★★★☆"
default:
return "★★★★★"
}
}
func parseFlexibleDate(value string) (time.Time, error) {
v := strings.TrimSpace(value)
if v == "" {
return time.Time{}, fmt.Errorf("日期为空")
}
layouts := []string{
"2006-01-02",
time.RFC3339,
"2006-01-02 15:04:05",
"2006-01-02 15:04",
}
var lastErr error
for _, layout := range layouts {
t, err := time.Parse(layout, v)
if err == nil {
return t, nil
}
lastErr = err
}
return time.Time{}, fmt.Errorf("不支持的日期格式: %s, %w", v, lastErr)
}

View File

@ -1,304 +0,0 @@
package utils
import (
"fmt"
"os"
"path/filepath"
"testing"
)
// getProjectRoot 获取项目根目录
func getProjectRoot() string {
// 假设测试从项目根目录运行
dir, _ := os.Getwd()
// 向上查找 go.mod 确定项目根目录
for {
if _, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil {
return dir
}
parent := filepath.Dir(dir)
if parent == dir {
break
}
dir = parent
}
return ""
}
// TestGenerateCompetitorReportPDF 测试生成竞品报告PDF
func TestGenerateCompetitorReportPDF1(t *testing.T) {
// 获取项目根目录
root := getProjectRoot()
fmt.Printf("项目根目录: %s\n", root)
// 准备测试数据
data := CompetitorReportData{
HighlightAnalysis: HighlightAnalysisData{
Summary: "本视频通过展示产品使用的真实场景,突出用户产品优势和痛点,内容详实且具有吸引力。",
Points: PointsData{
Theme: "标题简洁有力,突出核心卖点'省时省力',引发用户好奇心",
Narrative: "采用情景剧形式展示产品使用场景,剧情贴近生活,易引发共鸣",
Content: "通过前后对比展示产品效果,直观呈现产品价值",
Copywriting: "文案简洁明了,突出用户痛点解决方案,语气亲切自然",
Data: "点赞量10万+评论5000+分享2万+,数据表现优异",
Music: "背景音乐节奏轻快,与视频内容匹配度高,增强观看体验",
},
},
DataPerformance: DataPerformanceData{
Views: "播放量突破500万推荐流量占比60%,自然流量表现优秀",
Completion: "完播率45%高于同类视频平均值30%前3秒吸引力强",
Engagement: "点赞率2%评论率0.1%分享率0.4%,互动数据表现优秀",
},
OverallSummary: "整体来看该竞品视频在内容策划、表现形式和互动数据方面都表现优秀。优势在于1内容真实可信通过实际使用场景展示产品效果2剧情设计合理前3秒抓住用户注意力3文案简洁有力直击用户痛点。建议优化方向1可以增加更多用户评价内容增强可信度2适当增加福利引导提高转化率3结尾可以增加引导关注话术提升粉丝沉淀。",
}
// 模板路径
templatePath := filepath.Join(root, "data", "竞品报告pdf模板.pdf")
// 输出路径
outputPath := filepath.Join(root, "data", "output", "竞品报告测试_multicell.pdf")
// 确保输出目录存在
outputDir := filepath.Dir(outputPath)
if err := os.MkdirAll(outputDir, 0755); err != nil {
t.Errorf("创建输出目录失败: %v", err)
return
}
// 调用函数生成PDF
err := GenerateCompetitorReportPDF(templatePath, outputPath, data)
if err != nil {
t.Errorf("生成竞品报告PDF失败: %v", err)
return
}
fmt.Printf("PDF生成成功: %s\n", outputPath)
}
// TestGenerateCompetitorReportPDFImageOnly 测试仅图片的竞品报告PDF无配乐和完播率
func TestGenerateCompetitorReportPDFImageOnly(t *testing.T) {
// 获取项目根目录
root := getProjectRoot()
// 准备测试数据(仅图片,没有视频的配乐和完播率)
data := CompetitorReportData{
HighlightAnalysis: HighlightAnalysisData{
Summary: "该图文内容通过精美的视觉设计和精准的标签定位,成功吸引目标用户关注。",
Points: PointsData{
Theme: "标题设置悬念,引发用户点击欲望",
Narrative: "采用九宫格形式展示产品特点,视觉冲击力强",
Content: "内容排版清晰,重点突出,便于用户快速获取信息",
Copywriting: "文案简洁,配合表情符号增加趣味性",
Data: "收藏量5万+评论1000+分享8000+",
Music: "", // 图片无配乐
},
},
DataPerformance: DataPerformanceData{
Views: "曝光量100万+点击率3%,表现良好",
Completion: "", // 图文无完播率
Engagement: "收藏率5%评论率0.1%分享率0.8%",
},
OverallSummary: "该图文内容整体表现优秀特别是在视觉设计和内容排版方面。亮点1九宫格形式统一视觉效果好2标签设置精准触达目标用户3发布时间合理获得更多曝光。优化建议1可以增加更多用户案例展示2适当加入互动话题提高评论量。",
}
// 模板路径
templatePath := filepath.Join(root, "data", "竞品报告pdf模板.pdf")
// 输出路径
outputPath := filepath.Join(root, "data", "output", "竞品报告测试_图文11.pdf")
// 确保输出目录存在
outputDir := filepath.Dir(outputPath)
if err := os.MkdirAll(outputDir, 0755); err != nil {
t.Errorf("创建输出目录失败: %v", err)
return
}
// 调用函数生成PDF
err := GenerateCompetitorReportPDF(templatePath, outputPath, data)
if err != nil {
t.Errorf("生成竞品报告PDF失败: %v", err)
return
}
fmt.Printf("PDF生成成功: %s\n", outputPath)
}
// TestGenerateCompetitorReportPDFWithImage 测试带图片的竞品报告PDF
// 注意:此测试需要网络连接来下载图片,如果网络不可用会被跳过
func TestGenerateCompetitorReportPDFWithImage1(t *testing.T) {
// 获取项目根目录
root := getProjectRoot()
// 准备测试数据(带图片)
// 使用一个已知可用的测试图片URL
data := CompetitorReportData{
HighlightAnalysis: HighlightAnalysisData{
Summary: "本视频通过展示产品使用的真实场景,突出用户产品优势和痛点,内容详实且具有吸引力。",
Points: PointsData{
Theme: "标题简洁有力,突出核心卖点'省时省力',引发用户好奇心",
Narrative: "采用情景剧形式展示产品使用场景,剧情贴近生活,易引发共鸣",
Content: "通过前后对比展示产品效果,直观呈现产品价值",
Copywriting: "文案简洁明了,突出用户痛点解决方案,语气亲切自然",
Data: "点赞量10万+评论5000+分享2万+,数据表现优异",
Music: "背景音乐节奏轻快,与视频内容匹配度高,增强观看体验",
},
},
DataPerformance: DataPerformanceData{
Views: "播放量突破500万推荐流量占比60%,自然流量表现优秀",
Completion: "完播率45%高于同类视频平均值30%前3秒吸引力强",
Engagement: "点赞率2%评论率0.1%分享率0.4%,互动数据表现优秀",
},
OverallSummary: "整体来看,该竞品视频在内容策划、表现形式和互动数据方面都表现优秀。",
ImageURL: "https://cdn-test.szjixun.cn/fonchain-main/test/image/12345/artwork/0.png", // 测试用图片URL
}
// 模板路径
templatePath := filepath.Join(root, "data", "竞品报告pdf模板.pdf")
// 输出路径
outputPath := filepath.Join(root, "data", "output", "竞品报告测试_带图片.pdf")
// 确保输出目录存在
outputDir := filepath.Dir(outputPath)
if err := os.MkdirAll(outputDir, 0755); err != nil {
t.Errorf("创建输出目录失败: %v", err)
return
}
// 调用函数生成PDF
err := GenerateCompetitorReportPDF(templatePath, outputPath, data)
if err != nil {
t.Logf("图片下载测试跳过(网络问题): %v", err)
t.Skip("网络不可用,跳过图片测试")
return
}
fmt.Printf("PDF生成成功: %s\n", outputPath)
}
// TestGenerateCompetitorReportPDFMixedContent 测试中英混合、数字、符号的复杂情况
func TestGenerateCompetitorReportPDFMixedContent(t *testing.T) {
root := getProjectRoot()
// 准备包含中英混合、数字、符号的复杂测试数据
data := CompetitorReportData{
HighlightAnalysis: HighlightAnalysisData{
Summary: "这是一个关于2024年短视频创作的爆款分析报告视频总播放量达到1.2亿次点赞率8.5%远超行业平均3.2%。内容包括①生活技巧类占比40% ②知识科普类30% ③娱乐搞笑类30%。推荐算法推荐流量占比85%搜索流量10%其他渠道5%。",
Points: PointsData{
Theme: "标题【逆袭】3个月从0到100万粉丝我是如何做到的必看🔥",
Narrative: "采用问题-解决叙事结构前3秒抛出痛点你还在为XX发愁吗然后展示解决方案ABC",
Content: "内容分为3个板块①前置干货预告15秒 ②核心内容展示30秒 ③互动引导15秒",
Copywriting: "文案使用了大量emoji表情🔥💯👍增加年轻化气息结尾一句评论区见强化互动",
Data: "点赞率8.5%高于同类平均3.2%转发率2.1%评论数2.3万条评论区活跃度TOP10%",
Music: "使用热门BGM孤勇者前奏3秒配合画面节奏卡点音量为Original-3dB",
},
},
DataPerformance: DataPerformanceData{
Views: "发布24小时内播放量突破500万48小时达到1200万72小时稳定在1500万。推荐流量占比85%搜索流量占比10%其他渠道5%。数据表现PV=15000000UV=8500000。",
Completion: "平均完播率45.2%高于行业均值28%3秒留存率72%5秒完播率58%10秒完播率35%属于高质量流量。平均观看时长18.5秒视频总时长42秒。",
Engagement: "点赞数128000点赞率0.85%评论数23000其中神评论占比15%高赞评论TOP3①学到了 ②太棒了 ③收藏了分享数56000。评论区@相关账号12个引发二次传播。",
},
OverallSummary: "该视频成功因素:①标题使用数字热门词激发点击逆袭必看 ②内容结构清晰每15秒一个高潮点 ③BGM选择契合内容情绪孤勇者 ④评论区运营到位。建议优化1可增加合集功能将同类内容串联 2提升粉丝粘性到10%以上 3适当增加直播预告。整体来看这是一条典型的爆款体质视频值得借鉴学习数据支撑ROI=3.5CPM=25元CPC=0.8元。",
ImageURL: "",
}
// 模板路径
templatePath := filepath.Join(root, "data", "竞品报告pdf模板.pdf")
// 输出路径
outputPath := filepath.Join(root, "data", "output", "竞品报告测试_中英混合.pdf")
// 确保输出目录存在
outputDir := filepath.Dir(outputPath)
if err := os.MkdirAll(outputDir, 0755); err != nil {
t.Errorf("创建输出目录失败: %v", err)
return
}
// 调用函数生成PDF
err := GenerateCompetitorReportPDF(templatePath, outputPath, data)
if err != nil {
t.Errorf("生成PDF失败: %v", err)
return
}
fmt.Printf("PDF生成成功中英混合测试: %s\n", outputPath)
}
// TestTruncateTextByRune 测试按字符权重截断文本
func TestTruncateTextByRune(t *testing.T) {
tests := []struct {
name string
text string
maxWidth float64
want string
}{
{
name: "空文本",
text: "",
maxWidth: 10,
want: "",
},
{
name: "纯中文截断",
text: "这是一段很长的中文内容需要被截断",
maxWidth: 10,
want: "这是一段很长的中文内", // 10个中文字=10正好
},
{
name: "纯英文截断按0.5计算)",
text: "abcdefghijklmnop",
maxWidth: 5,
want: "abcdefghij", // 10个字母=5.0,正好
},
{
name: "数字截断按0.5计算)",
text: "1234567890",
maxWidth: 3,
want: "123456", // 6个数字=3.0,正好
},
{
name: "中英混合截断",
text: "hello你好world世界",
maxWidth: 6,
// h(0.5)+e(0.5)+l(0.5)+l(0.5)+o(0.5)=2.5
// +你(1)+好(1)=4.5
// +w(0.5)+o(0.5)+r(0.5)+l(0.5)=2再加就超过6了
// 所以应该是 hello你好wor
want: "hello你好wor",
},
{
name: "符号截断按0.5计算)",
text: "hello,world!",
maxWidth: 5,
// h(0.5)+e(0.5)+l(0.5)+l(0.5)+o(0.5)+,(0.5)=3
// +w(0.5)+o(0.5)+r(0.5)+l(0.5)+d(0.5)+!(0.5)=6超过5
// 所以保留 hello,worl
want: "hello,worl",
},
{
name: "截断到正好边界",
text: "中文字符",
maxWidth: 4,
want: "中文字符", // 4个中文字=4.0,正好
},
{
name: "宽度为0",
text: "hello",
maxWidth: 0,
want: "",
},
{
name: "宽度小于单个字符",
text: "hello",
maxWidth: 0.3,
want: "",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := TruncateTextByRune(tt.text, tt.maxWidth)
if got != tt.want {
t.Errorf("TruncateTextByRune(%q, %v) = %q, want %q", tt.text, tt.maxWidth, got, tt.want)
}
})
}
}