Prechádzať zdrojové kódy

feat: 优化用户管理界面,添加选中标记功能并同步状态

caipin 3 dní pred
rodič
commit
b5467ce4c9

+ 181 - 17
app/public/js/setting_manage.js

@@ -163,6 +163,7 @@ function getFilterTenderTreeHtml() {
 }
 
 $(document).ready(() => {
+
     autoFlashHeight();
     function getObjHeight(select) {
         return select.length > 0 ? select.height() : 0;
@@ -242,21 +243,33 @@ $(document).ready(() => {
             $('#user-set').hide();
         } else {
             $('#user-set').show();
-            if ($(this).attr('href') === '#guest') {
+            const href = $(this).attr('href');
+            if (href === '#guest') {
                 $('#add_user_dropdownMenuButton').attr('data-type', 'tourist');
-            } else if ($(this).attr('href') === '#tzpro') {
+            } else if (href === '#tzpro') {
                 $('#add_user_dropdownMenuButton').attr('data-type', 'schedule');
-            } else if ($(this).attr('href') === '#htgl') {
+            } else if (href === '#htgl') {
                 $('#add_user_dropdownMenuButton').attr('data-type', 'contract');
                 $('#contract-tip').show();
-            } else if ($(this).attr('href') === '#sgrz') {
+            } else if (href === '#sgrz') {
                 $('#add_user_dropdownMenuButton').attr('data-type', 'construction');
             } else if (_.includes(tenderPermissionKeys, $(this).attr('href').substring(1))) {
                 $('#add_user_dropdownMenuButton').attr('data-type', $(this).attr('href').substring(1));
             } else if (_.includes(Object.keys(tPsKeys), $(this).attr('href').substring(1))) {
                 $('#add_user_dropdownMenuButton').attr('data-type', $(this).attr('href').substring(1));
             }
+            let currentNavType = null;
+            if (href === '#guest') currentNavType = 'tourist';
+            else if (href === '#tzpro') currentNavType = 'schedule';
+            else if (href === '#htgl') currentNavType = 'contract';
+            else if (href === '#sgrz') currentNavType = 'construction';
+            else if (href === '#zlgl') currentNavType = 'quality';
+            else if (href === '#zlxj') currentNavType = 'inspection';
+            if(currentNavType) {
+                setTimeout(() => updateSelectedMarks(currentNavType), 0);
+            }
         }
+        
     });
 
     $('body').on('click', '.c-body a', function (e) {
@@ -397,6 +410,7 @@ $(document).ready(() => {
         $('body').on('click', `#${key}-users .remove-${key}-user`, function () {
             $('#remove_user_type').val(key);
             $('#remove_user_id').val($(this).data('id'));
+            $('#show_id').val($(this).data('show-id'));
         });
     }
 
@@ -408,10 +422,15 @@ $(document).ready(() => {
             return;
         }
         const id = parseInt($('#remove_user_id').val());
+        const showId = parseInt($('#show_id').val());
         if (type === 'contract') {
             postData('/sp/' + spid + '/contract/tender/' + cur_tenderid + '/audit/save', { type: 'del-audit', id }, function (data) {
-                $('#'+ type + '-users').find('tr[data-id="'+ id +'"]').remove();
+                $('#'+ type + '-users').find('tr[data-uid="'+ id +'"]').remove();
                 $('#remove-user').modal('hide');
+                selectedUserIdsByType[type] = selectedUserIdsByType[type].filter(function(userId) {
+                    return userId !== showId;
+                });
+                updateSelectedMarks();
             });
         } else if (type === 'construction') {
             postData('/sp/' + spid + '/' + type + '/' + cur_tenderid + '/audit/save', { type: 'del-audit', id }, function (data) {
@@ -422,6 +441,19 @@ $(document).ready(() => {
             postData('/sp/' + spid + '/quality/' + cur_tenderid + '/audit/save', { type: 'del-audit', id, key: type }, function (data) {
                 $('#'+ type + '-users').find('tr[data-uid="'+ id +'"]').remove();
                 $('#remove-user').modal('hide');
+                selectedUserIdsByType[type] = selectedUserIdsByType[type].filter(function(userId) {
+                    return userId !== showId;
+                });
+                updateSelectedMarks();
+            });
+        } else if (_.includes(Object.keys(tPsKeys), type)) {
+            postData('/sp/' + spid + '/quality/' + cur_tenderid + '/audit/save', { type: 'del-audit', id, key: type, together: 1 }, function (data) {
+                $('#'+ type + '-users').find('tr[data-uid="'+ id +'"]').remove();
+                $('#remove-user').modal('hide');
+                selectedUserIdsByType[type] = selectedUserIdsByType[type].filter(function(userId) {
+                    return userId !== showId;
+                });
+                updateSelectedMarks();
             });
         } else if (_.includes(Object.keys(tPsKeys), type)) {
             postData('/sp/' + spid + '/quality/' + cur_tenderid + '/audit/save', { type: 'del-audit', id, key: type, together: 1 }, function (data) {
@@ -429,6 +461,7 @@ $(document).ready(() => {
                 $('#remove-user').modal('hide');
             });
         } else {
+            
             const prop = {
                 id: id,
                 type: 'del',
@@ -436,7 +469,12 @@ $(document).ready(() => {
             postData('/tender/' + cur_tenderid + '/' + type + '/audit/save', prop, function (data) {
                 $('#'+ type + '-users').find('tr[data-id="'+ id +'"]').remove();
                 $('#remove-user').modal('hide');
+                selectedUserIdsByType[type] = selectedUserIdsByType[type].filter(function(userId) {
+                    return userId !== showId;
+                });
+                updateSelectedMarks();
             });
+            
         }
 
     });
@@ -445,6 +483,13 @@ $(document).ready(() => {
     let timerAddUser = null;
     let oldSearchValAddUser = null;
     $('body').on('input propertychange', '#add_user_dropdownMenu2 .gr-search', function (e) {
+
+        const currentDropdownType = $('#add_user_dropdownMenuButton').attr('data-type');
+        let currentSelectedIdsForType = [];
+        if (currentDropdownType && selectedUserIdsByType.hasOwnProperty(currentDropdownType)) {
+            currentSelectedIdsForType = selectedUserIdsByType[currentDropdownType]; // 获取对应类型的ID数组
+        }
+
         oldSearchValAddUser = e.target.value;
         timerAddUser && clearTimeout(timerAddUser);
         timerAddUser = setTimeout(() => {
@@ -452,9 +497,14 @@ $(document).ready(() => {
             if (newVal && newVal === oldSearchValAddUser) {
                 let html = '';
                 accountList.filter(item => item && item.id !== cur_uid && (item.name.indexOf(newVal) !== -1 || (item.mobile && item.mobile.indexOf(newVal) !== -1))).forEach(item => {
-                    html += `<dd class="border-bottom p-2 mb-0 " data-id="${item.id}" >
+                    const itemIdInt = parseInt(item.id, 10);
+                    const isSelected = currentSelectedIdsForType.includes(itemIdInt);
+                    const selectedMarkStyle = isSelected ? '' : ' style="display:none;"';
+                    html += `<dd class="border-bottom p-2 mb-0 user-item" data-id="${item.id}" >
                         <p class="mb-0 d-flex"><span class="text-primary">${item.name}</span><span
-                                class="ml-auto">${item.mobile || ''}</span></p>
+                                class="ml-auto">${item.mobile || ''}</span>
+                                <span class="selected-mark text-success ml-2"${selectedMarkStyle}><i class="fa fa-check"></i></span>
+                                </p>
                         <span class="text-muted">${item.role || ''}</span>
                     </dd>`
                 });
@@ -469,6 +519,11 @@ $(document).ready(() => {
     });
 
     function resetAddUserHtml() {
+        const currentDropdownType = $('#add_user_dropdownMenuButton').attr('data-type');
+        let currentSelectedIdsForType = [];
+        if (currentDropdownType && selectedUserIdsByType.hasOwnProperty(currentDropdownType)) {
+            currentSelectedIdsForType = selectedUserIdsByType[currentDropdownType]; 
+        }
         let html = '';
         accountGroup.forEach((group, idx) => {
             if (!group) return;
@@ -477,9 +532,14 @@ $(document).ready(() => {
                         <div class="dd-content" data-toggleid="${idx}">`;
             group.groupList.forEach(item => {
                 if (item.id !== cur_uid) {
-                    html += `<dd class="border-bottom p-2 mb-0 " data-id="${item.id}" >
+                    const itemIdInt = parseInt(item.id, 10);
+                    const isSelected = currentSelectedIdsForType.includes(itemIdInt);
+                    const selectedMarkStyle = isSelected ? '' : ' style="display:none;"';
+                    html += `<dd class="border-bottom p-2 mb-0 user-item" data-id="${item.id}" >
                                     <p class="mb-0 d-flex"><span class="text-primary">${item.name}</span><span
-                                            class="ml-auto">${item.mobile || ''}</span></p>
+                                            class="ml-auto">${item.mobile || ''}</span>
+                                            <span class="selected-mark text-success ml-2"${selectedMarkStyle}><i class="fa fa-check"></i></span>
+                                    </p>
                                     <span class="text-muted">${item.role || ''}</span>
                                 </dd>`;
                 }
@@ -510,7 +570,7 @@ $(document).ready(() => {
     });
 
     // 选中用户
-    $('body').on('click', '#add_user_dropdownMenu2 dl dd', function () {
+    $('body').on('click', '#add_user_dropdownMenu2 dl dd', function (e) {
         const id = parseInt($(this).data('id'));
         if (id) {
             const user = _.find(accountList, function (item) {
@@ -524,6 +584,7 @@ $(document).ready(() => {
                 }
                 if (_.includes(saIdList, id)) {
                     toastr.error('该用户已存在列表中,无需重复添加');
+                    e.stopPropagation();
                     return;
                 }
 
@@ -532,6 +593,7 @@ $(document).ready(() => {
                     type: 'add',
                 };
                 postData('/tender/' + cur_tenderid + '/tourist/audit/save', prop, function (data) {
+                    selectedUserIdsByType.tourist.push(id);
                     const html = `<tr data-uid="${user.id}" data-id="${data.id}">
                                     <td>${user.name}</td>
                                     <td>${user.role}</td>
@@ -548,10 +610,11 @@ $(document).ready(() => {
                                         </div>
                                     </td>
                                     <td class="text-center">
-                                        <a href="#remove-user1" data-id="${data.id}" data-toggle="modal" data-target="#remove-user" class="btn btn-sm btn-outline-danger remove-tourist-user">移除</a>
+                                        <a href="#remove-user1" data-id="${data.id}" data-show-id="${user.id}" data-toggle="modal" data-target="#remove-user" class="btn btn-sm btn-outline-danger remove-tourist-user">移除</a>
                                     </td>
                                 </tr>`;
                     $('#tourist-users').append(html);
+                    updateSelectedMarks();
                 });
             } else if (type === 'schedule') {
                 const user = _.find(accountList, function (item) {
@@ -571,6 +634,7 @@ $(document).ready(() => {
                     type: 'add',
                 };
                 postData('/tender/' + cur_tenderid + '/schedule/audit/save', prop, function (data) {
+                    selectedUserIdsByType.schedule.push(user.id);
                     const html = `<tr data-uid="${user.id}" data-id="${data.id}">
                                     <td>${user.name}</td>
                                     <td>${user.role}</td>
@@ -587,10 +651,11 @@ $(document).ready(() => {
                                         </div>
                                     </td>
                                     <td class="text-center">
-                                        <a href="#remove-user1" data-id="${data.id}" data-toggle="modal" data-target="#remove-user" class="btn btn-sm btn-outline-danger remove-schedule-user">移除</a>
+                                        <a href="#remove-user1" data-id="${data.id}" data-show-id="${user.id}" data-toggle="modal" data-target="#remove-user" class="btn btn-sm btn-outline-danger remove-schedule-user">移除</a>
                                     </td>
                                 </tr>`;
                     $('#schedule-users').append(html);
+                    updateSelectedMarks();
                 });
             } else if (type === 'contract') {
                 const user = _.find(accountList, function (item) {
@@ -674,6 +739,7 @@ $(document).ready(() => {
                 });
             }
         }
+        e.stopPropagation();
     });
     sortCategory4User();
     initTenderTree4User();
@@ -1006,6 +1072,55 @@ const tenderListSpec = (function(){
     return { getTenderNodeHtml, getTenderTreeHeaderHtml }
 })();
 
+function updateSelectedMarks(forcedType = null) { 
+    let currentUserListSelector = '';
+    let selectedIdsArray = []; 
+    let currentType = forcedType; 
+    if (!currentType) {
+        const $activeTabPane = $('.tab-pane.active');
+        const activeTabId = $activeTabPane.attr('id');
+        switch(activeTabId) {
+            case 'guest': currentType = 'tourist'; break;
+            case 'tzpro': currentType = 'schedule'; break;
+            case 'htgl': currentType = 'contract'; break;
+            case 'sgrz': currentType = 'construction'; break;
+            case 'zlgl': currentType = 'quality'; break;
+            case 'zlxj': currentType = 'inspection'; break;
+            default: currentType = null;
+        }
+    }
+
+    if (currentType && selectedUserIdsByType.hasOwnProperty(currentType)) {
+        switch(currentType) {
+            case 'tourist': currentUserListSelector = '#tourist-users'; break;
+            case 'schedule': currentUserListSelector = '#schedule-users'; break;
+            case 'contract': currentUserListSelector = '#contract-users'; break;
+            case 'construction': currentUserListSelector = '#construction-users'; break;
+            case 'quality': currentUserListSelector = '#quality-users'; break;
+            case 'inspection': currentUserListSelector = '#inspection-users'; break;
+        }
+        selectedIdsArray = selectedUserIdsByType[currentType];
+    } else {
+        $('.user-item').find('.selected-mark').hide();
+        $('.user-item').removeClass('bg-light');
+        return;
+    }
+    if ($('#add_user_dropdownMenu2 .book-list').length > 0) {
+        $('.user-item').each(function() {
+            const userIdStr = $(this).data('id');
+            const userId = parseInt(userIdStr, 10);
+            const $mark = $(this).find('.selected-mark');
+            if (!isNaN(userId) && selectedIdsArray.includes(userId)) {
+                $mark.show();
+                $(this).addClass('bg-light');
+            } else {
+                $mark.hide();
+                $(this).removeClass('bg-light');
+            }
+        });
+    }
+}
+
 function setShenpiHtml(shenpi, tender, revising) {
     let html = '';
     if (shenpi.sp_lc.length > 0) {
@@ -1064,6 +1179,14 @@ function setShenpiHtml(shenpi, tender, revising) {
     $('#splc').html(html);
 }
 
+let selectedUserIdsByType = {
+    tourist: [],
+    schedule: [],
+    contract: [],
+    construction: [],
+    quality: [],
+    inspection: []
+};
 function setTouristHtml(tourists) {
     let html = '';
     if (tourists.length > 0) {
@@ -1084,12 +1207,21 @@ function setTouristHtml(tourists) {
                                         </div>
                                     </td>
                                     <td class="text-center">
-                                        <a href="#remove-user1" data-id="${t.id}" data-toggle="modal" data-target="#remove-user" class="btn btn-sm btn-outline-danger remove-tourist-user">移除</a>
+                                        <a href="#remove-user1" data-id="${t.id}" data-show-id="${t.user_id}" data-toggle="modal" data-target="#remove-user" class="btn btn-sm btn-outline-danger remove-tourist-user">移除</a>
                                     </td>
                                 </tr>`;
         }
+        selectedUserIdsByType.tourist = []; 
+        if (Array.isArray(tourists)) {
+            tourists.forEach(function(tourist) {
+                if (tourist.user_id !== undefined && tourist.user_id !== null) {
+                    selectedUserIdsByType.tourist.push(parseInt(tourist.user_id, 10)); 
+                }
+            });
+        }
     }
     $('#tourist-users').html(html);
+    updateSelectedMarks();
 }
 
 function setScheduleHtml(scheduleAuditList) {
@@ -1113,12 +1245,20 @@ function setScheduleHtml(scheduleAuditList) {
                                         </div>
                                     </td>
                                     <td class="text-center">
-                                        <a href="#remove-user1" data-id="${sa.id}" data-toggle="modal" data-target="#remove-user" class="btn btn-sm btn-outline-danger remove-schedule-user">移除</a>
+                                        <a href="#remove-user1" data-id="${sa.id}" data-show-id="${sa.user_id}"  data-toggle="modal" data-target="#remove-user" class="btn btn-sm btn-outline-danger remove-schedule-user">移除</a>
                                     </td>
                                 </tr>`;
         }
+        if (Array.isArray(scheduleAuditList)) {
+            scheduleAuditList.forEach(function(sa) {
+                if (sa.audit_id !== undefined && sa.audit_id !== null) {
+                    selectedUserIdsByType.schedule.push(parseInt(sa.audit_id, 10)); 
+                }
+            });
+        }
     }
     $('#schedule-users').html(html);
+    updateSelectedMarks();
 }
 
 function setContractHtml(datas) {
@@ -1146,11 +1286,19 @@ function setContractHtml(datas) {
                                 <input type="checkbox" class="permission-checkbox" data-type="permission_show_node" value="${ca.uid}" ${ca.permission_show_node ? 'checked' : ''}>
                             </td>
                             <td class="text-center">
-                                <a href="#remove-user1" data-toggle="modal" data-target="#remove-user" class="btn btn-outline-danger btn-sm ml-1 remove-contract-user" data-id="${ca.uid}">移除</a>
+                                <a href="#remove-user1" data-show-id="${ca.uid}" data-toggle="modal" data-target="#remove-user" class="btn btn-outline-danger btn-sm ml-1 remove-contract-user" data-id="${ca.uid}">移除</a>
                             </td>
                         </tr>`;
     }
+    if (Array.isArray(datas)) {
+            datas.forEach(function(ca) {
+                if (ca.uid !== undefined && ca.uid !== null) {
+                    selectedUserIdsByType.contract.push(parseInt(ca.uid, 10)); 
+                }
+            });
+        }
     $('#contract-users').html(list);
+    updateSelectedMarks();
 }
 
 function setConstructionHtml(constructionAuditList) {
@@ -1167,12 +1315,20 @@ function setConstructionHtml(constructionAuditList) {
                                         </div>
                                     </td>
                                     <td class="text-center">
-                                        <a href="#remove-user1" data-id="${sa.id}" data-toggle="modal" data-target="#remove-user" class="btn btn-sm btn-outline-danger remove-construction-user">移除</a>
+                                        <a href="#remove-user1" data-show-id="${sa.uid}" data-id="${sa.id}" data-toggle="modal" data-target="#remove-user" class="btn btn-sm btn-outline-danger remove-construction-user">移除</a>
                                     </td>
                                 </tr>`;
         }
+        if (Array.isArray(constructionAuditList)) {
+            constructionAuditList.forEach(function(sa) {
+                if (sa.uid !== undefined && sa.uid !== null) {
+                    selectedUserIdsByType.construction.push(parseInt(sa.uid, 10)); 
+                }
+            });
+        }
     }
     $('#construction-users').html(html);
+    updateSelectedMarks();
 }
 
 function setTenderPermissionsHtml(auditList, key, keys) {
@@ -1205,7 +1361,15 @@ function setTenderPermissionHtml(auditList, key) {
     for (const m of auditList) {
         html.push(getUserPermissionHtml(m, key));
     }
+    if (Array.isArray(auditList)) {
+        auditList.forEach(function(sa) {
+            if (sa.uid !== undefined && sa.uid !== null) {
+                selectedUserIdsByType[key].push(parseInt(sa.uid, 10)); 
+            }
+        });
+    }
     $('#' + key + '-users').html(html.join(''));
+    updateSelectedMarks();
 }
 
 const getUserPermissionHtml = function(user, key) {
@@ -1218,7 +1382,7 @@ const getUserPermissionHtml = function(user, key) {
         const checked = user[block.key] ? (user[block.key].indexOf(p.value) >= 0 ? 'checked' : '') : '';
         html.push(`<td class="text-center"><input type="checkbox" data-block="${p.key}" data-value="${p.value}" ${checked}></td>`);
     }
-    html.push(`<td class="text-center"><a href="#remove-user1" data-id="${user.uid}" data-toggle="modal" data-target="#remove-user" class="btn btn-sm btn-outline-danger remove-${key}-user">移除</a></td>`);
+    html.push(`<td class="text-center"><a href="#remove-user1" data-show-id="${user.uid}" data-id="${user.uid}" data-toggle="modal" data-target="#remove-user" class="btn btn-sm btn-outline-danger remove-${key}-user">移除</a></td>`);
     html.push('</tr>');
     return html.join('');
 };

+ 58 - 8
app/view/sp_setting/datacollect_modal.ejs

@@ -85,9 +85,12 @@
                                         <dd class="border-bottom p-2 mb-0" data-groupname="<%- group.groupName %>"><p class="mb-0 d-flex"><span class="text-primary">该单位下所有组员</span></p></dd>
                                         <% group.groupList.forEach(item => { %>
                                             <% if (item.id !== ctx.session.sessionUser.accountId) { %>
-                                                <dd class="border-bottom p-2 mb-0 " data-id="<%- item.id %>">
-                                                    <p class="mb-0 d-flex"><span class="text-primary"><%- item.name %></span><span
-                                                                class="ml-auto"><%- item.mobile %></span></p>
+                                                <dd class="border-bottom p-2 mb-0 user-item" data-id="<%- item.id %>">
+                                                    <p class="mb-0 d-flex">
+                                                        <span class="text-primary mr-1"><%- item.name %></span>
+                                                        <span class="ml-auto"><%- item.mobile %></span>
+                                                        <span class="selected-mark text-success ml-2" style="display:none;"><i class="fa fa-check"></i></span>
+                                                    </p>
                                                     <span class="text-muted"><%- item.role %></span>
                                                 </dd>
                                             <% } %>
@@ -290,6 +293,15 @@
         const accountList = JSON.parse(unescape('<%- escape(JSON.stringify(accountList)) %>'));
         let dataCollectAudits = JSON.parse(unescape('<%- escape(JSON.stringify(dataCollectAudits)) %>'));
         const cur_uid = parseInt(<%- ctx.session.sessionUser.accountId %>);
+
+        if (typeof dataCollectAudits !== 'undefined' && Array.isArray(dataCollectAudits)) {
+            updateSelectedMarks(dataCollectAudits); // 传递初始数据
+        } else {
+            console.log("Initial dataCollectAudits not found or invalid on page load.");
+            // 即使初始数据无效,也可以调用一次,让它清理可能存在的标记
+            updateSelectedMarks([]);
+        }
+
         $('#gr-search').bind('input propertychange', function(e) {
             oldSearchVal = e.target.value
             timer && clearTimeout(timer)
@@ -298,14 +310,17 @@
                 let html = ''
                 if (newVal && newVal === oldSearchVal) {
                     accountList.filter(item => item && cur_uid !== item.id && (item.name.indexOf(newVal) !== -1 || (item.mobile && item.mobile.indexOf(newVal) !== -1))).forEach(item => {
-                        html += `<dd class="border-bottom p-2 mb-0 " data-id="${item.id}" >
+                        html += `<dd class="border-bottom p-2 mb-0 user-item" data-id="${item.id}" >
                         <p class="mb-0 d-flex"><span class="text-primary">${item.name}</span><span
-                                class="ml-auto">${item.mobile || ''}</span></p>
+                                class="ml-auto">${item.mobile || ''}</span>
+                                <span class="selected-mark text-success ml-2" style="display:none;"><i class="fa fa-check"></i></span>
+                                </p>
                         <span class="text-muted">${item.role || ''}</span>
                     </dd>`
                     })
                     $('.book-list').empty()
                     $('.book-list').append(html)
+                    updateSelectedMarks();
                 } else {
                     if (!$('.acc-btn').length) {
                         accountGroup.forEach((group, idx) => {
@@ -316,9 +331,11 @@
                         <dd class="border-bottom p-2 mb-0" data-groupname="${group.groupName}"><p class="mb-0 d-flex"><span class="text-primary">该单位下所有组员</span></p></dd>`
                             group.groupList.forEach(item => {
                                 if (item.id !== cur_uid) {
-                                    html += `<dd class="border-bottom p-2 mb-0 " data-id="${item.id}" >
+                                    html += `<dd class="border-bottom p-2 mb-0 user-item " data-id="${item.id}" >
                                     <p class="mb-0 d-flex"><span class="text-primary">${item.name}</span><span
-                                            class="ml-auto">${item.mobile || ''}</span></p>
+                                            class="ml-auto">${item.mobile || ''}</span>
+                                            <span class="selected-mark text-success ml-2" style="display:none;"><i class="fa fa-check"></i></span>
+                                            </p>
                                     <span class="text-muted">${item.role || ''}</span>
                                 </dd>`
                                 }
@@ -327,6 +344,7 @@
                         })
                         $('.book-list').empty()
                         $('.book-list').append(html)
+                        updateSelectedMarks();
                     }
                 }
             }, 400);
@@ -350,13 +368,14 @@
             return false
         });
         // 添加到成员中
-        $('dl').on('click', 'dd', function () {
+        $('dl').on('click', 'dd', function (e) {
             const id = parseInt($(this).data('id'));
             const groupName = $(this).data('groupname');
             if (!isNaN(id) && id !== 0) {
                 postData('/sp/' + spid + '/setting/datacollect/save', { type: 'add-audit', id }, function (result) {
                     dataCollectAudits = result;
                     setList(dataCollectAudits);
+                    updateSelectedMarks();
                 })
             } else if (groupName && groupName !== '') {
                 const groupAuditList = _.filter(accountList, { company: groupName });
@@ -369,11 +388,13 @@
                         // toastr.success(`成功添加 位用户`);
                         dataCollectAudits = result;
                         setList(dataCollectAudits);
+                        updateSelectedMarks();
                     })
                 } else {
                     toastr.warning('暂无用户添加');
                 }
             }
+            e.stopPropagation();
         });
         // 删除审批人
         $('body').on('click', '#audit-list li>a', function () {
@@ -382,6 +403,7 @@
                 postData('/sp/' + spid + '/setting/datacollect/save', { type: 'del-audit', id: $(this).attr('data-id') }, function (result) {
                     dataCollectAudits = result;
                     setList(dataCollectAudits);
+                    updateSelectedMarks();
                 })
             }
         });
@@ -394,5 +416,33 @@
             }
             $('#audit-list').html(list);
         }
+
+        function updateSelectedMarks() {
+            if (!Array.isArray(dataCollectAudits)) {
+                console.warn("dataCollectAudits is not an array or is undefined");
+                $('.user-item').find('.selected-mark').hide();
+                $('.user-item').removeClass('bg-light');
+                return;
+            }
+
+            const selectedIds = dataCollectAudits.map(audit => {
+                const id = parseInt(audit.uid, 10);
+                return isNaN(id) ? null : id; 
+            }).filter(id => id !== null); 
+
+            $('.user-item').each(function() {
+                const userIdStr = $(this).data('id');
+                const userId = parseInt(userIdStr, 10);
+                const $mark = $(this).find('.selected-mark');
+
+                if (!isNaN(userId) && selectedIds.includes(userId)) {
+                    $mark.show();
+                    $(this).addClass('bg-light');
+                } else {
+                    $mark.hide();
+                    $(this).removeClass('bg-light'); 
+                }
+            });
+        }
     })
 </script>

+ 4 - 2
app/view/sp_setting/manage.ejs

@@ -62,9 +62,11 @@
                                             <dt><a href="javascript: void(0);" class="acc-btn" data-groupid="<%- idx %>" data-type="hide"><i class="fa fa-plus-square"></i></a> <%- group.groupName %></dt>
                                             <div class="dd-content" data-toggleid="<%- idx %>">
                                                 <% group.groupList.forEach(item => { %>
-                                                    <dd class="border-bottom p-2 mb-0 " data-id="<%- item.id %>" >
+                                                    <dd class="border-bottom p-2 mb-0 user-item" data-id="<%- item.id %>" >
                                                         <p class="mb-0 d-flex"><span class="text-primary"><%- item.name %></span><span
-                                                                    class="ml-auto"><%- item.mobile %></span></p>
+                                                                    class="ml-auto"><%- item.mobile %></span>
+                                                            <span class="selected-mark text-success ml-2" style="display:none;"><i class="fa fa-check"></i></span>
+                                                        </p>
                                                         <span class="text-muted"><%- item.role %></span>
                                                     </dd>
                                                 <% });%>

+ 1 - 0
app/view/sp_setting/manage_modal.ejs

@@ -274,6 +274,7 @@
             <div class="modal-footer">
                 <input type="hidden" id="remove_user_type">
                 <input type="hidden" id="remove_user_id">
+                <input type="hidden" id="show_id">
                 <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">关闭</button>
                 <button type="button" class="btn btn-sm btn-sm btn-danger" id="remove_user_btn">确定移除</button>
             </div>

+ 75 - 11
app/view/tender/detail_modal.ejs

@@ -1999,10 +1999,21 @@
                                     <dt><a href="javascript: void(0);" class="acc-btn" data-groupid="<%- idx %>" data-type="hide"><i class="fa fa-plus-square"></i></a> <%- group.groupName %></dt>
                                     <div class="dd-content" data-toggleid="<%- idx %>">
                                         <% group.groupList.forEach(item => { %>
-                                            <% if (item.id !== ctx.tender.data.user_id) { %>
+                                            <% if (item.id !== ctx.tender.data.user_id) { 
+                                                const isScheduled = tourists.some(sa => sa.user_id === item.id);
+                                                
+                                                %>
+                                                <%
+                                                let markStyle = ' style="display:none;"';
+                                                if (isScheduled) {
+                                                    markStyle = '';
+                                                }
+                                                %>
                                                 <dd class="border-bottom p-2 mb-0 " data-id="<%- item.id %>" >
                                                     <p class="mb-0 d-flex"><span class="text-primary"><%- item.name %></span><span
-                                                                class="ml-auto"><%- item.mobile %></span></p>
+                                                                class="ml-auto"><%- item.mobile %></span>
+                                                    <span class="selected-mark text-success ml-2"<%- markStyle %>><i class="fa fa-check"></i></span>
+                                                    </p>
                                                     <span class="text-muted"><%- item.role %></span>
                                                 </dd>
                                             <% } %>
@@ -2340,7 +2351,7 @@
                             '                                            <label class="custom-control-label" for="'+ data.id +'_tag"></label>\n' +
                             '                                        </div>\n' +
                             '                                    </td>\n' +
-                            '                                    <td><a href="javascript:void(0);" data-id="' + data.id + '" class="text-danger remove-tourist-user">移除</a></td>\n' +
+                            '                                    <td><a href="javascript:void(0);" data-remove="'+ user.id +'" data-id="' + data.id + '" class="text-danger remove-tourist-user">移除</a></td>\n' +
                             '                                </tr>';
                         $('#tourist-users').append(html);
                         // 外面显示游客数量
@@ -3069,10 +3080,21 @@
                                     <dt><a href="javascript: void(0);" class="acc-btn" data-groupid="<%- idx %>" data-type="hide"><i class="fa fa-plus-square"></i></a> <%- group.groupName %></dt>
                                     <div class="dd-content" data-toggleid="<%- idx %>">
                                         <% group.groupList.forEach(item => { %>
-                                            <% if (item.id !== ctx.tender.data.user_id) { %>
-                                                <dd class="border-bottom p-2 mb-0 " data-id="<%- item.id %>" >
+                                            <% if (item.id !== ctx.tender.data.user_id) { 
+                                                const isScheduled = scheduleAuditList.some(sa => sa.audit_id === item.id);
+                                                %>
+                                                <%
+                                                let markStyle = ' style="display:none;"';
+                                                if (isScheduled) {
+                                                    markStyle = '';
+                                                }
+                                                %>
+                                                <dd class="border-bottom p-2 mb-0 user-item" data-id="<%- item.id %>" >
                                                     <p class="mb-0 d-flex"><span class="text-primary"><%- item.name %></span><span
-                                                                class="ml-auto"><%- item.mobile %></span></p>
+                                                                class="ml-auto"><%- item.mobile %></span>
+                                                    
+                                                    <span class="selected-mark text-success ml-2"<%- markStyle %>><i class="fa fa-check"></i></span>
+                                                    </p>
                                                     <span class="text-muted"><%- item.role %></span>
                                                 </dd>
                                             <% } %>
@@ -3100,7 +3122,7 @@
                                                 <label class="custom-control-label" for="<%- sa.id %>_customRadio42"></label>
                                             </div>
                                         </td>
-                                        <td><a href="javascript:void(0);" class="text-danger remove-schedule-user" data-id="<%- sa.id %>">移除</a></td>
+                                        <td><a href="javascript:void(0);" class="text-danger remove-schedule-user" data-remove="<%- audit.id %>" data-id="<%- sa.id %>">移除</a></td>
                                     </tr>
                                 <% } %>
                             <% } %>
@@ -3126,11 +3148,25 @@
                 timer = setTimeout(() => {
                     const newVal = $(this).val();
                     let html = '';
+                    const currentSelectedIds = new Set(); 
+                    $('#schedule-users tr').each(function() {
+                        const rowUserId = parseInt($(this).data('id'), 10);
+                        if (!isNaN(rowUserId)) {
+                            currentSelectedIds.add(rowUserId);
+                        }
+                    });
+
                     if (newVal && newVal === oldSearchVal) {
                         accountList.filter(item => item && item.id !== cur_tender_uid && (item.name.indexOf(newVal) !== -1 || (item.mobile && item.mobile.indexOf(newVal) !== -1))).forEach(item => {
+                            
+                        const isSelected = currentSelectedIds.has(item.id);
+                        const markDisplayStyle = isSelected ? '' : ' style="display:none;"';
+                    
                             html += `<dd class="border-bottom p-2 mb-0 " data-id="${item.id}" >
                         <p class="mb-0 d-flex"><span class="text-primary">${item.name}</span><span
-                                class="ml-auto">${item.mobile || ''}</span></p>
+                                class="ml-auto">${item.mobile || ''}</span>
+                               <span class="selected-mark text-success ml-2"${markDisplayStyle}><i class="fa fa-check"></i></span> 
+                                </p>
                         <span class="text-muted">${item.role || ''}</span>
                     </dd>`
                         });
@@ -3145,9 +3181,15 @@
                         <div class="dd-content" data-toggleid="${idx}">`;
                                 group.groupList.forEach(item => {
                                     if (item.id !== cur_tender_uid) {
+
+                                    const isSelected = currentSelectedIds.has(item.id);
+                                    const markDisplayStyle = isSelected ? '' : ' style="display:none;"';
+                                
                                         html += `<dd class="border-bottom p-2 mb-0 " data-id="${item.id}" >
                                     <p class="mb-0 d-flex"><span class="text-primary">${item.name}</span><span
-                                            class="ml-auto">${item.mobile || ''}</span></p>
+                                            class="ml-auto">${item.mobile || ''}</span>
+                                            <span class="selected-mark text-success ml-2"${markDisplayStyle}><i class="fa fa-check"></i></span>
+                                            </p>
                                     <span class="text-muted">${item.role || ''}</span>
                                 </dd>`;
                                     }
@@ -3181,7 +3223,7 @@
             });
 
             // 选中用户
-            $('body').on('click', '#xxjd_dropdownMenu dl dd', function () {
+            $('body').on('click', '#xxjd_dropdownMenu dl dd', function (e) {
                 const id = parseInt($(this).data('id'));
                 if (id) {
                     const user = _.find(accountList, function (item) {
@@ -3212,16 +3254,25 @@
                             '                                    <label class="custom-control-label" for="'+ data.id + '_customRadio42"></label>\n' +
                             '                                </div>\n' +
                             '                            </td>\n' +
-                            '                            <td><a href="javascript:void(0);" class="text-danger remove-schedule-user" data-id="'+ data.id + '">移除</a></td>\n' +
+                            '                            <td><a href="javascript:void(0);" class="text-danger remove-schedule-user" data-remove="'+ user.id + '" data-id="'+ data.id + '">移除</a></td>\n' +
                             '                        </tr>';
                         $('#schedule-users').append(html);
+                        const userIdToAddMark = id;
+                        const $targetMarkSpan = $('#xxjd_dropdownMenu dl dd[data-id="' + userIdToAddMark + '"] .selected-mark');
+                        if ($targetMarkSpan.length > 0) {
+                            $targetMarkSpan.css('display', ''); 
+                        } else {
+                            console.warn('Warning: Could not find the selected-mark span for user ID:', userIdToAddMark);
+                        }
                     });
                 }
+                e.stopPropagation();
             });
 
             // 移除用户
             $('body').on('click', '#schedule-users .remove-schedule-user', function () {
                 const id = parseInt($(this).data('id'));
+                const removeId = parseInt($(this).data('remove'));
                 if (id) {
                     const prop = {
                         id,
@@ -3230,6 +3281,19 @@
                     const _self = $(this);
                     postData('/tender/' + cur_tenderid + '/schedule/audit/save', prop, function (data) {
                         _self.parents('tr').remove();
+
+                        // --- 在此处添加新增代码 ---
+                        // 同步下拉菜单勾选状态 (移除勾选)
+                        const userIdToRemoveMark = removeId;
+                        console.log('Removing mark for user ID:', userIdToRemoveMark);
+                        const $targetMarkSpanToRemove = $('#xxjd_dropdownMenu dl dd[data-id="' + userIdToRemoveMark + '"] .selected-mark');
+                        if ($targetMarkSpanToRemove.length > 0) {
+                            $targetMarkSpanToRemove.css('display', 'none');
+                        } else {
+                            console.warn('Warning: Could not find the selected-mark span for user ID:', userIdToRemoveMark, 'to hide.');
+                        }
+                        // --- 新增代码结束 ---
+
                     });
                 }
             });