license_info_distribution.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. // 显示分发模态框的函数
  2. function showDistributeModal(item) {
  3. const modal = document.getElementById('DistributeModal');
  4. // 显示模态框
  5. modal.style.display = 'flex';
  6. let usersInfo;
  7. // 获取用户信息并填充第一个用户输入框
  8. fetch('http://127.0.0.1:8080/api/admin/distributeLicenseByUserInfo', {
  9. method: 'GET',
  10. headers: {
  11. 'Authorization': `Bearer ${authToken}`, // 确保autoToken是您获取的用户授权令牌
  12. 'Content-Type': 'application/json'
  13. }
  14. })
  15. .then(response => {
  16. if (!response.ok) {
  17. throw new Error('Network response was not ok');
  18. }
  19. return response.json();
  20. })
  21. .then(data => {
  22. usersInfo = data.data; // 假设 data 是返回的用户信息数组或对象
  23. console.log('用户信息:', usersInfo); // 打印用户信息
  24. // 调用处理上半部分(邮箱输入框)的函数
  25. handleEmailSection(item,usersInfo);
  26. // 调用处理下半部分(用户输入框)的函数
  27. handleUserSection(item, usersInfo);
  28. })
  29. .catch(error => {
  30. console.error('获取用户信息失败:', error);
  31. });
  32. // 绑定关闭事件
  33. const closeModalBtn = document.querySelector('.DistributeModal-close');
  34. closeModalBtn.addEventListener('click', closeDistributeModal);
  35. // 点击模态框外部关闭
  36. window.addEventListener('click', (event) => {
  37. if (event.target === modal) {
  38. closeDistributeModal();
  39. }
  40. });
  41. }
  42. function handleEmailSection(item, usersInfo) {
  43. console.log('调用邮箱处理');
  44. console.log('handleEmailSection 用户信息:', usersInfo);
  45. const emailInputs = document.getElementById('DistributeModal-email-inputs');
  46. emailInputs.innerHTML = ''; // 清空之前添加的邮箱输入框
  47. // 设置复选框标签内容
  48. const salesEmailLabel = document.getElementById('salesEmailCheckbox').parentElement;
  49. salesEmailLabel.innerHTML = `
  50. <input type="checkbox" id="salesEmailCheckbox" class="DistributeModal-checkbox">
  51. <span class="DistributeModal-checkbox-custom"></span>
  52. 销售邮箱 (${item.SalesPerson}: ${item.SalesEmail})
  53. `;
  54. const supportEmailLabel = document.getElementById('supportEmailCheckbox').parentElement;
  55. supportEmailLabel.innerHTML = `
  56. <input type="checkbox" id="supportEmailCheckbox" class="DistributeModal-checkbox">
  57. <span class="DistributeModal-checkbox-custom"></span>
  58. 运维邮箱 (${item.SupportPerson}: ${item.SupportEmail})
  59. `;
  60. // 防止重复绑定事件,先移除任何现有的点击事件监听器
  61. const addEmailBtn = document.getElementById('DistributeModal-add-email-btn');
  62. addEmailBtn.replaceWith(addEmailBtn.cloneNode(true));
  63. const newAddEmailBtn = document.getElementById('DistributeModal-add-email-btn');
  64. // 绑定点击事件,动态添加邮箱输入框
  65. newAddEmailBtn.addEventListener('click', () => {
  66. const emailWrapper = document.createElement('div');
  67. emailWrapper.className = 'DistributeModal-email-input-wrapper';
  68. const newEmailInput = document.createElement('input');
  69. newEmailInput.type = 'email';
  70. newEmailInput.placeholder = '输入分发邮箱';
  71. newEmailInput.className = 'DistributeModal-email-input';
  72. // 创建删除按钮
  73. const removeEmailBtn = document.createElement('button');
  74. removeEmailBtn.className = 'DistributeModal-remove-email-btn';
  75. removeEmailBtn.innerHTML = '&times;';
  76. removeEmailBtn.addEventListener('click', () => {
  77. emailWrapper.remove();
  78. });
  79. // 将输入框和删除按钮加入到 emailWrapper 中
  80. emailWrapper.appendChild(newEmailInput);
  81. emailWrapper.appendChild(removeEmailBtn);
  82. // 将 emailWrapper 加入到 emailInputs 容器中
  83. emailInputs.appendChild(emailWrapper);
  84. });
  85. // 内部函数:检查是否存在重复项
  86. function findDuplicates(arr) {
  87. const seen = new Set();
  88. const duplicates = [];
  89. arr.forEach((email) => {
  90. if (seen.has(email)) {
  91. duplicates.push(email);
  92. } else {
  93. seen.add(email);
  94. }
  95. });
  96. return duplicates;
  97. }
  98. // 点击确认按钮
  99. const emailConfirmBtn = document.getElementById('DistributeModal-email-confirm-btn');
  100. emailConfirmBtn.addEventListener('click', () => {
  101. // 收集邮箱信息
  102. let emails = Array.from(document.querySelectorAll('.DistributeModal-email-input'))
  103. .map(input => input.value.trim())
  104. .filter(email => email); // 过滤掉空邮箱
  105. // 检查是否勾选销售邮箱或运维邮箱
  106. const isSalesEmailChecked = document.getElementById('salesEmailCheckbox').checked;
  107. const isSupportEmailChecked = document.getElementById('supportEmailCheckbox').checked;
  108. if (isSalesEmailChecked) {
  109. emails.push(item.SalesEmail);
  110. }
  111. if (isSupportEmailChecked) {
  112. emails.push(item.SupportEmail);
  113. }
  114. // 检查是否存在重复的邮箱
  115. const duplicateEmails = findDuplicates(emails);
  116. if (duplicateEmails.length > 0) {
  117. alert(`以下邮箱重复:\n${duplicateEmails.join('\n')}`);
  118. } else {
  119. if (confirm("确认发送这些邮件吗?")) {
  120. distributeEmails(item, [...new Set(emails)], usersInfo); // 使用 Set 去重
  121. closeDistributeModal(); // 关闭模态框
  122. }
  123. }
  124. });
  125. }
  126. function handleUserSection(item, usersInfo) {
  127. console.log('handleUserSection 用户信息:', usersInfo); // 打印用户信息
  128. const userInputs = document.getElementById('DistributeModal-user-inputs');
  129. userInputs.innerHTML = ''; // 清空之前添加的用户选择框
  130. // 过滤掉 admin 账户
  131. const filteredUsersInfo = usersInfo.filter(user => user.Username !== 'admin');
  132. // 用于存储已经选择的用户
  133. let selectedUsersSet = new Set();
  134. // 绑定新增下拉框按钮
  135. const addSelectBtn = document.getElementById('distributeUser-add-select-btn');
  136. addSelectBtn.replaceWith(addSelectBtn.cloneNode(true)); // 防止重复绑定
  137. const newAddSelectBtn = document.getElementById('distributeUser-add-select-btn');
  138. // 函数:更新所有下拉框中的可选项
  139. const updateSelectOptions = () => {
  140. Array.from(document.querySelectorAll('.distributeUser-select')).forEach(select => {
  141. const currentValue = select.value; // 当前选中的值
  142. select.innerHTML = ''; // 清空选项
  143. // 添加默认的空选项(必须手动选择)
  144. const defaultOption = document.createElement('option');
  145. defaultOption.value = ''; // 设置为空值
  146. defaultOption.textContent = '请选择用户';
  147. select.appendChild(defaultOption);
  148. filteredUsersInfo.forEach(user => {
  149. if (!selectedUsersSet.has(user.UniqueID) || user.UniqueID === currentValue) {
  150. const option = document.createElement('option');
  151. option.value = user.UniqueID;
  152. option.setAttribute('data-username', user.Username);
  153. option.setAttribute('data-account', user.Account);
  154. option.textContent = `${user.Username} (${user.Account})`;
  155. // 如果是当前选中的值,保持选中状态
  156. if (user.UniqueID === currentValue) {
  157. option.selected = true;
  158. }
  159. select.appendChild(option);
  160. }
  161. });
  162. });
  163. };
  164. newAddSelectBtn.addEventListener('click', () => {
  165. const selectWrapper = document.createElement('div');
  166. selectWrapper.className = 'distributeUser-select-wrapper'; // Flexbox 容器
  167. const select = document.createElement('select');
  168. select.className = 'distributeUser-select'; // 设置下拉框样式
  169. // 添加一个默认的空选项
  170. const defaultOption = document.createElement('option');
  171. defaultOption.value = '';
  172. defaultOption.textContent = '请选择用户'; // 这个选项提示用户选择
  173. defaultOption.selected = true; // 默认选中这个选项
  174. select.appendChild(defaultOption);
  175. // 初始更新下拉框
  176. updateSelectOptions();
  177. // 监听下拉框的变化
  178. select.addEventListener('change', () => {
  179. const previousValue = select.dataset.previousValue;
  180. // 如果之前有选中,移除旧值
  181. if (previousValue) {
  182. selectedUsersSet.delete(previousValue);
  183. }
  184. // 如果有新的选择,添加到 set 中
  185. if (select.value) {
  186. selectedUsersSet.add(select.value);
  187. select.dataset.previousValue = select.value; // 保存当前值为下次移除准备
  188. }
  189. // 更新其他下拉框的选项
  190. updateSelectOptions();
  191. });
  192. // 创建删除按钮,使用与关闭邮件输入框相同的样式
  193. const removeSelectBtn = document.createElement('button');
  194. removeSelectBtn.className = 'DistributeModal-remove-email-btn'; // 使用关闭邮件输入框的按钮样式
  195. removeSelectBtn.innerHTML = '&times;';
  196. removeSelectBtn.addEventListener('click', () => {
  197. const previousValue = select.dataset.previousValue;
  198. if (previousValue) {
  199. selectedUsersSet.delete(previousValue); // 删除时从选中集中移除
  200. }
  201. selectWrapper.remove(); // 删除下拉框
  202. updateSelectOptions(); // 更新其他下拉框的选项
  203. });
  204. // 将下拉框和删除按钮加入到 selectWrapper 中
  205. selectWrapper.appendChild(select);
  206. selectWrapper.appendChild(removeSelectBtn);
  207. // 将 selectWrapper 加入到 userInputs 容器中
  208. userInputs.appendChild(selectWrapper);
  209. // 初始更新其他下拉框
  210. updateSelectOptions();
  211. });
  212. // 点击下半部分的确认按钮
  213. const userConfirmBtn = document.getElementById('distributeUser-confirm-btn');
  214. userConfirmBtn.addEventListener('click', () => {
  215. // 收集用户信息,收集每个下拉框选中的值及其额外数据
  216. const selectedUsers = Array.from(document.querySelectorAll('.distributeUser-select'))
  217. .map(select => {
  218. if (select.value) {
  219. const selectedUserInfo = {
  220. uniqueID: select.value,
  221. username: select.options[select.selectedIndex].getAttribute('data-username'),
  222. account: select.options[select.selectedIndex].getAttribute('data-account')
  223. };
  224. return selectedUserInfo; // 返回用户的所有信息
  225. }
  226. })
  227. .filter(user => user !== undefined); // 过滤掉未选择的空值
  228. // 分别提取 uniqueID, username 和 account 数组
  229. const uniqueIDArray = selectedUsers.map(user => user.uniqueID);
  230. const usernameArray = selectedUsers.map(user => user.username);
  231. const accountArray = selectedUsers.map(user => user.account);
  232. console.log("Unique IDs: ", uniqueIDArray);
  233. console.log("Usernames: ", usernameArray);
  234. console.log("Accounts: ", accountArray);
  235. // 执行用户分发逻辑,传递用户详细信息到 distributeLicense
  236. distributeUser(item, uniqueIDArray, usernameArray, accountArray);
  237. closeDistributeModal(); // 关闭模态框
  238. });
  239. }
  240. // 关闭分发模态框的函数
  241. function closeDistributeModal() {
  242. const modal = document.getElementById('DistributeModal');
  243. modal.style.display = 'none'; // 隐藏模态框
  244. // 清空邮箱和用户输入区域
  245. const emailInputs = document.getElementById('DistributeModal-email-inputs');
  246. emailInputs.innerHTML = ''; // 清空动态生成的邮箱输入框
  247. const userInputs = document.getElementById('DistributeModal-user-inputs');
  248. userInputs.innerHTML = ''; // 清空动态生成的用户选择框
  249. }
  250. function distributeEmails(item, emails, usersInfo) {
  251. console.log('分发 distributeEmails', { item, emails, usersInfo });
  252. // 将 emails 数组转为以逗号分隔的字符串
  253. const emailsString = emails.join(',');
  254. // 从 usersInfo 中获取 currentUserInfo
  255. //const currentUserInfo = usersInfo.find(user => user.role === 'currentUser'); // 假设 currentUser 标识当前用户
  256. if (!currentUserInfo) {
  257. console.error('无法获取当前用户信息');
  258. return;
  259. }
  260. // 构建要发送的数据
  261. const postData = {
  262. emails: emailsString,
  263. LicenseUniqueID: item.UniqueID, // item 中的 UniqueID
  264. Oa_request_id: item.oa_request_id, // item 中的 oa_request_id
  265. OperatorUniqueID: currentUserInfo.UniqueID // currentUserInfo 中的 UniqueID
  266. };
  267. console.log('即将发送的数据:', postData);
  268. showLoadingModal("正在分发邮箱中...");
  269. // 发送 POST 请求到 DistributeLicenseToEmail 接口
  270. fetch('http://127.0.0.1:8080/api/admin/DistributeLicenseToEmail', {
  271. method: 'POST',
  272. headers: {
  273. 'Authorization': `Bearer ${authToken}`, // 使用 authToken
  274. 'Content-Type': 'application/json'
  275. },
  276. body: JSON.stringify(postData) // 将数据转为 JSON 格式
  277. })
  278. .then(response => {
  279. if (!response.ok) {
  280. hideLoadingModal();
  281. throw new Error('Network response was not ok');
  282. }
  283. return response.json();
  284. })
  285. .then(data => {
  286. // 处理成功响应
  287. hideLoadingModal();
  288. console.log('邮件分发成功:', data);
  289. alert('邮件分发成功');
  290. })
  291. .catch(error => {
  292. // 处理错误
  293. hideLoadingModal();
  294. console.error('分发邮件失败:', error);
  295. alert('分发邮件失败,请稍后重试');
  296. });
  297. }
  298. // 执行分发的逻辑
  299. function distributeUser(item, uniqueIDArray, usernameArray, accountArray) {
  300. // 构建要发送的数据对象
  301. const postData = {
  302. Oa_request_id: item.oa_request_id,
  303. LicenseUniqueID: item.UniqueID,
  304. OperatorUniqueID: currentUserInfo.UniqueID, // currentUserInfo 中的 UniqueID
  305. UserUniqueIDs: uniqueIDArray,
  306. UserNames: usernameArray,
  307. UserAccounts: accountArray
  308. };
  309. console.log('Sending user data:', postData);
  310. showLoadingModal("正在分发用户中...");
  311. // 发送 POST 请求到 DistributeLicenseToUser 接口
  312. fetch('http://127.0.0.1:8080/api/admin/DistributeLicenseToUser', {
  313. method: 'POST',
  314. headers: {
  315. 'Content-Type': 'application/json',
  316. 'Authorization': `Bearer ${authToken}` // 使用适当的 authToken
  317. },
  318. body: JSON.stringify(postData) // 将数据转换为 JSON 字符串发送
  319. })
  320. .then(response => {
  321. hideLoadingModal(); // 隐藏 loading 模态框
  322. if (!response.ok) {
  323. // 返回错误信息作为 Promise,以便 catch 块捕获
  324. return response.json().then(errorData => {
  325. // 检查服务器是否返回了特定的错误信息并抛出错误
  326. const errorMessage = errorData.error || '网络响应不正确';
  327. throw new Error(errorMessage);
  328. });
  329. }
  330. return response.json();
  331. })
  332. .then(data => {
  333. console.log('分发成功:', data);
  334. alert('分发成功!');
  335. })
  336. .catch(error => {
  337. hideLoadingModal(); // 在失败时隐藏 loading 模态框
  338. console.error('分发失败:', error.message); // 打印具体的错误信息
  339. alert('分发失败: ' + error.message); // 将错误信息展示给用户
  340. });
  341. }
  342. //--------------分发历史模态框------------------------
  343. // function showDistributionHistory(selectedRowData) {
  344. // fetch('http://127.0.0.1:8080/api/admin/GetlicenseRecord', {
  345. // method: 'POST',
  346. // headers: {
  347. // 'Authorization': `Bearer ${authToken}`,
  348. // 'Content-Type': 'application/json'
  349. // },
  350. // body: JSON.stringify({ uniqueID: selectedRowData.UniqueID, oa_request_id: selectedRowData.oa_request_id })
  351. // })
  352. // .then(response => response.json())
  353. // .then(data => {
  354. // const userDistributionContent = document.getElementById('distributionHistory-user-content');
  355. // const emailDistributionContent = document.getElementById('distributionHistory-email-content');
  356. // // 检查 license_record_to_user 是否是数组,如果不是则默认为空数组
  357. // const userRecords = Array.isArray(data?.data?.license_record_to_user) ? data.data.license_record_to_user : [];
  358. // // 如果 license_record_to_emails 是 null,则设置为空数组
  359. // const emailRecords = Array.isArray(data?.data?.license_record_to_emails) ? data.data.license_record_to_emails : [];
  360. // // 显示用户分发记录
  361. // userDistributionContent.innerHTML = userRecords.length > 0
  362. // ? userRecords.map(record => `<p>已转发给用户: ${record.user_account} 时间: ${formatDateTime(record.up_time)}</p>`).join('')
  363. // : '<p>没有用户分发记录。</p>';
  364. // // 显示邮箱分发记录
  365. // emailDistributionContent.innerHTML = emailRecords.length > 0
  366. // ? emailRecords.map(record => `<p>已发给邮箱: ${record.emails} 时间: ${formatDateTime(record.up_time)}</p>`).join('')
  367. // : '<p>没有邮箱分发记录。</p>';
  368. // // 显示模态框
  369. // document.getElementById('distributionHistory-modal').style.display = 'block';
  370. // })
  371. // .catch(error => {
  372. // console.error('Error fetching distribution history:', error);
  373. // });
  374. // // 关闭模态框 (点击关闭按钮)
  375. // document.querySelector('.distributionHistory-modal-close').addEventListener('click', () => {
  376. // document.getElementById('distributionHistory-modal').style.display = 'none';
  377. // });
  378. // // 点击模态框外部关闭模态框
  379. // window.addEventListener('click', function(event) {
  380. // const modal = document.getElementById('distributionHistory-modal');
  381. // if (event.target === modal) { // 检查点击的是否是模态框背景
  382. // modal.style.display = 'none'; // 关闭模态框
  383. // }
  384. // });
  385. // }
  386. function showDistributionHistory(selectedRowData) {
  387. fetch('http://127.0.0.1:8080/api/admin/GetlicenseRecord', {
  388. method: 'POST',
  389. headers: {
  390. 'Authorization': `Bearer ${authToken}`,
  391. 'Content-Type': 'application/json'
  392. },
  393. body: JSON.stringify({ uniqueID: selectedRowData.UniqueID, oa_request_id: selectedRowData.oa_request_id })
  394. })
  395. .then(response => response.json())
  396. .then(data => {
  397. console.log("showDistributionHistory", data);
  398. // 提取用户记录和邮箱记录
  399. const userRecords = data.data.license_record_to_user || [];
  400. const emailRecords = data.data.license_record_to_emails || [];
  401. // 动态生成用户记录的 HTML
  402. const userContent = userRecords.length > 0 ?
  403. userRecords.map(user => `
  404. <div class="distributionHistory-user">
  405. <div>用户名: ${user.user_account}</div>
  406. <div>唯一用户 ID: ${user.user_unique_id}</div>
  407. <div>更新时间: ${new Date(user.up_time).toLocaleString()}</div>
  408. </div>
  409. `).join('') :
  410. '<div class="distributionHistory-no-record">无用户记录</div>';
  411. // 动态生成邮箱记录的 HTML
  412. const emailContent = emailRecords.length > 0 ?
  413. emailRecords.map(email => `
  414. <div class="distributionHistory-email">
  415. <div>邮箱: ${email.emails}</div>
  416. <div>更新时间: ${new Date(email.up_time).toLocaleString()}</div>
  417. </div>
  418. `).join('') :
  419. '<div class="distributionHistory-no-record">无邮箱记录</div>';
  420. // 将内容插入到模态框中的对应 div
  421. document.getElementById('distributionHistory-user-content').innerHTML = userContent;
  422. document.getElementById('distributionHistory-email-content').innerHTML = emailContent;
  423. // 显示模态框
  424. document.getElementById('distributionHistory-modal').style.display = 'block';
  425. })
  426. .catch(error => {
  427. console.error('Error fetching distribution history:', error);
  428. });
  429. // 关闭模态框 (点击关闭按钮)
  430. document.querySelector('.distributionHistory-modal-close').addEventListener('click', () => {
  431. document.getElementById('distributionHistory-modal').style.display = 'none';
  432. });
  433. // 点击模态框外部关闭模态框
  434. window.addEventListener('click', function(event) {
  435. const modal = document.getElementById('distributionHistory-modal');
  436. if (event.target === modal) {
  437. modal.style.display = 'none';
  438. }
  439. });
  440. }
  441. function formatDateTime(dateString) {
  442. const date = new Date(dateString);
  443. // 获取 UTC 时间
  444. const year = date.getUTCFullYear();
  445. const month = String(date.getUTCMonth() + 1).padStart(2, '0'); // 月份从0开始,所以+1
  446. const day = String(date.getUTCDate()).padStart(2, '0');
  447. const hours = String(date.getUTCHours()).padStart(2, '0');
  448. const minutes = String(date.getUTCMinutes()).padStart(2, '0');
  449. const seconds = String(date.getUTCSeconds()).padStart(2, '0');
  450. // 返回格式化后的字符串,格式为 YYYY-MM-DD HH:mm:ss
  451. return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
  452. }