| | |
| | | </el-input> |
| | | </el-form-item> |
| | | |
| | | <!-- æ°å¢ï¼ç«å°éæ©ä¸ææ¡ --> |
| | | <el-form-item |
| | | label="ååºç«å°ï¼" |
| | | name="station" |
| | | :rules="[ |
| | | { |
| | | required: true, |
| | | message: 'è¯·éæ©ååºç«å°', |
| | | trigger: 'blur', |
| | | }, |
| | | ]" |
| | | class="form-item" |
| | | > |
| | | <el-select |
| | | v-model="selectedStation" |
| | | placeholder="è¯·éæ©ååºç«å°" |
| | | :disabled="!formData.boxNo.trim() || loading" |
| | | class="custom-input" |
| | | :class="{ 'has-value': selectedStation }" |
| | | > |
| | | <el-option |
| | | v-for="item in stations" |
| | | :key="item.key || item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <!-- æ¡ç è¾å
¥æ¡ --> |
| | | <el-form-item |
| | | label="çç¹æ¡ç ï¼" |
| | |
| | | > |
| | | <el-input |
| | | v-model.number="formData.actualQuantity" |
| | | placeholder="请è¾å
¥å®é
çç¹æ°éï¼å¤§äº0ï¼" |
| | | placeholder="请è¾å
¥å®é
çç¹æ°é" |
| | | type="number" |
| | | clearable |
| | | @keydown.enter="handleStockTakeComplete" |
| | | :disabled="!formData.stockQuantity || loading" |
| | | class="custom-input" |
| | | :class="{ 'has-value': formData.actualQuantity }" |
| | | :class="{ 'has-value': formData.actualQuantity !== '' }" |
| | | ></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | |
| | | type="info" |
| | | size="small" |
| | | @click="handleBoxReturn" |
| | | :disabled="!formData.boxNo.trim() || loading" |
| | | :disabled="!formData.boxNo.trim() || !selectedStation || loading" |
| | | class="return-btn" |
| | | > |
| | | <Return /> æç®±ååº |
| | |
| | | type="primary" |
| | | size="small" |
| | | @click="handleStockTakeComplete" |
| | | :disabled=" |
| | | loading || |
| | | !formData.boxNo.trim() || |
| | | !formData.barcode.trim() || |
| | | !formData.stockQuantity || |
| | | !formData.actualQuantity |
| | | " |
| | | :disabled="isFormCompleteDisabled" |
| | | class="complete-btn" |
| | | > |
| | | <Check /> çç¹å®æ |
| | |
| | | |
| | | import VolBox from "@/components/basic/VolBox.vue"; |
| | | import http from "@/api/http"; |
| | | // æ°å¢ï¼å¼å
¥ç«å°ç®¡çå·¥å
·ï¼å示ä¾ä»£ç ä¿æä¸è´ï¼ |
| | | import { stationManager, STATION_STORAGE_KEY } from "@/../src/uitils/stationManager"; |
| | | |
| | | // ååºå¼åé - åæ®å· |
| | | const orderNo = ref(""); |
| | |
| | | const loading = ref(false); |
| | | const formRef = ref(null); |
| | | |
| | | // æ°å¢ï¼ç«å°ç¸å
³ååºå¼æ°æ®ï¼ä»¿ç
§ç¤ºä¾ä»£ç ï¼ |
| | | const stations = ref([ |
| | | { label: "ç«å°2", value: "2-1" }, |
| | | { label: "ç«å°3", value: "3-1" }, |
| | | ]); |
| | | const selectedStation = ref(stationManager.getStation() || ""); // é»è®¤éä¸ç¼åçç«å° |
| | | |
| | | // 模æ¿å¼ç¨ |
| | | const boxNoInputRef = ref(null); |
| | | const barcodeInputRef = ref(null); |
| | |
| | | // æ£æµæ¯å¦ä¸ºç§»å¨ç«¯ |
| | | const isMobile = computed(() => { |
| | | return window.innerWidth < 768; |
| | | }); |
| | | |
| | | // 计ç®å±æ§ï¼çç¹å®ææé®æ¯å¦ç¦ç¨ |
| | | const isFormCompleteDisabled = computed(() => { |
| | | return ( |
| | | loading.value || |
| | | !formData.boxNo.trim() || |
| | | !formData.barcode.trim() || |
| | | !formData.stockQuantity || |
| | | formData.actualQuantity === "" || |
| | | formData.actualQuantity === null || |
| | | formData.actualQuantity === undefined || |
| | | Number(formData.actualQuantity) < 0 // å°äº0æ¶ç¦ç¨ï¼0æ¯å
许ç |
| | | ); |
| | | }); |
| | | |
| | | // ç»ä»¶æè½½æ¶èç¦å°æç®±å·è¾å
¥æ¡ |
| | |
| | | formData.barcode = ""; |
| | | formData.stockQuantity = ""; |
| | | formData.actualQuantity = ""; |
| | | // æ°å¢ï¼æç®±å·æ¸
空æ¶ï¼éç½®ç«å°éæ© |
| | | selectedStation.value = stationManager.getStation() || ""; |
| | | } |
| | | }, |
| | | { immediate: true } |
| | |
| | | formData.barcode = ""; |
| | | formData.stockQuantity = ""; |
| | | formData.actualQuantity = ""; |
| | | // æ°å¢ï¼æå¼å¼¹çªæ¶éç½®ç«å°éæ©ï¼é»è®¤åç¼åçç«å°ï¼ |
| | | selectedStation.value = stationManager.getStation() || ""; |
| | | nextTick(() => { |
| | | boxNoInputRef.value?.focus(); |
| | | }); |
| | |
| | | } |
| | | }; |
| | | |
| | | // å®é
çç¹æ°ééªè¯ï¼ä¼åï¼æå¼æ¶éªè¯åæ³æ§ï¼ |
| | | // å®é
çç¹æ°ééªè¯ï¼å
许0ï¼ä½ä¸å
许å°äº0 |
| | | const validateActualQuantity = (rule, value, callback) => { |
| | | if (value === null || value === undefined) { |
| | | callback(new Error("请è¾å
¥å®é
çç¹æ°é")); |
| | | } else if (value <= 0) { |
| | | callback(new Error("å®é
çç¹æ°éå¿
须大äº0")); |
| | | } else if (!Number.isInteger(value)) { |
| | | callback(new Error("å®é
çç¹æ°éå¿
é¡»æ¯æ´æ°")); |
| | | } else { |
| | | // 空å¼ç±requiredè§åå¤çï¼è¿éåªéªè¯æ°å¼åæ³æ§ |
| | | if (value === null || value === undefined || value === "") { |
| | | callback(); // 空å¼ä¸å¨è¿éæç¤ºï¼äº¤ç»requiredè§å |
| | | } |
| | | // éªè¯æ°å¼æ¯å¦å°äº0 |
| | | else if (value < 0) { |
| | | callback(new Error("å®é
çç¹æ°éä¸è½å°äº0")); |
| | | } |
| | | // éªè¯éè¿ï¼å
许0ï¼ |
| | | else { |
| | | callback(); |
| | | } |
| | | }; |
| | |
| | | const valid = await formRef.value.validate(); |
| | | if (!valid) return; |
| | | |
| | | // é¢å¤æ£æ¥å®é
çç¹æ°éæ¯å¦å°äº0 |
| | | if (formData.actualQuantity < 0) { |
| | | ElMessage.error("å®é
çç¹æ°éä¸è½å°äº0"); |
| | | return; |
| | | } |
| | | |
| | | const { boxNo, barcode, actualQuantity, stockQuantity } = formData; |
| | | const receiptNo = orderNo.value; |
| | | |
| | |
| | | } |
| | | }; |
| | | |
| | | // æç®±ååºåè½ |
| | | // æç®±ååºåè½ï¼æ ¸å¿ä¿®æ¹ï¼å¢å ç«å°éªè¯ + ä¼ å
¥sourceAddressåæ°ï¼ |
| | | const handleBoxReturn = async () => { |
| | | const boxNo = formData.boxNo.trim(); |
| | | // æ°å¢ï¼éªè¯ç«å°æ¯å¦éæ© |
| | | if (!boxNo) { |
| | | ElMessage.warning("请å
è¾å
¥ææ«ææç®±å·"); |
| | | return; |
| | | } |
| | | if (!selectedStation.value) { |
| | | ElMessage.warning("è¯·éæ©ååºç«å°"); |
| | | return; |
| | | } |
| | | |
| | | try { |
| | | await ElMessageBox.confirm(`ç¡®å®å°æç®±ã${boxNo}ãååºåï¼`, "ååºç¡®è®¤", { |
| | | await ElMessageBox.confirm(`ç¡®å®å°æç®±ã${boxNo}ãååºè³ã${selectedStation.value}ãç«å°åï¼`, "ååºç¡®è®¤", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "info", |
| | |
| | | |
| | | loading.value = true; |
| | | |
| | | // æ°å¢ï¼æ¼æ¥sourceAddressåæ°ï¼ç«å°æ°æ®ï¼å°æ¥å£è¯·æ±ä¸ |
| | | const res = await http.post( |
| | | `/api/TakeStockOrder/ReturnBox?boxNo=${encodeURIComponent(boxNo)}&orderNo=${encodeURIComponent( |
| | | orderNo.value |
| | | )}`, |
| | | )}&sourceAddress=${encodeURIComponent(selectedStation.value)}`, // æ°å¢sourceAddressåæ° |
| | | "æç®±ååºä¸..." |
| | | ); |
| | | |
| | | if (res.status) { |
| | | ElMessage.success(`æç®±ã${boxNo}ãååºæåï¼`); |
| | | ElMessage.success(`æç®±ã${boxNo}ãååºè³ã${selectedStation.value}ãç«å°æåï¼`); |
| | | formData.boxNo = ""; |
| | | formData.barcode = ""; |
| | | formData.stockQuantity = ""; |
| | | formData.actualQuantity = ""; |
| | | selectedStation.value = stationManager.getStation() || ""; // éç½®ç«å°éæ© |
| | | nextTick(() => { |
| | | boxNoInputRef.value?.focus(); |
| | | }); |
| | |
| | | } |
| | | |
| | | /* æå¼æ¶éèå ä½ç¬¦ + ä¼åè¾¹æ¡ */ |
| | | .custom-input.has-value :deep(.el-input__inner) { |
| | | .custom-input.has-value :deep(.el-input__inner), |
| | | .custom-input.has-value :deep(.el-select__wrapper) { |
| | | --el-input-placeholder-color: transparent; /* éèå ä½ç¬¦ */ |
| | | border-color: #8cc5ff; /* æµ
èè¾¹æ¡ï¼åºåæ å¼ç¶æ */ |
| | | background-color: #ffffff; |
| | | } |
| | | |
| | | .custom-input :deep(.el-input__inner) { |
| | | .custom-input :deep(.el-input__inner), |
| | | .custom-input :deep(.el-select__wrapper) { |
| | | border-radius: 8px; |
| | | border-color: #e5f0fa; |
| | | transition: all 0.2s ease; |
| | |
| | | } |
| | | |
| | | /* èç¦æ ·å¼ä¼å */ |
| | | .custom-input :deep(.el-input__inner:focus) { |
| | | .custom-input :deep(.el-input__inner:focus), |
| | | .custom-input :deep(.el-select__wrapper:focus) { |
| | | border-color: #409eff; |
| | | box-shadow: 0 0 0 3px rgba(64, 158, 255, 0.1); |
| | | background-color: #ffffff; |
| | |
| | | } |
| | | |
| | | /* æå¼æ¶å³ä½¿éªè¯å¤±è´¥ï¼ä¹ä¸æ¾ç¤ºéè¯¯è¾¹æ¡ */ |
| | | .custom-input.has-value :deep(.el-input__inner.el-input__inner--error) { |
| | | .custom-input.has-value :deep(.el-input__inner.el-input__inner--error), |
| | | .custom-input.has-value :deep(.el-select__wrapper.el-select__wrapper--error) { |
| | | border-color: #8cc5ff; |
| | | box-shadow: none; |
| | | } |
| | |
| | | } |
| | | |
| | | /* å ä½ç¬¦æ ·å¼ - ç»ä¸é¢è² */ |
| | | .el-input__inner::-webkit-input-placeholder { |
| | | .el-input__inner::-webkit-input-placeholder, |
| | | .el-select__placeholder { |
| | | color: #b3d8ff; |
| | | font-size: 13px; |
| | | } |
| | | |
| | | .el-input__inner::-moz-placeholder { |
| | | .el-input__inner::-moz-placeholder, |
| | | .el-select__placeholder { |
| | | color: #b3d8ff; |
| | | font-size: 13px; |
| | | } |
| | | |
| | | .el-input__inner:-ms-input-placeholder { |
| | | .el-input__inner:-ms-input-placeholder, |
| | | .el-select__placeholder { |
| | | color: #b3d8ff; |
| | | font-size: 13px; |
| | | } |
| | | |
| | | .el-input__inner::placeholder { |
| | | .el-input__inner::placeholder, |
| | | .el-select__placeholder { |
| | | color: #b3d8ff; |
| | | font-size: 13px; |
| | | } |