From 697ebdb9022a24db197a6d6df3a60addec242f2a Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 22 九月 2025 14:07:08 +0800
Subject: [PATCH] 采购修改
---
src/views/procureMent/components/ProductionDialog.vue | 374 +++++++++++++++++++++++++++++++++-------------------
1 files changed, 235 insertions(+), 139 deletions(-)
diff --git a/src/views/procureMent/components/ProductionDialog.vue b/src/views/procureMent/components/ProductionDialog.vue
index 677eba9..c510f97 100644
--- a/src/views/procureMent/components/ProductionDialog.vue
+++ b/src/views/procureMent/components/ProductionDialog.vue
@@ -1,37 +1,69 @@
<template>
<div>
<el-dialog
- v-model="dialogFormVisible"
- :title="title"
- width="600"
- :close-on-click-modal="false"
- @close="handleClose"
+ v-model="dialogFormVisible"
+ :title="title"
+ width="600"
+ :close-on-click-modal="false"
+ @close="handleClose"
>
<el-form
- ref="formRef"
- :model="form"
- :rules="rules"
- label-width="auto"
- class="production-form"
- label-position="right"
- style="max-width: 400px; margin: 0 auto"
+ ref="formRef"
+ :model="form"
+ :rules="rules"
+ label-width="auto"
+ class="production-form"
+ label-position="right"
+ style="max-width: 400px; margin: 0 auto"
>
<el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierId">
- <el-select v-model="form.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�" :disabled="isViewMode">
- <el-option :label="item.label" v-for="item in supplyList" :key="item.value" :value="item.value"/>
+ <el-select
+ v-model="form.supplierId"
+ placeholder="璇烽�夋嫨渚涘簲鍟�"
+ :disabled="isViewMode"
+ >
+ <el-option
+ :label="item.label"
+ v-for="item in supplyList"
+ :key="item.value"
+ :value="item.value"
+ />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鐓ゆ枡绫诲瀷" prop="type">
+ <el-select
+ v-model="form.type"
+ placeholder="璇烽�夋嫨鐓ょ"
+ :disabled="isViewMode"
+ >
+ <el-option
+ :label="item.label"
+ v-for="item in typeList"
+ :key="item.value"
+ :value="item.value"
+ />
</el-select>
</el-form-item>
<el-form-item label="鐓ょ" prop="coalId">
- <el-select v-model="form.coalId" placeholder="璇烽�夋嫨鐓ょ" :disabled="isViewMode">
- <el-option :label="item.label" v-for="item in coalList" :key="item.value" :value="item.value"/>
+ <el-select
+ v-model="form.coalId"
+ placeholder="璇烽�夋嫨鐓ょ"
+ :disabled="isViewMode"
+ >
+ <el-option
+ :label="item.label"
+ v-for="item in coalList"
+ :key="item.value"
+ :value="item.value"
+ />
</el-select>
</el-form-item>
<el-form-item label="閲囪喘鏁伴噺" prop="purchaseQuantity">
<el-input
- v-model.number="form.purchaseQuantity"
- placeholder="璇疯緭鍏�"
- @blur="handleQuantityBlur"
- :disabled="isViewMode"
+ v-model.number="form.purchaseQuantity"
+ placeholder="璇疯緭鍏�"
+ @blur="handleQuantityBlur"
+ :disabled="isViewMode"
>
<template v-slot:suffix>
<i style="font-style: normal">鍚�</i>
@@ -40,33 +72,33 @@
</el-form-item>
<el-form-item label="绋庣巼" prop="taxRate">
<el-input
- v-model.number="form.taxRate"
- placeholder="璇疯緭鍏ョ◣鐜�"
- @blur="handleTaxRateBlur"
- :disabled="isViewMode"
+ v-model.number="form.taxRate"
+ placeholder="璇疯緭鍏ョ◣鐜�"
+ @blur="handleTaxRateBlur"
+ :disabled="isViewMode"
>
<template v-slot:suffix>
<i style="font-style: normal">%</i>
</template>
</el-input>
</el-form-item>
- <el-form-item label="鍗曚环(涓嶅惈绋�)" prop="priceExcludingTax">
+ <el-form-item label="鍗曚环(鍚◣)" prop="priceIncludingTax">
<el-input
- v-model.number="form.priceExcludingTax"
- placeholder="璇疯緭鍏�"
- @blur="handlePriceBlur"
- :disabled="isViewMode"
+ v-model.number="form.priceIncludingTax"
+ placeholder="璇疯緭鍏ュ惈绋庡崟浠�"
+ @blur="handlePriceBlur"
+ :disabled="isViewMode"
>
<template v-slot:suffix>
<i style="font-style: normal">鍏�</i>
</template>
</el-input>
</el-form-item>
- <el-form-item label="鍗曚环(鍚◣)" prop="priceIncludingTax">
+ <el-form-item label="鍗曚环(涓嶅惈绋�)" prop="priceExcludingTax">
<el-input
- v-model.number="form.priceIncludingTax"
- placeholder="鑷姩璁$畻"
- :disabled="isViewMode"
+ v-model.number="form.priceExcludingTax"
+ placeholder="鑷姩璁$畻"
+ disabled
>
<template v-slot:suffix>
<i style="font-style: normal">鍏�</i>
@@ -75,9 +107,9 @@
</el-form-item>
<el-form-item label="鎬讳环(涓嶅惈绋�)" prop="totalPriceExcludingTax">
<el-input
- v-model.number="form.totalPriceExcludingTax"
- placeholder="鑷姩璁$畻"
- :disabled="isViewMode"
+ v-model.number="form.totalPriceExcludingTax"
+ placeholder="鑷姩璁$畻"
+ disabled
>
<template v-slot:suffix>
<i style="font-style: normal">鍏�</i>
@@ -86,9 +118,23 @@
</el-form-item>
<el-form-item label="鎬讳环(鍚◣)" prop="totalPriceIncludingTax">
<el-input
- v-model.number="form.totalPriceIncludingTax"
- placeholder="鑷姩璁$畻"
- :disabled="isViewMode"
+ v-model.number="form.totalPriceIncludingTax"
+ placeholder="鑷姩璁$畻"
+ disabled
+ >
+ <template v-slot:suffix>
+ <i style="font-style: normal">鍏�</i>
+ </template>
+ </el-input>
+ </el-form-item>
+ <el-form-item label="杩愯垂" prop="freight">
+ <!-- 榛樿涓�0 -->
+ <el-input
+ type="number"
+ :precision="2"
+ v-model.number="form.freight"
+ placeholder="璇疯緭鍏ヨ繍璐�"
+ :disabled="isViewMode"
>
<template v-slot:suffix>
<i style="font-style: normal">鍏�</i>
@@ -96,31 +142,52 @@
</el-input>
</el-form-item>
<el-form-item label="鐧昏浜�" prop="registrantId">
- <el-input v-model="form.registrantId" disabled placeholder="璇疯緭鍏�"/>
+ <el-input
+ :value="match(form.registrantId)"
+ v-model.number="form.registrantId"
+ disabled
+ placeholder="璇疯緭鍏�"
+ />
</el-form-item>
<el-form-item label="鐧昏鏃ユ湡" prop="registrationDate">
<el-date-picker
- disabled
- v-model="form.registrationDate"
- type="date"
- placeholder="YYYY-MM-DD"
- style="width: 100%"
- value-format="YYYY-MM-DD"
+ disabled
+ v-model="form.registrationDate"
+ type="date"
+ placeholder="YYYY-MM-DD"
+ style="width: 100%"
+ value-format="YYYY-MM-DD"
/>
</el-form-item>
+<!-- <el-form-item label="绫诲瀷" prop="purchaseType">-->
+<!-- <el-select-->
+<!-- v-model="form.purchaseType"-->
+<!-- placeholder="璇烽�夋嫨绫诲瀷"-->
+<!-- :disabled="isViewMode"-->
+<!-- >-->
+<!-- <el-option-->
+<!-- v-for="item in purchaseTypeList"-->
+<!-- :key="item.value"-->
+<!-- :label="item.label"-->
+<!-- :value="Number(item.value)"-->
+<!-- />-->
+<!-- </el-select>-->
+<!-- </el-form-item>-->
</el-form>
<template #footer>
<div class="dialog-footer">
<!-- 閲嶇疆鍜屽彇娑� -->
- <el-button @click="handleClose" v-if="title.includes('鏂板')"
- >鍙栨秷
- </el-button
- >
+ <el-button
+ @click="handleClose"
+ v-if="title.includes('鏂板') || title.includes('鏌ョ湅')"
+ >鍙栨秷
+ </el-button>
<el-button @click="handleReset" v-if="title.includes('缂栬緫')"
- >閲嶇疆
- </el-button
+ >閲嶇疆
+ </el-button>
+ <el-button type="primary" v-if="!isViewMode" @click="handleSubmit"
+ >纭</el-button
>
- <el-button type="primary" @click="handleSubmit">纭</el-button>
</div>
</template>
</el-dialog>
@@ -128,10 +195,11 @@
</template>
<script setup name="ProductionDialog">
-import {ref, defineProps, watch, onMounted, nextTick, computed} from "vue";
-import {ElMessage} from "element-plus";
+import { ref, defineProps, watch, onMounted, nextTick, computed } from "vue";
+import { ElMessage } from "element-plus";
import useUserStore from "@/store/modules/user";
-import {addOrEditPR, getSupplyList, getCoalInfoList} from "@/api/procureMent";
+import { addOrEditPR, getSupplyList, getCoalInfoList } from "@/api/procureMent";
+import useDictStore from "@/store/modules/dict"
const props = defineProps({
title: {
@@ -144,6 +212,16 @@
required: true,
type: Boolean,
});
+const typeList = [
+ {
+ value: 1,
+ label: "鎴愬搧",
+ },
+ {
+ value: 2,
+ label: "鍘熸枡",
+ },
+];
const form = defineModel("form", {
required: true,
type: Object,
@@ -154,8 +232,9 @@
});
const supplyList = ref([]);
const coalList = ref([]);
+const purchaseTypeList = ref([])
const isViewMode = computed(() => props.title.includes("鏌ョ湅"));
-// 鑾峰彇渚涘簲鍟嗕笅鎷夊拰鐓ょ涓嬫媺
+// 鑾峰彇渚涘簲鍟嗕笅鎷夊拰鐓ょ涓嬫媺 浠ュ強绫诲瀷
const getDropdownData = async () => {
try {
const [supplyRes, coalRes] = await Promise.all([
@@ -172,6 +251,7 @@
value: item.id,
label: item.coal,
}));
+
} catch (error) {
ElMessage.error("鑾峰彇涓嬫媺鏁版嵁澶辫触锛岃绋嶅悗閲嶈瘯");
}
@@ -180,140 +260,156 @@
defineExpose({
getDropdownData,
});
+// 鏁板�兼牸寮忓寲宸ュ叿鍑芥暟
const toFixed = (num, precision = 2) => {
if (isNaN(num) || num === null || num === undefined || num === "") {
return 0;
}
- return (
+ return Number(
+ (
Math.floor(parseFloat(num) * Math.pow(10, precision)) /
Math.pow(10, precision)
+ ).toFixed(precision)
);
};
-// 鍚◣鍗曚环璁$畻
-const unitPriceWithTax = computed(() => {
- const priceExcludingTax = parseFloat(form.value.priceExcludingTax) || 0;
- const taxRate = parseFloat(form.value.taxRate) || 0;
- if (!priceExcludingTax || !taxRate) {
- return 0;
- }
- const result = priceExcludingTax * (1 + taxRate / 100);
- return toFixed(result, 2);
-});
-// 鍚◣鎬讳环璁$畻
-const totalUnitPriceWithTax = computed(() => {
- const priceExcludingTax = parseFloat(form.value.priceExcludingTax) || 0;
- const taxRate = parseFloat(form.value.taxRate) || 0;
- const purchaseQuantity = parseFloat(form.value.purchaseQuantity) || 0;
+// 瀹夊叏鑾峰彇鏁板��
+const safeNumber = (value) => {
+ const num = parseFloat(value);
+ return isNaN(num) ? 0 : num;
+};
- if (!priceExcludingTax || !taxRate || !purchaseQuantity) {
- return 0;
- }
+// 璁$畻閫昏緫 - 鍩轰簬鍚◣鍗曚环璁$畻涓嶅惈绋庝环鏍�
+const calculatePrices = () => {
+ const priceIncludingTax = safeNumber(form.value.priceIncludingTax); // 鍚◣鍗曚环
+ const taxRate = safeNumber(form.value.taxRate); // 绋庣巼
+ const quantity = safeNumber(form.value.purchaseQuantity); // 閲囪喘鏁伴噺
- const unitPriceWithTaxValue = priceExcludingTax * (1 + taxRate / 100);
- const result = unitPriceWithTaxValue * purchaseQuantity;
- return toFixed(result, 2);
-});
+ // 1. 鏍规嵁鍚◣鍗曚环鍜岀◣鐜囪绠椾笉鍚◣鍗曚环
+ // 涓嶅惈绋庡崟浠� = 鍚◣鍗曚环 / (1 + 绋庣巼/100)
+ const priceExcludingTax =
+ priceIncludingTax && taxRate
+ ? parseFloat((priceIncludingTax / (1 + taxRate / 100)).toFixed(2))
+ : 0;
-// 涓嶅惈绋庢�讳环璁$畻
-const taxExclusiveTotalPrice = computed(() => {
- const purchaseQuantity = parseFloat(form.value.purchaseQuantity) || 0;
- const priceExcludingTax = parseFloat(form.value.priceExcludingTax) || 0;
+ // 2. 璁$畻涓嶅惈绋庢�讳环 = 涓嶅惈绋庡崟浠� 脳 鏁伴噺
+ const totalPriceExcludingTax =
+ priceExcludingTax && quantity
+ ? toFixed(priceExcludingTax * quantity, 2)
+ : 0;
- if (!purchaseQuantity || !priceExcludingTax) {
- return 0;
- }
+ // 3. 璁$畻鍚◣鎬讳环 = 鍚◣鍗曚环 脳 鏁伴噺
+ const totalPriceIncludingTax =
+ priceIncludingTax && quantity
+ ? toFixed(priceIncludingTax * quantity, 2)
+ : 0;
- const result = purchaseQuantity * priceExcludingTax;
- return toFixed(result, 2);
-});
+ // 淇濊瘉鏄剧ず涓轰袱浣嶅皬鏁帮紙濡�88.5鏄剧ず涓�88.50锛�
+ form.value.priceExcludingTax = priceExcludingTax.toFixed(2);
+ form.value.totalPriceExcludingTax = totalPriceExcludingTax;
+ form.value.totalPriceIncludingTax = totalPriceIncludingTax;
+};
-// 鐩戝惉璁$畻鍊煎彉鍖栵紝鍚屾鍒� form 瀵硅薄涓�
-watch(unitPriceWithTax, (newValue) => {
- form.value.priceIncludingTax = newValue;
-});
-
-watch(totalUnitPriceWithTax, (newValue) => {
- form.value.totalPriceIncludingTax = newValue;
-});
-
-watch(taxExclusiveTotalPrice, (newValue) => {
- form.value.totalPriceExcludingTax = newValue;
-});
+// 鐩戝惉琛ㄥ崟瀵硅薄鍙樺寲锛岀敤浜庡鐞嗙紪杈戞ā寮忎笅鐨勬暟鎹姞杞藉拰瀹炴椂璁$畻
+watch(
+ () => [
+ form.value.priceIncludingTax,
+ form.value.taxRate,
+ form.value.purchaseQuantity,
+ ],
+ () => {
+ // 闃叉姈澶勭悊锛岄伩鍏嶉绻佽绠�
+ nextTick(() => {
+ calculatePrices();
+ });
+ },
+ { deep: true }
+);
const userStore = useUserStore();
const userInfo = ref({});
-
-// 澶勭悊绋庣巼杈撳叆妗嗗け鐒︼紝纭繚绮惧害
+const match = () => {
+ return userInfo.value.nickName || "鏈煡鐢ㄦ埛";
+};
+// 澶勭悊绋庣巼杈撳叆妗嗗け鐒︿簨浠�
const handleTaxRateBlur = () => {
if (
- form.value.taxRate !== null &&
- form.value.taxRate !== undefined &&
- form.value.taxRate !== ""
+ form.value.taxRate !== null &&
+ form.value.taxRate !== undefined &&
+ form.value.taxRate !== ""
) {
form.value.taxRate = toFixed(parseFloat(form.value.taxRate), 2);
+ // watch 浼氳嚜鍔ㄨЕ鍙� calculatePrices锛屼笉闇�瑕佹墜鍔ㄨ皟鐢�
}
};
-// 澶勭悊涓嶅惈绋庡崟浠疯緭鍏ユ澶辩劍锛岀‘淇濈簿搴�
+// 澶勭悊鍚◣鍗曚环杈撳叆妗嗗け鐒︿簨浠�
const handlePriceBlur = () => {
if (
- form.value.priceExcludingTax !== null &&
- form.value.priceExcludingTax !== undefined &&
- form.value.priceExcludingTax !== ""
+ form.value.priceIncludingTax !== null &&
+ form.value.priceIncludingTax !== undefined &&
+ form.value.priceIncludingTax !== ""
) {
- form.value.priceExcludingTax = toFixed(
- parseFloat(form.value.priceExcludingTax),
- 2
+ form.value.priceIncludingTax = toFixed(
+ parseFloat(form.value.priceIncludingTax),
+ 2
);
+ // watch 浼氳嚜鍔ㄨЕ鍙� calculatePrices锛屼笉闇�瑕佹墜鍔ㄨ皟鐢�
}
};
-// 澶勭悊閲囪喘鏁伴噺杈撳叆妗嗗け鐒︼紝纭繚绮惧害
+// 澶勭悊閲囪喘鏁伴噺杈撳叆妗嗗け鐒︿簨浠�
const handleQuantityBlur = () => {
if (
- form.value.purchaseQuantity !== null &&
- form.value.purchaseQuantity !== undefined &&
- form.value.purchaseQuantity !== ""
+ form.value.purchaseQuantity !== null &&
+ form.value.purchaseQuantity !== undefined &&
+ form.value.purchaseQuantity !== ""
) {
form.value.purchaseQuantity = toFixed(
- parseFloat(form.value.purchaseQuantity),
- 3
+ parseFloat(form.value.purchaseQuantity),
+ 3
); // 鏁伴噺淇濈暀3浣嶅皬鏁�
+ // watch 浼氳嚜鍔ㄨЕ鍙� calculatePrices锛屼笉闇�瑕佹墜鍔ㄨ皟鐢�
}
};
onMounted(async () => {
+
+ purchaseTypeList.value = useDictStore().getDictTypeList("purchase_type").map((item) => ({
+ value: item.value,
+ label: item.label,
+ }))
+
let res = await userStore.getInfo();
- userInfo.value = res;
- getDropdownData()
+ userInfo.value = res.user;
+ await getDropdownData();
+ // 缁勪欢鍔犺浇瀹屾垚鍚庤Е鍙戜竴娆¤绠�
+ calculatePrices();
});
+
const rules = {
supplierName: [
- {required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur"},
+ { required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" },
],
- coal: [{required: true, message: "璇疯緭鍏ョ叅绉�", trigger: "blur"}],
+ type: [{ required: true, message: "璇烽�夋嫨绫诲瀷", trigger: "change" }],
+ coal: [{ required: true, message: "璇疯緭鍏ョ叅绉�", trigger: "blur" }],
purchaseQuantity: [
- {required: true, message: "璇疯緭鍏ラ噰璐暟閲�", trigger: "blur"},
- {type: "number", message: "閲囪喘鏁伴噺蹇呴』涓烘暟瀛�", trigger: "blur"},
+ { required: true, message: "璇疯緭鍏ラ噰璐暟閲�", trigger: "blur" },
+ { type: "number", message: "閲囪喘鏁伴噺蹇呴』涓烘暟瀛�", trigger: "blur" },
],
priceExcludingTax: [
- {required: true, message: "璇疯緭鍏ュ崟浠�", trigger: "blur"},
- ],
- totalPriceExcludingTax: [
- {required: true, message: "璇疯緭鍏ユ�讳环", trigger: "blur"},
+ { required: true, message: "璇疯緭鍏ュ崟浠�", trigger: "blur" },
],
priceIncludingTax: [
- {required: true, message: "璇疯緭鍏ュ惈绋庡崟浠�", trigger: "blur"},
+ { required: true, message: "璇疯緭鍏ュ惈绋庡崟浠�", trigger: "blur" },
],
- totalPriceIncludingTax: [
- {required: true, message: "璇疯緭鍏ュ惈绋庢�讳环", trigger: "blur"},
+ taxRate: [
+ { required: true, message: "璇疯緭鍏ョ◣鐜�", trigger: "blur" },
+ { type: "number", message: "绋庣巼蹇呴』涓烘暟瀛�", trigger: "blur" },
],
- taxRate: [{required: true, message: "璇疯緭鍏ョ◣鐜�", trigger: "blur"}],
- registrantId: [{required: true, message: "璇疯緭鍏ョ櫥璁颁汉", trigger: "blur"}],
- registrationDate: [
- {required: true, message: "璇烽�夋嫨鐧昏鏃ユ湡", trigger: "change"},
- ],
+ purchaseType: [
+ { required: true, message: "璇烽�夋嫨绫诲瀷", trigger: "change" }
+ ]
};
// 鍏抽棴寮圭獥
const handleClose = () => {
@@ -362,4 +458,4 @@
};
</script>
-<style lang="sass" scoped></style>
+<style lang="scss" scoped></style>
--
Gitblit v1.9.3