From 7619d415522ab3dc3299d6a2a9f5c9964a692d3f Mon Sep 17 00:00:00 2001
From: 张诺 <zhang_12370@163.com>
Date: 星期三, 18 六月 2025 17:58:53 +0800
Subject: [PATCH] 添加生产管理接口及优化表格字段
---
src/views/procureMent/components/ProductionDialog.vue | 274 ++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 223 insertions(+), 51 deletions(-)
diff --git a/src/views/procureMent/components/ProductionDialog.vue b/src/views/procureMent/components/ProductionDialog.vue
index 3e6d937..31a6243 100644
--- a/src/views/procureMent/components/ProductionDialog.vue
+++ b/src/views/procureMent/components/ProductionDialog.vue
@@ -16,48 +16,88 @@
label-position="right"
style="max-width: 400px; margin: 0 auto"
>
- <el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierName">
- <el-input v-model="form.supplierName" placeholder="璇疯緭鍏�" />
+ <el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierId">
+ <el-select v-model="form.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�">
+ <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="coal">
- <el-input v-model="form.coal" placeholder="璇疯緭鍏�" />
+ <el-form-item label="鐓ょ" prop="coalId">
+ <el-select v-model="form.coalId" placeholder="璇烽�夋嫨鐓ょ">
+ <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="unit">
- <el-input v-model="form.unit" placeholder="璇疯緭鍏�" />
+ <el-select
+ v-model="form.unit"
+ placeholder="璇烽�夋嫨鍗曚綅"
+ clearable
+ style="width: 100%"
+ >
+ <el-option label="鍚�" value="鍚�" />
+ <el-option label="鍗冨厠" value="鍗冨厠" />
+ </el-select>
</el-form-item>
<el-form-item label="閲囪喘鏁伴噺" prop="purchaseQuantity">
- <el-input v-model="form.purchaseQuantity" placeholder="璇疯緭鍏�" />
- </el-form-item>
- <el-form-item label="鍗曚环(涓嶅惈绋�)" prop="priceExcludingTax">
- <el-input v-model="form.priceExcludingTax" placeholder="璇疯緭鍏�" >
+ <el-input
+ v-model.number="form.purchaseQuantity"
+ placeholder="璇疯緭鍏�"
+ @blur="handleQuantityBlur"
+ >
<template v-slot:suffix>
- <i style="font-style:normal;">鍏�</i>
- </template>
+ <i style="font-style: normal">{{ form.unit ? form.unit : "" }}</i>
+ </template>
+ </el-input> </el-form-item
+ ><el-form-item label="绋庣巼" prop="taxRate">
+ <el-input
+ v-model.number="form.taxRate"
+ placeholder="璇疯緭鍏ョ◣鐜�"
+ @blur="handleTaxRateBlur"
+ >
+ <template v-slot:suffix>
+ <i style="font-style: normal">%</i>
+ </template>
</el-input>
</el-form-item>
- <el-form-item label="鎬讳环(涓嶅惈绋�)" prop="totalPriceExcludingTax">
- <el-input v-model="form.totalPriceExcludingTax" placeholder="璇疯緭鍏�" >
+ <el-form-item label="鍗曚环(涓嶅惈绋�)" prop="priceExcludingTax">
+ <el-input
+ v-model.number="form.priceExcludingTax"
+ placeholder="璇疯緭鍏�"
+ @blur="handlePriceBlur"
+ >
<template v-slot:suffix>
- <i style="font-style:normal;">鍏�</i>
- </template>
+ <i style="font-style: normal">鍏�</i>
+ </template>
</el-input>
</el-form-item>
<el-form-item label="鍗曚环(鍚◣)" prop="priceIncludingTax">
- <el-input v-model="form.priceIncludingTax" placeholder="璇疯緭鍏�" >
+ <el-input
+ v-model.number="form.priceIncludingTax"
+ placeholder="鑷姩璁$畻"
+ >
<template v-slot:suffix>
- <i style="font-style:normal;">鍏�</i>
- </template>
+ <i style="font-style: normal">鍏�</i>
+ </template>
+ </el-input>
+ </el-form-item>
+ <el-form-item label="鎬讳环(涓嶅惈绋�)" prop="totalPriceExcludingTax">
+ <el-input
+ v-model.number="form.totalPriceExcludingTax"
+ placeholder="鑷姩璁$畻"
+ >
+ <template v-slot:suffix>
+ <i style="font-style: normal">鍏�</i>
+ </template>
</el-input>
</el-form-item>
<el-form-item label="鎬讳环(鍚◣)" prop="totalPriceIncludingTax">
- <el-input v-model="form.totalPriceIncludingTax" placeholder="璇疯緭鍏�" >
+ <el-input
+ v-model.number="form.totalPriceIncludingTax"
+ placeholder="鑷姩璁$畻"
+ >
<template v-slot:suffix>
- <i style="font-style:normal;">鍏�</i>
- </template>
+ <i style="font-style: normal">鍏�</i>
+ </template>
</el-input>
- </el-form-item>
- <el-form-item label="绋庣巼" prop="taxRate">
- <el-input v-model="form.taxRate" placeholder="璇疯緭鍏�" />
</el-form-item>
<el-form-item label="鐧昏浜�" prop="registrantId">
<el-input v-model="form.registrantId" disabled placeholder="璇疯緭鍏�" />
@@ -76,14 +116,10 @@
<template #footer>
<div class="dialog-footer">
<!-- 閲嶇疆鍜屽彇娑� -->
- <el-button
- @click="handleClose"
- v-if="title.includes('鏂板')"
+ <el-button @click="handleClose" v-if="title.includes('鏂板')"
>鍙栨秷</el-button
>
- <el-button
- @click="handleReset"
- v-if="title.includes('缂栬緫')"
+ <el-button @click="handleReset" v-if="title.includes('缂栬緫')"
>閲嶇疆</el-button
>
<el-button type="primary" @click="handleSubmit">纭</el-button>
@@ -94,10 +130,12 @@
</template>
<script setup name="ProductionDialog">
-import { ref, defineProps, watch, onMounted, nextTick } from "vue";
+import { ref, defineProps, watch, onMounted, nextTick, computed } from "vue";
import { ElMessage } from "element-plus";
-import useUserStore from '@/store/modules/user'
-import {addOrEditPR} from "@/api/procureMent";
+import useUserStore from "@/store/modules/user";
+import { addOrEditPR } from "@/api/procureMent";
+import { getSupply } from "@/api/basicInformation/supplier";
+import { getCoalInfo } from "@/api/basicInformation/coal";
const props = defineProps({
title: {
type: String,
@@ -117,12 +155,140 @@
required: true,
type: Object,
});
-const userStore = useUserStore()
+const supplyList = ref([]);
+const coalList = ref([]);
+// 鑾峰彇渚涘簲鍟嗕笅鎷夊拰鐓ょ涓嬫媺
+const getDropdownData = async () => {
+ try {
+ const [supplyRes, coalRes] = await Promise.all([
+ getSupply(),
+ getCoalInfo(),
+ ]);
+ let supplyData = supplyRes.data.records;
+ let coalData = coalRes.data.records;
+ supplyList.value = supplyData.map((item) => ({
+ value: item.id,
+ label: item.supplierName,
+ }));
+ coalList.value = coalData.map((item) => ({
+ value: item.id,
+ label: item.coal,
+ }));
+ } catch (error) {
+ ElMessage.error("鑾峰彇涓嬫媺鏁版嵁澶辫触锛岃绋嶅悗閲嶈瘯");
+ }
+};
+
+defineExpose({
+ getDropdownData,
+});
+const toFixed = (num, precision = 2) => {
+ if (isNaN(num) || num === null || num === undefined || num === "") {
+ return 0;
+ }
+ return (
+ Math.floor(parseFloat(num) * Math.pow(10, precision)) /
+ Math.pow(10, 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;
+
+ if (!priceExcludingTax || !taxRate || !purchaseQuantity) {
+ return 0;
+ }
+
+ const unitPriceWithTaxValue = priceExcludingTax * (1 + taxRate / 100);
+ const result = unitPriceWithTaxValue * purchaseQuantity;
+ return toFixed(result, 2);
+});
+
+// 涓嶅惈绋庢�讳环璁$畻
+const taxExclusiveTotalPrice = computed(() => {
+ const purchaseQuantity = parseFloat(form.value.purchaseQuantity) || 0;
+ const priceExcludingTax = parseFloat(form.value.priceExcludingTax) || 0;
+
+ if (!purchaseQuantity || !priceExcludingTax) {
+ return 0;
+ }
+
+ const result = purchaseQuantity * priceExcludingTax;
+ return toFixed(result, 2);
+});
+
+// 鐩戝惉璁$畻鍊煎彉鍖栵紝鍚屾鍒� form 瀵硅薄涓�
+watch(unitPriceWithTax, (newValue) => {
+ form.value.priceIncludingTax = newValue;
+});
+
+watch(totalUnitPriceWithTax, (newValue) => {
+ form.value.totalPriceIncludingTax = newValue;
+});
+
+watch(taxExclusiveTotalPrice, (newValue) => {
+ form.value.totalPriceExcludingTax = newValue;
+});
+
+const userStore = useUserStore();
const userInfo = ref({});
+
+// 澶勭悊绋庣巼杈撳叆妗嗗け鐒︼紝纭繚绮惧害
+const handleTaxRateBlur = () => {
+ if (
+ form.value.taxRate !== null &&
+ form.value.taxRate !== undefined &&
+ form.value.taxRate !== ""
+ ) {
+ form.value.taxRate = toFixed(parseFloat(form.value.taxRate), 2);
+ }
+};
+
+// 澶勭悊涓嶅惈绋庡崟浠疯緭鍏ユ澶辩劍锛岀‘淇濈簿搴�
+const handlePriceBlur = () => {
+ if (
+ form.value.priceExcludingTax !== null &&
+ form.value.priceExcludingTax !== undefined &&
+ form.value.priceExcludingTax !== ""
+ ) {
+ form.value.priceExcludingTax = toFixed(
+ parseFloat(form.value.priceExcludingTax),
+ 2
+ );
+ }
+};
+
+// 澶勭悊閲囪喘鏁伴噺杈撳叆妗嗗け鐒︼紝纭繚绮惧害
+const handleQuantityBlur = () => {
+ if (
+ form.value.purchaseQuantity !== null &&
+ form.value.purchaseQuantity !== undefined &&
+ form.value.purchaseQuantity !== ""
+ ) {
+ form.value.purchaseQuantity = toFixed(
+ parseFloat(form.value.purchaseQuantity),
+ 3
+ ); // 鏁伴噺淇濈暀3浣嶅皬鏁�
+ }
+};
+
onMounted(async () => {
- let res = await userStore.getInfo()
+ let res = await userStore.getInfo();
userInfo.value = res;
-})
+});
const rules = {
supplierName: [
{ required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" },
@@ -131,11 +297,20 @@
unit: [{ required: true, message: "璇疯緭鍏ュ崟浣�", trigger: "blur" }],
purchaseQuantity: [
{ required: true, message: "璇疯緭鍏ラ噰璐暟閲�", trigger: "blur" },
+ { type: "number", message: "閲囪喘鏁伴噺蹇呴』涓烘暟瀛�", trigger: "blur" },
],
- priceExcludingTax: [{ required: true, message: "璇疯緭鍏ュ崟浠�", trigger: "blur" }],
- totalPriceExcludingTax: [{ required: true, message: "璇疯緭鍏ユ�讳环", trigger: "blur" }],
- priceIncludingTax: [{ required: true, message: "璇疯緭鍏ュ惈绋庡崟浠�", trigger: "blur" }],
- totalPriceIncludingTax: [{ required: true, message: "璇疯緭鍏ュ惈绋庢�讳环", trigger: "blur" }],
+ priceExcludingTax: [
+ { required: true, message: "璇疯緭鍏ュ崟浠�", trigger: "blur" },
+ ],
+ totalPriceExcludingTax: [
+ { required: true, message: "璇疯緭鍏ユ�讳环", trigger: "blur" },
+ ],
+ priceIncludingTax: [
+ { required: true, message: "璇疯緭鍏ュ惈绋庡崟浠�", trigger: "blur" },
+ ],
+ totalPriceIncludingTax: [
+ { required: true, message: "璇疯緭鍏ュ惈绋庢�讳环", trigger: "blur" },
+ ],
taxRate: [{ required: true, message: "璇疯緭鍏ョ◣鐜�", trigger: "blur" }],
registrantId: [{ required: true, message: "璇疯緭鍏ョ櫥璁颁汉", trigger: "blur" }],
registrationDate: [
@@ -154,7 +329,6 @@
if (formRef.value) {
formRef.value.clearValidate();
}
- console.log(form.value);
};
const formRef = ref(null);
// 鎻愪氦琛ㄥ崟
@@ -162,27 +336,26 @@
if (!formRef.value) return;
await formRef.value.validate(async (valid) => {
if (valid) {
- console.log("琛ㄥ崟楠岃瘉閫氳繃", form.value);
const obj = ref({});
- if (props.title.includes('鏂板')) {
+ if (props.title.includes("鏂板")) {
let result = await addOrEditPR({
...form.value,
- })
+ });
obj.value = {
title: "鏂板",
...form.value,
- result
+ result,
};
} else {
- delete form.value.updateTime
- delete form.value.createTime
+ delete form.value.updateTime;
+ delete form.value.createTime;
let result = await addOrEditPR({
...form.value,
- })
+ });
obj.value = {
title: "缂栬緫",
...form.value,
- result
+ result,
};
}
emit("submit", obj.value);
@@ -191,5 +364,4 @@
};
</script>
-<style lang="sass" scoped>
-</style>
\ No newline at end of file
+<style lang="sass" scoped></style>
--
Gitblit v1.9.3