From 057f034d4cd728c1bd0284e7c6b4a47739d5220d Mon Sep 17 00:00:00 2001
From: zhaoqingang <zhaoqg0118@163.com>
Date: 星期四, 12 十二月 2024 19:57:41 +0800
Subject: [PATCH] yonghu

---
 app/service/bisheng.py                               |    2 
 app/models/organization_model.py                     |   22 ++
 app/service/label.py                                 |   13 
 app/service/ragflow.py                               |    2 
 app/service/service_token.py                         |   64 +++++
 app/service/group.py                                 |   66 +++---
 app/service/user.py                                  |   98 +++++++-
 app/service/difyService.py                           |   39 +-
 app/service/knowledge.py                             |   14 +
 app/api/user.py                                      |   22 +
 app/api/auth.py                                      |   31 +-
 app/service/auth.py                                  |   11 
 alembic/versions/0366cf835bba_dialog_agent_id_add.py |   16 
 /dev/null                                            |   30 --
 app/models/user_model.py                             |   36 ++
 app/api/knowledge.py                                 |   20 +
 app/api/canvas.py                                    |    3 
 app/service/dialog.py                                |   28 ++
 app/models/knowledge_model.py                        |   22 +
 app/api/dialog.py                                    |   32 ++
 app/api/label.py                                     |    4 
 app/models/dialog_model.py                           |   29 ++
 app/models/token_model.py                            |    9 
 23 files changed, 431 insertions(+), 182 deletions(-)

diff --git a/alembic/versions/07b5185945e0_token_table.py b/alembic/versions/0366cf835bba_dialog_agent_id_add.py
similarity index 61%
rename from alembic/versions/07b5185945e0_token_table.py
rename to alembic/versions/0366cf835bba_dialog_agent_id_add.py
index 06fbf7e..c7afc62 100644
--- a/alembic/versions/07b5185945e0_token_table.py
+++ b/alembic/versions/0366cf835bba_dialog_agent_id_add.py
@@ -1,8 +1,8 @@
-"""token table
+"""dialog agent id add 銆�
 
