From 2c9fbc6f1a3ccd1418efa9c348ec12faf1ab3258 Mon Sep 17 00:00:00 2001
From: zhang_12370 <z2864490065@outlook.com>
Date: 星期三, 23 七月 2025 16:33:06 +0800
Subject: [PATCH] 1、完善表格逻辑 2、完善配煤计算器 3、完善设备管理 4、完善采购管理
---
src/views/procureMent/index.vue | 7
src/views/calculator/index.vue | 196 ++++++++++++++-
src/views/procureMent/components/ProductionDialog.vue | 229 ++++++++++++------
src/views/equipment/management/mould/equipmentRequisitionDialog.vue | 229 +++++++++++++-----
src/components/Table/ETable.vue | 44 +++
5 files changed, 531 insertions(+), 174 deletions(-)
diff --git a/src/components/Table/ETable.vue b/src/components/Table/ETable.vue
index 1f8fdfb..3921d6b 100644
--- a/src/components/Table/ETable.vue
+++ b/src/components/Table/ETable.vue
@@ -35,6 +35,22 @@
<el-table-column v-if="showOperations" :label="operationsLabel" :width="operationsWidth" :show-overflow-tooltip="false" fixed="right" align="center">
<template #default="scope">
<slot name="operations" :row="scope.row">
+ <!-- 鑷畾涔夋寜閽� - 鏀惧湪榛樿鎸夐挳涔嬪墠 -->
+ <el-button
+ v-for="button in customButtons"
+ :key="button.name"
+ v-show="!button.show || button.show(scope.row)"
+ :link="button.link !== false"
+ :type="button.type || 'primary'"
+ :size="button.size || 'small'"
+ :icon="button.icon"
+ :disabled="button.disabled && button.disabled(scope.row)"
+ @click="handleCustomClick(button.name, scope.row)"
+ >
+ {{ button.label }}
+ </el-button>
+
+ <!-- 榛樿鎿嶄綔鎸夐挳 -->
<el-button v-if="operations.includes('edit')" link type="primary" size="small"
@click="handleEdit(scope.row)">缂栬緫</el-button>
<el-button v-if="operations.includes('viewRow')" link type="primary" size="small"
@@ -126,7 +142,25 @@
operations: {
type: Array,
default: () => ['edit', 'delete', 'export']
- }, // 鍒犻櫎纭淇℃伅
+ },
+ // 鑷畾涔夋寜閽厤缃�
+ customButtons: {
+ type: Array,
+ default: () => []
+ // 绀轰緥閰嶇疆锛�
+ // [
+ // {
+ // name: 'return', // 鎸夐挳鏍囪瘑
+ // label: '褰掕繕', // 鎸夐挳鏄剧ず鏂囨湰
+ // type: 'success', // 鎸夐挳绫诲瀷
+ // size: 'small', // 鎸夐挳澶у皬
+ // icon: '', // 鍥炬爣(鍙��)
+ // show: (row) => true, // 鏄剧ず鏉′欢鍑芥暟(鍙��)
+ // disabled: (row) => false, // 绂佺敤鏉′欢鍑芥暟(鍙��)
+ // }
+ // ]
+ },
+ // 鍒犻櫎纭淇℃伅
deleteConfirmText: {
type: String,
default: '纭鍒犻櫎璇ヨ褰曪紵'
@@ -163,7 +197,7 @@
};
// 澶勭悊閫夋嫨鍙樺寲銆佺紪杈戙�佸垹闄ゅ拰瀵煎嚭鎿嶄綔
-const emit = defineEmits(['selection-change', 'edit', 'delete', 'export', 'viewRow', 'viewFile'])
+const emit = defineEmits(['selection-change', 'edit', 'delete', 'export', 'viewRow', 'viewFile', 'custom-click'])
const handleSelectionChange = (selection) => {
emit('selection-change', selection)
}
@@ -176,6 +210,12 @@
const handleViewFile = (row) => {
emit('viewFile', row)
}
+
+// 澶勭悊鑷畾涔夋寜閽偣鍑�
+const handleCustomClick = (buttonName, row) => {
+ emit('custom-click', { buttonName, row })
+}
+
const handleDelete = (row) => {
ElMessageBox.confirm(
props.deleteConfirmText,
diff --git a/src/views/calculator/index.vue b/src/views/calculator/index.vue
index e09e4c9..e9da943 100644
--- a/src/views/calculator/index.vue
+++ b/src/views/calculator/index.vue
@@ -403,7 +403,9 @@
<!-- 娣峰悎鐓ゅ睘鎬� -->
<div class="props-section">
<div class="props-title">馃搳 娣峰悎鐓ゅ睘鎬�</div>
- <div class="props-grid">
+
+ <!-- 鍩虹灞炴�у睍绀哄尯 -->
+ <div class="props-display-grid">
<div class="prop-item">
<span class="prop-label">鍙戠儹閲�:</span>
<span class="prop-value"
@@ -434,19 +436,45 @@
>{{ result.optimal.props.cost.toFixed(2) }} 鍏�/鍚�</span
>
</div>
- <div class="prop-item">
- <span class="prop-label">鐢熸垚:</span>
- <el-autocomplete
- v-model="result.optimal.props.createCoal"
- :fetch-suggestions="querySearch"
- clearable
- size="small"
- class="inline-input red-border"
- style="width: 180px; min-height: 24px !important"
- placeholder="璇疯緭鍏ョ敓鎴愮叅绉�"
- @blur="handleSelect($event)"
- @select="handleSelect($event)"
- />
+ </div>
+
+ <!-- 杈撳叆鎿嶄綔鍖� -->
+ <div class="props-input-section">
+ <div class="input-row">
+ <div class="input-item">
+ <label class="input-label">鐢熸垚鐓ょ:</label>
+ <el-autocomplete
+ v-model="result.optimal.props.createCoal"
+ :fetch-suggestions="querySearch"
+ clearable
+ size="small"
+ class="coal-input"
+ placeholder="璇疯緭鍏�/閫夋嫨鐢熸垚鐓ょ"
+ @blur="handleSelect($event)"
+ @select="handleSelect($event)"
+ />
+ </div>
+ <div class="input-item">
+ <label class="input-label">鐢熶骇鏁伴噺:</label>
+ <el-input
+ type="number"
+ clearable
+ size="small"
+ class="quantity-input"
+ v-model="result.optimal.props.createCoalQuantity"
+ placeholder="璇疯緭鍏ョ敓浜ф暟閲�"
+ :min="0"
+ :max="999999"
+ :step="0.1"
+ :precision="2"
+ @input="handleQuantityInput"
+ @blur="handleQuantityBlur"
+ >
+ <template #suffix>
+ <span style="color: #909399; font-size: 12px;">鍚�</span>
+ </template>
+ </el-input>
+ </div>
</div>
</div>
</div>
@@ -652,6 +680,29 @@
result.value.optimal.props.createCoal = matchedName;
}
};
+
+// 澶勭悊鏁伴噺杈撳叆
+const handleQuantityInput = (value) => {
+ // 闄愬埗杈撳叆鑼冨洿鍜岀簿搴�
+ if (value !== null && value !== undefined && value !== '') {
+ const numValue = parseFloat(value);
+ if (numValue < 0) {
+ result.value.optimal.props.createCoalQuantity = 0;
+ } else if (numValue > 999999) {
+ result.value.optimal.props.createCoalQuantity = 999999;
+ }
+ }
+};
+
+// 澶勭悊鏁伴噺澶辩劍
+const handleQuantityBlur = (event) => {
+ const value = event.target.value;
+ if (value && !isNaN(value)) {
+ // 鏍煎紡鍖栦负涓や綅灏忔暟
+ const formatted = parseFloat(value).toFixed(2);
+ result.value.optimal.props.createCoalQuantity = formatted;
+ }
+};
onMounted(async () => {
getCoalInfo();
geInfoCoals();
@@ -801,7 +852,8 @@
const validationChecks = [
{ condition: !result.value, message: "璇峰厛璁$畻鏈�浼橀厤姣斿悗鍐嶆坊鍔犺嚦寰呭叆搴�" },
{ condition: !result.value.optimal, message: "璇峰厛璁$畻鏈�浼橀厤姣�" },
- { condition: !result.value.optimal.props.createCoal, message: "璇峰厛閫夋嫨鐢熸垚鐓ょ" }
+ { condition: !result.value.optimal.props.createCoal, message: "璇峰厛閫夋嫨鐢熸垚鐓ょ" },
+ { condition: !result.value.optimal.props.createCoalQuantity || result.value.optimal.props.createCoalQuantity <= 0, message: "璇疯緭鍏ユ湁鏁堢殑鐢熶骇鏁伴噺" }
];
for (const check of validationChecks) {
@@ -828,7 +880,6 @@
);
// 鍑嗗鏁版嵁
const optimalData = result.value.optimal;
- optimalData.props.totalTonnage = formInline.value.totalTonnage;
optimalData.props.cost = parseFloat(optimalData.props.cost.toFixed(2));
// 娣诲姞瀹樻柟ID
@@ -872,9 +923,13 @@
const instructions = genInstructions(
validCoals,
ratios,
- formInline.value.totalTonnage,
formInline.value.scoopWeight
);
+
+ // 鍒濆鍖栨墿灞曞睘鎬�
+ props.createCoal = "";
+ props.createCoalQuantity = 0;
+ props.coalId = null;
data.result = {
show: true,
@@ -917,7 +972,7 @@
if (altRatios) {
const altProps = calcBlendProps(coals, altRatios);
const altInstructions = genInstructions(
- coals, altRatios, formInline.value.totalTonnage, formInline.value.scoopWeight
+ coals, altRatios, formInline.value.scoopWeight
);
alternatives.push({
@@ -1186,6 +1241,66 @@
margin-bottom: 10px;
}
+/* 鍩虹灞炴�у睍绀虹綉鏍� */
+.props-display-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 8px;
+ margin-bottom: 15px;
+}
+
+/* 杈撳叆鎿嶄綔鍖哄煙 */
+.props-input-section {
+ border-top: 1px solid #ebeef5;
+ padding-top: 15px;
+}
+
+.input-row {
+ display: flex;
+ gap: 15px;
+ align-items: flex-end;
+ flex-wrap: wrap;
+}
+
+.input-item {
+ flex: 1;
+ min-width: 200px;
+ display: flex;
+ flex-direction: column;
+}
+
+.input-label {
+ font-size: 13px;
+ color: #606266;
+ margin-bottom: 6px;
+ font-weight: 500;
+}
+
+.coal-input,
+.quantity-input {
+ width: 100%;
+ border-radius: 4px;
+}
+
+.coal-input :deep(.el-input__wrapper),
+.quantity-input :deep(.el-input__wrapper) {
+ border: 1px solid #dcdfe6;
+ border-radius: 4px;
+ transition: all 0.2s;
+ min-height: 32px;
+}
+
+.coal-input :deep(.el-input__wrapper):hover,
+.quantity-input :deep(.el-input__wrapper):hover {
+ border-color: #c0c4cc;
+}
+
+.coal-input :deep(.el-input__wrapper.is-focus),
+.quantity-input :deep(.el-input__wrapper.is-focus) {
+ border-color: #409eff;
+ box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.1);
+}
+
.props-grid {
display: grid;
grid-template-columns: 1fr 1fr;
@@ -1346,8 +1461,18 @@
}
@media (max-width: 768px) {
- .props-grid {
+ .props-display-grid {
grid-template-columns: 1fr;
+ gap: 6px;
+ }
+
+ .input-row {
+ flex-direction: column;
+ gap: 12px;
+ }
+
+ .input-item {
+ min-width: 100%;
}
.table-container {
@@ -1357,6 +1482,21 @@
:deep(.el-table .cell) {
padding: 4px 8px;
}
+
+ .right-card {
+ width: 100%;
+ min-width: auto;
+ }
+}
+
+@media (max-width: 1024px) {
+ .props-display-grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ .input-row {
+ gap: 12px;
+ }
}
:deep(.el-input__wrapper) {
min-height: 24px !important;
@@ -1364,4 +1504,22 @@
:deep(.el-input__inner) {
min-height: 24px !important;
}
+
+/* 鏁伴噺杈撳叆妗嗘牱寮忎紭鍖� */
+.coal-input :deep(.el-input__suffix),
+.quantity-input :deep(.el-input__suffix) {
+ display: flex;
+ align-items: center;
+ padding-right: 8px;
+}
+
+/* 杈撳叆妗嗙殑鍚庣紑鍗曚綅鏍峰紡 */
+.coal-input :deep(.el-input__suffix-inner),
+.quantity-input :deep(.el-input__suffix-inner) {
+ display: flex;
+ align-items: center;
+ font-style: normal;
+ color: #909399;
+ font-size: 12px;
+}
</style>
diff --git a/src/views/equipment/management/mould/equipmentRequisitionDialog.vue b/src/views/equipment/management/mould/equipmentRequisitionDialog.vue
index 8438624..c3f6907 100644
--- a/src/views/equipment/management/mould/equipmentRequisitionDialog.vue
+++ b/src/views/equipment/management/mould/equipmentRequisitionDialog.vue
@@ -1,7 +1,7 @@
<template>
<el-dialog
v-model="visible"
- :title="isEdit ? '缂栬緫璁惧棰嗙敤' : '鏂板璁惧棰嗙敤'"
+ :title="isReturnMode ? '璁惧褰掕繕' : (isEdit ? '缂栬緫璁惧棰嗙敤' : '鏂板璁惧棰嗙敤')"
width="600px"
@close="handleClose"
>
@@ -10,7 +10,7 @@
<el-select
v-model="form.userId"
placeholder="璇烽�夋嫨"
- :disabled="isViewMode"
+ :disabled="isViewMode || isReturnMode"
@change="getEquipment"
>
<el-option
@@ -25,7 +25,7 @@
<el-select
v-model="form.equipmentId"
placeholder="璇烽�夋嫨"
- :disabled="isViewMode"
+ :disabled="isViewMode || isReturnMode"
>
<el-option
v-for="item in equipmentList"
@@ -35,7 +35,7 @@
/>
</el-select>
</el-form-item>
- <el-form-item label="璁惧搴撳瓨" prop="equipmentStock">
+ <el-form-item label="璁惧搴撳瓨" prop="equipmentStock" v-if="!isReturnMode && formData.status !== 2">
<el-input
:value="
equipmentList.find((item) => item.id == form.equipmentId)
@@ -45,7 +45,21 @@
style="width: 100%"
/>
</el-form-item>
- <el-form-item label="棰嗙敤鏁伴噺" prop="usageQuantity">
+ <el-form-item label="宸蹭娇鐢ㄦ暟閲�" prop="usedQuantity" v-if="isReturnMode">
+ <el-input
+ :value="formData.usageQuantity"
+ disabled
+ style="width: 100%"
+ />
+ </el-form-item>
+ <el-form-item label="宸插綊杩樻暟閲�" prop="returnedQuantity" v-if="isReturnMode">
+ <el-input
+ :value="formData.totalReturnNo || 0"
+ disabled
+ style="width: 100%"
+ />
+ </el-form-item>
+ <el-form-item label="棰嗙敤鏁伴噺" prop="usageQuantity" v-if="!isReturnMode && formData.status !== 2">
<el-input-number
v-model="form.usageQuantity"
:min="1"
@@ -59,19 +73,27 @@
>(鏈�澶歿{ maxQuantity }}鍙�)</span
>
</el-form-item>
- <el-form-item label="浣跨敤鐘舵��" prop="equipmentStatus">
- <!-- 缂栬緫鐨勬椂鍊欒嚜鍔ㄥ尮閰� -->
- <el-select
- v-model="form.equipmentStatus"
- placeholder="璇烽�夋嫨"
- :disabled="isViewMode"
- default-first-option
+ <el-form-item label="鏈褰掕繕鏁伴噺" prop="returnQuantity" v-if="isReturnMode">
+ <el-input-number
+ v-model="form.returnQuantity"
+ :min="1"
+ :max="Math.max(1, remainingReturnQuantity)"
+ style="width: 100%"
+ :disabled="remainingReturnQuantity <= 0"
+ />
+ <span
+ style="color: #999; font-size: 12px; margin-left: 8px"
+ v-if="remainingReturnQuantity > 0"
+ >(鏈�澶歿{ remainingReturnQuantity }}鍙�)</span
>
- <el-option label="浣跨敤涓�" :value="1" />
- <el-option label="宸插綊杩�" :value="2" :disabled="props.id" />
- </el-select>
+ <span
+ style="color: #ff4d4f; font-size: 12px; margin-left: 8px"
+ v-else
+ >(宸插叏閮ㄥ綊杩�)</span
+ >
</el-form-item>
- <el-form-item label="浣跨敤寮�濮嬫椂闂�" prop="usageStartTime">
+ <!-- 浣跨敤寮�濮嬫椂闂� - 鍙湪闈炲綊杩樻ā寮忔樉绀� -->
+ <el-form-item label="浣跨敤寮�濮嬫椂闂�" prop="usageStartTime" v-if="!isReturnMode">
<el-date-picker
v-model="form.usageStartTime"
type="datetime"
@@ -82,14 +104,18 @@
:disabled="isViewMode"
/>
</el-form-item>
- <!-- <el-form-item label="浣跨敤缁撴潫鏃堕棿" prop="usageEndTime">
+
+ <!-- 褰掕繕缁撴潫鏃堕棿 - 鍙湪褰掕繕妯″紡鏄剧ず -->
+ <el-form-item label="褰掕繕鏃堕棿" prop="returnTime" v-if="isReturnMode">
<el-date-picker
- v-model="form.usageEndTime"
+ v-model="form.returnTime"
type="datetime"
- placeholder="閫夋嫨缁撴潫鏃堕棿"
+ placeholder="閫夋嫨褰掕繕鏃堕棿"
style="width: 100%"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
/>
- </el-form-item> -->
+ </el-form-item>
<el-form-item label="澶囨敞" prop="remarks">
<el-input
v-model="form.remarks"
@@ -140,21 +166,9 @@
type: Object,
default: () => ({}),
},
- beforeClose: {
- type: Function,
- default: () => {},
- },
addOrEdit: {
type: String,
default: "add",
- },
- title: {
- type: String,
- default: "",
- },
- equipmentStatus: {
- type: [Number, String], // 鍏佽鏁板瓧鎴栧瓧绗︿覆
- default: 1,
},
});
const maxQuantity = computed(() => {
@@ -174,9 +188,22 @@
const isViewMode = computed(
() =>
props.addOrEdit === "view" ||
- props.addOrEdit === "viewRow" ||
- Number(props.equipmentStatus) === 2
+ props.addOrEdit === "viewRow"
);
+
+// 鍒ゆ柇鏄惁涓哄綊杩樻ā寮�
+const isReturnMode = computed(() => props.addOrEdit === "return");
+
+// 璁$畻鍓╀綑鍙綊杩樻暟閲�
+const remainingReturnQuantity = computed(() => {
+ if (!isReturnMode.value || !props.formData.usageQuantity) return 0;
+
+ const totalUsageQuantity = props.formData.usageQuantity || 0; // 鎬讳娇鐢ㄦ暟閲�
+ const alreadyReturnedQuantity = props.formData.totalReturnNo || 0; // 宸插綊杩樻暟閲�
+ const remaining = totalUsageQuantity - alreadyReturnedQuantity; // 鍓╀綑鍙綊杩樻暟閲�
+
+ return Math.max(0, remaining); // 纭繚涓嶄负璐熸暟
+});
const isEdit = computed(() => !!props.formData?.id);
const formRef = ref();
@@ -186,21 +213,24 @@
userId: "",
equipmentId: "",
usageQuantity: 1,
- equipmentStatus: 1, // 榛樿浣跨敤涓�
usageStartTime: "",
+ returnQuantity: 1,
+ returnTime: "",
remarks: "",
};
const form = ref({ ...defaultForm });
-// 纭繚鍒濆鍖栨椂浣跨敤鐘舵�佹湁榛樿鍊�
+// 鑾峰彇褰撳墠鏃ユ湡锛圷YYY-MM-DD鏍煎紡锛�
+const getCurrentDate = () => {
+ const now = new Date();
+ const year = now.getFullYear();
+ const month = String(now.getMonth() + 1).padStart(2, '0');
+ const day = String(now.getDate()).padStart(2, '0');
+ return `${year}-${month}-${day}`;
+};
+
+// 纭繚鍒濆鍖栨椂鑾峰彇璁惧鍒楄〃
onMounted(() => {
- if (
- form.value.equipmentStatus === undefined ||
- form.value.equipmentStatus === null
- ) {
- console.log(form.value.equipmentStatus);
- form.value.equipmentStatus = 1;
- }
getEquipment();
});
@@ -208,40 +238,76 @@
() => props.formData,
(val) => {
if (val && Object.keys(val).length > 0) {
- // 缂栬緫妯″紡锛岀洿鎺ヨ祴鍊硷紝涓嶄娇鐢ㄩ粯璁ゅ�煎悎骞�
form.value = { ...val };
+
+ // 褰掕繕妯″紡鍒濆鍖�
+ if (isReturnMode.value) {
+ form.value.returnTime = getCurrentDate();
+ const maxReturnQuantity = remainingReturnQuantity.value;
+ form.value.returnQuantity = maxReturnQuantity > 0 ? Math.min(1, maxReturnQuantity) : 0;
+ }
} else {
- // 鏂板妯″紡锛屼娇鐢ㄩ粯璁ゅ��
form.value = { ...defaultForm };
}
},
{ immediate: true }
);
-const rules = {
- userId: [{ required: true, message: "璇疯緭鍏ラ鐢ㄤ汉", trigger: "blur" }],
- equipmentId: [{ required: true, message: "璇疯緭鍏ヨ澶嘔D", trigger: "blur" }],
- usageQuantity: [
- { required: true, message: "璇疯緭鍏ラ鐢ㄦ暟閲�", trigger: "blur" },
- { type: "number", min: 1, message: "鑷冲皯棰嗙敤1鍙�", trigger: "blur" },
- {
- validator: (rule, value, callback) => {
- if (maxQuantity.value !== null && value > maxQuantity.value) {
- callback(new Error("棰嗙敤鏁伴噺涓嶈兘澶т簬璁惧鏁伴噺"));
- } else {
- callback();
- }
- },
- trigger: "blur",
- },
- ],
- equipmentStatus: [
- { required: true, message: "璇烽�夋嫨浣跨敤鐘舵��", trigger: "change" },
- ],
- usageStartTime: [
- { required: true, message: "璇烽�夋嫨寮�濮嬫椂闂�", trigger: "change" },
- ],
-};
+const rules = computed(() => {
+ const baseRules = {
+ userId: [{ required: true, message: "璇疯緭鍏ラ鐢ㄤ汉", trigger: "blur" }],
+ equipmentId: [{ required: true, message: "璇疯緭鍏ヨ澶嘔D", trigger: "blur" }],
+ };
+
+ if (isReturnMode.value) {
+ // 褰掕繕妯″紡鐨勯獙璇佽鍒�
+ return {
+ ...baseRules,
+ returnQuantity: [
+ { required: true, message: "璇疯緭鍏ュ綊杩樻暟閲�", trigger: "blur" },
+ { type: "number", min: 1, message: "鑷冲皯褰掕繕1鍙�", trigger: "blur" },
+ {
+ validator: (rule, value, callback) => {
+ const remaining = remainingReturnQuantity.value;
+ if (remaining <= 0) {
+ callback(new Error("宸插叏閮ㄥ綊杩橈紝鏃犳硶缁х画褰掕繕"));
+ } else if (value > remaining) {
+ callback(new Error(`褰掕繕鏁伴噺涓嶈兘澶т簬鍓╀綑鍙綊杩樻暟閲�(${remaining}鍙�)`));
+ } else {
+ callback();
+ }
+ },
+ trigger: "blur",
+ },
+ ],
+ returnTime: [
+ { required: true, message: "璇烽�夋嫨褰掕繕鏃堕棿", trigger: "change" },
+ ],
+ };
+ } else {
+ // 鏂板/缂栬緫妯″紡鐨勯獙璇佽鍒�
+ return {
+ ...baseRules,
+ usageQuantity: [
+ { required: true, message: "璇疯緭鍏ラ鐢ㄦ暟閲�", trigger: "blur" },
+ { type: "number", min: 1, message: "鑷冲皯棰嗙敤1鍙�", trigger: "blur" },
+ {
+ validator: (rule, value, callback) => {
+ if (maxQuantity.value !== null && value > maxQuantity.value) {
+ callback(new Error("棰嗙敤鏁伴噺涓嶈兘澶т簬璁惧鏁伴噺"));
+ } else {
+ callback();
+ }
+ },
+ trigger: "blur",
+ },
+ ],
+ usageStartTime: [
+ { required: true, message: "璇烽�夋嫨寮�濮嬫椂闂�", trigger: "change" },
+ ],
+ };
+ }
+});
function handleClose() {
emit("update:modelValue", false);
@@ -250,8 +316,29 @@
function handleSubmit() {
formRef.value.validate((valid) => {
if (!valid) return;
- let res = addOrEditUsageRecord(form.value);
- emit("submit", { ...form.value });
+
+ let submitData = { ...form.value };
+
+ // 褰掕繕妯″紡澶勭悊
+ if (isReturnMode.value) {
+ const currentReturnQuantity = form.value.returnQuantity;
+ const totalUsageQuantity = props.formData.usageQuantity;
+ const alreadyReturnedQuantity = props.formData.totalReturnNo || 0;
+ const newTotalReturnedQuantity = alreadyReturnedQuantity + currentReturnQuantity;
+
+ submitData = {
+ ...props.formData,
+ totalReturnNo: newTotalReturnedQuantity,
+ returnQuantity: currentReturnQuantity,
+ returnTime: form.value.returnTime,
+ equipmentStatus: 2,
+ remarks: form.value.remarks,
+ usageQuantity: totalUsageQuantity
+ };
+ }
+
+ addOrEditUsageRecord(submitData);
+ emit("submit", submitData);
handleClose();
});
}
diff --git a/src/views/procureMent/components/ProductionDialog.vue b/src/views/procureMent/components/ProductionDialog.vue
index 4378006..859cbea 100644
--- a/src/views/procureMent/components/ProductionDialog.vue
+++ b/src/views/procureMent/components/ProductionDialog.vue
@@ -1,37 +1,55 @@
<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="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,10 +58,10 @@
</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>
@@ -52,10 +70,10 @@
</el-form-item>
<el-form-item label="鍗曚环(鍚◣)" prop="priceIncludingTax">
<el-input
- v-model.number="form.priceIncludingTax"
- 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>
@@ -64,9 +82,9 @@
</el-form-item>
<el-form-item label="鍗曚环(涓嶅惈绋�)" prop="priceExcludingTax">
<el-input
- v-model.number="form.priceExcludingTax"
- placeholder="鑷姩璁$畻"
- disabled
+ v-model.number="form.priceExcludingTax"
+ placeholder="鑷姩璁$畻"
+ disabled
>
<template v-slot:suffix>
<i style="font-style: normal">鍏�</i>
@@ -75,9 +93,9 @@
</el-form-item>
<el-form-item label="鎬讳环(涓嶅惈绋�)" prop="totalPriceExcludingTax">
<el-input
- v-model.number="form.totalPriceExcludingTax"
- placeholder="鑷姩璁$畻"
- disabled
+ v-model.number="form.totalPriceExcludingTax"
+ placeholder="鑷姩璁$畻"
+ disabled
>
<template v-slot:suffix>
<i style="font-style: normal">鍏�</i>
@@ -86,9 +104,23 @@
</el-form-item>
<el-form-item label="鎬讳环(鍚◣)" prop="totalPriceIncludingTax">
<el-input
- v-model.number="form.totalPriceIncludingTax"
- placeholder="鑷姩璁$畻"
- disabled
+ 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 +128,38 @@
</el-input>
</el-form-item>
<el-form-item label="鐧昏浜�" prop="registrantId">
- <el-input :value="match(form.registrantId)" v-model.number="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>
<template #footer>
<div class="dialog-footer">
<!-- 閲嶇疆鍜屽彇娑� -->
- <el-button @click="handleClose" v-if="title.includes('鏂板') || 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" v-if="!isViewMode" @click="handleSubmit">纭</el-button>
</div>
</template>
</el-dialog>
@@ -128,10 +167,10 @@
</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";
const props = defineProps({
title: {
@@ -185,7 +224,12 @@
if (isNaN(num) || num === null || num === undefined || num === "") {
return 0;
}
- return Number((Math.floor(parseFloat(num) * Math.pow(10, precision)) / Math.pow(10, precision)).toFixed(precision));
+ return Number(
+ (
+ Math.floor(parseFloat(num) * Math.pow(10, precision)) /
+ Math.pow(10, precision)
+ ).toFixed(precision)
+ );
};
// 瀹夊叏鑾峰彇鏁板��
@@ -202,19 +246,22 @@
// 1. 鏍规嵁鍚◣鍗曚环鍜岀◣鐜囪绠椾笉鍚◣鍗曚环
// 涓嶅惈绋庡崟浠� = 鍚◣鍗曚环 / (1 + 绋庣巼/100)
- const priceExcludingTax = priceIncludingTax && taxRate
- ? parseFloat((priceIncludingTax / (1 + taxRate / 100)).toFixed(2))
- : 0;
+ const priceExcludingTax =
+ priceIncludingTax && taxRate
+ ? parseFloat((priceIncludingTax / (1 + taxRate / 100)).toFixed(2))
+ : 0;
// 2. 璁$畻涓嶅惈绋庢�讳环 = 涓嶅惈绋庡崟浠� 脳 鏁伴噺
- const totalPriceExcludingTax = priceExcludingTax && quantity
- ? toFixed(priceExcludingTax * quantity, 2)
- : 0;
+ const totalPriceExcludingTax =
+ priceExcludingTax && quantity
+ ? toFixed(priceExcludingTax * quantity, 2)
+ : 0;
// 3. 璁$畻鍚◣鎬讳环 = 鍚◣鍗曚环 脳 鏁伴噺
- const totalPriceIncludingTax = priceIncludingTax && quantity
- ? toFixed(priceIncludingTax * quantity, 2)
- : 0;
+ const totalPriceIncludingTax =
+ priceIncludingTax && quantity
+ ? toFixed(priceIncludingTax * quantity, 2)
+ : 0;
// 淇濊瘉鏄剧ず涓轰袱浣嶅皬鏁帮紙濡�88.5鏄剧ず涓�88.50锛�
form.value.priceExcludingTax = priceExcludingTax.toFixed(2);
@@ -224,7 +271,11 @@
// 鐩戝惉琛ㄥ崟瀵硅薄鍙樺寲锛岀敤浜庡鐞嗙紪杈戞ā寮忎笅鐨勬暟鎹姞杞藉拰瀹炴椂璁$畻
watch(
- () => [form.value.priceIncludingTax, form.value.taxRate, form.value.purchaseQuantity],
+ () => [
+ form.value.priceIncludingTax,
+ form.value.taxRate,
+ form.value.purchaseQuantity,
+ ],
() => {
// 闃叉姈澶勭悊锛岄伩鍏嶉绻佽绠�
nextTick(() => {
@@ -241,7 +292,11 @@
};
// 澶勭悊绋庣巼杈撳叆妗嗗け鐒︿簨浠�
const handleTaxRateBlur = () => {
- if (form.value.taxRate !== null && form.value.taxRate !== undefined && form.value.taxRate !== "") {
+ if (
+ form.value.taxRate !== null &&
+ form.value.taxRate !== undefined &&
+ form.value.taxRate !== ""
+ ) {
form.value.taxRate = toFixed(parseFloat(form.value.taxRate), 2);
// watch 浼氳嚜鍔ㄨЕ鍙� calculatePrices锛屼笉闇�瑕佹墜鍔ㄨ皟鐢�
}
@@ -249,16 +304,30 @@
// 澶勭悊鍚◣鍗曚环杈撳叆妗嗗け鐒︿簨浠�
const handlePriceBlur = () => {
- if (form.value.priceIncludingTax !== null && form.value.priceIncludingTax !== undefined && form.value.priceIncludingTax !== "") {
- form.value.priceIncludingTax = toFixed(parseFloat(form.value.priceIncludingTax), 2);
+ if (
+ form.value.priceIncludingTax !== null &&
+ form.value.priceIncludingTax !== undefined &&
+ form.value.priceIncludingTax !== ""
+ ) {
+ 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 = toFixed(parseFloat(form.value.purchaseQuantity), 3); // 鏁伴噺淇濈暀3浣嶅皬鏁�
+ if (
+ form.value.purchaseQuantity !== null &&
+ form.value.purchaseQuantity !== undefined &&
+ form.value.purchaseQuantity !== ""
+ ) {
+ form.value.purchaseQuantity = toFixed(
+ parseFloat(form.value.purchaseQuantity),
+ 3
+ ); // 鏁伴噺淇濈暀3浣嶅皬鏁�
// watch 浼氳嚜鍔ㄨЕ鍙� calculatePrices锛屼笉闇�瑕佹墜鍔ㄨ皟鐢�
}
};
@@ -272,23 +341,23 @@
});
const rules = {
supplierName: [
- {required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur"},
+ { required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" },
],
- coal: [{required: true, message: "璇疯緭鍏ョ叅绉�", trigger: "blur"}],
+ 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"},
+ { required: true, message: "璇疯緭鍏ュ崟浠�", trigger: "blur" },
],
priceIncludingTax: [
- {required: true, message: "璇疯緭鍏ュ惈绋庡崟浠�", trigger: "blur"},
+ { required: true, message: "璇疯緭鍏ュ惈绋庡崟浠�", trigger: "blur" },
],
- taxRate:[
- {required: true, message: "璇疯緭鍏ョ◣鐜�", trigger: "blur"},
- {type: "number", message: "绋庣巼蹇呴』涓烘暟瀛�", trigger: "blur"},
- ]
+ taxRate: [
+ { required: true, message: "璇疯緭鍏ョ◣鐜�", trigger: "blur" },
+ { type: "number", message: "绋庣巼蹇呴』涓烘暟瀛�", trigger: "blur" },
+ ],
};
// 鍏抽棴寮圭獥
const handleClose = () => {
diff --git a/src/views/procureMent/index.vue b/src/views/procureMent/index.vue
index 2dfe17d..159c0fc 100644
--- a/src/views/procureMent/index.vue
+++ b/src/views/procureMent/index.vue
@@ -86,7 +86,8 @@
const { proxy } = getCurrentInstance();
const dialogFormVisible = ref(false);
const form = ref({
- taxRate: "13"
+ taxRate: 13,
+ freight: 20,
});
const title = ref("");
// 鐘舵�佸彉閲�
@@ -154,6 +155,7 @@
{ prop: "purchaseQuantity", label: "閲囪喘鏁伴噺", minWidth: 100 },
{ prop: "priceIncludingTax", label: "鍗曚环锛堝惈绋庯級", minWidth: 150 },
{ prop: "totalPriceIncludingTax", label: "鎬讳环锛堝惈绋庯級", minWidth: 100 },
+ { prop: "freight", label: "杩愯垂", minWidth: 100 },
{ prop: "taxRate", label: "绋庣巼", minWidth: 100 },
{ prop: "priceExcludingTax", label: "涓嶅惈绋庡崟浠�", minWidth: 100 },
{ prop: "registrantId", label: "鐧昏浜�", minWidth: 100,
@@ -221,7 +223,8 @@
totalPriceExcludingTax: "",
priceIncludingTax: "",
totalPriceIncludingTax: "",
- taxRate: "13",
+ taxRate: 13,
+ freight:20,
registrantId: userInfo.value.userId,
registrationDate: new Date().toISOString().split("T")[0],
};
--
Gitblit v1.9.3