feat(aftersales): 工单客户/联系人/物料/批次改为文本 + 问题库/回访 SQL
- 工单:客户/联系人 改存文本(customer_name/contact_name),外键列改可空;明细 物料/批次 改文本,明细外键列改可空
- 新增 SQL:问题库/回访表(after_sale_problem/after_sale_visit)、工单回访/沉淀列、问题库菜单(602710)
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- å®åï¼é®é¢åº + å访ï¼å¯é夿§è¡ï¼ |
| | | -- å«ï¼after_sale_ticket å 6 åãafter_sale_problem / after_sale_visit 建表ãé®é¢åºèåï¼ç©ºé² id 602710-602716ï¼ |
| | | -- ============================================= |
| | | |
| | | -- 1. after_sale_ticket å å访/æ²æ·ç¸å
³å |
| | | SET @c := (SELECT COUNT(*) FROM information_schema.COLUMNS |
| | | WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'after_sale_ticket' AND COLUMN_NAME = 'visit_status'); |
| | | SET @ddl := IF(@c = 0, |
| | | 'ALTER TABLE `after_sale_ticket` |
| | | ADD COLUMN `visit_status` tinyint NULL COMMENT ''åè®¿ç¶æ: 0-å¾
å访 1-å·²å访éè¿'' AFTER `closed_time`, |
| | | ADD COLUMN `last_visit_time` datetime NULL COMMENT ''æè¿ä¸æ¬¡å访æ¶é´'' AFTER `visit_status`, |
| | | ADD COLUMN `last_visit_satisfied` bit(1) NULL COMMENT ''æè¿ä¸æ¬¡å访æ¯å¦æ»¡æ'' AFTER `last_visit_time`, |
| | | ADD COLUMN `last_visit_recurred` bit(1) NULL COMMENT ''æè¿ä¸æ¬¡å访é®é¢æ¯å¦å¤å'' AFTER `last_visit_satisfied`, |
| | | ADD COLUMN `problem_id` bigint NULL COMMENT ''æ²æ·é®é¢ç¼å·'' AFTER `last_visit_recurred`, |
| | | ADD COLUMN `problem_no` varchar(64) NULL COMMENT ''æ²æ·é®é¢åå·'' AFTER `problem_id`', |
| | | 'SELECT 1'); |
| | | PREPARE s FROM @ddl; EXECUTE s; DEALLOCATE PREPARE s; |
| | | |
| | | -- 2. é®é¢åºè¡¨ |
| | | CREATE TABLE IF NOT EXISTS `after_sale_problem` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'é®é¢ç¼å·', |
| | | `no` varchar(64) DEFAULT NULL COMMENT 'é®é¢åå· AP+yyyyMMdd+6ä½', |
| | | `title` varchar(255) DEFAULT NULL COMMENT 'é®é¢æ é¢', |
| | | `source_ticket_id` bigint DEFAULT NULL COMMENT 'æ¥æºå·¥åç¼å·', |
| | | `source_ticket_no` varchar(64) DEFAULT NULL COMMENT 'æ¥æºå·¥ååå·', |
| | | `customer_id` bigint DEFAULT NULL COMMENT '客æ·ç¼å·', |
| | | `item_id` bigint DEFAULT NULL COMMENT 'ç©æç¼å·', |
| | | `item_code` varchar(64) DEFAULT NULL COMMENT 'ç©æç¼ç ', |
| | | `item_name` varchar(255) DEFAULT NULL COMMENT 'ç©æåç§°', |
| | | `batch_id` bigint DEFAULT NULL COMMENT 'çäº§æ¹æ¬¡ç¼å·', |
| | | `batch_code` varchar(64) DEFAULT NULL COMMENT 'çäº§æ¹æ¬¡å·', |
| | | `issue_type` tinyint DEFAULT NULL COMMENT 'é®é¢ç±»å', |
| | | `issue_category` varchar(64) DEFAULT NULL COMMENT 'é®é¢åç±»', |
| | | `severity_level` tinyint DEFAULT NULL COMMENT '严éç¨åº¦', |
| | | `description` varchar(1000) DEFAULT NULL COMMENT 'é®é¢æè¿°', |
| | | `root_cause_category` tinyint DEFAULT NULL COMMENT 'æ ¹å åç±»', |
| | | `root_cause` text COMMENT 'æ ¹å åæ', |
| | | `solution` text COMMENT 'è§£å³æ¹æ¡', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æ', |
| | | `owner_user_id` bigint DEFAULT NULL COMMENT 'æ²æ·äººç¨æ·ç¼å·', |
| | | `publish_time` datetime DEFAULT NULL COMMENT 'å叿¶é´', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), KEY `idx_source_ticket` (`source_ticket_id`), KEY `idx_item` (`item_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='å®åé®é¢åºè¡¨'; |
| | | |
| | | -- 3. å访记å½è¡¨ |
| | | CREATE TABLE IF NOT EXISTS `after_sale_visit` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'å访记å½ç¼å·', |
| | | `ticket_id` bigint DEFAULT NULL COMMENT 'å·¥åç¼å·', |
| | | `visit_type` tinyint DEFAULT NULL COMMENT 'å访æ¹å¼: 0-çµè¯ 1-ä¸é¨ 2-è¿ç¨ 3-å
¶ä»', |
| | | `visitor_user_id` bigint DEFAULT NULL COMMENT 'åè®¿äººç¨æ·ç¼å·', |
| | | `content` varchar(1000) DEFAULT NULL COMMENT 'å访å
容', |
| | | `is_satisfied` bit(1) DEFAULT NULL COMMENT 'æ¯å¦æ»¡æ', |
| | | `is_recurred` bit(1) DEFAULT NULL COMMENT 'é®é¢æ¯å¦å¤å', |
| | | `visit_time` datetime DEFAULT NULL COMMENT 'å访æ¶é´', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), KEY `idx_ticket` (`ticket_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='å®åå访记å½è¡¨'; |
| | | |
| | | -- 4. é®é¢åºèåï¼æ 602587 å®å管ç ä¸ï¼ç©ºé² id 602710-602716ï¼ |
| | | INSERT INTO `system_menu` |
| | | (`id`,`name`,`permission`,`type`,`sort`,`parent_id`,`path`,`icon`,`component`,`component_name`,`status`,`visible`,`keep_alive`,`always_show`,`creator`,`create_time`,`updater`,`update_time`,`deleted`) |
| | | VALUES |
| | | (602710,'é®é¢åº','',2,3,602587,'problem','ep:collection','/aftersales/problem/index','AfterSaleProblem',0,b'1',b'1',b'1','1',NOW(),'1',NOW(),b'0'), |
| | | (602711,'é®é¢åºæ¥è¯¢','aftersales:problem:query',3,1,602710,'','','',NULL,0,b'1',b'1',b'1','1',NOW(),'1',NOW(),b'0'), |
| | | (602712,'é®é¢åºå建','aftersales:problem:create',3,2,602710,'','','',NULL,0,b'1',b'1',b'1','1',NOW(),'1',NOW(),b'0'), |
| | | (602713,'é®é¢åºæ´æ°','aftersales:problem:update',3,3,602710,'','','',NULL,0,b'1',b'1',b'1','1',NOW(),'1',NOW(),b'0'), |
| | | (602714,'é®é¢åºå é¤','aftersales:problem:delete',3,4,602710,'','','',NULL,0,b'1',b'1',b'1','1',NOW(),'1',NOW(),b'0'), |
| | | (602715,'é®é¢åºåå¸','aftersales:problem:publish',3,5,602710,'','','',NULL,0,b'1',b'1',b'1','1',NOW(),'1',NOW(),b'0'), |
| | | (602716,'é®é¢åºåç¨','aftersales:problem:disable',3,6,602710,'','','',NULL,0,b'1',b'1',b'1','1',NOW(),'1',NOW(),b'0') |
| | | ON DUPLICATE KEY UPDATE `name`=VALUES(`name`),`permission`=VALUES(`permission`),`type`=VALUES(`type`),`parent_id`=VALUES(`parent_id`),`path`=VALUES(`path`),`component`=VALUES(`component`),`component_name`=VALUES(`component_name`),`status`=VALUES(`status`),`deleted`=b'0'; |
| | | |
| | | INSERT INTO `system_role_menu` (`role_id`,`menu_id`,`creator`,`create_time`,`updater`,`update_time`,`deleted`) |
| | | SELECT 1, m.menu_id, '1', NOW(), '1', NOW(), b'0' |
| | | FROM (SELECT 602710 AS menu_id UNION ALL SELECT 602711 UNION ALL SELECT 602712 UNION ALL SELECT 602713 UNION ALL SELECT 602714 UNION ALL SELECT 602715 UNION ALL SELECT 602716) m |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_role_menu` rm WHERE rm.`role_id`=1 AND rm.`menu_id`=m.menu_id AND rm.`deleted`=b'0'); |
| | | |
| | | SELECT 'å®åé®é¢åº/å访åå§å宿' AS result; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- å®åå·¥åï¼å®¢æ·/è系人/ç©æ/æ¹æ¬¡ æ¹ä¸ºææ¬åå¨ + å
åºè¡¥é½å·¥åæé®æéï¼å¯é夿§è¡ï¼ |
| | | -- ============================================= |
| | | SET @c1 := (SELECT COUNT(*) FROM information_schema.COLUMNS |
| | | WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'after_sale_ticket' AND COLUMN_NAME = 'customer_name'); |
| | | SET @ddl1 := IF(@c1 = 0, |
| | | 'ALTER TABLE `after_sale_ticket` ADD COLUMN `customer_name` varchar(255) NULL COMMENT ''客æ·åç§°(ææ¬)'' AFTER `customer_id`', |
| | | 'SELECT 1'); |
| | | PREPARE s1 FROM @ddl1; EXECUTE s1; DEALLOCATE PREPARE s1; |
| | | |
| | | SET @c2 := (SELECT COUNT(*) FROM information_schema.COLUMNS |
| | | WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'after_sale_ticket' AND COLUMN_NAME = 'contact_name'); |
| | | SET @ddl2 := IF(@c2 = 0, |
| | | 'ALTER TABLE `after_sale_ticket` ADD COLUMN `contact_name` varchar(255) NULL COMMENT ''è系人(ææ¬)'' AFTER `contact_id`', |
| | | 'SELECT 1'); |
| | | PREPARE s2 FROM @ddl2; EXECUTE s2; DEALLOCATE PREPARE s2; |
| | | |
| | | -- 客æ·/è系人æ¹ä¸ºææ¬åï¼åå¤é®åå
许为空 |
| | | ALTER TABLE `after_sale_ticket` MODIFY COLUMN `customer_id` bigint NULL COMMENT '客æ·ç¼å·(å¯é)'; |
| | | ALTER TABLE `after_sale_ticket` MODIFY COLUMN `contact_id` bigint NULL COMMENT 'è系人ç¼å·(å¯é)'; |
| | | |
| | | -- ç©æ/æ¹æ¬¡æ¹ä¸ºææ¬åï¼æç»åå¤é®åå
许为空 |
| | | ALTER TABLE `after_sale_ticket_item` MODIFY COLUMN `sale_order_item_id` bigint NULL COMMENT 'éå®è®¢åè¡(å¯é)'; |
| | | ALTER TABLE `after_sale_ticket_item` MODIFY COLUMN `item_id` bigint NULL COMMENT 'MDMç©æç¼å·(å¯é)'; |
| | | ALTER TABLE `after_sale_ticket_item` MODIFY COLUMN `batch_id` bigint NULL COMMENT 'æ¹æ¬¡ç¼å·(å¯é)'; |
| | | |
| | | -- å
åºï¼å·¥åæé®æéï¼ä»
å½è¯¥æéä¸å卿¶ææå
¥ï¼é¿å
ä¸å·²æèåéå¤/æ idï¼ |
| | | INSERT INTO `system_menu` |
| | | (`id`,`name`,`permission`,`type`,`sort`,`parent_id`,`path`,`icon`,`component`,`component_name`,`status`,`visible`,`keep_alive`,`always_show`,`creator`,`create_time`,`updater`,`update_time`,`deleted`) |
| | | SELECT 602700,'å®å工忰å¢','aftersales:ticket:create',3,1,602588,'','','',NULL,0,b'1',b'1',b'1','1',NOW(),'1',NOW(),b'0' |
| | | FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `system_menu` WHERE `permission`='aftersales:ticket:create' AND `deleted`=b'0'); |
| | | INSERT INTO `system_menu` |
| | | (`id`,`name`,`permission`,`type`,`sort`,`parent_id`,`path`,`icon`,`component`,`component_name`,`status`,`visible`,`keep_alive`,`always_show`,`creator`,`create_time`,`updater`,`update_time`,`deleted`) |
| | | SELECT 602701,'å®åå·¥åç¼è¾','aftersales:ticket:update',3,2,602588,'','','',NULL,0,b'1',b'1',b'1','1',NOW(),'1',NOW(),b'0' |
| | | FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `system_menu` WHERE `permission`='aftersales:ticket:update' AND `deleted`=b'0'); |
| | | INSERT INTO `system_menu` |
| | | (`id`,`name`,`permission`,`type`,`sort`,`parent_id`,`path`,`icon`,`component`,`component_name`,`status`,`visible`,`keep_alive`,`always_show`,`creator`,`create_time`,`updater`,`update_time`,`deleted`) |
| | | SELECT 602702,'å®åå·¥åå é¤','aftersales:ticket:delete',3,3,602588,'','','',NULL,0,b'1',b'1',b'1','1',NOW(),'1',NOW(),b'0' |
| | | FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `system_menu` WHERE `permission`='aftersales:ticket:delete' AND `deleted`=b'0'); |
| | | INSERT INTO `system_menu` |
| | | (`id`,`name`,`permission`,`type`,`sort`,`parent_id`,`path`,`icon`,`component`,`component_name`,`status`,`visible`,`keep_alive`,`always_show`,`creator`,`create_time`,`updater`,`update_time`,`deleted`) |
| | | SELECT 602703,'å®åå·¥åæ¥è¯¢','aftersales:ticket:query',3,4,602588,'','','',NULL,0,b'1',b'1',b'1','1',NOW(),'1',NOW(),b'0' |
| | | FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `system_menu` WHERE `permission`='aftersales:ticket:query' AND `deleted`=b'0'); |
| | | |
| | | -- å
åºæé® ææç»è¶
管 |
| | | INSERT INTO `system_role_menu` (`role_id`,`menu_id`,`creator`,`create_time`,`updater`,`update_time`,`deleted`) |
| | | SELECT 1, m.menu_id, '1', NOW(), '1', NOW(), b'0' |
| | | FROM (SELECT 602700 AS menu_id UNION ALL SELECT 602701 UNION ALL SELECT 602702 UNION ALL SELECT 602703) m |
| | | WHERE EXISTS (SELECT 1 FROM `system_menu` sm WHERE sm.`id`=m.menu_id) |
| | | AND NOT EXISTS (SELECT 1 FROM `system_role_menu` rm WHERE rm.`role_id`=1 AND rm.`menu_id`=m.menu_id AND rm.`deleted`=b'0'); |
| | | |
| | | SELECT 'å®å工忿¬å段åå§å宿' AS result; |
| | |
| | | @NotEmpty(message = "å·¥å主é¢ä¸è½ä¸ºç©º") |
| | | private String name; |
| | | |
| | | @Schema(description = "客æ·ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "客æ·ä¸è½ä¸ºç©º") |
| | | @Schema(description = "客æ·ç¼å·", example = "1") |
| | | private Long customerId; |
| | | |
| | | @Schema(description = "客æ·åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "ææå
¬å¸") |
| | | @NotEmpty(message = "客æ·ä¸è½ä¸ºç©º") |
| | | private String customerName; |
| | | |
| | | @Schema(description = "è系人ç¼å·", example = "1") |
| | | private Long contactId; |
| | | |
| | | @Schema(description = "è系人", example = "æå") |
| | | private String contactName; |
| | | |
| | | @Schema(description = "éå®è®¢åç¼å·", example = "1") |
| | | private Long saleOrderId; |
| | |
| | | @Schema(description = "éå®è®¢åè¡ç¼å·", example = "1") |
| | | private Long saleOrderItemId; |
| | | |
| | | @Schema(description = "MDMç©æç¼å·", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "ç©æä¸è½ä¸ºç©º") |
| | | @Schema(description = "MDMç©æç¼å·", example = "1") |
| | | private Long itemId; |
| | | |
| | | @Schema(description = "ç©æç¼ç ", example = "MAT-001") |
| | | private String itemCode; |
| | | |
| | | @Schema(description = "ç©æåç§°", example = "çµåå
å¨ä»¶") |
| | | @Schema(description = "ç©æåç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "çµåå
å¨ä»¶") |
| | | @NotEmpty(message = "ç©æä¸è½ä¸ºç©º") |
| | | private String itemName; |
| | | |
| | | @Schema(description = "çäº§æ¹æ¬¡ç¼å·", example = "1") |
| | |
| | | */ |
| | | private Long customerId; |
| | | /** |
| | | * 客æ·åç§°(ææ¬ï¼å¯èªç±å¡«å) |
| | | */ |
| | | private String customerName; |
| | | /** |
| | | * è系人ç¼å·ï¼å
³è crm_contact.id |
| | | */ |
| | | private Long contactId; |
| | | /** |
| | | * è系人(ææ¬ï¼å¯èªç±å¡«å) |
| | | */ |
| | | private String contactName; |
| | | /** |
| | | * éå®è®¢åç¼å·ï¼å
³è erp_sale_order.id |
| | | */ |
| | | private Long saleOrderId; |