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