GTong 8 месяцев назад
Родитель
Сommit
0d1780a55d

+ 2 - 2
config.toml

@@ -3,13 +3,13 @@ ip = "127.0.0.1"
 port = "8080"
 
 [database]
-oadb_ip = "10.28.20.233"
+oadb_ip = "127.0.0.1"
 oadb_port = "5138"
 oadb_db = "OAdb"
 oadb_user = "SYSDBA"
 oadb_password = "SYSDBA"
 
-licdb_ip = "10.28.20.233"
+licdb_ip = "127.0.0.1"
 licdb_port = "5138"
 licdb_db = "license"
 licdb_user = "SYSDBA"

+ 0 - 217
static/license_info/license_info.css

@@ -519,223 +519,6 @@ nav ul li a.active {
 
 /*-----------------分发*/
 
-/* 模态框整体样式 */
-#distribute-modal {
-    display: none; /* 默认隐藏 */
-    position: fixed;
-    z-index: 1000;
-    left: 0;
-    top: 0;
-    width: 100%;
-    height: 100%;
-    background-color: rgba(0, 0, 0, 0.5); /* 半透明背景 */
-    justify-content: center;
-    align-items: center;
-    overflow: hidden;
-}
-
-/* 模态框内容样式 */
-#distribute-modal .distribute-modal-content {
-    background-color: #fff;
-    width: 400px; /* 模态框的宽度 */
-    max-width: 90%; /* 最大宽度为视口的90% */
-    padding: 20px;
-    border-radius: 10px;
-    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); /* 轻微阴影 */
-    position: relative;
-    text-align: center;
-}
-
-/* 关闭按钮样式 */
-#distribute-modal .distribute-close {
-    position: absolute;
-    top: 10px;
-    right: 15px;
-    font-size: 24px;
-    color: #333;
-    cursor: pointer;
-}
-
-/* 模态框标题样式 */
-#distribute-modal .distribute-header h2,
-#distribute-modal .distribute-body h2 {
-    font-size: 20px;
-    font-weight: bold;
-    margin-bottom: 15px;
-    color: #333;
-}
-
-/* 分发邮箱部分样式 */
-#distribute-modal #distribute-email-section {
-    margin-bottom: 20px;
-}
-
-#distribute-modal #distribute-email-section h2 {
-    font-size: 18px;
-    margin-bottom: 10px;
-    color: #007bff;
-}
-
-/* 分发用户部分样式 */
-#distribute-modal #distribute-user-section {
-    margin-top: 20px;
-}
-
-#distribute-modal #distribute-user-section h2 {
-    font-size: 18px;
-    margin-bottom: 10px;
-    color: #28a745;
-}
-
-/* 输入框区域样式 */
-#distribute-modal #emailInputs,
-#distribute-modal #userInputs {
-    display: flex;
-    flex-direction: column;
-    align-items: flex-start;
-}
-
-#distribute-modal #emailInputs div,
-#distribute-modal #userInputs div {
-    margin-bottom: 10px;
-}
-
-#distribute-modal input[type="checkbox"] {
-    margin-right: 10px;
-}
-
-#distribute-modal label {
-    font-size: 16px;
-    color: #555;
-    cursor: pointer;
-}
-
-/* 确认按钮样式 */
-#distribute-modal .distribute-confirm-button {
-    background-color: #007bff;
-    color: white;
-    padding: 10px 20px;
-    border: none;
-    border-radius: 5px;
-    cursor: pointer;
-    margin-top: 20px;
-    font-size: 16px;
-}
-
-#distribute-modal .distribute-confirm-button:hover {
-    background-color: #0056b3;
-}
-
-/*分发下拉框样式*/
-/* 专属下拉框容器样式 */
-.distribute-user-select-container {
-    margin-bottom: 15px;
-    width: 100%;
-    display: flex;
-    justify-content: center; /* 居中 */
-}
-
-/* 专属下拉框样式 */
-.distribute-user-select {
-    width: 80%; /* 下拉框的宽度 */
-    padding: 10px;
-    border-radius: 8px;
-    border: 1px solid #ccc;
-    font-size: 16px;
-    background-color: #f9f9f9; /* 浅灰背景 */
-    color: #333; /* 字体颜色 */
-    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* 轻微阴影 */
-    transition: border-color 0.3s ease;
-}
-
-.distribute-user-select:focus {
-    border-color: #007bff; /* 焦点时的边框颜色 */
-    outline: none; /* 去掉默认的焦点样式 */
-    box-shadow: 0 0 5px rgba(0, 123, 255, 0.5); /* 焦点时的阴影效果 */
-}
-
-/* 下拉框的选项样式 */
-.distribute-user-select option {
-    background-color: white; /* 默认背景颜色 */
-    color: black; /* 默认字体颜色 */
-}
-
-/* 悬停选项时的样式 */
-.distribute-user-select option:hover {
-    background-color: #007bff; /* 悬停时选项的背景颜色 */
-    color: white; /* 悬停时字体颜色 */
-}
-
-/* 选中的选项的样式 */
-.distribute-user-select option:checked {
-    background-color: #0056b3; /* 选中的选项的背景颜色 */
-    color: white; /* 选中的选项的字体颜色 */
-}
-
-
-/* 添加用户按钮样式 */
-.distribute-add-user-button {
-    padding: 10px 15px;
-    background-color: #007bff;
-    color: white;
-    border: none;
-    border-radius: 5px;
-    cursor: pointer;
-    margin-top: 10px;
-    transition: background-color 0.3s ease;
-}
-
-.distribute-add-user-button:hover {
-    background-color: #0056b3;
-}
-
-/*关闭按钮*/
-/* 分发模态框用户选择框容器样式 */
-.distribute-modal-user-select-container {
-    margin-bottom: 15px;
-    width: 100%;
-    display: flex;
-    justify-content: space-between; /* 让下拉框和关闭按钮分开对齐 */
-    align-items: center; /* 垂直居中 */
-}
-
-/* 关闭按钮样式 */
-.distribute-modal-close-select {
-    font-size: 18px; /* 关闭按钮的大小 */
-    color: #ff0000; /* 关闭按钮的颜色 */
-    cursor: pointer;
-}
-
-.distribute-modal-close-select:hover {
-    color: #d00000; /* 鼠标悬停时的颜色变化 */
-}
-
-/*分发邮箱*/
-/* 邮箱输入框样式 */
-.distribute-email-input {
-    display: block;
-    margin: 10px 0;
-    padding: 8px;
-    width: 100%;
-    border: 1px solid #ccc;
-    border-radius: 4px;
-}
-
-/* 新增邮箱和确认分发按钮样式 */
-#distribute-email-add-button, #distribute-confirm-button {
-    margin-top: 10px;
-    padding: 10px;
-    background-color: #007bff;
-    color: white;
-    border: none;
-    border-radius: 4px;
-    cursor: pointer;
-}
-
-#distribute-email-add-button:hover, #distribute-confirm-button:hover {
-    background-color: #0056b3;
-}
-
 
 
 /*------------分发历史模态框*/

