From df917bbe0175e284168735d47735c8013343cf8b Mon Sep 17 00:00:00 2001 From: lj7788 Date: Wed, 18 Mar 2026 16:54:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=A1=B9=E7=9B=AE=E4=BA=BA?= =?UTF-8?q?=E5=91=98=E4=BF=AE=E6=94=B9=E5=A4=B4=E5=83=8F=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=88=B0VO=E5=B9=B3=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docsql/delete_personnel.py | 163 ++++++++++++++++++ ...roProjectInfoSubdeptsUsersServiceImpl.java | 6 +- .../manage/service/impl/UniServiceImpl.java | 12 +- yanzhu-ui-vue3/src/api/system/user.js | 1 + .../src/views/system/user/index.vue | 2 + 5 files changed, 176 insertions(+), 8 deletions(-) create mode 100644 docsql/delete_personnel.py diff --git a/docsql/delete_personnel.py b/docsql/delete_personnel.py new file mode 100644 index 00000000..953ad35a --- /dev/null +++ b/docsql/delete_personnel.py @@ -0,0 +1,163 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +VO平台批量删除人员信息工具 +根据admitGuid批量删除人员信息 +""" + +import requests +import json +import hashlib +import time +from typing import List + +BASEURL = "http://wo-api.uni-ubi.com/" +ADMIT_DELETE = BASEURL + "v2/admit/delete" +PROJECTGUID = "A2BE33DBF303460FA27ED953D424B7D0" +PROJECTID = 199 +APPKEY = "B08CE344534C477991C78CFA7C399589" +APPSECRET = "35D8F5F71DD9408585ADC0D26294031B" +DELGUIDS = "D10D8B66345D4E969F18398A892D24F8" #可以放多个 + + +def md5(data: str) -> str: + """ + MD5加密 + + Args: + data: 输入字符串 + + Returns: + MD5加密后的字符串(小写) + """ + return hashlib.md5(data.encode('utf-8')).hexdigest().lower() + + +def get_auth_token() -> dict: + """ + 获取认证token + + Returns: + 包含token和projectGuid的字典 + """ + timestamp = str(int(time.time() * 1000)) + + sign_str = APPKEY + timestamp + APPSECRET + sign = md5(sign_str) + + headers = { + 'appKey': APPKEY, + 'timestamp': timestamp, + 'sign': sign, + 'projectGuid': PROJECTGUID + } + + url = f"{BASEURL}v1/{PROJECTGUID}/auth" + + try: + response = requests.get(url, headers=headers, timeout=30) + result = response.json() + if result.get('result') == 1: + return { + 'token': result.get('data'), + 'projectGuid': PROJECTGUID + } + return None + except Exception as e: + print(f"获取token失败: {e}") + return None + + +def delete_personnel(admit_guid: str, token_info: dict) -> dict: + """ + 删除人员信息 + + Args: + admit_guid: 人员admitGuid + token_info: 认证token信息 + + Returns: + 删除结果 + """ + timestamp = str(int(time.time() * 1000)) + + sign_str = APPKEY + timestamp + APPSECRET + sign = md5(sign_str) + + headers = { + 'appKey': APPKEY, + 'timestamp': timestamp, + 'token': token_info['token'], + 'sign': sign, + 'projectGuid': PROJECTGUID + } + + payload = { + 'projectId': PROJECTID, + 'admitGuids': admit_guid + } + + try: + response = requests.post(ADMIT_DELETE, json=payload, headers=headers, timeout=30) + result = response.json() + return result + except requests.exceptions.RequestException as e: + return {'success': False, 'error': str(e)} + + +def main(): + """主函数""" + print('=' * 60) + print('VO平台批量删除人员信息工具') + print('=' * 60) + + admit_guids = [guid.strip() for guid in DELGUIDS.split(',') if guid.strip()] + + print(f'\n共 {len(admit_guids)} 个admitGuid待删除:') + for i, guid in enumerate(admit_guids, 1): + print(f' {i}. {guid}') + + print('\n正在获取认证token...') + token_info = get_auth_token() + + if not token_info: + print('获取token失败,无法继续删除操作') + return + + print('✓ token获取成功') + + print('\n开始删除...') + + success_count = 0 + fail_count = 0 + failed_guids = [] + + for i, guid in enumerate(admit_guids, 1): + print(f'\n正在删除第 {i} 个 ({guid})...') + result = delete_personnel(guid, token_info) + + if result.get('result') == 1 or result.get('success'): + print(f' ✓ 第 {i} 个删除成功') + success_count += 1 + else: + print(f' ✗ 第 {i} 个删除失败') + if 'msg' in result: + print(f' 错误信息: {result.get("msg")}') + fail_count += 1 + failed_guids.append(guid) + + print('\n' + '=' * 60) + print('删除结果统计:') + print('=' * 60) + print(f'成功: {success_count} 个') + print(f'失败: {fail_count} 个') + + if fail_count == 0: + print('\n✓ 所有人员信息删除成功!') + else: + print(f'\n✗ 部分人员信息删除失败!') + print(f' 失败的admitGuid: {",".join(failed_guids)}') + + +if __name__ == '__main__': + main() diff --git a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/ProProjectInfoSubdeptsUsersServiceImpl.java b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/ProProjectInfoSubdeptsUsersServiceImpl.java index b7c741f9..d4ce127b 100644 --- a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/ProProjectInfoSubdeptsUsersServiceImpl.java +++ b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/ProProjectInfoSubdeptsUsersServiceImpl.java @@ -350,6 +350,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu iProUserInoutRecordService.addRecord(proProjectInfoSubdeptsUsers); }else { ProProjectInfoSubdeptsUsers deptUser = users.get(0); + boolean isChangePic=!Objects.equals(proProjectInfoSubdeptsUsers.getUserPicture(),deptUser.getUserPicture()); deptUser.setUserName(proProjectInfoSubdeptsUsers.getUserName()); deptUser.setWorkType(proProjectInfoSubdeptsUsers.getWorkType()); deptUser.setUserPhone(proProjectInfoSubdeptsUsers.getUserPhone()); @@ -361,9 +362,8 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu /** * 考勤需要信息改变时推送信息... */ - if(!Objects.equals(proProjectInfoSubdeptsUsers.getUserName(),deptUser.getUserName()) || !Objects.equals(proProjectInfoSubdeptsUsers.getCardCode(),deptUser.getCardCode()) || - !Objects.equals(proProjectInfoSubdeptsUsers.getUserPhone(),deptUser.getUserPhone()) || !Objects.equals(proProjectInfoSubdeptsUsers.getUserPicture(),deptUser.getUserPicture())){ - uniService.syncUniUser(proProjectInfoSubdeptsUsers,false); + if(isChangePic || ( StringUtils.isNotEmpty(deptUser.getUserPicture()) && StringUtils.isEmpty(deptUser.getFaceGuid()))){ + uniService.syncUniUser(deptUser,false); } } } diff --git a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/UniServiceImpl.java b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/UniServiceImpl.java index 91e7e92d..b9b711a5 100644 --- a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/UniServiceImpl.java +++ b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/UniServiceImpl.java @@ -336,11 +336,13 @@ public class UniServiceImpl implements IUniService { List admitGuidList = new ArrayList<>(); for (ProProjectInfoSubdeptsUsers u : userList) { String admitGuid = u.getAdmitGuid(); - if (StringUtils.isNotEmpty(admitGuid)) { - admitGuidList.add(admitGuid); - }else{ - syncUniUser(u,true); - } + //String faceId=u.getFaceGuid(); + syncUniUser(u,true); +// if (StringUtils.isNotEmpty(admitGuid)||StringUtils.isNotEmpty(faceId)) { +// admitGuidList.add(admitGuid); +// }else{ +// syncUniUser(u,true); +// } } for (int i = 0; i < admitGuidList.size(); i += 50) { String admitGuids = ""; diff --git a/yanzhu-ui-vue3/src/api/system/user.js b/yanzhu-ui-vue3/src/api/system/user.js index cd8946e8..e9aac0ff 100644 --- a/yanzhu-ui-vue3/src/api/system/user.js +++ b/yanzhu-ui-vue3/src/api/system/user.js @@ -45,6 +45,7 @@ export function updateUser(data) { nickName: data.nickName, userType: data.userType, workType: data.workType, + cardCode: data.cardCode, sex: data.sex, avatar: data.avatar, status: data.status, diff --git a/yanzhu-ui-vue3/src/views/system/user/index.vue b/yanzhu-ui-vue3/src/views/system/user/index.vue index 31aa649f..0442fc8c 100644 --- a/yanzhu-ui-vue3/src/views/system/user/index.vue +++ b/yanzhu-ui-vue3/src/views/system/user/index.vue @@ -673,6 +673,7 @@ function reset() { nickName: undefined, password: undefined, phonenumber: undefined, + cardCode: undefined, cardImgPos: undefined, cardImgInv: undefined, avatar: undefined, @@ -734,6 +735,7 @@ function handleUpdate(row) { form.value.userInfos = obj; form.value.cardImgPos = obj.cardImgPos || ""; form.value.cardImgInv = obj.cardImgInv || ""; + form.value.cardCode = response.data.cardCode || obj.cardCode || ""; postOptions.value = response.posts; form.value.postIds = response.postIds; form.value.roleIds = response.roleIds;