上传文件及弹出框Form

pull/1/head
liutao 1 month ago
parent dd64b05572
commit f356485d74

@ -56,4 +56,9 @@ export const ProductUnitApi = {
getProductUnitListByFlag: async () => {
return await request.get({ url: `/erp/product-unit/flag-list`})
},
// 下载用户导入模板
importUserTemplate: async () => {
return await request.download({ url: '/erp/product-unit/get-import-template' })
}
}

@ -2117,6 +2117,7 @@ export default {
resetButtonText: 'Reset',
addButtonText: 'Add',
exportButtonText: 'Export',
importButtonText: 'Import',
tableNameColumn: 'Unit Name',
tablePrimaryFlagColumn: 'Is Primary Unit',
tableChangeRateColumn: 'Conversion Rate to Primary Unit',
@ -2137,7 +2138,17 @@ export default {
dialogSubmitButton: 'Confirm',
validatorNameRequired: 'Unit name can not be empty',
validatorStatusRequired: 'Unit status can not be empty',
validatorPrimaryFlagRequired: 'Primary unit flag can not be empty'
validatorPrimaryFlagRequired: 'Primary unit flag can not be empty',
import:'Import unit',
importDragText: 'Drag file here, or',
importClickText: 'click to upload',
importUpdateSupport: 'Update existing user data if present',
importFormatLimit: 'Only xls, xlsx format files are allowed.',
importDownloadTemplate: 'Download template',
importFileRequired: 'Please upload file',
importSuccessTip: 'Upload success: {createCount}; Update success: {updateCount}; Update failed: {failureCount};',
importFailed: 'Upload failed, please upload again!',
importFileLimit: 'Only one file can be uploaded!',
},
CalHoliday: {
setWorkingDays: 'set working days',

@ -771,7 +771,7 @@ export default {
save: '保存',
detail: '详情',
export: '导出',
import: '',
import: '导入',
approve: '审批',
unapprove: '反审批',
generate: '生成',
@ -1298,8 +1298,8 @@ export default {
DvSubject: {
code: '编码',
name: '名称',
inspectionMethod: '检验方式',
valueType: '类型',
inspectionMethod: '作业方式',
valueType: '结果类型',
judgmentCriteria: '判定基准',
upperVal: '上限值',
lowerVal: '下限值',
@ -2963,7 +2963,19 @@ export default {
dialogSubmitButton: '确 定',
validatorNameRequired: '单位名称不能为空',
validatorStatusRequired: '单位状态不能为空',
validatorPrimaryFlagRequired: '是否主单位不能为空'
validatorPrimaryFlagRequired: '是否主单位不能为空',
importButtonText:'导入',
import:'导入单位',
importDragText: '将文件拖到此处,或',
importClickText: '点击上传',
importUpdateSupport: '是否更新已经存在的用户数据',
importFormatLimit: '仅允许导入 xls、xlsx 格式文件。',
importDownloadTemplate: '下载模板',
importFileRequired: '请上传文件',
importSuccessTip:
'上传成功数量:{createCount};更新成功数量:{updateCount};更新失败数量:{failureCount}',
importFailed: '上传失败,请您重新上传!',
importFileLimit: '最多只能上传一个文件!',
},
//假日管理
CalHoliday: {

@ -0,0 +1,144 @@
<template>
<Dialog v-model="dialogVisible" :title="t('FactoryModeling.ProductUnit.import')" width="400">
<el-upload
ref="uploadRef"
v-model:file-list="fileList"
:action="importUrl + '?updateSupport=' + updateSupport"
:auto-upload="false"
:disabled="formLoading"
:headers="uploadHeaders"
:limit="1"
:on-error="submitFormError"
:on-exceed="handleExceed"
:on-success="submitFormSuccess"
accept=".xlsx, .xls"
drag
>
<Icon icon="ep:upload" />
<div class="el-upload__text">
{{ t('FactoryModeling.ProductUnit.importDragText') }}<em>{{ t('FactoryModeling.ProductUnit.importClickText') }}</em>
</div>
<template #tip>
<div class="el-upload__tip text-center">
<!-- <div class="el-upload__tip">
<el-checkbox v-model="updateSupport" />
{{ t('FactoryModeling.ProductUnit.importUpdateSupport') }}
</div>-->
<span>{{ t('FactoryModeling.ProductUnit.importFormatLimit') }}</span>
<el-link
:underline="false"
style="font-size: 12px; vertical-align: baseline"
type="primary"
@click="importTemplate"
>
{{ t('FactoryModeling.ProductUnit.importDownloadTemplate') }}
</el-link>
</div>
</template>
</el-upload>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
<script lang="ts" setup>
import * as UserApi from '@/api/system/user'
import { getAccessToken, getTenantId } from '@/utils/auth'
import download from '@/utils/download'
import {ProductUnitApi} from "@/api/erp/product/unit";
defineOptions({ name: 'ProductUnitImportForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const formLoading = ref(false) //
const uploadRef = ref()
const importUrl =
import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/erp/product-unit/import'
const uploadHeaders = ref() // Header
const fileList = ref([]) //
const updateSupport = ref(0) //
/** 打开弹窗 */
const open = () => {
dialogVisible.value = true
updateSupport.value = 0
fileList.value = []
resetForm()
}
defineExpose({ open }) // open
/** 提交表单 */
const submitForm = async () => {
if (fileList.value.length == 0) {
message.error(t('FactoryModeling.ProductUnit.importFileRequired'))
return
}
//
uploadHeaders.value = {
Authorization: 'Bearer ' + getAccessToken(),
'tenantId': getTenantId()
}
formLoading.value = true
uploadRef.value!.submit()
}
/** 文件上传成功 */
const emits = defineEmits(['success'])
const submitFormSuccess = (response: any) => {
if (response.code !== 0) {
message.error(response.msg)
formLoading.value = false
return
}
/* // 拼接提示语
const data = response.data
let text = t('FactoryModeling.ProductUnit.importSuccessTip', {
createCount: data.createUsernames.length,
updateCount: data.updateUsernames.length,
failureCount: Object.keys(data.failureUsernames).length
})
for (let username of data.createUsernames) {
text += '< ' + username + ' >'
}
for (const username of data.updateUsernames) {
text += '< ' + username + ' >'
}
for (const username in data.failureUsernames) {
text += '< ' + username + ': ' + data.failureUsernames[username] + ' >'
}*/
message.alert(response.data)
formLoading.value = false
dialogVisible.value = false
//
emits('success')
}
/** 上传错误提示 */
const submitFormError = (): void => {
message.error(t('FactoryModeling.ProductUnit.importFailed'))
formLoading.value = false
}
/** 重置表单 */
const resetForm = async (): Promise<void> => {
//
formLoading.value = false
await nextTick()
uploadRef.value?.clearFiles()
}
/** 文件数超出提示 */
const handleExceed = (): void => {
message.error(t('FactoryModeling.ProductUnit.importFileLimit'))
}
/** 下载模板操作 */
const importTemplate = async () => {
const res = await ProductUnitApi.importUserTemplate()
download.excel(res, '单位导入模版.xls')
}
</script>

@ -50,6 +50,14 @@
<Icon icon="ep:plus" class="mr-5px" />
{{ t('FactoryModeling.ProductUnit.addButtonText') }}
</el-button>
<el-button
type="warning"
plain
@click="handleImport"
v-hasPermi="['system:user:import']"
>
<Icon icon="ep:upload" /> {{ t('FactoryModeling.ProductUnit.importButtonText') }}
</el-button>
<el-button
type="success"
plain
@ -129,6 +137,9 @@
<!-- 表单弹窗添加/修改 -->
<ProductUnitForm ref="formRef" @success="getList" />
<!-- 单位导入对话框 -->
<ProductUnitImportForm ref="importFormRef" @success="getList" />
</template>
<script setup lang="ts">
@ -199,6 +210,12 @@ const handleDelete = async (id: number) => {
} catch {}
}
/** 导入 */
const importFormRef = ref()
const handleImport = () => {
importFormRef.value.open()
}
/** 导出按钮操作 */
const handleExport = async () => {
try {

@ -310,7 +310,7 @@
<el-table
ref="multipleTableRef"
v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"
@selection-change="handleSelectionChange" row-key="id">
@selection-change="handleSelectionChange" @select="handleSelect" @select-all="handleSelectAll" row-key="id">
<el-table-column type="selection" width="55" :reserve-selection="true" />
<el-table-column
:label="t('EquipmentManagement.EquipmentKeyItems.code')" align="center" prop="code"
@ -382,7 +382,8 @@
</el-form-item>
</el-form>
<ContentWrap>
<el-table ref="bjMultipleTableRef" v-loading="loading" :data="bjList" :stripe="true" @selection-change="bjHandleSelectionChange" :show-overflow-tooltip="true" row-key="id">
<el-table ref="bjMultipleTableRef" v-loading="loading" :data="bjList" :stripe="true" @selection-change="bjHandleSelectionChange"
@select="bjHandleSelect" @select-all="bjHandleSelectAll" :show-overflow-tooltip="true" row-key="id">
<el-table-column type="selection" width="55" :reserve-selection="true" />
<el-table-column :label="t('SparePartsManagement.SpareInfo.code')" align="center" prop="barCode" width="240px" sortable />
<el-table-column :label="t('SparePartsManagement.SpareInfo.name')" align="left" prop="name" width="220px" sortable />
@ -636,25 +637,32 @@ const clearBeijian = () => {
const openCriticalComponentDialog = () => {
criticalComponentDraft.value = [...(formData.value.componentIds ?? [])]
criticalComponentDialogVisible.value = true
ids.value =formData.value.componentIds
setDefaultSelections()
}
const openBeijianDialog = () => {
beijianDraft.value = [...(formData.value.beijianIds ?? [])]
beijianDialogVisible.value = true
bjIds.value =formData.value.beijianIds
setBJDefaultSelections()
}
const ids = ref([])
const confirmCriticalComponentDialog = () => {
let ids = selectedRows.value.map(item => item.id);
//let ids = selectedRows.value.map(item => item.id);
//const validMap = new Set(criticalComponentOptions.value.map((item) => item.value))
//const selected = Array.from(new Set(criticalComponentDraft.value.map((v) => Number(v)).filter((v) => validMap.has(v))))
formData.value.componentIds = ids
formData.value.componentIds = ids.value
criticalComponentDialogVisible.value = false
//multipleTableRef.value.clearSelection()
}
const bjIds = ref([])
const confirmBeijianDialog = () => {
let ids = bjSelectedRows.value.map(item => item.id);
// let ids = bjSelectedRows.value.map(item => item.id);
/* const validMap = new Set(beijianOptions.value.map((item) => item.value))
const selected = Array.from(new Set(beijianDraft.value.map((v) => Number(v)).filter((v) => validMap.has(v))))*/
formData.value.beijianIds = ids
formData.value.beijianIds = bjIds.value
beijianDialogVisible.value = false
//multipleTableRef.value.clearSelection()
}
const handleCodeAutoChange = (value: boolean) => {
@ -798,6 +806,33 @@ const handleSelectionChange = (rows: CriticalComponentVO[]) => {
selectedRows.value.push(...rows)
}
//
const currentSelectedRows = ref([])
// select row selected
const handleSelect = (selection, row) => {
//
const isSelected = selection.includes(row)
if (isSelected) {
// console.log(` : ID=${row.id}, Name=${row.name}`)
ids.value.push(row.id)
} else {
ids.value= ids.value.filter(
item => item !== row.id
)
// console.log(` : ID=${row.id}, Name=${row.name}`)
}
//
currentSelectedRows.value = selection
}
const handleSelectAll = (selection) => {
ids.value = selection?.map((row) => row.id).filter((id) => id !== undefined) ?? []
}
const bjHandleSelectionChange = (rows: CriticalComponentVO[]) => {
bjSelectedIds.value = rows.map((r) => r.id).filter((id): id is number => typeof id === 'number')
// id
@ -811,6 +846,31 @@ const bjHandleSelectionChange = (rows: CriticalComponentVO[]) => {
bjSelectedRows.value.push(...rows)
}
//
const bjCurrentSelectedRows = ref([])
// select row selected
const bjHandleSelect = (selection, row) => {
//
const isSelected = selection.includes(row)
if (isSelected) {
// console.log(` : ID=${row.id}, Name=${row.name}`)
bjIds.value.push(row.id)
} else {
bjIds.value= bjIds.value.filter(
item => item !== row.id
)
// console.log(` : ID=${row.id}, Name=${row.name}`)
}
//
bjCurrentSelectedRows.value = selection
}
const bjHandleSelectAll = (selection) => {
bjIds.value = selection?.map((row) => row.id).filter((id) => id !== undefined) ?? []
}
const getList = async () => {
loading.value = true
try {
@ -921,6 +981,79 @@ const submitForm = async () => {
}
}
// 1 data
watch(list, (newData, oldData) => {
//
if (newData.length > 0) {
//
setDefaultSelections()
}
}, { deep: true })
//const defaultSelectedIds = [144, 143,141]
//
const setDefaultSelections = () => {
// DOM
nextTick(() => {
if (!multipleTableRef.value) return
multipleTableRef.value.clearSelection()
const rawSubjectIds = toRaw(formData.value.componentIds)
if(rawSubjectIds.length != 0){
let row={
id: undefined
}
multipleTableRef.value.toggleRowSelection(row, true)
}
//
list.value.forEach(row => {
let id = row.id;
if (rawSubjectIds.includes(row.id)) {
multipleTableRef.value.toggleRowSelection(row, true)
}
})
})
}
// 1 data
watch(bjList, (newData, oldData) => {
//
if (newData.length > 0) {
//
setBJDefaultSelections()
}
}, { deep: true })
//const defaultSelectedIds = [144, 143,141]
//
const setBJDefaultSelections = () => {
// DOM
nextTick(() => {
if (!bjMultipleTableRef.value) return
bjMultipleTableRef.value.clearSelection()
const rawSubjectIds = toRaw(formData.value.beijianIds)
if(rawSubjectIds.length != 0){
let row={
id: undefined
}
bjMultipleTableRef.value.toggleRowSelection(row, true)
}
//
bjList.value.forEach(row => {
let id = row.id;
if (rawSubjectIds.includes(row.id)) {
bjMultipleTableRef.value.toggleRowSelection(row, true)
}
})
})
}
/** 重置表单 */
const resetForm = () => {
formData.value = initFormData()

@ -28,7 +28,7 @@
</el-form-item>
<el-form-item :label="t('EquipmentManagement.PlanMaintenance.subjectName')" prop="subjectIds">
<el-select
<!-- <el-select
v-model="formData.subjectIds"
multiple
filterable
@ -37,7 +37,17 @@
class="!w-full"
>
<el-option v-for="item in subjectOptions" :key="item.id" :label="item.subjectName" :value="item.id" />
</el-select>
</el-select>-->
<el-input
:model-value="subjectNameDisplay"
readonly
clearable
class="device-ledger-selection-input"
:placeholder="t('EquipmentManagement.PlanMaintenance.placeholderSubjectSelect')"
@clear="clearSubjectComponent"
@click="openSubjectComponentDialog"
/>
</el-form-item>
</el-form>
@ -46,12 +56,64 @@
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
<!--点检名称-->
<el-dialog
v-model="subjectComponentDialogVisible"
title="选择点检项"
width="1200px"
class="device-ledger-transfer-dialog"
append-to-body
>
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" min-label-width="68px" style="margin-bottom: 10px">
<el-form-item :label="t('EquipmentManagement.DvSubject.code')" prop="subjectCode">
<el-input
v-model="queryParams.subjectCode" :placeholder="t('EquipmentManagement.DvSubject.placeholderCode')"
clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item :label="t('EquipmentManagement.DvSubject.name')" prop="subjectName">
<el-input
v-model="queryParams.subjectName" :placeholder="t('EquipmentManagement.DvSubject.placeholderName')"
clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" />
{{ t('common.query') }}
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" />
{{ t('common.reset') }}
</el-button>
</el-form-item>
</el-form>
<ContentWrap>
<el-table
ref="multipleTableRef"
v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"
@selection-change="handleSelectionChange" @select="handleSelect" @select-all="handleSelectAll" row-key="id">
<el-table-column type="selection" width="55" :reserve-selection="true" />
<el-table-column :label="t('EquipmentManagement.DvSubject.code')" align="center" prop="subjectCode" sortable />
<el-table-column :label="t('EquipmentManagement.DvSubject.name')" align="center" prop="subjectName" sortable />
<el-table-column :label="t('EquipmentManagement.DvSubject.judgmentCriteria')" align="center" width="480px" prop="judgmentCriteria" />
</el-table>
<Pagination
:total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</ContentWrap>
<template #footer>
<el-button @click="subjectComponentDialogVisible = false">{{ t('common.cancel') }}</el-button>
<el-button type="primary" @click="confirmSubjectComponentDialog">{{ t('common.ok') }}</el-button>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import type { FormRules } from 'element-plus'
import { DvSubjectApi, DvSubjectVO } from '@/api/mes/dvsubject'
import { PlanMaintenanceApi, PlanMaintenanceVO } from '@/api/mes/planmaintenance'
import {ref} from "vue";
import {ElTable} from "element-plus";
defineOptions({ name: 'PlanMaintenanceForm' })
@ -62,13 +124,44 @@ const dialogVisible = ref(false)
const dialogTitle = ref('')
const formLoading = ref(false)
const formType = ref<'create' | 'update'>('create')
const queryFormRef = ref() //
const subjectComponentDialogVisible = ref(false)
const loading = ref(true) //
const list = ref<DvSubjectVO[]>([]) //
const total = ref(0) //
const tableRef = ref()
const selectedIds = ref<number[]>([])
const selectedRows = ref<any[]>([]) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
subjectCode: undefined as string | undefined,
subjectName: undefined as string | undefined,
})
const multipleTableRef = ref<InstanceType<typeof ElTable>>()
const beijianOptions = ref<{ label: string; value: number }[]>([])
const formatSelectedSummary = (ids: number[], options: { label: string; value: number }[]) => {
const optionMap = new Map<number, string>(options.map((item) => [item.value, item.label]))
const labels = ids.map((id) => optionMap.get(id)).filter((v): v is string => Boolean(v))
if (!labels.length) return ''
if (labels.length <= 3) return labels.join('、')
return `${labels.slice(0, 3).join('、')}…等${labels.length}`
}
const subjectNameDisplay = computed(() =>
formatSelectedSummary(formData.value.subjectIds ?? [], beijianOptions.value)
)
const subjectOptions = ref<DvSubjectVO[]>([])
const ensureSubjectOptionsLoaded = async () => {
if (subjectOptions.value.length) return
const res = await DvSubjectApi.getDvSubjectList()
console.log(res)
subjectOptions.value = (res ?? []) as DvSubjectVO[]
beijianOptions.value = (res ?? []).map((item: any) => {
const code = item.subjectCode ? String(item.subjectCode) : ''
const name = item.subjectName ? String(item.subjectName) : ''
const label = code && name ? `${code}-${name}` : name || code || String(item.id)
return { label, value: Number(item.id) }
})
}
const parseIds = (value: any): Array<number | string> => {
@ -128,6 +221,7 @@ const open = async (type: 'create' | 'update', row?: Partial<PlanMaintenanceVO>)
subjectIds: parseIds((row as any).subjectIds ?? (row as any).subjectIdS)
}
}
getList()
}
defineExpose({ open })
@ -162,4 +256,149 @@ const resetForm = () => {
formData.value = initFormData()
formRef.value?.resetFields()
}
const clearSubjectComponent = () => {
formData.value.subjectIds = []
}
const ids = ref([])
const openSubjectComponentDialog = () => {
if (formType.value === 'create') {
selectedIds.value = []
selectedRows.value =[]
//formData.value.subjectIds = []
// multipleTableRef.value.clearSelection()
}else{
selectedIds.value = []
selectedRows.value =[]
//formData.value.subjectIds = []
// multipleTableRef.value.clearSelection()
}
// criticalComponentDraft.value = [...(formData.value.componentIds ?? [])]
subjectComponentDialogVisible.value = true
ids.value =formData.value.subjectIds
setDefaultSelections()
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
const handleSelectionChange = (rows: any[]) => {
selectedIds.value = rows?.map((row) => row.id).filter((id) => id !== undefined) ?? []
// id
const currentPageIds = rows.map(item => item.id)
//
selectedRows.value = selectedRows.value.filter(
item => item.id !== undefined
)
selectedRows.value = selectedRows.value.filter(
item => !currentPageIds.includes(item.id)
)
//
selectedRows.value.push(...rows)
}
//
const currentSelectedRows = ref([])
// select row selected
const handleSelect = (selection, row) => {
//
const isSelected = selection.includes(row)
if (isSelected) {
// console.log(` : ID=${row.id}, Name=${row.name}`)
ids.value.push(row.id)
} else {
ids.value= ids.value.filter(
item => item !== row.id
)
// console.log(` : ID=${row.id}, Name=${row.name}`)
}
//
currentSelectedRows.value = selection
}
const handleSelectAll = (selection) => {
ids.value = selection?.map((row) => row.id).filter((id) => id !== undefined) ?? []
}
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await DvSubjectApi.getDvSubjectPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
const confirmSubjectComponentDialog = () => {
//let ids = selectedRows.value.map(item => item.id);
//const validMap = new Set(criticalComponentOptions.value.map((item) => item.value))
//const selected = Array.from(new Set(criticalComponentDraft.value.map((v) => Number(v)).filter((v) => validMap.has(v))))
formData.value.subjectIds = ids.value
subjectComponentDialogVisible.value = false
multipleTableRef.value.clearSelection()
}
const cancelHandle = () => {
multipleTableRef.value.clearSelection()
}
// 1 data
watch(list, (newData, oldData) => {
//
if (newData.length > 0) {
//
setDefaultSelections()
}
}, { deep: true })
//const defaultSelectedIds = [144, 143,141]
//
const setDefaultSelections = () => {
// DOM
nextTick(() => {
if (!multipleTableRef.value) return
multipleTableRef.value.clearSelection()
const rawSubjectIds = toRaw(formData.value.subjectIds)
if(rawSubjectIds.length != 0){
let row={
id: undefined
}
multipleTableRef.value.toggleRowSelection(row, true)
}
//
list.value.forEach(row => {
let id = row.id;
if (rawSubjectIds.includes(row.id)) {
multipleTableRef.value.toggleRowSelection(row, true)
}
})
})
}
</script>
<style lang="scss" scoped>
:deep(.device-ledger-transfer-dialog){
height: 200px;
}
</style>

Loading…
Cancel
Save