+ 44 - 21
static/license_info/license_info.html

@@ -5,6 +5,7 @@
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>XUGULicense</title>
     <link rel="stylesheet" href="license_info.css">
+    <link rel="stylesheet" href="license_info_distribution.css">
 </head>
 <body>
 
@@ -79,35 +80,57 @@
     </div>
 </div>
 
-<!-- 新的分发模态框 -->
-<!-- 新的分发模态框 -->
-<div id="distribute-modal" class="distribute-modal">
-    <div class="distribute-modal-content">
-        <span class="distribute-close">&times;</span>
-
-        <!-- 上半部分: 分发邮箱 -->
-        <div id="distribute-email-section" class="distribute-header">
-            <h2>分发邮箱</h2>
-            <button id="distribute-email-add-button">新增邮箱</button> <!-- 新增邮箱按钮 -->
-            <div id="emailInputs">
-                <!-- 动态生成邮箱输入区域 -->
-            </div>
-        </div>
+
+<!-- 分发模态框 -->
+<div id="DistributeModal" class="DistributeModal">
+    <div class="DistributeModal-content">
+        <span class="DistributeModal-close">&times;</span>
+
+  <!-- 上半部分: 分发邮箱 -->
+<div id="DistributeModal-email-section" class="DistributeModal-section">
+    <h2>分发邮箱</h2>
+    <div class="DistributeModal-email-button-wrapper">
+        <button id="DistributeModal-add-email-btn" class="DistributeModal-button">新增邮箱</button>
+        <button id="DistributeModal-email-confirm-btn" class="DistributeModal-button">确认邮箱分发</button>
+    </div>
+    <div id="DistributeModal-email-inputs">
+        <!-- 动态生成邮箱输入 -->
+    </div>
+    <!-- 新增:复选框行 -->
+    <div id="DistributeModal-checkbox-row" class="DistributeModal-checkbox-wrapper">
+        <label class="DistributeModal-checkbox-label">
+            <input type="checkbox" id="salesEmailCheckbox" class="DistributeModal-checkbox">
+            <span class="DistributeModal-checkbox-custom"></span>
+            销售邮箱 (${item.SalesPerson}: ${item.SalesEmail})
+        </label>
+        <label class="DistributeModal-checkbox-label">
+            <input type="checkbox" id="supportEmailCheckbox" class="DistributeModal-checkbox">
+            <span class="DistributeModal-checkbox-custom"></span>
+            运维邮箱 (${item.SupportPerson}: ${item.SupportEmail})
+        </label>
+    </div>
+</div>
+
+
 
         <!-- 下半部分: 分发用户 -->
-        <div id="distribute-user-section" class="distribute-body">
-            <h2>分发用户</h2>
-            <div id="userInputs">
-                <!-- 动态生成用户选择输入区域 -->
+        <div id="DistributeModal-user-section" class="DistributeModal-section">
+            <div class="DistributeModal-user-button-wrapper">
+                <button id="distributeUser-add-select-btn" class="DistributeModal-button">新增用户下拉框</button>
+                <button id="distributeUser-confirm-btn" class="DistributeModal-button">确认用户分发</button>
+            </div>
+            <div id="DistributeModal-user-inputs">
+                <!-- 动态生成的用户选择框 -->
             </div>
         </div>
-
-        <!-- 确认分发按钮 -->
-        <button id="distribute-confirm-button" class="distribute-confirm-button">确认分发</button>
+        
     </div>
 </div>
 
 
+
+
+
 <!-- 分发历史模态框 -->
 <div id="distributionHistory-modal" class="distributionHistory-modal">
     <div class="distributionHistory-modal-content">

+ 48 - 258
static/license_info/license_info.js

