1. 用查询语句查询系统中又多少这样的重复资产,输出为csv文件
SELECT
base_name AS "Asset Name",
/* Resource IDs */
CONCAT(
STRING_AGG(CASE WHEN r.resourcename LIKE '%.s' THEN r.resourceid::text END, ','),
CASE
WHEN COUNT(CASE WHEN r.resourcename LIKE '%.s' THEN 1 END) > 0
AND COUNT(CASE WHEN r.resourcename LIKE '%.t' THEN 1 END) > 0
THEN ','
ELSE ''
END,
STRING_AGG(CASE WHEN r.resourcename LIKE '%.t' THEN r.resourceid::text END, ',')
) AS "Resource IDs",
/* Resource Names */
CONCAT(
STRING_AGG(CASE WHEN r.resourcename LIKE '%.s' THEN r.resourcename END, ','),
CASE
WHEN COUNT(CASE WHEN r.resourcename LIKE '%.s' THEN 1 END) > 0
AND COUNT(CASE WHEN r.resourcename LIKE '%.t' THEN 1 END) > 0
THEN ','
ELSE ''
END,
STRING_AGG(CASE WHEN r.resourcename LIKE '%.t' THEN r.resourcename END, ',')
) AS "Resource Names"
FROM (
SELECT
resourceid,
resourcename,
CASE
WHEN POSITION('.' IN resourcename) > 0
THEN LEFT(resourcename, POSITION('.' IN resourcename) - 1)
ELSE resourcename
END AS base_name
FROM resources
) r
GROUP BY base_name
HAVING COUNT(*) > 1;
2. 导出的文件内容格式如下,然后将 IDs里的IP分割为两个IP对,格式如下
3. 然后到系统中找到两个同类型的资产进行协调操作,同时在浏览器空白处右键选择Inspect(开发者工具)点击到network页签,执行完毕搜索ajax
4. 在上图的AJaxServlet上右键,然后选择 Copy中的Copy as fetch
5. 再在下面的代码中,用复制的代码替换红色的部分,并将“body" 的绿色部分照搬里面只写body,再将第二步得到的完整序列对替换下面蓝色字体的部分
// Step 1: Define an array where each element contains two numbers (resource1 and resource2)
const reconcileInfo = [
[100000002,100000006]// Add more pairs as needed
];
const assetType='custom_asset_computer';
// Step 2: Define an async function to send fetch requests with a delay after every 75 requests
async function sendRequests() {
for (let i = 0; i < reconcileInfo.length; i++) {
const [resource1, resource2] = reconcileInfo[i];
// Prepare request body with dynamic values
const body = `action=reconcile&resource1=${resource1}&resource2=${resource2}&assetType=${assetType}`;
try {
// Invoke fetch request
"headers": {
"accept": "*/*",
"accept-language": "en,zh-CN;q=0.9,zh;q=0.8",
"content-type": "application/x-www-form-urlencoded;charset=UTF-8",
"portalid": "301",
"sec-ch-ua": "\"Not:A-Brand\";v=\"99\", \"Google Chrome\";v=\"145\", \"Chromium\";v=\"145\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"x-zcsrf-token": "sdpcsrfparam=622e7a82b50f622ebe76122ea8690a54c94806834263be9d3e5d6950c0d9273ab491c69fad362fc973f904ef5cd13d99329f4277a5fdf196c2ca503cbcbc447c"
},
"body": body,
"method": "POST",
"mode": "cors",
"credentials": "include"
});
console.log(`Request ${i + 1} completed for resource1=${resource1}, resource2=${resource2}`);
} catch (error) {
console.error(`Error in request ${i + 1}:`, error);
}
// Step 3: After every 75 requests, pause for 1 minute (60000ms)
if ((i + 1) % 75 === 0) {
console.log("Pausing for 1 minute after 75 requests...");
await new Promise(resolve => setTimeout(resolve, 60000));
console.log("Resuming requests...");
}
}
}
6. 打开sdp管理员登录页到资产页签,浏览器开发者工具的console页签,光标处黏贴入编辑好的代码,回车后返回执行结果,完成后可以在系统查看是否重复的资产已经协调完毕