-Revision ID: 07b5185945e0
-Revises: 4b3a7c69ceac
-Create Date: 2024-12-06 16:27:30.329519
+Revision ID: 0366cf835bba
+Revises: 
+Create Date: 2024-12-12 18:50:43.195483
 
 """
 from typing import Sequence, Union
@@ -12,19 +12,19 @@
 
 
 # revision identifiers, used by Alembic.
-revision: str = '07b5185945e0'
-down_revision: Union[str, None] = '4b3a7c69ceac'
+revision: str = '0366cf835bba'
+down_revision: Union[str, None] = None
 branch_labels: Union[str, Sequence[str], None] = None
 depends_on: Union[str, Sequence[str], None] = None
 
 
 def upgrade() -> None:
     # ### commands auto generated by Alembic - please adjust! ###
-    pass
+    op.add_column('dialogs', sa.Column('agent_id', sa.String(length=32), nullable=True))
     # ### end Alembic commands ###
 
 
 def downgrade() -> None:
     # ### commands auto generated by Alembic - please adjust! ###
-    pass
+    op.drop_column('dialogs', 'agent_id')
     # ### end Alembic commands ###
diff --git a/alembic/versions/2f304d60542b_zhishiku_type_add.py b/alembic/versions/2f304d60542b_zhishiku_type_add.py
deleted file mode 100644
index dc82894..0000000
--- a/alembic/versions/2f304d60542b_zhishiku_type_add.py
+++ /dev/null
@@ -1,32 +0,0 @@
-"""ZHISHIKU type add 
-
-Revision ID: 2f304d60542b
-Revises: d8f96e825884
-Create Date: 2024-12-10 18:04:36.301693
-
-"""
-from typing import Sequence, Union
-
-from alembic import op
-import sqlalchemy as sa
-
-
-# revision identifiers, used by Alembic.
-revision: str = '2f304d60542b'
-down_revision: Union[str, None] = 'd8f96e825884'
-branch_labels: Union[str, Sequence[str], None] = None
-depends_on: Union[str, Sequence[str], None] = None
-
-
-def upgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.add_column('knowledgebase', sa.Column('documents', sa.Integer(), nullable=True))
-    op.add_column('knowledgebase', sa.Column('icon', sa.String(length=128), nullable=True))
-    # ### end Alembic commands ###
-
-
-def downgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.drop_column('knowledgebase', 'icon')
-    op.drop_column('knowledgebase', 'documents')
-    # ### end Alembic commands ###
diff --git a/alembic/versions/3845dc998475_menu_table_add.py b/alembic/versions/3845dc998475_menu_table_add.py
deleted file mode 100644
index 570d716..0000000
--- a/alembic/versions/3845dc998475_menu_table_add.py
+++ /dev/null
@@ -1,53 +0,0 @@
-"""menu table add 
-
-Revision ID: 3845dc998475
-Revises: abc6bb9129ed
-Create Date: 2024-12-10 14:22:03.798597
-
-"""
-from typing import Sequence, Union
-
-from alembic import op
-import sqlalchemy as sa
-from sqlalchemy.dialects import mysql
-
-# revision identifiers, used by Alembic.
-revision: str = '3845dc998475'
-down_revision: Union[str, None] = 'abc6bb9129ed'
-branch_labels: Union[str, Sequence[str], None] = None
-depends_on: Union[str, Sequence[str], None] = None
-
-
-def upgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.create_table('menu_capacity',
-    sa.Column('id', sa.Integer(), nullable=False),
-    sa.Column('menu_id', sa.Integer(), nullable=True),
-    sa.Column('capacity_id', sa.String(length=36), nullable=True),
-    sa.Column('capacity_type', sa.Integer(), nullable=True),
-    sa.PrimaryKeyConstraint('id'),
-    sa.UniqueConstraint('menu_id', 'capacity_id', name='menu_capacity_id_ix')
-    )
-    op.create_index(op.f('ix_menu_capacity_id'), 'menu_capacity', ['id'], unique=False)
-    op.create_table('web_menu',
-    sa.Column('id', sa.Integer(), nullable=False),
-    sa.Column('title', sa.String(length=128), nullable=True),
-    sa.Column('dialog', sa.String(length=1000), nullable=True),
-    sa.Column('desc', sa.String(length=1000), nullable=True),
-    sa.Column('icon', sa.String(length=16), nullable=True),
-    sa.Column('img', sa.String(length=255), nullable=True),
-    sa.PrimaryKeyConstraint('id')
-    )
-    op.create_index(op.f('ix_web_menu_id'), 'web_menu', ['id'], unique=False)
-    op.drop_column('knowledgebase', 'count')
-    # ### end Alembic commands ###
-
-
-def downgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.add_column('knowledgebase', sa.Column('count', mysql.VARCHAR(length=32), nullable=True))
-    op.drop_index(op.f('ix_web_menu_id'), table_name='web_menu')
-    op.drop_table('web_menu')
-    op.drop_index(op.f('ix_menu_capacity_id'), table_name='menu_capacity')
-    op.drop_table('menu_capacity')
-    # ### end Alembic commands ###
diff --git a/alembic/versions/4b3a7c69ceac_init_table.py b/alembic/versions/4b3a7c69ceac_init_table.py
deleted file mode 100644
index 9deba7e..0000000
--- a/alembic/versions/4b3a7c69ceac_init_table.py
+++ /dev/null
@@ -1,79 +0,0 @@
-"""init table
-
-Revision ID: 4b3a7c69ceac
-Revises: 
-Create Date: 2024-12-06 16:12:04.760402
-
-"""
-from typing import Sequence, Union
-
-from alembic import op
-import sqlalchemy as sa
-from sqlalchemy.dialects import mysql
-
-# revision identifiers, used by Alembic.
-revision: str = '4b3a7c69ceac'
-down_revision: Union[str, None] = None
-branch_labels: Union[str, Sequence[str], None] = None
-depends_on: Union[str, Sequence[str], None] = None
-
-
-def upgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.drop_index('ix_user_test_id', table_name='user_test')
-    op.drop_index('ix_user_test_username', table_name='user_test')
-    op.drop_table('user_test')
-    op.alter_column('user', 'ragflow_id',
-               existing_type=mysql.VARCHAR(length=32),
-               nullable=True)
-    op.alter_column('user', 'bisheng_id',
-               existing_type=mysql.INTEGER(),
-               nullable=True)
-    op.alter_column('user', 'status',
-               existing_type=mysql.VARCHAR(length=10),
-               nullable=True,
-               existing_server_default=sa.text("'1'"))
-    op.alter_column('user', 'permission',
-               existing_type=mysql.VARCHAR(length=16),
-               nullable=True,
-               existing_server_default=sa.text("'general'"))
-    op.drop_column('user', 'updated_at11')
-    # ### end Alembic commands ###
-
-
-def downgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.add_column('user', sa.Column('updated_at11', mysql.INTEGER(), autoincrement=False, nullable=True))
-    op.alter_column('user', 'permission',
-               existing_type=mysql.VARCHAR(length=16),
-               nullable=False,
-               existing_server_default=sa.text("'general'"))
-    op.alter_column('user', 'status',
-               existing_type=mysql.VARCHAR(length=10),
-               nullable=False,
-               existing_server_default=sa.text("'1'"))
-    op.alter_column('user', 'bisheng_id',
-               existing_type=mysql.INTEGER(),
-               nullable=False)
-    op.alter_column('user', 'ragflow_id',
-               existing_type=mysql.VARCHAR(length=32),
-               nullable=False)
-    op.create_table('user_test',
-    sa.Column('id', mysql.INTEGER(), autoincrement=True, nullable=False),
-    sa.Column('username', mysql.VARCHAR(length=255), nullable=True),
-    sa.Column('hashed_password', mysql.VARCHAR(length=255), nullable=True),
-    sa.Column('password', mysql.VARCHAR(length=255), nullable=True),
-    sa.Column('compellation', mysql.VARCHAR(length=255), nullable=False),
-    sa.Column('phone', mysql.VARCHAR(length=255), nullable=False),
-    sa.Column('email', mysql.VARCHAR(length=255), nullable=False),
-    sa.Column('description', mysql.VARCHAR(length=255), nullable=False),
-    sa.Column('ragflow_id', mysql.VARCHAR(length=32), nullable=True),
-    sa.Column('bisheng_id', mysql.INTEGER(), autoincrement=False, nullable=True),
-    sa.PrimaryKeyConstraint('id'),
-    mysql_collate='utf8mb4_0900_ai_ci',
-    mysql_default_charset='utf8mb4',
-    mysql_engine='InnoDB'
-    )
-    op.create_index('ix_user_test_username', 'user_test', ['username'], unique=True)
-    op.create_index('ix_user_test_id', 'user_test', ['id'], unique=False)
-    # ### end Alembic commands ###
diff --git a/alembic/versions/92ece82bc5a4_menu_table_update.py b/alembic/versions/92ece82bc5a4_menu_table_update.py
deleted file mode 100644
index d33aab6..0000000
--- a/alembic/versions/92ece82bc5a4_menu_table_update.py
+++ /dev/null
@@ -1,32 +0,0 @@
-"""menu table update
-
-Revision ID: 92ece82bc5a4
-Revises: 3845dc998475
-Create Date: 2024-12-10 16:00:04.324833
-
-"""
-from typing import Sequence, Union
-
-from alembic import op
-import sqlalchemy as sa
-from sqlalchemy.dialects import mysql
-
-# revision identifiers, used by Alembic.
-revision: str = '92ece82bc5a4'
-down_revision: Union[str, None] = '3845dc998475'
-branch_labels: Union[str, Sequence[str], None] = None
-depends_on: Union[str, Sequence[str], None] = None
-
-
-def upgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.add_column('web_menu', sa.Column('describe', sa.String(length=1000), nullable=True))
-    op.drop_column('web_menu', 'dialog')
-    # ### end Alembic commands ###
-
-
-def downgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.add_column('web_menu', sa.Column('dialog', mysql.VARCHAR(length=1000), nullable=True))
-    op.drop_column('web_menu', 'describe')
-    # ### end Alembic commands ###
diff --git a/alembic/versions/abc6bb9129ed_user_app_update.py b/alembic/versions/abc6bb9129ed_user_app_update.py
deleted file mode 100644
index 9ea28aa..0000000
--- a/alembic/versions/abc6bb9129ed_user_app_update.py
+++ /dev/null
@@ -1,44 +0,0 @@
-"""user app update
-
-Revision ID: abc6bb9129ed
-Revises: d4c8f204280f
-Create Date: 2024-12-09 16:57:06.559644
-
-"""
-from typing import Sequence, Union
-
-from alembic import op
-import sqlalchemy as sa
-from sqlalchemy.dialects import mysql
-
-# revision identifiers, used by Alembic.
-revision: str = 'abc6bb9129ed'
-down_revision: Union[str, None] = 'd4c8f204280f'
-branch_labels: Union[str, Sequence[str], None] = None
-depends_on: Union[str, Sequence[str], None] = None
-
-
-def upgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.add_column('user_app', sa.Column('access_token', sa.String(length=1000), nullable=True))
-    op.add_column('user_app', sa.Column('refresh_token', sa.String(length=1000), nullable=True))
-    op.add_column('user_app', sa.Column('token_at', sa.DateTime(), nullable=True))
-    op.alter_column('user_app', 'app_type',
-               existing_type=mysql.INTEGER(),
-               type_=sa.String(length=16),
-               existing_nullable=True)
-    op.drop_index('ix_user_app_username', table_name='user_app')
-    # ### end Alembic commands ###
-
-
-def downgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.create_index('ix_user_app_username', 'user_app', ['username'], unique=True)
-    op.alter_column('user_app', 'app_type',
-               existing_type=sa.String(length=16),
-               type_=mysql.INTEGER(),
-               existing_nullable=True)
-    op.drop_column('user_app', 'token_at')
-    op.drop_column('user_app', 'refresh_token')
-    op.drop_column('user_app', 'access_token')
-    # ### end Alembic commands ###
diff --git a/alembic/versions/b2f03e852b6e_agent_type_add.py b/alembic/versions/b2f03e852b6e_agent_type_add.py
deleted file mode 100644
index a19c34c..0000000
--- a/alembic/versions/b2f03e852b6e_agent_type_add.py
+++ /dev/null
@@ -1,30 +0,0 @@
-"""agent type add
-
-Revision ID: b2f03e852b6e
-Revises: c437168c1da4
-Create Date: 2024-12-11 17:56:12.125274
-
-"""
-from typing import Sequence, Union
-
-from alembic import op
-import sqlalchemy as sa
-
-
-# revision identifiers, used by Alembic.
-revision: str = 'b2f03e852b6e'
-down_revision: Union[str, None] = 'c437168c1da4'
-branch_labels: Union[str, Sequence[str], None] = None
-depends_on: Union[str, Sequence[str], None] = None
-
-
-def upgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.add_column('dialogs', sa.Column('dialog_type', sa.String(length=1), nullable=True))
-    # ### end Alembic commands ###
-
-
-def downgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.drop_column('dialogs', 'dialog_type')
-    # ### end Alembic commands ###
diff --git a/alembic/versions/c437168c1da4_label_tabel_add.py b/alembic/versions/c437168c1da4_label_tabel_add.py
deleted file mode 100644
index 91026a3..0000000
--- a/alembic/versions/c437168c1da4_label_tabel_add.py
+++ /dev/null
@@ -1,53 +0,0 @@
-"""label tabel add
-
-Revision ID: c437168c1da4
-Revises: 2f304d60542b
-Create Date: 2024-12-11 15:01:45.049315
-
-"""
-from typing import Sequence, Union
-
-from alembic import op
-import sqlalchemy as sa
-
-
-# revision identifiers, used by Alembic.
-revision: str = 'c437168c1da4'
-down_revision: Union[str, None] = '2f304d60542b'
-branch_labels: Union[str, Sequence[str], None] = None
-depends_on: Union[str, Sequence[str], None] = None
-
-
-def upgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.create_table('label',
-    sa.Column('id', sa.Integer(), nullable=False),
-    sa.Column('created_at', sa.DateTime(), nullable=True),
-    sa.Column('updated_at', sa.DateTime(), nullable=True),
-    sa.Column('name', sa.String(length=128), nullable=False),
-    sa.Column('status', sa.String(length=10), nullable=True),
-    sa.Column('creator', sa.Integer(), nullable=True),
-    sa.Column('label_type', sa.Integer(), nullable=True),
-    sa.PrimaryKeyConstraint('id')
-    )
-    op.create_index(op.f('ix_label_id'), 'label', ['id'], unique=False)
-    op.create_index(op.f('ix_label_name'), 'label', ['name'], unique=True)
-    op.create_table('label_worker',
-    sa.Column('id', sa.Integer(), nullable=False),
-    sa.Column('label_id', sa.Integer(), nullable=True),
-    sa.Column('object_id', sa.String(length=36), nullable=True),
-    sa.PrimaryKeyConstraint('id'),
-    sa.UniqueConstraint('label_id', 'object_id', name='label_object_id_ix')
-    )
-    op.create_index(op.f('ix_label_worker_id'), 'label_worker', ['id'], unique=False)
-    # ### end Alembic commands ###
-
-
-def downgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.drop_index(op.f('ix_label_worker_id'), table_name='label_worker')
-    op.drop_table('label_worker')
-    op.drop_index(op.f('ix_label_name'), table_name='label')
-    op.drop_index(op.f('ix_label_id'), table_name='label')
-    op.drop_table('label')
-    # ### end Alembic commands ###
diff --git a/alembic/versions/d4c8f204280f_user_app_add.py b/alembic/versions/d4c8f204280f_user_app_add.py
deleted file mode 100644
index 6d78333..0000000
--- a/alembic/versions/d4c8f204280f_user_app_add.py
+++ /dev/null
@@ -1,67 +0,0 @@
-"""user app add
-
-Revision ID: d4c8f204280f
-Revises: 07b5185945e0
-Create Date: 2024-12-09 15:43:14.470291
-
-"""
-from typing import Sequence, Union
-
-from alembic import op
-import sqlalchemy as sa
-from sqlalchemy.dialects import mysql
-
-# revision identifiers, used by Alembic.
-revision: str = 'd4c8f204280f'
-down_revision: Union[str, None] = '07b5185945e0'
-branch_labels: Union[str, Sequence[str], None] = None
-depends_on: Union[str, Sequence[str], None] = None
-
-
-def upgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.create_table('user_app',
-    sa.Column('id', sa.Integer(), nullable=False),
-    sa.Column('username', sa.String(length=255), nullable=True),
-    sa.Column('password', sa.String(length=255), nullable=True),
-    sa.Column('email', sa.String(length=255), nullable=True),
-    sa.Column('user_id', sa.Integer(), nullable=True),
-    sa.Column('app_id', sa.String(length=36), nullable=True),
-    sa.Column('app_type', sa.Integer(), nullable=True),
-    sa.Column('status', sa.String(length=10), nullable=True),
-    sa.Column('created_at', sa.DateTime(), nullable=True),
-    sa.Column('updated_at', sa.DateTime(), nullable=True),
-    sa.PrimaryKeyConstraint('id'),
-    sa.UniqueConstraint('user_id', 'app_type', name='user_app_id_ix')
-    )
-    op.create_index(op.f('ix_user_app_id'), 'user_app', ['id'], unique=False)
-    op.create_index(op.f('ix_user_app_username'), 'user_app', ['username'], unique=True)
-    op.drop_table('dialog')
-    op.drop_table('flow')
-    # ### end Alembic commands ###
-
-
-def downgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.create_table('flow',
-    sa.Column('id', mysql.VARCHAR(length=255), nullable=False),
-    sa.Column('name', mysql.VARCHAR(length=255), nullable=False),
-    sa.Column('status', mysql.INTEGER(), autoincrement=False, nullable=False),
-    sa.PrimaryKeyConstraint('id'),
-    mysql_collate='utf8mb4_0900_ai_ci',
-    mysql_default_charset='utf8mb4',
-    mysql_engine='InnoDB'
-    )
-    op.create_table('dialog',
-    sa.Column('id', mysql.VARCHAR(length=255), nullable=False),
-    sa.Column('name', mysql.VARCHAR(length=255), nullable=False),
-    sa.Column('status', mysql.VARCHAR(length=1), nullable=False),
-    sa.PrimaryKeyConstraint('id'),
-    mysql_collate='utf8mb4_0900_ai_ci',
-    mysql_default_charset='utf8mb4',
-    mysql_engine='InnoDB'
-    )
-    op.drop_index(op.f('ix_user_app_username'), table_name='user_app')
-    op.drop_index(op.f('ix_user_app_id'), table_name='user_app')
-    op.drop_table('user_app')
-    # ### end Alembic commands ###
diff --git a/alembic/versions/d8f96e825884_role_type_add.py b/alembic/versions/d8f96e825884_role_type_add.py
deleted file mode 100644
index 948594c..0000000
--- a/alembic/versions/d8f96e825884_role_type_add.py
+++ /dev/null
@@ -1,30 +0,0 @@
-"""role type add 
-
-Revision ID: d8f96e825884
-Revises: f49ae5b5f2c8
-Create Date: 2024-12-10 17:03:38.366156
-
-"""
-from typing import Sequence, Union
-
-from alembic import op
-import sqlalchemy as sa
-
-
-# revision identifiers, used by Alembic.
-revision: str = 'd8f96e825884'
-down_revision: Union[str, None] = 'f49ae5b5f2c8'
-branch_labels: Union[str, Sequence[str], None] = None
-depends_on: Union[str, Sequence[str], None] = None
-
-
-def upgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.add_column('role', sa.Column('role_type', sa.Integer(), nullable=True))
-    # ### end Alembic commands ###
-
-
-def downgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.drop_column('role', 'role_type')
-    # ### end Alembic commands ###
diff --git a/alembic/versions/f49ae5b5f2c8_group_type_add.py b/alembic/versions/f49ae5b5f2c8_group_type_add.py
deleted file mode 100644
index c7ba5d9..0000000
--- a/alembic/versions/f49ae5b5f2c8_group_type_add.py
+++ /dev/null
@@ -1,30 +0,0 @@
-"""group type add 
-
-Revision ID: f49ae5b5f2c8
-Revises: 92ece82bc5a4
-Create Date: 2024-12-10 16:26:34.371685
-
-"""
-from typing import Sequence, Union
-
-from alembic import op
-import sqlalchemy as sa
-
-
-# revision identifiers, used by Alembic.
-revision: str = 'f49ae5b5f2c8'
-down_revision: Union[str, None] = '92ece82bc5a4'
-branch_labels: Union[str, Sequence[str], None] = None
-depends_on: Union[str, Sequence[str], None] = None
-
-
-def upgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.add_column('group', sa.Column('group_type', sa.Integer(), nullable=True))
-    # ### end Alembic commands ###
-
-
-def downgrade() -> None:
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.drop_column('group', 'group_type')
-    # ### end Alembic commands ###
diff --git a/app/api/auth.py b/app/api/auth.py
index ba86a89..116d9e2 100644
--- a/app/api/auth.py
+++ b/app/api/auth.py
@@ -12,12 +12,13 @@
 from app.models.app_token_model import AppToken
 from app.models.base_model import get_db
 from app.models.postgresql_base_model import get_pdb
-from app.models.token_model import upsert_token, get_token, update_token
+from app.models.token_model import upsert_token
 from app.models.user import UserCreate, LoginData
-from app.models.user_model import UserModel
+from app.models.user_model import UserModel, UserAppModel
 from app.service.auth import authenticate_user, create_access_token, is_valid_password, save_register_user, \
     update_user_token, UserAppDao, update_user_info
 from app.service.bisheng import BishengService
+from app.service.service_token import get_new_token, get_token, update_user_group
 from app.service.v2.app_register import AppRegisterDao
 from app.service.difyService import DifyService
 from app.service.ragflow import RagflowService
@@ -115,7 +116,7 @@
         elif app["id"] == BISHENG:
             service = BishengService(settings.sgb_base_url)
         elif app["id"] == DIFY:
-            continue
+            service = DifyService(settings.dify_base_url)
         else:
             logger.error("鏈煡娉ㄥ唽搴旂敤---")
             continue
@@ -171,35 +172,31 @@
         return Response(code=200, msg="Username already registered")
     app_register = AppRegisterDao(db).get_apps()
     register_dict = {}
+    token = ""
     for app in app_register:
         if app["id"] == RAGFLOW:
             service = RagflowService(settings.fwr_base_url)
         elif app["id"] == BISHENG:
             service = BishengService(settings.sgb_base_url)
         elif app["id"] == DIFY:
+            admin_user = db.query(UserModel).filter(UserModel.permission == "admin").first()
+            token = await get_new_token(db, admin_user.id, DIFY)
+            if not token:
+                logger.error("鐢ㄦ埛娉ㄥ唽鑾峰彇dftoken澶辫触锛�")
+                return Response(code=500, msg=f"Failed to register with app")
             service = DifyService(settings.dify_base_url)
         else:
             logger.error("鏈煡娉ㄥ唽搴旂敤---")
             continue
         try:
             name = app["id"] + str(int(time.time()))
-            register_info = await service.register(name, user.password)
+            register_info = await service.register(name, user.password, token)
             # print(register_info)
             register_dict[app['id']] = {"id":register_info.get("id"), "name": name, "email": register_info.get("email")}
         except Exception as e:
             return Response(code=500, msg=f"Failed to register with {app['id']}: {str(e)}")
-
-    # 瀛樺偍鐢ㄦ埛淇℃伅
-    # hashed_password = pwd_context.hash(user.password)
-    # db_user = UserModel(username=user.username, hashed_password=hashed_password, email=user.email)
-    # db_user.password = db_user.encrypted_password(user.password)
-    # for k, v in register_dict.items():
-    #     setattr(db_user, k.replace("app", "id"), v)
-    # db.add(db_user)
-    # db.commit()
-    # db.refresh(db_user)
-
-    is_sava = await save_register_user(db, user.username, user.password, user.email, register_dict)
-    if not is_sava:
+    user_id = await save_register_user(db, user.username, user.password, user.email, register_dict)
+    if not user_id:
         return Response(code=500, msg=f"Failed to register with app")
+    is_update = await update_user_group(db, user_id)
     return Response(code=200, msg="User registered successfully",data={"username": user.username})
\ No newline at end of file
diff --git a/app/api/canvas.py b/app/api/canvas.py
index df214a0..f45597a 100644
--- a/app/api/canvas.py
+++ b/app/api/canvas.py
@@ -1,8 +1,7 @@
 # coding:utf-8
 
 from fastapi import APIRouter, Depends
-from app.api import Response, get_current_user, ResponseList
-from app.models import RoleParameter, GroupModel, KnowledgeModel
+from app.api import Response, get_current_user
 from app.models.base_model import get_db
 from app.models.user_model import UserModel
 from app.service.canvas import get_canvas_list
diff --git a/app/api/dialog.py b/app/api/dialog.py
index cb2b1e4..44030a2 100644
--- a/app/api/dialog.py
+++ b/app/api/dialog.py
@@ -2,10 +2,10 @@
 
 from fastapi import APIRouter, Depends
 from app.api import Response, get_current_user, ResponseList
-from app.models import RoleParameter, GroupModel, KnowledgeModel
+from app.models.dialog_model import dialogData, dialogDataUpdate
 from app.models.base_model import get_db
 from app.models.user_model import UserModel
-from app.service.dialog import get_dialog_list
+from app.service.dialog import get_dialog_list, create_dialog_service, update_dialog_status_service
 
 dialog_router = APIRouter()
 
@@ -14,10 +14,36 @@
 async def dialog_list(current: int,
                       pageSize: int,
                       keyword: str = "",
-                      label: int =0,
+                      label: int = 0,
                       status: str ="",
                       current_user: UserModel = Depends(get_current_user),
                       db=Depends(get_db)):
     if current and not pageSize:
         return ResponseList(code=400, msg="缂哄皯鍙傛暟")
     return Response(code=200, msg="", data=await get_dialog_list(db, current_user.id, keyword, label, status, pageSize, current))
+
+
+@dialog_router.post("/create", response_model=Response)
+async def create_dialog_api(dialog: dialogData, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    is_create = await create_dialog_service(db, dialog.id, dialog.name, dialog.description, dialog.icon, dialog.dialogType, current_user.id)
+    if not is_create:
+        return Response(code=500, msg="role create failure", data={})
+    return Response(code=200, msg="role create success", data={})
+
+
+@dialog_router.get("/update", response_model=Response)
+async def change_dialog_data(dialog: dialogDataUpdate, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    # is_create = await create_dialog_service(db, dialog.id, dialog.name, dialog.description, dialog.icon, dialog.dialogType)
+    # if not is_create:
+    #     return Response(code=500, msg="role create failure", data={})
+    return Response(code=200, msg="role create success", data={})
+
+
+@dialog_router.put("/status", response_model=Response)
+async def change_dialog_status(dialog: dialogDataUpdate, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    if dialog.status not in ["0", "1"]:
+        return Response(code=400, msg="invalid parameter value", data={})
+    is_create = await update_dialog_status_service(db, dialog.id, dialog.status)
+    if not is_create:
+        return Response(code=500, msg="dialog update failure", data={})
+    return Response(code=200, msg="dialog update success", data={})
\ No newline at end of file
diff --git a/app/api/knowledge.py b/app/api/knowledge.py
index 32a12f0..53c047a 100644
--- a/app/api/knowledge.py
+++ b/app/api/knowledge.py
@@ -2,10 +2,10 @@
 
 from fastapi import APIRouter, Depends, Query, HTTPException
 from app.api import Response, get_current_user, ResponseList
-from app.models import RoleParameter, GroupModel, KnowledgeModel
+from app.models import klgParameter
 from app.models.base_model import get_db
 from app.models.user_model import UserModel
-from app.service.knowledge import get_knowledge_list
+from app.service.knowledge import get_knowledge_list, create_knowledge_service
 from typing import Optional
 knowledge_router = APIRouter()
 
@@ -21,3 +21,19 @@
     getknowledgelist = await get_knowledge_list(db, current_user.id, keyword, pageSize, current)
 
     return Response(code=200, msg="", data=getknowledgelist)
+
+
+@knowledge_router.post("/create", response_model=Response)
+async def create_knowledge_api(klg: klgParameter, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    is_create = await create_knowledge_service(db, klg.id, klg.name, klg.description, klg.icon, klg.klgType, current_user.id)
+    if not is_create:
+        return Response(code=500, msg="role create failure", data={})
+    return Response(code=200, msg="role create success", data={})
+
+
+@knowledge_router.get("/update", response_model=Response)
+async def change_knowledge_api(knowledgeId: str, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    # is_create = await update_dialog_status_service(db, dialog.id, dialog.status)
+    # if not is_create:
+    #     return Response(code=500, msg="dialog update failure", data={})
+    return Response(code=200, msg="dialog update success", data={})
\ No newline at end of file
diff --git a/app/api/label.py b/app/api/label.py
index 85744a5..52d3ff7 100644
--- a/app/api/label.py
+++ b/app/api/label.py
@@ -10,10 +10,10 @@
 label_router = APIRouter()
 
 @label_router.get("/list", response_model=Response)
-async def get_label_list(keyword="", labelType=1,current_user: UserModel = Depends(get_current_user),
+async def get_label_list(keyword="", labelType=1, objectId="",current_user: UserModel = Depends(get_current_user),
                           db=Depends(get_db)):
 
-    return Response(code=200, msg="", data=await label_list_service(db, keyword,labelType))
+    return Response(code=200, msg="", data=await label_list_service(db, keyword, labelType, objectId))
 
 
 @label_router.post("/add_label", response_model=Response)
diff --git a/app/api/user.py b/app/api/user.py
index b442af8..506c1b4 100644
--- a/app/api/user.py
+++ b/app/api/user.py
@@ -4,8 +4,9 @@
 from app.models.base_model import get_db
 from app.models.user import PageParameter, UserStatus, UserInfo, LoginData
 from app.models.user_model import UserModel
+from app.service.auth import is_valid_password
 from app.service.user import get_user_list, edit_user_status, delete_user_data, create_user, edit_user_data, \
-    edit_user_pwd, get_user_info, get_user_routers, get_user_menus
+    edit_user_pwd, get_user_info, get_user_routers, get_user_menus, get_user_permission, get_user_dept
 
 user_router = APIRouter()
 
@@ -21,12 +22,15 @@
 async def add_user(user: UserInfo, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
     if not user.userName:
         return Response(code=400, msg="The userName cannot be empty!")
+    if user.pwd:
+        if not is_valid_password(user.pwd):
+            return Response(code=400, msg="The password must be at least 8 and contain both numbers and letters")
     db_user = db.query(UserModel).filter(UserModel.username == user.userName).first()
     if db_user:
         return Response(code=200, msg="user already created")
     pwd = user.pwd
     if not pwd:
-        pwd = "000000"
+        pwd = "basic123456"
     is_create = await create_user(db, user.userName, user.email, user.phone, user.loginName, pwd, user.roles,
                                   user.groups, current_user.id)
     if not is_create:
@@ -103,4 +107,16 @@
     menus = await get_user_menus(db,  current_user.id)
     # return Response(code=200, msg="successfully", data=menus)
     # result = [item.to_dict() for item in agents]
-    return ResponseList(code=200, msg="successfully", data=menus)
\ No newline at end of file
+    return ResponseList(code=200, msg="successfully", data=menus)
+
+
+@user_router.get("/permission", response_model=Response)
+async def user_permission(userId:int, current_user: UserModel = Depends(get_current_user),db=Depends(get_db)):
+    menus = await get_user_permission(db,  userId)
+    return Response(code=200, msg="successfully", data=menus)
+
+
+@user_router.get("/dept", response_model=Response)
+async def user_dept_api(userId:int, current_user: UserModel = Depends(get_current_user),db=Depends(get_db)):
+    menus = await get_user_dept(db, userId)
+    return Response(code=200, msg="successfully", data=menus)
\ No newline at end of file
diff --git a/app/models/dialog_model.py b/app/models/dialog_model.py
index f08ca78..1934388 100644
--- a/app/models/dialog_model.py
+++ b/app/models/dialog_model.py
@@ -1,5 +1,7 @@
 from datetime import datetime
+from typing import Optional
 
+from pydantic import BaseModel
 from sqlalchemy import Column, Integer, String, BigInteger, ForeignKey, DateTime, Text, JSON
 from sqlalchemy.orm import relationship, backref
 
@@ -11,14 +13,15 @@
         # "order_by": 'SEQ'
     }
     id = Column(String(32), primary_key=True)  #  id
-    create_date = Column(DateTime)             # 鍒涘缓鏃堕棿
-    update_date = Column(DateTime)             # 鏇存柊鏃堕棿
+    create_date = Column(DateTime, default=datetime.now())             # 鍒涘缓鏃堕棿
+    update_date = Column(DateTime, default=datetime.now(), onupdate=datetime.now())             # 鏇存柊鏃堕棿
     tenant_id = Column(String(32))              # 鍒涘缓浜�
     name = Column(String(255))                 # 鍚嶇О
     description = Column(Text)                 # 璇存槑
     icon = Column(Text)                         # 鍥炬爣
-    status = Column(String(1))                 # 鐘舵��
+    status = Column(String(1), default="1")                 # 鐘舵��
     dialog_type = Column(String(1))            #    # 骞冲彴
+    agent_id = Column(String(32))
 
     def get_id(self):
         return str(self.id)
@@ -26,14 +29,15 @@
     def to_json(self):
         return {
             'id': self.id,
-            'create_date': self.create_date,
-            'update_date': self.update_date,
+            'create_date': self.create_date.strftime('%Y-%m-%d %H:%M:%S'),
+            'update_date': self.update_date.strftime('%Y-%m-%d %H:%M:%S'),
             'user_id': self.tenant_id,
             'name': self.name,
             'description': self.description,
             'icon': self.icon,
             'status': self.status,
             'agentType': self.dialog_type,
+            'agentId': self.agent_id,
         }
 
 
@@ -60,4 +64,17 @@
             'updated_time': self.update_time,
             'update_date': datetime.fromtimestamp(self.update_time / 1000.0).strftime('%Y-%m-%d %H:%M:%S'),
             'name': self.name,
-        }
\ No newline at end of file
+        }
+
+
+class dialogData(BaseModel):
+    id: str
+    name: str
+    description: Optional[str] = ""
+    dialogType: str
+    icon: str
+
+
+class dialogDataUpdate(BaseModel):
+    id: str
+    status: Optional[str] = "1"
\ No newline at end of file
diff --git a/app/models/knowledge_model.py b/app/models/knowledge_model.py
index 487e91d..afc89e5 100644
--- a/app/models/knowledge_model.py
+++ b/app/models/knowledge_model.py
@@ -15,15 +15,15 @@
     }
     id = Column(String(32), primary_key=True)  # id
     name = Column(String(128))                 # 鍚嶇О
-    create_date = Column(DateTime)             # 鍒涘缓鏃堕棿
-    update_date = Column(DateTime)             # 鏇存柊鏃堕棿
-    avatar = Column(Text)                       # 鍥炬爣
+    create_date = Column(DateTime, default=datetime.now())             # 鍒涘缓鏃堕棿
+    update_date = Column(DateTime, default=datetime.now(), onupdate=datetime.now())             # 鏇存柊鏃堕棿
+    # avatar = Column(Text)                       # 鍥炬爣
     tenant_id = Column(String(32))              # 鍒涘缓浜篿d
     description = Column(Text)                 # 璇存槑
     status = Column(String(1))                    # 鐘舵��
     documents = Column(Integer, default=0)                    # 鏂囨。
     icon = Column(String(128))                    # 鏂囨。
-    # kld_type = Column(String(1))                  # 鐭ヨ瘑搴撳钩鍙�
+    knowledge_type = Column(String(1))                  # 鐭ヨ瘑搴撳钩鍙�
 
 
     def get_id(self):
@@ -33,9 +33,9 @@
         return {
             'id': self.id,
             'name': self.name,
-            'create_time': self.create_date,
-            'update_time': self.update_date,
-            'avatar': self.avatar,
+            'create_time': self.create_date.strftime('%Y-%m-%d %H:%M:%S'),
+            'update_time': self.update_date.strftime('%Y-%m-%d %H:%M:%S'),
+            # 'avatar': self.avatar,
             'user_id': self.tenant_id,
             'description': self.description,
             'status': self.status,
@@ -46,5 +46,9 @@
         return '<Knowledge name:%r url:%r>\n' % (self.name, self.id)
 
 
-class RoleParameter(BaseModel):
-    role: str
\ No newline at end of file
+class klgParameter(BaseModel):
+    id: str
+    name: str
+    description: Optional[str] = ""
+    icon: str
+    klgType: str
\ No newline at end of file
diff --git a/app/models/organization_model.py b/app/models/organization_model.py
index 950ba32..30f670a 100644
--- a/app/models/organization_model.py
+++ b/app/models/organization_model.py
@@ -71,6 +71,28 @@
 
         return json
 
+    def to_dict(self):
+        json = {
+            'deptId': self.id,
+            'createTime': self.created_at,
+            'updateTime': self.updated_at,
+            'deptName': self.name,
+            'address': self.address,
+            'code': self.code,
+            'iconCls': self.iconcls,
+            'orderNum': self.seq,
+            'parentId': self.get_pid(),
+            'parentName': self.get_pName(),
+            'leader': self.leader,
+            'phone': self.phone,
+            'email': self.email,
+            'status': self.status,
+            'roles': [self.role_json(role) for role in self.roles],
+        }
+
+        return json
+
+
     def role_json(self, role):
         return {
             'roleId': role.id,
diff --git a/app/models/token_model.py b/app/models/token_model.py
index febe111..aa37d12 100644
--- a/app/models/token_model.py
+++ b/app/models/token_model.py
@@ -5,9 +5,7 @@
 from sqlalchemy.orm import Session
 
 from Log import logger
-from app.config.const import RAGFLOW
 from app.models.base_model import Base
-from app.service.auth import UserAppDao
 
 
 class TokenModel(Base):
@@ -89,9 +87,4 @@
         db.rollback()  # 鍥炴粴浜嬪姟
 
 
-async def get_token(db: Session, user_id: int):
-    res = {i.app_type.replace("app", "token"): i.access_token for i in await UserAppDao(db).get_user_datas(user_id)}
-    if not res:
-        token = db.query(TokenModel).filter_by(user_id=user_id).first()
-        res = {"ragflow_token": token.ragflow_token, "bisheng_token": token.bisheng_token}
-    return res
+
diff --git a/app/models/user_model.py b/app/models/user_model.py
index a1d61dd..eeaf3e6 100644
--- a/app/models/user_model.py
+++ b/app/models/user_model.py
@@ -102,22 +102,32 @@
             # 'phoneNumber': self.phone_number
         }
 
-        if len(self.organizations) > 0:
-            json['dept'] = [organization.to_json() for organization in self.organizations]
+
+        # json['dept'] = [organization.to_json() for organization in self.organizations]
 
 
         json['groups'] = [group.to_dict() for group in self.groups]
 
-        roles = []
+
         # if len(self.roles) > 0:
-        roles = [role.to_json() for role in self.roles]
-        organization_roles = [role.to_json() for organization in self.organizations for role in
-                              organization.roles]
-        for role in organization_roles:
-            if role not in roles:
-                roles.append(role)
-        json['roles'] = roles
+        roles = {role.id: role.to_dict() for role in self.roles}
+        ogt_set = set()
+        for ogt in self.organizations:
+            if ogt.id in ogt_set:
+                continue
+            ogt_set.add(ogt.id)
+            for role in ogt.roles:
+                roles[role.id] = role.to_dict()
+            parent_ogt = ogt.parent
+            while parent_ogt:
+                if parent_ogt.id not in ogt_set:
+                    ogt_set.add(ogt.id)
+                    for role in ogt.roles:
+                        roles[role.id] = role.to_dict()
+                    parent_ogt = ogt.parent
+        json['roles'] = list(roles.values())
         return json
+
 
     def to_login_json(self):
         json = {
@@ -210,3 +220,9 @@
             "app_type": self.app_type,
             'status': self.status,
         }
+
+    def encrypted_password(self, password):
+        return cipher_suite.encrypt(password.encode("utf-8")).decode("utf-8")
+
+    def decrypted_password(self):
+        return cipher_suite.decrypt(self.password).decode("utf-8")
\ No newline at end of file
diff --git a/app/service/auth.py b/app/service/auth.py
index a0a1952..4353fcd 100644
--- a/app/service/auth.py
+++ b/app/service/auth.py
@@ -10,8 +10,10 @@
 from Log import logger
 from app.config.config import settings
 from app.config.const import RAGFLOW, BISHENG, DIFY
-from app.models import RoleModel, GroupModel
+from app.models import RoleModel, GroupModel, TokenModel
 from app.models.user_model import UserModel, UserAppModel
+# from app.service.ragflow import RagflowService
+# from app.service.service_token import get_new_token
 from app.service.v2.app_register import AppRegisterDao
 
 SECRET_KEY = settings.secret_key
@@ -90,7 +92,7 @@
             db.query(UserModel).filter(UserModel.id == user_id).delete()
             db.commit
         return False
-    return True
+    return user_id
 
 
 async def update_user_token(db, user_id, token_dict):
@@ -189,3 +191,8 @@
 
     async def get_user_datas(self, user_id: int):
         return self.db.query(UserAppModel).filter_by(user_id=user_id).all()
+
+
+
+
+
diff --git a/app/service/bisheng.py b/app/service/bisheng.py
index ff1accc..51db4f8 100644
--- a/app/service/bisheng.py
+++ b/app/service/bisheng.py
@@ -26,7 +26,7 @@
         else:
             return {}
 
-    async def register(self, username: str, password: str):
+    async def register(self, username: str, password: str, token:str=""):
         public_key = await self.get_public_key_api()
         password = BishengCrypto(public_key, settings.PRIVATE_KEY).encrypt(password)
         async with httpx.AsyncClient() as client:
diff --git a/app/service/dialog.py b/app/service/dialog.py
index 623477a..fa678ce 100644
--- a/app/service/dialog.py
+++ b/app/service/dialog.py
@@ -27,8 +27,9 @@
         query = query.filter(DialogModel.name.like('%{}%'.format(keyword)))
 
     if status:
-        print(status)
+        # print(status)
         query = query.filter(DialogModel.status == status)
+    query = query.order_by(DialogModel.update_date.desc())
     total = query.count()
     if page_size:
         query = query.limit(page_size).offset((page_index - 1) * page_size)
@@ -86,3 +87,28 @@
                                                       ConversationModel.dialog_id.__eq__(dialog_id)).order_by(
         ConversationModel.update_time.desc()).all()
     return [i.to_json() for i in session_list]
+
+
+
+async def create_dialog_service(db, dialog_id, dialog_name, description, icon, dialog_type, user_id):
+    try:
+        dialog_model = DialogModel(id=dialog_id,name=dialog_name, description=description,icon=icon, dialog_type=dialog_type, tenant_id=user_id, agent_id=dialog_id)
+        db.add(dialog_model)
+        db.commit()
+        db.refresh(dialog_model)
+    except Exception as e:
+        logger.error(e)
+        db.rollback()
+        return False
+    return True
+
+
+async def update_dialog_status_service(db, dialog_id, status):
+    try:
+        DialogModel(id=dialog_id).update({"status":status})
+        db.commit()
+    except Exception as e:
+        logger.error(e)
+        db.rollback()
+        return False
+    return True
\ No newline at end of file
diff --git a/app/service/difyService.py b/app/service/difyService.py
index 7329640..c51719e 100644
--- a/app/service/difyService.py
+++ b/app/service/difyService.py
@@ -9,6 +9,7 @@
 
 # from Log import logger
 from app.config.config import settings
+# from app.service.service_token import get_admin_token
 from app.utils.rsa_crypto import RagflowCrypto
 
 
@@ -41,9 +42,9 @@
             return data
 
     async def register(self, username: str, password: str, token=None):
-        if not token:
-            token = await get_df_token()
-        email = f"{username}@df.com"
+        # if not token:
+        #     token = await get_admin_token()
+        email = f"{username}@basic.com"
         invite_res = await self.invite_workspaces_member(token, [email], "admin")
         # print(invite_res)
         if invite_res.get("result") != "success" or not invite_res.get("invitation_results"):
@@ -54,7 +55,7 @@
         # print(invite_token)
         if not invite_token:
             return {}
-        await self.login(email, password, True, invite_token)
+        await self.login(username, password, True, invite_token)
         activate_res = await self.activate(email, username, invite_token, "", "")
         activate_res["email"] = email
         activate_res["id"] = invite_token
@@ -68,12 +69,12 @@
                 headers={'Content-Type': 'application/json',"Authorization": f'Bearer {token}'},
                 json={"emails": emails, "language":  "zh-Hans", "role": role}
             )
-            print(response.text)
+            # print(response.text)
             return self._handle_response(response)
 
-    async def login(self, email: str, password: str, remember_me,invite_token:str="") -> str:
+    async def login(self, username: str, password: str, remember_me=True, invite_token:str="") -> str:
         # password = RagflowCrypto(settings.PUBLIC_KEY, settings.PRIVATE_KEY).encrypt(password)
-        data = {"email": email, "password": password, "remember_me": remember_me, "invite_token": invite_token,
+        data = {"email": f"{username}@basic.com", "password": password, "remember_me": remember_me, "invite_token": invite_token,
          "language": "zh-Hans"}
 
         async with httpx.AsyncClient() as client:
@@ -84,7 +85,8 @@
             )
             if response.status_code != 200:
                 raise Exception(f"df login failed: {response.text}")
-            return self._handle_response(response)
+            data = self._handle_response(response)
+            return data.get('access_token')
 
     async def email_check(self, token, email: str):
         async with httpx.AsyncClient() as client:
@@ -98,7 +100,7 @@
         # password = RagflowCrypto(settings.PUBLIC_KEY, settings.PRIVATE_KEY).encrypt(password)
         data = {"email": email, "name": name, "token": token, #  "workspace_id": workspace_id,
          "interface_language": "en-US", "timezone": "Asia/Shanghai"}
-        print(data)
+        # print(data)
         async with httpx.AsyncClient() as client:
             response = await client.post(
                 f"{self.base_url}/console/api/activate",
@@ -111,7 +113,7 @@
 
     async def invite_member_activate(self, token:str, email: str, name: str, password:str) -> str:
         invite_res  =  await self.invite_workspaces_member(token, [email], "admin")
-        print(invite_res)
+        # print(invite_res)
         if invite_res.get("result") != "success" or not invite_res.get("invitation_results"):
             # logger.error(invite_res)
             return {}
@@ -252,10 +254,9 @@
         # b = await a.email_check(
         #     "ebd36739-0272-4b3f-95ab-0c6ac1639831",
         #     "test05@163.com")
-        # b = await a.login(
-        #     "test05@163.com",
-        #     "zhaoqg123456",
-        #     True, "ebd36739-0272-4b3f-95ab-0c6ac1639831")
+        b = await a.login(
+            "zhao1234567",
+            "zhaoqg123456")
 
 
 
@@ -263,11 +264,11 @@
         #     "test05@163.com",
         #     "test05", "ebd36739-0272-4b3f-95ab-0c6ac1639831", "", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiNzg5OWUzOGQtNzczOS00NGNmLTgyODItZmFlMGZhNDJlZDYwIiwiZXhwIjoxNzMzNzI5NjQyLCJpc3MiOiJTRUxGX0hPU1RFRCIsInN1YiI6IkNvbnNvbGUgQVBJIFBhc3Nwb3J0In0.YMvypPnrvvUIfqzcESj820nP46IsFdTpF_YPz8_Exso")
 
-        b = await a.invite_member_activate(
-            "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMDE2NTcxNjAtZTllYi00NzVhLWIzMzYtZjlmZWJlY2I5YjczIiwiZXhwIjoxNzMzNzM0ODE0LCJpc3MiOiJTRUxGX0hPU1RFRCIsInN1YiI6IkNvbnNvbGUgQVBJIFBhc3Nwb3J0In0.khaXX3ndDe_pccEHcyTUcO2sgBCEfXCR74ZniP_b54Y",
-                "zhao1@df.com",
-                 "zhao1Q",
-        "ZHAOQG123456")
+        # b = await a.invite_member_activate(
+        #     "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMDE2NTcxNjAtZTllYi00NzVhLWIzMzYtZjlmZWJlY2I5YjczIiwiZXhwIjoxNzMzNzM0ODE0LCJpc3MiOiJTRUxGX0hPU1RFRCIsInN1YiI6IkNvbnNvbGUgQVBJIFBhc3Nwb3J0In0.khaXX3ndDe_pccEHcyTUcO2sgBCEfXCR74ZniP_b54Y",
+        #         "zhao1@df.com",
+        #          "zhao1Q",
+        # "ZHAOQG123456")
         print(b)
 
     import asyncio
diff --git a/app/service/group.py b/app/service/group.py
index b142c84..0c6eb77 100644
--- a/app/service/group.py
+++ b/app/service/group.py
@@ -69,39 +69,39 @@
 
 
 async def save_user_to_group(db, user_id, group_id, user_list):
-    group_user_list = [u.id for i in
-                 db.query(GroupModel).filter(GroupModel.id.__eq__(group_id)).all() for u in i.users]
-    new_users = set([i for i in user_list if i not in group_user_list])
-    delete_user = [i for i in group_user_list if i not in user_list]
-    print(new_users)
-    if new_users:
-
-        user_dict = {i.id: {"rg_id": i.ragflow_id, "email": i.email} for i in
-                     db.query(UserModel.id, UserModel.email, UserModel.ragflow_id).filter(
-                         UserModel.id.in_(user_list)).all()}
-        print(user_dict)
-        ragflow_service = RagflowService(settings.fwr_base_url)
-        token = await get_ragflow_token(db, user_id)
-
-        try:
-            for old_user in group_user_list:
-                if old_user in delete_user:
-                    continue
-                for new_user in new_users:
-                    await ragflow_service.add_user_tenant(token, user_dict[old_user]["rg_id"], user_dict[new_user]["email"],
-                                                          user_dict[new_user]["rg_id"])
-                    await ragflow_service.add_user_tenant(token, user_dict[new_user]["rg_id"], user_dict[old_user]["email"],
-                                                  user_dict[old_user]["rg_id"])
-            for user1 in new_users:
-                for user2 in new_users:
-                    if user1 != user2:
-                        print(user1, user2)
-                        await ragflow_service.add_user_tenant(token, user_dict[user1]["rg_id"],
-                                                              user_dict[user2]["email"],
-                                                              user_dict[user2]["rg_id"])
-        except Exception as e:
-            logger.error(e)
-            return False
+    # group_user_list = [u.id for i in
+    #              db.query(GroupModel).filter(GroupModel.id.__eq__(group_id)).all() for u in i.users]
+    # new_users = set([i for i in user_list if i not in group_user_list])
+    # delete_user = [i for i in group_user_list if i not in user_list]
+    # print(new_users)
+    # if new_users:
+    #
+    #     user_dict = {i.id: {"rg_id": i.ragflow_id, "email": i.email} for i in
+    #                  db.query(UserModel.id, UserModel.email, UserModel.ragflow_id).filter(
+    #                      UserModel.id.in_(user_list)).all()}
+    #     # print(user_dict)
+    #     ragflow_service = RagflowService(settings.fwr_base_url)
+    #     token = await get_ragflow_token(db, user_id)
+    #
+    #     try:
+    #         for old_user in group_user_list:
+    #             if old_user in delete_user:
+    #                 continue
+    #             for new_user in new_users:
+    #                 await ragflow_service.add_user_tenant(token, user_dict[old_user]["rg_id"], user_dict[new_user]["email"],
+    #                                                       user_dict[new_user]["rg_id"])
+    #                 await ragflow_service.add_user_tenant(token, user_dict[new_user]["rg_id"], user_dict[old_user]["email"],
+    #                                               user_dict[old_user]["rg_id"])
+    #         for user1 in new_users:
+    #             for user2 in new_users:
+    #                 if user1 != user2:
+    #                     print(user1, user2)
+    #                     await ragflow_service.add_user_tenant(token, user_dict[user1]["rg_id"],
+    #                                                           user_dict[user2]["email"],
+    #                                                           user_dict[user2]["rg_id"])
+    #     except Exception as e:
+    #         logger.error(e)
+    #         return False
 
     try:
         group = db.query(GroupModel).filter(GroupModel.id.__eq__(group_id)).first()
diff --git a/app/service/knowledge.py b/app/service/knowledge.py
index b927feb..66634a6 100644
--- a/app/service/knowledge.py
+++ b/app/service/knowledge.py
@@ -19,3 +19,17 @@
     if page_size:
         query = query.limit(page_size).offset((page_index - 1) * page_size)
     return {"total":  total, "rows": [kld.to_json() for kld in query.all()]}
+
+
+async def create_knowledge_service(db, klg_id, name, description, icon, klg_type, user_id):
+    try:
+        dialog_model = KnowledgeModel(id=klg_id,name=name, description=description,icon=icon, knowledge_type=klg_type, tenant_id=user_id)
+        db.add(dialog_model)
+        db.commit()
+        db.refresh(dialog_model)
+    except Exception as e:
+        logger.error(e)
+        db.rollback()
+        return False
+    return True
+
diff --git a/app/service/label.py b/app/service/label.py
index 54448b5..3e52196 100644
--- a/app/service/label.py
+++ b/app/service/label.py
@@ -1,18 +1,19 @@
 import uuid
 
-from streamlit.time_util import adjust_years
-
 from Log import logger
 from app.models.label_model import LabelModel, LabelWorkerModel
 from app.models.role_model import RoleModel
 
 
-async def label_list_service(db, keyword: str, label_type):
+async def label_list_service(db, keyword: str, label_type, object_id):
     query = db.query(LabelModel)
     if keyword:
         query = query.filter(LabelModel.name.like('%{}%'.format(keyword)))
     if label_type:
         query = query.filter(LabelModel.label_type==label_type)
+    if object_id:
+        label_id = [i.label_id for i in db.query(LabelWorkerModel).filter(LabelWorkerModel.object_id==object_id).all()]
+        query = query.filter(LabelModel.id.in_(label_id))
     labels = query.order_by(LabelModel.id.desc()).all()
     return {"total": query.count(), "rows":  [label.to_json() for label in labels]}
 
@@ -61,4 +62,10 @@
             logger.error(e)
             db.rollback()
             # return False
+    for label_id in delete_list:
+        try:
+            LabelWorkerModel(label_id=label_id, object_id=object_id).delete()
+        except Exception as e:
+            logger.error(e)
+            db.rollback()
     return True
\ No newline at end of file
diff --git a/app/service/ragflow.py b/app/service/ragflow.py
index ac24e47..d45806d 100644
--- a/app/service/ragflow.py
+++ b/app/service/ragflow.py
@@ -36,7 +36,7 @@
         else:
             return {}
 
-    async def register(self, username: str, password: str):
+    async def register(self, username: str, password: str, token:str=""):
         password = RagflowCrypto(settings.PUBLIC_KEY, settings.PRIVATE_KEY).encrypt(password)
         async with httpx.AsyncClient() as client:
             response = await client.post(
diff --git a/app/service/service_token.py b/app/service/service_token.py
index 215353b..dd6b1e3 100644
--- a/app/service/service_token.py
+++ b/app/service/service_token.py
@@ -1,10 +1,12 @@
 from Log import logger
 from app.config.config import settings
-from app.config.const import BISHENG, RAGFLOW
-from app.models import UserModel
+from app.config.const import BISHENG, RAGFLOW, DIFY
+from app.models import UserModel, UserAppModel
+from app.models.base_model import SessionLocal
 from app.models.token_model import TokenModel
 from app.service.auth import UserAppDao
 from app.service.bisheng import BishengService
+from app.service.difyService import DifyService
 from app.service.ragflow import RagflowService
 
 
@@ -28,11 +30,19 @@
         return token.access_token
     return token.ragflow_token
 
-async def get_ragflow_new_token(db, user_id: int, app_type):
-    user = db.query(UserModel).filter(UserModel.id == user_id).first()
+async def get_dify_token(db, user_id: int):
+
+    token = await UserAppDao(db).get_data_by_id(user_id, DIFY)
+    if not token:
+        return None
+    return token.access_token
+
+async def get_new_token(db, user_id: int, app_type):
+    # user = db.query(UserModel).filter(UserModel.id == user_id).first()
+    user = db.query(UserAppModel).filter(UserAppModel.user_id == user_id, UserAppModel.app_type==app_type).first()
     if not user:
         return None
-    if app_type == 1:
+    if app_type == RAGFLOW:
         ragflow_service = RagflowService(settings.fwr_base_url)
         # 鐧诲綍鍒皉agflow
         try:
@@ -42,7 +52,7 @@
             logger.error(e)
             # return Response(code=500, msg=f"Failed to login with Ragflow: {str(e)}")
             return None
-    elif  app_type == 2:
+    elif app_type == BISHENG:
         bisheng_service = BishengService(settings.sgb_base_url)
         # 鐧诲綍鍒版瘯鏄�
         try:
@@ -53,6 +63,48 @@
             # return Response(code=500, msg=f"Failed to login with Ragflow: {str(e)}")
             return None
 
+    elif app_type == DIFY:
+        dify_service = DifyService(settings.dify_base_url)
+        # 鐧诲綍鍒版瘯鏄�
+        try:
+            dify_token = await dify_service.login(user.username, user.decrypted_password())
+            return dify_token
+        except Exception as e:
+            logger.error(e)
+            # return Response(code=500, msg=f"Failed to login with Ragflow: {str(e)}")
+            return None
+
     else:
         logger.error("閿欒鐨勫簲鐢ㄧ被鍨媨}".format(app_type))
 
+
+async def get_token(db, user_id: int):
+    res = {i.app_type.replace("app", "token"): i.access_token for i in await UserAppDao(db).get_user_datas(user_id)}
+    if not res:
+        token = db.query(TokenModel).filter_by(user_id=user_id).first()
+        res = {"ragflow_token": token.ragflow_token, "bisheng_token": token.bisheng_token}
+    return res
+
+
+async def update_user_group(db, user_id):
+    admin_user = db.query(UserModel).filter(UserModel.permission == "admin").first()
+    token = await get_new_token(db, admin_user.id, RAGFLOW)
+    # print(token)
+    if not token:
+        logger.error("娉ㄥ唽鐢ㄦ埛鑾峰彇token澶辫触锛�")
+        return False
+    user_list = db.query(UserAppModel).filter(UserAppModel.app_type==RAGFLOW).all()
+    user = db.query(UserAppModel).filter(UserAppModel.user_id==user_id, UserAppModel.app_type == RAGFLOW).first()
+    if not user:
+        logger.error("娉ㄥ唽鐢ㄦ埛鑾峰彇淇℃伅澶辫触锛�")
+        return False
+    ragflow_service = RagflowService(settings.fwr_base_url)
+    for u in user_list:
+        if u.id and user.id != u.id:
+            # print(user.id, u.id)
+            await ragflow_service.add_user_tenant(token,u.app_id,
+                                                      user.email,
+                                                      user.app_id)
+            await ragflow_service.add_user_tenant(token, user.app_id,
+                                                  u.email,
+                                                  u.app_id)
\ No newline at end of file
diff --git a/app/service/user.py b/app/service/user.py
index 21d2869..a86047f 100644
--- a/app/service/user.py
+++ b/app/service/user.py
@@ -2,18 +2,19 @@
 from datetime import datetime
 
 from app.api import pwd_context
+from app.api.dialog import dialog_list
 from app.config.config import settings
 from app.config.const import RAGFLOW, BISHENG, DIFY
-from app.models import RoleModel, GroupModel, AgentType, role_resource_table
+from app.models import RoleModel, GroupModel, AgentType, role_resource_table, DialogModel
 from app.models.menu_model import WebMenuModel, MenuCapacityModel
-from app.models.user_model import UserModel
+from app.models.user_model import UserModel, UserAppModel
 from Log import logger
 from app.service.auth import UserAppDao
 from app.service.bisheng import BishengService
 from app.service.v2.app_register import AppRegisterDao
 from app.service.difyService import DifyService
 from app.service.ragflow import RagflowService
-from app.service.service_token import get_ragflow_token, get_bisheng_token, get_ragflow_new_token
+from app.service.service_token import get_ragflow_token, get_bisheng_token, get_new_token, get_dify_token
 
 
 async def get_user_list(db, page_index: int, page_size: int, keyword: str, role_key: str, user_id):
@@ -21,7 +22,7 @@
     # if role_key != "admin":
     #     query.filter(UserModel.creator==user_id)
     if keyword:
-        query = query.filter(UserModel.group_name.like('%{}%'.format(keyword)))
+        query = query.filter(UserModel.username.like('%{}%'.format(keyword)))
     users = query.order_by(UserModel.id.desc()).limit(page_size).offset(
         (page_index - 1) * page_size).all()
     return {"total": query.count(), "rows": [user.to_json() for user in users]}
@@ -69,19 +70,21 @@
         #     return False
         app_register = AppRegisterDao(db).get_apps()
         register_dict = {}
+        token = ""
         for app in app_register:
             if app["id"] == RAGFLOW:
                 service = RagflowService(settings.fwr_base_url)
             elif app["id"] == BISHENG:
                 service = BishengService(settings.sgb_base_url)
             elif app["id"] == DIFY:
+                token = await get_dify_token()
                 service = DifyService(settings.dify_base_url)
             else:
                 logger.error("鏈煡娉ㄥ唽搴旂敤---")
                 continue
             try:
                 name = app["id"] + str(int(time.time()))
-                register_info = await service.register(name, password)
+                register_info = await service.register(name, password, token)
                 # print(register_info)
                 register_dict[app['id']] = {"id": register_info.get("id"), "name": name,
                                             "email": register_info.get("email")}
@@ -132,13 +135,13 @@
     return True
 
 
-async def edit_user_pwd(db, user_id, current_user_id, new_password="000000"):
+async def edit_user_pwd(db, user_id, current_user_id, new_password="basic123456"):
     try:
         user = db.query(UserModel).filter(UserModel.id == user_id).first()
         pwd = user.decrypted_password()
         for app in AppRegisterDao(db).get_apps():
             if app.get("id") == RAGFLOW:
-                token = await get_ragflow_new_token(db, user_id, 1)
+                token = await get_new_token(db, user_id, app.get("id"))
                 ragflow_service = RagflowService(settings.fwr_base_url)
                 await ragflow_service.set_user_password(token, pwd, new_password)
             elif app.get("id") == BISHENG:
@@ -147,10 +150,8 @@
                 await bisheng_service.change_password_public(token, user.username, pwd, new_password)
             else:
                 logger.error("娉ㄥ唽鏈煡搴旂敤锛歿}".format(app.get("id")))
-        # hashed_password = pwd_context.hash(password)
-        hashed_password = user.encrypted_password(new_password)
-
-        user.password = hashed_password
+        user.hashed_password = pwd_context.hash(new_password)
+        user.password = user.encrypted_password(new_password)
         db.commit()
     except Exception as e:
         logger.error(e)
@@ -176,7 +177,7 @@
             if parent_ogt.id not in dept_set:
                 await role_resource(role_set, roles, permissions, parent_ogt.roles)
                 dept_set.add(parent_ogt.id)
-                parent_ogt = parent_ogt.parent
+            parent_ogt = parent_ogt.parent
     if user.permission == "admin":
         permissions = ["*:*:*"]
 
@@ -222,7 +223,7 @@
             if parent_ogt.id not in dept_set:
                 await role_resource(role_set, permissions, parent_ogt.roles)
                 dept_set.add(parent_ogt.id)
-                parent_ogt = parent_ogt.parent
+            parent_ogt = parent_ogt.parent
     tmp_dit = {}
     for permission in permissions.values():
         tmp_dit[permission["parentId"]] = tmp_dit.get(permission["parentId"], []) + [permission]
@@ -247,8 +248,9 @@
         for agent in group.agents:
             agent_list.append(agent.id)
     menu_list = db.query(WebMenuModel.id, WebMenuModel.title, WebMenuModel.describe, WebMenuModel.icon, WebMenuModel.desc,
-                         WebMenuModel.img, MenuCapacityModel.capacity_id, MenuCapacityModel.capacity_type).outerjoin(
-        MenuCapacityModel, WebMenuModel.id == MenuCapacityModel.menu_id).all()
+                         WebMenuModel.img, MenuCapacityModel.capacity_id, MenuCapacityModel.capacity_type, DialogModel.agent_id.label("agentId")).outerjoin(
+        MenuCapacityModel, WebMenuModel.id == MenuCapacityModel.menu_id).outerjoin(
+        DialogModel, MenuCapacityModel.capacity_id == DialogModel.id).filter(DialogModel.status=="1").all()
 
     for menu in menu_list:
         menu_dict[menu.id] = menu_dict.get(menu.id, []) + [menu]
@@ -269,6 +271,70 @@
             'icon': menus[0].icon,
             'img': menus[0].img,
             'desc': menus[0].desc,
-            'dialog': menus[0].describe
+            'dialog': menus[0].describe,
+            'agentId': menus[0].agentId
         })
     return res
+
+
+async def get_user_permission(db,  user_id):
+    res = {}
+    permissions = {}
+    role_set = set()
+    dept_set = set()
+    agent_dict = {}
+    knowledge_dict = {}
+    user = db.query(UserModel).filter_by(id=user_id).first()
+    parent_id = ""
+    print(111111111111111)
+    async def role_resource(role_set, permissions, roles):
+        nonlocal parent_id
+        for role in roles:
+            if role.id not in role_set:
+                role_set.add(role.id)
+
+                for r in role.resources:
+                    if r.resource_type_id != "1":
+                        if not r.resource_id:
+                            parent_id = r.id
+                            continue
+                        permissions[r.id] = r.to_router_dict()
+
+    await role_resource(role_set, permissions, user.roles)
+    for ogt in user.organizations:
+        if ogt.roles:
+            await role_resource(role_set, permissions, user.roles)
+        parent_ogt = ogt.parent
+        while parent_ogt:
+
+            if parent_ogt.id not in dept_set:
+                await role_resource(role_set, permissions, parent_ogt.roles)
+                dept_set.add(parent_ogt.id)
+
+            parent_ogt = parent_ogt.parent
+
+    tmp_dit = {}
+    for permission in permissions.values():
+        tmp_dit[permission["parentId"]] = tmp_dit.get(permission["parentId"], []) + [permission]
+
+    def get_child(parent_id):
+        res = permissions[parent_id]
+        res["children"] = [get_child(i["id"]) for i in tmp_dit.get(parent_id, [])]
+        return res
+
+    res["menus"] = [get_child(i["id"]) for i in tmp_dit.get(parent_id, [])]
+    for group in user.groups:
+        for klg in group.knowledges:
+            knowledge_dict[klg.id] = klg.to_json()
+        for dialog in group.dialogs:
+            agent_dict[dialog.id] = dialog.to_json()
+    res["knowledge"] = list(knowledge_dict.values())
+    res["dialog"] = list(agent_dict.values())
+    return res
+
+
+async def get_user_dept(db, user_id):
+    res = {}
+    user = db.query(UserModel).filter_by(id=user_id).first()
+    res["rows"] = [i.to_dict() for i in user.organizations]
+    return res
\ No newline at end of file

--
Gitblit v1.8.0