From 1c0f01cc462d37e146c34127d2883ca51e26d508 Mon Sep 17 00:00:00 2001 From: 曹睿 <360930172@qq.com> Date: 星期二, 24 六月 2025 17:12:32 +0800 Subject: [PATCH] fix: 修复PIMTable不支持懒加载问题。修复【来票登记】金额格式化显示NaN问题。 style: 重构来票登记页面。 feat: 完善文件上传组件功能。【来票台账】底部添加合计。【来票登记】添加上传附件 --- src/views/procurementManagement/paymentHistory/index.vue | 3 src/views/procurementManagement/procurementInvoiceLedger/index.vue | 28 src/views/basicData/supplierManage/index.vue | 3 src/hooks/useModal.js | 3 src/views/basicData/product/index.vue | 3 src/views/procurementManagement/invoiceEntry/index.vue | 820 ++----------- src/hooks/usePaginationApi.jsx | 5 src/views/procurementManagement/paymentEntry/index.vue | 3 src/views/procurementManagement/thePaymentLedger/index.vue | 109 src/components/Editor/index.vue | 152 +- src/views/basicData/customerFile/index.vue | 630 ++++++---- src/views/procurementManagement/invoiceEntry/indexOld.vue | 725 ++++++++++++ src/components/Upload/FileUpload.vue | 29 src/views/equipmentManagement/ledger/index.vue | 1 src/views/procurementManagement/invoiceEntry/components/Modal.vue | 407 ++++++ src/api/procurementManagement/invoiceEntry.js | 82 src/views/personnelManagement/onboarding/index.vue | 189 +- src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue | 111 + src/views/reportAnalysis/projectProfit/index.vue | 1 src/api/procurementManagement/procurementInvoiceLedger.js | 14 src/components/PIMTable/PIMTable.vue | 28 src/views/procurementManagement/paymentLedger/index.vue | 1 src/views/procurementManagement/procurementLedger/index.vue | 4 src/views/reportAnalysis/taxComparison/index.vue | 1 src/components/FileUpload/index.vue | 212 ++- src/views/salesManagement/receiptPaymentHistory/index.vue | 5 26 files changed, 2,256 insertions(+), 1,313 deletions(-) diff --git a/src/api/procurementManagement/invoiceEntry.js b/src/api/procurementManagement/invoiceEntry.js index 055a7b3..8325aa7 100644 --- a/src/api/procurementManagement/invoiceEntry.js +++ b/src/api/procurementManagement/invoiceEntry.js @@ -1,69 +1,69 @@ // 閲囪喘-鏉ョエ鐧昏鎺ュ彛 -import request from '@/utils/request' +import request from "@/utils/request"; // 鏌ヨ閲囪喘鍚堝悓鍙� export function getProduct(query) { - return request({ - url: '/purchase/ledger/getProduct', - method: 'get', - params: query - }) + return request({ + url: "/purchase/ledger/getProduct", + method: "get", + params: query, + }); } // 鏌ヨid閲囪喘鍚堝悓鍙� export function getPurchaseNoById(query) { - return request({ - url: '/purchase/ledger/getPurchaseNoById', - method: 'get', - params: query - }) + return request({ + url: "/purchase/ledger/getPurchaseNoById", + method: "get", + params: query, + }); } // 鏍规嵁閲囪喘鍚堝悓鍙锋煡璇㈣缁嗕俊鎭� export function getInfo(query) { - return request({ - url: '/purchase/ledger/getInfo', - method: 'get', - params: query - }) + return request({ + url: "/purchase/ledger/getInfo", + method: "get", + params: query, + }); } // 涓诲垪琛ㄦ煡璇� export function gePurchaseList(query) { - return request({ - url: '/purchase/ledger/list', - method: 'get', - params: query - }) + return request({ + url: "/purchase/ledger/list", + method: "get", + params: query, + }); } // 涓诲垪琛ㄦ煡璇� export function getRegistrationById(query) { - return request({ - url: '/purchase/registration/getRegistrationById', - method: 'get', - params: query - }) + return request({ + url: "/purchase/registration/getRegistrationById", + method: "get", + params: query, + }); } // 鏂板缂栬緫鏉ョエ鐧昏 export function addOrUpdateRegistration(query) { - return request({ - url: '/purchase/registration/addOrUpdateRegistration', - method: 'post', - data: query - }) + return request({ + url: "/purchase/registration/addOrUpdateRegistration", + method: "post", + data: query, + }); } // 鍒犻櫎鏉ョエ鐧昏 export function delRegistration(query) { - return request({ - url: '/purchase/registration/delRegistration', - method: 'delete', - data: query - }) + return request({ + url: "/purchase/registration/delRegistration", + method: "delete", + data: query, + }); } // 涓诲垪琛ㄦ煡璇� export function gePurchaseListPage(query) { - return request({ - url: '/purchase/ledger/listPage', - method: 'get', - params: query - }) + return request({ + url: "/purchase/ledger/listPage", + method: "get", + params: query, + }); } diff --git a/src/api/procurementManagement/procurementInvoiceLedger.js b/src/api/procurementManagement/procurementInvoiceLedger.js index fb73655..b828c4a 100644 --- a/src/api/procurementManagement/procurementInvoiceLedger.js +++ b/src/api/procurementManagement/procurementInvoiceLedger.js @@ -10,13 +10,13 @@ }); } // 鏌ヨ璇︽儏 -export function getInvoiceById(query) { - return request({ - url: "/purchase/registration/getRegistrationById", - method: "get", - params: query, - }); -} +// export function getInvoiceById(query) { +// return request({ +// url: "/purchase/registration/getRegistrationById", +// method: "get", +// params: query, +// }); +// } // 鏂板銆佺紪杈� export function addOrUpdateInvoice(query) { return request({ diff --git a/src/components/Editor/index.vue b/src/components/Editor/index.vue index efd0edc..c283e42 100644 --- a/src/components/Editor/index.vue +++ b/src/components/Editor/index.vue @@ -27,18 +27,18 @@ </template> <script setup> -import axios from 'axios' -import { QuillEditor } from "@vueup/vue-quill" -import "@vueup/vue-quill/dist/vue-quill.snow.css" -import { getToken } from "@/utils/auth" +import axios from "axios"; +import { QuillEditor } from "@vueup/vue-quill"; +import "@vueup/vue-quill/dist/vue-quill.snow.css"; +import { getToken } from "@/utils/auth"; -const { proxy } = getCurrentInstance() +const { proxy } = getCurrentInstance(); -const quillEditorRef = ref() -const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload") // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃 +const quillEditorRef = ref(); +const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃 const headers = ref({ - Authorization: "Bearer " + getToken() -}) + Authorization: "Bearer " + getToken(), +}); const props = defineProps({ /* 缂栬緫鍣ㄧ殑鍐呭 */ @@ -69,8 +69,8 @@ type: { type: String, default: "url", - } -}) + }, +}); const options = ref({ theme: "snow", @@ -79,74 +79,78 @@ modules: { // 宸ュ叿鏍忛厤缃� toolbar: [ - ["bold", "italic", "underline", "strike"], // 鍔犵矖 鏂滀綋 涓嬪垝绾� 鍒犻櫎绾� - ["blockquote", "code-block"], // 寮曠敤 浠g爜鍧� - [{ list: "ordered" }, { list: "bullet" }], // 鏈夊簭銆佹棤搴忓垪琛� - [{ indent: "-1" }, { indent: "+1" }], // 缂╄繘 - [{ size: ["small", false, "large", "huge"] }], // 瀛椾綋澶у皬 - [{ header: [1, 2, 3, 4, 5, 6, false] }], // 鏍囬 - [{ color: [] }, { background: [] }], // 瀛椾綋棰滆壊銆佸瓧浣撹儗鏅鑹� - [{ align: [] }], // 瀵归綈鏂瑰紡 - ["clean"], // 娓呴櫎鏂囨湰鏍煎紡 - ["link", "image", "video"] // 閾炬帴銆佸浘鐗囥�佽棰� + ["bold", "italic", "underline", "strike"], // 鍔犵矖 鏂滀綋 涓嬪垝绾� 鍒犻櫎绾� + ["blockquote", "code-block"], // 寮曠敤 浠g爜鍧� + [{ list: "ordered" }, { list: "bullet" }], // 鏈夊簭銆佹棤搴忓垪琛� + [{ indent: "-1" }, { indent: "+1" }], // 缂╄繘 + [{ size: ["small", false, "large", "huge"] }], // 瀛椾綋澶у皬 + [{ header: [1, 2, 3, 4, 5, 6, false] }], // 鏍囬 + [{ color: [] }, { background: [] }], // 瀛椾綋棰滆壊銆佸瓧浣撹儗鏅鑹� + [{ align: [] }], // 瀵归綈鏂瑰紡 + ["clean"], // 娓呴櫎鏂囨湰鏍煎紡 + ["link", "image", "video"], // 閾炬帴銆佸浘鐗囥�佽棰� ], }, placeholder: "璇疯緭鍏ュ唴瀹�", - readOnly: props.readOnly -}) + readOnly: props.readOnly, +}); const styles = computed(() => { - let style = {} + let style = {}; if (props.minHeight) { - style.minHeight = `${props.minHeight}px` + style.minHeight = `${props.minHeight}px`; } if (props.height) { - style.height = `${props.height}px` + style.height = `${props.height}px`; } - return style -}) + return style; +}); -const content = ref("") -watch(() => props.modelValue, (v) => { - if (v !== content.value) { - content.value = v == undefined ? "<p></p>" : v - } -}, { immediate: true }) +const content = ref(""); +watch( + () => props.modelValue, + (v) => { + if (v !== content.value) { + content.value = v == undefined ? "<p></p>" : v; + } + }, + { immediate: true } +); // 濡傛灉璁剧疆浜嗕笂浼犲湴鍧�鍒欒嚜瀹氫箟鍥剧墖涓婁紶浜嬩欢 onMounted(() => { - if (props.type == 'url') { - let quill = quillEditorRef.value.getQuill() - let toolbar = quill.getModule("toolbar") + if (props.type == "url") { + let quill = quillEditorRef.value.getQuill(); + let toolbar = quill.getModule("toolbar"); toolbar.addHandler("image", (value) => { if (value) { - proxy.$refs.uploadRef.click() + proxy.$refs.uploadRef.click(); } else { - quill.format("image", false) + quill.format("image", false); } - }) - quill.root.addEventListener('paste', handlePasteCapture, true) + }); + quill.root.addEventListener("paste", handlePasteCapture, true); } -}) +}); // 涓婁紶鍓嶆牎妫�鏍煎紡鍜屽ぇ灏� function handleBeforeUpload(file) { - const type = ["image/jpeg", "image/jpg", "image/png", "image/svg"] - const isJPG = type.includes(file.type) + const type = ["image/jpeg", "image/jpg", "image/png", "image/svg"]; + const isJPG = type.includes(file.type); //妫�楠屾枃浠舵牸寮� if (!isJPG) { - proxy.$modal.msgError(`鍥剧墖鏍煎紡閿欒!`) - return false + proxy.$modal.msgError(`鍥剧墖鏍煎紡閿欒!`); + return false; } // 鏍℃鏂囦欢澶у皬 if (props.fileSize) { - const isLt = file.size / 1024 / 1024 < props.fileSize + const isLt = file.size / 1024 / 1024 < props.fileSize; if (!isLt) { - proxy.$modal.msgError(`涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 ${props.fileSize} MB!`) - return false + proxy.$modal.msgError(`涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 ${props.fileSize} MB!`); + return false; } } - return true + return true; } // 涓婁紶鎴愬姛澶勭悊 @@ -154,44 +158,55 @@ // 濡傛灉涓婁紶鎴愬姛 if (res.code == 200) { // 鑾峰彇瀵屾枃鏈疄渚� - let quill = toRaw(quillEditorRef.value).getQuill() + let quill = toRaw(quillEditorRef.value).getQuill(); // 鑾峰彇鍏夋爣浣嶇疆 - let length = quill.selection.savedRange.index + let length = quill.selection.savedRange.index; // 鎻掑叆鍥剧墖锛宺es.url涓烘湇鍔″櫒杩斿洖鐨勫浘鐗囬摼鎺ュ湴鍧� - quill.insertEmbed(length, "image", import.meta.env.VITE_APP_BASE_API + res.fileName) + quill.insertEmbed( + length, + "image", + import.meta.env.VITE_APP_BASE_API + res.fileName + ); // 璋冩暣鍏夋爣鍒版渶鍚� - quill.setSelection(length + 1) + quill.setSelection(length + 1); } else { - proxy.$modal.msgError("鍥剧墖鎻掑叆澶辫触") + proxy.$modal.msgError("鍥剧墖鎻掑叆澶辫触"); } } // 涓婁紶澶辫触澶勭悊 function handleUploadError() { - proxy.$modal.msgError("鍥剧墖鎻掑叆澶辫触") + proxy.$modal.msgError("鍥剧墖鎻掑叆澶辫触"); } // 澶嶅埗绮樿创鍥剧墖澶勭悊 function handlePasteCapture(e) { - const clipboard = e.clipboardData || window.clipboardData + const clipboard = e.clipboardData || window.clipboardData; if (clipboard && clipboard.items) { for (let i = 0; i < clipboard.items.length; i++) { - const item = clipboard.items[i] - if (item.type.indexOf('image') !== -1) { - e.preventDefault() - const file = item.getAsFile() - insertImage(file) + const item = clipboard.items[i]; + if (item.type.indexOf("image") !== -1) { + e.preventDefault(); + const file = item.getAsFile(); + insertImage(file); } } } } function insertImage(file) { - const formData = new FormData() - formData.append("file", file) - axios.post(uploadUrl.value, formData, { headers: { "Content-Type": "multipart/form-data", Authorization: headers.value.Authorization } }).then(res => { - handleUploadSuccess(res.data) - }) + const formData = new FormData(); + formData.append("file", file); + axios + .post(uploadUrl.value, formData, { + headers: { + "Content-Type": "multipart/form-data", + Authorization: headers.value.Authorization, + }, + }) + .then((res) => { + handleUploadSuccess(res.data); + }); } </script> @@ -199,7 +214,8 @@ .editor-img-uploader { display: none; } -.editor, .ql-toolbar { +.editor, +.ql-toolbar { white-space: pre-wrap !important; line-height: normal !important; } diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue index d217897..e39a6ed 100644 --- a/src/components/FileUpload/index.vue +++ b/src/components/FileUpload/index.vue @@ -22,18 +22,40 @@ <!-- 涓婁紶鎻愮ず --> <div class="el-upload__tip" v-if="showTip && !disabled"> 璇蜂笂浼� - <template v-if="fileSize"> 澶у皬涓嶈秴杩� <b style="color: #f56c6c">{{ fileSize }}MB</b> </template> - <template v-if="fileType"> 鏍煎紡涓� <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template> + <template v-if="fileSize"> + 澶у皬涓嶈秴杩� <b style="color: #f56c6c">{{ fileSize }}MB</b> + </template> + <template v-if="fileType"> + 鏍煎紡涓� <b style="color: #f56c6c">{{ fileType.join("/") }}</b> + </template> 鐨勬枃浠� </div> <!-- 鏂囦欢鍒楄〃 --> - <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul"> - <li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList"> - <el-link :href="`${baseUrl}${file.url}`" :underline="false" target="_blank"> + <transition-group + class="upload-file-list el-upload-list el-upload-list--text" + name="el-fade-in-linear" + tag="ul" + > + <li + :key="file.uid" + class="el-upload-list__item ele-upload-list__item-content" + v-for="(file, index) in fileList" + > + <el-link + :href="`${baseUrl}${file.url}`" + :underline="false" + target="_blank" + > <span class="el-icon-document"> {{ getFileName(file.name) }} </span> </el-link> <div class="ele-upload-list__item-content-action"> - <el-link :underline="false" @click="handleDelete(index)" type="danger" v-if="!disabled"> 鍒犻櫎</el-link> + <el-link + :underline="false" + @click="handleDelete(index)" + type="danger" + v-if="!disabled" + > 鍒犻櫎</el-link + > </div> </li> </transition-group> @@ -41,152 +63,160 @@ </template> <script setup> -import { getToken } from "@/utils/auth" -import Sortable from 'sortablejs' +import { getToken } from "@/utils/auth"; +import Sortable from "sortablejs"; const props = defineProps({ modelValue: [String, Object, Array], // 涓婁紶鎺ュ彛鍦板潃 action: { type: String, - default: "/common/upload" + default: "/common/upload", }, // 涓婁紶鎼哄甫鐨勫弬鏁� data: { - type: Object + type: Object, }, // 鏁伴噺闄愬埗 limit: { type: Number, - default: 5 + default: 5, }, // 澶у皬闄愬埗(MB) fileSize: { type: Number, - default: 5 + default: 5, }, // 鏂囦欢绫诲瀷, 渚嬪['png', 'jpg', 'jpeg'] fileType: { type: Array, - default: () => ["doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt", "pdf"] + default: () => ["doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt", "pdf"], }, // 鏄惁鏄剧ず鎻愮ず isShowTip: { type: Boolean, - default: true + default: true, }, // 绂佺敤缁勪欢锛堜粎鏌ョ湅鏂囦欢锛� disabled: { type: Boolean, - default: false + default: false, }, // 鎷栧姩鎺掑簭 drag: { type: Boolean, - default: true - } -}) + default: true, + }, +}); -const { proxy } = getCurrentInstance() -const emit = defineEmits() -const number = ref(0) -const uploadList = ref([]) -const baseUrl = import.meta.env.VITE_APP_BASE_API -const uploadFileUrl = ref(import.meta.env.VITE_APP_BASE_API + props.action) // 涓婁紶鏂囦欢鏈嶅姟鍣ㄥ湴鍧� -const headers = ref({ Authorization: "Bearer " + getToken() }) -const fileList = ref([]) +const { proxy } = getCurrentInstance(); +const emit = defineEmits(); +const number = ref(0); +const uploadList = ref([]); +const baseUrl = import.meta.env.VITE_APP_BASE_API; +const uploadFileUrl = ref(import.meta.env.VITE_APP_BASE_API + props.action); // 涓婁紶鏂囦欢鏈嶅姟鍣ㄥ湴鍧� +const headers = ref({ Authorization: "Bearer " + getToken() }); +const fileList = ref([]); const showTip = computed( () => props.isShowTip && (props.fileType || props.fileSize) -) +); -watch(() => props.modelValue, val => { - if (val) { - let temp = 1 - // 棣栧厛灏嗗�艰浆涓烘暟缁� - const list = Array.isArray(val) ? val : props.modelValue.split(',') - // 鐒跺悗灏嗘暟缁勮浆涓哄璞℃暟缁� - fileList.value = list.map(item => { - if (typeof item === "string") { - item = { name: item, url: item } - } - item.uid = item.uid || new Date().getTime() + temp++ - return item - }) - } else { - fileList.value = [] - return [] - } -},{ deep: true, immediate: true }) +watch( + () => props.modelValue, + (val) => { + if (val) { + let temp = 1; + // 棣栧厛灏嗗�艰浆涓烘暟缁� + const list = Array.isArray(val) ? val : props.modelValue.split(","); + // 鐒跺悗灏嗘暟缁勮浆涓哄璞℃暟缁� + fileList.value = list.map((item) => { + if (typeof item === "string") { + item = { name: item, url: item }; + } + item.uid = item.uid || new Date().getTime() + temp++; + return item; + }); + } else { + fileList.value = []; + return []; + } + }, + { deep: true, immediate: true } +); // 涓婁紶鍓嶆牎妫�鏍煎紡鍜屽ぇ灏� function handleBeforeUpload(file) { // 鏍℃鏂囦欢绫诲瀷 if (props.fileType.length) { - const fileName = file.name.split('.') - const fileExt = fileName[fileName.length - 1] - const isTypeOk = props.fileType.indexOf(fileExt) >= 0 + const fileName = file.name.split("."); + const fileExt = fileName[fileName.length - 1]; + const isTypeOk = props.fileType.indexOf(fileExt) >= 0; if (!isTypeOk) { - proxy.$modal.msgError(`鏂囦欢鏍煎紡涓嶆纭紝璇蜂笂浼�${props.fileType.join("/")}鏍煎紡鏂囦欢!`) - return false + proxy.$modal.msgError( + `鏂囦欢鏍煎紡涓嶆纭紝璇蜂笂浼�${props.fileType.join("/")}鏍煎紡鏂囦欢!` + ); + return false; } } // 鏍℃鏂囦欢鍚嶆槸鍚﹀寘鍚壒娈婂瓧绗� - if (file.name.includes(',')) { - proxy.$modal.msgError('鏂囦欢鍚嶄笉姝g‘锛屼笉鑳藉寘鍚嫳鏂囬�楀彿!') - return false + if (file.name.includes(",")) { + proxy.$modal.msgError("鏂囦欢鍚嶄笉姝g‘锛屼笉鑳藉寘鍚嫳鏂囬�楀彿!"); + return false; } // 鏍℃鏂囦欢澶у皬 if (props.fileSize) { - const isLt = file.size / 1024 / 1024 < props.fileSize + const isLt = file.size / 1024 / 1024 < props.fileSize; if (!isLt) { - proxy.$modal.msgError(`涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 ${props.fileSize} MB!`) - return false + proxy.$modal.msgError(`涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 ${props.fileSize} MB!`); + return false; } } - proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...") - number.value++ - return true + proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��..."); + number.value++; + return true; } // 鏂囦欢涓暟瓒呭嚭 function handleExceed() { - proxy.$modal.msgError(`涓婁紶鏂囦欢鏁伴噺涓嶈兘瓒呰繃 ${props.limit} 涓�!`) + proxy.$modal.msgError(`涓婁紶鏂囦欢鏁伴噺涓嶈兘瓒呰繃 ${props.limit} 涓�!`); } // 涓婁紶澶辫触 function handleUploadError(err) { - proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触") - proxy.$modal.closeLoading() + proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触"); + proxy.$modal.closeLoading(); } // 涓婁紶鎴愬姛鍥炶皟 function handleUploadSuccess(res, file) { if (res.code === 200) { - uploadList.value.push({ name: res.fileName, url: res.fileName }) - uploadedSuccessfully() + uploadList.value.push({ name: res.fileName, url: res.fileName }); + uploadedSuccessfully(); } else { - number.value-- - proxy.$modal.closeLoading() - proxy.$modal.msgError(res.msg) - proxy.$refs.fileUpload.handleRemove(file) - uploadedSuccessfully() + number.value--; + proxy.$modal.closeLoading(); + proxy.$modal.msgError(res.msg); + proxy.$refs.fileUpload.handleRemove(file); + uploadedSuccessfully(); } } // 鍒犻櫎鏂囦欢 function handleDelete(index) { - fileList.value.splice(index, 1) - emit("update:modelValue", listToString(fileList.value)) + fileList.value.splice(index, 1); + emit("update:modelValue", listToString(fileList.value)); } // 涓婁紶缁撴潫澶勭悊 function uploadedSuccessfully() { if (number.value > 0 && uploadList.value.length === number.value) { - fileList.value = fileList.value.filter(f => f.url !== undefined).concat(uploadList.value) - uploadList.value = [] - number.value = 0 - emit("update:modelValue", listToString(fileList.value)) - proxy.$modal.closeLoading() + fileList.value = fileList.value + .filter((f) => f.url !== undefined) + .concat(uploadList.value); + uploadList.value = []; + number.value = 0; + emit("update:modelValue", listToString(fileList.value)); + proxy.$modal.closeLoading(); } } @@ -194,40 +224,40 @@ function getFileName(name) { // 濡傛灉鏄痷rl閭d箞鍙栨渶鍚庣殑鍚嶅瓧 濡傛灉涓嶆槸鐩存帴杩斿洖 if (name.lastIndexOf("/") > -1) { - return name.slice(name.lastIndexOf("/") + 1) + return name.slice(name.lastIndexOf("/") + 1); } else { - return name + return name; } } // 瀵硅薄杞垚鎸囧畾瀛楃涓插垎闅� function listToString(list, separator) { - let strs = "" - separator = separator || "," + let strs = ""; + separator = separator || ","; for (let i in list) { if (list[i].url) { - strs += list[i].url + separator + strs += list[i].url + separator; } } - return strs != '' ? strs.substr(0, strs.length - 1) : '' + return strs != "" ? strs.substr(0, strs.length - 1) : ""; } // 鍒濆鍖栨嫋鎷芥帓搴� onMounted(() => { if (props.drag) { nextTick(() => { - const element = document.querySelector('.upload-file-list') + const element = document.querySelector(".upload-file-list"); Sortable.create(element, { - ghostClass: 'file-upload-darg', + ghostClass: "file-upload-darg", onEnd: (evt) => { - const movedItem = fileList.value.splice(evt.oldIndex, 1)[0] - fileList.value.splice(evt.newIndex, 0, movedItem) - emit('update:modelValue', listToString(fileList.value)) - } - }) - }) + const movedItem = fileList.value.splice(evt.oldIndex, 1)[0]; + fileList.value.splice(evt.newIndex, 0, movedItem); + emit("update:modelValue", listToString(fileList.value)); + }, + }); + }); } -}) +}); </script> <style scoped lang="scss"> .file-upload-darg { diff --git a/src/components/PIMTable/PIMTable.vue b/src/components/PIMTable/PIMTable.vue index 3c9e756..d1b778d 100644 --- a/src/components/PIMTable/PIMTable.vue +++ b/src/components/PIMTable/PIMTable.vue @@ -5,18 +5,20 @@ :border="border" :data="tableData" :header-cell-style="{ background: '#F0F1F5', color: '#333333' }" - height="calc(100vh - 18.5em)" + :height="height" :highlight-current-row="highlightCurrentRow" :row-class-name="rowClassName" :row-style="rowStyle" :row-key="rowKey" style="width: 100%" tooltip-effect="dark" - @row-click="rowClick" - @current-change="currentChange" + :expand-row-keys="expandRowKeys" :show-summary="isShowSummary" :summary-method="summaryMethod" + @row-click="rowClick" + @current-change="currentChange" @selection-change="handleSelectionChange" + @expand-change="expandChange" class="lims-table" > <el-table-column @@ -224,7 +226,7 @@ const uploadHeader = proxy.uploadHeader; const javaApi = proxy.javaApi; -const emit = defineEmits(["pagination"]); +const emit = defineEmits(["pagination", "expand-change", "selection-change"]); // Filters const typeFn = (val, row) => { @@ -241,9 +243,13 @@ type: Boolean, default: false, }, - handleSelectionChange: { - type: Function, - default: () => {}, + height: { + type: [Number, String], + default: "calc(100vh - 18.5em)", + }, + expandRowKeys: { + type: Array, + default: () => [], }, summaryMethod: { type: Function, @@ -405,6 +411,14 @@ const paginationSearch = ({ page, limit }) => { emit("pagination", { page: page, limit: limit }); }; + +const expandChange = (row, expandedRows) => { + emit("expand-change", row, expandedRows); +}; + +const handleSelectionChange = (newSelection) => { + emit("selection-change", newSelection); +}; </script> <style scoped lang="scss"> diff --git a/src/components/Upload/FileUpload.vue b/src/components/Upload/FileUpload.vue index 53de217..295a528 100644 --- a/src/components/Upload/FileUpload.vue +++ b/src/components/Upload/FileUpload.vue @@ -18,8 +18,20 @@ type: Boolean, default: false, }, + showTip: { + type: Boolean, + default: true, + }, + autoUpload: { + type: Boolean, + default: false, + }, + limit: { + type: Number, + default: 1, + }, }); -const emits = defineEmits(["success", "error"]); +const emits = defineEmits(["success", "remove"]); const uploadRef = ref(); const fileList = ref([]); @@ -29,10 +41,12 @@ }; const handleFileSuccess = (response, file, fileList) => { - upload.open = false; - upload.isUploading = false; - uploadRef.value.handleRemove(file); + // uploadRef.value.handleRemove(file); emits("success", response, file, fileList); +}; + +const handleRemove = (file) => { + emits("remove", file); }; defineExpose({ @@ -51,10 +65,11 @@ :accept="accept" :headers="headers" :disabled="disabled" - :auto-upload="false" - :limit="1" + :auto-upload="autoUpload" + :limit="limit" :drag="true" :on-success="handleFileSuccess" + :on-remove="handleRemove" > <div class="el-upload__text"> <el-icon class="el-icon--upload"><upload-filled /></el-icon> @@ -64,7 +79,7 @@ </div> </div> <template #tip> - <div class="el-upload__tip text-center"> + <div v-if="showTip" class="el-upload__tip text-center"> 鍙兘涓婁紶xlsx/xls鏂囦欢锛屼笖涓嶈秴杩�10M <el-button type="primary" diff --git a/src/hooks/useModal.js b/src/hooks/useModal.js index 12d945c..0d443a1 100644 --- a/src/hooks/useModal.js +++ b/src/hooks/useModal.js @@ -8,11 +8,10 @@ const openModal = (e) => { id.value = e; modalOptions.value = { - title: e ? "缂栬緫璁惧鍙拌处" : "鏂板璁惧鍙拌处", + title: e ? `淇敼${options.title}` : `鏂板${options.title}`, content: "纭畾鎵ц姝ゆ搷浣滃悧锛�", confirmText: "纭畾", cancelText: "鍙栨秷", - ...options, }; visible.value = true; }; diff --git a/src/hooks/usePaginationApi.jsx b/src/hooks/usePaginationApi.jsx index e28c816..749b078 100644 --- a/src/hooks/usePaginationApi.jsx +++ b/src/hooks/usePaginationApi.jsx @@ -1,6 +1,7 @@ import { ref, reactive, watchEffect, unref } from "vue"; import useFormData from "@/hooks/useFormData"; import { deepClone, isEqual } from "@/utils/index.js" +import { ElMessage } from 'element-plus' /** * 鍒嗛〉api @@ -85,7 +86,7 @@ ...getFinalParams(), current: pagination.currentPage, size: pagination.pageSize - }).then(({ code, data, ...rest }) => { + }).then(({ code, data, msg, ...rest }) => { if (code == 200) { // pagination.currentPage = meta.current_page; // pagination.pageSize = meta.per_page; @@ -96,7 +97,7 @@ loading.value = false; } else { loading.value = false; - ElMessage({ message: data.msg, type: "error" }); + ElMessage({ message: msg, type: "error" }); } }); } diff --git a/src/views/basicData/customerFile/index.vue b/src/views/basicData/customerFile/index.vue index d67c4b6..c4fa332 100644 --- a/src/views/basicData/customerFile/index.vue +++ b/src/views/basicData/customerFile/index.vue @@ -1,97 +1,170 @@ <template> -<div class="app-container"> - <div class="search_form"> - <div> - <span class="search_title">瀹㈡埛鍚嶇О锛�</span> - <el-input + <div class="app-container"> + <div class="search_form"> + <div> + <span class="search_title">瀹㈡埛鍚嶇О锛�</span> + <el-input v-model="searchForm.customerName" style="width: 240px" placeholder="璇疯緭鍏�" @change="handleQuery" clearable :prefix-icon="Search" - /> - <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button> + /> + <el-button type="primary" @click="handleQuery" style="margin-left: 10px" + >鎼滅储</el-button + > + </div> + <div> + <el-button type="primary" @click="openForm('add')">鏂板瀹㈡埛</el-button> + <el-button @click="handleOut">瀵煎嚭</el-button> + <el-button type="info" plain icon="Upload" @click="handleImport" + >瀵煎叆</el-button + > + <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button> + </div> </div> - <div> - <el-button type="primary" @click="openForm('add')">鏂板瀹㈡埛</el-button> - <el-button @click="handleOut">瀵煎嚭</el-button> - <el-button type="info" plain icon="Upload" @click="handleImport">瀵煎叆</el-button> - <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button> + <div class="table_list"> + <PIMTable + rowKey="id" + :column="tableColumn" + :tableData="tableData" + :page="page" + :isSelection="true" + @selection-change="handleSelectionChange" + :tableLoading="tableLoading" + @pagination="pagination" + :total="total" + ></PIMTable> </div> - </div> - <div class="table_list"> - <PIMTable :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true" :handleSelectionChange="handleSelectionChange" - :tableLoading="tableLoading" @pagination="pagination" :total="total"></PIMTable> - </div> - <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板瀹㈡埛淇℃伅' : '缂栬緫瀹㈡埛淇℃伅'" width="70%" @close="closeDia"> - <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> - <el-row :gutter="30"> - <el-col :span="12"> - <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName"> - <el-input v-model="form.customerName" placeholder="璇疯緭鍏�" clearable/> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="绾崇◣浜鸿瘑鍒彿锛�" prop="taxpayerIdentificationNumber"> - <el-input v-model="form.taxpayerIdentificationNumber" placeholder="璇疯緭鍏�" clearable/> - </el-form-item> - </el-col> - </el-row> - <el-row :gutter="30"> - <el-col :span="12"> - <el-form-item label="鍏徃鍦板潃锛�" prop="companyAddress"> - <el-input v-model="form.companyAddress" placeholder="璇疯緭鍏�" clearable/> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="鍏徃鐢佃瘽锛�" prop="companyPhone"> - <el-input v-model="form.companyPhone" placeholder="璇疯緭鍏�" clearable/> - </el-form-item> - </el-col> - </el-row> - <el-row :gutter="30"> - <el-col :span="12"> - <el-form-item label="鑱旂郴浜猴細" prop="contactPerson"> - <el-input v-model="form.contactPerson" placeholder="璇疯緭鍏�" clearable/> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="contactPhone"> - <el-input v-model="form.contactPhone" placeholder="璇疯緭鍏�" clearable/> - </el-form-item> - </el-col> - </el-row> - <el-row :gutter="30"> - <el-col :span="12"> - <el-form-item label="閾惰鍩烘湰鎴凤細" prop="basicBankAccount"> - <el-input v-model="form.basicBankAccount" placeholder="璇疯緭鍏�" clearable/> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="閾惰璐﹀彿锛�" prop="bankAccount"> - <el-input v-model="form.bankAccount" placeholder="璇疯緭鍏�" clearable/> - </el-form-item> - </el-col> - </el-row> - <el-row :gutter="30"> - <el-col :span="12"> - <el-form-item label="寮�鎴疯鍙凤細" prop="bankCode"> - <el-input v-model="form.bankCode" placeholder="璇疯緭鍏�" clearable/> - </el-form-item> - </el-col> - </el-row> - <el-row :gutter="30"> - <el-col :span="12"> - <el-form-item label="缁存姢浜猴細" prop="maintainer"> - <el-select v-model="form.maintainer" placeholder="璇烽�夋嫨" clearable disabled> - <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/> - </el-select> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="缁存姢鏃堕棿锛�" prop="maintenanceTime" > - <el-date-picker + <el-dialog + v-model="dialogFormVisible" + :title="operationType === 'add' ? '鏂板瀹㈡埛淇℃伅' : '缂栬緫瀹㈡埛淇℃伅'" + width="70%" + @close="closeDia" + > + <el-form + :model="form" + label-width="140px" + label-position="top" + :rules="rules" + ref="formRef" + > + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName"> + <el-input + v-model="form.customerName" + placeholder="璇疯緭鍏�" + clearable + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item + label="绾崇◣浜鸿瘑鍒彿锛�" + prop="taxpayerIdentificationNumber" + > + <el-input + v-model="form.taxpayerIdentificationNumber" + placeholder="璇疯緭鍏�" + clearable + /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="鍏徃鍦板潃锛�" prop="companyAddress"> + <el-input + v-model="form.companyAddress" + placeholder="璇疯緭鍏�" + clearable + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鍏徃鐢佃瘽锛�" prop="companyPhone"> + <el-input + v-model="form.companyPhone" + placeholder="璇疯緭鍏�" + clearable + /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="鑱旂郴浜猴細" prop="contactPerson"> + <el-input + v-model="form.contactPerson" + placeholder="璇疯緭鍏�" + clearable + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="contactPhone"> + <el-input + v-model="form.contactPhone" + placeholder="璇疯緭鍏�" + clearable + /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="閾惰鍩烘湰鎴凤細" prop="basicBankAccount"> + <el-input + v-model="form.basicBankAccount" + placeholder="璇疯緭鍏�" + clearable + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="閾惰璐﹀彿锛�" prop="bankAccount"> + <el-input + v-model="form.bankAccount" + placeholder="璇疯緭鍏�" + clearable + /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="寮�鎴疯鍙凤細" prop="bankCode"> + <el-input + v-model="form.bankCode" + placeholder="璇疯緭鍏�" + clearable + /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="缁存姢浜猴細" prop="maintainer"> + <el-select + v-model="form.maintainer" + placeholder="璇烽�夋嫨" + clearable + disabled + > + <el-option + v-for="item in userList" + :key="item.nickName" + :label="item.nickName" + :value="item.nickName" + /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="缁存姢鏃堕棿锛�" prop="maintenanceTime"> + <el-date-picker style="width: 100%" v-model="form.maintenanceTime" value-format="YYYY-MM-DD" @@ -100,155 +173,186 @@ placeholder="璇烽�夋嫨" clearable disabled - /> - </el-form-item> - </el-col> - </el-row> - </el-form> - <template #footer> - <div class="dialog-footer"> - <el-button type="primary" @click="submitForm">纭</el-button> - <el-button @click="closeDia">鍙栨秷</el-button> - </div> - </template> - </el-dialog> - <!-- 鐢ㄦ埛瀵煎叆瀵硅瘽妗� --> - <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body> - <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag> - <el-icon class="el-icon--upload"><upload-filled /></el-icon> - <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div> - <template #tip> - <div class="el-upload__tip text-center"> - <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span> - <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">涓嬭浇妯℃澘</el-link> + /> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <div class="dialog-footer"> + <el-button type="primary" @click="submitForm">纭</el-button> + <el-button @click="closeDia">鍙栨秷</el-button> </div> </template> - </el-upload> - <template #footer> - <div class="dialog-footer"> - <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button> - <el-button @click="upload.open = false">鍙� 娑�</el-button> - </div> - </template> - </el-dialog> -</div> + </el-dialog> + <!-- 鐢ㄦ埛瀵煎叆瀵硅瘽妗� --> + <el-dialog + :title="upload.title" + v-model="upload.open" + width="400px" + append-to-body + > + <el-upload + ref="uploadRef" + :limit="1" + accept=".xlsx, .xls" + :headers="upload.headers" + :action="upload.url + '?updateSupport=' + upload.updateSupport" + :disabled="upload.isUploading" + :on-progress="handleFileUploadProgress" + :on-success="handleFileSuccess" + :auto-upload="false" + drag + > + <el-icon class="el-icon--upload"><upload-filled /></el-icon> + <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div> + <template #tip> + <div class="el-upload__tip text-center"> + <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span> + <el-link + type="primary" + :underline="false" + style="font-size: 12px; vertical-align: baseline" + @click="importTemplate" + >涓嬭浇妯℃澘</el-link + > + </div> + </template> + </el-upload> + <template #footer> + <div class="dialog-footer"> + <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button> + <el-button @click="upload.open = false">鍙� 娑�</el-button> + </div> + </template> + </el-dialog> + </div> </template> <script setup> -import { ref } from 'vue' -import {Search} from "@element-plus/icons-vue"; -import {addCustomer, delCustomer, getCustomer, listCustomer, updateCustomer} from "@/api/basicData/customerFile.js"; -import {ElMessageBox } from "element-plus"; -import {userListNoPage} from "@/api/system/user.js"; -import useUserStore from "@/store/modules/user" -import {getToken} from "@/utils/auth.js"; -const { proxy } = getCurrentInstance() -const userStore = useUserStore() +import { ref } from "vue"; +import { Search } from "@element-plus/icons-vue"; +import { + addCustomer, + delCustomer, + getCustomer, + listCustomer, + updateCustomer, +} from "@/api/basicData/customerFile.js"; +import { ElMessageBox } from "element-plus"; +import { userListNoPage } from "@/api/system/user.js"; +import useUserStore from "@/store/modules/user"; +import { getToken } from "@/utils/auth.js"; +const { proxy } = getCurrentInstance(); +const userStore = useUserStore(); const tableColumn = ref([ { - label: '瀹㈡埛鍚嶇О', - prop: 'customerName', + label: "瀹㈡埛鍚嶇О", + prop: "customerName", width: 220, }, { - label: '绾崇◣浜鸿瘑鍒爜', - prop: 'taxpayerIdentificationNumber', + label: "绾崇◣浜鸿瘑鍒爜", + prop: "taxpayerIdentificationNumber", width: 220, }, { - label: '鍦板潃鍙婅仈绯绘柟寮�', - prop: 'addressPhone', + label: "鍦板潃鍙婅仈绯绘柟寮�", + prop: "addressPhone", width: 220, }, { - label: '鑱旂郴浜�', - prop: 'contactPerson' + label: "鑱旂郴浜�", + prop: "contactPerson", }, { - label: '鑱旂郴鐢佃瘽', - prop: 'contactPhone', + label: "鑱旂郴鐢佃瘽", + prop: "contactPhone", }, { - label: '閾惰鍩烘湰鎴�', - prop: 'basicBankAccount', + label: "閾惰鍩烘湰鎴�", + prop: "basicBankAccount", }, { - label: '閾惰璐﹀彿', - prop: 'bankAccount', + label: "閾惰璐﹀彿", + prop: "bankAccount", }, { - label: '寮�鎴疯鍙�', - prop: 'bankCode', + label: "寮�鎴疯鍙�", + prop: "bankCode", }, { - label: '缁存姢浜�', - prop: 'maintainer', + label: "缁存姢浜�", + prop: "maintainer", }, { - label: '缁存姢鏃堕棿', - prop: 'maintenanceTime', + label: "缁存姢鏃堕棿", + prop: "maintenanceTime", }, { dataType: "action", label: "鎿嶄綔", - align: 'center', + align: "center", operation: [ { name: "缂栬緫", type: "text", clickFun: (row) => { - openForm('edit', row); + openForm("edit", row); }, }, ], }, -]) -const tableData = ref([]) -const selectedRows = ref([]) -const userList = ref([]) -const tableLoading = ref(false) +]); +const tableData = ref([]); +const selectedRows = ref([]); +const userList = ref([]); +const tableLoading = ref(false); const page = reactive({ current: 1, size: 10, -}) -const total = ref(0) +}); +const total = ref(0); // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁 -const operationType = ref('') -const dialogFormVisible = ref(false) +const operationType = ref(""); +const dialogFormVisible = ref(false); const data = reactive({ searchForm: { - customerName: '', + customerName: "", }, form: { - customerName: '', - taxpayerIdentificationNumber: '', - companyAddress: '', - companyPhone: '', - contactPerson: '', - contactPhone: '', - maintainer: '', - maintenanceTime: '', - basicBankAccount:'', - bankAccount:'', - bankCode:'' + customerName: "", + taxpayerIdentificationNumber: "", + companyAddress: "", + companyPhone: "", + contactPerson: "", + contactPhone: "", + maintainer: "", + maintenanceTime: "", + basicBankAccount: "", + bankAccount: "", + bankCode: "", }, rules: { customerName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], - taxpayerIdentificationNumber: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + taxpayerIdentificationNumber: [ + { required: true, message: "璇疯緭鍏�", trigger: "blur" }, + ], companyAddress: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], companyPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], contactPerson: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], contactPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], maintainer: [{ required: false, message: "璇烽�夋嫨", trigger: "change" }], - maintenanceTime: [{ required: false, message: "璇烽�夋嫨", trigger: "change" }], + maintenanceTime: [ + { required: false, message: "璇烽�夋嫨", trigger: "change" }, + ], basicBankAccount: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], bankAccount: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], bankCode: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], - - } -}) + }, +}); const upload = reactive({ // 鏄惁鏄剧ず寮瑰嚭灞傦紙瀹㈡埛瀵煎叆锛� open: false, @@ -259,147 +363,145 @@ // 璁剧疆涓婁紶鐨勮姹傚ご閮� headers: { Authorization: "Bearer " + getToken() }, // 涓婁紶鐨勫湴鍧� - url: import.meta.env.VITE_APP_BASE_API + "/basic/customer/importData" -}) -const { searchForm, form, rules } = toRefs(data) + url: import.meta.env.VITE_APP_BASE_API + "/basic/customer/importData", +}); +const { searchForm, form, rules } = toRefs(data); // 鏌ヨ鍒楄〃 /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - page.current = 1 - getList() -} + page.current = 1; + getList(); +}; const pagination = (obj) => { page.current = obj.page; page.size = obj.limit; - getList() -} + getList(); +}; const getList = () => { - tableLoading.value = true - listCustomer({...searchForm.value, ...page}).then(res => { - tableLoading.value = false - tableData.value = res.records - total.value = res.total - }) -} + tableLoading.value = true; + listCustomer({ ...searchForm.value, ...page }).then((res) => { + tableLoading.value = false; + tableData.value = res.records; + total.value = res.total; + }); +}; // 琛ㄦ牸閫夋嫨鏁版嵁 const handleSelectionChange = (selection) => { - selectedRows.value = selection -} + selectedRows.value = selection; +}; /** 鎻愪氦涓婁紶鏂囦欢 */ function submitFileForm() { - proxy.$refs["uploadRef"].submit() + proxy.$refs["uploadRef"].submit(); } /** 瀵煎叆鎸夐挳鎿嶄綔 */ function handleImport() { - upload.title = "瀹㈡埛瀵煎叆" - upload.open = true + upload.title = "瀹㈡埛瀵煎叆"; + upload.open = true; } // 鎵撳紑寮规 const openForm = (type, row) => { - operationType.value = type - form.value = {} - form.value.maintainer = userStore.nickName + operationType.value = type; + form.value = {}; + form.value.maintainer = userStore.nickName; form.value.maintenanceTime = getCurrentDate(); - userListNoPage().then(res => { - userList.value = res.data - }) - if (type === 'edit') { - getCustomer(row.id).then(res => { - form.value = {...res.data} - }) + userListNoPage().then((res) => { + userList.value = res.data; + }); + if (type === "edit") { + getCustomer(row.id).then((res) => { + form.value = { ...res.data }; + }); } - dialogFormVisible.value = true -} + dialogFormVisible.value = true; +}; // 鎻愪氦琛ㄥ崟 const submitForm = () => { - proxy.$refs["formRef"].validate(valid => { + proxy.$refs["formRef"].validate((valid) => { if (valid) { if (operationType.value === "edit") { - submitEdit() + submitEdit(); } else { - submitAdd() + submitAdd(); } } - }) -} + }); +}; // 鎻愪氦鏂板 const submitAdd = () => { - addCustomer(form.value).then(res => { - proxy.$modal.msgSuccess("鎻愪氦鎴愬姛") - closeDia() - getList() - }) -} + addCustomer(form.value).then((res) => { + proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); + closeDia(); + getList(); + }); +}; // 鎻愪氦淇敼 const submitEdit = () => { - updateCustomer(form.value).then(res => { - proxy.$modal.msgSuccess("鎻愪氦鎴愬姛") - closeDia() - getList() - }) -} + updateCustomer(form.value).then((res) => { + proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); + closeDia(); + getList(); + }); +}; // 鍏抽棴寮规 const closeDia = () => { - proxy.resetForm("formRef") - dialogFormVisible.value = false -} + proxy.resetForm("formRef"); + dialogFormVisible.value = false; +}; // 瀵煎嚭 const handleOut = () => { - ElMessageBox.confirm( - '閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�', - '瀵煎嚭', { - confirmButtonText: '纭', - cancelButtonText: '鍙栨秷', - type: 'warning', - } - ).then(() => { - proxy.download("/basic/customer/export", {}, '瀹㈡埛妗f.xlsx') - }).catch(() => { - proxy.$modal.msg("宸插彇娑�") + ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", { + confirmButtonText: "纭", + cancelButtonText: "鍙栨秷", + type: "warning", }) -} + .then(() => { + proxy.download("/basic/customer/export", {}, "瀹㈡埛妗f.xlsx"); + }) + .catch(() => { + proxy.$modal.msg("宸插彇娑�"); + }); +}; // 鍒犻櫎 const handleDelete = () => { - let ids = [] + let ids = []; if (selectedRows.value.length > 0) { - ids = selectedRows.value.map(item => item.id); + ids = selectedRows.value.map((item) => item.id); } else { - proxy.$modal.msgWarning('璇烽�夋嫨鏁版嵁') - return + proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁"); + return; } - ElMessageBox.confirm( - '閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�', - '鍒犻櫎鎻愮ず', { - confirmButtonText: '纭', - cancelButtonText: '鍙栨秷', - type: 'warning', - } - ).then(() => { - tableLoading.value = true - delCustomer(ids).then(res => { - proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛") - getList() - }).finally(() => { - tableLoading.value = false - }) - }).catch(() => { - proxy.$modal.msg("宸插彇娑�") + ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", { + confirmButtonText: "纭", + cancelButtonText: "鍙栨秷", + type: "warning", }) -} + .then(() => { + tableLoading.value = true; + delCustomer(ids) + .then((res) => { + proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + getList(); + }) + .finally(() => { + tableLoading.value = false; + }); + }) + .catch(() => { + proxy.$modal.msg("宸插彇娑�"); + }); +}; // 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD function getCurrentDate() { const today = new Date(); const year = today.getFullYear(); - const month = String(today.getMonth() + 1).padStart(2, '0'); // 鏈堜唤浠�0寮�濮� - const day = String(today.getDate()).padStart(2, '0'); + const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮� + const day = String(today.getDate()).padStart(2, "0"); return `${year}-${month}-${day}`; } -getList() +getList(); </script> -<style scoped lang="scss"> - -</style> +<style scoped lang="scss"></style> diff --git a/src/views/basicData/product/index.vue b/src/views/basicData/product/index.vue index 506c1db..6d31b8d 100644 --- a/src/views/basicData/product/index.vue +++ b/src/views/basicData/product/index.vue @@ -83,11 +83,12 @@ </el-button> </div> <PIMTable + rowKey="id" :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true" - :handleSelectionChange="handleSelectionChange" + @selection-change="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination" :total="total" diff --git a/src/views/basicData/supplierManage/index.vue b/src/views/basicData/supplierManage/index.vue index 63a179c..5aaed78 100644 --- a/src/views/basicData/supplierManage/index.vue +++ b/src/views/basicData/supplierManage/index.vue @@ -28,11 +28,12 @@ </div> <div class="table_list"> <PIMTable + rowKey="id" :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true" - :handleSelectionChange="handleSelectionChange" + @selection-change="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination" :total="total" diff --git a/src/views/equipmentManagement/ledger/index.vue b/src/views/equipmentManagement/ledger/index.vue index 1582f96..83c416e 100644 --- a/src/views/equipmentManagement/ledger/index.vue +++ b/src/views/equipmentManagement/ledger/index.vue @@ -25,6 +25,7 @@ </div> </div> <PIMTable + rowKey="id" :column="columns" :tableData="dataList" :page="{ diff --git a/src/views/personnelManagement/onboarding/index.vue b/src/views/personnelManagement/onboarding/index.vue index 61f1301..cc1e8e5 100644 --- a/src/views/personnelManagement/onboarding/index.vue +++ b/src/views/personnelManagement/onboarding/index.vue @@ -4,177 +4,184 @@ <div> <span class="search_title">濮撳悕锛�</span> <el-input - v-model="searchForm.customerName" - style="width: 240px" - placeholder="璇疯緭鍏ュ悕绉版悳绱�" - @change="handleQuery" - clearable - :prefix-icon="Search" + v-model="searchForm.customerName" + style="width: 240px" + placeholder="璇疯緭鍏ュ悕绉版悳绱�" + @change="handleQuery" + clearable + :prefix-icon="Search" /> - <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button> + <el-button type="primary" @click="handleQuery" style="margin-left: 10px" + >鎼滅储</el-button + > </div> <div> <el-button type="primary" @click="openForm">鏂板鍏ヨ亴</el-button> </div> </div> <div class="table_list"> - <PIMTable :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true" - :handleSelectionChange="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination" - :total="total"></PIMTable> + <PIMTable + rowKey="id" + :column="tableColumn" + :tableData="tableData" + :page="page" + :isSelection="true" + @selection-change="handleSelectionChange" + :tableLoading="tableLoading" + @pagination="pagination" + :total="total" + ></PIMTable> </div> </div> </template> <script setup> -import {Search} from "@element-plus/icons-vue"; -import {ref} from "vue"; +import { Search } from "@element-plus/icons-vue"; +import { ref } from "vue"; const data = reactive({ searchForm: { - customerName: '', + customerName: "", }, form: { - salesLedgerId: '', - customerName: '', - salesman: '', - projectName: '', - productData: [] + salesLedgerId: "", + customerName: "", + salesman: "", + projectName: "", + productData: [], }, rules: { - salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }] - } -}) -const { searchForm, form, rules } = toRefs(data) + salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }], + }, +}); +const { searchForm, form, rules } = toRefs(data); const tableColumn = ref([ { - label: '鐘舵��', - prop: 'paymentDate', - dataType: 'tag', + label: "鐘舵��", + prop: "paymentDate", + dataType: "tag", formatData: (params) => { if (params == 0) { - return '鍦ㄨ亴'; + return "鍦ㄨ亴"; } else if (params == 1) { - return '绂昏亴'; + return "绂昏亴"; } else { - return null + return null; } }, formatType: (params) => { if (params == 0) { - return 'primary'; + return "primary"; } else if (params == 1) { - return 'danger'; + return "danger"; } else { - return null + return null; } - } + }, }, { - label: '鍛樺伐缂栧彿', - prop: 'supplierName', + label: "鍛樺伐缂栧彿", + prop: "supplierName", }, { - label: '濮撳悕', - prop: 'currentPaymentAmount', + label: "濮撳悕", + prop: "currentPaymentAmount", }, { - label: '鎬у埆', - prop: 'paymentMethod' + label: "鎬у埆", + prop: "paymentMethod", }, { - label: '绫嶈疮', - prop: 'registrant' + label: "绫嶈疮", + prop: "registrant", }, { - label: '宀椾綅', - prop: 'registrationtDate' + label: "宀椾綅", + prop: "registrationtDate", }, { - label: '瀹跺涵浣忓潃', - prop: 'registrationtDate' + label: "瀹跺涵浣忓潃", + prop: "registrationtDate", }, { - label: '绗竴瀛﹀巻', - prop: 'registrationtDate' + label: "绗竴瀛﹀巻", + prop: "registrationtDate", }, { - label: '涓撲笟', - prop: 'registrationtDate' + label: "涓撲笟", + prop: "registrationtDate", }, { - label: '韬唤璇佸彿', - prop: 'registrationtDate' + label: "韬唤璇佸彿", + prop: "registrationtDate", }, { - label: '骞撮緞', - prop: 'registrationtDate' + label: "骞撮緞", + prop: "registrationtDate", }, { - label: '鑱旂郴鐢佃瘽', - prop: 'registrationtDate' + label: "鑱旂郴鐢佃瘽", + prop: "registrationtDate", }, { - label: '绱ф�ヨ仈绯讳汉', - prop: 'registrationtDate' + label: "绱ф�ヨ仈绯讳汉", + prop: "registrationtDate", }, { - label: '鑱旂郴鐢佃瘽', - prop: 'registrationtDate' + label: "鑱旂郴鐢佃瘽", + prop: "registrationtDate", }, { - label: '鍚堝悓骞撮檺', - prop: 'registrationtDate' + label: "鍚堝悓骞撮檺", + prop: "registrationtDate", }, { - label: '鍚堝悓寮�濮嬫棩鏈�', - prop: 'registrationtDate' + label: "鍚堝悓寮�濮嬫棩鏈�", + prop: "registrationtDate", }, { - label: '鍚堝悓缁撴潫鏃ユ湡', - prop: 'registrationtDate' + label: "鍚堝悓缁撴潫鏃ユ湡", + prop: "registrationtDate", }, -]) -const tableData = ref([]) -const selectedRows = ref([]) -const tableLoading = ref(false) +]); +const tableData = ref([]); +const selectedRows = ref([]); +const tableLoading = ref(false); const page = reactive({ current: 1, size: 100, -}) -const total = ref(0) - +}); +const total = ref(0); // 鏌ヨ鍒楄〃 /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - page.current = 1 - getList() -} + page.current = 1; + getList(); +}; const pagination = (obj) => { page.current = obj.page; page.size = obj.limit; - getList() -} + getList(); +}; const getList = () => { - tableLoading.value = true - ledgerListPage({...searchForm.value, ...page}).then(res => { - tableLoading.value = false + tableLoading.value = true; + ledgerListPage({ ...searchForm.value, ...page }).then((res) => { + tableLoading.value = false; tableData.value = res.records; - total.value = res.total - }) -} + total.value = res.total; + }); +}; // 琛ㄦ牸閫夋嫨鏁版嵁 const handleSelectionChange = (selection) => { - console.log('selection', selection) - selectedRows.value = selection.filter(item => item.salesContractNo !== undefined); -} + console.log("selection", selection); + selectedRows.value = selection.filter( + (item) => item.salesContractNo !== undefined + ); +}; // 鎵撳紑寮规 -const openForm = () => { - -} +const openForm = () => {}; </script> -<style scoped> - -</style> \ No newline at end of file +<style scoped></style> diff --git a/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue b/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue new file mode 100644 index 0000000..0523e40 --- /dev/null +++ b/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue @@ -0,0 +1,111 @@ +<template> + <PIMTable + rowKey="id" + :column="columns" + :tableData="dataList" + :tableLoading="loading" + > + </PIMTable> +</template> + +<script setup> +import { usePaginationApi } from "@/hooks/usePaginationApi"; +import { productList } from "@/api/procurementManagement/procurementLedger.js"; + +defineOptions({ + name: "鏉ョエ鐧昏鎶樺彔琛�", +}); + +const { + loading, + filters, + columns, + dataList, + pagination, + getTableData, + resetFilters, +} = usePaginationApi( + productList, + { + salesLedgerId: undefined, + type: 2, + }, + [ + { + label: "浜у搧澶х被", + prop: "productCategory", + }, + { + label: "瑙勬牸鍨嬪彿", + prop: "specificationModel", + }, + { + label: "鍗曚綅", + prop: "unit", + }, + { + label: "鏁伴噺", + prop: "quantity", + }, + { + label: "绋庣巼(%)", + prop: "taxRate", + }, + { + label: "鍚◣鍗曚环(鍏�)", + prop: "taxInclusiveUnitPrice", + formatData: (val) => { + return parseFloat(val).toFixed(2) ?? 0; + }, + }, + { + label: "鍚◣鎬讳环(鍏�)", + prop: "taxInclusiveTotalPrice", + formatData: (val) => { + return parseFloat(val).toFixed(2) ?? 0; + }, + }, + { + label: "涓嶅惈绋庢�讳环(鍏�)", + prop: "taxExclusiveTotalPrice", + formatData: (val) => { + return parseFloat(val).toFixed(2) ?? 0; + }, + }, + { + label: "鏈鏉ョエ閲戦(鍏�)", + prop: "ticketsAmount", + formatData: (val) => { + return parseFloat(val).toFixed(2) ?? 0; + }, + }, + { + label: "鏈潵绁ㄦ暟", + prop: "futureTickets", + }, + { + label: "鏈潵绁ㄩ噾棰�(鍏�)", + prop: "futureTicketsAmount", + formatData: (val) => { + return parseFloat(val).toFixed(2) ?? 0; + }, + }, + ], + {}, + {}, + (data) => { + dataList.value = data; + } +); + +const getList = (id) => { + filters.salesLedgerId = id; + getTableData(); +}; + +defineExpose({ + getList, +}); +</script> + +<style lang="scss" scoped></style> diff --git a/src/views/procurementManagement/invoiceEntry/components/Modal.vue b/src/views/procurementManagement/invoiceEntry/components/Modal.vue new file mode 100644 index 0000000..41a0745 --- /dev/null +++ b/src/views/procurementManagement/invoiceEntry/components/Modal.vue @@ -0,0 +1,407 @@ +<template> + <el-dialog :title="modalOptions.title" v-model="visible" width="70%"> + <el-form + ref="formRef" + :model="form" + :rules="rules" + label-width="120px" + label-position="top" + > + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseLedgerNo"> + <el-input v-model="form.purchaseLedgerNo" disabled /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo"> + <el-input + v-model="form.salesContractNo" + placeholder="鑷姩濉厖" + clearable + disabled + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName"> + <el-input + v-model="form.supplierName" + placeholder="鑷姩濉厖" + clearable + disabled + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName"> + <el-input + v-model="form.projectName" + placeholder="鑷姩濉厖" + clearable + disabled + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber"> + <el-input + v-model="form.invoiceNumber" + placeholder="璇疯緭鍏�" + clearable + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount"> + <el-input + type="number" + :step="0.01" + :min="0" + v-model="form.invoiceAmount" + placeholder="鑷姩濉厖" + clearable + :disabled="true" + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="褰曞叆浜猴細" prop="issUer"> + <el-input + v-model="form.issUer" + placeholder="璇疯緭鍏�" + clearable + disabled + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="entryDate"> + <el-date-picker + style="width: 100%" + v-model="form.entryDate" + type="date" + clearable + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="涓婁紶闄勪欢"> + <FileUpload + :showTip="false" + accept="*" + :autoUpload="true" + :action="action" + :headers="{ + Authorization: 'Bearer ' + getToken(), + }" + :limit="10" + @success="uploadSuccess" + @remove="removeFile" + /> + </el-form-item> + </el-col> + </el-row> + <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate"> </el-form-item> + <PIMTable + rowKey="id" + :column="columns" + :tableData="form.productData" + height="auto" + > + <template #ticketsNumRef="{ row }"> + <el-input-number + v-model="row.ticketsNum" + placeholder="璇烽�夋嫨" + :min="0" + :step="0.1" + clearable + style="width: 100%" + @change="invoiceNumBlur(row)" + /> + </template> + <template #ticketsAmountRef="{ row }"> + <el-input-number + v-model="row.ticketsAmount" + placeholder="璇烽�夋嫨" + :min="0" + :step="0.1" + clearable + style="width: 100%" + @change="invoiceAmountBlur(row)" + /> + </template> + </PIMTable> + </el-form> + <template #footer> + <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button> + <el-button type="primary" :loading="modalLoading" @click="submitForm"> + {{ modalOptions.confirmText }} + </el-button> + </template> + </el-dialog> +</template> + +<script setup> +import { ref, getCurrentInstance } from "vue"; +import { useModal } from "@/hooks/useModal"; +import useFormData from "@/hooks/useFormData"; +import FileUpload from "@/components/Upload/FileUpload.vue"; +import { + getPurchaseNoById, + getInfo, + addOrUpdateRegistration, +} from "@/api/procurementManagement/invoiceEntry.js"; +import { getPurchaseById } from "@/api/procurementManagement/procurementLedger.js"; +import { getToken } from "@/utils/auth"; +import useUserStore from "@/store/modules/user"; + +defineOptions({ + name: "鏉ョエ鐧昏妯℃�佹", +}); + +const userStore = useUserStore(); +const action = import.meta.env.VITE_APP_BASE_API + "/file/upload"; +const formRef = ref(); +const { proxy } = getCurrentInstance(); +const { form } = useFormData({ + purchaseLedgerNo: undefined, // 閲囪喘鍚堝悓鍙� + salesContractNo: undefined, // 閿�鍞悎鍚屽彿 + supplierName: undefined, // 渚涘簲鍟嗗悕绉� + projectName: undefined, // 椤圭洰鍚嶇О + invoiceNumber: undefined, // 鍙戠エ鍙� + invoiceAmount: undefined, // 鍙戠エ閲戦(鍏�) + issUerId: userStore.id, // 褰曞叆浜� + issUer: userStore.nickName, // 褰曞叆浜� + entryDate: undefined, // 寮�绁ㄦ棩鏈� + salesContractNoId: undefined, // 寮�绁ㄦ棩鏈� + productData: [], // 琛ㄦ牸 + tempFileIds: [], // 鏂囦欢 +}); + +const rules = ref({ + invoiceNumber: [ + { required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿", trigger: "blur" }, + { type: "string" }, + ], + invoiceAmount: [ + { required: true, message: "璇疯緭鍏ュ彂绁ㄩ噾棰�", trigger: "blur" }, + ], +}); + +const { + id, + visible, + loading: modalLoading, + openModal, + modalOptions, + handleConfirm, + closeModal, +} = useModal({ + title: "鏉ョエ鐧昏", +}); + +const columns = [ + { + label: "浜у搧澶х被", + prop: "productCategory", + }, + { + label: "瑙勬牸鍨嬪彿", + prop: "specificationModel", + }, + { + label: "鍗曚綅", + prop: "unit", + width: 80, + }, + { + label: "鏁伴噺", + prop: "quantity", + width: 80, + }, + { + label: "绋庣巼(%)", + prop: "taxRate", + width: 80, + }, + { + label: "褰曞叆鏃ユ湡", + prop: "registerDate", + width: 120, + }, + { + label: "鍚◣鍗曚环(鍏�)", + prop: "taxInclusiveUnitPrice", + width: 150, + formatData: (val) => { + return parseFloat(val).toFixed(2) ?? 0; + }, + }, + { + label: "鍚◣鎬讳环(鍏�)", + prop: "taxInclusiveTotalPrice", + width: 150, + formatData: (val) => { + return parseFloat(val).toFixed(2) ?? 0; + }, + }, + { + label: "涓嶅惈绋庢�讳环(鍏�)", + prop: "taxExclusiveTotalPrice", + width: 150, + formatData: (val) => { + return parseFloat(val).toFixed(2) ?? 0; + }, + }, + { + label: "鏈鏉ョエ鏁�", + prop: "ticketsNum", + dataType: "slot", + slot: "ticketsNumRef", + width: 180, + align: "center", + }, + { + label: "鏈鏉ョエ閲戦(鍏�)", + prop: "ticketsAmount", + dataType: "slot", + slot: "ticketsAmountRef", + width: 180, + align: "center", + }, + { + label: "鏈潵绁ㄦ暟", + prop: "futureTickets", + }, + { + label: "鏈潵绁ㄩ噾棰�(鍏�)", + prop: "futureTicketsAmount", + }, +]; + +const getTableData = async (type, id) => { + if (type == "add") { + const { data } = await getPurchaseNoById({ id }); + form.purchaseLedgerNo = data.purchaseContractNumber; + form.invoiceAmount = data.invoiceAmount; + form.invoiceNumber = data.invoiceNumber; + form.entryDate = data.entryDate; + form.salesContractNoId = data.salesContractNoId; + + const { data: infoData } = await getInfo({ id }); + form.salesContractNo = infoData.salesContractNo; + form.projectName = infoData.projectName; + form.supplierName = infoData.supplierName; + form.productData = infoData.productData; + } else if (type == "edit") { + const data = await getPurchaseById({ id, type: 2 }); + form.purchaseLedgerNo = data.purchaseContractNumber; + form.invoiceAmount = data.invoiceAmount; + form.invoiceNumber = data.invoiceNumber; + form.salesContractNo = data.salesContractNo; + form.projectName = data.projectName; + form.supplierName = data.supplierName; + form.entryDate = data.entryDate; + form.productData = data.productData; + } +}; + +//鏈鏉ョエ鏁板け鐒︽搷浣� +const invoiceNumBlur = (row) => { + if (!row.ticketsNum || row.ticketsNum === "") { + row.ticketsNum = 0; + } + if (Number(row.ticketsNum) > Number(row.tempFutureTickets)) { + proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟"); + row.ticketsNum = 0; + return; + } + // 璁$畻鏈鏉ョエ閲戦 + row.ticketsAmount = row.ticketsNum * row.taxInclusiveUnitPrice; + // 璁$畻鏈潵绁ㄦ暟 + row.futureTickets = row.tempFutureTickets - row.ticketsNum; + // 璁$畻鏈潵绁ㄩ噾棰� + row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount; + calculateinvoiceAmount(); +}; + +// 鏈鏉ョエ閲戦澶辩劍鎿嶄綔 +const invoiceAmountBlur = (row) => { + if (!row.ticketsAmount) { + row.ticketsAmount = 0; + } + // 璁$畻鏄惁瓒呰繃鏉ョエ鎬婚噾棰� + if (row.ticketsAmount > row.tempFutureTicketsAmount) { + proxy.$modal.msgWarning("鏈鏉ョエ閲戦涓嶅緱澶т簬鏈潵绁ㄩ噾棰�"); + row.ticketsAmount = 0; + } + // 璁$畻鏈鏉ョエ鏁� + row.ticketsNum = Number( + (row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(2) + ); + // 璁$畻鏈潵绁ㄦ暟 + row.futureTickets = row.tempFutureTickets - row.ticketsNum; + // 璁$畻鏈潵绁ㄩ噾棰� + row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount; + calculateinvoiceAmount(); +}; + +const calculateinvoiceAmount = () => { + let invoiceAmountTotal = 0; + form.productData.forEach((item) => { + if (item.ticketsAmount) { + invoiceAmountTotal += item.ticketsAmount; + } + }); + form.invoiceAmount = invoiceAmountTotal.toFixed(2); +}; + +const open = (type, eid) => { + openModal(); + getTableData(type, eid); + id.value = eid; +}; + +const uploadSuccess = (response) => { + form.tempFileIds.push(response.data.tempId); + console.log(form); +}; + +const removeFile = (file) => { + const { tempId } = file.response.data; + form.tempFileIds = form.tempFileIds.filter((item) => item !== tempId); +}; + +const submitForm = () => { + formRef.value.validate(async (valid, fields) => { + if (valid) { + modalLoading.value = true; + const { code } = await addOrUpdateRegistration({ + purchaseLedgerId: id.value, + purchaseContractNumber: form.purchaseLedgerNo, + invoiceNumber: form.invoiceNumber, + invoiceAmount: form.invoiceAmount, + salesContractNo: form.salesContractNo, + projectName: form.projectName, + productData: form.productData, + issUerId: form.issUerId, // 褰曞叆浜� + issUer: form.issUer, // 褰曞叆浜� + salesContractNoId: form.salesContractNoId, + supplierName: form.supplierName, + tempFileIds: form.tempFileIds, + }); + modalLoading.value = false; + if (code == 200) { + closeModal(); + } + } + }); +}; + +defineExpose({ + open, +}); +</script> + +<style lang="scss" scoped></style> diff --git a/src/views/procurementManagement/invoiceEntry/index.vue b/src/views/procurementManagement/invoiceEntry/index.vue index d9c9231..6de82f0 100644 --- a/src/views/procurementManagement/invoiceEntry/index.vue +++ b/src/views/procurementManagement/invoiceEntry/index.vue @@ -1,699 +1,185 @@ <template> <div class="app-container"> <div class="search_form"> - <div> - <span class="search_title">閲囪喘鍚堝悓鍙凤細</span> - <el-input - v-model="searchForm.purchaseContractNumber" - style="width: 240px" - placeholder="璇疯緭鍏�" - @change="handleQuery" - clearable - prefix-icon="Search" - /> - <el-button - type="primary" - @click="handleQuery" - style="margin-left: 10px" - > - 鎼滅储 - </el-button> - </div> - <div> - <el-button type="primary" @click="handleAdd">鏂板鐧昏</el-button> - <el-button @click="handleOut">瀵煎嚭</el-button> - <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button> - </div> + <el-form :model="filters" :inline="true"> + <el-form-item label="閲囪喘鍚堝悓鍙凤細"> + <el-input + v-model="filters.purchaseContractNumber" + placeholder="璇疯緭鍏�" + clearable + prefix-icon="Search" + @change="getTableData" + /> + </el-form-item> + <el-form-item> + <el-button type="primary" @click="getTableData"> 鎼滅储 </el-button> + <el-button @click="resetFilters"> 閲嶇疆 </el-button> + </el-form-item> + </el-form> </div> <div class="table_list"> - <el-table - :data="tableData" - border - v-loading="tableLoading" - @selection-change="handleSelectionChange" - :expand-row-keys="expandedRowKeys" - :row-key="(row) => row.id" - show-summary - :summary-method="summarizeMainTable" - @expand-change="expandChange" - height="calc(100vh - 18.5em)" - > - <el-table-column align="center" type="selection" width="55" /> - <el-table-column type="expand"> - <template #default="props"> - <el-table - :data="props.row.children" - border - show-summary - :summary-method="summarizeChildrenTable" - > - <el-table-column - align="center" - label="搴忓彿" - type="index" - width="60" - /> - <el-table-column label="浜у搧澶х被" prop="productCategory" /> - <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" /> - <el-table-column label="鍗曚綅" prop="unit" /> - <el-table-column label="鏁伴噺" prop="quantity" /> - <el-table-column label="绋庣巼(%)" prop="taxRate" /> - <el-table-column - label="鍚◣鍗曚环(鍏�)" - prop="taxInclusiveUnitPrice" - :formatter="formattedNumber" - /> - <el-table-column - label="鍚◣鎬讳环(鍏�)" - prop="taxInclusiveTotalPrice" - :formatter="formattedNumber" - /> - <el-table-column - label="涓嶅惈绋庢�讳环(鍏�)" - prop="taxExclusiveTotalPrice" - :formatter="formattedNumber" - /> - <el-table-column label="鏈鏉ョエ鏁�" prop="ticketsNum" /> - <el-table-column - label="鏈鏉ョエ閲戦(鍏�)" - prop="ticketsAmount" - :formatter="formattedNumber" - /> - <el-table-column label="鏈潵绁ㄦ暟" prop="futureTickets" /> - <el-table-column - label="鏈潵绁ㄩ噾棰�(鍏�)" - prop="futureTicketsAmount" - :formatter="formattedNumber" - /> - </el-table> - </template> - </el-table-column> - <el-table-column align="center" label="搴忓彿" type="index" width="60" /> - <el-table-column - label="閲囪喘鍚堝悓鍙�" - prop="purchaseContractNumber" - show-overflow-tooltip - /> - <el-table-column - label="閿�鍞悎鍚屽彿" - prop="salesContractNo" - show-overflow-tooltip - /> - <el-table-column - label="渚涘簲鍟嗗悕绉�" - prop="supplierName" - show-overflow-tooltip - /> - <el-table-column - label="椤圭洰鍚嶇О" - prop="projectName" - show-overflow-tooltip - /> - <el-table-column - label="鍚堝悓閲戦(鍏�)" - prop="contractAmount" - show-overflow-tooltip - :formatter="formattedNumber" - /> - <el-table-column - label="宸插紑绁ㄩ噾棰�(鍏�)" - prop="receiptPaymentAmount" - show-overflow-tooltip - :formatter="formattedNumber" - /> - <el-table-column - label="寰呭紑绁ㄩ噾棰�(鍏�)" - prop="unReceiptPaymentAmount" - show-overflow-tooltip - :formatter="formattedNumber" - /> - <!-- <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center"> - <template #default="scope"> - <el-button link type="primary" size="small" @click="openForm('edit', scope.row);">缂栬緫</el-button> - </template> - </el-table-column> --> - </el-table> - <pagination - v-show="total > 0" - :total="total" - layout="total, sizes, prev, pager, next, jumper" - :page="page.current" - :limit="page.size" - @pagination="paginationChange" - /> - </div> - <el-dialog - v-model="dialogFormVisible" - :title="operationType === 'add' ? '鏂板鏉ョエ鐧昏' : '缂栬緫鏉ョエ鐧昏'" - width="80%" - @close="closeDia" - > - <el-form - :model="form" - label-width="140px" - label-position="top" - :rules="rules" - ref="formRef" - > - <el-row :gutter="30"> - <el-col :span="12"> - <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseLedgerNo"> - <el-input v-model="form.purchaseLedgerNo" disabled /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo"> - <el-input - v-model="form.salesContractNo" - placeholder="鑷姩濉厖" - clearable - disabled - /> - </el-form-item> - </el-col> - </el-row> - <el-row :gutter="30"> - <el-col :span="12"> - <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName"> - <el-input - v-model="form.supplierName" - placeholder="鑷姩濉厖" - clearable - disabled - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName"> - <el-input - v-model="form.projectName" - placeholder="鑷姩濉厖" - clearable - disabled - /> - </el-form-item> - </el-col> - </el-row> - <el-row :gutter="30"> - <el-col :span="12"> - <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber"> - <el-input - v-model="form.invoiceNumber" - placeholder="璇疯緭鍏�" - clearable - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount"> - <el-input - type="number" - :step="0.01" - v-model="form.invoiceAmount" - placeholder="璇疯緭鍏�" - clearable - /> - </el-form-item> - </el-col> - </el-row> - <el-row :gutter="30"> - <el-col :span="12"> - <el-form-item label="褰曞叆浜猴細" prop="issUer"> - <el-input - v-model="form.issUer" - placeholder="璇疯緭鍏�" - clearable - disabled - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="issueDate"> - <el-date-picker - style="width: 100%" - v-model="form.issueDate" - type="date" - clearable - /> - </el-form-item> - </el-col> - </el-row> - <!-- <el-row :gutter="30"> - <el-col :span="12"> - <el-form-item label="褰曞叆鏃ユ湡锛�" prop="createTime"> - <el-date-picker - style="width: 100%" - v-model="form.createTime" - type="date" - placeholder="璇烽�夋嫨" - clearable - /> - </el-form-item> - </el-col> - </el-row> --> - <el-row> - <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate"> </el-form-item> - </el-row> - <el-table - :data="productData" - border - @selection-change="productSelected" - show-summary - style="width: 100%" - :summary-method="summarizeChildrenTable" - > - <el-table-column - align="center" - label="搴忓彿" - type="index" - width="60" - /> - <el-table-column label="浜у搧澶х被" prop="productCategory" /> - <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" /> - <el-table-column label="鍗曚綅" prop="unit" width="70" /> - <el-table-column label="鏁伴噺" prop="quantity" width="70" /> - <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" /> - <el-table-column label="褰曞叆鏃ユ湡" prop="createTime" width="120" /> - <el-table-column - label="鍚◣鍗曚环(鍏�)" - width="150" - prop="taxInclusiveUnitPrice" - :formatter="formattedNumber" - /> - <el-table-column - label="鍚◣鎬讳环(鍏�)" - width="150" - prop="taxInclusiveTotalPrice" - :formatter="formattedNumber" - /> - <el-table-column - label="涓嶅惈绋庢�讳环(鍏�)" - width="150" - prop="taxExclusiveTotalPrice" - :formatter="formattedNumber" - /> - <el-table-column label="鏈鏉ョエ鏁�" prop="ticketsNum" width="170"> - <template #default="scope"> - <el-input-number - v-model="scope.row.ticketsNum" - placeholder="璇烽�夋嫨" - :min="0" - :step="0.1" - clearable - style="width: 100%" - @change="invoiceNumBlur(scope.row)" - /> - </template> - </el-table-column> - <el-table-column - label="鏈鏉ョエ閲戦(鍏�)" - prop="ticketsAmount" - :min="0" - :step="0.1" - :formatter="formattedNumber" - @change="invoiceAmountBlur" - width="170" - > - <template #default="scope"> - <el-input-number - v-model="scope.row.ticketsAmount" - placeholder="璇烽�夋嫨" - :min="0" - :step="0.1" - clearable - style="width: 100%" - @change="invoiceAmountBlur(scope.row)" - /> - </template> - </el-table-column> - <el-table-column - label="鏈潵绁ㄦ暟" - prop="futureTickets" - :=" - (row) => - row.futureTickets == null || row.futureTickets === '' - ? row.quantity - : row.futureTickets - " - > - </el-table-column> - <el-table-column - label="鏈潵绁ㄩ噾棰�(鍏�)" - prop="futureTicketsAmount" - :formatter=" - (row) => - row.futureTicketsAmount !== undefined && - row.futureTicketsAmount !== null && - row.futureTicketsAmount !== '' - ? row.futureTicketsAmount - : row.taxExclusiveTotalPrice - " - > - </el-table-column> - </el-table> - </el-form> - <template #footer> - <div class="dialog-footer"> - <el-button type="primary" @click="submitForm">纭</el-button> - <el-button @click="closeDia">鍙栨秷</el-button> + <div class="actions"> + <div></div> + <div> + <el-button type="primary" @click="handleAdd('add')"> + 鏂板鐧昏 + </el-button> + <el-button @click="handleOut">瀵煎嚭</el-button> + <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button> </div> - </template> - </el-dialog> + </div> + <PIMTable + rowKey="id" + :column="columns" + :tableData="dataList" + :tableLoading="loading" + :isSelection="true" + :page="{ + current: pagination.currentPage, + size: pagination.pageSize, + total: pagination.total, + }" + :expand-row-keys="expandRowKeys" + @expand-change="expandChange" + @selection-change="handleSelectionChange" + > + <template #expand="{ row }"> + <ExpandTable ref="expandTableRef" /> + </template> + <template #operation="{ row }"> + <el-button + text + type="primary" + size="small" + @click="handleEdit('edit', row.id)" + > + 缂栬緫 + </el-button> + </template> + </PIMTable> + </div> + <Modal ref="modalRef"></Modal> </div> </template> <script setup> -import pagination from "@/components/PIMTable/Pagination.vue"; -import { ref } from "vue"; -import { ElMessageBox } from "element-plus"; -import { userListNoPage } from "@/api/system/user.js"; -import { productList } from "@/api/procurementManagement/procurementLedger.js"; -import useUserStore from "@/store/modules/user"; -const userStore = useUserStore(); +import { usePaginationApi } from "@/hooks/usePaginationApi"; +import { gePurchaseListPage } from "@/api/procurementManagement/invoiceEntry.js"; +import { nextTick, onMounted, getCurrentInstance } from "vue"; +import ExpandTable from "./components/ExpandTable.vue"; +import Modal from "./components/Modal.vue"; + +defineOptions({ + name: "鏉ョエ鐧昏", +}); + const { proxy } = getCurrentInstance(); -const tableData = ref([]); -const productData = ref([]); +const expandRowKeys = ref([]); +const expandTableRef = ref(); +const modalRef = ref(); const selectedRows = ref([]); -const productSelectedRows = ref([]); -const userList = ref([]); -const purchaseLedgerList = ref([]); -const tableLoading = ref(false); -const page = reactive({ - current: 1, - size: 100, -}); -const total = ref(0); -const fileList = ref([]); -import { - addOrUpdateRegistration, - delRegistration, + +const { + loading, + filters, + columns, + dataList, + pagination, + getTableData, + resetFilters, +} = usePaginationApi( gePurchaseListPage, - getInfo, - getProduct, - getPurchaseNoById, - getRegistrationById, -} from "@/api/procurementManagement/invoiceEntry.js"; + { + purchaseContractNumber: undefined, + }, + [ + { + type: "expand", + dataType: "slot", + slot: "expand", + }, + { + label: "閿�鍞悎鍚屽彿", + prop: "salesContractNo", + }, + { + label: "渚涘簲鍟嗗悕绉�", + prop: "supplierName", + }, + { + label: "椤圭洰鍚嶇О", + prop: "projectName", + }, + { + label: "鍚堝悓閲戦(鍏�)", + prop: "contractAmount", + formatData: (val) => { + return parseFloat(val).toFixed(2) ?? 0; + }, + }, + { + label: "宸插紑绁ㄩ噾棰�(鍏�)", + prop: "receiptPaymentAmount", + formatData: (val) => { + return parseFloat(val).toFixed(2) ?? 0; + }, + }, + { + label: "寰呭紑绁ㄩ噾棰�(鍏�)", + prop: "unReceiptPaymentAmount", + formatData: (val) => { + return parseFloat(val).toFixed(2) ?? 0; + }, + }, + // { + // fixed: "right", + // label: "鎿嶄綔", + // dataType: "slot", + // slot: "operation", + // align: "center", + // width: "200px", + // }, + ] +); -// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁 -const operationType = ref(""); -const dialogFormVisible = ref(false); -const data = reactive({ - searchForm: { - purchaseContractNumber: "", - }, - form: { - issueDate: "", // 寮�绁ㄦ棩鏈� - purchaseLedgerId: "", - purchaseLedgerNo: "", - issUerId: "", // 寮�绁ㄤ汉id - issUer: "", // 寮�绁ㄤ汉濮撳悕 - invoiceNumber: "", // 鍙戠エ鍙� - invoiceAmount: "", // 鍙戠エ閲戦 - createTime: "", // 褰曞叆鏃ユ湡 - }, - rules: { - invoiceNumber: [ - { required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿", trigger: "blur" }, - { type: "string" }, - ], - invoiceAmount: [ - { required: true, message: "璇疯緭鍏ュ彂绁ㄩ噾棰�", trigger: "blur" }, - ], - }, -}); -const { searchForm, form, rules } = toRefs(data); -// 浜у搧琛ㄥ崟寮规鏁版嵁 -const productFormVisible = ref(false); -const productOperationType = ref(""); -const currentId = ref(""); - -// 鏌ヨ鍒楄〃 -/** 鎼滅储鎸夐挳鎿嶄綔 */ -const handleQuery = () => { - page.current = 1; - getList(); -}; -const paginationChange = (obj) => { - page.current = obj.page; - page.size = obj.limit; - getList(); -}; -const getList = () => { - tableLoading.value = true; - gePurchaseListPage({ ...searchForm.value, ...page }) - .then((res) => { - tableLoading.value = false; - tableData.value = res.records; - tableData.value.map((item) => { - item.children = []; - }); - total.value = res.total; - expandedRowKeys.value = []; - }) - .catch(() => { - tableLoading.value = false; - }); -}; -const formattedNumber = (row, column, cellValue) => { - return parseFloat(cellValue).toFixed(2); -}; -// 琛ㄦ牸閫夋嫨鏁版嵁 const handleSelectionChange = (selection) => { selectedRows.value = selection.filter( (item) => item.purchaseContractNumber !== undefined ); }; -const productSelected = (selectedRows) => { - productSelectedRows.value = selectedRows; -}; -const expandedRowKeys = ref([]); -// 灞曞紑琛� -const expandChange = (row, expandedRows) => { - if (expandedRows.length > 0) { - expandedRowKeys.value = []; - try { - productList({ salesLedgerId: row.id, type: 2 }).then((res) => { - const index = tableData.value.findIndex((item) => item.id === row.id); - if (index > -1) { - tableData.value[index].children = res; - } - expandedRowKeys.value.push(row.id); - }); - } catch (error) { - console.log(error); - } - } else { - expandedRowKeys.value = []; - } -}; -// 涓昏〃鍚堣鏂规硶 -const summarizeMainTable = (param) => { - return proxy.summarizeTable( - param, - ["contractAmount", "receiptPaymentAmount", "unReceiptPaymentAmount"], - { - ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁� - futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁� - } - ); -}; -// 瀛愯〃鍚堣鏂规硶 -const summarizeChildrenTable = (param) => { - return proxy.summarizeTable( - param, - [ - "taxInclusiveUnitPrice", - "taxInclusiveTotalPrice", - "taxExclusiveTotalPrice", - "ticketsNum", - "ticketsAmount", - "futureTickets", - "futureTicketsAmount", - ], - { - ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁� - futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁� - } - ); -}; -const handleAdd = () => { +const handleAdd = (type) => { if (selectedRows.value.length !== 1) { proxy.$modal.msgWarning("璇峰厛閫変腑涓�鏉℃暟鎹�"); return; } - openForm("add", selectedRows.value[0]); + modalRef.value.open(type, selectedRows.value[0].id); }; -// 鎵撳紑寮规 -const openForm = (type, row) => { - invoiceNumBlur(row); - operationType.value = type; - form.value = {}; - productData.value = []; - fileList.value = []; - form.value.issUerId = userStore.id; - form.value.issUer = userStore.name; - form.value.issueDate = getNowFormatDate(); - userListNoPage().then((res) => { - userList.value = res.data; - }); - // 鏂板鏃朵紶鍏ュ綋鍓嶈id骞舵煡璇㈤噰璐悎鍚屽彿 - if (type === "add" && row && row.id) { - form.value.purchaseLedgerId = row.id; - getPurchaseNoById({ id: row.id }).then((res) => { - let result = res.data; - (purchaseLedgerList.value = result), - (form.value.purchaseLedgerNo = result.purchaseContractNumber); - form.value.invoiceAmount = result.invoiceAmount; - form.value.invoiceNumber = result.invoiceNumber; - setInfo(result.id); - }); - } else { - getProduct().then((res) => { - purchaseLedgerList.value = res; - }); - } - if (type === "edit") { - currentId.value = row.id; - getRegistrationById({ id: row.id }).then((res) => { - form.value = { ...res }; - productData.value = form.value.productData; - if (form.value.salesLedgerFiles) { - fileList.value = form.value.salesLedgerFiles; - } else { - fileList.value = []; - } - }); - } - dialogFormVisible.value = true; -}; -// 閫夋嫨閲囪喘鍚堝悓鍙疯祴鍊� -const setInfo = (value) => { - getInfo({ id: value }).then((res) => { - let result = res.data; - form.value.salesContractNo = result.salesContractNo; - form.value.projectName = result.projectName; - productData.value = result.productData; - form.value.supplierName = result.supplierName; - }); -}; -// 鎻愪氦琛ㄥ崟 -const submitForm = () => { - proxy.$refs["formRef"].validate((valid) => { - if (valid) { - form.value.productData = proxy.HaveJson(productData.value); - addOrUpdateRegistration(form.value).then((res) => { - proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); - closeDia(); - getList(); - }); - } - }); -}; -// 鍏抽棴寮规 -const closeDia = () => { - proxy.resetForm("formRef"); - dialogFormVisible.value = false; -}; -// 瀵煎嚭 -const handleOut = () => { - ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", { - confirmButtonText: "纭", - cancelButtonText: "鍙栨秷", - type: "warning", - }) - .then(() => { - proxy.download("/purchase/registration/export", {}, "鏉ョエ鐧昏.xlsx"); - }) - .catch(() => { - proxy.$modal.msg("宸插彇娑�"); - }); -}; -// 鍒犻櫎 -const handleDelete = () => { - let ids = []; - if (selectedRows.value.length > 0) { - ids = selectedRows.value.map((item) => item.id); - } else { - proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁"); - return; - } - ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", { - confirmButtonText: "纭", - cancelButtonText: "鍙栨秷", - type: "warning", - }) - .then(() => { - delRegistration(ids).then((res) => { - proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛"); - getList(); - }); - }) - .catch(() => { - proxy.$modal.msg("宸插彇娑�"); - }); -}; -//鏈鏉ョエ鏁板け鐒︽搷浣� -const invoiceNumBlur = (row) => { - if (!row.ticketsNum || row.ticketsNum === "") { - row.ticketsNum = 0; - } - if (Number(row.ticketsNum) > Number(row.tempFutureTickets)) { - proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟"); - row.ticketsNum = 0; - return; - } - // 璁$畻鏈鏉ョエ閲戦 - row.ticketsAmount = row.ticketsNum * row.taxInclusiveUnitPrice; - // 璁$畻鏈潵绁ㄦ暟 - row.futureTickets = row.tempFutureTickets - row.ticketsNum; - // 璁$畻鏈潵绁ㄩ噾棰� - row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount; - calculateinvoiceAmount(); -}; -// 鏈鏉ョエ閲戦澶辩劍鎿嶄綔 -const invoiceAmountBlur = (row) => { - if (!row.ticketsAmount) { - row.ticketsAmount = 0; - } - // 璁$畻鏄惁瓒呰繃鏉ョエ鎬婚噾棰� - if (row.ticketsAmount > row.tempFutureTicketsAmount) { - proxy.$modal.msgWarning("鏈鏉ョエ閲戦涓嶅緱澶т簬鏈潵绁ㄩ噾棰�"); - row.ticketsAmount = 0; - } - // 璁$畻鏈鏉ョエ鏁� - row.ticketsNum = (row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(2); - // 璁$畻鏈潵绁ㄦ暟 - row.futureTickets = row.tempFutureTickets - row.ticketsNum; - // 璁$畻鏈潵绁ㄩ噾棰� - row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount; - calculateinvoiceAmount(); +const handleEdit = (type, id) => { + modalRef.value.open(type, id); }; -// 鑾峰彇褰撳墠鏃ユ湡鍑芥暟 -function getNowFormatDate() { - let date = new Date(), - year = date.getFullYear(), //鑾峰彇瀹屾暣鐨勫勾浠�(4浣�) - month = date.getMonth() + 1, //鑾峰彇褰撳墠鏈堜唤(0-11,0浠h〃1鏈�) - strDate = date.getDate(); // 鑾峰彇褰撳墠鏃�(1-31) - if (month < 10) month = `0${month}`; // 濡傛灉鏈堜唤鏄釜浣嶆暟锛屽湪鍓嶉潰琛�0 - if (strDate < 10) strDate = `0${strDate}`; // 濡傛灉鏃ユ槸涓綅鏁帮紝鍦ㄥ墠闈㈣ˉ0 - return `${year}-${month}-${strDate}`; -} +const handleOut = () => {}; +const handleDelete = () => {}; -function calculateinvoiceAmount() { - console.log("productData", productData.value); - var invoiceAmountTotal = 0; - productData.value.forEach((item) => { - if (item.ticketsAmount) { - invoiceAmountTotal += item.ticketsAmount; - } - }); - form.value.invoiceAmount = invoiceAmountTotal.toFixed(2); -} +const expandChange = async (row, expandedRows) => { + await nextTick(); + expandTableRef.value.getList(row.id); +}; -getList(); +onMounted(() => { + getTableData(); +}); </script> -<style scoped lang="scss"></style> +<style lang="scss" scoped> +.table_list { + margin-top: unset; +} +.actions { + display: flex; + justify-content: space-between; + margin-bottom: 10px; +} +</style> diff --git a/src/views/procurementManagement/invoiceEntry/indexOld.vue b/src/views/procurementManagement/invoiceEntry/indexOld.vue new file mode 100644 index 0000000..60d5124 --- /dev/null +++ b/src/views/procurementManagement/invoiceEntry/indexOld.vue @@ -0,0 +1,725 @@ +<template> + <div class="app-container"> + <div class="search_form"> + <div> + <span class="search_title">閲囪喘鍚堝悓鍙凤細</span> + <el-input + v-model="searchForm.purchaseContractNumber" + style="width: 240px" + placeholder="璇疯緭鍏�" + @change="handleQuery" + clearable + prefix-icon="Search" + /> + <el-button + type="primary" + @click="handleQuery" + style="margin-left: 10px" + > + 鎼滅储 + </el-button> + </div> + <div> + <el-button type="primary" @click="handleAdd">鏂板鐧昏</el-button> + <el-button @click="handleOut">瀵煎嚭</el-button> + <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button> + </div> + </div> + <div class="table_list"> + <el-table + :data="tableData" + border + v-loading="tableLoading" + @selection-change="handleSelectionChange" + :expand-row-keys="expandedRowKeys" + :row-key="(row) => row.id" + show-summary + :summary-method="summarizeMainTable" + @expand-change="expandChange" + height="calc(100vh - 18.5em)" + > + <el-table-column align="center" type="selection" width="55" /> + <el-table-column type="expand"> + <template #default="props"> + <el-table + :data="props.row.children" + border + show-summary + :summary-method="summarizeChildrenTable" + > + <el-table-column + align="center" + label="搴忓彿" + type="index" + width="60" + /> + <el-table-column label="浜у搧澶х被" prop="productCategory" /> + <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" /> + <el-table-column label="鍗曚綅" prop="unit" /> + <el-table-column label="鏁伴噺" prop="quantity" /> + <el-table-column label="绋庣巼(%)" prop="taxRate" /> + <el-table-column + label="鍚◣鍗曚环(鍏�)" + prop="taxInclusiveUnitPrice" + :formatter="formattedNumber" + /> + <el-table-column + label="鍚◣鎬讳环(鍏�)" + prop="taxInclusiveTotalPrice" + :formatter="formattedNumber" + /> + <el-table-column + label="涓嶅惈绋庢�讳环(鍏�)" + prop="taxExclusiveTotalPrice" + :formatter="formattedNumber" + /> + <el-table-column label="鏈鏉ョエ鏁�" prop="ticketsNum" /> + <el-table-column + label="鏈鏉ョエ閲戦(鍏�)" + prop="ticketsAmount" + :formatter="formattedNumber" + /> + <el-table-column label="鏈潵绁ㄦ暟" prop="futureTickets" /> + <el-table-column + label="鏈潵绁ㄩ噾棰�(鍏�)" + prop="futureTicketsAmount" + :formatter="formattedNumber" + /> + </el-table> + </template> + </el-table-column> + <el-table-column align="center" label="搴忓彿" type="index" width="60" /> + <el-table-column + label="閲囪喘鍚堝悓鍙�" + prop="purchaseContractNumber" + show-overflow-tooltip + /> + <el-table-column + label="閿�鍞悎鍚屽彿" + prop="salesContractNo" + show-overflow-tooltip + /> + <el-table-column + label="渚涘簲鍟嗗悕绉�" + prop="supplierName" + show-overflow-tooltip + /> + <el-table-column + label="椤圭洰鍚嶇О" + prop="projectName" + show-overflow-tooltip + /> + <el-table-column + label="鍚堝悓閲戦(鍏�)" + prop="contractAmount" + show-overflow-tooltip + :formatter="formattedNumber" + /> + <el-table-column + label="宸插紑绁ㄩ噾棰�(鍏�)" + prop="receiptPaymentAmount" + show-overflow-tooltip + :formatter="formattedNumber" + /> + <el-table-column + label="寰呭紑绁ㄩ噾棰�(鍏�)" + prop="unReceiptPaymentAmount" + show-overflow-tooltip + :formatter="formattedNumber" + /> + <el-table-column + fixed="right" + label="鎿嶄綔" + min-width="60" + align="center" + > + <template #default="scope"> + <el-button + text + type="primary" + size="small" + @click="openForm('edit', scope.row)" + > + 缂栬緫 + </el-button> + </template> + </el-table-column> + </el-table> + <pagination + v-show="total > 0" + :total="total" + layout="total, sizes, prev, pager, next, jumper" + :page="page.current" + :limit="page.size" + @pagination="paginationChange" + /> + </div> + <el-dialog + v-model="dialogFormVisible" + :title="operationType === 'add' ? '鏂板鏉ョエ鐧昏' : '缂栬緫鏉ョエ鐧昏'" + width="80%" + @close="closeDia" + > + <el-form + :model="form" + label-width="140px" + label-position="top" + :rules="rules" + ref="formRef" + > + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseLedgerNo"> + <el-input v-model="form.purchaseLedgerNo" disabled /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo"> + <el-input + v-model="form.salesContractNo" + placeholder="鑷姩濉厖" + clearable + disabled + /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName"> + <el-input + v-model="form.supplierName" + placeholder="鑷姩濉厖" + clearable + disabled + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName"> + <el-input + v-model="form.projectName" + placeholder="鑷姩濉厖" + clearable + disabled + /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber"> + <el-input + v-model="form.invoiceNumber" + placeholder="璇疯緭鍏�" + clearable + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount"> + <el-input + type="number" + :step="0.01" + v-model="form.invoiceAmount" + placeholder="鑷姩濉厖" + clearable + :disabled="true" + /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="褰曞叆浜猴細" prop="issUer"> + <el-input + v-model="form.issUer" + placeholder="璇疯緭鍏�" + clearable + disabled + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="issueDate"> + <el-date-picker + style="width: 100%" + v-model="form.issueDate" + type="date" + clearable + /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="涓婁紶闄勪欢"> + <FileUpload :showTip="false" accept="*" :autoUpload="true" /> + </el-form-item> + </el-col> + </el-row> + <!-- <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="褰曞叆鏃ユ湡锛�" prop="createTime"> + <el-date-picker + style="width: 100%" + v-model="form.createTime" + type="date" + placeholder="璇烽�夋嫨" + clearable + /> + </el-form-item> + </el-col> + </el-row> --> + <el-row> + <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate"> </el-form-item> + </el-row> + <el-table + :data="productData" + border + @selection-change="productSelected" + show-summary + style="width: 100%" + :summary-method="summarizeChildrenTable" + > + <el-table-column + align="center" + label="搴忓彿" + type="index" + width="60" + /> + <el-table-column label="浜у搧澶х被" prop="productCategory" /> + <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" /> + <el-table-column label="鍗曚綅" prop="unit" width="70" /> + <el-table-column label="鏁伴噺" prop="quantity" width="70" /> + <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" /> + <el-table-column label="褰曞叆鏃ユ湡" prop="createTime" width="120" /> + <el-table-column + label="鍚◣鍗曚环(鍏�)" + width="150" + prop="taxInclusiveUnitPrice" + :formatter="formattedNumber" + /> + <el-table-column + label="鍚◣鎬讳环(鍏�)" + width="150" + prop="taxInclusiveTotalPrice" + :formatter="formattedNumber" + /> + <el-table-column + label="涓嶅惈绋庢�讳环(鍏�)" + width="150" + prop="taxExclusiveTotalPrice" + :formatter="formattedNumber" + /> + <el-table-column label="鏈鏉ョエ鏁�" prop="ticketsNum" width="170"> + <template #default="scope"> + <el-input-number + v-model="scope.row.ticketsNum" + placeholder="璇烽�夋嫨" + :min="0" + :step="0.1" + clearable + style="width: 100%" + @change="invoiceNumBlur(scope.row)" + /> + </template> + </el-table-column> + <el-table-column + label="鏈鏉ョエ閲戦(鍏�)" + prop="ticketsAmount" + :min="0" + :step="0.1" + :formatter="formattedNumber" + width="170" + > + <template #default="scope"> + <el-input-number + v-model="scope.row.ticketsAmount" + placeholder="璇烽�夋嫨" + :min="0" + :step="0.1" + clearable + style="width: 100%" + @change="invoiceAmountBlur(scope.row)" + /> + </template> + </el-table-column> + <el-table-column + label="鏈潵绁ㄦ暟" + prop="futureTickets" + :formatter=" + (row) => + row.futureTickets == null || row.futureTickets === '' + ? row.quantity + : row.futureTickets + " + > + </el-table-column> + <el-table-column + label="鏈潵绁ㄩ噾棰�(鍏�)" + prop="futureTicketsAmount" + :formatter=" + (row) => + row.futureTicketsAmount !== undefined && + row.futureTicketsAmount !== null && + row.futureTicketsAmount !== '' + ? row.futureTicketsAmount + : row.taxExclusiveTotalPrice + " + > + </el-table-column> + </el-table> + </el-form> + <template #footer> + <div class="dialog-footer"> + <el-button type="primary" @click="submitForm">纭</el-button> + <el-button @click="closeDia">鍙栨秷</el-button> + </div> + </template> + </el-dialog> + </div> +</template> + +<script setup> +import pagination from "@/components/PIMTable/Pagination.vue"; +import { onMounted, ref } from "vue"; +import { ElMessageBox } from "element-plus"; +import { userListNoPage } from "@/api/system/user.js"; +import { productList } from "@/api/procurementManagement/procurementLedger.js"; +import useUserStore from "@/store/modules/user"; +import FileUpload from "@/components/Upload/FileUpload.vue"; + +const userStore = useUserStore(); +const { proxy } = getCurrentInstance(); +const tableData = ref([]); +const productData = ref([]); +const selectedRows = ref([]); +const productSelectedRows = ref([]); +const userList = ref([]); +const purchaseLedgerList = ref([]); +const tableLoading = ref(false); +const page = reactive({ + current: 1, + size: 100, +}); +const total = ref(0); +const fileList = ref([]); +import { + addOrUpdateRegistration, + delRegistration, + gePurchaseListPage, + getInfo, + getProduct, + getPurchaseNoById, + getRegistrationById, +} from "@/api/procurementManagement/invoiceEntry.js"; + +// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁 +const operationType = ref(""); +const dialogFormVisible = ref(false); +const data = reactive({ + searchForm: { + purchaseContractNumber: "", + }, + form: { + issueDate: "", // 寮�绁ㄦ棩鏈� + purchaseLedgerId: "", + purchaseLedgerNo: "", + issUerId: "", // 寮�绁ㄤ汉id + issUer: "", // 寮�绁ㄤ汉濮撳悕 + invoiceNumber: "", // 鍙戠エ鍙� + invoiceAmount: "", // 鍙戠エ閲戦 + createTime: "", // 褰曞叆鏃ユ湡 + }, + rules: { + invoiceNumber: [ + { required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿", trigger: "blur" }, + { type: "string" }, + ], + invoiceAmount: [ + { required: true, message: "璇疯緭鍏ュ彂绁ㄩ噾棰�", trigger: "blur" }, + ], + }, +}); +const { searchForm, form, rules } = toRefs(data); +// 浜у搧琛ㄥ崟寮规鏁版嵁 +const productFormVisible = ref(false); +const productOperationType = ref(""); +const currentId = ref(""); + +// 鏌ヨ鍒楄〃 +/** 鎼滅储鎸夐挳鎿嶄綔 */ +const handleQuery = () => { + page.current = 1; + getList(); +}; +const paginationChange = (obj) => { + page.current = obj.page; + page.size = obj.limit; + getList(); +}; +const getList = () => { + tableLoading.value = true; + gePurchaseListPage({ ...searchForm.value, ...page }) + .then((res) => { + tableLoading.value = false; + tableData.value = res.records; + tableData.value.map((item) => { + item.children = []; + }); + total.value = res.total; + expandedRowKeys.value = []; + }) + .catch(() => { + tableLoading.value = false; + }); +}; +const formattedNumber = (row, column, cellValue) => { + return parseFloat(cellValue).toFixed(2) ?? 0; +}; +// 琛ㄦ牸閫夋嫨鏁版嵁 +const handleSelectionChange = (selection) => { + selectedRows.value = selection.filter( + (item) => item.purchaseContractNumber !== undefined + ); +}; +const productSelected = (selectedRows) => { + productSelectedRows.value = selectedRows; +}; +const expandedRowKeys = ref([]); +// 灞曞紑琛� +const expandChange = (row, expandedRows) => { + if (expandedRows.length > 0) { + expandedRowKeys.value = []; + try { + productList({ salesLedgerId: row.id, type: 2 }).then((res) => { + const index = tableData.value.findIndex((item) => item.id === row.id); + if (index > -1) { + tableData.value[index].children = res; + } + expandedRowKeys.value.push(row.id); + }); + } catch (error) { + console.log(error); + } + } else { + expandedRowKeys.value = []; + } +}; +// 涓昏〃鍚堣鏂规硶 +const summarizeMainTable = (param) => { + return proxy.summarizeTable( + param, + ["contractAmount", "receiptPaymentAmount", "unReceiptPaymentAmount"], + { + ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁� + futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁� + } + ); +}; +// 瀛愯〃鍚堣鏂规硶 +const summarizeChildrenTable = (param) => { + return proxy.summarizeTable( + param, + [ + "taxInclusiveUnitPrice", + "taxInclusiveTotalPrice", + "taxExclusiveTotalPrice", + "ticketsNum", + "ticketsAmount", + "futureTickets", + "futureTicketsAmount", + ], + { + ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁� + futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁� + } + ); +}; + +const handleAdd = () => { + if (selectedRows.value.length !== 1) { + proxy.$modal.msgWarning("璇峰厛閫変腑涓�鏉℃暟鎹�"); + return; + } + openForm("add", selectedRows.value[0]); +}; + +// 鎵撳紑寮规 +const openForm = (type, row) => { + invoiceNumBlur(row); + operationType.value = type; + form.value = {}; + productData.value = []; + fileList.value = []; + form.value.issUerId = userStore.id; + form.value.issUer = userStore.name; + form.value.issueDate = getNowFormatDate(); + userListNoPage().then((res) => { + userList.value = res.data; + }); + // 鏂板鏃朵紶鍏ュ綋鍓嶈id骞舵煡璇㈤噰璐悎鍚屽彿 + if (type === "add" && row && row.id) { + form.value.purchaseLedgerId = row.id; + getPurchaseNoById({ id: row.id }).then((res) => { + let result = res.data; + purchaseLedgerList.value = result; + form.value.purchaseLedgerNo = result.purchaseContractNumber; + form.value.invoiceAmount = result.invoiceAmount; + form.value.invoiceNumber = result.invoiceNumber; + setInfo(result.id); + }); + } else { + getProduct().then((res) => { + purchaseLedgerList.value = res; + }); + } + if (type === "edit") { + currentId.value = row.id; + getRegistrationById({ id: row.id }).then((res) => { + const { code, data } = res; + if (code == 200) { + form.value.invoiceAmount = data.invoiceAmount; + productData.value = data.productData; + if (data.salesLedgerFiles) { + fileList.value = data.salesLedgerFiles; + } else { + fileList.value = []; + } + } + }); + } + dialogFormVisible.value = true; +}; +// 閫夋嫨閲囪喘鍚堝悓鍙疯祴鍊� +const setInfo = (value) => { + getInfo({ id: value }).then((res) => { + let result = res.data; + form.value.salesContractNo = result.salesContractNo; + form.value.projectName = result.projectName; + productData.value = result.productData; + form.value.supplierName = result.supplierName; + }); +}; +// 鎻愪氦琛ㄥ崟 +const submitForm = () => { + proxy.$refs["formRef"].validate((valid) => { + if (valid) { + form.value.productData = proxy.HaveJson(productData.value); + addOrUpdateRegistration(form.value).then((res) => { + proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); + closeDia(); + getList(); + }); + } + }); +}; +// 鍏抽棴寮规 +const closeDia = () => { + proxy.resetForm("formRef"); + dialogFormVisible.value = false; +}; +// 瀵煎嚭 +const handleOut = () => { + ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", { + confirmButtonText: "纭", + cancelButtonText: "鍙栨秷", + type: "warning", + }) + .then(() => { + proxy.download("/purchase/registration/export", {}, "鏉ョエ鐧昏.xlsx"); + }) + .catch(() => { + proxy.$modal.msg("宸插彇娑�"); + }); +}; +// 鍒犻櫎 +const handleDelete = () => { + let ids = []; + if (selectedRows.value.length > 0) { + ids = selectedRows.value.map((item) => item.id); + } else { + proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁"); + return; + } + ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", { + confirmButtonText: "纭", + cancelButtonText: "鍙栨秷", + type: "warning", + }) + .then(() => { + delRegistration(ids).then((res) => { + proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + getList(); + }); + }) + .catch(() => { + proxy.$modal.msg("宸插彇娑�"); + }); +}; +//鏈鏉ョエ鏁板け鐒︽搷浣� +const invoiceNumBlur = (row) => { + if (!row.ticketsNum || row.ticketsNum === "") { + row.ticketsNum = 0; + } + if (Number(row.ticketsNum) > Number(row.tempFutureTickets)) { + proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟"); + row.ticketsNum = 0; + return; + } + // 璁$畻鏈鏉ョエ閲戦 + row.ticketsAmount = row.ticketsNum * row.taxInclusiveUnitPrice; + // 璁$畻鏈潵绁ㄦ暟 + row.futureTickets = row.tempFutureTickets - row.ticketsNum; + // 璁$畻鏈潵绁ㄩ噾棰� + row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount; + calculateinvoiceAmount(); +}; +// 鏈鏉ョエ閲戦澶辩劍鎿嶄綔 +const invoiceAmountBlur = (row) => { + if (!row.ticketsAmount) { + row.ticketsAmount = 0; + } + // 璁$畻鏄惁瓒呰繃鏉ョエ鎬婚噾棰� + if (row.ticketsAmount > row.tempFutureTicketsAmount) { + proxy.$modal.msgWarning("鏈鏉ョエ閲戦涓嶅緱澶т簬鏈潵绁ㄩ噾棰�"); + row.ticketsAmount = 0; + } + // 璁$畻鏈鏉ョエ鏁� + row.ticketsNum = (row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(2); + // 璁$畻鏈潵绁ㄦ暟 + row.futureTickets = row.tempFutureTickets - row.ticketsNum; + // 璁$畻鏈潵绁ㄩ噾棰� + row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount; + calculateinvoiceAmount(); +}; + +// 鑾峰彇褰撳墠鏃ユ湡鍑芥暟 +function getNowFormatDate() { + let date = new Date(), + year = date.getFullYear(), //鑾峰彇瀹屾暣鐨勫勾浠�(4浣�) + month = date.getMonth() + 1, //鑾峰彇褰撳墠鏈堜唤(0-11,0浠h〃1鏈�) + strDate = date.getDate(); // 鑾峰彇褰撳墠鏃�(1-31) + if (month < 10) month = `0${month}`; // 濡傛灉鏈堜唤鏄釜浣嶆暟锛屽湪鍓嶉潰琛�0 + if (strDate < 10) strDate = `0${strDate}`; // 濡傛灉鏃ユ槸涓綅鏁帮紝鍦ㄥ墠闈㈣ˉ0 + return `${year}-${month}-${strDate}`; +} + +function calculateinvoiceAmount() { + console.log("productData", productData.value); + var invoiceAmountTotal = 0; + productData.value.forEach((item) => { + if (item.ticketsAmount) { + invoiceAmountTotal += item.ticketsAmount; + } + }); + form.value.invoiceAmount = invoiceAmountTotal.toFixed(2); +} + +onMounted(() => { + getList(); +}); +</script> + +<style scoped lang="scss"></style> diff --git a/src/views/procurementManagement/paymentEntry/index.vue b/src/views/procurementManagement/paymentEntry/index.vue index 59faa6d..3dc9bb7 100644 --- a/src/views/procurementManagement/paymentEntry/index.vue +++ b/src/views/procurementManagement/paymentEntry/index.vue @@ -62,13 +62,14 @@ </div> <div class="table_list"> <PIMTable + rowKey="id" :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true" :isShowSummary="isShowSummarySon" :summaryMethod="summarizeMainTable1" - :handleSelectionChange="handleSelectionChange" + @selection-change="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination" :total="total" diff --git a/src/views/procurementManagement/paymentHistory/index.vue b/src/views/procurementManagement/paymentHistory/index.vue index aa64726..58e5f92 100644 --- a/src/views/procurementManagement/paymentHistory/index.vue +++ b/src/views/procurementManagement/paymentHistory/index.vue @@ -36,13 +36,14 @@ </el-form> <div class="table_list"> <PIMTable + rowKey="id" :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true" :isShowSummary="isShowSummarySon" :summaryMethod="summarizeMainTable1" - :handleSelectionChange="handleSelectionChange" + @selection-change="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination" :total="total" diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue index 69a0947..665242c 100644 --- a/src/views/procurementManagement/paymentLedger/index.vue +++ b/src/views/procurementManagement/paymentLedger/index.vue @@ -79,6 +79,7 @@ <el-col :span="10"> <div class="table_list"> <PIMTable + rowKey="id" :column="tableColumnSon" :tableData="originalTableDataSon" :isSelection="false" diff --git a/src/views/procurementManagement/procurementInvoiceLedger/index.vue b/src/views/procurementManagement/procurementInvoiceLedger/index.vue index c0e11d6..d161978 100644 --- a/src/views/procurementManagement/procurementInvoiceLedger/index.vue +++ b/src/views/procurementManagement/procurementInvoiceLedger/index.vue @@ -42,23 +42,22 @@ </el-form> <div class="table_list"> <PIMTable + rowKey="id" :column="columns" :tableLoading="loading" :tableData="dataList" :isSelection="true" + height="calc(100vh - 18.5em)" + :isShowSummary="true" + :summaryMethod="summarizeMainTable" :page="{ current: pagination.currentPage, size: pagination.pageSize, total: pagination.total, }" - :handleSelectionChange="handleSelectionChange" + @selection-change="handleSelectionChange" @pagination="onCurrentChange" > - <!-- <template #operation> - <el-button type="primary" text @click="handleEdit" size="small"> - 缂栬緫 - </el-button> - </template> --> </PIMTable> </div> </div> @@ -177,6 +176,23 @@ } ); +// 涓昏〃鍚堣鏂规硶 +const summarizeMainTable = (param) => { + return proxy.summarizeTable( + param, + [ + "taxInclusiveTotalPrice", + "ticketsAmount", + "unTicketsPrice", + "invoiceAmount", + ], + { + ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁� + futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁� + } + ); +}; + const handleSelectionChange = (val) => { multipleVal.value = val; }; diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue index 1086c81..5ac4a96 100644 --- a/src/views/procurementManagement/procurementLedger/index.vue +++ b/src/views/procurementManagement/procurementLedger/index.vue @@ -646,11 +646,11 @@ purchaseListPage({ ...searchForm.value, ...page }) .then((res) => { tableLoading.value = false; - tableData.value = res.records; + tableData.value = res.data.records; tableData.value.map((item) => { item.children = []; }); - total.value = res.total; + total.value = res.data.total; expandedRowKeys.value = []; }) .catch(() => { diff --git a/src/views/procurementManagement/thePaymentLedger/index.vue b/src/views/procurementManagement/thePaymentLedger/index.vue index 38fac3a..5fa9e6f 100644 --- a/src/views/procurementManagement/thePaymentLedger/index.vue +++ b/src/views/procurementManagement/thePaymentLedger/index.vue @@ -4,93 +4,98 @@ <div> <span class="search_title">渚涘簲鍟嗗悕绉�/鍚堝悓鍙凤細</span> <el-input - v-model="searchForm.supplierNameOrContractNo" - style="width: 240px" - placeholder="杈撳叆渚涘簲鍟嗗悕绉�/鍚堝悓鍙锋悳绱�" - @change="handleQuery" - clearable - :prefix-icon="Search" + v-model="searchForm.supplierNameOrContractNo" + style="width: 240px" + placeholder="杈撳叆渚涘簲鍟嗗悕绉�/鍚堝悓鍙锋悳绱�" + @change="handleQuery" + clearable + :prefix-icon="Search" /> - <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button> + <el-button type="primary" @click="handleQuery" style="margin-left: 10px" + >鎼滅储</el-button + > </div> </div> <div class="table_list"> - <PIMTable :column="tableColumn" :tableData="tableData" :page="page" - :tableLoading="tableLoading" @pagination="pagination" :total="total"></PIMTable> + <PIMTable + rowKey="id" + :column="tableColumn" + :tableData="tableData" + :page="page" + :tableLoading="tableLoading" + @pagination="pagination" + :total="total" + ></PIMTable> </div> </div> </template> <script setup> -import { ref } from 'vue' -import {Search} from "@element-plus/icons-vue"; -import { - registrationList, -} from "@/api/procurementManagement/paymentEntry.js"; +import { ref } from "vue"; +import { Search } from "@element-plus/icons-vue"; +import { registrationList } from "@/api/procurementManagement/paymentEntry.js"; const tableColumn = ref([ { - label: '浠樻鏃ユ湡', - prop: 'paymentDate', + label: "浠樻鏃ユ湡", + prop: "paymentDate", }, { - label: '渚涘簲鍟嗗悕绉�', - prop: 'supplierName', + label: "渚涘簲鍟嗗悕绉�", + prop: "supplierName", }, { - label: '浠樻閲戦', - prop: 'currentPaymentAmount', + label: "浠樻閲戦", + prop: "currentPaymentAmount", }, { - label: '鐧昏浜�', - prop: 'registrant' + label: "鐧昏浜�", + prop: "registrant", }, { - label: '鐧昏鏃ユ湡', - prop: 'registrationtDate' + label: "鐧昏鏃ユ湡", + prop: "registrationtDate", }, -]) -const tableData = ref([]) -const tableLoading = ref(false) -const purchaseLedgerList = ref([]) -const invoiceNumberList = ref([]) +]); +const tableData = ref([]); +const tableLoading = ref(false); +const purchaseLedgerList = ref([]); +const invoiceNumberList = ref([]); const page = reactive({ current: 1, size: 10, -}) -const total = ref(0) +}); +const total = ref(0); // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁 -const operationType = ref('') -const dialogFormVisible = ref(false) +const operationType = ref(""); +const dialogFormVisible = ref(false); const data = reactive({ searchForm: { - supplierNameOrContractNo: '', + supplierNameOrContractNo: "", }, -}) -const { searchForm, form, rules } = toRefs(data) +}); +const { searchForm, form, rules } = toRefs(data); // 鏌ヨ鍒楄〃 /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - page.current = 1 - getList() -} + page.current = 1; + getList(); +}; const pagination = ({ current, limit }) => { page.current = current; page.size = limit; - getList() -} + getList(); +}; const getList = () => { - tableLoading.value = true - registrationList({...searchForm.value, ...page}).then(res => { - tableLoading.value = false - tableData.value = res.rows - total.value = res.total - }) -} -getList() + tableLoading.value = true; + registrationList({ ...searchForm.value, ...page }).then((res) => { + tableLoading.value = false; + tableData.value = res.rows; + total.value = res.total; + }); +}; +getList(); </script> -<style scoped lang="scss"> - -</style> +<style scoped lang="scss"></style> diff --git a/src/views/reportAnalysis/projectProfit/index.vue b/src/views/reportAnalysis/projectProfit/index.vue index 82031bb..bae35bb 100644 --- a/src/views/reportAnalysis/projectProfit/index.vue +++ b/src/views/reportAnalysis/projectProfit/index.vue @@ -11,6 +11,7 @@ </el-form> <div class="table_list"> <PIMTable + rowKey="id" :column="columns" :tableLoading="loading" :tableData="dataList" diff --git a/src/views/reportAnalysis/taxComparison/index.vue b/src/views/reportAnalysis/taxComparison/index.vue index fc4c929..b04ebce 100644 --- a/src/views/reportAnalysis/taxComparison/index.vue +++ b/src/views/reportAnalysis/taxComparison/index.vue @@ -20,6 +20,7 @@ </el-form> <div class="table_list"> <PIMTable + rowKey="id" :column="columns" :tableData="dataList" :page="{ diff --git a/src/views/salesManagement/receiptPaymentHistory/index.vue b/src/views/salesManagement/receiptPaymentHistory/index.vue index 9e7ad7d..7dd8f18 100644 --- a/src/views/salesManagement/receiptPaymentHistory/index.vue +++ b/src/views/salesManagement/receiptPaymentHistory/index.vue @@ -48,16 +48,17 @@ </el-form> <div class="table_list"> <PIMTable + rowKey="id" :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true" :isShowSummary="isShowSummarySon" :summaryMethod="summarizeMainTable1" - :handleSelectionChange="handleSelectionChange" :tableLoading="tableLoading" - @pagination="pagination" :total="total" + @pagination="pagination" + @selection-change="handleSelectionChange" ></PIMTable> </div> </div> -- Gitblit v1.9.3