@@ -456,7 +456,8 @@ function initializeHeaderContent(firstItem,sortedItem) {
 
 console.log(`当前用户是否有生成权限: ${hasGeneratePermission}, ${hasDispatchPermission}`);
     // 设置卡片内容
-    modalHeader.innerHTML = `
+// 修改后的卡片内容部分代码
+modalHeader.innerHTML = `
     <div class="license-info-card-header">
         <h3 class="card-title">${firstItem.GlxmName}</h3>
     </div>
@@ -469,8 +470,11 @@ console.log(`当前用户是否有生成权限: ${hasGeneratePermission}, ${hasD
         <div class="license-info-card-buttons">
             ${
             firstItem.LicenseFlage === '已生成' && hasDispatchPermission
-                ? `<button class="license-info-modal-button" id="generateOrDistribute">分发</button>`
-                : firstItem.LicenseFlage !== '已生成' && hasGeneratePermission
+                ? `<button class="license-info-modal-button" id="distributeButton">分发</button>`
+                : `<button class="license-info-modal-button" id="distributeButton" disabled style="background-color:#ccc;cursor:not-allowed;">分发</button>`
+            }
+            ${
+            firstItem.LicenseFlage !== '已生成' && hasGeneratePermission
                 ? `<button class="license-info-modal-button" id="generateOrDistribute">生成</button>`
                 : ''
             }
@@ -478,11 +482,10 @@ console.log(`当前用户是否有生成权限: ${hasGeneratePermission}, ${hasD
             <button id="viewDistributionHistory-button">查看分发历史</button>
         </div>
     </div>
-    `;
+`;
 
-        // 绑定 button1 的点击事件(如果按钮存在)
+        // 绑定 generateOrDistribute 的点击事件(如果按钮存在)
         const generateOrDistribute = modalHeader.querySelector('#generateOrDistribute');
-        console.log("generateOrDistribute",generateOrDistribute);  // 检查是否找到按钮
         if (generateOrDistribute) {
             generateOrDistribute.addEventListener('click', () => {
                 if (firstItem.LicenseFlage === '已生成') {
@@ -496,10 +499,27 @@ console.log(`当前用户是否有生成权限: ${hasGeneratePermission}, ${hasD
                 }
                 console.log('Button 1 clicked');
             });
-        }
-;
-            
+        };
+
+        // 绑定分发按钮的点击事件
+        const distributeButton = modalHeader.querySelector('#distributeButton');
+        if (distributeButton && !distributeButton.disabled) {
+            distributeButton.addEventListener('click', () => {
+                showDistributeModal(firstItem);
+            });
+        }  
           
+        //         // 在生成或分发按钮点击时,调用 showDistributeModal 函数
+        // generateOrDistribute.addEventListener('click', () => {
+        //     if (firstItem.LicenseFlage === '已生成') {
+        //         showDistributeModal(firstItem);  // 显示分发模态框
+        //     } else {
+        //         const oaRequestID = parseInt(firstItem.oa_request_id, 10);  // 生成许可证
+        //         generateLicense(oaRequestID, true);
+        //     }
+        // });
+
+
 
         // 绑定 "打包下载所有license.dat" 按钮的点击事件
         const downloadButton = modalHeader.querySelector('#downloadAllLicenses-button');
@@ -689,250 +709,6 @@ function downloadAllLicenses(sortedApplicationArray) {
     });
 }
 
-//分发
-let userMap = {};
-
-// 打开分发模态框
-function showDistributeModal(firstItem) {
-    console.log("showDistributeModal firstItem", firstItem);
-    const modal = document.getElementById('distribute-modal');
-    const emailInputs = document.getElementById('emailInputs');
-    const userInputs = document.getElementById('userInputs');
-    let usedUsernames = []; // 存储已选择的用户
-
-    // 清空内容
-    emailInputs.innerHTML = '';
-    userInputs.innerHTML = '';
-
-    // 动态生成分发邮箱部分
-    if (firstItem.SupportEmail) {
-        emailInputs.innerHTML += `<div><input type="checkbox" id="supportEmail" value="${firstItem.SupportEmail}"> 运维邮箱: ${firstItem.SupportEmail}</div>`;
-    }
-    if (firstItem.SalesEmail) {
-        emailInputs.innerHTML += `<div><input type="checkbox" id="salesEmail" value="${firstItem.SalesEmail}"> 销售邮箱: ${firstItem.SalesEmail}</div>`;
-    }
-
-    // 调用 API 获取用户信息并填充第一个用户输入框
-    fetch('http://127.0.0.1:8080/api/admin/distributeLicenseByUserInfo', {
-        method: 'GET',
-        headers: {
-            'Authorization': `Bearer ${authToken}`, // 确保 token 已经定义
-            'Content-Type': 'application/json'
-        }
-    })
-    .then(response => response.json())
-    .then(data => {
-        // 初始化 userMap
-        userMap = {};
-        
-        const availableUsers = data.data
-            .map(user => {
-                // 将用户信息存储在 userMap 中
-                userMap[user.Username] = {
-                    Account: user.Account,
-                    UniqueID: user.UniqueID,
-                    Username: user.Username,
-                    Email: user.Email,
-                    Role: user.Role,
-                    Telephone: user.Telephone
-                };
-                return user.Username;
-            })
-            .filter(user => user !== 'admin'); // 排除用户名为 "admin"
-
-      //  createUserSelect(userInputs, availableUsers, usedUsernames); // 创建第一个下拉框
-
-        // 创建“添加用户”按钮
-        const addButton = document.createElement('button');
-        addButton.className = 'distribute-add-user-button';
-        addButton.textContent = '添加用户';
-        addButton.addEventListener('click', () => {
-            createUserSelect(userInputs, availableUsers, usedUsernames); // 添加新的下拉框
-        });
-        userInputs.appendChild(addButton);
-        
-        // 创建“确定分发”按钮
-        const distributeButton = document.createElement('button');
-        distributeButton.className = 'distribute-confirm-button';
-        distributeButton.textContent = '确定分发';
-        distributeButton.addEventListener('click', () => {
-            // 弹出确认框
-            if (confirm('确定要分发许可证吗?')) {
-                // 获取选中的用户信息
-                const selectedUserInputs = Array.from(document.querySelectorAll('select.distribute-user-select'));
-
-                const userIds = selectedUserInputs.map(select => userMap[select.value].UniqueID);
-                const userAccounts = selectedUserInputs.map(select => userMap[select.value].Account);
-                const userNames = selectedUserInputs.map(select => userMap[select.value].Username);
-
-                // 将提前获取的用户信息传递给 distributeLicenseToUsers 函数
-                distributeLicenseToUsers(firstItem, userIds, userAccounts, userNames);
-            }
-        });
-        userInputs.appendChild(distributeButton);
-    })
-    .catch(error => console.error('获取用户信息失败:', error));
-
-    // 显示模态框
-    modal.style.display = 'flex';
-
-    // 关闭按钮事件
-    const closeButton = document.querySelector('#distribute-modal .distribute-close');
-    closeButton.addEventListener('click', () => {
-        modal.style.display = 'none';
-    });
-
-    // 点击模态框外部区域时关闭模态框
-    window.addEventListener('click', function(event) {
-        if (event.target === modal) {
-            modal.style.display = 'none';
-        }
-    });
-}
-
-
-//分发license 到用户
-function distributeLicenseToUsers(selectedRowData, userIds, userAccounts, userNames) {
-    console.log('Distribute button clicked');
-    console.log('userIds', userIds);
-    console.log('userAccounts', userAccounts);
-    console.log('userNames', userNames);
-
-    // 显示加载进度条并设置动态提示信息
-    showLoadingModal('正在分发 License...');
-
-    const operatorUniqueID = userMap[currentUserName].UniqueID;
-
-    if (userIds.length === 0) {
-        alert('请至少选择一个用户。');
-        hideLoadingModal();
-        return;
-    }
-
-    const requestData = {
-        LicenseUniqueID: selectedRowData.UniqueID,  // 当前选中的 License ID
-        Oa_request_id:  selectedRowData.oa_request_id,  // 当前选中的 OA 请求 ID
-        UserUniqueIDs: userIds,  // 用户 ID 数组
-        UserAccounts: userAccounts,  // 用户账号数组
-        UserNames: userNames,  // 用户名数组
-        Emails: '',  // 邮箱(可以根据需要添加或删除)
-        OperatorUniqueID: operatorUniqueID  // 操作者的唯一 ID
-    };
-
-    console.log('requestData:', requestData);
-
-    // 发起 POST 请求到分发 License 的 API
-    fetch('http://127.0.0.1:8080/api/admin/DistributeLicenseToUser', {
-        method: 'POST',
-        headers: {
-            'Authorization': `Bearer ${authToken}`,
-            'Content-Type': 'application/json'
-        },
-        body: JSON.stringify(requestData)
-    })
-    .then(response => response.json())
-    .then(data => {
-        hideLoadingModal();
-
-        if (data.success) {
-            alert('分发成功!');
-            closeModal('distribute-modal');  // 关闭模态框
-        } else {
-            const errorMessage = data.error || '分发失败。';
-            alert(`分发失败: ${errorMessage}`);
-        }
-    })
-    .catch(error => {
-        hideLoadingModal();
-        console.error('Error occurred during license distribution:', error);
-        alert('分发失败,请检查网络或后端服务。');
-    });
-}
-
-// 创建新的下拉框并过滤掉已选择的用户
-// 创建新的下拉框并过滤掉已选择的用户
-function createUserSelect(container, availableUsers, usedUsernames) {
-    // 创建下拉框容器
-    const userSelectContainer = document.createElement('div');
-    userSelectContainer.className = 'distribute-modal-user-select-container';
-
-    // 创建下拉框
-    const userSelect = document.createElement('select');
-    userSelect.className = 'distribute-modal-user-select';
-
-    // 过滤掉已经选中的用户
-    const filteredUsers = availableUsers.filter(user => !usedUsernames.includes(user));
-
-    // 填充下拉框选项
-    filteredUsers.forEach(user => {
-        const option = document.createElement('option');
-        option.value = user;
-        option.textContent = user;
-        userSelect.appendChild(option);
-    });
-
-    // 创建关闭按钮
-    const closeButton = document.createElement('span');
-    closeButton.textContent = 'X';
-    closeButton.className = 'distribute-modal-close-select'; // 添加类名以便样式化
-    closeButton.style.cursor = 'pointer'; // 鼠标样式
-    closeButton.style.marginLeft = '10px'; // 与下拉框之间的间距
-
-    // 关闭按钮点击事件,删除下拉框和自身,并从已选择用户名数组中移除
-    closeButton.addEventListener('click', function() {
-        // 从已选择的用户名中移除
-        const selectedValue = userSelect.value;
-        const index = usedUsernames.indexOf(selectedValue);
-        if (index > -1) {
-            usedUsernames.splice(index, 1); // 移除已选择的用户名
-        }
-        container.removeChild(userSelectContainer); // 删除下拉框容器
-    });
-
-    // 将下拉框和关闭按钮添加到容器中
-    userSelectContainer.appendChild(userSelect);
-    userSelectContainer.appendChild(closeButton);
-
-    // 将下拉框容器添加到父容器中
-    container.appendChild(userSelectContainer);
-
-    // 当选择新用户时,将其添加到已选择的用户名数组中
-    userSelect.addEventListener('change', function() {
-        const previousValue = usedUsernames.find(u => u === this.defaultValue);
-        if (previousValue) {
-            // 如果之前的值存在且不同于新值,则移除之前的值
-            usedUsernames.splice(usedUsernames.indexOf(previousValue), 1);
-        }
-        usedUsernames.push(this.value); // 添加新选中的用户名
-        this.defaultValue = this.value; // 更新默认值
-        console.log('已选择的用户:', usedUsernames);
-    });
-}
-
-
-// 更新下拉框选项,过滤掉已选择的用户名
-function updateUserSelectOptions(availableUsers, usedUsernames, container) {
-    const allSelects = container.querySelectorAll('.distribute-modal-user-select');
-    
-    allSelects.forEach(select => {
-        const currentValue = select.value; // 保存当前选中值
-        // 清空下拉框
-        select.innerHTML = '';
-
-        // 重新填充选项,排除已选中的用户,确保当前选择保留
-        availableUsers.forEach(user => {
-            if (!usedUsernames.includes(user) || user === currentValue) {
-                const option = document.createElement('option');
-                option.value = user;
-                option.textContent = user;
-                if (user === currentValue) {
-                    option.selected = true; // 保留当前选中项
-                }
-                select.appendChild(option);
-            }
-        });
-    });
-}
 
 
 
@@ -1097,7 +873,7 @@ async function fetchUsername() {
         
         // 使用获取到的角色,调用获取权限的接口
         await fetchPermissionsByRole(currentUserRole);
-
+        console.log('当前用户角色:', data);
         return data.data; // 返回获取到的用户信息数据
     
     } catch (error) {
@@ -1209,6 +985,14 @@ function filterContent() {
     console.log('过滤功能触发');
         // 移除滚动监听器,停止滚动加载
        // removeScrollListeners();
+    console.log('statusFilter.valuesdaad撒大啊', statusFilter.value,startDate.value ,endDate.value,searchBar.value );
+
+ // 检查如果所有输入框都是默认值,则直接返回,不发送数据
+ if (!statusFilter.value && !startDate.value && !endDate.value && !searchBar.value) {
+    console.log("所有过滤条件为空,不发送请求");
+    return;  // 不发送请求
+}
+
     // 构建请求体参数
     const requestData = {
         license_flag: statusFilter.value || undefined,
@@ -1250,11 +1034,17 @@ function displayLicenseInfo(data) {
 }
 // 确定按钮点击事件的修改(停止滚动监听)
 submitButton.addEventListener('click', function() {
-    // 执行过滤内容功能
-    filterContent();
+      // 检查下拉框和时间选择框是否为默认值
+      if (!statusFilter.value && !startDate.value && !endDate.value) {
+        // 如果都是默认值,则刷新页面
+        location.reload();
+    } else {
+        // 否则,执行过滤内容功能
+        filterContent();
 
-    // 隐藏滚动加载,防止继续加载更多内容
-    removeScrollListeners();
+        // 隐藏滚动加载,防止继续加载更多内容
+        removeScrollListeners();
+    }
 });
 
 

+ 207 - 0
static/license_info/license_info_distribution.css

@@ -0,0 +1,207 @@
+/* 分发模态框基础样式 */
+.DistributeModal {
+    display: none; /* 初始隐藏 */
+    position: fixed;
+    z-index: 1000;
+    left: 0;
+    top: 0;
+    width: 100%;
+    height: 100%;
+    background-color: rgba(0, 0, 0, 0.5); /* 半透明背景 */
+    justify-content: center;
+    align-items: center;
+}
+
+.DistributeModal-content {
+    background-color: white;
+    padding: 20px;
+    width: 400px;
+    max-width: 90%;
+    border-radius: 10px;
+    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
+    position: relative;
+    text-align: center;
+}
+
+/* 关闭按钮 */
+.DistributeModal-close {
+    position: absolute;
+    top: 10px;
+    right: 15px;
+    font-size: 24px;
+    color: #333;
+    cursor: pointer;
+}
+
+/* 分发模态框上、下两个部分的样式 */
+.DistributeModal-section {
+    margin-bottom: 20px;
+    padding: 15px;
+    border: 1px solid #ccc; /* 细边框 */
+    border-radius: 5px;
+    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* 阴影效果 */
+}
+
+/* 输入框样式 */
+.DistributeModal-email-input-wrapper {
+    display: flex;
+    align-items: center;
+    margin-bottom: 10px;
+}
+
+.DistributeModal-email-input {
+    flex: 1;
+    padding: 10px;
+    border: 1px solid #ccc;
+    border-radius: 15px;
+    background-color: #f5f5f5; /* iOS 风格背景 */
+    box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+    font-size: 16px;
+    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
+}
+
+/* 删除按钮样式 */
+.DistributeModal-remove-email-btn {
+    background-color: #ff3b30; /* iOS 风格红色按钮 */
+    color: white;
+    border: none;
+    border-radius: 50%;
+    width: 25px;
+    height: 25px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    cursor: pointer;
+    flex-shrink: 0; /* 确保按钮不会缩小 */
+}
+
+
+.DistributeModal-remove-email-btn:hover {
+    background-color: #d32f2f; /* 更深的红色 */
+}
+
+/* 布局:将新增邮箱和确认分发按钮放在一行 */
+.DistributeModal-email-button-wrapper {
+    display: flex;
+    justify-content: space-between; /* 按钮之间均匀分布 */
+    gap: 5px; /* 将按钮之间的间距缩小为 5px */
+    margin-bottom: 10px; /* 与输入框部分保持一定距离 */
+}
+
+/* 按钮样式 */
+.DistributeModal-button {
+    background-color: #007aff; /* iOS风格的蓝色按钮 */
+    color: white;
+    padding: 10px;
+    border: none;
+    border-radius: 5px;
+    cursor: pointer;
+    margin-top: 10px;
+    flex: 1; /* 使按钮占据相同宽度 */
+}
+
+.DistributeModal-button:hover {
+    background-color: #0056b3;
+}
+
+/* 复选框容器样式 */
+.DistributeModal-checkbox-wrapper {
+    display: flex;
+    justify-content: space-between;
+    margin-top: 10px;
+}
+
+/* 复选框标签样式 */
+.DistributeModal-checkbox-label {
+    display: flex;
+    align-items: center;
+    font-size: 16px;
+    color: #333;
+    cursor: pointer;
+}
+
+/* 隐藏默认复选框 */
+.DistributeModal-checkbox {
+    appearance: none;
+    -webkit-appearance: none;
+    position: absolute;
+    opacity: 0;
+}
+
+/* 自定义复选框样式 */
+.DistributeModal-checkbox-custom {
+    width: 40px;
+    height: 20px;
+    background-color: #ccc;
+    border-radius: 10px;
+    position: relative;
+    transition: background-color 0.3s;
+}
+
+/* 复选框选中后的样式 */
+.DistributeModal-checkbox:checked + .DistributeModal-checkbox-custom {
+    background-color: #007aff; /* iOS 风格的蓝色 */
+}
+
+/* 滑动的圆点 */
+.DistributeModal-checkbox-custom::before {
+    content: "";
+    position: absolute;
+    top: 2px;
+    left: 2px;
+    width: 16px;
+    height: 16px;
+    background-color: white;
+    border-radius: 50%;
+    transition: transform 0.3s;
+}
+
+/* 复选框选中后,圆点移动 */
+.DistributeModal-checkbox:checked + .DistributeModal-checkbox-custom::before {
+    transform: translateX(20px);
+}
+
+/* 分发用户 */
+/* 布局:将新增下拉框和确认用户分发按钮放在一行 */
+.DistributeModal-user-button-wrapper {
+    display: flex;
+    justify-content: space-between; /* 按钮均匀分布 */
+    gap: 10px; /* 间距 */
+    margin-bottom: 10px;
+}
+
+
+
+/* iOS 风格下拉框样式 */
+
+.distributeUser-select {
+    flex: 1; /* 使下拉框占据剩余空间 */
+    max-width: 80%; /* 确保下拉框不会占据过多空间 */
+    padding: 5px;
+    border-radius: 10px;
+    background-color: #f5f5f5; /* iOS 风格浅色背景 */
+    border: 1px solid #ccc;
+    font-size: 14px;
+    -webkit-appearance: none; /* 移除默认下拉箭头样式 */
+    appearance: none;
+    margin-right: 10px; /* 留出与关闭按钮的间距 */
+   
+}
+
+
+.distributeUser-select-wrapper {
+    display: flex;
+    align-items: center;
+    margin-bottom: 10px;
+}
+
+
+/* 自定义下拉箭头 */
+.distributeUser-select-wrapper::after {
+    content: '▼';
+    position: absolute;
+    right: 10px;
+    top: 50%;
+    transform: translateY(-50%);
+    pointer-events: none; /* 让箭头不可点击 */
+}

+ 417 - 0
static/license_info/license_info_distribution.js

@@ -1,3 +1,420 @@
+// 显示分发模态框的函数
+function showDistributeModal(item) {
+    const modal = document.getElementById('DistributeModal');
+
+    // 显示模态框
+    modal.style.display = 'flex';
+
+    let usersInfo;
+    // 获取用户信息并填充第一个用户输入框
+    fetch('http://127.0.0.1:8080/api/admin/distributeLicenseByUserInfo', {
+        method: 'GET',
+        headers: {
+            'Authorization': `Bearer ${authToken}`, // 确保autoToken是您获取的用户授权令牌
+            'Content-Type': 'application/json'
+        }
+    })
+    .then(response => {
+        if (!response.ok) {
+            throw new Error('Network response was not ok');
+        }
+        return response.json();
+    })
+    .then(data => {
+         usersInfo = data.data; // 假设 data 是返回的用户信息数组或对象
+        console.log('用户信息:', usersInfo); // 打印用户信息
+
+    // 调用处理上半部分(邮箱输入框)的函数
+    handleEmailSection(item,usersInfo);
+
+    // 调用处理下半部分(用户输入框)的函数
+    handleUserSection(item, usersInfo);
+      
+    })
+    .catch(error => {
+        console.error('获取用户信息失败:', error);
+    });
+
+
+
+
+    // 绑定关闭事件
+    const closeModalBtn = document.querySelector('.DistributeModal-close');
+    closeModalBtn.addEventListener('click', closeDistributeModal);
+
+    // 点击模态框外部关闭
+    window.addEventListener('click', (event) => {
+        if (event.target === modal) {
+            closeDistributeModal();
+        }
+    });
+}
+
+
+function handleEmailSection(item,usersInfo) {
+    console.log('handleEmailSection 用户信息:', usersInfo); // 打印用户信息
+    const emailInputs = document.getElementById('DistributeModal-email-inputs');
+    emailInputs.innerHTML = ''; // 清空之前添加的邮箱输入框
+
+    // 设置复选框标签内容
+    const salesEmailLabel = document.getElementById('salesEmailCheckbox').parentElement;
+    salesEmailLabel.innerHTML = `
+        <input type="checkbox" id="salesEmailCheckbox" class="DistributeModal-checkbox">
+        <span class="DistributeModal-checkbox-custom"></span>
+        销售邮箱 (${item.SalesPerson}: ${item.SalesEmail})
+    `;
+
+    const supportEmailLabel = document.getElementById('supportEmailCheckbox').parentElement;
+    supportEmailLabel.innerHTML = `
+        <input type="checkbox" id="supportEmailCheckbox" class="DistributeModal-checkbox">
+        <span class="DistributeModal-checkbox-custom"></span>
+        运维邮箱 (${item.SupportPerson}: ${item.SupportEmail})
+    `;
+
+    // 防止重复绑定事件,先移除任何现有的点击事件监听器
+    const addEmailBtn = document.getElementById('DistributeModal-add-email-btn');
+    addEmailBtn.replaceWith(addEmailBtn.cloneNode(true)); // 通过克隆移除所有之前绑定的事件
+    const newAddEmailBtn = document.getElementById('DistributeModal-add-email-btn');
+
+    // 绑定一次点击事件,动态添加邮箱输入框
+    newAddEmailBtn.addEventListener('click', () => {
+        const emailWrapper = document.createElement('div');
+        emailWrapper.className = 'DistributeModal-email-input-wrapper';
+
+        const newEmailInput = document.createElement('input');
+        newEmailInput.type = 'email';
+        newEmailInput.placeholder = '输入分发邮箱';
+        newEmailInput.className = 'DistributeModal-email-input';
+
+        // 创建删除按钮
+        const removeEmailBtn = document.createElement('button');
+        removeEmailBtn.className = 'DistributeModal-remove-email-btn';
+        removeEmailBtn.innerHTML = '&times;'; // × 符号
+        removeEmailBtn.addEventListener('click', () => {
+            emailWrapper.remove(); // 删除邮箱输入框
+        });
+
+        // 将输入框和删除按钮加入到 emailWrapper 中
+        emailWrapper.appendChild(newEmailInput);
+        emailWrapper.appendChild(removeEmailBtn);
+
+        // 将 emailWrapper 加入到 emailInputs 容器中
+        emailInputs.appendChild(emailWrapper);
+    });
+
+    // 内部函数:检查是否存在重复项
+    function findDuplicates(arr) {
+        const seen = new Set();
+        const duplicates = [];
+
+        arr.forEach((email) => {
+            if (seen.has(email)) {
+                duplicates.push(email);
+            } else {
+                seen.add(email);
+            }
+        });
+
+        return duplicates;
+    }
+
+    // 点击上半部分的确认按钮
+    const emailConfirmBtn = document.getElementById('DistributeModal-email-confirm-btn');
+    emailConfirmBtn.addEventListener('click', () => {
+        // 收集邮箱信息
+        let emails = Array.from(document.querySelectorAll('.DistributeModal-email-input'))
+                            .map(input => input.value.trim());
+
+        // 检查是否勾选销售邮箱或运维邮箱
+        const isSalesEmailChecked = document.getElementById('salesEmailCheckbox').checked;
+        const isSupportEmailChecked = document.getElementById('supportEmailCheckbox').checked;
+
+        if (isSalesEmailChecked) {
+            emails.push(item.SalesEmail); // 如果勾选了销售邮箱,添加到邮箱列表
+        }
+
+        if (isSupportEmailChecked) {
+            emails.push(item.SupportEmail); // 如果勾选了运维邮箱,添加到邮箱列表
+        }
+
+        // 检查是否存在重复的邮箱
+        const duplicateEmails = findDuplicates(emails);
+
+        if (duplicateEmails.length > 0) {
+            // 如果有重复的邮箱,弹出提示
+            alert(`以下邮箱重复:\n${duplicateEmails.join('\n')}`);
+        } else {
+            // 没有重复的邮箱,弹出确认发送提示
+            if (confirm("确认发送这些邮件吗?")) {
+                // 执行邮箱分发逻辑
+               // distributeLicense(item, emails, []);
+               distributeEmails(item, emails, usersInfo);
+                closeDistributeModal(); // 关闭模态框
+            }
+        }
+    });
+}
+
+
+function handleUserSection(item, usersInfo) { 
+    console.log('handleUserSection 用户信息:', usersInfo); // 打印用户信息
+    const userInputs = document.getElementById('DistributeModal-user-inputs'); 
+    userInputs.innerHTML = ''; // 清空之前添加的用户选择框
+
+    // 过滤掉 admin 账户
+    const filteredUsersInfo = usersInfo.filter(user => user.Username !== 'admin');
+    
+    // 用于存储已经选择的用户
+    let selectedUsersSet = new Set();
+
+    // 绑定新增下拉框按钮
+    const addSelectBtn = document.getElementById('distributeUser-add-select-btn');
+    addSelectBtn.replaceWith(addSelectBtn.cloneNode(true)); // 防止重复绑定
+    const newAddSelectBtn = document.getElementById('distributeUser-add-select-btn');
+
+    // 函数:更新所有下拉框中的可选项
+    const updateSelectOptions = () => {
+        Array.from(document.querySelectorAll('.distributeUser-select')).forEach(select => {
+            const currentValue = select.value; // 当前选中的值
+            select.innerHTML = ''; // 清空选项
+
+            // 添加默认的空选项(必须手动选择)
+            const defaultOption = document.createElement('option');
+            defaultOption.value = ''; // 设置为空值
+            defaultOption.textContent = '请选择用户';
+            select.appendChild(defaultOption);
+
+            filteredUsersInfo.forEach(user => {
+                if (!selectedUsersSet.has(user.UniqueID) || user.UniqueID === currentValue) {
+                    const option = document.createElement('option');
+                    option.value = user.UniqueID;
+                    option.setAttribute('data-username', user.Username);
+                    option.setAttribute('data-account', user.Account);
+                    option.textContent = `${user.Username} (${user.Account})`;
+
+                    // 如果是当前选中的值,保持选中状态
+                    if (user.UniqueID === currentValue) {
+                        option.selected = true;
+                    }
+
+                    select.appendChild(option);
+                }
+            });
+        });
+    };
+
+    newAddSelectBtn.addEventListener('click', () => {
+        const selectWrapper = document.createElement('div');
+        selectWrapper.className = 'distributeUser-select-wrapper'; // Flexbox 容器
+
+        const select = document.createElement('select');
+        select.className = 'distributeUser-select'; // 设置下拉框样式
+
+        // 添加一个默认的空选项
+        const defaultOption = document.createElement('option');
+        defaultOption.value = '';
+        defaultOption.textContent = '请选择用户'; // 这个选项提示用户选择
+        defaultOption.selected = true; // 默认选中这个选项
+        select.appendChild(defaultOption);
+
+        // 初始更新下拉框
+        updateSelectOptions();
+
+        // 监听下拉框的变化
+        select.addEventListener('change', () => {
+            const previousValue = select.dataset.previousValue;
+
+            // 如果之前有选中,移除旧值
+            if (previousValue) {
+                selectedUsersSet.delete(previousValue);
+            }
+
+            // 如果有新的选择,添加到 set 中
+            if (select.value) {
+                selectedUsersSet.add(select.value);
+                select.dataset.previousValue = select.value; // 保存当前值为下次移除准备
+            }
+
+            // 更新其他下拉框的选项
+            updateSelectOptions();
+        });
+
+        // 创建删除按钮,使用与关闭邮件输入框相同的样式
+        const removeSelectBtn = document.createElement('button');
+        removeSelectBtn.className = 'DistributeModal-remove-email-btn'; // 使用关闭邮件输入框的按钮样式
+        removeSelectBtn.innerHTML = '&times;';
+        removeSelectBtn.addEventListener('click', () => {
+            const previousValue = select.dataset.previousValue;
+            if (previousValue) {
+                selectedUsersSet.delete(previousValue); // 删除时从选中集中移除
+            }
+            selectWrapper.remove(); // 删除下拉框
+            updateSelectOptions(); // 更新其他下拉框的选项
+        });
+
+        // 将下拉框和删除按钮加入到 selectWrapper 中
+        selectWrapper.appendChild(select);
+        selectWrapper.appendChild(removeSelectBtn);
+
+        // 将 selectWrapper 加入到 userInputs 容器中
+        userInputs.appendChild(selectWrapper);
+
+        // 初始更新其他下拉框
+        updateSelectOptions();
+    });
+
+    // 点击下半部分的确认按钮
+    const userConfirmBtn = document.getElementById('distributeUser-confirm-btn'); 
+    userConfirmBtn.addEventListener('click', () => { 
+        // 收集用户信息,收集每个下拉框选中的值及其额外数据
+        const selectedUsers = Array.from(document.querySelectorAll('.distributeUser-select')) 
+            .map(select => {
+                if (select.value) {
+                    const selectedUserInfo = {
+                        uniqueID: select.value,
+                        username: select.options[select.selectedIndex].getAttribute('data-username'),
+                        account: select.options[select.selectedIndex].getAttribute('data-account')
+                    };
+                    return selectedUserInfo; // 返回用户的所有信息
+                }
+            })
+            .filter(user => user !== undefined); // 过滤掉未选择的空值
+
+        // 分别提取 uniqueID, username 和 account 数组
+        const uniqueIDArray = selectedUsers.map(user => user.uniqueID);
+        const usernameArray = selectedUsers.map(user => user.username);
+        const accountArray = selectedUsers.map(user => user.account);
+
+        console.log("Unique IDs: ", uniqueIDArray);
+        console.log("Usernames: ", usernameArray);
+        console.log("Accounts: ", accountArray);
+        
+        // 执行用户分发逻辑,传递用户详细信息到 distributeLicense
+        distributeUser(item, uniqueIDArray, usernameArray, accountArray); 
+        closeDistributeModal(); // 关闭模态框 
+    });
+}
+
+
+
+
+
+// 关闭分发模态框的函数
+function closeDistributeModal() {
+    const modal = document.getElementById('DistributeModal');
+    modal.style.display = 'none'; // 隐藏模态框
+
+    // 清空邮箱和用户输入区域
+    const emailInputs = document.getElementById('DistributeModal-email-inputs');
+    emailInputs.innerHTML = ''; // 清空动态生成的邮箱输入框
+
+    const userInputs = document.getElementById('DistributeModal-user-inputs');
+    userInputs.innerHTML = ''; // 清空动态生成的用户选择框
+}
+
+function distributeEmails(item, emails, usersInfo) {
+    console.log('分发 distributeEmails', { item, emails, usersInfo });
+
+    // 将 emails 数组转为以逗号分隔的字符串
+    const emailsString = emails.join(',');
+
+    // 从 usersInfo 中获取 currentUserInfo
+    //const currentUserInfo = usersInfo.find(user => user.role === 'currentUser'); // 假设 currentUser 标识当前用户
+
+    if (!currentUserInfo) {
+        console.error('无法获取当前用户信息');
+        return;
+    }
+
+    // 构建要发送的数据
+    const postData = {
+        emails: emailsString,
+        LicenseUniqueID: item.UniqueID,            // item 中的 UniqueID
+        Oa_request_id: item.oa_request_id,  // item 中的 oa_request_id
+        OperatorUniqueID: currentUserInfo.UniqueID // currentUserInfo 中的 UniqueID
+    };
+
+    console.log('即将发送的数据:', postData);
+    showLoadingModal("正在分发邮箱中...");
+    // 发送 POST 请求到 DistributeLicenseToEmail 接口
+    fetch('http://127.0.0.1:8080/api/admin/DistributeLicenseToEmail', {
+        method: 'POST',
+        headers: {
+            'Authorization': `Bearer ${authToken}`, // 使用 authToken
+            'Content-Type': 'application/json'
+        },
+        body: JSON.stringify(postData) // 将数据转为 JSON 格式
+    })
+    .then(response => {
+        if (!response.ok) {
+            hideLoadingModal();
+            throw new Error('Network response was not ok');
+        }
+        return response.json();
+    })
+    .then(data => {
+        // 处理成功响应
+        hideLoadingModal();
+        console.log('邮件分发成功:', data);
+        alert('邮件分发成功');
+    })
+    .catch(error => {
+        // 处理错误
+        hideLoadingModal();
+        console.error('分发邮件失败:', error);
+        alert('分发邮件失败,请稍后重试');
+    });
+}
+
+
+// 执行分发的逻辑
+function distributeUser(item, uniqueIDArray, usernameArray, accountArray) {
+    // 构建要发送的数据对象
+    const postData = {
+        Oa_request_id: item.oa_request_id,
+        LicenseUniqueID: item.UniqueID,
+        OperatorUniqueID: currentUserInfo.UniqueID, // currentUserInfo 中的 UniqueID
+        UserUniqueIDs: uniqueIDArray,
+        UserNames: usernameArray,
+        UserAccounts: accountArray
+    };
+
+    console.log('Sending user data:', postData);
+    showLoadingModal("正在分发用户中...");
+    // 发送 POST 请求到 DistributeLicenseToUser 接口
+    fetch('http://127.0.0.1:8080/api/admin/DistributeLicenseToUser', {
+        method: 'POST',
+        headers: {
+            'Content-Type': 'application/json',
+            'Authorization': `Bearer ${authToken}` // 使用适当的 authToken
+        },
+        body: JSON.stringify(postData) // 将数据转换为 JSON 字符串发送
+    })
+    .then(response => {
+        hideLoadingModal(); // 隐藏 loading 模态框
+        if (!response.ok) {
+            // 返回错误信息作为 Promise,以便 catch 块捕获
+            return response.json().then(errorData => {
+                // 检查服务器是否返回了特定的错误信息并抛出错误
+                const errorMessage = errorData.error || '网络响应不正确';
+                throw new Error(errorMessage);
+            });
+        }
+        return response.json();
+    })
+    .then(data => {
+        console.log('分发成功:', data);
+        alert('分发成功!');
+    })
+    .catch(error => {
+        hideLoadingModal(); // 在失败时隐藏 loading 模态框
+        console.error('分发失败:', error.message); // 打印具体的错误信息
+        alert('分发失败: ' + error.message); // 将错误信息展示给用户
+    });
+    
+}
+
+
 
 
 //--------------分发历史模态框------------------------