feat: 货道复制

This commit is contained in:
yangmf_0726 committed 2025-11-08 11:24:22 +08:00
1 parent 883a14051a
commit d94d4cd9d8
2 files changed
+147 -3

No files matched your search

+46
View File
@@ -264,10 +264,32 @@ const handleLogin = async (params: any) => {
}
const loginDataLoginForm = { ...loginData.loginForm }
loginDataLoginForm.captchaVerification = params.captchaVerification
// 打印登录信息
console.log('========== 用户登录信息 ==========')
console.log('登录表单数据:', {
username: loginDataLoginForm.username,
tenantName: loginDataLoginForm.tenantName,
rememberMe: loginDataLoginForm.rememberMe,
captchaVerification: loginDataLoginForm.captchaVerification ? '已填写' : '未填写'
})
const res = await LoginApi.login(loginDataLoginForm)
if (!res) {
return
}
// 打印登录返回的Token信息
console.log('登录返回Token信息:', {
id: res.id,
userId: res.userId,
userType: res.userType,
clientId: res.clientId,
expiresTime: res.expiresTime ? new Date(res.expiresTime).toLocaleString() : '无',
accessToken: res.accessToken ? `${res.accessToken.substring(0, 20)}...` : '无',
refreshToken: res.refreshToken ? `${res.refreshToken.substring(0, 20)}...` : '无'
})
loading.value = ElLoading.service({
lock: true,
text: '正在加载系统中...',
@@ -279,6 +301,30 @@ const handleLogin = async (params: any) => {
authUtil.removeLoginForm()
}
authUtil.setToken(res)
// 获取用户详细信息并打印
try {
const userInfo = await LoginApi.getInfo()
console.log('用户详细信息:', {
用户ID: userInfo.user?.id,
用户名: userInfo.user?.username,
昵称: userInfo.user?.nickname,
头像: userInfo.user?.avatar,
部门ID: userInfo.user?.deptId,
邮箱: userInfo.user?.email,
手机号: userInfo.user?.mobile,
性别: userInfo.user?.sex,
登录IP: userInfo.user?.loginIp,
登录时间: userInfo.user?.loginDate,
角色: userInfo.roles,
权限数量: userInfo.permissions?.length || 0
})
console.log('所有权限:', userInfo.permissions)
console.log('菜单列表:', userInfo.menus)
} catch (error) {
console.error('获取用户信息失败:', error)
}
console.log('================================')
if (!redirect.value) {
redirect.value = '/'
}
+101 -3
View File
@@ -70,10 +70,12 @@
<el-button
type="primary"
plain
@click="openForm('create')"
:disabled="selectedRows.length === 0"
:loading="copyLoading"
@click="handleCopy"
v-hasPermi="['product:channel:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:copy-document" class="mr-5px" /> 复制
</el-button>
<el-button
type="success"
@@ -90,7 +92,14 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table
v-loading="loading"
:data="list"
:stripe="true"
:show-overflow-tooltip="true"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" />
<el-table-column label="编号" align="center" prop="id" />
<el-table-column label="名称" align="center" prop="name" />
<el-table-column label="设备IMEI" align="center" prop="deviceId" />
@@ -154,6 +163,8 @@ const { t } = useI18n() // 国际化
const loading = ref(true) // 列表的加载中
const list = ref<ChannelVO[]>([]) // 列表的数据
const total = ref(0) // 列表的总页数
const selectedRows = ref<ChannelVO[]>([]) // 选中的货道
const copyLoading = ref(false) // 复制操作的加载中
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
@@ -174,6 +185,8 @@ const getList = async () => {
const data = await ChannelApi.getChannelPage(queryParams)
list.value = data.list
total.value = data.total
// 清空选中状态(因为列表数据已更新)
selectedRows.value = []
} finally {
loading.value = false
}
@@ -191,6 +204,91 @@ const resetQuery = () => {
handleQuery()
}
/** 处理表格选择变化 */
const handleSelectionChange = (selection: ChannelVO[]) => {
selectedRows.value = selection
}
/** 查找可用的货道号 */
const findAvailableChannel = async (originalChannel: string, deviceId: string): Promise<string> => {
// 获取所有货道列表用于检查
const allChannels = await ChannelApi.getChannelPage({ pageNo: 1, pageSize: 100 })
const existingChannels = allChannels.list
.filter((ch: ChannelVO) => ch.deviceId === deviceId)
.map((ch: ChannelVO) => ch.cabinetChannel)
// 解析原始货道号(可能是纯数字或包含其他字符)
const match = originalChannel.match(/(\d+)$/)
if (!match) {
// 如果无法解析数字,直接返回原值加1
return originalChannel + '1'
}
const baseNumber = parseInt(match[1], 10)
const prefix = originalChannel.substring(0, originalChannel.length - match[1].length)
let newNumber = baseNumber + 1
// 如果新货道号已存在,继续递增
while (existingChannels.includes(prefix + newNumber)) {
newNumber++
}
return prefix + newNumber
}
/** 复制货道 */
const handleCopy = async () => {
if (selectedRows.value.length === 0) {
message.warning('请至少选择一个货道进行复制')
return
}
try {
await message.confirm(`确认要复制选中的 ${selectedRows.value.length} 个货道吗?`)
copyLoading.value = true
// 遍历选中的货道,逐个复制
for (const row of selectedRows.value) {
try {
// 获取货道详情
const channelDetail = await ChannelApi.getChannel(row.id)
// 查找可用的货道号(在原有基础上加1,如果存在则继续加1)
const newCabinetChannel = await findAvailableChannel(
channelDetail.cabinetChannel,
channelDetail.deviceId
)
// 准备新货道数据,明确复制指定字段,货道号递增
const newChannel = {
name: channelDetail.name, // 复制名称
maxNum: channelDetail.maxNum, // 复制最大数量
deviceId: channelDetail.deviceId, // 复制设备IMEI
channelLine: channelDetail.channelLine, // 复制货道行号
cabinetChannel: newCabinetChannel // 货道号加一
// 编号(id)不复制,由系统自动生成
} as ChannelVO
// 创建新货道
await ChannelApi.createChannel(newChannel)
} catch (error) {
console.error(`复制货道 ${row.name} 失败:`, error)
message.error(`复制货道 "${row.name}" 失败`)
}
}
message.success(`成功复制 ${selectedRows.value.length} 个货道`)
// 清空选中
selectedRows.value = []
// 刷新列表
await getList()
} catch {
// 用户取消操作
} finally {
copyLoading.value = false
}
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {