fix: 钉钉登录时总是同步更新用户的真实姓名
This commit is contained in:
parent
a3943f22a7
commit
50ec7acc56
@ -480,9 +480,16 @@ public class UserService {
|
||||
|
||||
// 1. 同步基本信息
|
||||
if (detailedInfo != null) {
|
||||
if (!StringUtils.hasText(user.getRealName()) && detailedInfo.get("name") != null) {
|
||||
user.setRealName((String) detailedInfo.get("name"));
|
||||
needUpdate = true;
|
||||
// 同步真实姓名(如果钉钉返回了姓名,则更新,保持与钉钉同步)
|
||||
String dingName = (String) detailedInfo.get("name");
|
||||
if (dingName != null) {
|
||||
String oldName = user.getRealName();
|
||||
if (!dingName.equals(oldName)) {
|
||||
user.setRealName(dingName);
|
||||
needUpdate = true;
|
||||
log.info("同步更新用户真实姓名: userId={}, oldName={}, newName={}",
|
||||
user.getId(), oldName, dingName);
|
||||
}
|
||||
}
|
||||
if (!StringUtils.hasText(user.getAvatar()) && detailedInfo.get("avatar") != null) {
|
||||
user.setAvatar((String) detailedInfo.get("avatar"));
|
||||
|
||||
@ -68,22 +68,21 @@
|
||||
<div class="task-types-list">
|
||||
<div
|
||||
v-for="(item, index) in formData.taskTypes"
|
||||
:key="item.id"
|
||||
:key="item.id || index"
|
||||
class="task-type-item"
|
||||
:class="{ 'dragging': dragIndex === index, 'drag-over': dragOverIndex === index }"
|
||||
draggable="true"
|
||||
@dragstart="handleDragStart($event, index)"
|
||||
@dragend="handleDragEnd"
|
||||
@dragover.prevent="handleDragOver($event, index)"
|
||||
@dragleave="handleDragLeave"
|
||||
@drop.prevent="handleDrop($event, index)"
|
||||
@drop="handleDrop($event, index)"
|
||||
>
|
||||
<div class="task-type-row">
|
||||
<!-- 拖拽手柄 -->
|
||||
<div
|
||||
class="drag-handle"
|
||||
title="拖拽调整顺序"
|
||||
@mousedown.prevent
|
||||
draggable="true"
|
||||
@dragstart="handleDragStart($event, index)"
|
||||
@dragend="handleDragEnd"
|
||||
>
|
||||
<Icon name="menu" size="sm" />
|
||||
</div>
|
||||
@ -557,7 +556,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, computed, onMounted, onUnmounted, watch, nextTick } from 'vue'
|
||||
import { ref, reactive, computed, onMounted, onUnmounted, watch } from 'vue'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
import { message } from 'ant-design-vue'
|
||||
import type { UploadFile, UploadProps } from 'ant-design-vue'
|
||||
@ -631,7 +630,6 @@ const previewUploading = ref(false)
|
||||
|
||||
// 任务类型项接口
|
||||
interface TaskTypeItem {
|
||||
id?: string // 唯一标识符,用于拖拽排序
|
||||
taskTypeId: number | undefined
|
||||
taskTypePath?: (string | number)[] // 级联选择路径 [level1Id, level2Id, level3Id]
|
||||
quantity: number
|
||||
@ -655,17 +653,12 @@ const designersCache = reactive<Record<string, any[]>>({})
|
||||
const dragIndex = ref<number | null>(null)
|
||||
const dragOverIndex = ref<number | null>(null)
|
||||
|
||||
// 生成唯一ID
|
||||
const generateTaskTypeId = () => {
|
||||
return `task-type-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`
|
||||
}
|
||||
|
||||
// 表单数据
|
||||
const formData = reactive({
|
||||
title: '',
|
||||
isPipeline: true, // 固定为流水线任务
|
||||
pipelineMode: 'sequential' as 'sequential' | 'parallel', // 固定为顺序流水线
|
||||
taskTypes: [{ id: generateTaskTypeId(), taskTypeId: undefined, taskTypePath: undefined, quantity: 1, receiverId: undefined, selectedDeptId: undefined }] as TaskTypeItem[], // 任务类型数组
|
||||
taskTypes: [{ taskTypeId: undefined, taskTypePath: undefined, quantity: 1, receiverId: undefined, selectedDeptId: undefined }] as TaskTypeItem[], // 任务类型数组
|
||||
taskSubType: '', // 动态加载,初始为空
|
||||
brandId: undefined,
|
||||
platformId: undefined,
|
||||
@ -935,7 +928,6 @@ const getDesignersForItem = (item: TaskTypeItem) => {
|
||||
// 添加任务类型
|
||||
const addTaskType = () => {
|
||||
formData.taskTypes.push({
|
||||
id: generateTaskTypeId(),
|
||||
taskTypeId: undefined,
|
||||
taskTypePath: undefined,
|
||||
quantity: 1,
|
||||
@ -954,31 +946,13 @@ const removeTaskType = (index: number) => {
|
||||
|
||||
// 拖拽开始
|
||||
const handleDragStart = (e: DragEvent, index: number) => {
|
||||
const target = e.target as HTMLElement
|
||||
|
||||
// 如果点击的是可交互元素(input、select、button等),阻止拖拽
|
||||
if (target.tagName === 'INPUT' ||
|
||||
target.tagName === 'SELECT' ||
|
||||
target.tagName === 'BUTTON' ||
|
||||
target.closest('input, select, button, .ant-cascader, .ant-input-number, .ant-select')) {
|
||||
e.preventDefault()
|
||||
return false
|
||||
}
|
||||
|
||||
// 只有从拖拽手柄或空白区域开始拖拽才允许
|
||||
if (!target.closest('.drag-handle') && !target.closest('.task-type-item')) {
|
||||
e.preventDefault()
|
||||
return false
|
||||
}
|
||||
|
||||
dragIndex.value = index
|
||||
|
||||
if (e.dataTransfer) {
|
||||
e.dataTransfer.effectAllowed = 'move'
|
||||
e.dataTransfer.setData('text/plain', String(index))
|
||||
e.dataTransfer.setData('application/json', JSON.stringify({ index }))
|
||||
|
||||
// 设置拖拽图像为整个 item
|
||||
const target = e.target as HTMLElement
|
||||
const itemElement = target.closest('.task-type-item') as HTMLElement
|
||||
if (itemElement) {
|
||||
// 创建一个临时元素作为拖拽图像
|
||||
@ -986,18 +960,11 @@ const handleDragStart = (e: DragEvent, index: number) => {
|
||||
dragImage.style.opacity = '0.8'
|
||||
dragImage.style.position = 'absolute'
|
||||
dragImage.style.top = '-1000px'
|
||||
dragImage.style.width = itemElement.offsetWidth + 'px'
|
||||
document.body.appendChild(dragImage)
|
||||
e.dataTransfer.setDragImage(dragImage, e.offsetX, e.offsetY)
|
||||
setTimeout(() => {
|
||||
if (document.body.contains(dragImage)) {
|
||||
document.body.removeChild(dragImage)
|
||||
}
|
||||
}, 0)
|
||||
setTimeout(() => document.body.removeChild(dragImage), 0)
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// 拖拽结束
|
||||
@ -1032,49 +999,26 @@ const handleDrop = (e: DragEvent, targetIndex: number) => {
|
||||
if (data) {
|
||||
sourceIndex = parseInt(data, 10)
|
||||
} else {
|
||||
console.warn('无法获取拖拽源索引')
|
||||
handleDragEnd()
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if (sourceIndex === null || isNaN(sourceIndex) || sourceIndex < 0 || targetIndex < 0) {
|
||||
console.warn('无效的拖拽索引:', { sourceIndex, targetIndex })
|
||||
if (sourceIndex === null || sourceIndex === targetIndex || sourceIndex < 0 || targetIndex < 0) {
|
||||
handleDragEnd()
|
||||
return
|
||||
}
|
||||
|
||||
if (sourceIndex === targetIndex) {
|
||||
console.log('拖拽到相同位置,无需移动')
|
||||
handleDragEnd()
|
||||
return
|
||||
}
|
||||
console.log('拖拽排序:', sourceIndex, '->', targetIndex)
|
||||
|
||||
console.log('开始拖拽排序:', {
|
||||
sourceIndex,
|
||||
targetIndex,
|
||||
before: formData.taskTypes.map((t, i) => ({ index: i, id: t.id, taskTypeId: t.taskTypeId }))
|
||||
})
|
||||
|
||||
// 创建新数组并交换位置
|
||||
const newTaskTypes = [...formData.taskTypes]
|
||||
const [removed] = newTaskTypes.splice(sourceIndex, 1)
|
||||
newTaskTypes.splice(targetIndex, 0, removed)
|
||||
|
||||
console.log('拖拽后数组:', newTaskTypes.map((t, i) => ({ index: i, id: t.id, taskTypeId: t.taskTypeId })))
|
||||
|
||||
// 直接替换整个数组(reactive 对象会自动响应)
|
||||
formData.taskTypes = newTaskTypes
|
||||
|
||||
// 等待 DOM 更新后再检查
|
||||
nextTick(() => {
|
||||
console.log('DOM更新后数组:', formData.taskTypes.map((t, i) => ({ index: i, id: t.id, taskTypeId: t.taskTypeId })))
|
||||
})
|
||||
// 交换位置 - 使用 splice 原地修改数组以确保响应式更新
|
||||
const [removed] = formData.taskTypes.splice(sourceIndex, 1)
|
||||
formData.taskTypes.splice(targetIndex, 0, removed)
|
||||
|
||||
// 重新计算积分(pipelineGroups 是 computed,会自动更新)
|
||||
calculateScore()
|
||||
|
||||
message.success(`任务顺序已调整: 第 ${sourceIndex + 1} 项移动到第 ${targetIndex + 1} 项`)
|
||||
message.success('任务顺序已调整')
|
||||
|
||||
handleDragEnd()
|
||||
}
|
||||
@ -1952,7 +1896,6 @@ const loadTaskForEdit = async (taskId: number) => {
|
||||
|
||||
for (const detail of details) {
|
||||
taskTypeItems.push({
|
||||
id: generateTaskTypeId(),
|
||||
taskTypeId: detail.typeId,
|
||||
quantity: detail.quantity || 1,
|
||||
receiverId: detail.receiverId || subTask.receiverId,
|
||||
@ -1963,7 +1906,6 @@ const loadTaskForEdit = async (taskId: number) => {
|
||||
console.warn('解析typeDetails失败:', e)
|
||||
// 解析失败时使用子任务的基本信息
|
||||
taskTypeItems.push({
|
||||
id: generateTaskTypeId(),
|
||||
taskTypeId: subTask.taskTypeId,
|
||||
quantity: subTask.quantity || 1,
|
||||
receiverId: subTask.receiverId,
|
||||
@ -1973,7 +1915,6 @@ const loadTaskForEdit = async (taskId: number) => {
|
||||
} else {
|
||||
// 没有typeDetails时使用子任务的基本信息
|
||||
taskTypeItems.push({
|
||||
id: generateTaskTypeId(),
|
||||
taskTypeId: subTask.taskTypeId,
|
||||
quantity: subTask.quantity || 1,
|
||||
receiverId: subTask.receiverId,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user