Merge remote-tracking branch 'origin/dev' into dev

pull/1/head
zengchenxi 9 months ago
commit 0eeedcbe65

@ -18,18 +18,6 @@ import * as DeptApi from '@/api/system/dept'
import { defaultProps, handleTree } from '@/utils/tree'
interface UserVO {
id: number
username: string
nickname: string
}
const props = defineProps({
initialUserList: {
type: Array as PropType<UserVO[]>,
default: () => []
}
})
const valueBranch: any = ref() //
const deptTree = ref() //

@ -12,32 +12,22 @@
:loading="Loading"
@change="onSelectChange"
>
<el-option v-for="item in userSelectList" :key="item.id" :label="item.name" :value="item.id" />
<el-option v-for="item in clientSelectList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</template>
<script lang="ts" setup>
import { ref, onMounted, toRefs } from 'vue'
import * as CustomerApi from '@/api/heli/customer'
interface UserVO {
id: number
username: string
nickname: string
}
const props = defineProps({
initialUserList: {
type: Array as PropType<UserVO[]>,
default: () => []
}
})
const valueName: any = ref() //
const userList = ref<UserApi.UserVO[]>([]) //
const userSelectList = ref<UserApi.UserVO[]>([])
const clientList = ref<CustomerApi.CustomerVO[]>([]) //
const clientSelectList = ref<CustomerApi.CustomerVO[]>([])
const Loading = ref(false)
//
//
onMounted(async () => {
const userParams = {
const clientParams = {
pageNo: 1,
pageSize: 10,
code: undefined,
@ -45,9 +35,9 @@ onMounted(async () => {
status: undefined
}
try {
const data = await CustomerApi.getCustomerPage(userParams)
const data = await CustomerApi.getCustomerPage(clientParams)
console.log(data.list)
userList.value = data.list
clientList.value = data.list
//
remoteMethod('')
} catch (error) {
@ -60,18 +50,13 @@ const remoteMethod = (query: any) => {
Loading.value = true
setTimeout(() => {
Loading.value = false
userSelectList.value = userList.value
clientSelectList.value = clientList.value
.filter((item) => item.name.toLowerCase().includes(query.toLowerCase()))
.slice(0, 10) //10
}, 200)
} else {
userSelectList.value = userList.value.slice(0, 10)
clientSelectList.value = clientList.value.slice(0, 10)
}
}
// const onSelectChange = (newValue: number | null) => {
// // console.log(newValue)
// emit('update:valueName', newValue)
// valueName.value = newValue
// }
</script>

@ -0,0 +1,61 @@
<template>
<!-- 材质选择 -->
<el-select
v-model="valueName"
placeholder="请输入材质"
:remote-method="remoteMethod"
remote-show-suffix
remote
clearable
reserve-keyword
filterable
:loading="Loading"
@change="onSelectChange"
>
<el-option v-for="item in compositionSelectList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</template>
<script lang="ts" setup>
import { ref, onMounted, toRefs } from 'vue'
import * as CompositionApi from '@/api/heli/composition'
const valueName: any = ref() //
const compositionList = ref<CompositionApi.CompositionVO[]>([]) //
const compositionSelectList = ref<CompositionApi.CompositionVO[]>([])
const Loading = ref(false)
//
onMounted(async () => {
const queryParams = {
pageNo: 1,
pageSize: 10,
code: undefined,
brief: undefined,
status: undefined
}
try {
const data = await CompositionApi.getCompositionPage(queryParams)
console.log(data.list)
compositionList.value = data.list
//
remoteMethod('')
} catch (error) {
console.error(error)
}
})
const remoteMethod = (query: any) => {
if (query) {
Loading.value = true
setTimeout(() => {
Loading.value = false
compositionSelectList.value = compositionList.value
.filter((item) => item.name.toLowerCase().includes(query.toLowerCase()))
.slice(0, 10) //10
}, 200)
} else {
compositionSelectList.value = compositionList.value.slice(0, 10)
}
}
</script>

@ -8,8 +8,11 @@
<ContentWrap class="borderxx">
<el-row style="font-size: 20px; font-weight: 700;margin-bottom: 30px">
<el-col :span="1"> 部门 </el-col>
<el-col :span="1"> 人员 </el-col>
<el-col :span="1"> 车间 </el-col>
<el-col :span="1"> 职工 </el-col>
<el-col :span="1"> 客户</el-col>
<el-col :span="1"> 供应商</el-col>
<el-col :span="1"> 材质</el-col>
</el-row>
<!-- 搜索工作栏 -->
<el-form

@ -8,20 +8,22 @@
label-width="108px"
>
<el-form-item label="上级部门" prop="parentId">
<BranchSelect
v-model="formData.parentId"
/>
<BranchSelect v-model="formData.parentId" />
</el-form-item>
<el-form-item label="负责人" prop="leaderUserId">
<UserSelect
v-model="formData.leaderUserId"
/>
<el-form-item label="车间" prop="workshopId">
<WorkshopSelect v-model="formData.workshopId" />
</el-form-item>
<el-form-item label="职工" prop="leaderUserId">
<UserSelect v-model="formData.leaderUserId" />
</el-form-item>
<el-form-item label="客户" prop="clientId">
<ClientSelect v-model="formData.clientId" />
</el-form-item>
<el-form-item label="供应商" prop="supplierId">
<SupplierSelect v-model="formData.supplierId" />
</el-form-item>
<el-form-item label="客户" prop="leaderUserId">
<ClientSelect
v-model="formData.clientId"
/>
<el-form-item label="材质" prop="compositionId">
<CompositionSelect v-model="formData.compositionId" />
</el-form-item>
</el-form>
<template #footer>
@ -40,6 +42,9 @@ import { FormRules } from 'element-plus'
import UserSelect from '../hlvuestyle/userSelect.vue'
import BranchSelect from '../hlvuestyle/branchSelect.vue'
import ClientSelect from '../hlvuestyle/clientSelect.vue'
import SupplierSelect from '../hlvuestyle/supplierSelect.vue'
import CompositionSelect from '../hlvuestyle/compositionSelect.vue'
import WorkshopSelect from '../hlvuestyle/workshopSelect.vue'
defineOptions({ name: 'SystemDeptForm' })
@ -55,10 +60,13 @@ const formData: any = ref({
parentId: undefined,
leaderUserId: undefined,
clientId: undefined,
supplierId: undefined,
compositionId: undefined,
workshopId: undefined,
status: CommonStatusEnum.ENABLE
})
const formRules = reactive<FormRules>({
parentId: [{ required: true, message: '上级部门不能为空', trigger: 'blur' }],
parentId: [{ required: true, message: '上级部门不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
const deptTree = ref() //
@ -66,7 +74,6 @@ const userList = ref<UserApi.UserVO[]>([]) // 用户列表
const userSelectList = ref<UserApi.UserVO[]>([])
const userSelectLoading = ref(false)
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
@ -109,6 +116,8 @@ const resetForm = () => {
id: undefined,
parentId: undefined,
leaderUserId: undefined,
clientId: undefined,
supplierId: undefined,
status: CommonStatusEnum.ENABLE
}
formRef.value?.resetFields()
@ -122,5 +131,4 @@ const getTree = async () => {
dept.children = handleTree(data)
deptTree.value.push(dept)
}
</script>

@ -0,0 +1,67 @@
<template>
<!-- 供应商选择 -->
<el-select
v-model="valueName"
placeholder="请输入供应商"
:remote-method="remoteMethod"
remote-show-suffix
remote
clearable
reserve-keyword
filterable
:loading="Loading"
@change="onSelectChange"
>
<el-option v-for="item in supplierSelectList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</template>
<script lang="ts" setup>
import { ref, onMounted, toRefs } from 'vue'
import * as SupplierApi from '@/api/heli/supplier'
const valueName: any = ref() //
const supplierList = ref<SupplierApi.SupplierVO[]>([]) //
const supplierSelectList = ref<SupplierApi.SupplierVO[]>([])
const Loading = ref(false)
//
onMounted(async () => {
const queryParams = {
pageNo: 1,
pageSize: 10,
code: undefined,
brief: undefined,
status: undefined
}
try {
const data = await SupplierApi.getSupplierPage(queryParams)
console.log(data.list)
supplierList.value = data.list
//
remoteMethod('')
} catch (error) {
console.error(error)
}
})
const remoteMethod = (query: any) => {
if (query) {
Loading.value = true
setTimeout(() => {
Loading.value = false
supplierSelectList.value = supplierList.value
.filter((item) => item.name.toLowerCase().includes(query.toLowerCase()))
.slice(0, 10) //10
}, 200)
} else {
supplierSelectList.value = supplierList.value.slice(0, 10)
}
}
// const onSelectChange = (newValue: number | null) => {
// // console.log(newValue)
// emit('update:valueName', newValue)
// valueName.value = newValue
// }
</script>

@ -0,0 +1,61 @@
<template>
<!-- 车间选择 -->
<el-select
v-model="valueName"
placeholder="请输入车间"
:remote-method="remoteMethod"
remote-show-suffix
remote
clearable
reserve-keyword
filterable
:loading="Loading"
@change="onSelectChange"
>
<el-option v-for="item in workshopSelectList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</template>
<script lang="ts" setup>
import { ref, onMounted, toRefs } from 'vue'
import * as WorkshopApi from '@/api/heli/workshop'
const valueName: any = ref() //
const workshopList = ref<WorkshopApi.WorkshopVO[]>([]) //
const workshopSelectList = ref<WorkshopApi.WorkshopVO[]>([])
const Loading = ref(false)
//
onMounted(async () => {
const queryParams = {
pageNo: 1,
pageSize: 10,
code: undefined,
brief: undefined,
status: undefined
}
try {
const data = await WorkshopApi.getWorkshopPage(queryParams)
console.log(data.list)
workshopList.value = data.list
//
remoteMethod('')
} catch (error) {
console.error(error)
}
})
const remoteMethod = (query: any) => {
if (query) {
Loading.value = true
setTimeout(() => {
Loading.value = false
workshopSelectList.value = workshopList.value
.filter((item) => item.name.toLowerCase().includes(query.toLowerCase()))
.slice(0, 10) //10
}, 200)
} else {
workshopSelectList.value = workshopList.value.slice(0, 10)
}
}
</script>

@ -95,8 +95,8 @@
<el-table-column prop="matCode" label="物料编码" required>
<template #default="scope">
<el-select v-model="scope.row.matCode" placeholder="物料编码" :remote-method="remoteMatCodeSearch"
remote-show-suffix remote clearable reserve-keyword filterable :loading="matSelectLoading" @change="(val) => handleMatCode(scope,val)"
class="!w-180px">
remote-show-suffix remote clearable reserve-keyword filterable :loading="matSelectLoading"
@change="(val) => handleMatCode(scope, val)" class="!w-180px">
<el-option v-for="item in matList" :key="item.id" :label="item.code" :value="item.id" />
</el-select>
</template>
@ -116,14 +116,16 @@
</el-table-column>
<el-table-column prop="matType" label="物料类型">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_MATERIAL_TYPE" :value="scope.row.matType" v-if="scope.row.matType?true:false"/>
<dict-tag :type="DICT_TYPE.HELI_MATERIAL_TYPE" :value="scope.row.matType"
v-if="scope.row.matType ? true : false" />
</template>
</el-table-column>
<el-table-column prop="matSpec" label="规格/型号" />
<el-table-column prop="matUnit" label="系统单位">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_MATERIAL_UNIT" :value="scope.row.matUnit" v-if="scope.row.matUnit?true:false" />
<dict-tag :type="DICT_TYPE.HELI_MATERIAL_UNIT" :value="scope.row.matUnit"
v-if="scope.row.matUnit ? true : false" />
</template>
</el-table-column>
<el-table-column prop="rgId" width="140" label="入库库区" required>
@ -185,14 +187,17 @@
<el-col>
<el-card class="hl-incard">
<el-col>
<el-upload v-model:file-list="fileList" :show-file-list="false" class="upload-demo"
action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15" multiple
:on-preview="handlePreview" :on-remove="handleRemove" :before-remove="beforeRemove" :limit="3"
:on-exceed="handleExceed" @before-upload="handleBeforeUpload">
<el-button type="primary" size="large" class="hl-addbutton">上传</el-button>
<el-upload ref="matUploadRef" :file-list="matUploadFiles" multiple :limit="10" :action="uploadUrl"
:headers="{ 'Authorization': 'Bearer ' + getAccessToken(), 'tenant-id': getTenantId() }" name="files"
:show-file-list="false" :auto-upload="false"
:data="{ 'businessType': 'STORAGE', 'businessId': formData.id, 'businessFileType': 'MATERIAL' }"
:on-change="matUploadChange" class="upload-file-uploader">
<el-button type="primary">
<Icon icon="ep:upload-filled" />上传
</el-button>
</el-upload>
</el-col>
<el-table :data="fileList" class="hl-table">
<el-table :data="matUploadFiles" class="hl-table">
<el-table-column prop="name" label="文件名称" align="center">
<template #default="scope">
<!-- <div></div> -->
@ -200,14 +205,17 @@
</template>
</el-table-column>
<el-table-column prop="uploadTimestamp" align="center" label="上传日期" />
<el-table-column prop="createTime" align="center" label="上传日期" :formatter="dateFormatter" />
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button link type="danger" size="small" @click="handleDelete(scope.$index)">
<el-button link type="danger" size="small"
@click="handleDeleteAttachment(scope.$index, scope.row.businessFileType)">
删除
</el-button>
<el-button link type="primary" size="small" @click="downloadAttachment(scope.row.name,scope.row.url)"> </el-button>
<el-button link type="primary" size="small" v-if="isShow"
@click="downloadAttachment(scope.row.name, scope.row.url)">
下载 </el-button>
</template>
</el-table-column>
</el-table>
@ -268,19 +276,21 @@
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import type { UploadProps, UploadUserFile } from 'element-plus'
import { dateFormatter } from "@/utils/formatTime"
import type { UploadUserFile } from 'element-plus'
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import * as StorageApi from '@/api/heli/storage'
import * as StorageMatApi from '@/api/heli/storagemat'
import { getAccessToken, getTenantId } from "@/utils/auth"
import * as MaterialApi from '@/api/heli/material'
import * as WarehouseApi from '@/api/heli/warehouse'
import * as RgApi from '@/api/heli/rg'
import * as PnApi from '@/api/heli/pn'
import {deleteFile, downloadFile} from "@/api/infra/file";
import download from "@/utils/download";
import { deleteFile, downloadFile } from "@/api/infra/file"
import download from "@/utils/download"
const { t } = useI18n() //
const message = useMessage() //
@ -309,7 +319,8 @@ const formData = ref({
outboundTime: undefined,
cancel: undefined,
cancelTime: undefined,
productBomItemDOList: []
productBomItemDOList: [],
attachments: []
})
const formRules = reactive({
// name: [{ required: true, message: '', trigger: 'blur' }],
@ -319,7 +330,55 @@ const formRules = reactive({
})
const formRef = ref() // Ref
// ==================== =======================================
const uploadUrl = ref(import.meta.env.VITE_UPLOAD_BATCH_URL)
const matUploadRef = ref();
const matUploadFiles = ref<UploadUserFile[]>([]);
const matUploadChange = (file, files) => {
matUploadFiles.value = files;
refreshAttachments(files, 'MATERIAL')
}
const refreshAttachments = (files, type) => {
formData.value.attachments = formData.value.attachments.filter((value, index, array) => {
return value.businessFileType != type;
});
for (let i = 0; i < files.length; i++) {
let file = files[i];
file.businessFileType = type;
file.createTime = new Date();
formData.value.attachments.push(file);
}
//
formData.value.attachments.sort((v1, v2) => {
return v1.businessFileType == v2.businessFileType ? 0 : 1;
})
}
//
const handleDeleteAttachment = async (index, type) => {
const deletedAttachments = formData.value.attachments.splice(index, 1);
for (let i = 0; i < deletedAttachments.length; i++) {
const attachment = deletedAttachments[i];
if (attachment.id) {
//
await deleteFile(attachment.id);
}
//
matUploadFiles.value = matUploadFiles.value.filter(file1 => {
return file1.name != attachment.name || file1.businessFileType != type;
})
protocolUploadFiles.value = protocolUploadFiles.value.filter(file2 => {
return file2.name != attachment.name || file2.businessFileType != type;
})
}
}
//
const downloadAttachment = async (name, url) => {
const data = await downloadFile(url)
download.any(data, name);
}
// ==================== =======================================
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
@ -373,17 +432,7 @@ const submitForm = async () => {
}
}
const goback = () => {
resetForm()
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
name: undefined,
status: 1,
productBomItemDOList: []
}
formRef.value?.resetFields()
}
var matCount = 1
@ -442,98 +491,13 @@ const handlefuke = (index, item) => {
}
// / input
const handleEdit = (index) => {
formData.value.productBomItemDOList[index].editable = true
}
const handleSave = (index) => {
formData.value.productBomItemDOList[index].editable = false
}
const handleCellClick = (row, column, event) => {
if (row.editable) {
column.el.querySelector('input').focus()
}
}
const handleCellBlur = (row, column, event) => {
if (row.editable) {
column.el.querySelector('input').blur()
}
}
//
const handleDelete2 = (index: number) => {
formData.value.productBomItemDOList.splice(index, 1)
}
//
const fileList = ref([
{
name: 'element-plus-logo.svg',
url: 'http://127.0.0.1:8080/admin-api/infra/file/5/get/d229467d4ad143582725cc39d16dd04c660034b71e3ddcfe930901639bbccee5.png',
uploadTimestamp: '2024-1-12 1606'
},
{
name: 'element-plus-logo2.svg',
url: 'https://element-plus.org/images/element-plus-logo.svg',
uploadTimestamp: '2024-1-12 1606'
}
])
const handleRemove: UploadProps['onRemove'] = (file, uploadFiles) => {
console.log(file, uploadFiles, '11')
}
const handlePreview: UploadProps['onPreview'] = (uploadFile) => {
console.log(uploadFile, '222')
}
const handleExceed: UploadProps['onExceed'] = (files, uploadFiles) => {
ElMessage.warning(
`The limit is 3, you selected ${files.length} files this time, add up to ${files.length + uploadFiles.length
} totally`
)
console.log('333')
}
//
const downloadAttachment = async (name, url) => {
const data = await downloadFile(url)
download.any(data, name);
}
let uploadTimestamp: any = null
const handleBeforeUpload = (file: File) => {
uploadTimestamp = new Date().toISOString() //
// false
// return false;
// filelist
const newFile: any = {
name: '',
url: '', // URL
uploadTimestamp: uploadTimestamp!,
};
fileList.value.push(newFile);
}
const beforeRemove: UploadProps['beforeRemove'] = (uploadFile, uploadFiles) => {
console.log('444', uploadFile, uploadFiles)
return ElMessageBox.confirm(`Cancel the transfer of ${uploadFile.name} ?`).then(
() => true,
() => false
)
}
//
const handleDelete = (index: number) => {
fileList.value.splice(index, 1)
}
//
const warehouseList = ref([])
//
@ -575,23 +539,8 @@ const handleRg = (async (scope) => {
})
const matList = ref<MaterialApi.MaterialVO[]>([]) //
const matList = ref<MaterialApi.MaterialVO[]>([]) //
const matSelectLoading = ref(false);
const remoteMatSearch = async (query) => {
matSelectLoading.value= true
//
let matParams = {
pageNo: 1,
pageSize: 10,
name : query,
status: "1"
}
const dataMat = await MaterialApi.getMaterialPage(matParams)
matList.value = []
matList.value = dataMat.list
matSelectLoading.value= false
}
const remoteMatCodeSearch = async (query) => {
matSelectLoading.value = true
//

Loading…
Cancel
Save