| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================================ |
| | | -- éä»¶æ°æ®è¿ç§»èæ¬ï¼ä» common_file è¿ç§»å° storage_blob + storage_attachment |
| | | -- æ§è¡å请å¤ä»½æ°æ®ï¼ |
| | | -- ============================================================ |
| | | |
| | | -- 说æï¼ |
| | | -- 1. common_file è¡¨ï¼æ§é件表ï¼å
å«æä»¶ä¿¡æ¯ |
| | | -- 2. storage_blob è¡¨ï¼æ°æä»¶å®ä½è¡¨ï¼å卿件å
ä¿¡æ¯ |
| | | -- 3. storage_attachment è¡¨ï¼æ°éä»¶å
³è表ï¼å
³èä¸å¡è®°å½ä¸æä»¶ |
| | | |
| | | -- æ§è¡¨å段说æï¼ |
| | | -- common_file.id - 主é®ID |
| | | -- common_file.common_id - å
³èä¸å¡ID |
| | | -- common_file.name - æä»¶åç§° |
| | | -- common_file.url - æä»¶è·¯å¾ |
| | | -- common_file.type - ä¸å¡ç±»åï¼æ´æ°æä¸¾ï¼ |
| | | -- common_file.file_size - æä»¶å¤§å° |
| | | -- common_file.create_time, update_time, create_user, dept_id |
| | | |
| | | -- æ°è¡¨å段说æï¼ |
| | | -- storage_blob.id - 主é®ID |
| | | -- storage_blob.resource_key - èµæºå¯ä¸æ è¯ï¼å¯ç¨åIDæUUIDï¼ |
| | | -- storage_blob.content_type - MIMEç±»åï¼éæ ¹æ®æä»¶æ©å±åæ¨æï¼ |
| | | -- storage_blob.original_filename- åå§æä»¶å |
| | | -- storage_blob.uid_filename - å¯ä¸æä»¶åï¼å¯ç¨ånameæçæï¼ |
| | | -- storage_blob.byte_size - æä»¶å¤§å° |
| | | -- storage_blob.path - æä»¶è·¯å¾ |
| | | |
| | | -- storage_attachment.id - 主é®ID |
| | | -- storage_attachment.record_type- è®°å½ç±»åï¼å符串æä¸¾ï¼ |
| | | -- storage_attachment.record_id - å
³èä¸å¡ID |
| | | -- storage_attachment.application- æä»¶ç¨éï¼é»è®¤ 'file'ï¼ |
| | | -- storage_attachment.storage_blob_id - å
³è storage_blob.id |
| | | -- storage_attachment.deleted - é»è¾å 餿 è®° |
| | | -- storage_attachment.create_time, update_time |
| | | |
| | | -- ============================================================ |
| | | -- ç±»åæ å°ï¼æ§ type(int) -> æ° record_type(string) |
| | | -- æ ¹æ® FileNameType æä¸¾å®ä¹æ å°å
³ç³» |
| | | -- ============================================================ |
| | | |
| | | -- æ§ç±»åæä¸¾å¼ï¼ |
| | | -- 1 = SALE (éå®) |
| | | -- 2 = PURCHASE (éè´) |
| | | -- 3 = INVOICE (å票) |
| | | -- 4 = PURCHASELEDGER (éè´å°è´¦) |
| | | -- 5 = MEASURING (计éå¨å
·å°è´¦) |
| | | -- 6 = MEASURINGRecord (计éå¨å
·å°è´¦è®°å½) |
| | | -- 7 = ApproveNode (åå审æ¹èç¹å®¡æ ¸) |
| | | -- 8 = ApproveProcess (åå审æ¹ä¸»æ°æ®) |
| | | -- 9 = SHIP (åè´§å°è´¦) |
| | | -- 10 = INSPECTION_PRODUCTION_BEFORE (ç产åå·¡æ£) |
| | | -- 11 = INSPECTION_PRODUCTION_AFTER (ç产åå·¡æ£) |
| | | -- 12 = INSPECTION (å·¡æ£) |
| | | -- 13 = APP |
| | | |
| | | -- æ°ç±»å对åºç record_type åç¬¦ä¸²ï¼æ ¹æ® RecordTypeEnum æ¨æï¼ï¼ |
| | | -- 1 -> 'sales_ledger' |
| | | -- 2 -> 'purchase_ledger' |
| | | -- 3 -> 'invoice_ledger' |
| | | -- 4 -> 'purchase_ledger_file' |
| | | -- 5 -> 'measuring_instrument_ledger' |
| | | -- 6 -> 'measuring_instrument_ledger_record' |
| | | -- 7 -> 'approve_node' |
| | | -- 8 -> 'approve_process' |
| | | -- 9 -> 'shipping_info' |
| | | -- 10 -> 'inspection_task' |
| | | -- 11 -> 'inspection_task' |
| | | -- 12 -> 'inspection_task' |
| | | -- 13 -> 'common_file'ï¼éç¨ç±»åå
åºï¼ |
| | | |
| | | -- ============================================================ |
| | | -- æ¥éª¤1ï¼è¿ç§»æä»¶æ°æ®å° storage_blob |
| | | -- 注æï¼byte_size å
ä½¿ç¨ common_file.file_sizeï¼åç»éè¦å¨æå¡å¨ä¸æ´æ°å®é
å¤§å° |
| | | -- ============================================================ |
| | | |
| | | INSERT INTO storage_blob ( |
| | | resource_key, |
| | | content_type, |
| | | original_filename, |
| | | uid_filename, |
| | | byte_size, |
| | | path |
| | | ) |
| | | SELECT |
| | | CONCAT('legacy_', cf.id) AS resource_key, |
| | | CASE |
| | | -- æ ¹æ®æä»¶æ©å±åæ¨æ MIME ç±»å |
| | | WHEN LOWER(cf.name) LIKE '%.jpg' OR LOWER(cf.name) LIKE '%.jpeg' THEN 'image/jpeg' |
| | | WHEN LOWER(cf.name) LIKE '%.png' THEN 'image/png' |
| | | WHEN LOWER(cf.name) LIKE '%.gif' THEN 'image/gif' |
| | | WHEN LOWER(cf.name) LIKE '%.bmp' THEN 'image/bmp' |
| | | WHEN LOWER(cf.name) LIKE '%.webp' THEN 'image/webp' |
| | | WHEN LOWER(cf.name) LIKE '%.pdf' THEN 'application/pdf' |
| | | WHEN LOWER(cf.name) LIKE '%.doc' THEN 'application/msword' |
| | | WHEN LOWER(cf.name) LIKE '%.docx' THEN 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' |
| | | WHEN LOWER(cf.name) LIKE '%.xls' THEN 'application/vnd.ms-excel' |
| | | WHEN LOWER(cf.name) LIKE '%.xlsx' THEN 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' |
| | | WHEN LOWER(cf.name) LIKE '%.ppt' THEN 'application/vnd.ms-powerpoint' |
| | | WHEN LOWER(cf.name) LIKE '%.pptx' THEN 'application/vnd.openxmlformats-officedocument.presentationml.presentation' |
| | | WHEN LOWER(cf.name) LIKE '%.txt' THEN 'text/plain' |
| | | WHEN LOWER(cf.name) LIKE '%.zip' THEN 'application/zip' |
| | | WHEN LOWER(cf.name) LIKE '%.rar' THEN 'application/x-rar-compressed' |
| | | WHEN LOWER(cf.name) LIKE '%.mp4' THEN 'video/mp4' |
| | | WHEN LOWER(cf.name) LIKE '%.mp3' THEN 'audio/mpeg' |
| | | WHEN LOWER(cf.name) LIKE '%.xml' THEN 'application/xml' |
| | | ELSE 'application/octet-stream' |
| | | END AS content_type, |
| | | cf.name AS original_filename, |
| | | -- ä» url 䏿ªåæåçæä»¶åé¨å |
| | | -- url 示ä¾: /javaWork/product-inventory-management/file/prod/uploads2026-05-19/1652_1779177065596_61abcb44.jpg |
| | | -- æªåç»æ: 1652_1779177065596_61abcb44.jpg |
| | | CASE |
| | | WHEN cf.url IS NOT NULL AND cf.url != '' THEN |
| | | SUBSTRING_INDEX(cf.url, '/', -1) |
| | | ELSE cf.name |
| | | END AS uid_filename, |
| | | COALESCE(cf.file_size, 0) AS byte_size, |
| | | cf.url AS path |
| | | FROM common_file cf |
| | | WHERE NOT EXISTS ( |
| | | SELECT 1 FROM storage_blob sb WHERE sb.resource_key = CONCAT('legacy_', cf.id) |
| | | ); |
| | | |
| | | -- ============================================================ |
| | | -- æ¥éª¤1.5ï¼å¨Linuxæå¡å¨ä¸æ´æ°å®é
æä»¶å¤§å° |
| | | -- ç´æ¥å¤å¶ä»¥ä¸å
容尿å¡å¨æ§è¡ |
| | | -- ============================================================ |
| | | |
| | | -- 卿å¡å¨ä¸æ§è¡ä»¥ä¸å½ä»¤åå»ºèæ¬ï¼ |
| | | -- cat > update_blob_file.sh << 'EOF' |
| | | -- #!/bin/bash |
| | | -- FILE_ROOT="/javaWork/product-inventory-management/file/prod" |
| | | -- OUTPUT_SQL="update_blob_file_size.sql" |
| | | -- DB_USER="root" |
| | | -- DB_PASS="xd@123456.." |
| | | -- DB_NAME="product_inventory_management" |
| | | -- echo "å¼å§æ«æç®å½: $FILE_ROOT" |
| | | -- echo "-- æ´æ°æä»¶å¤§å° SQL" > "$OUTPUT_SQL" |
| | | -- find "$FILE_ROOT" -type f | while read filepath; do |
| | | -- filesize=$(stat -c%s "$filepath" 2>/dev/null || echo "0") |
| | | -- filename=$(basename "$filepath") |
| | | -- filename_escaped=$(echo "$filename" | sed "s/'/''/g") |
| | | -- echo "UPDATE storage_blob SET byte_size = $filesize WHERE uid_filename = '$filename_escaped';" >> "$OUTPUT_SQL" |
| | | -- done |
| | | -- echo "SQLæä»¶å·²çæ: $OUTPUT_SQL" |
| | | -- docker exec -i mysql mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" < "$OUTPUT_SQL" |
| | | -- echo "æ´æ°å®æ!" |
| | | -- EOF |
| | | -- |
| | | -- ç¶åæ§è¡ï¼ |
| | | -- chmod +x update_blob_file.sh && ./update_blob_file.sh |
| | | |
| | | -- ============================================================ |
| | | -- æ¥éª¤2ï¼è¿ç§»éä»¶å
³èæ°æ®å° storage_attachment |
| | | -- ============================================================ |
| | | |
| | | INSERT INTO storage_attachment ( |
| | | create_time, |
| | | update_time, |
| | | deleted, |
| | | record_type, |
| | | record_id, |
| | | application, |
| | | storage_blob_id |
| | | ) |
| | | SELECT |
| | | cf.create_time, |
| | | cf.update_time, |
| | | 0 AS deleted, |
| | | CASE cf.type |
| | | WHEN 1 THEN 'sales_ledger' |
| | | WHEN 2 THEN 'purchase_ledger' |
| | | WHEN 3 THEN 'invoice_ledger' |
| | | WHEN 4 THEN 'purchase_ledger_file' |
| | | WHEN 5 THEN 'measuring_instrument_ledger' |
| | | WHEN 6 THEN 'measuring_instrument_ledger_record' |
| | | WHEN 7 THEN 'approve_node' |
| | | WHEN 8 THEN 'approve_process' |
| | | WHEN 9 THEN 'shipping_info' |
| | | WHEN 10 THEN 'inspection_task' |
| | | WHEN 11 THEN 'inspection_task' |
| | | WHEN 12 THEN 'inspection_task' |
| | | WHEN 13 THEN 'common_file' |
| | | ELSE 'common_file' |
| | | END AS record_type, |
| | | cf.common_id AS record_id, |
| | | 'file' AS application, |
| | | sb.id AS storage_blob_id |
| | | FROM common_file cf |
| | | INNER JOIN storage_blob sb ON sb.resource_key = CONCAT('legacy_', cf.id) |
| | | WHERE NOT EXISTS ( |
| | | SELECT 1 FROM storage_attachment sa |
| | | WHERE sa.storage_blob_id = sb.id |
| | | ); |
| | | |
| | | -- ============================================================ |
| | | -- æ¥éª¤3ï¼éªè¯è¿ç§»ç»æ |
| | | -- ============================================================ |
| | | |
| | | -- æ£æ¥è¿ç§»æ°éæ¯å¦ä¸è´ |
| | | SELECT |
| | | 'common_file åå§è®°å½æ°' AS description, |
| | | COUNT(*) AS count |
| | | FROM common_file |
| | | UNION ALL |
| | | SELECT |
| | | 'storage_blob è¿ç§»è®°å½æ°' AS description, |
| | | COUNT(*) AS count |
| | | FROM storage_blob |
| | | WHERE resource_key LIKE 'legacy_%' |
| | | UNION ALL |
| | | SELECT |
| | | 'storage_attachment è¿ç§»è®°å½æ°' AS description, |
| | | COUNT(*) AS count |
| | | FROM storage_attachment sa |
| | | WHERE EXISTS ( |
| | | SELECT 1 FROM storage_blob sb |
| | | WHERE sb.id = sa.storage_blob_id |
| | | AND sb.resource_key LIKE 'legacy_%' |
| | | ); |
| | | |
| | | -- æç±»åç»è®¡è¿ç§»æ°é |
| | | SELECT |
| | | cf.type AS old_type, |
| | | CASE cf.type |
| | | WHEN 1 THEN 'sales_ledger' |
| | | WHEN 2 THEN 'purchase_ledger' |
| | | WHEN 3 THEN 'invoice_ledger' |
| | | WHEN 4 THEN 'purchase_ledger_file' |
| | | WHEN 5 THEN 'measuring_instrument_ledger' |
| | | WHEN 6 THEN 'measuring_instrument_ledger_record' |
| | | WHEN 7 THEN 'approve_node' |
| | | WHEN 8 THEN 'approve_process' |
| | | WHEN 9 THEN 'shipping_info' |
| | | WHEN 10 THEN 'inspection_task' |
| | | WHEN 11 THEN 'inspection_task' |
| | | WHEN 12 THEN 'inspection_task' |
| | | WHEN 13 THEN 'common_file' |
| | | ELSE 'unknown' |
| | | END AS new_record_type, |
| | | COUNT(*) AS count |
| | | FROM common_file cf |
| | | GROUP BY cf.type |
| | | ORDER BY cf.type; |
| | | |
| | | -- ============================================================ |
| | | -- æ¥éª¤4ï¼æ°æ®æ ¡éªï¼æ§è¡åæ£æ¥æ¯å¦æå¼å¸¸æ°æ®ï¼ |
| | | -- ============================================================ |
| | | |
| | | -- æ£æ¥æ¯å¦æ common_id 为空çè®°å½ |
| | | SELECT COUNT(*) AS 'common_id为空çè®°å½æ°' FROM common_file WHERE common_id IS NULL; |
| | | |
| | | -- æ£æ¥æ¯å¦æ name 为空çè®°å½ |
| | | SELECT COUNT(*) AS 'name为空çè®°å½æ°' FROM common_file WHERE name IS NULL OR name = ''; |
| | | |
| | | -- æ£æ¥æ¯å¦æ url 为空çè®°å½ |
| | | SELECT COUNT(*) AS 'url为空çè®°å½æ°' FROM common_file WHERE url IS NULL OR url = ''; |
| | | |
| | | -- ============================================================ |
| | | -- æ¥éª¤5ï¼è¿ç§»å®æåçæ¸
çï¼è°¨æ
æ§è¡ï¼å»ºè®®å
å¤ä»½æ°æ®ï¼ |
| | | -- ============================================================ |
| | | |
| | | -- å¤ä»½ common_file 表ï¼å¯éï¼ |
| | | -- CREATE TABLE common_file_backup AS SELECT * FROM common_file; |
| | | |
| | | -- æ¸
空 common_file 表ï¼ç¡®è®¤è¿ç§»æ è¯¯åæ§è¡ï¼ |
| | | -- TRUNCATE TABLE common_file; |
| | | |
| | | -- æè
å é¤å·²è¿ç§»çè®°å½ |
| | | -- DELETE FROM common_file WHERE EXISTS ( |
| | | -- SELECT 1 FROM storage_blob sb |
| | | -- WHERE sb.resource_key = CONCAT('legacy_', common_file.id) |
| | | -- ); |
| | | |
| | | -- ============================================================ |
| | | -- 注æäºé¡¹ï¼ |
| | | -- 1. æ§è¡åå¡å¿
å¤ä»½ common_file è¡¨æ°æ® |
| | | -- 2. å»ºè®®å¨æµè¯ç¯å¢å
éªè¯è¿ç§»èæ¬çæ£ç¡®æ§ |
| | | -- 3. è¿ç§»å®æåï¼æ£æ¥æä»¶æ¯å¦è½æ£å¸¸è®¿é® |
| | | -- 4. 确认ä¸å¡åè½æ£å¸¸åï¼åèèæ¸
çæ§æ°æ® |
| | | -- 5. resource_key ä½¿ç¨ 'legacy_' + åID çæ ¼å¼ï¼ä¾¿äºè¿½æº¯åå»é |
| | | -- ============================================================ |