军泰伟业
1.军泰伟业-库存管理增加库位
2.军泰伟业-生产入库要审核,加个入库审核菜单,入库数量,库位,通过不通过
| | |
| | | params: query, |
| | | }) |
| | | } |
| | | |
| | | export function getDept(query) { |
| | | return request({ |
| | | url: '/approveProcess/getDept', |
| | |
| | | params: query, |
| | | }) |
| | | } |
| | | |
| | | export function approveProcessGetInfo(query) { |
| | | return request({ |
| | | url: '/approveProcess/get', |
| | |
| | | params: query, |
| | | }) |
| | | } |
| | | |
| | | // æ°å¢å®¡æ¹æµç¨ |
| | | export function approveProcessAdd(query) { |
| | | return request({ |
| | |
| | | data: query, |
| | | }) |
| | | } |
| | | |
| | | // ä¿®æ¹å®¡æ¹æµç¨ |
| | | export function approveProcessUpdate(query) { |
| | | return request({ |
| | |
| | | data: query, |
| | | }) |
| | | } |
| | | |
| | | // æäº¤å®¡æ¹ |
| | | export function updateApproveNode(query) { |
| | | return request({ |
| | |
| | | data: query, |
| | | }) |
| | | } |
| | | |
| | | // éè´å
¥åº |
| | | export function purchaseApprove(query) { |
| | | return request({ |
| | | url: '/approveNode/purchaseApprove', |
| | | method: 'post', |
| | | data: query, |
| | | }) |
| | | } |
| | | |
| | | // å é¤å®¡æ¹æµç¨ |
| | | export function approveProcessDelete(query) { |
| | | return request({ |
| | |
| | | data: query, |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢å®¡æ¹æµç¨ |
| | | export function approveProcessDetails(query) { |
| | | return request({ |
| | | url: '/approveNode/details/' + query, |
| | | method: 'get', |
| | | }) |
| | | } |
| | | } |
| | |
| | | }); |
| | | }; |
| | | |
| | | // å
¥åºå®¡æ ¸ |
| | | export const productionApprove = (data) => { |
| | | return request({ |
| | | url: "/stockInRecord/productionApprove", |
| | | method: "post", |
| | | data, |
| | | }); |
| | | }; |
| | | |
| | | export const batchDeleteStockInRecords = (ids) => { |
| | | return request({ |
| | | url: "/stockInRecord", |
| | | method: "delete", |
| | | data: ids, |
| | | }); |
| | | }; |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | title="éè´å
¥åº" |
| | | width="900px" |
| | | @close="closeDialog" |
| | | > |
| | | <el-skeleton :loading="loading" animated> |
| | | <template #template> |
| | | <el-skeleton-item variant="h3" style="width: 30%" /> |
| | | <el-skeleton-item variant="text" style="width: 100%" /> |
| | | <el-skeleton-item variant="text" style="width: 100%" /> |
| | | </template> |
| | | <template #default> |
| | | <el-empty |
| | | v-if="!currentPurchase || !currentPurchase.purchaseContractNumber" |
| | | description="æªæ¥è¯¢å°éè´åæ®" |
| | | /> |
| | | <template v-else> |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="éè´ååå·">{{ currentPurchase.purchaseContractNumber }}</el-descriptions-item> |
| | | <el-descriptions-item label="ä¾åºå">{{ currentPurchase.supplierName }}</el-descriptions-item> |
| | | <el-descriptions-item label="项ç®åç§°">{{ currentPurchase.projectName }}</el-descriptions-item> |
| | | <el-descriptions-item label="éå®ååå·">{{ currentPurchase.salesContractNo }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç¾è®¢æ¥æ">{{ currentPurchase.executionDate }}</el-descriptions-item> |
| | | <el-descriptions-item label="å½å
¥æ¥æ">{{ currentPurchase.entryDate }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | |
| | | <div style="margin-top: 20px;"> |
| | | <h4>产åæç»</h4> |
| | | <el-table :data="currentPurchase.productData || []" border style="width: 100%"> |
| | | <el-table-column prop="productCategory" label="产ååç§°" /> |
| | | <el-table-column prop="specificationModel" label="å¾çº¸ç¼å·" /> |
| | | <el-table-column prop="unit" label="åä½" /> |
| | | <el-table-column prop="quantity" label="æ°é" /> |
| | | <el-table-column label="åºä½" min-width="180"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model="scope.row.stockLocation" |
| | | placeholder="请填ååºä½" |
| | | clearable |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | </template> |
| | | </template> |
| | | </el-skeleton> |
| | | |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="handleInbound">确认å
¥åº</el-button> |
| | | <el-button @click="closeDialog">åæ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { getCurrentInstance, ref } from "vue"; |
| | | import { getPurchaseByCode } from "@/api/procurementManagement/procurementLedger.js"; |
| | | import { purchaseApprove } from "@/api/collaborativeApproval/approvalProcess.js"; |
| | | |
| | | const emit = defineEmits(["close"]); |
| | | const { proxy } = getCurrentInstance(); |
| | | |
| | | const dialogVisible = ref(false); |
| | | const loading = ref(false); |
| | | const currentPurchase = ref({}); |
| | | |
| | | const openDialog = (type, row) => { |
| | | if (type !== "inbound") { |
| | | return; |
| | | } |
| | | |
| | | dialogVisible.value = true; |
| | | loading.value = true; |
| | | currentPurchase.value = {}; |
| | | |
| | | const purchaseContractNumber = row?.approveReason; |
| | | if (!purchaseContractNumber) { |
| | | loading.value = false; |
| | | proxy.$modal.msgError("æªæ¾å°éè´ååå·"); |
| | | return; |
| | | } |
| | | |
| | | getPurchaseByCode({ purchaseContractNumber }) |
| | | .then((res) => { |
| | | currentPurchase.value = { |
| | | ...res, |
| | | productData: (res?.productData || []).map((item) => ({ |
| | | ...item, |
| | | stockLocation: item.stockLocation || "", |
| | | })), |
| | | }; |
| | | }) |
| | | .catch((err) => { |
| | | console.error("å è½½éè´ä¿¡æ¯å¤±è´¥:", err); |
| | | proxy.$modal.msgError("å è½½éè´ä¿¡æ¯å¤±è´¥"); |
| | | }) |
| | | .finally(() => { |
| | | loading.value = false; |
| | | }); |
| | | }; |
| | | |
| | | const closeDialog = () => { |
| | | dialogVisible.value = false; |
| | | loading.value = false; |
| | | currentPurchase.value = {}; |
| | | emit("close"); |
| | | }; |
| | | |
| | | const handleInbound = () => { |
| | | const productData = currentPurchase.value?.productData || []; |
| | | if (productData.length === 0) { |
| | | proxy.$modal.msgError("æªæ¾å°éè´æç»"); |
| | | return; |
| | | } |
| | | |
| | | const emptyRow = productData.find((item) => !item.stockLocation || !String(item.stockLocation).trim()); |
| | | if (emptyRow) { |
| | | proxy.$modal.msgError(`请å
å¡«å产åã${emptyRow.productCategory || emptyRow.specificationModel || "æªç¥"}ãçåºä½`); |
| | | return; |
| | | } |
| | | |
| | | const payload = productData.map((item) => ({ |
| | | ...item, |
| | | stockLocation: String(item.stockLocation).trim(), |
| | | })); |
| | | |
| | | purchaseApprove(payload) |
| | | .then(() => { |
| | | proxy.$modal.msgSuccess("å
¥åºæå"); |
| | | closeDialog(); |
| | | }) |
| | | .catch((err) => { |
| | | console.error("å
¥åºå¤±è´¥:", err); |
| | | proxy.$modal.msgError("å
¥åºå¤±è´¥"); |
| | | }); |
| | | }; |
| | | |
| | | defineExpose({ |
| | | openDialog, |
| | | }); |
| | | </script> |
| | |
| | | <el-tab-pane label="请å管ç" name="2"></el-tab-pane> |
| | | <el-tab-pane label="åºå·®ç®¡ç" name="3"></el-tab-pane> |
| | | <el-tab-pane label="æ¥é管ç" name="4"></el-tab-pane> |
| | | <el-tab-pane label="éè´å®¡æ¹" name="5"></el-tab-pane> |
| | | <el-tab-pane label="éè´å
¥åºå®¡æ¹" name="5"></el-tab-pane> |
| | | <el-tab-pane label="æ¥ä»·å®¡æ¹" name="6"></el-tab-pane> |
| | | <el-tab-pane label="å货审æ¹" name="7"></el-tab-pane> |
| | | </el-tabs> |
| | |
| | | </div> |
| | | <info-form-dia ref="infoFormDia" @close="handleQuery" :approveType="currentApproveType"></info-form-dia> |
| | | <approval-dia ref="approvalDia" @close="handleQuery" :approveType="currentApproveType"></approval-dia> |
| | | <purchase-inbound-dia ref="purchaseInboundDia" @close="handleQuery" :approveType="currentApproveType"></purchase-inbound-dia> |
| | | <FileList ref="fileListRef" /> |
| | | </div> |
| | | </template> |
| | |
| | | import { useRoute } from 'vue-router'; |
| | | import InfoFormDia from "@/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue"; |
| | | import ApprovalDia from "@/views/collaborativeApproval/approvalProcess/components/approvalDia.vue"; |
| | | import PurchaseInboundDia from "@/views/collaborativeApproval/approvalProcess/components/purchaseInboundDia.vue"; |
| | | import {approveProcessDelete, approveProcessListPage} from "@/api/collaborativeApproval/approvalProcess.js"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | |
| | |
| | | }, |
| | | disabled: (row) => row.approveUserCurrentId == null || row.approveStatus == 2 || row.approveStatus == 3 || row.approveStatus == 4 || row.approveUserCurrentId !== userStore.id |
| | | }, |
| | | ...(isPurchaseType ? [{ |
| | | name: "å
¥åº", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | openPurchaseInboundDia(row); |
| | | }, |
| | | disabled: (row) => row.approveStatus != 2 |
| | | }] : []), |
| | | { |
| | | name: "详æ
", |
| | | type: "text", |
| | |
| | | }); |
| | | const infoFormDia = ref() |
| | | const approvalDia = ref() |
| | | const purchaseInboundDia = ref() |
| | | const { proxy } = getCurrentInstance() |
| | | |
| | | // æ¥è¯¢å表 |
| | |
| | | }) |
| | | }; |
| | | |
| | | const openPurchaseInboundDia = (row) => { |
| | | nextTick(() => { |
| | | purchaseInboundDia.value?.openDialog('inbound', row) |
| | | }) |
| | | }; |
| | | |
| | | // å é¤ |
| | | const handleDelete = () => { |
| | | let ids = []; |
| | |
| | | prop="stockOutNum" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="åºä½" |
| | | prop="stockLocation" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column label="è´¨æ£ç¶æ" |
| | | prop="type" |
| | | show-overflow-tooltip |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <div class="search_form"> |
| | | <div> |
| | | <span class="search_title ml10">产ååç§°ï¼</span> |
| | | <el-input |
| | | v-model="searchForm.productName" |
| | | style="width: 240px" |
| | | placeholder="请è¾å
¥äº§ååç§°" |
| | | clearable |
| | | @change="handleQuery" |
| | | /> |
| | | <span class="search_title ml10">å¾çº¸ç¼å·ï¼</span> |
| | | <el-input |
| | | v-model="searchForm.model" |
| | | style="width: 240px" |
| | | placeholder="请è¾å
¥å¾çº¸ç¼å·" |
| | | clearable |
| | | @change="handleQuery" |
| | | /> |
| | | <el-button type="primary" style="margin-left: 10px" @click="handleQuery">æç´¢</el-button> |
| | | <el-button @click="handleReset">éç½®</el-button> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="table_list"> |
| | | <el-table :data="tableData" border v-loading="tableLoading" style="width: 100%" height="calc(100vh - 18.5em)"> |
| | | <el-table-column align="center" type="index" label="åºå·" width="60" /> |
| | | <el-table-column prop="productName" label="产ååç§°" min-width="160" show-overflow-tooltip /> |
| | | <el-table-column prop="model" label="å¾çº¸ç¼å·" min-width="160" show-overflow-tooltip /> |
| | | <el-table-column prop="waitAuditNum" label="å¾
å®¡æ ¸æ°é" min-width="120" align="center" /> |
| | | <el-table-column prop="stockLocation" label="åºä½" min-width="180" show-overflow-tooltip /> |
| | | <el-table-column prop="status" label="å®¡æ ¸ç¶æ" min-width="120" align="center"> |
| | | <template #default="scope"> |
| | | <el-tag v-if="scope.row.status === 1 || scope.row.status === '1'" type="warning">å¾
å®¡æ ¸</el-tag> |
| | | <el-tag v-else-if="scope.row.status === 2 || scope.row.status === '2'" type="success">å·²å
¥åº</el-tag> |
| | | <el-tag v-else type="info">{{ scope.row.status }}</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" min-width="120" align="center" fixed="right"> |
| | | <template #default="scope"> |
| | | <el-button |
| | | link |
| | | type="primary" |
| | | size="small" |
| | | :disabled="!(scope.row.status === 1 || scope.row.status === '1')" |
| | | @click="openAuditDialog(scope.row)" |
| | | > |
| | | å®¡æ ¸ |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | |
| | | <el-dialog v-model="auditDialogVisible" title="å
¥åºå®¡æ ¸" width="620px" @close="closeAuditDialog"> |
| | | <el-form :model="auditForm" label-width="120px" label-position="top" ref="auditFormRef"> |
| | | <el-form-item |
| | | label="å®¡æ ¸ç»æ" |
| | | prop="result" |
| | | :rules="[{ required: true, message: 'è¯·éæ©å®¡æ ¸ç»æ', trigger: 'change' }]" |
| | | > |
| | | <el-radio-group v-model="auditForm.result"> |
| | | <el-radio value="approved">éè¿</el-radio> |
| | | <el-radio value="rejected">ä¸éè¿</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | |
| | | <el-form-item |
| | | v-if="auditForm.result === 'rejected'" |
| | | label="å®é
å
¥åºæ°é" |
| | | prop="actualStockInNum" |
| | | :rules="[{ required: true, message: '请è¾å
¥å®é
å
¥åºæ°é', trigger: 'blur' }]" |
| | | > |
| | | <el-input-number |
| | | v-model="auditForm.actualStockInNum" |
| | | :min="0" |
| | | :precision="0" |
| | | controls-position="right" |
| | | style="width: 100%;" |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item |
| | | v-if="auditForm.result === 'approved' || auditForm.result === 'rejected'" |
| | | label="åºä½" |
| | | prop="stockLocation" |
| | | :rules="[{ required: true, message: '请è¾å
¥åºä½', trigger: 'blur' }]" |
| | | > |
| | | <el-input v-model="auditForm.stockLocation" placeholder="请è¾å
¥åºä½" clearable /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item |
| | | v-if="auditForm.result === 'rejected'" |
| | | label="ä¸éè¿åå " |
| | | prop="reason" |
| | | :rules="[{ required: true, message: '请è¾å
¥ä¸éè¿åå ', trigger: 'blur' }]" |
| | | > |
| | | <el-input |
| | | v-model="auditForm.reason" |
| | | type="textarea" |
| | | :rows="3" |
| | | placeholder="请è¾å
¥ä¸éè¿åå " |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitAudit">确认</el-button> |
| | | <el-button @click="closeAuditDialog">åæ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, toRefs, getCurrentInstance, nextTick, onMounted } from "vue"; |
| | | import { getStockInRecordListPage, productionApprove } from "@/api/inventoryManagement/stockInRecord.js"; |
| | | |
| | | const { proxy } = getCurrentInstance(); |
| | | |
| | | const tableLoading = ref(false); |
| | | const tableData = ref([]); |
| | | |
| | | const data = reactive({ |
| | | searchForm: { |
| | | productName: "", |
| | | model: "", |
| | | }, |
| | | }); |
| | | const { searchForm } = toRefs(data); |
| | | |
| | | const auditDialogVisible = ref(false); |
| | | const auditRow = ref(null); |
| | | const auditFormRef = ref(null); |
| | | const auditForm = reactive({ |
| | | result: "", |
| | | stockLocation: "", |
| | | actualStockInNum: null, |
| | | reason: "", |
| | | }); |
| | | |
| | | const handleQuery = () => { |
| | | tableLoading.value = true; |
| | | const params = { |
| | | current: 1, |
| | | size: 10, |
| | | productType: 1, |
| | | status: 1, |
| | | productName: searchForm.value.productName, |
| | | model: searchForm.value.model, |
| | | }; |
| | | |
| | | getStockInRecordListPage(params) |
| | | .then((res) => { |
| | | tableData.value = res?.data?.records || res?.data || []; |
| | | }) |
| | | .catch((err) => { |
| | | console.error("å è½½å
¥åºå®¡æ ¸å表失败:", err); |
| | | tableData.value = []; |
| | | proxy.$modal.msgError("å è½½å
¥åºå®¡æ ¸å表失败"); |
| | | }) |
| | | .finally(() => { |
| | | tableLoading.value = false; |
| | | }); |
| | | }; |
| | | |
| | | const handleReset = () => { |
| | | searchForm.value.productName = ""; |
| | | searchForm.value.model = ""; |
| | | handleQuery(); |
| | | }; |
| | | |
| | | const openAuditDialog = (row) => { |
| | | auditRow.value = row; |
| | | auditForm.result = ""; |
| | | auditForm.stockLocation = row.stockLocation || ""; |
| | | auditForm.actualStockInNum = row.waitAuditNum ?? null; |
| | | auditForm.reason = ""; |
| | | auditDialogVisible.value = true; |
| | | nextTick(() => { |
| | | auditFormRef.value?.clearValidate?.(); |
| | | }); |
| | | }; |
| | | |
| | | const closeAuditDialog = () => { |
| | | auditDialogVisible.value = false; |
| | | auditRow.value = null; |
| | | auditForm.result = ""; |
| | | auditForm.stockLocation = ""; |
| | | auditForm.actualStockInNum = null; |
| | | auditForm.reason = ""; |
| | | }; |
| | | |
| | | const submitAudit = () => { |
| | | auditFormRef.value?.validate((valid) => { |
| | | if (!valid || !auditRow.value) { |
| | | return; |
| | | } |
| | | |
| | | if (auditForm.result === "rejected") { |
| | | if (auditForm.actualStockInNum === null || auditForm.actualStockInNum === "" || Number(auditForm.actualStockInNum) < 0) { |
| | | proxy.$modal.msgError("请è¾å
¥å®é
å
¥åºæ°é"); |
| | | return; |
| | | } |
| | | if (Number(auditForm.actualStockInNum) > Number(auditRow.value.waitAuditNum ?? 0)) { |
| | | proxy.$modal.msgError("å®é
å
¥åºæ°éä¸è½å¤§äºå¾
å®¡æ ¸æ°é"); |
| | | return; |
| | | } |
| | | if (!auditForm.reason || !String(auditForm.reason).trim()) { |
| | | proxy.$modal.msgError("请è¾å
¥ä¸éè¿åå "); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | if (!auditForm.stockLocation || !String(auditForm.stockLocation).trim()) { |
| | | proxy.$modal.msgError("请è¾å
¥åºä½"); |
| | | return; |
| | | } |
| | | |
| | | const payload = { |
| | | id: auditRow.value.id, |
| | | status: auditForm.result === "approved" ? 2 : 1, |
| | | actualStockInNum: auditForm.result === "approved" |
| | | ? Number(auditRow.value.waitAuditNum) |
| | | : Number(auditForm.actualStockInNum), |
| | | stockLocation: String(auditForm.stockLocation || "").trim(), |
| | | reason: auditForm.result === "rejected" ? String(auditForm.reason).trim() : "", |
| | | recordId: auditForm.result === "rejected" ? (auditRow.value.recordId ?? auditRow.value.id) : undefined, |
| | | }; |
| | | |
| | | productionApprove(payload) |
| | | .then(() => { |
| | | auditRow.value.status = payload.status; |
| | | auditRow.value.stockLocation = payload.stockLocation; |
| | | if (auditForm.result === "rejected") { |
| | | auditRow.value.waitAuditNum = payload.actualStockInNum; |
| | | auditRow.value.reason = payload.reason; |
| | | } |
| | | proxy.$modal.msgSuccess("å®¡æ ¸æäº¤æå"); |
| | | closeAuditDialog(); |
| | | handleQuery(); |
| | | }) |
| | | .catch(() => { |
| | | proxy.$modal.msgError("å®¡æ ¸æäº¤å¤±è´¥"); |
| | | }); |
| | | }); |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | handleQuery(); |
| | | }); |
| | | </script> |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åºä½" |
| | | prop="locationName" |
| | | prop="stockLocation" |
| | | show-overflow-tooltip/> |
| | | <el-table-column label="å
¥åºäºº" |
| | | prop="createBy" |
| | |
| | | const getList = () => { |
| | | tableLoading.value = true; |
| | | const params = {...page, productType: props.type}; |
| | | if (props.type === 1) { |
| | | params.status = 2; |
| | | } |
| | | params.timeStr = searchForm.value.timeStr; |
| | | params.productName = searchForm.value.productName; |
| | | params.recordType = searchForm.value.recordType; |
| | |
| | | </el-form-item> |
| | | |
| | | <el-form-item |
| | | label="åºä½" |
| | | prop="stockLocation" |
| | | :rules="[ |
| | | { |
| | | required: true, |
| | | message: '请è¾å
¥åºä½', |
| | | trigger: 'blur', |
| | | } |
| | | ]" |
| | | > |
| | | <el-input v-model="formState.stockLocation" placeholder="请è¾å
¥åºä½" /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item |
| | | v-if="type === 'qualified'" |
| | | label="åºåé¢è¦æ°é" |
| | | prop="warnNum" |
| | |
| | | productModelName: "", |
| | | unit: "", |
| | | qualitity: 0, |
| | | stockLocation: "", |
| | | warnNum: 0, |
| | | remark: '', |
| | | }); |
| | |
| | | productModelId: undefined, |
| | | productName: "", |
| | | productModelName: "", |
| | | description: '', |
| | | unit: "", |
| | | qualitity: 0, |
| | | stockLocation: "", |
| | | warnNum: 0, |
| | | remark: '', |
| | | }; |
| | | isShow.value = false; |
| | | }; |
| | |
| | | <el-table-column label="å¾çº¸ç¼å·" prop="model" show-overflow-tooltip /> |
| | | <el-table-column label="åä½" prop="unit" show-overflow-tooltip /> |
| | | <el-table-column label="åºåæ°é" prop="qualitity" show-overflow-tooltip /> |
| | | <el-table-column label="åºä½" prop="stockLocation" show-overflow-tooltip /> |
| | | <el-table-column label="è´¨æ£ç¶æ" |
| | | show-overflow-tooltip |
| | | width="100"> |
| | |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åºä½" min-width="180" align="center" prop="stockLocation"> |
| | | <template #default="{ row }"> |
| | | <el-input |
| | | v-model="row.stockLocation" |
| | | placeholder="请è¾å
¥åºä½" |
| | | clearable |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <div class="picking-footer-info"> |
| | | <span>å·²é {{ inputSelectedRows.length }} æ¡</span> |
| | |
| | | <!-- é¢æå¼¹æ¡ --> |
| | | <el-dialog v-model="pickingDialogVisible" |
| | | title="å·¥å颿" |
| | | width="1200px" |
| | | width="70%" |
| | | :close-on-click-modal="false"> |
| | | |
| | | <el-table |
| | |
| | | size="small" |
| | | style="width: 160px" |
| | | @change="(val) => handlePickingQuantityChange(val, row)" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åºä½" min-width="180" align="center" prop="stockLocation"> |
| | | <template #default="{ row }"> |
| | | <el-input |
| | | v-model="row.stockLocation" |
| | | placeholder="请è¾å
¥åºä½" |
| | | clearable |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | inputTableData.value = res.data.records.map(item => ({ |
| | | ...item, |
| | | currentReturnQuantity: 0, |
| | | stockLocation: item.stockLocation || "", |
| | | })); |
| | | inputPage.total = res.data.total; |
| | | }) |
| | |
| | | pickingTableData.value = materials.map(item => ({ |
| | | ...item, |
| | | quantity: 0, |
| | | stockLocation: item.stockLocation || "", |
| | | unpickedQuantity: (item.demandedQuantity || 0) - (item.completedQuantity || 0), |
| | | })); |
| | | } catch (e) { |
| | |
| | | proxy.$modal.msgWarning(`${row.productName} ç颿æ°éå¿
须大äº0`); |
| | | return; |
| | | } |
| | | if (!row.stockLocation || !String(row.stockLocation).trim()) { |
| | | proxy.$modal.msgWarning(`${row.productName} çåºä½ä¸è½ä¸ºç©º`); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | // æäº¤é¢ææ°æ® |
| | |
| | | productStructureRecordId: row.id, |
| | | productModelId: row.productModelId, |
| | | quantity: row.quantity, |
| | | stockLocation: String(row.stockLocation).trim(), |
| | | })); |
| | | await pickMaterial(pickData); |
| | | proxy.$modal.msgSuccess("颿æå"); |
| | |
| | | proxy.$modal.msgWarning("è¯·å¡«åæ¬æ¬¡éææ°é"); |
| | | return; |
| | | } |
| | | const invalidLocationRows = inputSelectedRows.value.filter( |
| | | row => !row.stockLocation || !String(row.stockLocation).trim() |
| | | ); |
| | | if (invalidLocationRows.length > 0) { |
| | | proxy.$modal.msgWarning("请填ååºä½"); |
| | | return; |
| | | } |
| | | |
| | | const returnData = inputSelectedRows.value.map(row => ({ |
| | | ...row, |
| | | returnQuantity: row.currentReturnQuantity, |
| | | stockLocation: String(row.stockLocation).trim(), |
| | | })); |
| | | |
| | | try { |
| | |
| | | <el-table-column align="center" label="åºå·" type="index" width="60" /> |
| | | <el-table-column label="éå®è®¢å" prop="salesContractNo" show-overflow-tooltip /> |
| | | <el-table-column label="å货订åå·" prop="shippingNo" show-overflow-tooltip /> |
| | | <el-table-column label="产ååç§°" prop="productCategory" show-overflow-tooltip /> |
| | | <el-table-column label="å¾çº¸ç¼å·" prop="specificationModel" show-overflow-tooltip /> |
| | | <el-table-column label="客æ·åç§°" prop="customerName" show-overflow-tooltip /> |
| | | <el-table-column label="åè´§è¿åº¦" align="center" width="150"> |
| | | <template #default="scope"> |
| | |
| | | <div class="info-item"> |
| | | <span class="label">å货订åå·</span> |
| | | <span class="value">{{ currentShippingOrder.shippingNo || '--' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">产ååç§°</span> |
| | | <span class="value">{{ currentShippingOrder.productCategory || '--' }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">å¾çº¸ç¼å·</span> |
| | | <span class="value">{{ currentShippingOrder.specificationModel || '--' }}</span> |
| | | </div> |
| | | <el-divider /> |
| | | <div class="quantity-summary"> |
| | |
| | | /> |
| | | </div> |
| | | </div> |
| | | <div class="info-row"> |
| | | <span class="info-label">åºä½</span> |
| | | <span class="info-value">{{ record.stockLocation || '--' }}</span> |
| | | </div> |
| | | <div class="record-actions" v-if="canRevokeShipping(record)"> |
| | | <el-button |
| | | type="danger" |
| | |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="åºä½" prop="stockLocation"> |
| | | <el-input v-model="shippingForm.stockLocation" placeholder="请è¾å
¥åºä½" clearable/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="åè´§æ¥æ" prop="shippingDate"> |
| | | <el-date-picker |
| | | v-model="shippingForm.shippingDate" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | type="datetime" |
| | | <el-date-picker |
| | | v-model="shippingForm.shippingDate" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | type="datetime" |
| | | placeholder="è¯·éæ©" |
| | | style="width: 100%" |
| | | /> |
| | |
| | | shippingCarNumber: "", |
| | | expressCompany: "", |
| | | expressNumber: "", |
| | | stockLocation: "", |
| | | }); |
| | | const shippingRules = { |
| | | shippingNum: [{ required: true, message: "请è¾å
¥åè´§æ°é", trigger: "blur" }], |
| | | stockLocation: [{ required: true, message: "请è¾å
¥åºä½", trigger: "blur" }], |
| | | type: [{ required: true, message: "è¯·éæ©åè´§ç±»å", trigger: "change" }], |
| | | shippingDate: [{ required: true, message: "è¯·éæ©åè´§æ¥æ", trigger: "change" }], |
| | | shippingCarNumber: [ |
| | |
| | | shippingCarNumber: "", |
| | | expressCompany: "", |
| | | expressNumber: "", |
| | | stockLocation: "", |
| | | }; |
| | | shippingFileList.value = []; |
| | | |
| | |
| | | shippingCarNumber: "", |
| | | expressCompany: "", |
| | | expressNumber: "", |
| | | stockLocation: "", |
| | | }; |
| | | shippingFileList.value = []; |
| | | }; |
| | |
| | | shippingCarNumber: "", |
| | | expressCompany: "", |
| | | expressNumber: "", |
| | | stockLocation: "", |
| | | }; |
| | | shippingFileList.value = []; |
| | | }; |
| | |
| | | shippingNum: shippingForm.value.shippingNum, |
| | | type: shippingForm.value.type, |
| | | shippingDate: shippingForm.value.shippingDate, |
| | | stockLocation: shippingForm.value.stockLocation, |
| | | shippingCarNumber: shippingForm.value.type === "货车" ? shippingForm.value.shippingCarNumber : "", |
| | | expressCompany: shippingForm.value.type === "å¿«é" ? shippingForm.value.expressCompany : "", |
| | | expressNumber: shippingForm.value.type === "å¿«é" ? shippingForm.value.expressNumber : "", |