| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================================ |
| | | -- ç产订å宿´å é¤å½æ° |
| | | -- éç¨åºæ¯ï¼å¾
å¼å§ãè¿è¡ä¸ã已宿ä¸ç§ç¶æçç产订åå é¤ |
| | | -- çææ¥æï¼2026-06-11 |
| | | -- ============================================================ |
| | | |
| | | DELIMITER $$ |
| | | |
| | | DROP FUNCTION IF EXISTS fn_delete_production_order$$ |
| | | |
| | | CREATE FUNCTION fn_delete_production_order( |
| | | p_order_id BIGINT, |
| | | p_force_delete TINYINT DEFAULT 0 -- 0=å®å
¨æ¨¡å¼(å·²ç产ä¸å
许å é¤), 1=强å¶å é¤ |
| | | ) RETURNS VARCHAR(500) |
| | | DETERMINISTIC |
| | | READS SQL DATA |
| | | BEGIN |
| | | DECLARE v_order_status INT DEFAULT 0; |
| | | DECLARE v_complete_quantity DECIMAL(20,4) DEFAULT 0; |
| | | DECLARE v_quantity DECIMAL(20,4) DEFAULT 0; |
| | | DECLARE v_nps_no VARCHAR(100) DEFAULT ''; |
| | | DECLARE v_has_pick_record INT DEFAULT 0; |
| | | DECLARE v_has_product_main INT DEFAULT 0; |
| | | DECLARE v_has_quality_inspect INT DEFAULT 0; |
| | | DECLARE v_has_stock_record INT DEFAULT 0; |
| | | DECLARE v_deleted_count INT DEFAULT 0; |
| | | DECLARE v_result VARCHAR(500) DEFAULT ''; |
| | | |
| | | -- æ¥è¯¢è®¢ååºæ¬ä¿¡æ¯ |
| | | SELECT status, complete_quantity, quantity, nps_no |
| | | INTO v_order_status, v_complete_quantity, v_quantity, v_nps_no |
| | | FROM production_order |
| | | WHERE id = p_order_id; |
| | | |
| | | -- 订åä¸åå¨ |
| | | IF v_order_status IS NULL THEN |
| | | RETURN CONCAT('å é¤å¤±è´¥ï¼ç产订åä¸åå¨ï¼ID=', p_order_id); |
| | | END IF; |
| | | |
| | | -- å®å
¨æ¨¡å¼ä¸æ£æ¥æ¯å¦å
许å é¤ |
| | | IF p_force_delete = 0 THEN |
| | | -- ç¶ææ£æ¥ï¼åªæå¾
å¼å§(1)å已忶(4)å
许å é¤ |
| | | IF v_order_status = 2 THEN |
| | | RETURN CONCAT('å é¤å¤±è´¥ï¼è®¢å[', v_nps_no, ']æ£å¨è¿è¡ä¸ï¼ä¸å
许å é¤'); |
| | | END IF; |
| | | |
| | | IF v_order_status = 3 THEN |
| | | RETURN CONCAT('å é¤å¤±è´¥ï¼è®¢å[', v_nps_no, ']已宿ï¼ä¸å
许å é¤'); |
| | | END IF; |
| | | |
| | | IF v_order_status = 5 THEN |
| | | RETURN CONCAT('å é¤å¤±è´¥ï¼è®¢å[', v_nps_no, ']å·²ç»æï¼ä¸å
许å é¤'); |
| | | END IF; |
| | | END IF; |
| | | |
| | | -- ========== ç¬¬ä¸æ¥ï¼æ£æ¥å
³èæ°æ®æ¯å¦åå¨ ========== |
| | | |
| | | -- æ£æ¥é¢æè®°å½ |
| | | SELECT COUNT(*) INTO v_has_pick_record |
| | | FROM production_order_pick_record |
| | | WHERE production_order_id = p_order_id; |
| | | |
| | | -- æ£æ¥æ¥å·¥è®°å½ |
| | | SELECT COUNT(*) INTO v_has_product_main |
| | | FROM production_product_main ppm |
| | | INNER JOIN production_operation_task pot ON ppm.production_operation_task_id = pot.id |
| | | WHERE pot.production_order_id = p_order_id; |
| | | |
| | | -- æ£æ¥è´¨æ£è®°å½ |
| | | SELECT COUNT(*) INTO v_has_quality_inspect |
| | | FROM quality_inspect qi |
| | | INNER JOIN production_product_main ppm ON qi.product_main_id = ppm.id |
| | | INNER JOIN production_operation_task pot ON ppm.production_operation_task_id = pot.id |
| | | WHERE pot.production_order_id = p_order_id; |
| | | |
| | | -- æ£æ¥åºåè®°å½ï¼éè¿æ¥å·¥å
¥åºï¼ |
| | | SELECT COUNT(*) INTO v_has_stock_record |
| | | FROM stock_in_record sir |
| | | INNER JOIN production_product_main ppm ON sir.record_id = ppm.id |
| | | INNER JOIN production_operation_task pot ON ppm.production_operation_task_id = pot.id |
| | | WHERE pot.production_order_id = p_order_id |
| | | AND sir.record_type IN ('2', '5'); -- ç产æ¥å·¥å
¥åº |
| | | |
| | | -- ========== ç¬¬äºæ¥ï¼å é¤å
³èæ°æ®ï¼ä»å¶åå°æ ¹ï¼ ========== |
| | | |
| | | -- ã第1å±ãå é¤è´¨æ£éä»¶ |
| | | DELETE FROM quality_inspect_file |
| | | WHERE inspect_id IN ( |
| | | SELECT qi.id FROM quality_inspect qi |
| | | INNER JOIN production_product_main ppm ON qi.product_main_id = ppm.id |
| | | INNER JOIN production_operation_task pot ON ppm.production_operation_task_id = pot.id |
| | | WHERE pot.production_order_id = p_order_id |
| | | ); |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第2å±ãå é¤è´¨æ£åæ° |
| | | DELETE FROM quality_inspect_param |
| | | WHERE inspect_id IN ( |
| | | SELECT qi.id FROM quality_inspect qi |
| | | INNER JOIN production_product_main ppm ON qi.product_main_id = ppm.id |
| | | INNER JOIN production_operation_task pot ON ppm.production_operation_task_id = pot.id |
| | | WHERE pot.production_order_id = p_order_id |
| | | ); |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第3å±ãå é¤ä¸åæ ¼åè®°å½ |
| | | DELETE FROM quality_unqualified |
| | | WHERE inspect_id IN ( |
| | | SELECT qi.id FROM quality_inspect qi |
| | | INNER JOIN production_product_main ppm ON qi.product_main_id = ppm.id |
| | | INNER JOIN production_operation_task pot ON ppm.production_operation_task_id = pot.id |
| | | WHERE pot.production_order_id = p_order_id |
| | | ); |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第4å±ãå é¤è´¨æ£è®°å½ï¼è¿ç¨æ£éªãåºåæ£éªï¼ |
| | | DELETE FROM quality_inspect |
| | | WHERE product_main_id IN ( |
| | | SELECT ppm.id FROM production_product_main ppm |
| | | INNER JOIN production_operation_task pot ON ppm.production_operation_task_id = pot.id |
| | | WHERE pot.production_order_id = p_order_id |
| | | ); |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第5å±ãå é¤åºåå
¥åºè®°å½ï¼ç产æ¥å·¥å
¥åºãæ¥åºå
¥åºï¼ |
| | | DELETE FROM stock_in_record |
| | | WHERE record_id IN ( |
| | | SELECT ppm.id FROM production_product_main ppm |
| | | INNER JOIN production_operation_task pot ON ppm.production_operation_task_id = pot.id |
| | | WHERE pot.production_order_id = p_order_id |
| | | ) AND record_type IN ('2', '5', '7'); -- ç产æ¥å·¥å
¥åºãæ¥åºå
¥åº |
| | | |
| | | -- å é¤è´¨æ£å
¥åºè®°å½ |
| | | DELETE FROM stock_in_record |
| | | WHERE record_id IN ( |
| | | SELECT qi.id FROM quality_inspect qi |
| | | INNER JOIN production_product_main ppm ON qi.product_main_id = ppm.id |
| | | INNER JOIN production_operation_task pot ON ppm.production_operation_task_id = pot.id |
| | | WHERE pot.production_order_id = p_order_id |
| | | ) AND record_type = '6'; -- è´¨æ£å
¥åº |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第6å±ãå é¤åºååºåºè®°å½ï¼ç产æ¥å·¥åºåºï¼ |
| | | DELETE FROM stock_out_record |
| | | WHERE record_id IN ( |
| | | SELECT ppm.id FROM production_product_main ppm |
| | | INNER JOIN production_operation_task pot ON ppm.production_operation_task_id = pot.id |
| | | WHERE pot.production_order_id = p_order_id |
| | | ) AND record_type = '13'; -- ç产æ¥å·¥åºåº |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第7å±ãå 餿¥å·¥äº§åº |
| | | DELETE FROM production_product_output |
| | | WHERE production_product_main_id IN ( |
| | | SELECT ppm.id FROM production_product_main ppm |
| | | INNER JOIN production_operation_task pot ON ppm.production_operation_task_id = pot.id |
| | | WHERE pot.production_order_id = p_order_id |
| | | ); |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第8å±ãå 餿¥å·¥æå
¥ |
| | | DELETE FROM production_product_input |
| | | WHERE production_product_main_id IN ( |
| | | SELECT ppm.id FROM production_product_main ppm |
| | | INNER JOIN production_operation_task pot ON ppm.production_operation_task_id = pot.id |
| | | WHERE pot.production_order_id = p_order_id |
| | | ); |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第9å±ãå é¤çäº§æ ¸ç® |
| | | DELETE FROM production_account |
| | | WHERE production_product_main_id IN ( |
| | | SELECT ppm.id FROM production_product_main ppm |
| | | INNER JOIN production_operation_task pot ON ppm.production_operation_task_id = pot.id |
| | | WHERE pot.production_order_id = p_order_id |
| | | ); |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第10å±ãå 餿¥å·¥å·¥åºåæ°ï¼éè¿production_product_main_idå
³èï¼ |
| | | DELETE FROM production_order_routing_operation_param |
| | | WHERE production_product_main_id IN ( |
| | | SELECT ppm.id FROM production_product_main ppm |
| | | INNER JOIN production_operation_task pot ON ppm.production_operation_task_id = pot.id |
| | | WHERE pot.production_order_id = p_order_id |
| | | ); |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第11å±ãå 餿¥å·¥ä¸»è¡¨ |
| | | DELETE FROM production_product_main |
| | | WHERE production_operation_task_id IN ( |
| | | SELECT id FROM production_operation_task |
| | | WHERE production_order_id = p_order_id |
| | | ); |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第12å±ãå é¤é¢æè®°å½ |
| | | DELETE FROM production_order_pick_record |
| | | WHERE production_order_id = p_order_id; |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第13å±ãå é¤é¢æå
¥åºè®°å½ï¼éæï¼ |
| | | DELETE FROM stock_in_record |
| | | WHERE record_id IN ( |
| | | SELECT id FROM production_order_pick |
| | | WHERE production_order_id = p_order_id |
| | | ) AND record_type IN ('20', '22'); -- 颿éæå
¥åº |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第14å±ãå é¤é¢æå |
| | | DELETE FROM production_order_pick |
| | | WHERE production_order_id = p_order_id; |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第15å±ãå é¤ç产工å |
| | | DELETE FROM production_operation_task |
| | | WHERE production_order_id = p_order_id; |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第16å±ãå é¤å·¥åºåæ°ï¼è®¢å级å«ï¼ |
| | | DELETE FROM production_order_routing_operation_param |
| | | WHERE production_order_id = p_order_id; |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第17å±ãå é¤å·¥åº |
| | | DELETE FROM production_order_routing_operation |
| | | WHERE production_order_id = p_order_id; |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第18å±ãå é¤å·¥èºè·¯çº¿ |
| | | DELETE FROM production_order_routing |
| | | WHERE production_order_id = p_order_id; |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第19å±ãå é¤BOMç»æ |
| | | DELETE FROM production_bom_structure |
| | | WHERE production_order_id = p_order_id; |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第20å±ãå é¤è®¢åBOM |
| | | DELETE FROM production_order_bom |
| | | WHERE production_order_id = p_order_id; |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- ã第21å±ãå é¤ç产计åå
³èï¼åé计åå·²ä¸åæ°éï¼ |
| | | -- 注æï¼è¿ééè¦æ ¹æ®ä¸å¡é»è¾åéproduction_plançquantity_issuedåstatus |
| | | -- ç±äºproduction_plan_idsæ¯JSONæ ¼å¼[1,2,3]ï¼éè¦ç¹æ®å¤ç |
| | | -- æ¤å¤ä»
å é¤è®¢åï¼è®¡ååéé»è¾å»ºè®®å¨åºç¨å±å¤ç |
| | | |
| | | -- ã第22å±ãå é¤ç产订å主表 |
| | | DELETE FROM production_order |
| | | WHERE id = p_order_id; |
| | | SET v_deleted_count = v_deleted_count + ROW_COUNT(); |
| | | |
| | | -- è¿åç»æ |
| | | SET v_result = CONCAT( |
| | | 'å 餿åï¼è®¢å[', v_nps_no, ']ï¼', |
| | | 'ç¶æ=', CASE v_order_status |
| | | WHEN 1 THEN 'å¾
å¼å§' |
| | | WHEN 2 THEN 'è¿è¡ä¸' |
| | | WHEN 3 THEN '已宿' |
| | | WHEN 4 THEN '已忶' |
| | | WHEN 5 THEN 'å·²ç»æ' |
| | | ELSE 'æªç¥' |
| | | END, 'ï¼', |
| | | 'å
±å é¤', v_deleted_count, 'æ¡å
³èæ°æ®' |
| | | ); |
| | | |
| | | RETURN v_result; |
| | | |
| | | END$$ |
| | | |
| | | DELIMITER ; |
| | | |
| | | -- ============================================================ |
| | | -- æ¹éå é¤ç产订ååå¨è¿ç¨ |
| | | -- ============================================================ |
| | | |
| | | DELIMITER $$ |
| | | |
| | | DROP PROCEDURE IF EXISTS sp_batch_delete_production_order$$ |
| | | |
| | | CREATE PROCEDURE sp_batch_delete_production_order( |
| | | IN p_order_ids TEXT, -- 订åIDå表ï¼éå·åéï¼å¦ "1,2,3" |
| | | IN p_force_delete TINYINT -- 0=å®å
¨æ¨¡å¼, 1=强å¶å é¤ |
| | | ) |
| | | BEGIN |
| | | DECLARE v_order_id BIGINT; |
| | | DECLARE v_done INT DEFAULT FALSE; |
| | | DECLARE v_cursor CURSOR FOR |
| | | SELECT CAST(TRIM(value) AS UNSIGNED) |
| | | FROM JSON_TABLE(CONCAT('[', p_order_ids, ']'), '$[*]' COLUMNS(value VARCHAR(20) PATH '$')) AS jt; |
| | | DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE; |
| | | |
| | | DECLARE v_success_count INT DEFAULT 0; |
| | | DECLARE v_fail_count INT DEFAULT 0; |
| | | DECLARE v_result_msg VARCHAR(500); |
| | | |
| | | -- å建临æ¶è¡¨è®°å½ç»æ |
| | | DROP TEMPORARY TABLE IF EXISTS tmp_delete_result; |
| | | CREATE TEMPORARY TABLE tmp_delete_result ( |
| | | order_id BIGINT, |
| | | result VARCHAR(500) |
| | | ); |
| | | |
| | | OPEN v_cursor; |
| | | |
| | | read_loop: LOOP |
| | | FETCH v_cursor INTO v_order_id; |
| | | IF v_done THEN |
| | | LEAVE read_loop; |
| | | END IF; |
| | | |
| | | -- è°ç¨å é¤å½æ° |
| | | SET v_result_msg = fn_delete_production_order(v_order_id, p_force_delete); |
| | | |
| | | -- è®°å½ç»æ |
| | | INSERT INTO tmp_delete_result (order_id, result) VALUES (v_order_id, v_result_msg); |
| | | |
| | | -- ç»è®¡ |
| | | IF v_result_msg LIKE 'å 餿å%' THEN |
| | | SET v_success_count = v_success_count + 1; |
| | | ELSE |
| | | SET v_fail_count = v_fail_count + 1; |
| | | END IF; |
| | | |
| | | END LOOP; |
| | | |
| | | CLOSE v_cursor; |
| | | |
| | | -- è¾åºç»æ |
| | | SELECT |
| | | CONCAT('æ¹éå é¤å®æï¼æå', v_success_count, '个ï¼å¤±è´¥', v_fail_count, '个') AS summary; |
| | | |
| | | SELECT * FROM tmp_delete_result; |
| | | |
| | | DROP TEMPORARY TABLE IF EXISTS tmp_delete_result; |
| | | |
| | | END$$ |
| | | |
| | | DELIMITER ; |
| | | |
| | | -- ============================================================ |
| | | -- 使ç¨ç¤ºä¾ |
| | | -- ============================================================ |
| | | |
| | | -- 示ä¾1ï¼å®å
¨æ¨¡å¼å é¤å个订åï¼åªè½å é¤å¾
å¼å§/å·²åæ¶ç¶æï¼ |
| | | -- SELECT fn_delete_production_order(123, 0); |
| | | |
| | | -- 示ä¾2ï¼å¼ºå¶å é¤å个订åï¼å¿½ç¥ç¶ææ£æ¥ï¼ |
| | | -- SELECT fn_delete_production_order(123, 1); |
| | | |
| | | -- 示ä¾3ï¼æ¹éå é¤è®¢å |
| | | -- CALL sp_batch_delete_production_order('123,124,125', 0); |
| | | |
| | | -- 示ä¾4ï¼æ¹é强å¶å é¤ |
| | | -- CALL sp_batch_delete_production_order('123,124,125', 1); |