Merge branch 'dev_银川_中盛建材' of http://114.132.189.42:9002/r/product-inventory-management into dev_银川_中盛建材
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-dialog :title="title" |
| | | v-model="dialogVisible" |
| | | :width="width" |
| | | :append-to-body="appendToBody" |
| | | @close="handleClose"> |
| | | <div v-if="showProductTypeSelect" |
| | | style="margin-bottom: 20px;"> |
| | | <el-form :inline="true" |
| | | :model="form"> |
| | | <el-form-item label="产åç±»å" |
| | | prop="dictCode" |
| | | style="margin-bottom: 0;"> |
| | | <el-select v-model="form.dictCode" |
| | | placeholder="è¯·éæ©äº§åç±»å" |
| | | clearable |
| | | style="width: 200px;"> |
| | | <el-option v-for="option in productTypeOptions" |
| | | :key="option.dictCode" |
| | | :label="option.dictLabel" |
| | | :value="option.dictCode" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <el-upload ref="uploadRef" |
| | | :limit="limit" |
| | | :accept="accept" |
| | | :headers="headers" |
| | | :action="action" |
| | | :data="uploadData" |
| | | :disabled="disabled" |
| | | :before-upload="beforeUpload" |
| | | :on-progress="onProgress" |
| | | :on-success="onSuccess" |
| | | :on-error="onError" |
| | | :on-change="onChange" |
| | | :auto-upload="autoUpload" |
| | | drag> |
| | | <el-icon class="el-icon--upload"> |
| | | <UploadFilled /> |
| | | </el-icon> |
| | | <div class="el-upload__text">å°æä»¶æå°æ¤å¤ï¼æ<em>ç¹å»ä¸ä¼ </em></div> |
| | | <template #tip> |
| | | <div class="el-upload__tip text-center"> |
| | | <span>{{ tipText }}</span> |
| | | <el-link v-if="showDownloadTemplate" |
| | | type="primary" |
| | | :underline="false" |
| | | style="font-size: 12px; vertical-align: baseline; margin-left: 5px;" |
| | | @click="handleDownloadTemplate">ä¸è½½æ¨¡æ¿</el-link> |
| | | </div> |
| | | </template> |
| | | </el-upload> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" |
| | | @click="handleConfirm">ç¡® å®</el-button> |
| | | <el-button @click="handleCancel">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { computed, ref, reactive, watch } from "vue"; |
| | | import { UploadFilled } from "@element-plus/icons-vue"; |
| | | import { ElMessage } from "element-plus"; |
| | | import { getDicts } from "@/api/system/dict/data"; |
| | | |
| | | const props = defineProps({ |
| | | modelValue: { |
| | | type: Boolean, |
| | | default: false, |
| | | }, |
| | | title: { |
| | | type: String, |
| | | default: "导å
¥", |
| | | }, |
| | | width: { |
| | | type: String, |
| | | default: "400px", |
| | | }, |
| | | appendToBody: { |
| | | type: Boolean, |
| | | default: true, |
| | | }, |
| | | limit: { |
| | | type: Number, |
| | | default: 1, |
| | | }, |
| | | accept: { |
| | | type: String, |
| | | default: ".xlsx, .xls", |
| | | }, |
| | | headers: { |
| | | type: Object, |
| | | default: () => ({}), |
| | | }, |
| | | action: { |
| | | type: String, |
| | | required: true, |
| | | }, |
| | | disabled: { |
| | | type: Boolean, |
| | | default: false, |
| | | }, |
| | | autoUpload: { |
| | | type: Boolean, |
| | | default: false, |
| | | }, |
| | | tipText: { |
| | | type: String, |
| | | default: "ä»
å
许导å
¥xlsãxlsxæ ¼å¼æä»¶ã", |
| | | }, |
| | | showDownloadTemplate: { |
| | | type: Boolean, |
| | | default: true, |
| | | }, |
| | | showProductTypeSelect: { |
| | | type: Boolean, |
| | | default: false, |
| | | }, |
| | | beforeUpload: { |
| | | type: Function, |
| | | default: null, |
| | | }, |
| | | onProgress: { |
| | | type: Function, |
| | | default: null, |
| | | }, |
| | | onSuccess: { |
| | | type: Function, |
| | | default: null, |
| | | }, |
| | | onError: { |
| | | type: Function, |
| | | default: null, |
| | | }, |
| | | onChange: { |
| | | type: Function, |
| | | default: null, |
| | | }, |
| | | }); |
| | | |
| | | const emit = defineEmits([ |
| | | "update:modelValue", |
| | | "close", |
| | | "confirm", |
| | | "cancel", |
| | | "download-template", |
| | | ]); |
| | | |
| | | const dialogVisible = computed({ |
| | | get: () => props.modelValue, |
| | | set: val => emit("update:modelValue", val), |
| | | }); |
| | | |
| | | const uploadRef = ref(null); |
| | | const productTypeOptions = ref([]); |
| | | const form = reactive({ |
| | | dictCode: "", |
| | | }); |
| | | |
| | | // è·å产åç±»ååå
¸ |
| | | const getProductTypeOptions = () => { |
| | | getDicts("product_type") |
| | | .then(res => { |
| | | if (res.code === 200) { |
| | | productTypeOptions.value = res.data; |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | console.error("è·å产åç±»ååå
¸å¤±è´¥ï¼", err); |
| | | }); |
| | | }; |
| | | |
| | | // çå¬å¯¹è¯æ¡æ¾ç¤ºï¼å 载产åç±»ååå
¸ |
| | | watch( |
| | | () => props.modelValue, |
| | | newVal => { |
| | | if (newVal && props.showProductTypeSelect) { |
| | | getProductTypeOptions(); |
| | | } |
| | | } |
| | | ); |
| | | |
| | | // ä¸ä¼ æ°æ® |
| | | const uploadData = computed(() => { |
| | | if (props.showProductTypeSelect) { |
| | | return { |
| | | dictCode: form.dictCode, |
| | | }; |
| | | } |
| | | return {}; |
| | | }); |
| | | |
| | | const handleClose = () => { |
| | | form.dictCode = ""; |
| | | emit("close"); |
| | | }; |
| | | |
| | | const handleConfirm = () => { |
| | | if (props.showProductTypeSelect && !form.dictCode) { |
| | | ElMessage.warning("è¯·éæ©äº§åç±»å"); |
| | | return; |
| | | } |
| | | emit("confirm"); |
| | | }; |
| | | |
| | | const submit = () => { |
| | | if (uploadRef.value) { |
| | | uploadRef.value.submit(); |
| | | } |
| | | }; |
| | | |
| | | const handleCancel = () => { |
| | | form.dictCode = ""; |
| | | emit("cancel"); |
| | | dialogVisible.value = false; |
| | | }; |
| | | |
| | | const handleDownloadTemplate = () => { |
| | | emit("download-template"); |
| | | }; |
| | | |
| | | defineExpose({ |
| | | uploadRef, |
| | | submit, |
| | | clearFiles: () => { |
| | | if (uploadRef.value) { |
| | | uploadRef.value.clearFiles(); |
| | | } |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .dialog-footer { |
| | | text-align: center; |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <div style="text-align: right; margin-bottom: 10px;"> |
| | | <el-button type="info" |
| | | plain |
| | | icon="Upload" |
| | | @click="handleImport" |
| | | v-hasPermi="['product:bom:import']">导å
¥</el-button> |
| | | <el-button type="warning" |
| | | plain |
| | | icon="Download" |
| | | @click="handleExport" |
| | | :disabled="selectedRows.length !== 1" |
| | | v-hasPermi="['product:bom:export']">导åº</el-button> |
| | | <el-button type="primary" |
| | | @click="handleAdd">æ°å¢</el-button> |
| | | <el-button type="danger" |
| | | plain |
| | | @click="handleBatchDelete" |
| | | :disabled="selectedRows.length === 0">å é¤</el-button> |
| | | <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;"> |
| | | <!-- æç´¢åºå --> |
| | | <div class="search-form"> |
| | | <el-form :inline="true" |
| | | :model="searchForm"> |
| | | <el-form-item label="产åç±»å" |
| | | style="margin-bottom: 0px !important;"> |
| | | <el-select v-model="searchForm.dictCode" |
| | | style="width: 200px;" |
| | | placeholder="è¯·éæ©äº§åç±»å" |
| | | clearable> |
| | | <el-option v-for="option in productTypeOptions" |
| | | :key="option.dictCode" |
| | | :label="option.dictLabel" |
| | | :value="option.dictCode" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item style="margin-bottom: 0px !important;"> |
| | | <el-button type="primary" |
| | | @click="handleSearch">æç´¢</el-button> |
| | | <el-button @click="handleReset">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <!-- æé®åºå --> |
| | | <div> |
| | | <el-button type="info" |
| | | plain |
| | | icon="Upload" |
| | | @click="handleImport" |
| | | v-hasPermi="['product:bom:import']">导å
¥</el-button> |
| | | <el-button type="warning" |
| | | plain |
| | | icon="Download" |
| | | @click="handleExport" |
| | | :disabled="selectedRows.length !== 1" |
| | | v-hasPermi="['product:bom:export']">导åº</el-button> |
| | | <el-button type="primary" |
| | | @click="handleAdd">æ°å¢</el-button> |
| | | <el-button type="danger" |
| | | plain |
| | | @click="handleBatchDelete" |
| | | :disabled="selectedRows.length === 0">å é¤</el-button> |
| | | </div> |
| | | </div> |
| | | <PIMTable rowKey="id" |
| | | :column="tableColumn" |
| | |
| | | :model="form" |
| | | :rules="rules" |
| | | label-width="120px"> |
| | | <el-form-item label="产ååç§°" |
| | | prop="productModelId"> |
| | | <el-button type="primary" |
| | | @click="showProductSelectDialog = true"> |
| | | {{ form.productName || 'éæ©äº§å' }}-{{ form.productModelName }} |
| | | </el-button> |
| | | <el-form-item label="产åç±»å" |
| | | prop="dictCode"> |
| | | <el-select v-model="form.dictCode" |
| | | placeholder="è¯·éæ©äº§åç±»å" |
| | | clearable> |
| | | <el-option v-for="option in productTypeOptions" |
| | | :key="option.dictCode" |
| | | :label="option.dictLabel" |
| | | :value="option.dictCode" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="çæ¬å·" |
| | | prop="version"> |
| | |
| | | @click="handleSubmit">ç¡®å®</el-button> |
| | | </template> |
| | | </el-dialog> |
| | | <!-- 产åéæ©å¼¹çª --> |
| | | <ProductSelectDialog v-model="showProductSelectDialog" |
| | | @confirm="handleProductSelect" |
| | | single /> |
| | | <!-- BOM导å
¥å¯¹è¯æ¡ --> |
| | | <ImportDialog ref="uploadRef" |
| | | v-model="upload.open" |
| | |
| | | :on-progress="handleFileUploadProgress" |
| | | :on-success="handleFileSuccess" |
| | | :show-download-template="true" |
| | | :show-product-type-select="true" |
| | | @confirm="submitFileForm" |
| | | @download-template="handleDownloadTemplate" |
| | | @close="handleImportClose" /> |
| | |
| | | import { useRouter } from "vue-router"; |
| | | import { ElMessageBox } from "element-plus"; |
| | | import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue"; |
| | | import ImportDialog from "@/components/Dialog/ImportDialog.vue"; |
| | | import ImportDialog from "./ImportDialog.vue"; |
| | | import { getDicts } from "@/api/system/dict/data"; |
| | | |
| | | const router = useRouter(); |
| | | const { proxy } = getCurrentInstance(); |
| | |
| | | minWidth: 140, |
| | | }, |
| | | { |
| | | label: "产åç¼ç ", |
| | | prop: "productCode", |
| | | label: "产åç±»å", |
| | | prop: "dictLabel", |
| | | dataType: "tag", |
| | | formatType: params => { |
| | | if (params == "3.5ç å") { |
| | | return "warning"; |
| | | } else if (params == "5.0ç å") { |
| | | return "primary"; |
| | | } else if (params == "æ¿æ") { |
| | | return "success"; |
| | | } else { |
| | | return "info"; |
| | | } |
| | | }, |
| | | }, |
| | | // { |
| | | // label: "产åç¼ç ", |
| | | // prop: "productCode", |
| | | |
| | | minWidth: 160, |
| | | }, |
| | | { |
| | | label: "产ååç§°", |
| | | prop: "productName", |
| | | // minWidth: 160, |
| | | // }, |
| | | // { |
| | | // label: "产ååç§°", |
| | | // prop: "productName", |
| | | |
| | | minWidth: 160, |
| | | }, |
| | | { |
| | | label: "è§æ ¼åå·", |
| | | prop: "productModelName", |
| | | minWidth: 140, |
| | | }, |
| | | // minWidth: 160, |
| | | // }, |
| | | // { |
| | | // label: "è§æ ¼åå·", |
| | | // prop: "productModelName", |
| | | // minWidth: 140, |
| | | // }, |
| | | { |
| | | label: "çæ¬å·", |
| | | prop: "version", |
| | | width: 100, |
| | | }, |
| | | { |
| | | label: "夿³¨", |
| | |
| | | const data = reactive({ |
| | | form: { |
| | | id: undefined, |
| | | productName: "", |
| | | productModelName: "", |
| | | productModelId: "", |
| | | dictCode: "", |
| | | remark: "", |
| | | version: "", |
| | | }, |
| | | rules: { |
| | | productModelId: [ |
| | | { required: true, message: "è¯·éæ©äº§å", trigger: "change" }, |
| | | dictCode: [ |
| | | { required: true, message: "è¯·éæ©äº§åç±»å", trigger: "change" }, |
| | | ], |
| | | version: [{ required: true, message: "请è¾å
¥çæ¬å·", trigger: "blur" }], |
| | | }, |
| | | searchForm: { |
| | | dictCode: "", |
| | | }, |
| | | productTypeOptions: [], |
| | | }); |
| | | |
| | | const { form, rules } = toRefs(data); |
| | | const { form, rules, searchForm, productTypeOptions } = toRefs(data); |
| | | |
| | | // è¡¨æ ¼éæ©æ°æ® |
| | | const handleSelectionChange = selection => { |
| | |
| | | getList(); |
| | | }; |
| | | |
| | | // è·å产åç±»ååå
¸ |
| | | const getProductTypeOptions = () => { |
| | | getDicts("product_type") |
| | | .then(res => { |
| | | if (res.code === 200) { |
| | | productTypeOptions.value = res.data; |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | console.error("è·å产åç±»ååå
¸å¤±è´¥ï¼", err); |
| | | }); |
| | | }; |
| | | |
| | | // æç´¢ |
| | | const handleSearch = () => { |
| | | getList(); |
| | | }; |
| | | |
| | | // éç½® |
| | | const handleReset = () => { |
| | | searchForm.value.dictCode = ""; |
| | | getList(); |
| | | }; |
| | | |
| | | // æ¥è¯¢å表 |
| | | const getList = () => { |
| | | tableLoading.value = true; |
| | | listPage({ |
| | | current: page.current, |
| | | size: page.size, |
| | | dictCode: searchForm.value.dictCode, |
| | | }) |
| | | .then(res => { |
| | | const records = res?.data?.records || []; |
| | |
| | | operationType.value = "add"; |
| | | Object.assign(form.value, { |
| | | id: undefined, |
| | | productName: "", |
| | | productModelName: "", |
| | | productModelId: "", |
| | | dictCode: "", |
| | | remark: "", |
| | | version: "", |
| | | }); |
| | |
| | | operationType.value = "edit"; |
| | | Object.assign(form.value, { |
| | | id: row.id, |
| | | productName: row.productName || "", |
| | | productModelName: row.productModelName || "", |
| | | productModelId: row.productModelId || "", |
| | | dictCode: row.dictCode || "", |
| | | remark: row.remark || "", |
| | | version: row.version || "", |
| | | }); |
| | |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | getProductTypeOptions(); |
| | | getList(); |
| | | }); |
| | | </script> |
| | | <style scoped lang="scss"> |
| | | .search-form { |
| | | :deep(.search-form) { |
| | | margin-bottom: 0px !important; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | style="width: 240px;" |
| | | @change="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ä¸åç¶æ:"> |
| | | <el-select v-model="searchForm.status" |
| | | placeholder="è¯·éæ©ç¶æ" |
| | | clearable |
| | | filterable |
| | | style="width: 100px"> |
| | | <el-option label="å¾
ä¸å" |
| | | value="0" /> |
| | | <el-option label="é¨åä¸å" |
| | | value="1" /> |
| | | <el-option label="å·²ä¸å" |
| | | value="2" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" |
| | | @click="handleQuery">æç´¢</el-button> |
| | |
| | | height: 0, |
| | | startDate: "", |
| | | endDate: "", |
| | | status: "", |
| | | strength: "", |
| | | remarkOne: "", |
| | | remarkTwo: "", |