From 917e9a517ad486eb9a7b42468274b5dd89c39e94 Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Fri, 5 Dec 2025 11:05:27 +0800 Subject: [PATCH] =?UTF-8?q?=E9=83=A8=E5=88=86dto=E3=80=81vo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../postgres/sql/createTableCrontab.sql | 89 +++++++++++ ...merService.sql => createTableWorkcase.sql} | 106 ++++++------ .../java/org/xyzh/api/agent/AgentService.java | 9 ++ .../xyzh/api/agent/dto/KnowledgeBaseDTO.java | 51 ++++++ .../xyzh/api/agent/dto/KnowledgeChunkDTO.java | 48 ++++++ .../api/agent/dto/KnowledgeDocumentDTO.java | 67 ++++++++ .../xyzh/api/agent/vo/KnowledgeBaseVO.java | 93 +++++++++++ .../xyzh/api/agent/vo/KnowledgeChunkVO.java | 68 ++++++++ .../api/agent/vo/KnowledgeDocumentVO.java | 114 +++++++++++++ .../src/main/java/org/xyzh/Main.java | 7 - .../org/xyzh/api/bidding/BiddingService.java | 5 + .../xyzh/api/bidding/dto/BidResponseDTO.java | 56 +++++++ .../api/bidding/dto/BiddingDocumentDTO.java | 47 ++++++ .../api/bidding/dto/BiddingProjectDTO.java | 93 +++++++++++ .../bidding/dto/BiddingRequirementDTO.java | 67 ++++++++ .../xyzh/api/bidding/dto/ProcessNodeDTO.java | 66 ++++++++ .../xyzh/api/bidding/vo/BidResponseVO.java | 97 +++++++++++ .../api/bidding/vo/BiddingDocumentVO.java | 90 +++++++++++ .../xyzh/api/bidding/vo/BiddingProjectVO.java | 135 ++++++++++++++++ .../api/bidding/vo/BiddingRequirementVO.java | 102 ++++++++++++ .../xyzh/api/bidding/vo/ProcessNodeVO.java | 102 ++++++++++++ .../xyzh/api/bidding/vo/ProjectListVO.java | 70 ++++++++ .../api/bidding/vo/ProjectStatisticsVO.java | 67 ++++++++ .../src/main/java/org/xyzh/Main.java | 7 - .../org/xyzh/api/crontab/CrontabService.java | 9 ++ .../xyzh/api/crontab/dto/TbCrontabLogDTO.java | 57 +++++++ .../api/crontab/dto/TbCrontabTaskDTO.java | 56 +++++++ .../api/crontab/dto/TbCrontabTaskMetaDTO.java | 47 ++++++ .../org/xyzh/api/crontab/vo/CrontabLogVO.java | 72 +++++++++ .../api/crontab/vo/CrontabTaskListVO.java | 54 +++++++ .../api/crontab/vo/CrontabTaskMetaVO.java | 56 +++++++ .../xyzh/api/crontab/vo/CrontabTaskVO.java | 87 ++++++++++ .../org/xyzh/api/message/MessageService.java | 9 ++ .../api/message/vo/MessageReceiverVO.java | 63 ++++++++ .../xyzh/api/workcase/WorkcaseService.java | 9 ++ .../api/workcase/dto/TbConversationDTO.java | 71 ++++++++ .../xyzh/api/workcase/dto/TbCustomerDTO.java | 91 +++++++++++ .../xyzh/api/workcase/dto/TbTicketDTO.java | 103 ++++++++++++ .../xyzh/api/workcase/vo/ConversationVO.java | 108 +++++++++++++ .../org/xyzh/api/workcase/vo/CustomerVO.java | 112 +++++++++++++ .../xyzh/api/workcase/vo/TicketListVO.java | 59 +++++++ .../org/xyzh/api/workcase/vo/TicketVO.java | 151 ++++++++++++++++++ 42 files changed, 2803 insertions(+), 67 deletions(-) create mode 100644 urbanLifelineServ/.bin/database/postgres/sql/createTableCrontab.sql rename urbanLifelineServ/.bin/database/postgres/sql/{createTableCustomerService.sql => createTableWorkcase.sql} (78%) create mode 100644 urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/AgentService.java create mode 100644 urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/dto/KnowledgeBaseDTO.java create mode 100644 urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/dto/KnowledgeChunkDTO.java create mode 100644 urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/dto/KnowledgeDocumentDTO.java create mode 100644 urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/vo/KnowledgeBaseVO.java create mode 100644 urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/vo/KnowledgeChunkVO.java create mode 100644 urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/vo/KnowledgeDocumentVO.java delete mode 100644 urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/Main.java create mode 100644 urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/BiddingService.java create mode 100644 urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/BidResponseDTO.java create mode 100644 urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/BiddingDocumentDTO.java create mode 100644 urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/BiddingProjectDTO.java create mode 100644 urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/BiddingRequirementDTO.java create mode 100644 urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/ProcessNodeDTO.java create mode 100644 urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/BidResponseVO.java create mode 100644 urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/BiddingDocumentVO.java create mode 100644 urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/BiddingProjectVO.java create mode 100644 urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/BiddingRequirementVO.java create mode 100644 urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/ProcessNodeVO.java create mode 100644 urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/ProjectListVO.java create mode 100644 urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/ProjectStatisticsVO.java delete mode 100644 urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/Main.java create mode 100644 urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/CrontabService.java create mode 100644 urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/dto/TbCrontabLogDTO.java create mode 100644 urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/dto/TbCrontabTaskDTO.java create mode 100644 urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/dto/TbCrontabTaskMetaDTO.java create mode 100644 urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/vo/CrontabLogVO.java create mode 100644 urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/vo/CrontabTaskListVO.java create mode 100644 urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/vo/CrontabTaskMetaVO.java create mode 100644 urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/vo/CrontabTaskVO.java create mode 100644 urbanLifelineServ/apis/api-message/src/main/java/org/xyzh/api/message/MessageService.java create mode 100644 urbanLifelineServ/apis/api-message/src/main/java/org/xyzh/api/message/vo/MessageReceiverVO.java create mode 100644 urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/WorkcaseService.java create mode 100644 urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/dto/TbConversationDTO.java create mode 100644 urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/dto/TbCustomerDTO.java create mode 100644 urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/dto/TbTicketDTO.java create mode 100644 urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/ConversationVO.java create mode 100644 urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/CustomerVO.java create mode 100644 urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/TicketListVO.java create mode 100644 urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/TicketVO.java diff --git a/urbanLifelineServ/.bin/database/postgres/sql/createTableCrontab.sql b/urbanLifelineServ/.bin/database/postgres/sql/createTableCrontab.sql new file mode 100644 index 0000000..efd4b65 --- /dev/null +++ b/urbanLifelineServ/.bin/database/postgres/sql/createTableCrontab.sql @@ -0,0 +1,89 @@ +-- ==================================================== +-- 定时任务表 +-- ==================================================== +DROP TABLE IF EXISTS `tb_crontab_task`; +CREATE TABLE `tb_crontab_task` ( + `id` VARCHAR(64) NOT NULL COMMENT '主键ID', + `task_id` VARCHAR(64) NOT NULL COMMENT '任务ID', + `task_name` VARCHAR(100) NOT NULL COMMENT '任务名称', + `task_group` VARCHAR(50) NOT NULL DEFAULT 'DEFAULT' COMMENT '任务分组', + `meta_id` VARCHAR(64) NOT NULL COMMENT '任务元数据ID', + `default_recipient` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否使用默认接收人(0:否 1:是)', + `bean_name` VARCHAR(100) NOT NULL COMMENT 'Bean名称', + `method_name` VARCHAR(100) NOT NULL COMMENT '方法名称', + `method_params` VARCHAR(500) DEFAULT NULL COMMENT '方法参数', + `cron_expression` VARCHAR(100) NOT NULL COMMENT 'Cron表达式', + `status` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '任务状态(0:暂停 1:运行中)', + `description` VARCHAR(500) DEFAULT NULL COMMENT '任务描述', + `concurrent` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否允许并发执行(0:否 1:是)', + `misfire_policy` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '错过执行策略(1:立即执行 2:执行一次 3:放弃执行)', + `creator` VARCHAR(64) DEFAULT NULL COMMENT '创建者', + `updater` VARCHAR(64) DEFAULT NULL COMMENT '更新者', + `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `delete_time` DATETIME DEFAULT NULL COMMENT '删除时间', + `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除(0:否 1:是)', + PRIMARY KEY (`id`), + KEY `idx_task_name` (`task_name`), + KEY `idx_bean_name` (`bean_name`), + KEY `idx_status` (`status`), + KEY `idx_deleted` (`deleted`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='定时任务配置表'; + +-- ==================================================== +-- 定时任务执行日志表 +-- ==================================================== +DROP TABLE IF EXISTS `tb_crontab_log`; +CREATE TABLE `tb_crontab_log` ( + `id` VARCHAR(64) NOT NULL COMMENT '主键ID', + `task_id` VARCHAR(64) NOT NULL COMMENT '任务ID', + `task_name` VARCHAR(100) NOT NULL COMMENT '任务名称', + `task_group` VARCHAR(50) NOT NULL DEFAULT 'DEFAULT' COMMENT '任务分组', + `bean_name` VARCHAR(100) NOT NULL COMMENT 'Bean名称', + `method_name` VARCHAR(100) NOT NULL COMMENT '方法名称', + `method_params` VARCHAR(500) DEFAULT NULL COMMENT '方法参数', + `execute_status` TINYINT(1) NOT NULL COMMENT '执行状态(0:失败 1:成功)', + `execute_message` TEXT DEFAULT NULL COMMENT '执行结果信息', + `exception_info` TEXT DEFAULT NULL COMMENT '异常信息', + `start_time` DATETIME NOT NULL COMMENT '开始时间', + `end_time` DATETIME DEFAULT NULL COMMENT '结束时间', + `execute_duration` INT DEFAULT NULL COMMENT '执行时长(毫秒)', + `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `delete_time` DATETIME DEFAULT NULL COMMENT '删除时间', + `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除(0:否 1:是)', + PRIMARY KEY (`id`), + KEY `idx_task_id` (`task_id`), + KEY `idx_task_name` (`task_name`), + KEY `idx_execute_status` (`execute_status`), + KEY `idx_start_time` (`start_time`), + KEY `idx_deleted` (`deleted`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='定时任务执行日志表'; + +-- ==================================================== +-- 定时任务元数据表(存储爬虫任务的元数据配置) +-- ==================================================== +DROP TABLE IF EXISTS `tb_crontab_task_meta`; +CREATE TABLE `tb_crontab_task_meta` ( + `id` VARCHAR(64) NOT NULL COMMENT '主键ID', + `meta_id` VARCHAR(64) NOT NULL COMMENT '元数据ID', + `name` VARCHAR(100) NOT NULL COMMENT '任务名称', + `description` VARCHAR(500) DEFAULT NULL COMMENT '任务描述', + `category` VARCHAR(50) NOT NULL COMMENT '任务分类(如:人民日报新闻爬取)', + `bean_name` VARCHAR(100) NOT NULL COMMENT 'Bean名称(执行器类名)', + `method_name` VARCHAR(100) NOT NULL COMMENT '执行方法名', + `script_path` VARCHAR(255) DEFAULT NULL COMMENT 'Python脚本路径(相对于basePath)', + `param_schema` TEXT DEFAULT NULL COMMENT '参数模板(JSON格式,定义参数名、类型、描述、默认值等)', + `auto_publish` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否自动发布', + `sort_order` INT DEFAULT 0 COMMENT '排序号', + `creator` VARCHAR(64) DEFAULT NULL COMMENT '创建者', + `updater` VARCHAR(64) DEFAULT NULL COMMENT '更新者', + `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `delete_time` DATETIME DEFAULT NULL COMMENT '删除时间', + `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除(0:否 1:是)', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_meta_id` (`meta_id`), + KEY `idx_category` (`category`), + KEY `idx_deleted` (`deleted`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='定时任务元数据表'; \ No newline at end of file diff --git a/urbanLifelineServ/.bin/database/postgres/sql/createTableCustomerService.sql b/urbanLifelineServ/.bin/database/postgres/sql/createTableWorkcase.sql similarity index 78% rename from urbanLifelineServ/.bin/database/postgres/sql/createTableCustomerService.sql rename to urbanLifelineServ/.bin/database/postgres/sql/createTableWorkcase.sql index ce8d082..97d43fc 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/createTableCustomerService.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/createTableWorkcase.sql @@ -1,12 +1,12 @@ -- ============================= --- 智能客服系统业务模块 +-- 智能客服系统业务模块(工单系统) -- 支持:微信小程序客户咨询、智能问答、工单管理、CRM集成 -- ============================= -CREATE SCHEMA IF NOT EXISTS customer_service; +CREATE SCHEMA IF NOT EXISTS workcase; -- 客户信息表 -DROP TABLE IF EXISTS customer_service.tb_customer CASCADE; -CREATE TABLE customer_service.tb_customer ( +DROP TABLE IF EXISTS workcase.tb_customer CASCADE; +CREATE TABLE workcase.tb_customer ( optsn VARCHAR(50) NOT NULL, -- 流水号 customer_id VARCHAR(50) NOT NULL, -- 客户ID customer_no VARCHAR(100), -- 客户编号 @@ -45,16 +45,16 @@ CREATE TABLE customer_service.tb_customer ( UNIQUE (email) ); -CREATE INDEX idx_customer_type ON customer_service.tb_customer(customer_type) WHERE deleted = false; -CREATE INDEX idx_customer_level ON customer_service.tb_customer(customer_level) WHERE deleted = false; -CREATE INDEX idx_customer_wechat ON customer_service.tb_customer(wechat_openid) WHERE deleted = false; +CREATE INDEX idx_customer_type ON workcase.tb_customer(customer_type) WHERE deleted = false; +CREATE INDEX idx_customer_level ON workcase.tb_customer(customer_level) WHERE deleted = false; +CREATE INDEX idx_customer_wechat ON workcase.tb_customer(wechat_openid) WHERE deleted = false; -COMMENT ON TABLE customer_service.tb_customer IS '客户信息表'; -COMMENT ON COLUMN customer_service.tb_customer.customer_level IS '客户等级:vip/important/normal/potential'; +COMMENT ON TABLE workcase.tb_customer IS '客户信息表'; +COMMENT ON COLUMN workcase.tb_customer.customer_level IS '客户等级:vip/important/normal/potential'; -- 会话表 -DROP TABLE IF EXISTS customer_service.tb_conversation CASCADE; -CREATE TABLE customer_service.tb_conversation ( +DROP TABLE IF EXISTS workcase.tb_conversation CASCADE; +CREATE TABLE workcase.tb_conversation ( optsn VARCHAR(50) NOT NULL, -- 流水号 conversation_id VARCHAR(50) NOT NULL, -- 会话ID customer_id VARCHAR(50) NOT NULL, -- 客户ID @@ -81,19 +81,19 @@ CREATE TABLE customer_service.tb_conversation ( deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (conversation_id), UNIQUE (optsn), - FOREIGN KEY (customer_id) REFERENCES customer_service.tb_customer(customer_id) + FOREIGN KEY (customer_id) REFERENCES workcase.tb_customer(customer_id) ); -CREATE INDEX idx_conv_customer ON customer_service.tb_conversation(customer_id, session_start_time DESC) WHERE deleted = false; -CREATE INDEX idx_conv_status ON customer_service.tb_conversation(conversation_status) WHERE deleted = false; -CREATE INDEX idx_conv_agent ON customer_service.tb_conversation(agent_id) WHERE deleted = false; +CREATE INDEX idx_conv_customer ON workcase.tb_conversation(customer_id, session_start_time DESC) WHERE deleted = false; +CREATE INDEX idx_conv_status ON workcase.tb_conversation(conversation_status) WHERE deleted = false; +CREATE INDEX idx_conv_agent ON workcase.tb_conversation(agent_id) WHERE deleted = false; -COMMENT ON TABLE customer_service.tb_conversation IS '会话表'; -COMMENT ON COLUMN customer_service.tb_conversation.conversation_type IS '会话类型:ai/human/transfer'; +COMMENT ON TABLE workcase.tb_conversation IS '会话表'; +COMMENT ON COLUMN workcase.tb_conversation.conversation_type IS '会话类型:ai/human/transfer'; -- 会话消息表 -DROP TABLE IF EXISTS customer_service.tb_conversation_message CASCADE; -CREATE TABLE customer_service.tb_conversation_message ( +DROP TABLE IF EXISTS workcase.tb_conversation_message CASCADE; +CREATE TABLE workcase.tb_conversation_message ( optsn VARCHAR(50) NOT NULL, -- 流水号 message_id VARCHAR(50) NOT NULL, -- 消息ID conversation_id VARCHAR(50) NOT NULL, -- 所属会话ID @@ -117,18 +117,18 @@ CREATE TABLE customer_service.tb_conversation_message ( deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (message_id), UNIQUE (optsn), - FOREIGN KEY (conversation_id) REFERENCES customer_service.tb_conversation(conversation_id) + FOREIGN KEY (conversation_id) REFERENCES workcase.tb_conversation(conversation_id) ); -CREATE INDEX idx_msg_conversation ON customer_service.tb_conversation_message(conversation_id, create_time) WHERE deleted = false; -CREATE INDEX idx_msg_sender ON customer_service.tb_conversation_message(sender_id) WHERE deleted = false; +CREATE INDEX idx_msg_conversation ON workcase.tb_conversation_message(conversation_id, create_time) WHERE deleted = false; +CREATE INDEX idx_msg_sender ON workcase.tb_conversation_message(sender_id) WHERE deleted = false; -COMMENT ON TABLE customer_service.tb_conversation_message IS '会话消息表'; -COMMENT ON COLUMN customer_service.tb_conversation_message.sentiment IS '情感分析:positive/neutral/negative'; +COMMENT ON TABLE workcase.tb_conversation_message IS '会话消息表'; +COMMENT ON COLUMN workcase.tb_conversation_message.sentiment IS '情感分析:positive/neutral/negative'; -- 工单表 -DROP TABLE IF EXISTS customer_service.tb_ticket CASCADE; -CREATE TABLE customer_service.tb_ticket ( +DROP TABLE IF EXISTS workcase.tb_ticket CASCADE; +CREATE TABLE workcase.tb_ticket ( optsn VARCHAR(50) NOT NULL, -- 流水号 ticket_id VARCHAR(50) NOT NULL, -- 工单ID ticket_no VARCHAR(100) NOT NULL, -- 工单编号 @@ -166,21 +166,21 @@ CREATE TABLE customer_service.tb_ticket ( PRIMARY KEY (ticket_id), UNIQUE (optsn), UNIQUE (ticket_no), - FOREIGN KEY (customer_id) REFERENCES customer_service.tb_customer(customer_id) + FOREIGN KEY (customer_id) REFERENCES workcase.tb_customer(customer_id) ); -CREATE INDEX idx_ticket_customer ON customer_service.tb_ticket(customer_id) WHERE deleted = false; -CREATE INDEX idx_ticket_status ON customer_service.tb_ticket(ticket_status) WHERE deleted = false; -CREATE INDEX idx_ticket_assigned ON customer_service.tb_ticket(assigned_to) WHERE deleted = false; -CREATE INDEX idx_ticket_priority ON customer_service.tb_ticket(priority) WHERE deleted = false; -CREATE INDEX idx_ticket_sla ON customer_service.tb_ticket(sla_deadline) WHERE deleted = false AND is_overdue = false; +CREATE INDEX idx_ticket_customer ON workcase.tb_ticket(customer_id) WHERE deleted = false; +CREATE INDEX idx_ticket_status ON workcase.tb_ticket(ticket_status) WHERE deleted = false; +CREATE INDEX idx_ticket_assigned ON workcase.tb_ticket(assigned_to) WHERE deleted = false; +CREATE INDEX idx_ticket_priority ON workcase.tb_ticket(priority) WHERE deleted = false; +CREATE INDEX idx_ticket_sla ON workcase.tb_ticket(sla_deadline) WHERE deleted = false AND is_overdue = false; -COMMENT ON TABLE customer_service.tb_ticket IS '工单表'; -COMMENT ON COLUMN customer_service.tb_ticket.ticket_type IS '工单类型:consultation/complaint/suggestion/repair/installation/other'; +COMMENT ON TABLE workcase.tb_ticket IS '工单表'; +COMMENT ON COLUMN workcase.tb_ticket.ticket_type IS '工单类型:consultation/complaint/suggestion/repair/installation/other'; -- 工单处理记录表 -DROP TABLE IF EXISTS customer_service.tb_ticket_log CASCADE; -CREATE TABLE customer_service.tb_ticket_log ( +DROP TABLE IF EXISTS workcase.tb_ticket_log CASCADE; +CREATE TABLE workcase.tb_ticket_log ( optsn VARCHAR(50) NOT NULL, -- 流水号 log_id VARCHAR(50) NOT NULL, -- 日志ID ticket_id VARCHAR(50) NOT NULL, -- 工单ID @@ -195,16 +195,16 @@ CREATE TABLE customer_service.tb_ticket_log ( create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 PRIMARY KEY (log_id), UNIQUE (optsn), - FOREIGN KEY (ticket_id) REFERENCES customer_service.tb_ticket(ticket_id) + FOREIGN KEY (ticket_id) REFERENCES workcase.tb_ticket(ticket_id) ); -CREATE INDEX idx_ticket_log_ticket ON customer_service.tb_ticket_log(ticket_id, create_time DESC); +CREATE INDEX idx_ticket_log_ticket ON workcase.tb_ticket_log(ticket_id, create_time DESC); -COMMENT ON TABLE customer_service.tb_ticket_log IS '工单处理记录表'; +COMMENT ON TABLE workcase.tb_ticket_log IS '工单处理记录表'; -- FAQ表(常见问题) -DROP TABLE IF EXISTS customer_service.tb_faq CASCADE; -CREATE TABLE customer_service.tb_faq ( +DROP TABLE IF EXISTS workcase.tb_faq CASCADE; +CREATE TABLE workcase.tb_faq ( optsn VARCHAR(50) NOT NULL, -- 流水号 faq_id VARCHAR(50) NOT NULL, -- FAQ ID knowledge_id VARCHAR(50), -- 关联知识库ID @@ -229,14 +229,14 @@ CREATE TABLE customer_service.tb_faq ( UNIQUE (optsn) ); -CREATE INDEX idx_faq_category ON customer_service.tb_faq(category) WHERE deleted = false; -CREATE INDEX idx_faq_published ON customer_service.tb_faq(is_published) WHERE deleted = false AND is_published = true; +CREATE INDEX idx_faq_category ON workcase.tb_faq(category) WHERE deleted = false; +CREATE INDEX idx_faq_published ON workcase.tb_faq(is_published) WHERE deleted = false AND is_published = true; -COMMENT ON TABLE customer_service.tb_faq IS 'FAQ常见问题表'; +COMMENT ON TABLE workcase.tb_faq IS 'FAQ常见问题表'; -- 客服评价表 -DROP TABLE IF EXISTS customer_service.tb_service_evaluation CASCADE; -CREATE TABLE customer_service.tb_service_evaluation ( +DROP TABLE IF EXISTS workcase.tb_service_evaluation CASCADE; +CREATE TABLE workcase.tb_service_evaluation ( optsn VARCHAR(50) NOT NULL, -- 流水号 evaluation_id VARCHAR(50) NOT NULL, -- 评价ID customer_id VARCHAR(50) NOT NULL, -- 客户ID @@ -253,17 +253,17 @@ CREATE TABLE customer_service.tb_service_evaluation ( deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (evaluation_id), UNIQUE (optsn), - FOREIGN KEY (customer_id) REFERENCES customer_service.tb_customer(customer_id) + FOREIGN KEY (customer_id) REFERENCES workcase.tb_customer(customer_id) ); -CREATE INDEX idx_eval_customer ON customer_service.tb_service_evaluation(customer_id) WHERE deleted = false; -CREATE INDEX idx_eval_rating ON customer_service.tb_service_evaluation(rating) WHERE deleted = false; +CREATE INDEX idx_eval_customer ON workcase.tb_service_evaluation(customer_id) WHERE deleted = false; +CREATE INDEX idx_eval_rating ON workcase.tb_service_evaluation(rating) WHERE deleted = false; -COMMENT ON TABLE customer_service.tb_service_evaluation IS '客服评价表'; +COMMENT ON TABLE workcase.tb_service_evaluation IS '客服评价表'; -- CRM集成配置表 -DROP TABLE IF EXISTS customer_service.tb_crm_config CASCADE; -CREATE TABLE customer_service.tb_crm_config ( +DROP TABLE IF EXISTS workcase.tb_crm_config CASCADE; +CREATE TABLE workcase.tb_crm_config ( optsn VARCHAR(50) NOT NULL, -- 流水号 config_id VARCHAR(50) NOT NULL, -- 配置ID crm_system VARCHAR(50) NOT NULL, -- CRM系统名称 @@ -286,4 +286,4 @@ CREATE TABLE customer_service.tb_crm_config ( UNIQUE (optsn) ); -COMMENT ON TABLE customer_service.tb_crm_config IS 'CRM集成配置表'; +COMMENT ON TABLE workcase.tb_crm_config IS 'CRM集成配置表'; diff --git a/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/AgentService.java b/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/AgentService.java new file mode 100644 index 0000000..85aa395 --- /dev/null +++ b/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/AgentService.java @@ -0,0 +1,9 @@ +package org.xyzh.api.agent; + +/** + * Agent服务接口 + * 用于知识库和文档管理 + */ +public interface AgentService { + +} diff --git a/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/dto/KnowledgeBaseDTO.java b/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/dto/KnowledgeBaseDTO.java new file mode 100644 index 0000000..2d08a76 --- /dev/null +++ b/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/dto/KnowledgeBaseDTO.java @@ -0,0 +1,51 @@ +package org.xyzh.api.agent.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.dto.BaseDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.databind.JsonNode; + +/** + * 知识库DTO + * 用于创建和更新知识库 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "知识库DTO") +public class KnowledgeBaseDTO extends BaseDTO { + private static final long serialVersionUID = 1L; + + @Schema(description = "知识库ID(更新时需要)") + private String knowledgeId; + + @Schema(description = "智能体ID") + private String agentId; + + @Schema(description = "知识库名称") + private String name; + + @Schema(description = "知识库类型:bidding-招投标/customer_service-客服/internal-内部协同") + private String kbType; + + @Schema(description = "访问级别:public-公开/private-私有/internal-内部") + private String accessLevel; + + @Schema(description = "知识库描述") + private String description; + + @Schema(description = "存储路径") + private String storagePath; + + @Schema(description = "当前版本号") + private String version; + + @Schema(description = "知识库配置") + private JsonNode config; + + @Schema(description = "服务类型") + private String serviceType; + + @Schema(description = "状态:active-激活/inactive-停用/archived-归档") + private String status; +} diff --git a/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/dto/KnowledgeChunkDTO.java b/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/dto/KnowledgeChunkDTO.java new file mode 100644 index 0000000..1d3bb4d --- /dev/null +++ b/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/dto/KnowledgeChunkDTO.java @@ -0,0 +1,48 @@ +package org.xyzh.api.agent.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.dto.BaseDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.databind.JsonNode; + +/** + * 知识文档片段DTO + * 用于创建和更新知识文档片段 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "知识文档片段DTO") +public class KnowledgeChunkDTO extends BaseDTO { + private static final long serialVersionUID = 1L; + + @Schema(description = "片段ID(更新时需要)") + private String chunkId; + + @Schema(description = "所属文档ID") + private String docId; + + @Schema(description = "所属知识库ID") + private String knowledgeId; + + @Schema(description = "片段索引") + private Integer chunkIndex; + + @Schema(description = "片段内容") + private String content; + + @Schema(description = "片段类型:text-文本/table-表格/image-图片") + private String chunkType; + + @Schema(description = "根chunk ID") + private String rootChunkId; + + @Schema(description = "是否当前版本", defaultValue = "true") + private Boolean isCurrent; + + @Schema(description = "位置信息") + private JsonNode positionInfo; + + @Schema(description = "片段元数据") + private JsonNode metadata; +} diff --git a/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/dto/KnowledgeDocumentDTO.java b/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/dto/KnowledgeDocumentDTO.java new file mode 100644 index 0000000..86f7ed7 --- /dev/null +++ b/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/dto/KnowledgeDocumentDTO.java @@ -0,0 +1,67 @@ +package org.xyzh.api.agent.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.dto.BaseDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.databind.JsonNode; +import java.util.List; + +/** + * 知识文档DTO + * 用于创建和更新知识文档 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "知识文档DTO") +public class KnowledgeDocumentDTO extends BaseDTO { + private static final long serialVersionUID = 1L; + + @Schema(description = "文档ID(更新时需要)") + private String docId; + + @Schema(description = "所属知识库ID") + private String knowledgeId; + + @Schema(description = "文档标题") + private String title; + + @Schema(description = "文档类型:text-文本/pdf/word/excel/image/video") + private String docType; + + @Schema(description = "文档分类") + private String category; + + @Schema(description = "文档内容(文本类型)") + private String content; + + @Schema(description = "关联文件ID") + private String fileId; + + @Schema(description = "文件路径") + private String filePath; + + @Schema(description = "文件大小") + private Long fileSize; + + @Schema(description = "MIME类型") + private String mimeType; + + @Schema(description = "根文档ID") + private String rootDocId; + + @Schema(description = "文档标签") + private List tags; + + @Schema(description = "来源URL") + private String sourceUrl; + + @Schema(description = "服务类型") + private String serviceType; + + @Schema(description = "文档元数据") + private JsonNode metadata; + + @Schema(description = "状态:active-激活/inactive-停用/archived-归档") + private String status; +} diff --git a/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/vo/KnowledgeBaseVO.java b/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/vo/KnowledgeBaseVO.java new file mode 100644 index 0000000..1933171 --- /dev/null +++ b/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/vo/KnowledgeBaseVO.java @@ -0,0 +1,93 @@ +package org.xyzh.api.agent.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import com.fasterxml.jackson.databind.JsonNode; +import java.util.Date; + +/** + * 知识库VO + * 用于前端展示知识库信息 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "知识库VO") +public class KnowledgeBaseVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "知识库ID") + private String knowledgeId; + + @Schema(description = "智能体ID") + private String agentId; + + @Schema(description = "智能体名称") + private String agentName; + + @Schema(description = "知识库名称") + private String name; + + @Schema(description = "知识库类型") + private String kbType; + + @Schema(description = "知识库类型名称") + private String kbTypeName; + + @Schema(description = "访问级别") + private String accessLevel; + + @Schema(description = "访问级别名称") + private String accessLevelName; + + @Schema(description = "知识库描述") + private String description; + + @Schema(description = "存储路径") + private String storagePath; + + @Schema(description = "当前版本号") + private String version; + + @Schema(description = "知识库配置") + private JsonNode config; + + @Schema(description = "服务类型") + private String serviceType; + + @Schema(description = "部门名称") + private String deptName; + + @Schema(description = "状态") + private String status; + + @Schema(description = "状态名称") + private String statusName; + + @Schema(description = "状态颜色") + private String statusColor; + + @Schema(description = "文档总数") + private Long documentCount; + + @Schema(description = "已向量化文档数") + private Long embeddedDocCount; + + @Schema(description = "chunk总数") + private Long chunkCount; + + @Schema(description = "总存储大小(字节)") + private Long totalSize; + + @Schema(description = "总存储大小格式化显示") + private String totalSizeFormatted; + + @Schema(description = "最后同步时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date lastSyncTime; + + @Schema(description = "创建者姓名") + private String creatorName; +} diff --git a/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/vo/KnowledgeChunkVO.java b/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/vo/KnowledgeChunkVO.java new file mode 100644 index 0000000..f75c6d2 --- /dev/null +++ b/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/vo/KnowledgeChunkVO.java @@ -0,0 +1,68 @@ +package org.xyzh.api.agent.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import com.fasterxml.jackson.databind.JsonNode; +import java.util.Date; + +/** + * 知识文档片段VO + * 用于前端展示知识文档片段信息 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "知识文档片段VO") +public class KnowledgeChunkVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "片段ID") + private String chunkId; + + @Schema(description = "所属文档ID") + private String docId; + + @Schema(description = "文档标题") + private String docTitle; + + @Schema(description = "所属知识库ID") + private String knowledgeId; + + @Schema(description = "知识库名称") + private String knowledgeName; + + @Schema(description = "片段索引") + private Integer chunkIndex; + + @Schema(description = "片段内容") + private String content; + + @Schema(description = "内容长度") + private Integer contentLength; + + @Schema(description = "片段类型") + private String chunkType; + + @Schema(description = "片段类型名称") + private String chunkTypeName; + + @Schema(description = "版本号") + private Integer version; + + @Schema(description = "根chunk ID") + private String rootChunkId; + + @Schema(description = "是否当前版本", defaultValue = "false") + private Boolean isCurrent; + + @Schema(description = "位置信息") + private JsonNode positionInfo; + + @Schema(description = "片段元数据") + private JsonNode metadata; + + @Schema(description = "部门名称") + private String deptName; +} diff --git a/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/vo/KnowledgeDocumentVO.java b/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/vo/KnowledgeDocumentVO.java new file mode 100644 index 0000000..3076d32 --- /dev/null +++ b/urbanLifelineServ/apis/api-agent/src/main/java/org/xyzh/api/agent/vo/KnowledgeDocumentVO.java @@ -0,0 +1,114 @@ +package org.xyzh.api.agent.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import com.fasterxml.jackson.databind.JsonNode; +import java.util.Date; +import java.util.List; + +/** + * 知识文档VO + * 用于前端展示知识文档信息 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "知识文档VO") +public class KnowledgeDocumentVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "文档ID") + private String docId; + + @Schema(description = "所属知识库ID") + private String knowledgeId; + + @Schema(description = "知识库名称") + private String knowledgeName; + + @Schema(description = "文档标题") + private String title; + + @Schema(description = "文档类型") + private String docType; + + @Schema(description = "文档类型名称") + private String docTypeName; + + @Schema(description = "文档分类") + private String category; + + @Schema(description = "文档内容") + private String content; + + @Schema(description = "内容摘要") + private String contentSummary; + + @Schema(description = "关联文件ID") + private String fileId; + + @Schema(description = "文件路径") + private String filePath; + + @Schema(description = "文件下载URL") + private String fileUrl; + + @Schema(description = "文件大小") + private Long fileSize; + + @Schema(description = "文件大小格式化显示") + private String fileSizeFormatted; + + @Schema(description = "MIME类型") + private String mimeType; + + @Schema(description = "版本号") + private Integer version; + + @Schema(description = "根文档ID") + private String rootDocId; + + @Schema(description = "文档标签") + private List tags; + + @Schema(description = "关键词") + private List keywords; + + @Schema(description = "向量化状态") + private String embeddingStatus; + + @Schema(description = "向量化状态名称") + private String embeddingStatusName; + + @Schema(description = "使用的向量化模型") + private String embeddingModel; + + @Schema(description = "切片数量") + private Integer chunkCount; + + @Schema(description = "文档元数据") + private JsonNode metadata; + + @Schema(description = "来源URL") + private String sourceUrl; + + @Schema(description = "服务类型") + private String serviceType; + + @Schema(description = "部门名称") + private String deptName; + + @Schema(description = "状态") + private String status; + + @Schema(description = "状态名称") + private String statusName; + + @Schema(description = "创建者姓名") + private String creatorName; + + @Schema(description = "更新者姓名") + private String updaterName; +} diff --git a/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/Main.java b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/Main.java deleted file mode 100644 index f660b7a..0000000 --- a/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.xyzh; - -public class Main { - public static void main(String[] args) { - System.out.println("Hello world!"); - } -} \ No newline at end of file diff --git a/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/BiddingService.java b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/BiddingService.java new file mode 100644 index 0000000..7bd7f8c --- /dev/null +++ b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/BiddingService.java @@ -0,0 +1,5 @@ +package org.xyzh.api.bidding; + +public interface BiddingService { + +} diff --git a/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/BidResponseDTO.java b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/BidResponseDTO.java new file mode 100644 index 0000000..ebcfef0 --- /dev/null +++ b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/BidResponseDTO.java @@ -0,0 +1,56 @@ +package org.xyzh.api.bidding.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.dto.BaseDTO; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 投标文件DTO + * 用于创建和更新投标文件 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "投标文件DTO") +public class BidResponseDTO extends BaseDTO { + private static final long serialVersionUID = 1L; + + @Schema(description = "响应文件ID(更新时需要)") + private String responseId; + + @Schema(description = "所属项目ID") + private String projectId; + + @Schema(description = "响应类型:technical-技术标/commercial-商务标/comprehensive-综合标") + private String responseType; + + @Schema(description = "文档名称") + private String docName; + + @Schema(description = "文档大纲") + private String outline; + + @Schema(description = "文档内容") + private String content; + + @Schema(description = "生成方式:ai-AI生成/template-模板生成/manual-人工编写") + private String generationMethod; + + @Schema(description = "使用的模板ID") + private String templateId; + + @Schema(description = "使用的AI模型") + private String aiModel; + + @Schema(description = "生成状态:draft-草稿/reviewing-审核中/approved-已批准/rejected-已拒绝/submitted-已提交") + private String generationStatus; + + @Schema(description = "版本号") + private String version; + + @Schema(description = "父版本ID") + private String parentVersionId; + + @Schema(description = "审核意见") + private String reviewComments; +} diff --git a/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/BiddingDocumentDTO.java b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/BiddingDocumentDTO.java new file mode 100644 index 0000000..cc41c84 --- /dev/null +++ b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/BiddingDocumentDTO.java @@ -0,0 +1,47 @@ +package org.xyzh.api.bidding.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.dto.BaseDTO; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 招标文档DTO + * 用于创建和更新招标文档 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "招标文档DTO") +public class BiddingDocumentDTO extends BaseDTO { + private static final long serialVersionUID = 1L; + + @Schema(description = "文档ID(更新时需要)") + private String docId; + + @Schema(description = "所属项目ID") + private String projectId; + + @Schema(description = "文档类型:tender-招标文件/technical-技术标/commercial-商务标/clarification-澄清文件/other-其他") + private String docType; + + @Schema(description = "文档名称") + private String docName; + + @Schema(description = "关联文件ID") + private String fileId; + + @Schema(description = "文件路径") + private String filePath; + + @Schema(description = "文件大小") + private Long fileSize; + + @Schema(description = "MIME类型") + private String mimeType; + + @Schema(description = "版本号") + private String version; + + @Schema(description = "语言") + private String language; +} diff --git a/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/BiddingProjectDTO.java b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/BiddingProjectDTO.java new file mode 100644 index 0000000..e948f4a --- /dev/null +++ b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/BiddingProjectDTO.java @@ -0,0 +1,93 @@ +package org.xyzh.api.bidding.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.dto.BaseDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 招标项目DTO + * 用于创建和更新招标项目 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "招标项目DTO") +public class BiddingProjectDTO extends BaseDTO { + private static final long serialVersionUID = 1L; + + @Schema(description = "项目ID(更新时需要)") + private String projectId; + + @Schema(description = "项目编号") + private String projectNo; + + @Schema(description = "项目名称") + private String projectName; + + @Schema(description = "项目类型:public-公开招标/invitation-邀请招标/competitive_negotiation-竞争性谈判") + private String projectType; + + @Schema(description = "所属行业") + private String industry; + + @Schema(description = "来源平台") + private String sourcePlatform; + + @Schema(description = "来源URL") + private String sourceUrl; + + @Schema(description = "发布日期", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date publishDate; + + @Schema(description = "投标截止日期", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deadline; + + @Schema(description = "开标日期", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date openingDate; + + @Schema(description = "预算金额") + private BigDecimal budgetAmount; + + @Schema(description = "货币单位") + private String currency; + + @Schema(description = "项目状态") + private String projectStatus; + + @Schema(description = "中标状态") + private String winningStatus; + + @Schema(description = "中标金额") + private BigDecimal winningAmount; + + @Schema(description = "客户名称") + private String clientName; + + @Schema(description = "客户联系方式") + private String clientContact; + + @Schema(description = "联系人") + private String contactPerson; + + @Schema(description = "项目地点") + private String projectLocation; + + @Schema(description = "项目描述") + private String description; + + @Schema(description = "关键词") + private List keywords; + + @Schema(description = "负责人") + private String responsibleUser; + + @Schema(description = "团队成员") + private List teamMembers; +} diff --git a/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/BiddingRequirementDTO.java b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/BiddingRequirementDTO.java new file mode 100644 index 0000000..9141b99 --- /dev/null +++ b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/BiddingRequirementDTO.java @@ -0,0 +1,67 @@ +package org.xyzh.api.bidding.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.dto.BaseDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.databind.JsonNode; +import java.math.BigDecimal; + +/** + * 招标要素DTO + * 用于创建和更新招标要素 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "招标要素DTO") +public class BiddingRequirementDTO extends BaseDTO { + private static final long serialVersionUID = 1L; + + @Schema(description = "要素ID(更新时需要)") + private String reqId; + + @Schema(description = "所属项目ID") + private String projectId; + + @Schema(description = "来源文档ID") + private String docId; + + @Schema(description = "要素类别:commercial-商务要素/technical-技术参数/veto-否决项/qualification-资质要求/delivery-交付要求/payment-付款条件/scoring-评分标准") + private String reqCategory; + + @Schema(description = "要素名称") + private String reqName; + + @Schema(description = "要素内容") + private String reqContent; + + @Schema(description = "要素值") + private String reqValue; + + @Schema(description = "是否必填", defaultValue = "false") + private Boolean isMandatory; + + @Schema(description = "是否为否决项", defaultValue = "false") + private Boolean isVeto; + + @Schema(description = "优先级") + private Integer priority; + + @Schema(description = "提取方式:ai-AI提取/manual-人工录入") + private String extractionMethod; + + @Schema(description = "置信度分数") + private BigDecimal confidenceScore; + + @Schema(description = "来源位置") + private JsonNode sourceLocation; + + @Schema(description = "合规状态:compliant-符合/non_compliant-不符合/pending-待确认") + private String complianceStatus; + + @Schema(description = "响应内容") + private String responseContent; + + @Schema(description = "备注") + private String notes; +} diff --git a/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/ProcessNodeDTO.java b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/ProcessNodeDTO.java new file mode 100644 index 0000000..2e868bc --- /dev/null +++ b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/dto/ProcessNodeDTO.java @@ -0,0 +1,66 @@ +package org.xyzh.api.bidding.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.dto.BaseDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import java.util.Date; +import java.util.List; + +/** + * 项目流程节点DTO + * 用于创建和更新流程节点 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "项目流程节点DTO") +public class ProcessNodeDTO extends BaseDTO { + private static final long serialVersionUID = 1L; + + @Schema(description = "流程节点ID(更新时需要)") + private String processId; + + @Schema(description = "所属项目ID") + private String projectId; + + @Schema(description = "节点名称") + private String nodeName; + + @Schema(description = "节点类型:collection-文件收集/analysis-需求分析/preparation-文件准备/review-内部审核/submission-投标提交/opening-开标/result-结果通知") + private String nodeType; + + @Schema(description = "节点顺序") + private Integer nodeOrder; + + @Schema(description = "节点状态:pending-待处理/in_progress-进行中/completed-已完成/skipped-已跳过") + private String nodeStatus; + + @Schema(description = "计划开始时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date plannedStartTime; + + @Schema(description = "计划结束时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date plannedEndTime; + + @Schema(description = "实际开始时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date actualStartTime; + + @Schema(description = "实际结束时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date actualEndTime; + + @Schema(description = "负责人") + private String responsibleUser; + + @Schema(description = "参与人员") + private List participants; + + @Schema(description = "节点备注") + private String notes; + + @Schema(description = "附件ID数组") + private List attachments; +} diff --git a/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/BidResponseVO.java b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/BidResponseVO.java new file mode 100644 index 0000000..d111a9c --- /dev/null +++ b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/BidResponseVO.java @@ -0,0 +1,97 @@ +package org.xyzh.api.bidding.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import java.util.Date; + +/** + * 投标文件VO + * 用于前端展示投标文件信息 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "投标文件VO") +public class BidResponseVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "响应文件ID") + private String responseId; + + @Schema(description = "所属项目ID") + private String projectId; + + @Schema(description = "项目名称") + private String projectName; + + @Schema(description = "响应类型") + private String responseType; + + @Schema(description = "响应类型名称(中文)") + private String responseTypeName; + + @Schema(description = "文档名称") + private String docName; + + @Schema(description = "文档大纲") + private String outline; + + @Schema(description = "文档内容") + private String content; + + @Schema(description = "内容字数") + private Integer contentWordCount; + + @Schema(description = "生成方式") + private String generationMethod; + + @Schema(description = "生成方式名称") + private String generationMethodName; + + @Schema(description = "使用的模板ID") + private String templateId; + + @Schema(description = "使用的模板名称") + private String templateName; + + @Schema(description = "使用的AI模型") + private String aiModel; + + @Schema(description = "生成状态") + private String generationStatus; + + @Schema(description = "生成状态名称") + private String generationStatusName; + + @Schema(description = "生成状态颜色标签") + private String statusColor; + + @Schema(description = "关联文件ID") + private String fileId; + + @Schema(description = "文件路径") + private String filePath; + + @Schema(description = "文件下载URL") + private String fileUrl; + + @Schema(description = "版本号") + private String version; + + @Schema(description = "父版本ID") + private String parentVersionId; + + @Schema(description = "是否有历史版本", defaultValue = "false") + private Boolean hasHistory; + + @Schema(description = "审核意见") + private String reviewComments; + + @Schema(description = "创建者姓名") + private String creatorName; + + @Schema(description = "更新者姓名") + private String updaterName; +} diff --git a/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/BiddingDocumentVO.java b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/BiddingDocumentVO.java new file mode 100644 index 0000000..658d8fb --- /dev/null +++ b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/BiddingDocumentVO.java @@ -0,0 +1,90 @@ +package org.xyzh.api.bidding.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import com.fasterxml.jackson.databind.JsonNode; +import java.util.Date; + +/** + * 招标文档VO + * 用于前端展示招标文档信息 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "招标文档VO") +public class BiddingDocumentVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "文档ID") + private String docId; + + @Schema(description = "所属项目ID") + private String projectId; + + @Schema(description = "项目名称") + private String projectName; + + @Schema(description = "文档类型") + private String docType; + + @Schema(description = "文档类型名称(中文)") + private String docTypeName; + + @Schema(description = "文档名称") + private String docName; + + @Schema(description = "关联文件ID") + private String fileId; + + @Schema(description = "文件路径") + private String filePath; + + @Schema(description = "文件下载URL") + private String fileUrl; + + @Schema(description = "文件大小") + private Long fileSize; + + @Schema(description = "文件大小格式化显示") + private String fileSizeFormatted; + + @Schema(description = "MIME类型") + private String mimeType; + + @Schema(description = "文件类型图标") + private String fileIcon; + + @Schema(description = "版本号") + private String version; + + @Schema(description = "语言") + private String language; + + @Schema(description = "页数") + private Integer pageCount; + + @Schema(description = "解析状态") + private String parseStatus; + + @Schema(description = "解析状态名称") + private String parseStatusName; + + @Schema(description = "解析结果") + private JsonNode parseResult; + + @Schema(description = "提取的结构化数据") + private JsonNode extractionData; + + @Schema(description = "AI分析结果") + private String aiAnalysis; + + @Schema(description = "上传日期", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date uploadDate; + + @Schema(description = "创建者姓名") + private String creatorName; +} diff --git a/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/BiddingProjectVO.java b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/BiddingProjectVO.java new file mode 100644 index 0000000..29dc892 --- /dev/null +++ b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/BiddingProjectVO.java @@ -0,0 +1,135 @@ +package org.xyzh.api.bidding.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 招标项目VO + * 用于前端展示招标项目详细信息 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "招标项目VO") +public class BiddingProjectVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "项目ID") + private String projectId; + + @Schema(description = "项目编号") + private String projectNo; + + @Schema(description = "项目名称") + private String projectName; + + @Schema(description = "项目类型") + private String projectType; + + @Schema(description = "项目类型名称(中文)") + private String projectTypeName; + + @Schema(description = "所属行业") + private String industry; + + @Schema(description = "来源平台") + private String sourcePlatform; + + @Schema(description = "来源URL") + private String sourceUrl; + + @Schema(description = "发布日期", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date publishDate; + + @Schema(description = "投标截止日期", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deadline; + + @Schema(description = "开标日期", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date openingDate; + + @Schema(description = "距离截止日期剩余天数") + private Long daysUntilDeadline; + + @Schema(description = "预算金额") + private BigDecimal budgetAmount; + + @Schema(description = "货币单位") + private String currency; + + @Schema(description = "预算金额格式化显示") + private String budgetAmountFormatted; + + @Schema(description = "项目状态") + private String projectStatus; + + @Schema(description = "项目状态名称(中文)") + private String projectStatusName; + + @Schema(description = "中标状态") + private String winningStatus; + + @Schema(description = "中标状态名称(中文)") + private String winningStatusName; + + @Schema(description = "中标金额") + private BigDecimal winningAmount; + + @Schema(description = "中标金额格式化显示") + private String winningAmountFormatted; + + @Schema(description = "客户名称") + private String clientName; + + @Schema(description = "客户联系方式") + private String clientContact; + + @Schema(description = "联系人") + private String contactPerson; + + @Schema(description = "项目地点") + private String projectLocation; + + @Schema(description = "项目描述") + private String description; + + @Schema(description = "关键词") + private List keywords; + + @Schema(description = "负责人ID") + private String responsibleUser; + + @Schema(description = "负责人姓名") + private String responsibleUserName; + + @Schema(description = "团队成员") + private List teamMembers; + + @Schema(description = "团队成员姓名列表") + private List teamMemberNames; + + @Schema(description = "部门名称") + private String deptName; + + @Schema(description = "文档数量") + private Integer documentCount; + + @Schema(description = "要素数量") + private Integer requirementCount; + + @Schema(description = "否决项数量") + private Integer vetoCount; + + @Schema(description = "投标文件数量") + private Integer responseCount; + + @Schema(description = "完成进度(百分比)") + private Integer progressPercentage; +} diff --git a/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/BiddingRequirementVO.java b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/BiddingRequirementVO.java new file mode 100644 index 0000000..1fd7b22 --- /dev/null +++ b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/BiddingRequirementVO.java @@ -0,0 +1,102 @@ +package org.xyzh.api.bidding.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import com.fasterxml.jackson.databind.JsonNode; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 招标要素VO + * 用于前端展示招标要素信息 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "招标要素VO") +public class BiddingRequirementVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "要素ID") + private String reqId; + + @Schema(description = "所属项目ID") + private String projectId; + + @Schema(description = "项目名称") + private String projectName; + + @Schema(description = "来源文档ID") + private String docId; + + @Schema(description = "来源文档名称") + private String docName; + + @Schema(description = "要素类别") + private String reqCategory; + + @Schema(description = "要素类别名称(中文)") + private String reqCategoryName; + + @Schema(description = "要素名称") + private String reqName; + + @Schema(description = "要素内容") + private String reqContent; + + @Schema(description = "要素值") + private String reqValue; + + @Schema(description = "是否必填", defaultValue = "false") + private Boolean isMandatory; + + @Schema(description = "是否为否决项", defaultValue = "false") + private Boolean isVeto; + + @Schema(description = "优先级") + private Integer priority; + + @Schema(description = "优先级标签(高/中/低)") + private String priorityLabel; + + @Schema(description = "提取方式") + private String extractionMethod; + + @Schema(description = "提取方式名称") + private String extractionMethodName; + + @Schema(description = "置信度分数") + private BigDecimal confidenceScore; + + @Schema(description = "置信度百分比") + private Integer confidencePercentage; + + @Schema(description = "来源位置") + private JsonNode sourceLocation; + + @Schema(description = "来源位置描述") + private String sourceLocationDesc; + + @Schema(description = "合规状态") + private String complianceStatus; + + @Schema(description = "合规状态名称") + private String complianceStatusName; + + @Schema(description = "合规状态标签颜色") + private String complianceStatusColor; + + @Schema(description = "响应内容") + private String responseContent; + + @Schema(description = "是否已响应", defaultValue = "false") + private Boolean hasResponse; + + @Schema(description = "备注") + private String notes; + + @Schema(description = "创建者姓名") + private String creatorName; +} diff --git a/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/ProcessNodeVO.java b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/ProcessNodeVO.java new file mode 100644 index 0000000..fefad0f --- /dev/null +++ b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/ProcessNodeVO.java @@ -0,0 +1,102 @@ +package org.xyzh.api.bidding.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import java.util.Date; +import java.util.List; + +/** + * 项目流程节点VO + * 用于前端展示流程节点信息 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "项目流程节点VO") +public class ProcessNodeVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "流程节点ID") + private String processId; + + @Schema(description = "所属项目ID") + private String projectId; + + @Schema(description = "项目名称") + private String projectName; + + @Schema(description = "节点名称") + private String nodeName; + + @Schema(description = "节点类型") + private String nodeType; + + @Schema(description = "节点类型名称") + private String nodeTypeName; + + @Schema(description = "节点顺序") + private Integer nodeOrder; + + @Schema(description = "节点状态") + private String nodeStatus; + + @Schema(description = "节点状态名称") + private String nodeStatusName; + + @Schema(description = "节点状态颜色") + private String statusColor; + + @Schema(description = "节点图标") + private String nodeIcon; + + @Schema(description = "计划开始时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date plannedStartTime; + + @Schema(description = "计划结束时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date plannedEndTime; + + @Schema(description = "实际开始时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date actualStartTime; + + @Schema(description = "实际结束时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date actualEndTime; + + @Schema(description = "计划耗时(天)") + private Integer plannedDuration; + + @Schema(description = "实际耗时(天)") + private Integer actualDuration; + + @Schema(description = "是否延期", defaultValue = "false") + private Boolean isDelayed; + + @Schema(description = "延期天数") + private Integer delayedDays; + + @Schema(description = "负责人ID") + private String responsibleUser; + + @Schema(description = "负责人姓名") + private String responsibleUserName; + + @Schema(description = "参与人员ID列表") + private List participants; + + @Schema(description = "参与人员姓名列表") + private List participantNames; + + @Schema(description = "节点备注") + private String notes; + + @Schema(description = "附件ID数组") + private List attachments; + + @Schema(description = "附件数量") + private Integer attachmentCount; +} diff --git a/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/ProjectListVO.java b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/ProjectListVO.java new file mode 100644 index 0000000..ba50123 --- /dev/null +++ b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/ProjectListVO.java @@ -0,0 +1,70 @@ +package org.xyzh.api.bidding.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 招标项目列表VO(简化版) + * 用于前端列表展示 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "招标项目列表VO") +public class ProjectListVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "项目ID") + private String projectId; + + @Schema(description = "项目编号") + private String projectNo; + + @Schema(description = "项目名称") + private String projectName; + + @Schema(description = "项目类型") + private String projectType; + + @Schema(description = "项目类型名称") + private String projectTypeName; + + @Schema(description = "所属行业") + private String industry; + + @Schema(description = "投标截止日期", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deadline; + + @Schema(description = "距离截止日期剩余天数") + private Long daysUntilDeadline; + + @Schema(description = "是否即将截止(<3天)", defaultValue = "false") + private Boolean isUrgent; + + @Schema(description = "预算金额格式化显示") + private String budgetAmountFormatted; + + @Schema(description = "项目状态") + private String projectStatus; + + @Schema(description = "项目状态名称") + private String projectStatusName; + + @Schema(description = "中标状态") + private String winningStatus; + + @Schema(description = "客户名称") + private String clientName; + + @Schema(description = "负责人姓名") + private String responsibleUserName; + + @Schema(description = "完成进度(百分比)") + private Integer progressPercentage; +} diff --git a/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/ProjectStatisticsVO.java b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/ProjectStatisticsVO.java new file mode 100644 index 0000000..4d51bba --- /dev/null +++ b/urbanLifelineServ/apis/api-bidding/src/main/java/org/xyzh/api/bidding/vo/ProjectStatisticsVO.java @@ -0,0 +1,67 @@ +package org.xyzh.api.bidding.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import java.math.BigDecimal; +import java.util.Map; + +/** + * 项目统计VO + * 用于前端展示项目统计数据 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "项目统计VO") +public class ProjectStatisticsVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "总项目数") + private Long totalProjects; + + @Schema(description = "进行中的项目数") + private Long ongoingProjects; + + @Schema(description = "已提交的项目数") + private Long submittedProjects; + + @Schema(description = "已中标的项目数") + private Long wonProjects; + + @Schema(description = "未中标的项目数") + private Long lostProjects; + + @Schema(description = "中标率(百分比)") + private BigDecimal winRate; + + @Schema(description = "即将截止的项目数(<3天)") + private Long urgentProjects; + + @Schema(description = "总预算金额") + private BigDecimal totalBudget; + + @Schema(description = "总中标金额") + private BigDecimal totalWinningAmount; + + @Schema(description = "按状态分组统计") + private Map projectsByStatus; + + @Schema(description = "按类型分组统计") + private Map projectsByType; + + @Schema(description = "按行业分组统计") + private Map projectsByIndustry; + + @Schema(description = "按月份分组统计(最近12个月)") + private Map projectsByMonth; + + @Schema(description = "按负责人分组统计") + private Map projectsByUser; + + @Schema(description = "平均项目周期(天)") + private Integer avgProjectCycle; + + @Schema(description = "最近7天新增项目数") + private Long recentNewProjects; +} diff --git a/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/Main.java b/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/Main.java deleted file mode 100644 index f660b7a..0000000 --- a/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.xyzh; - -public class Main { - public static void main(String[] args) { - System.out.println("Hello world!"); - } -} \ No newline at end of file diff --git a/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/CrontabService.java b/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/CrontabService.java new file mode 100644 index 0000000..548571f --- /dev/null +++ b/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/CrontabService.java @@ -0,0 +1,9 @@ +package org.xyzh.api.crontab; + +/** + * 定时任务服务接口 + * 用于定时任务管理 + */ +public interface CrontabService { + +} diff --git a/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/dto/TbCrontabLogDTO.java b/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/dto/TbCrontabLogDTO.java new file mode 100644 index 0000000..e675ad7 --- /dev/null +++ b/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/dto/TbCrontabLogDTO.java @@ -0,0 +1,57 @@ +package org.xyzh.api.crontab.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.dto.BaseDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import java.util.Date; + +/** + * 定时任务执行日志DTO + * 用于记录任务执行情况 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "定时任务执行日志DTO") +public class TbCrontabLogDTO extends BaseDTO { + private static final long serialVersionUID = 1L; + + @Schema(description = "任务ID") + private String taskId; + + @Schema(description = "任务名称") + private String taskName; + + @Schema(description = "任务分组") + private String taskGroup; + + @Schema(description = "Bean名称") + private String beanName; + + @Schema(description = "方法名称") + private String methodName; + + @Schema(description = "方法参数") + private String methodParams; + + @Schema(description = "执行状态:0-失败/1-成功") + private Integer executeStatus; + + @Schema(description = "执行结果信息") + private String executeMessage; + + @Schema(description = "异常信息") + private String exceptionInfo; + + @Schema(description = "开始时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @Schema(description = "结束时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + @Schema(description = "执行时长(毫秒)") + private Integer executeDuration; +} diff --git a/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/dto/TbCrontabTaskDTO.java b/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/dto/TbCrontabTaskDTO.java new file mode 100644 index 0000000..b03b40f --- /dev/null +++ b/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/dto/TbCrontabTaskDTO.java @@ -0,0 +1,56 @@ +package org.xyzh.api.crontab.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.dto.BaseDTO; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 定时任务DTO + * 用于创建和更新定时任务 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "定时任务DTO") +public class TbCrontabTaskDTO extends BaseDTO { + private static final long serialVersionUID = 1L; + + @Schema(description = "任务ID(更新时需要)") + private String taskId; + + @Schema(description = "任务名称") + private String taskName; + + @Schema(description = "任务分组", defaultValue = "DEFAULT") + private String taskGroup; + + @Schema(description = "任务元数据ID") + private String metaId; + + @Schema(description = "是否使用默认接收人", defaultValue = "false") + private Boolean defaultRecipient; + + @Schema(description = "Bean名称") + private String beanName; + + @Schema(description = "方法名称") + private String methodName; + + @Schema(description = "方法参数") + private String methodParams; + + @Schema(description = "Cron表达式") + private String cronExpression; + + @Schema(description = "任务状态:0-暂停/1-运行中", defaultValue = "0") + private Integer status; + + @Schema(description = "任务描述") + private String description; + + @Schema(description = "是否允许并发执行", defaultValue = "false") + private Boolean concurrent; + + @Schema(description = "错过执行策略:1-立即执行/2-执行一次/3-放弃执行", defaultValue = "1") + private Integer misfirePolicy; +} diff --git a/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/dto/TbCrontabTaskMetaDTO.java b/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/dto/TbCrontabTaskMetaDTO.java new file mode 100644 index 0000000..b088d45 --- /dev/null +++ b/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/dto/TbCrontabTaskMetaDTO.java @@ -0,0 +1,47 @@ +package org.xyzh.api.crontab.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.dto.BaseDTO; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 定时任务元数据DTO + * 用于创建和更新任务元数据配置 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "定时任务元数据DTO") +public class TbCrontabTaskMetaDTO extends BaseDTO { + private static final long serialVersionUID = 1L; + + @Schema(description = "元数据ID(更新时需要)") + private String metaId; + + @Schema(description = "任务名称") + private String name; + + @Schema(description = "任务描述") + private String description; + + @Schema(description = "任务分类") + private String category; + + @Schema(description = "Bean名称(执行器类名)") + private String beanName; + + @Schema(description = "执行方法名") + private String methodName; + + @Schema(description = "Python脚本路径") + private String scriptPath; + + @Schema(description = "参数模板(JSON格式)") + private String paramSchema; + + @Schema(description = "是否自动发布", defaultValue = "false") + private Boolean autoPublish; + + @Schema(description = "排序号", defaultValue = "0") + private Integer sortOrder; +} diff --git a/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/vo/CrontabLogVO.java b/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/vo/CrontabLogVO.java new file mode 100644 index 0000000..a57e33e --- /dev/null +++ b/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/vo/CrontabLogVO.java @@ -0,0 +1,72 @@ +package org.xyzh.api.crontab.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import java.util.Date; + +/** + * 定时任务执行日志VO + * 用于前端展示任务执行日志 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "定时任务执行日志VO") +public class CrontabLogVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "日志ID") + private String logId; + + @Schema(description = "任务ID") + private String taskId; + + @Schema(description = "任务名称") + private String taskName; + + @Schema(description = "任务分组") + private String taskGroup; + + @Schema(description = "Bean名称") + private String beanName; + + @Schema(description = "方法名称") + private String methodName; + + @Schema(description = "方法参数") + private String methodParams; + + @Schema(description = "执行状态:0-失败/1-成功") + private Integer executeStatus; + + @Schema(description = "执行状态名称") + private String executeStatusName; + + @Schema(description = "执行状态颜色") + private String executeStatusColor; + + @Schema(description = "执行结果信息") + private String executeMessage; + + @Schema(description = "异常信息") + private String exceptionInfo; + + @Schema(description = "是否有异常", defaultValue = "false") + private Boolean hasException; + + @Schema(description = "开始时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @Schema(description = "结束时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + @Schema(description = "执行时长(毫秒)") + private Integer executeDuration; + + @Schema(description = "执行时长格式化显示") + private String executeDurationFormatted; +} diff --git a/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/vo/CrontabTaskListVO.java b/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/vo/CrontabTaskListVO.java new file mode 100644 index 0000000..4b00e7b --- /dev/null +++ b/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/vo/CrontabTaskListVO.java @@ -0,0 +1,54 @@ +package org.xyzh.api.crontab.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import java.util.Date; + +/** + * 定时任务列表VO + * 用于前端列表展示(简化版) + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "定时任务列表VO") +public class CrontabTaskListVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "任务ID") + private String taskId; + + @Schema(description = "任务名称") + private String taskName; + + @Schema(description = "任务分组") + private String taskGroup; + + @Schema(description = "Cron表达式") + private String cronExpression; + + @Schema(description = "Cron表达式描述") + private String cronDescription; + + @Schema(description = "任务状态") + private Integer status; + + @Schema(description = "任务状态名称") + private String statusName; + + @Schema(description = "下次执行时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date nextExecuteTime; + + @Schema(description = "最后执行时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date lastExecuteTime; + + @Schema(description = "最后执行状态") + private Integer lastExecuteStatus; + + @Schema(description = "创建者姓名") + private String creatorName; +} diff --git a/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/vo/CrontabTaskMetaVO.java b/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/vo/CrontabTaskMetaVO.java new file mode 100644 index 0000000..9876676 --- /dev/null +++ b/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/vo/CrontabTaskMetaVO.java @@ -0,0 +1,56 @@ +package org.xyzh.api.crontab.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 定时任务元数据VO + * 用于前端展示任务元数据信息 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "定时任务元数据VO") +public class CrontabTaskMetaVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "元数据ID") + private String metaId; + + @Schema(description = "任务名称") + private String name; + + @Schema(description = "任务描述") + private String description; + + @Schema(description = "任务分类") + private String category; + + @Schema(description = "Bean名称(执行器类名)") + private String beanName; + + @Schema(description = "执行方法名") + private String methodName; + + @Schema(description = "Python脚本路径") + private String scriptPath; + + @Schema(description = "参数模板(JSON格式)") + private String paramSchema; + + @Schema(description = "是否自动发布", defaultValue = "false") + private Boolean autoPublish; + + @Schema(description = "排序号") + private Integer sortOrder; + + @Schema(description = "关联的任务数量") + private Integer taskCount; + + @Schema(description = "创建者姓名") + private String creatorName; + + @Schema(description = "更新者姓名") + private String updaterName; +} diff --git a/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/vo/CrontabTaskVO.java b/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/vo/CrontabTaskVO.java new file mode 100644 index 0000000..444952b --- /dev/null +++ b/urbanLifelineServ/apis/api-crontab/src/main/java/org/xyzh/api/crontab/vo/CrontabTaskVO.java @@ -0,0 +1,87 @@ +package org.xyzh.api.crontab.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import java.util.Date; + +/** + * 定时任务VO + * 用于前端展示定时任务信息 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "定时任务VO") +public class CrontabTaskVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "任务ID") + private String taskId; + + @Schema(description = "任务名称") + private String taskName; + + @Schema(description = "任务分组") + private String taskGroup; + + @Schema(description = "任务元数据ID") + private String metaId; + + @Schema(description = "元数据名称") + private String metaName; + + @Schema(description = "是否使用默认接收人", defaultValue = "false") + private Boolean defaultRecipient; + + @Schema(description = "Bean名称") + private String beanName; + + @Schema(description = "方法名称") + private String methodName; + + @Schema(description = "方法参数") + private String methodParams; + + @Schema(description = "Cron表达式") + private String cronExpression; + + @Schema(description = "Cron表达式描述(中文)") + private String cronDescription; + + @Schema(description = "任务状态") + private Integer status; + + @Schema(description = "任务状态名称") + private String statusName; + + @Schema(description = "任务描述") + private String description; + + @Schema(description = "是否允许并发执行", defaultValue = "false") + private Boolean concurrent; + + @Schema(description = "错过执行策略") + private Integer misfirePolicy; + + @Schema(description = "错过执行策略名称") + private String misfirePolicyName; + + @Schema(description = "下次执行时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date nextExecuteTime; + + @Schema(description = "最后执行时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date lastExecuteTime; + + @Schema(description = "最后执行状态:0-失败/1-成功") + private Integer lastExecuteStatus; + + @Schema(description = "创建者姓名") + private String creatorName; + + @Schema(description = "更新者姓名") + private String updaterName; +} diff --git a/urbanLifelineServ/apis/api-message/src/main/java/org/xyzh/api/message/MessageService.java b/urbanLifelineServ/apis/api-message/src/main/java/org/xyzh/api/message/MessageService.java new file mode 100644 index 0000000..d18da9b --- /dev/null +++ b/urbanLifelineServ/apis/api-message/src/main/java/org/xyzh/api/message/MessageService.java @@ -0,0 +1,9 @@ +package org.xyzh.api.message; + +/** + * Message服务接口 + * 用于消息管理 + */ +public interface MessageService { + +} diff --git a/urbanLifelineServ/apis/api-message/src/main/java/org/xyzh/api/message/vo/MessageReceiverVO.java b/urbanLifelineServ/apis/api-message/src/main/java/org/xyzh/api/message/vo/MessageReceiverVO.java new file mode 100644 index 0000000..b393e40 --- /dev/null +++ b/urbanLifelineServ/apis/api-message/src/main/java/org/xyzh/api/message/vo/MessageReceiverVO.java @@ -0,0 +1,63 @@ +package org.xyzh.api.message.vo; + +import lombok.Data; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import java.util.Date; +import org.xyzh.common.vo.BaseVO; + +/** + * 用户消息接收记录VO + * 用于前端展示用户消息信息 + */ +@Data +@Schema(description = "用户消息接收记录VO") +public class MessageReceiverVO extends BaseVO { + + @Schema(description = "消息ID") + private String messageId; + + @Schema(description = "消息标题") + private String title; + + @Schema(description = "消息内容") + private String content; + + @Schema(description = "消息类型") + private String type; + + @Schema(description = "消息类型名称") + private String typeName; + + @Schema(description = "用户ID") + private String userId; + + @Schema(description = "用户姓名") + private String userName; + + @Schema(description = "接收渠道") + private String channel; + + @Schema(description = "渠道名称") + private String channelName; + + @Schema(description = "消息状态:unread-未读/read-已读/handled-已处理/deleted-已删除") + private String status; + + @Schema(description = "状态名称") + private String statusName; + + @Schema(description = "状态颜色") + private String statusColor; + + @Schema(description = "阅读时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date readTime; + + @Schema(description = "处理时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date handleTime; + + @Schema(description = "服务类型") + private String serviceType; +} diff --git a/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/WorkcaseService.java b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/WorkcaseService.java new file mode 100644 index 0000000..f9dd5fc --- /dev/null +++ b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/WorkcaseService.java @@ -0,0 +1,9 @@ +package org.xyzh.api.workcase; + +/** + * 工单服务接口 + * 用于客服工单管理 + */ +public interface WorkcaseService { + +} diff --git a/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/dto/TbConversationDTO.java b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/dto/TbConversationDTO.java new file mode 100644 index 0000000..c9c5d6e --- /dev/null +++ b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/dto/TbConversationDTO.java @@ -0,0 +1,71 @@ +package org.xyzh.api.workcase.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.dto.BaseDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import com.fasterxml.jackson.databind.JsonNode; +import java.util.Date; +import java.util.List; + +/** + * 会话DTO + * 用于创建和更新会话 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "会话DTO") +public class TbConversationDTO extends BaseDTO { + private static final long serialVersionUID = 1L; + + @Schema(description = "会话ID(更新时需要)") + private String conversationId; + + @Schema(description = "客户ID") + private String customerId; + + @Schema(description = "会话类型:ai-AI客服/human-人工客服/transfer-转接", defaultValue = "ai") + private String conversationType; + + @Schema(description = "渠道:wechat-微信/web-网页/app-应用/phone-电话", defaultValue = "wechat") + private String channel; + + @Schema(description = "智能体ID或客服人员ID") + private String agentId; + + @Schema(description = "座席类型:ai-AI/human-人工", defaultValue = "ai") + private String agentType; + + @Schema(description = "会话开始时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date sessionStartTime; + + @Schema(description = "会话结束时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date sessionEndTime; + + @Schema(description = "会话时长(秒)") + private Integer durationSeconds; + + @Schema(description = "消息数量", defaultValue = "0") + private Integer messageCount; + + @Schema(description = "会话状态:active-进行中/closed-已结束/transferred-已转接/timeout-超时", defaultValue = "active") + private String conversationStatus; + + @Schema(description = "满意度评分(1-5星)") + private Integer satisfactionRating; + + @Schema(description = "满意度反馈") + private String satisfactionFeedback; + + @Schema(description = "会话摘要(AI生成)") + private String summary; + + @Schema(description = "会话标签") + private List tags; + + @Schema(description = "会话元数据") + private JsonNode metadata; +} diff --git a/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/dto/TbCustomerDTO.java b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/dto/TbCustomerDTO.java new file mode 100644 index 0000000..76ebd84 --- /dev/null +++ b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/dto/TbCustomerDTO.java @@ -0,0 +1,91 @@ +package org.xyzh.api.workcase.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.dto.BaseDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 客户信息DTO + * 用于创建和更新客户信息 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "客户信息DTO") +public class TbCustomerDTO extends BaseDTO { + private static final long serialVersionUID = 1L; + + @Schema(description = "客户ID(更新时需要)") + private String customerId; + + @Schema(description = "客户编号") + private String customerNo; + + @Schema(description = "客户姓名") + private String customerName; + + @Schema(description = "客户类型:individual-个人/enterprise-企业", defaultValue = "individual") + private String customerType; + + @Schema(description = "公司名称") + private String companyName; + + @Schema(description = "电话") + private String phone; + + @Schema(description = "邮箱") + private String email; + + @Schema(description = "微信OpenID") + private String wechatOpenid; + + @Schema(description = "微信UnionID") + private String wechatUnionid; + + @Schema(description = "头像URL") + private String avatar; + + @Schema(description = "性别:0-未知/1-男/2-女", defaultValue = "0") + private Integer gender; + + @Schema(description = "地址") + private String address; + + @Schema(description = "客户等级:vip/important/normal/potential", defaultValue = "normal") + private String customerLevel; + + @Schema(description = "客户来源:wechat-微信/web-网站/phone-电话/referral-推荐") + private String customerSource; + + @Schema(description = "客户标签数组") + private List tags; + + @Schema(description = "备注") + private String notes; + + @Schema(description = "CRM系统客户ID") + private String crmCustomerId; + + @Schema(description = "最后联系时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date lastContactTime; + + @Schema(description = "咨询总次数", defaultValue = "0") + private Integer totalConsultations; + + @Schema(description = "订单总数", defaultValue = "0") + private Integer totalOrders; + + @Schema(description = "总消费金额", defaultValue = "0") + private BigDecimal totalAmount; + + @Schema(description = "满意度评分(1-5)") + private BigDecimal satisfactionScore; + + @Schema(description = "状态:active-活跃/inactive-非活跃/blacklist-黑名单", defaultValue = "active") + private String status; +} diff --git a/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/dto/TbTicketDTO.java b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/dto/TbTicketDTO.java new file mode 100644 index 0000000..cce7ab7 --- /dev/null +++ b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/dto/TbTicketDTO.java @@ -0,0 +1,103 @@ +package org.xyzh.api.workcase.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.dto.BaseDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import com.fasterxml.jackson.databind.JsonNode; +import java.util.Date; +import java.util.List; + +/** + * 工单DTO + * 用于创建和更新工单 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "工单DTO") +public class TbTicketDTO extends BaseDTO { + private static final long serialVersionUID = 1L; + + @Schema(description = "工单ID(更新时需要)") + private String ticketId; + + @Schema(description = "工单编号") + private String ticketNo; + + @Schema(description = "客户ID") + private String customerId; + + @Schema(description = "关联会话ID") + private String conversationId; + + @Schema(description = "工单类型:consultation-咨询/complaint-投诉/suggestion-建议/repair-维修/installation-安装/other-其他") + private String ticketType; + + @Schema(description = "工单分类") + private String ticketCategory; + + @Schema(description = "优先级:urgent-紧急/high-高/normal-普通/low-低", defaultValue = "normal") + private String priority; + + @Schema(description = "工单标题") + private String title; + + @Schema(description = "问题描述") + private String description; + + @Schema(description = "附件ID数组") + private List attachments; + + @Schema(description = "工单来源:ai-AI生成/manual-人工创建/system-系统自动", defaultValue = "ai") + private String ticketSource; + + @Schema(description = "分配给(处理人)") + private String assignedTo; + + @Schema(description = "分配部门") + private String assignedDept; + + @Schema(description = "工单状态:pending-待处理/processing-处理中/resolved-已解决/closed-已关闭/cancelled-已取消", defaultValue = "pending") + private String ticketStatus; + + @Schema(description = "解决方案") + private String resolution; + + @Schema(description = "解决时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date resolutionTime; + + @Schema(description = "关闭时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date closeTime; + + @Schema(description = "首次响应时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date responseTime; + + @Schema(description = "SLA截止时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date slaDeadline; + + @Schema(description = "是否逾期", defaultValue = "false") + private Boolean isOverdue; + + @Schema(description = "客户评分(1-5星)") + private Integer customerRating; + + @Schema(description = "客户反馈") + private String customerFeedback; + + @Schema(description = "CRM系统工单ID") + private String crmTicketId; + + @Schema(description = "同步状态:pending-待同步/synced-已同步/failed-失败", defaultValue = "pending") + private String syncStatus; + + @Schema(description = "工单标签") + private List tags; + + @Schema(description = "工单元数据") + private JsonNode metadata; +} diff --git a/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/ConversationVO.java b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/ConversationVO.java new file mode 100644 index 0000000..8ed1393 --- /dev/null +++ b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/ConversationVO.java @@ -0,0 +1,108 @@ +package org.xyzh.api.workcase.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import com.fasterxml.jackson.databind.JsonNode; +import java.util.Date; +import java.util.List; + +/** + * 会话VO + * 用于前端展示会话信息 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "会话VO") +public class ConversationVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "会话ID") + private String conversationId; + + @Schema(description = "客户ID") + private String customerId; + + @Schema(description = "客户姓名") + private String customerName; + + @Schema(description = "客户头像") + private String customerAvatar; + + @Schema(description = "会话类型") + private String conversationType; + + @Schema(description = "会话类型名称") + private String conversationTypeName; + + @Schema(description = "渠道") + private String channel; + + @Schema(description = "渠道名称") + private String channelName; + + @Schema(description = "智能体ID或客服人员ID") + private String agentId; + + @Schema(description = "座席名称") + private String agentName; + + @Schema(description = "座席类型") + private String agentType; + + @Schema(description = "座席类型名称") + private String agentTypeName; + + @Schema(description = "会话开始时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date sessionStartTime; + + @Schema(description = "会话结束时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date sessionEndTime; + + @Schema(description = "会话时长(秒)") + private Integer durationSeconds; + + @Schema(description = "会话时长格式化显示") + private String durationFormatted; + + @Schema(description = "消息数量") + private Integer messageCount; + + @Schema(description = "会话状态") + private String conversationStatus; + + @Schema(description = "会话状态名称") + private String conversationStatusName; + + @Schema(description = "会话状态颜色") + private String statusColor; + + @Schema(description = "满意度评分(1-5星)") + private Integer satisfactionRating; + + @Schema(description = "满意度反馈") + private String satisfactionFeedback; + + @Schema(description = "会话摘要") + private String summary; + + @Schema(description = "会话标签") + private List tags; + + @Schema(description = "会话元数据") + private JsonNode metadata; + + @Schema(description = "最后一条消息内容") + private String lastMessageContent; + + @Schema(description = "最后一条消息时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date lastMessageTime; + + @Schema(description = "创建者姓名") + private String creatorName; +} diff --git a/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/CustomerVO.java b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/CustomerVO.java new file mode 100644 index 0000000..a413fa5 --- /dev/null +++ b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/CustomerVO.java @@ -0,0 +1,112 @@ +package org.xyzh.api.workcase.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 客户信息VO + * 用于前端展示客户信息 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "客户信息VO") +public class CustomerVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "客户ID") + private String customerId; + + @Schema(description = "客户编号") + private String customerNo; + + @Schema(description = "客户姓名") + private String customerName; + + @Schema(description = "客户类型") + private String customerType; + + @Schema(description = "客户类型名称") + private String customerTypeName; + + @Schema(description = "公司名称") + private String companyName; + + @Schema(description = "电话") + private String phone; + + @Schema(description = "邮箱") + private String email; + + @Schema(description = "微信OpenID") + private String wechatOpenid; + + @Schema(description = "头像URL") + private String avatar; + + @Schema(description = "性别") + private Integer gender; + + @Schema(description = "性别名称") + private String genderName; + + @Schema(description = "地址") + private String address; + + @Schema(description = "客户等级") + private String customerLevel; + + @Schema(description = "客户等级名称") + private String customerLevelName; + + @Schema(description = "客户来源") + private String customerSource; + + @Schema(description = "客户来源名称") + private String customerSourceName; + + @Schema(description = "客户标签") + private List tags; + + @Schema(description = "备注") + private String notes; + + @Schema(description = "CRM系统客户ID") + private String crmCustomerId; + + @Schema(description = "最后联系时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date lastContactTime; + + @Schema(description = "咨询总次数") + private Integer totalConsultations; + + @Schema(description = "订单总数") + private Integer totalOrders; + + @Schema(description = "总消费金额") + private BigDecimal totalAmount; + + @Schema(description = "满意度评分") + private BigDecimal satisfactionScore; + + @Schema(description = "状态") + private String status; + + @Schema(description = "状态名称") + private String statusName; + + @Schema(description = "状态颜色") + private String statusColor; + + @Schema(description = "创建者姓名") + private String creatorName; + + @Schema(description = "更新者姓名") + private String updaterName; +} diff --git a/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/TicketListVO.java b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/TicketListVO.java new file mode 100644 index 0000000..c33f7c0 --- /dev/null +++ b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/TicketListVO.java @@ -0,0 +1,59 @@ +package org.xyzh.api.workcase.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import java.util.Date; + +/** + * 工单列表VO + * 用于前端列表展示(简化版) + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "工单列表VO") +public class TicketListVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "工单ID") + private String ticketId; + + @Schema(description = "工单编号") + private String ticketNo; + + @Schema(description = "客户姓名") + private String customerName; + + @Schema(description = "工单标题") + private String title; + + @Schema(description = "工单类型名称") + private String ticketTypeName; + + @Schema(description = "优先级") + private String priority; + + @Schema(description = "优先级名称") + private String priorityName; + + @Schema(description = "工单状态") + private String ticketStatus; + + @Schema(description = "工单状态名称") + private String ticketStatusName; + + @Schema(description = "处理人姓名") + private String assignedToName; + + @Schema(description = "SLA截止时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date slaDeadline; + + @Schema(description = "是否逾期", defaultValue = "false") + private Boolean isOverdue; + + @Schema(description = "创建者姓名") + private String creatorName; +} diff --git a/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/TicketVO.java b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/TicketVO.java new file mode 100644 index 0000000..ec1e5c1 --- /dev/null +++ b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/TicketVO.java @@ -0,0 +1,151 @@ +package org.xyzh.api.workcase.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.xyzh.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import com.alibaba.fastjson2.annotation.JSONField; +import com.fasterxml.jackson.databind.JsonNode; +import java.util.Date; +import java.util.List; + +/** + * 工单VO + * 用于前端展示工单信息 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "工单VO") +public class TicketVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "工单ID") + private String ticketId; + + @Schema(description = "工单编号") + private String ticketNo; + + @Schema(description = "客户ID") + private String customerId; + + @Schema(description = "客户姓名") + private String customerName; + + @Schema(description = "客户电话") + private String customerPhone; + + @Schema(description = "关联会话ID") + private String conversationId; + + @Schema(description = "工单类型") + private String ticketType; + + @Schema(description = "工单类型名称") + private String ticketTypeName; + + @Schema(description = "工单分类") + private String ticketCategory; + + @Schema(description = "优先级") + private String priority; + + @Schema(description = "优先级名称") + private String priorityName; + + @Schema(description = "优先级颜色") + private String priorityColor; + + @Schema(description = "工单标题") + private String title; + + @Schema(description = "问题描述") + private String description; + + @Schema(description = "附件ID数组") + private List attachments; + + @Schema(description = "附件数量") + private Integer attachmentCount; + + @Schema(description = "工单来源") + private String ticketSource; + + @Schema(description = "工单来源名称") + private String ticketSourceName; + + @Schema(description = "分配给(处理人ID)") + private String assignedTo; + + @Schema(description = "处理人姓名") + private String assignedToName; + + @Schema(description = "分配部门") + private String assignedDept; + + @Schema(description = "分配部门名称") + private String assignedDeptName; + + @Schema(description = "工单状态") + private String ticketStatus; + + @Schema(description = "工单状态名称") + private String ticketStatusName; + + @Schema(description = "工单状态颜色") + private String statusColor; + + @Schema(description = "解决方案") + private String resolution; + + @Schema(description = "解决时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date resolutionTime; + + @Schema(description = "关闭时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date closeTime; + + @Schema(description = "首次响应时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date responseTime; + + @Schema(description = "SLA截止时间", format = "date-time") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date slaDeadline; + + @Schema(description = "是否逾期", defaultValue = "false") + private Boolean isOverdue; + + @Schema(description = "距离SLA截止的剩余时间(分钟)") + private Integer slaRemainingMinutes; + + @Schema(description = "客户评分(1-5星)") + private Integer customerRating; + + @Schema(description = "客户反馈") + private String customerFeedback; + + @Schema(description = "CRM系统工单ID") + private String crmTicketId; + + @Schema(description = "同步状态") + private String syncStatus; + + @Schema(description = "同步状态名称") + private String syncStatusName; + + @Schema(description = "工单标签") + private List tags; + + @Schema(description = "工单元数据") + private JsonNode metadata; + + @Schema(description = "处理记录数量") + private Integer logCount; + + @Schema(description = "创建者姓名") + private String creatorName; + + @Schema(description = "更新者姓名") + private String updaterName; +}