From 4cc27f93a1901e12eb12a198029911c483dd991f Mon Sep 17 00:00:00 2001 From: maven <2163098428@qq.com> Date: 星期三, 27 八月 2025 14:30:57 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/dev_JLMY' into dev_JLMY --- src/views/procureMent/index.vue | 60 ++++ src/api/payable/index.js | 18 + src/store/modules/dict.js | 34 ++ src/api/system/dict/data.js | 8 src/views/payable/index.vue | 399 ++++++++++++++++++++++++++++ src/views/procureMent/components/ProductionDialog.vue | 29 ++ src/App.vue | 2 src/views/payable/components/PayableDialog.vue | 279 +++++++++++++++++++ 8 files changed, 822 insertions(+), 7 deletions(-) diff --git a/src/App.vue b/src/App.vue index 31839f2..85503ea 100644 --- a/src/App.vue +++ b/src/App.vue @@ -4,9 +4,11 @@ <script setup> import useSettingsStore from '@/store/modules/settings' +import dictStore from '@/store/modules/dict' import { handleThemeStyle } from '@/utils/theme' onMounted(() => { + dictStore().initDict() nextTick(() => { // 鍒濆鍖栦富棰樻牱寮� handleThemeStyle(useSettingsStore().theme) diff --git a/src/api/payable/index.js b/src/api/payable/index.js new file mode 100644 index 0000000..1ab9d15 --- /dev/null +++ b/src/api/payable/index.js @@ -0,0 +1,18 @@ +import request from '@/utils/request' + +// 娣诲姞 +export function addDuePayable(query) { + return request({ + url: '/duePayable/addDuePayable', + method: 'post', + data: query + }) +} +// 鍒嗛〉鏌ヨ +export function findPayablePage(query) { + return request({ + url: '/duePayable/list', + method: 'get', + params: query + }) +} diff --git a/src/api/system/dict/data.js b/src/api/system/dict/data.js index 6c9eb79..8d2aefa 100644 --- a/src/api/system/dict/data.js +++ b/src/api/system/dict/data.js @@ -1,5 +1,13 @@ import request from '@/utils/request' +export function ListAllData(){ + return request({ + url: '/system/dict/data/dictDataList', + method: 'get' + }) +} + + // 鏌ヨ瀛楀吀鏁版嵁鍒楄〃 export function listData(query) { return request({ diff --git a/src/store/modules/dict.js b/src/store/modules/dict.js index e58e4ec..7521a74 100644 --- a/src/store/modules/dict.js +++ b/src/store/modules/dict.js @@ -1,15 +1,43 @@ +import {ListAllData} from "@/api/system/dict/data" + const useDictStore = defineStore( 'dict', { state: () => ({ - dict: new Array() + dict: [] }), actions: { + async initDict() { + const response = await ListAllData() + this.dict = response.data + }, + + // 鏍规嵁瀛楀吀绫诲瀷鑾峰彇瀛楀吀 + getDictTypeList(_type) { + if (_type == null || _type === "") { + return null; + } + return this.dict.filter(item => item.type === _type); + }, + + getDictDataByTypeAndValue(_type,_value){ + if (_type == null || _value == null) { + return { + type:"", + value:"", + label:"" + }; + } + return this.dict.find(item => item.type == _type && item.value == _value ) || null; + + }, + // 鑾峰彇瀛楀吀 getDict(_key) { if (_key == null && _key == "") { return null } + // console.log(this.dict) try { for (let i = 0; i < this.dict.length; i++) { if (this.dict[i].key == _key) { @@ -48,9 +76,7 @@ cleanDict() { this.dict = new Array() }, - // 鍒濆瀛楀吀 - initDict() { - } + } }) diff --git a/src/views/payable/components/PayableDialog.vue b/src/views/payable/components/PayableDialog.vue new file mode 100644 index 0000000..f78af79 --- /dev/null +++ b/src/views/payable/components/PayableDialog.vue @@ -0,0 +1,279 @@ +<template> + <div> + <el-dialog + v-model="dialogPayableFormVisible" + :title="title" + width="600" + :close-on-click-modal="false" + @close="handleClose" + > + <el-form + ref="formRef" + :model="form" + :rules="rules" + label-width="auto" + class="production-form" + label-position="right" + style="max-width: 400px; margin: 0 auto" + > + <el-form-item label="鍙戠エ鍙�" prop="ticketNo"> + <el-input + v-model.number="form.ticketNo" + placeholder="璇疯緭鍏ュ彂绁ㄥ彿" + :disabled="isViewMode" + > + </el-input> + </el-form-item> + <el-form-item label="浠樻閲戦" prop="paymentAmount"> + <el-input + v-model.number="form.paymentAmount" + placeholder="璇疯緭鍏ヤ粯娆鹃噾棰�" + :disabled="isViewMode" + > + <template v-slot:suffix> + <i style="font-style: normal">鍏�</i> + </template> + </el-input> + </el-form-item> + <el-form-item label="浠樻绫诲瀷" prop="payableType"> + <el-select + v-model="form.payableType" + placeholder="璇烽�夋嫨绫诲瀷" + :disabled="isViewMode" + > + <el-option + v-for="item in payableTypeList" + :key="item.value" + :label="item.label" + :value="Number(item.value)" + /> + </el-select> + </el-form-item> + <el-form-item label="涓婁紶闄勪欢" prop="attachUpload"> + <el-upload + class="upload-demo" + drag + :fileList="form.fileList" + :action="uploadFileUrl" + :headers="headers" + :http-request="UploadImage" + :on-success="handleUploadSuccess" + :on-remove="handleUploadRemove" + :on-preview="handleUploadPreview" + multiple> + <i class="el-icon-upload"></i> + <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div> + </el-upload> + </el-form-item> + <el-form-item label="鐧昏浜�" prop="registrantId"> + <el-input + :value="match(form.registrantId)" + v-model.number="form.registrantId" + disabled + placeholder="璇疯緭鍏�" + /> + </el-form-item> + <el-form-item label="鐧昏鏃ユ湡" prop="registrationDate"> + <el-date-picker + disabled + v-model="form.registrationDate" + type="date" + placeholder="YYYY-MM-DD" + style="width: 100%" + value-format="YYYY-MM-DD" + /> + </el-form-item> + + </el-form> + <template #footer> + <div class="dialog-footer"> + <!-- 閲嶇疆鍜屽彇娑� --> + <el-button + @click="handleClose" + v-if="title.includes('鏂板') || title.includes('鏌ョ湅')" + >鍙栨秷 + </el-button> + <el-button @click="handleReset" v-if="title.includes('缂栬緫')" + >閲嶇疆 + </el-button> + <el-button type="primary" v-if="!isViewMode" @click="handleSubmit" + >纭</el-button + > + </div> + </template> + </el-dialog> + </div> +</template> + +<script setup name="ProductionDialog"> +import {ref, defineProps, watch, onMounted, nextTick, computed,reactive,defineEmits} from "vue"; +import axios from "axios"; +import {addDuePayable} from "@/api/payable/index.js" +import {ElMessage} from "element-plus"; + +import useUserStore from "@/store/modules/user.js"; +import useDictStore from "@/store/modules/dict.js" +import {getToken} from "@/utils/auth.js"; +const uploadFileUrl = computed(() => import.meta.env.VITE_APP_BASE_API + "/common/minioUploads"); +const headers = computed(() => ({ Authorization: "Bearer " + getToken() })); + + + +const props = defineProps({ + title: { + type: String, + default: "", + }, + statusType: { type: Number, default: 0 }, + dialogPayableFormVisible: { + type: Boolean, + required: true + }, +}); + +const handleUploadRemove = (it)=>{ + form.value.fileList = form.value.fileList.filter(f => f.uid !== it.uid); + +} +const handleUploadPreview = (it)=>{ + const link = document.createElement("a"); + if(it.url){ + link.href = it.url + }else { + link.href = form.value.fileList.value.find(fl=>fl.uid === it.uid).url; + } + link.download = it.name; + link.click(); +} + +const handleUploadSuccess = (res,file)=>{ + form.value.fileList.push(...res.data.map((it,index)=>{ + return { + id:it.id, + url:it.downloadUrl, + name:it.originalFilename, + status:"success", + uid:file.uid + } + })) +} + +// 鏂囦欢涓婁紶澶勭悊 +const UploadImage = (param) => { + const formData = new FormData(); + formData.append("files", param.file); + formData.append("type", props.statusType); + axios.post(uploadFileUrl.value, formData, { + headers: { + "Content-Type": "multipart/form-data", + ...headers.value, + }, + onUploadProgress: (progressEvent) => { + const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total); + param.onProgress({ percent }); + }, + }) + .then((response) => { + if (response.data.code === 200) { + handleUploadSuccess(response.data, param.file); + ElMessage.success("涓婁紶鎴愬姛"); + } else { + param.onError(new Error(response.data.msg)); + ElMessage.error(response.data.msg); + } + }) + .catch((error) => { + param.onError(error); + }); +}; +const emit = defineEmits(["update:dialogPayableFormVisible", "success"]); +const dialogPayableFormVisible = defineModel("dialogPayableFormVisible", { + required: true, + type: Boolean, +}); +const form = defineModel("form", { + required: true, + type: Object, +}); + + +const payableTypeList = ref([]) +const isViewMode = computed(() => props.title.includes("鏌ョ湅")); + +const userStore = useUserStore(); +const userInfo = ref({}); +const match = () => { + return userInfo.value.nickName || "鏈煡鐢ㄦ埛"; +}; + + + + +//### + +onMounted(async () => { + + payableTypeList.value = useDictStore().getDictTypeList("payable_type").map((item) => ({ + value: item.value, + label: item.label, + })) + + let res = await userStore.getInfo(); + userInfo.value = res.user; + +}); +const rules = { + + payableType: [ + {required: true, message: "璇烽�夋嫨绫诲瀷", trigger: "change"} + ], + paymentAmount: [ + {required: true, message: "璇疯緭鍏ラ噾棰�", trigger: "blur"} + ], + ticketNo: [ + {required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿", trigger: "blur"} + ] + +}; +// 鍏抽棴寮圭獥 +const handleClose = () => { + dialogPayableFormVisible.value = false; + form.value.fileList.value = [] +}; + +const handleReset = async ()=>{ + +} + +const formRef = ref(null); +// 鎻愪氦琛ㄥ崟 +const handleSubmit = async () => { + // 鏂囦欢澶勭悊鍙幏鍙杋d 杩涜鎷兼帴 + if (!formRef.value) return; + formRef.value.validate((valid) => { + if (valid) { + const obj = ref({}); + form.value.attachUpload = "" + if (form.value.fileList.length > 0){ + form.value.attachUpload = form.value.fileList.map(it => it.id).join(",") + } + + let result = addDuePayable({ + ...form.value + }) + + obj.value = { + ...form.value, + result + } + emit("success", obj.value); + } + }) +}; + +</script> + +<style lang="scss" scoped> + + +</style> diff --git a/src/views/payable/index.vue b/src/views/payable/index.vue new file mode 100644 index 0000000..4bd682c --- /dev/null +++ b/src/views/payable/index.vue @@ -0,0 +1,399 @@ +<template> + <div class="app-container"> + <el-form :inline="true" :model="queryParams" class="search-form"> + <el-form-item v-if="shouldShowSearch" label="鎼滅储"> + <el-input + v-model="queryParams.searchAll" + :placeholder="searchPlaceholder" + clearable + /> + </el-form-item> + <el-form-item> + <el-button type="primary" @click="handleQuery">鏌ヨ</el-button> + <!-- <el-button @click="resetQuery">閲嶇疆</el-button>--> + </el-form-item> + </el-form> + <el-card> + + + <!-- 鎿嶄綔鎸夐挳鍖� --> + <!-- <el-row :gutter="24" class="table-toolbar">--> + <!-- <el-button--> + <!-- :icon="Plus"--> + <!-- type="primary"--> + <!-- v-show="activeTab === 'payable'"--> + <!-- @click="handleAdd"--> + <!-- >鏂板搴斾粯娆鹃」</el-button>--> + + <!-- </el-row>--> + <!-- 琛ㄦ牸缁勪欢 --> + <div class="table-container"> + <!-- 鍔犺浇鐘舵�� --> + <el-skeleton v-if="loading" animated> + <template #template> + <el-skeleton-item variant="h1" style="width: 40%"/> + <div style="padding: 14px;"> + <el-skeleton-item variant="text"/> + <el-skeleton-item variant="text"/> + <el-skeleton-item variant="text"/> + </div> + </template> + </el-skeleton> + + <!-- 鏁版嵁琛ㄦ牸 --> + <data-table + v-else + :showOverflowTooltip="false" + :border="true" + @edit="handleEdit" + :columns="columns" + :loading="loading" + style="width: 100%; height: calc(100vh - 29em)" + :show-selection="activeTab === 'payable'" + :table-data="tableData" + > + <!-- 绌虹姸鎬佹彃妲� --> + <template #empty> + <el-empty + :description="`鏆傛棤${currentTabConfig?.label || ''}鏁版嵁`" + :image-size="120" + > + <template #description> + <p>鏆傛棤{{ currentTabConfig?.label || '' }}鏁版嵁</p> + </template> + </el-empty> + </template> + </data-table> + </div> + + + <pagination + v-if="total > 0" + :layout="'total, prev, pager, next, jumper'" + :limit="state.pageSize" + :current-page="state.current" + :total="total" + @pagination="handlePageChange" + /> + + <!-- 鏌ョ湅璇︽儏寮圭獥 --> + <DilogTable + v-model="dialogTableVisible" + :title="dialogTableTitle" + :table-data="dialogTableData" + :columns="dialogTableColumns" + @submit="handleSubmit" + @success="payableHandleSuccess" + width="70%" + height="500px" + /> + </el-card> + <PayableDialog + v-model:dialogPayableFormVisible="dialogPayableFormVisible" + v-model:form="copyForm" + :title="title" + @submit="handleSubmit" + @success="payableHandleSuccess" + ref="productionDialogs"> + </PayableDialog>> + </div> +</template> + +<script setup> +import {computed, onMounted, reactive, ref, nextTick, toRefs} from "vue"; +import {ElMessage} from "element-plus"; +import {Delete, Plus} from "@element-plus/icons-vue"; + +// 缁勪欢瀵煎叆 +import DataTable from "@/components/Table/ETable.vue"; +import Pagination from "@/components/PIMTable/Pagination.vue"; +import DilogTable from "@/components/dialog/DilogTable.vue"; + +// API 鏈嶅姟瀵煎叆 +import {findPayablePage} from "@/api/payable/index" + +const userStore = useUserStore(); +const dictStore = useDictStore() +import useUserStore from "@/store/modules/user"; +import useDictStore from "@/store/modules/dict" +import PayableDialog from "@/views/payable/components/PayableDialog.vue"; + +let userList = ref([]); +userStore.getUserList().then((res) => { + userList.value = res; +}); + + +// 鍝嶅簲寮忕姸鎬佺鐞� - 浣跨敤瑙f瀯鍜岄粯璁ゅ�� +const productionDialogs = ref(null); // 娣诲姞ref澹版槑 +const initFormState = () => ({consumables: false}); +const dialogPayableFormVisible = ref(false); +const addOrEdit = ref("edit"); +const state = reactive({ + form: initFormState(), + title: "", + copyForm: {}, + loading: false, + activeTab: "payable", + selectedRows: [], + tableData: [], + // 鍒嗛〉鐘舵�� + pageNum: 1, + pageSize: 10, + current: 1, + total: 0, + // 鏌ヨ鍙傛暟 + queryParams: { + searchAll: "", + }, +}); +const userInfo = ref({}); + +onMounted(() => { + let res = userStore.getInfo(); + userInfo.value = res.user; + getList() +}) +const handleEdit = (row) => { + form.value = JSON.parse(JSON.stringify(row)); + addOrEdit.value = "edit"; + handleAddEdit() +} +const handleAddEdit = () => { + addOrEdit.value == "add" ? (title.value = "鏂板") : addOrEdit.value == "viewRow" ? (title.value = "鏌ョ湅") : (title.value = "缂栬緫"); + title.value = title.value + "搴斾粯绠$悊"; + openDialog(); +}; + +const openDialog = () => { + if (addOrEdit.value === "edit" || addOrEdit.value === "viewRow") { + // 纭繚澶嶅埗涓�浠芥暟鎹紝閬垮厤鐩存帴寮曠敤 + copyForm.value = JSON.parse(JSON.stringify(form.value)); + // console.log(copyForm.value) + copyForm.value.fileList = copyForm.value.attachFileList.map((item) => { + return { + id: item.id, + url: item.downloadUrl, + uid: item.id, + status: "success", + name: item.originalFilename + } + }) + dialogPayableFormVisible.value = true; + // 瑙﹀彂ref閲岄潰鐨勬柟娉� + return; + } +}; + + +const handleQuery = () => { + state.loading = true; + state.current = 1; + getList() +} + +const handlePageChange = (it) => { + state.current = it.page + getList(); +} + + + + +const getList = async () => { + loading.value = true; + try { + let resp = await findPayablePage( + { + current: state.current, + pageSize: state.current + , ...state.queryParams + }) + tableData.value = resp.data.records + total.value = resp.data.total || 0; + } finally { + loading.value = false; + } +} + +// 浣跨敤瑙f瀯绠�鍖栬闂� +const { + form, + title, + copyForm, + loading, + activeTab, + selectedRows, + current, + tableData, + pageNum, + pageSize, + total, + queryParams, +} = toRefs(state); + +// 娣诲姞缂哄け鐨勫搷搴斿紡鍙橀噺 +const dialogTableVisible = ref(false); +const dialogTableTitle = ref(''); +const dialogTableData = ref([]); +const dialogTableColumns = ref([]); + + +const payableHandleSuccess = (val) => { + ElMessage.success("鎿嶄綔鎴愬姛"); + dialogPayableFormVisible.value = false; + getList() +} +const handleSubmit = (val) => { + if (val.result.code !== 200) { + ElMessage.error("鎿嶄綔澶辫触锛�" + val.result.msg); + return; + } + ElMessage.success(val.title + val.result.msg); + dialogPayableFormVisible.value = false; + getList(); +}; + +// 鏍囩椤甸厤缃� - 渚夸簬鍚庣画鎵╁睍 +const tabsConfig = { + payable: { + searchPlaceholder: "", + showSearch: true, + // deleteApi: , + columns: [ + /* 鏆傛椂涓嶇煡閬撴槸鍚﹂渶瑕� {prop: "equipmentNo", label: "渚涘簲鍟嗗悕绉�", minWidth: 100},*/ + {prop: "ticketNo", label: "鍙戠エ鍙�", minWidth: 100}, + {prop: "paymentAmount", label: "浠樻閲戦(鍏�)", minWidth: 100}, + // {prop: "specification", label: "闄勪欢", minWidth: 100}, + { + prop: "payableType", label: "浠樻绫诲瀷", minWidth: 100, + formatter: (row) => { + if (row.payableType == null) { + return "" + } + const dictItem = dictStore.getDictDataByTypeAndValue("payable_type", row.payableType); + return dictItem ? dictItem.label : ""; + } + }, + { + prop: "registrantId", label: "褰曞叆浜�", minWidth: 100, + formatter: (row) => { + // 鍖归厤鐢ㄦ埛淇℃伅 + const user = userList.value.find((user) => user.userId === row.registrantId); + return user ? user.nickName : "鏈煡鐢ㄦ埛"; + }, + }, + {prop: "registrationDate", label: "褰曞叆鏃ユ湡", minWidth: 100}, + ], + } +}; + + +// 褰撳墠鏍囩椤甸厤缃� +const currentTabConfig = computed(() => tabsConfig[activeTab.value]); + +// 璁$畻灞炴�� +const searchPlaceholder = computed( + () => currentTabConfig.value?.searchPlaceholder || "璇疯緭鍏ユ悳绱俊鎭�" +); +const shouldShowSearch = computed( + () => currentTabConfig.value?.showSearch || false +); +const columns = computed(() => currentTabConfig.value?.columns || []); +const selectedCount = computed(() => selectedRows.value.length); + + +// 鍔ㄦ�佽幏鍙栨搷浣滃垪瀹藉害 +const getOperationsWidth = () => { + if (activeTab.value === 'equipmentRequisition') { + return 250; // 涓哄綊杩樻寜閽鐣欐洿澶氱┖闂� + } + return 200; // 榛樿瀹藉害 +}; + + +</script> + +<style scoped> +/* 鍝嶅簲寮忓竷灞� */ +@media screen and (min-width: 768px) { + .search-form :deep(.el-form-item) { + width: 50%; + } +} + +@media screen and (min-width: 1200px) { + .search-form :deep(.el-form-item) { + width: 16%; + } +} + +.table-toolbar { + margin-bottom: 20px; + display: flex; + flex-wrap: wrap; + gap: 10px; +} + +.app-container { + padding: 18px !important; +} + +/* 鍝嶅簲寮忚〃鏍� */ +@media screen and (max-width: 768px) { + .table-toolbar { + flex-direction: column; + } + + .table-toolbar .el-button { + width: 100%; + } +} + +/* 琛ㄦ牸宸ュ叿鏍� */ +.table-toolbar, +.table-toolbar > * { + margin: 0 0 0 0 !important; +} + +.table-toolbar { + margin-bottom: 20px !important; +} + +.el-form--inline .el-form-item { + margin-right: 25px; +} + +.main-container { + background: red !important; +} + +/* 璁惧鐘舵�佹牱寮� */ +.status-using { + color: #409eff; + font-weight: 500; +} + +.status-partial-return { + color: #e6a23c; + font-weight: 500; +} + +.status-returned { + color: #67c23a; + font-weight: 500; +} + +.status-unknown { + color: #909399; + font-weight: 500; +} + +/* 鐘舵�佹爣绛炬牱寮� */ +:deep(.el-table .cell .status-tag) { + font-size: 12px; + padding: 2px 6px; + border-radius: 4px; + white-space: nowrap; +} +</style> diff --git a/src/views/procureMent/components/ProductionDialog.vue b/src/views/procureMent/components/ProductionDialog.vue index 79b2bac..dc44a2f 100644 --- a/src/views/procureMent/components/ProductionDialog.vue +++ b/src/views/procureMent/components/ProductionDialog.vue @@ -159,6 +159,20 @@ value-format="YYYY-MM-DD" /> </el-form-item> + <el-form-item label="绫诲瀷" prop="purchaseType"> + <el-select + v-model="form.purchaseType" + placeholder="璇烽�夋嫨绫诲瀷" + :disabled="isViewMode" + > + <el-option + v-for="item in purchaseTypeList" + :key="item.value" + :label="item.label" + :value="Number(item.value)" + /> + </el-select> + </el-form-item> </el-form> <template #footer> <div class="dialog-footer"> @@ -185,6 +199,7 @@ import { ElMessage } from "element-plus"; import useUserStore from "@/store/modules/user"; import { addOrEditPR, getSupplyList, getCoalInfoList } from "@/api/procureMent"; +import useDictStore from "@/store/modules/dict" const props = defineProps({ title: { @@ -217,8 +232,9 @@ }); const supplyList = ref([]); const coalList = ref([]); +const purchaseTypeList = ref([]) const isViewMode = computed(() => props.title.includes("鏌ョ湅")); -// 鑾峰彇渚涘簲鍟嗕笅鎷夊拰鐓ょ涓嬫媺 +// 鑾峰彇渚涘簲鍟嗕笅鎷夊拰鐓ょ涓嬫媺 浠ュ強绫诲瀷 const getDropdownData = async () => { try { const [supplyRes, coalRes] = await Promise.all([ @@ -235,6 +251,7 @@ value: item.id, label: item.coal, })); + } catch (error) { ElMessage.error("鑾峰彇涓嬫媺鏁版嵁澶辫触锛岃绋嶅悗閲嶈瘯"); } @@ -357,12 +374,19 @@ }; onMounted(async () => { + + purchaseTypeList.value = useDictStore().getDictTypeList("purchase_type").map((item) => ({ + value: item.value, + label: item.label, + })) + let res = await userStore.getInfo(); userInfo.value = res.user; await getDropdownData(); // 缁勪欢鍔犺浇瀹屾垚鍚庤Е鍙戜竴娆¤绠� calculatePrices(); }); + const rules = { supplierName: [ { required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" }, @@ -383,6 +407,9 @@ { required: true, message: "璇疯緭鍏ョ◣鐜�", trigger: "blur" }, { type: "number", message: "绋庣巼蹇呴』涓烘暟瀛�", trigger: "blur" }, ], + purchaseType: [ + { required: true, message: "璇烽�夋嫨绫诲瀷", trigger: "change" } + ] }; // 鍏抽棴寮圭獥 const handleClose = () => { diff --git a/src/views/procureMent/index.vue b/src/views/procureMent/index.vue index e067737..55fd34f 100644 --- a/src/views/procureMent/index.vue +++ b/src/views/procureMent/index.vue @@ -16,9 +16,12 @@ </el-form> <el-card> <!-- 鎿嶄綔鎸夐挳鍖� --> - <el-row :gutter="24" class="table-toolbar"> + <el-row :gutter="24" class="table-toolbar" justify="space-between"> <el-button type="primary" :icon="Plus" @click="handleAdd" >鏂板缓 + </el-button> + <el-button type="primary" :icon="Plus" @click="handleAddPayable"> + 娣诲姞搴斾粯娆� </el-button> <!-- <el-button type="danger" :icon="Delete" @click="handleDelete" >鍒犻櫎 @@ -59,6 +62,14 @@ @success="handleSuccess" ref="productionDialogs" /> + <PayableDialog + v-model:dialogPayableFormVisible="dialogPayableFormVisible" + v-model:form="formPayable" + :title="title" + @submit="handleSubmit" + @success="payableHandleSuccess" + ref="productionDialogs"> + </PayableDialog>> </div> </template> @@ -69,6 +80,8 @@ import DataTable from "@/components/Table/ETable.vue"; import Pagination from "@/components/Pagination"; import ProductionDialog from "./components/ProductionDialog.vue"; +import PayableDialog from "../payable/components/PayableDialog.vue"; + import { purchaseRegistration, getSupplyList, @@ -77,14 +90,20 @@ } from "@/api/procureMent"; import { useDelete } from "@/hooks/useDelete"; const userStore = useUserStore(); +const dictStore = useDictStore() import useUserStore from "@/store/modules/user"; +import useDictStore from "@/store/modules/dict" + let userList = ref([]); userStore.getUserList().then((res) => { userList.value = res; }); + // 寮曞叆瀛楀吀鏁版嵁 + const { proxy } = getCurrentInstance(); const dialogFormVisible = ref(false); +const dialogPayableFormVisible = ref(false); const form = ref({ taxRate: 13, freight: 20, @@ -97,6 +116,7 @@ const pageSize = ref(10); const selectedRows = ref([]); const copyForm = ref({}); +const formPayable = ref({}); // 鏌ヨ鍙傛暟 const queryParams = reactive({ searchAll: "", @@ -173,6 +193,14 @@ return user ? user.nickName : "鏈煡鐢ㄦ埛"; }, }, + { prop: "purchaseType", label: "绫诲瀷", minWidth: 100 , + formatter: (row) => { + if (row.purchaseType == null) { + return "" + } + const dictItem = dictStore.getDictDataByTypeAndValue("purchase_type", row.purchaseType); + return dictItem ? dictItem.label : ""; } + }, { prop: "registrationDate", label: "鐧昏鏃ユ湡", minWidth: 100 }, ]); @@ -203,6 +231,28 @@ addOrEdit.value = "add"; handleAddEdit(); }; +const handleAddPayable = () => { + // 鍙湁閫夋嫨涓�琛岀殑鏃跺�欒繘琛屾搷浣� + + if (selectedRows.value.length !== 1) { + ElMessage.error("璇烽�変腑涓�琛岃繘琛屽~鍐�") + return + } + + formPayable.value = { + purchaseRegistrationId: selectedRows.value[0].id, + registrantId: userInfo.value.userId, + ticketNo:"", + paymentAmount:"", + payableType:"", + attachUpload:"", + registrationDate: new Date().toISOString().split("T")[0], + fileList:[] + } + dialogPayableFormVisible.value = true + +}; + // 鏂板缂栬緫 const productionDialogs = ref(null); // 娣诲姞ref澹版槑 @@ -220,7 +270,6 @@ // 瑙﹀彂ref閲岄潰鐨勬柟娉� return; } - console.log(userInfo.value) // 鏂板缓鏃跺垵濮嬪寲琛ㄥ崟 form.value = { supplierName: "", @@ -235,6 +284,7 @@ freight:20, registrantId: userInfo.value.userId, registrationDate: new Date().toISOString().split("T")[0], + purchaseType: "" }; // 鏂板缓鏃朵篃闇�瑕佽缃� copyForm 鐢ㄤ簬閲嶇疆鍔熻兘 copyForm.value = JSON.parse(JSON.stringify(form.value)); @@ -286,6 +336,12 @@ total.value = tableData.value.length; ElMessage.success("鎿嶄綔鎴愬姛"); }; + +const payableHandleSuccess = (val) => { + ElMessage.success("鎿嶄綔鎴愬姛"); + dialogPayableFormVisible.value = false; +} + const getList = async () => { loading.value = true; try { -- Gitblit v1.9.3