multiple/assets/favicon/HYJCfavicon.ico
multiple/assets/favicon/HYLQfavicon.ico
multiple/assets/favicon/JXJHfavicon.ico
multiple/assets/favicon/QXYfavicon.ico
multiple/assets/favicon/XSWHfavicon.ico
multiple/assets/favicon/YTJZfavicon.ico
multiple/assets/favicon/ZQSYfavicon.ico
multiple/assets/logo/HYJCLogo.png
multiple/assets/logo/HYLQLogo.png
multiple/assets/logo/JXJHLogo.png
multiple/assets/logo/QXYLogo.png
multiple/assets/logo/XSWHLogo.png
multiple/assets/logo/YTJZLogo.png
multiple/assets/logo/ZQSYLogo.png
multiple/config.json
@@ -96,6 +96,60 @@ "logo": "logo/DYKJLogo.png", "favicon": "favicon/DYKJfavicon.ico" }, "ZQSY": { "env": { "VITE_APP_TITLE": "æ³½æ·å®ä¸", "VITE_BASE_API": "http://36.213.128.159:9000", "VITE_JAVA_API": "http://36.213.128.159:9001" }, "logo": "logo/ZQSYLogo.png", "favicon": "favicon/ZQSYfavicon.ico" }, "JXJH": { "env": { "VITE_APP_TITLE": "æµå¿æ±æµ·æ°´æ³¥å¶åæéå ¬å¸", "VITE_BASE_API": "http://36.139.201.20:9000", "VITE_JAVA_API": "http://36.139.201.20:9001" }, "logo": "logo/JXJHLogo.png", "favicon": "favicon/JXJHfavicon.ico" }, "YTJZ": { "env": { "VITE_APP_TITLE": "è±«æ³°å»ºçæææéå ¬å¸", "VITE_BASE_API": "http://36.139.201.181:9000", "VITE_JAVA_API": "http://36.139.201.181:9001" }, "logo": "logo/YTJZLogo.png", "favicon": "favicon/YTJZfavicon.ico" }, "HYLQ": { "env": { "VITE_APP_TITLE": "èªé¸è·¯æ¡¥å·¥ç¨æéå ¬å¸", "VITE_BASE_API": "http://36.139.202.111:9000", "VITE_JAVA_API": "http://36.139.202.111:9001" }, "logo": "logo/HYLQLogo.png", "favicon": "favicon/HYLQfavicon.ico" }, "QXY": { "env": { "VITE_APP_TITLE": "强信å®çµå¨äºä¸»æº", "VITE_BASE_API": "http://36.134.154.10:9000", "VITE_JAVA_API": "http://36.134.154.10:9001" }, "logo": "logo/QXYLogo.png", "favicon": "favicon/QXYfavicon.ico" }, "HYJC": { "env": { "VITE_APP_TITLE": "ææ´å»ºæ", "VITE_BASE_API": "http://36.138.94.178:9000", "VITE_JAVA_API": "http://36.138.94.178:9001" }, "logo": "logo/HYJCLogo.png", "favicon": "favicon/HYJCfavicon.ico" }, "logo": "/src/assets/logo/logo.png", "favicon": "/public/favicon.ico" } src/api/inventoryManagement/stockInventory.js
@@ -17,6 +17,14 @@ }); }; export const getStockInventoryBatchNoQty = (params) => { return request({ url: "/stockInventory/getBatchNoQty", method: "get", params, }); }; // å建åºåè®°å½ export const createStockInventory = (params) => { return request({ src/views/basicData/supplierManage/components/BlacklistTab.vue
@@ -231,7 +231,10 @@ </div> </template> </el-dialog> <files-dia ref="filesDia"></files-dia> <FileList v-if="fileListDialogVisible" v-model:visible="fileListDialogVisible" record-type="supplier_manage" :record-id="recordId" /> </div> </template> @@ -249,7 +252,9 @@ } from "@/api/basicData/supplierManageFile.js"; import useUserStore from "@/store/modules/user"; import { getToken } from "@/utils/auth.js"; import FilesDia from "../filesDia.vue"; const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue") ); const { proxy } = getCurrentInstance(); const userStore = useUserStore(); @@ -327,7 +332,7 @@ name: "èµè´¨æä»¶", type: "text", clickFun: (row) => { openFilesFormDia(row) openFileDialog(row) } } ], @@ -342,7 +347,8 @@ size: 100, total: 0, }); const filesDia = ref() const fileListDialogVisible = ref(false); const recordId = ref(); // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref(""); const dialogFormVisible = ref(false); @@ -567,10 +573,9 @@ return `${year}-${month}-${day}`; } // æå¼éä»¶å¼¹æ¡ const openFilesFormDia = (row) => { nextTick(() => { filesDia.value?.openDialog(row) }) const openFileDialog = async row => { recordId.value = row.id; fileListDialogVisible.value = true; }; onMounted(() => { src/views/basicData/supplierManage/components/HomeTab.vue
@@ -237,7 +237,10 @@ </div> </template> </el-dialog> <files-dia ref="filesDia"></files-dia> <FileList v-if="fileListDialogVisible" v-model:visible="fileListDialogVisible" record-type="supplier_manage" :record-id="recordId" /> </div> </template> @@ -255,7 +258,9 @@ } from "@/api/basicData/supplierManageFile.js"; import useUserStore from "@/store/modules/user"; import { getToken } from "@/utils/auth.js"; import FilesDia from "../filesDia.vue"; const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue") ); const { proxy } = getCurrentInstance(); const userStore = useUserStore(); @@ -333,7 +338,7 @@ name: "èµè´¨æä»¶", type: "text", clickFun: (row) => { openFilesFormDia(row) openFileDialog(row) } } ], @@ -343,12 +348,13 @@ const selectedRows = ref([]); const userList = ref([]); const tableLoading = ref(false); const fileListDialogVisible = ref(false); const recordId = ref(); const page = reactive({ current: 1, size: 100, total: 0, }); const filesDia = ref() // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref(""); const dialogFormVisible = ref(false); @@ -573,10 +579,9 @@ return `${year}-${month}-${day}`; } // æå¼éä»¶å¼¹æ¡ const openFilesFormDia = (row) => { nextTick(() => { filesDia.value?.openDialog(row) }) const openFileDialog = async row => { recordId.value = row.id; fileListDialogVisible.value = true; }; onMounted(() => { src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
@@ -152,7 +152,8 @@ startDate: "", // 请åå¼å§æ¶é´ endDate: "", // 请åç»ææ¶é´ price: null, // æ¥ééé¢ location: "" // åºå·®å°ç¹ location: "", // åºå·®å°ç¹ storageBlobDTOS: [] }, rules: { approveId: [{ required: false, message: "请è¾å ¥", trigger: "blur" }], @@ -270,7 +271,7 @@ return } } form.value.storageBlobDTOList = fileList.value form.value.storageBlobDTOS = fileList.value proxy.$refs.formRef.validate(valid => { if (valid) { src/views/collaborativeApproval/approvalProcess/index.vue
@@ -126,20 +126,23 @@ <!-- å¼¹çªç»ä»¶ --> <info-form-dia ref="infoFormDia" @close="handleQuery" :approveType="currentApproveType"></info-form-dia> <approval-dia ref="approvalDia" @close="handleQuery" :approveType="currentApproveType"></approval-dia> <FileList ref="fileListRef" /> <FileList v-if="fileDialogVisible" v-model:visible="fileDialogVisible" record-type="approve_process" :record-id="recordId" /> </div> </template> <script setup> import FileList from "./fileList.vue"; import { Search, Plus, Delete, Download, RefreshRight, DocumentChecked } from "@element-plus/icons-vue"; import {onMounted, ref, computed, reactive, toRefs, nextTick, getCurrentInstance} from "vue"; import {onMounted, ref, computed, reactive, toRefs, nextTick, getCurrentInstance, defineAsyncComponent} from "vue"; import {ElMessageBox} from "element-plus"; import { useRoute } from 'vue-router'; import InfoFormDia from "@/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue"; import ApprovalDia from "@/views/collaborativeApproval/approvalProcess/components/approvalDia.vue"; import {approveProcessDelete, approveProcessListPage} from "@/api/collaborativeApproval/approvalProcess.js"; import useUserStore from "@/store/modules/user"; const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue")); const userStore = useUserStore(); const route = useRoute(); @@ -337,7 +340,7 @@ name: "éä»¶", type: "text", clickFun: (row) => { downLoadFile(row); openFilesFormDia(row); }, }); } @@ -371,11 +374,17 @@ page.current = 1; getList(); }; const fileListRef = ref(null) const downLoadFile = (row) => { fileListRef.value.open(row.commonFileList) // æå¼éä»¶å¼¹çª const recordId =ref(0) const fileDialogVisible = ref(false) // æå¼éä»¶å¼¹æ¡ const openFilesFormDia = async (row) => { recordId.value = row.id fileDialogVisible.value = true } const pagination = (obj) => { page.current = obj.page; page.size = obj.limit; src/views/equipmentManagement/inspectionManagement/components/formDia.vue
@@ -26,6 +26,21 @@ </el-row> <el-row> <el-col :span="12"> <el-form-item label="å·¡æ£é¡¹ç®" prop="inspectionProject"> <el-input v-model="form.inspectionProject" placeholder="请è¾å ¥å·¡æ£é¡¹ç®" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="æ¯å¦å¯ç¨" prop="isEnabled"> <el-radio-group v-model="form.isEnabled"> <el-radio :value="1">æ¯</el-radio> <el-radio :value="0">å¦</el-radio> </el-radio-group> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="夿³¨" prop="remarks"> <el-input v-model="form.remarks" placeholder="请è¾å ¥å¤æ³¨" type="textarea" /> </el-form-item> @@ -118,6 +133,8 @@ taskName: undefined, inspector: '', inspectorIds: '', inspectionProject: '', isEnabled: 1, remarks: '', frequencyType: '', frequencyDetail: '', @@ -245,6 +262,8 @@ taskName: undefined, inspector: '', inspectorIds: '', inspectionProject: '', isEnabled: 1, remarks: '', frequencyType: '', frequencyDetail: '', src/views/equipmentManagement/inspectionManagement/index.vue
@@ -70,6 +70,11 @@ class="no-data">--</span> </div> </template> <template #isEnabled="{ row }"> <el-tag :type="row.isEnabled === 1 ? 'success' : 'danger'" size="small"> {{ row.isEnabled == 1 ? 'æ¯' : 'å¦' }} </el-tag> </template> </PIMTable> </div> </el-card> @@ -126,8 +131,16 @@ // åé ç½® const columns = ref([ { prop: "taskName", label: "å·¡æ£ä»»å¡åç§°", minWidth: 160 }, { prop: "inspectionProject", label: "å·¡æ£é¡¹ç®", minWidth: 150 }, { prop: "remarks", label: "夿³¨", minWidth: 150 }, { prop: "inspector", label: "æ§è¡å·¡æ£äºº", minWidth: 150, slot: "inspector" }, { prop: "isEnabled", label: "æ¯å¦å¯ç¨", minWidth: 100, dataType: "slot", slot: "isEnabled" }, { prop: "frequencyType", label: "颿¬¡", @@ -227,8 +240,10 @@ operationsArr.value = ["edit"]; } else if (value === "task") { const operationColumn = getOperationColumn(["viewFile"]); // 宿¶ä»»å¡è®°å½ä¸å±ç¤º"æ¯å¦å¯ç¨"å const taskColumns = columns.value.filter(col => col.prop !== "isEnabled"); tableColumns.value = [ ...columns.value, ...taskColumns, ...(operationColumn ? [operationColumn] : []), ]; operationsArr.value = ["viewFile"]; src/views/equipmentManagement/measurementEquipment/index.vue
@@ -42,6 +42,7 @@ :tableLoading="tableLoading" @pagination="pagination" :dbRowClick="dbRowClick" :rowClassName="rowClassName" ></PIMTable> </div> <form-dia ref="formDia" @close="handleQuery"></form-dia> @@ -125,22 +126,6 @@ align:"center" }, { label: "å¿«å°ææé", prop: "valid", width: 130, align: "center", formatData: (cell) => { if (!cell) return ""; const validDate = new Date(cell); const now = new Date(); const diffDays = Math.ceil((validDate - now) / (1000 * 60 * 60 * 24)); if (diffDays <= 7 && diffDays >= 0) { return "â ï¸ " + diffDays + "天åå°æ"; } return ""; } }, { label: "ç¶æ", prop: "status", width: 130, @@ -197,6 +182,31 @@ const dbRowClick = (row)=>{ rowClickData.value?.openDialog(row) } // è¡æ ·å¼ï¼å¿«å°æï¼7天å ï¼æé¾ææ 红 const rowClassName = ({ row }) => { console.log('rowClassName called:', row); // valid æ¯ææå¤©æ°ï¼mostDate æ¯ææ°æ£å®æ¥æ if (row.valid && row.mostDate) { const mostDate = new Date(row.mostDate); // 计ç®å°ææ¥æ = æ£å®æ¥æ + ææå¤©æ° const validDays = parseInt(row.valid) || 0; const expireDate = new Date(mostDate); expireDate.setDate(expireDate.getDate() + validDays); const now = new Date(); const diffDays = Math.ceil((expireDate - now) / (1000 * 60 * 60 * 24)); console.log('row:', row.code, 'validDays:', validDays, 'expireDate:', expireDate, 'diffDays:', diffDays); // 7天å å°ææå·²é¾æé½æ 红 if (diffDays <= 7) { console.log('return warning-row'); return 'warning-row'; } } else { console.log('row missing valid or mostDate:', row.valid, row.mostDate); } return ''; } // è¡¨æ ¼éæ©æ°æ® @@ -298,5 +308,13 @@ </script> <style scoped> :deep(.el-table .warning-row) { background-color: #fef0f0 !important; } :deep(.el-table .warning-row:hover > td) { background-color: #f9d5d5 !important; } :deep(.el-table .el-table__body tr.warning-row td) { background-color: #fef0f0 !important; } </style> src/views/equipmentManagement/repair/Modal/MaintainModal.vue
@@ -16,7 +16,8 @@ </el-form-item> <el-form-item label="ç»´ä¿®ç¶æ"> <el-select v-model="form.status"> <el-option label="å¾ éªæ¶" :value="3"></el-option> <el-option label="å¾ æ¥ä¿®" :value="0"></el-option> <el-option label="å®ç»" :value="1"></el-option> <el-option label="失败" :value="2"></el-option> </el-select> </el-form-item> @@ -117,7 +118,7 @@ data.maintenanceTime ? dayjs(data.maintenanceTime).format("YYYY-MM-DD HH:mm:ss") : dayjs().format("YYYY-MM-DD HH:mm:ss"); form.status = 3; // é»è®¤ç¶æä¸ºå¾ éªæ¶ form.status = 1; // é»è®¤ç¶æä¸ºå®ç» // multiple éæ©å¨è¦æ±æ°ç»ï¼å端常è¿å "1,2,3" if (Array.isArray(data?.sparePartsIds)) { form.sparePartsIds = data.sparePartsIds.map((v) => Number(v)).filter((v) => Number.isFinite(v)); src/views/inventoryManagement/stockManagement/BatchNoQtyDetail.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,227 @@ <template> <el-dialog v-model="isShow" title="åºå详æ " width="90%" top="3vh" class="batch-no-qty-detail-dialog" @close="closeModal" > <div class="detail-content"> <div class="detail-table-wrapper"> <el-table :data="tableData" border v-loading="tableLoading" style="width: 100%" height="100%" > <el-table-column label="产ååç§°" prop="productName" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="model" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" show-overflow-tooltip /> <el-table-column label="æ¹å·" prop="batchNo" show-overflow-tooltip /> <el-table-column label="åæ ¼åºåæ°é" prop="qualifiedQuantity" show-overflow-tooltip /> <el-table-column label="ä¸åæ ¼åºåæ°é" prop="unQualifiedQuantity" show-overflow-tooltip /> <el-table-column label="åæ ¼å»ç»æ°é" prop="qualifiedLockedQuantity" show-overflow-tooltip /> <el-table-column label="ä¸åæ ¼å»ç»æ°é" prop="unQualifiedLockedQuantity" show-overflow-tooltip /> <el-table-column label="åºåé¢è¦æ°é" prop="warnNum" show-overflow-tooltip /> <el-table-column label="夿³¨" prop="remark" show-overflow-tooltip /> <el-table-column label="æè¿æ´æ°æ¶é´" prop="updateTime" show-overflow-tooltip /> <el-table-column fixed="right" label="æä½" min-width="180" align="center"> <template #default="scope"> <el-button link type="primary" @click="handleSubtract(scope.row)" :disabled=" (scope.row.qualifiedUnLockedQuantity || 0) + (scope.row.qualifiedPendingOutQuantity || 0) <= 0 && (scope.row.unQualifiedUnLockedQuantity || 0) + (scope.row.unQualifiedPendingOutQuantity || 0) <= 0 " >é¢ç¨</el-button > <el-button link type="primary" v-if=" scope.row.unQualifiedUnLockedQuantity > 0 || scope.row.qualifiedUnLockedQuantity > 0 " @click="handleFrozen(scope.row)" >å»ç»</el-button > <el-button link type="primary" v-if=" scope.row.qualifiedLockedQuantity > 0 || scope.row.unQualifiedLockedQuantity > 0 " @click="handleThaw(scope.row)" >è§£å»</el-button > </template> </el-table-column> </el-table> </div> <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="paginationChange" /> </div> </el-dialog> </template> <script setup> import pagination from "@/components/PIMTable/Pagination.vue"; import { computed, reactive, ref, watch } from "vue"; import { getStockInventoryBatchNoQty } from "@/api/inventoryManagement/stockInventory.js"; const props = defineProps({ visible: { type: Boolean, required: true, }, record: { type: Object, default: () => ({}), }, }); const emit = defineEmits(["update:visible", "subtract", "frozen", "thaw"]); const isShow = computed({ get() { return props.visible; }, set(val) { emit("update:visible", val); }, }); const tableData = ref([]); const tableLoading = ref(false); const total = ref(0); const page = reactive({ current: 1, size: 20, }); const getList = () => { if (!props.record?.productId || !props.record?.productModelId) { tableData.value = []; total.value = 0; return; } tableLoading.value = true; getStockInventoryBatchNoQty({ current: page.current, size: page.size, productId: props.record.productId, productModelId: props.record.productModelId, }) .then((res) => { tableData.value = res.data?.records || []; total.value = res.data?.total || 0; }) .finally(() => { tableLoading.value = false; }); }; const paginationChange = (obj) => { page.current = obj.page; page.size = obj.limit; getList(); }; const handleSubtract = (row) => { emit("subtract", row); }; const handleFrozen = (row) => { emit("frozen", row); }; const handleThaw = (row) => { emit("thaw", row); }; const closeModal = () => { isShow.value = false; page.current = 1; page.size = 20; tableData.value = []; total.value = 0; }; watch( () => props.visible, (visible) => { if (!visible) { return; } page.current = 1; getList(); }, { immediate: true } ); </script> <style scoped lang="scss"> .detail-content { display: flex; flex-direction: column; height: calc(100vh - 170px); min-height: 520px; } .detail-table-wrapper { flex: 1; min-height: 0; } :deep(.batch-no-qty-detail-dialog .el-dialog) { max-width: calc(100vw - 48px); } :deep(.batch-no-qty-detail-dialog .el-dialog__body) { padding-top: 12px; } </style> src/views/inventoryManagement/stockManagement/Record.vue
@@ -3,143 +3,233 @@ <div class="search_form mb10"> <div> <span class="search_title ml10">产å大类ï¼</span> <el-input v-model="searchForm.productName" <el-input v-model="searchForm.productName" style="width: 240px" placeholder="请è¾å ¥" clearable/> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> clearable /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px" >æç´¢</el-button > </div> <div> <el-button type="primary" @click="isShowNewModal = true">æ°å¢åºå</el-button> <el-button type="info" plain icon="Upload" @click="isShowImportModal = true"> <el-button type="primary" @click="isShowNewModal = true" >æ°å¢åºå</el-button > <el-button type="info" plain icon="Upload" @click="isShowImportModal = true" > å¯¼å ¥åºå </el-button> <el-button @click="handleOut">导åº</el-button> </div> </div> <div class="table_list"> <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" :expand-row-keys="expandedRowKeys" :row-key="(row, index) => index" style="width: 100%" :row-class-name="tableRowClassName" height="calc(100vh - 18.5em)"> <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" :expand-row-keys="expandedRowKeys" :row-key="(row, index) => index" style="width: 100%" :row-class-name="tableRowClassName" height="calc(100vh - 18.5em)" > <el-table-column align="center" type="selection" width="55" /> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="产å大类" prop="productName" show-overflow-tooltip /> <el-table-column label="产ååç§°" prop="productName" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="model" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" show-overflow-tooltip /> <el-table-column label="æ¹å·" prop="batchNo" show-overflow-tooltip /> <el-table-column label="åæ ¼åºåæ°é" prop="qualifiedQuantity" show-overflow-tooltip /> <el-table-column label="ä¸åæ ¼åºåæ°é" prop="unQualifiedQuantity" show-overflow-tooltip /> <el-table-column label="åæ ¼å»ç»æ°é" prop="qualifiedLockedQuantity" show-overflow-tooltip /> <el-table-column label="ä¸åæ ¼å»ç»æ°é" prop="unQualifiedLockedQuantity" show-overflow-tooltip /> <el-table-column label="åºåé¢è¦æ°é" prop="warnNum" show-overflow-tooltip /> <el-table-column label="åæ ¼åºåæ°é" prop="qualifiedQuantity" show-overflow-tooltip /> <el-table-column label="ä¸åæ ¼åºåæ°é" prop="unQualifiedQuantity" show-overflow-tooltip /> <el-table-column label="åæ ¼å»ç»æ°é" prop="qualifiedLockedQuantity" show-overflow-tooltip /> <el-table-column label="ä¸åæ ¼å»ç»æ°é" prop="unQualifiedLockedQuantity" show-overflow-tooltip /> <el-table-column label="åºåé¢è¦æ°é" prop="warnNum" show-overflow-tooltip /> <el-table-column label="夿³¨" prop="remark" show-overflow-tooltip /> <el-table-column label="æè¿æ´æ°æ¶é´" prop="updateTime" show-overflow-tooltip /> <el-table-column fixed="right" label="æä½" min-width="90" align="center"> <el-table-column label="æè¿æ´æ°æ¶é´" prop="updateTime" show-overflow-tooltip /> <el-table-column fixed="right" label="æä½" min-width="80" align="center" > <template #default="scope"> <el-button link type="primary" @click="showSubtractModal(scope.row)" :disabled="((scope.row.qualifiedUnLockedQuantity || 0) + (scope.row.qualifiedPendingOutQuantity || 0) <= 0) && ((scope.row.unQualifiedUnLockedQuantity || 0) + (scope.row.unQualifiedPendingOutQuantity || 0) <= 0)">é¢ç¨</el-button> <el-button link type="primary" v-if="scope.row.unQualifiedUnLockedQuantity > 0 || scope.row.qualifiedUnLockedQuantity > 0" @click="showFrozenModal(scope.row)">å»ç»</el-button> <el-button link type="primary" v-if="scope.row.qualifiedLockedQuantity > 0 || scope.row.unQualifiedLockedQuantity > 0" @click="showThawModal(scope.row)">è§£å»</el-button> <el-button link type="primary" @click="showDetailModal(scope.row)" >详æ </el-button > </template> </el-table-column> </el-table> <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="paginationChange" /> <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="paginationChange" /> </div> <new-stock-inventory v-if="isShowNewModal" <batch-no-qty-detail v-if="isShowDetailModal" v-model:visible="isShowDetailModal" :record="record" @subtract="handleDetailSubtract" @frozen="handleDetailFrozen" @thaw="handleDetailThaw" /> <new-stock-inventory v-if="isShowNewModal" v-model:visible="isShowNewModal" :top-product-parent-id="props.productId" @completed="handleQuery" /> @completed="handleQuery" /> <subtract-stock-inventory v-if="isShowSubtractModal" <subtract-stock-inventory v-if="isShowSubtractModal" v-model:visible="isShowSubtractModal" :record="record" :type="record.stockType" @completed="handleQuery" /> @completed="handleQuery" /> <!-- å¯¼å ¥åºå--> <import-stock-inventory v-if="isShowImportModal" <import-stock-inventory v-if="isShowImportModal" v-model:visible="isShowImportModal" type="qualified" @uploadSuccess="handleQuery" /> @uploadSuccess="handleQuery" /> <!-- å»ç»/è§£å»åºå--> <frozen-and-thaw-stock-inventory v-if="isShowFrozenAndThawModal" <frozen-and-thaw-stock-inventory v-if="isShowFrozenAndThawModal" v-model:visible="isShowFrozenAndThawModal" :record="record" :operation-type="operationType" :type="record.stockType" @completed="handleQuery" /> @completed="handleQuery" /> </div> </template> <script setup> import pagination from '@/components/PIMTable/Pagination.vue' import { ref, reactive, toRefs, onMounted, getCurrentInstance } from 'vue' import pagination from "@/components/PIMTable/Pagination.vue"; import { ref, reactive, toRefs, onMounted, getCurrentInstance } from "vue"; import {ElMessage, ElMessageBox} from "element-plus"; import { getStockInventoryListPageCombined } from "@/api/inventoryManagement/stockInventory.js"; import { getStockInventoryListPageCombined } from "@/api/inventoryManagement/stockInventory.js"; const props = defineProps({ productId: { type: Number, required: true, default: 0 } default: 0, }, }); const NewStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/New.vue")); const SubtractStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/Subtract.vue")); const ImportStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/Import.vue")); const FrozenAndThawStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/FrozenAndThaw.vue")); const { proxy } = getCurrentInstance() const tableData = ref([]) const selectedRows = ref([]) const record = ref({}) const tableLoading = ref(false) const NewStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/New.vue") ); const SubtractStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/Subtract.vue") ); const ImportStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/Import.vue") ); const FrozenAndThawStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/FrozenAndThaw.vue") ); const BatchNoQtyDetail = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/BatchNoQtyDetail.vue") ); const { proxy } = getCurrentInstance(); const tableData = ref([]); const selectedRows = ref([]); const record = ref({}); const tableLoading = ref(false); const page = reactive({ current: 1, size: 100, }) const total = ref(0) }); const total = ref(0); // æ¯å¦æ¾ç¤ºæ°å¢å¼¹æ¡ const isShowNewModal = ref(false) const isShowNewModal = ref(false); // æ¯å¦æ¾ç¤ºé¢ç¨å¼¹æ¡ const isShowSubtractModal = ref(false) const isShowSubtractModal = ref(false); // æ¯å¦æ¾ç¤ºå»ç»/è§£å»å¼¹æ¡ const isShowFrozenAndThawModal = ref(false) const isShowFrozenAndThawModal = ref(false); // æ¯å¦æ¾ç¤ºè¯¦æ å¼¹æ¡ const isShowDetailModal = ref(false); // æä½ç±»å const operationType = ref('frozen') const operationType = ref("frozen"); // æ¯å¦æ¾ç¤ºå¯¼å ¥å¼¹æ¡ const isShowImportModal = ref(false) const isShowImportModal = ref(false); const data = reactive({ searchForm: { productName: '', productName: "", topParentProductId: props.productId, } }) const { searchForm } = toRefs(data) }, }); const { searchForm } = toRefs(data); // æ¥è¯¢å表 /** æç´¢æé®æä½ */ const handleQuery = () => { page.current = 1 getList() } page.current = 1; getList(); }; const paginationChange = (obj) => { page.current = obj.page; page.size = obj.limit; getList() } getList(); }; const getList = () => { tableLoading.value = true getStockInventoryListPageCombined({ ...searchForm.value, ...page }).then(res => { tableLoading.value = false tableData.value = res.data.records total.value = res.data.total tableLoading.value = true; getStockInventoryListPageCombined({ ...searchForm.value, ...page }) .then((res) => { tableLoading.value = false; tableData.value = res.data.records; total.value = res.data.total; // æ°æ®å è½½å®æåæ£æ¥åºå // checkStockAndCreatePurchase(); }).catch(() => { tableLoading.value = false }) } .catch(() => { tableLoading.value = false; }); }; const handleFileSuccess = (response) => { const { code, msg } = response; @@ -154,61 +244,89 @@ // ç¹å»é¢ç¨ const showSubtractModal = (row) => { record.value = row isShowSubtractModal.value = true record.value = row; isShowSubtractModal.value = true; }; // ç¹å»è¯¦æ const showDetailModal = (row) => { if (!row?.productId || !row?.productModelId) { proxy.$modal.msgError("å½åæ°æ®ç¼ºå°äº§åIDæè§æ ¼åå·ID"); return; } record.value = row; isShowDetailModal.value = true; }; const handleDetailSubtract = (row) => { isShowDetailModal.value = false; showSubtractModal(row); }; const handleDetailFrozen = (row) => { isShowDetailModal.value = false; showFrozenModal(row); }; const handleDetailThaw = (row) => { isShowDetailModal.value = false; showThawModal(row); }; // ç¹å»å»ç» const showFrozenModal = (row) => { record.value = row isShowFrozenAndThawModal.value = true operationType.value = 'frozen' } record.value = row; isShowFrozenAndThawModal.value = true; operationType.value = "frozen"; }; // ç¹å»è§£å» const showThawModal = (row) => { record.value = row isShowFrozenAndThawModal.value = true operationType.value = 'thaw' } record.value = row; isShowFrozenAndThawModal.value = true; operationType.value = "thaw"; }; // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { // è¿æ»¤æåæ°æ® selectedRows.value = selection.filter(item => item.id); console.log('selection', selectedRows.value) } const expandedRowKeys = ref([]) selectedRows.value = selection.filter((item) => item.id); console.log("selection", selectedRows.value); }; const expandedRowKeys = ref([]); // è¡¨æ ¼è¡ç±»å const tableRowClassName = ({ row }) => { const stock = Number(row?.qualifiedUnLockedQuantity ?? 0); const warn = Number(row?.warnNum ?? 0); if (!Number.isFinite(stock) || !Number.isFinite(warn)) { return ''; return ""; } return stock < warn ? 'row-low-stock' : ''; return stock < warn ? "row-low-stock" : ""; }; // å¯¼åº const handleOut = () => { ElMessageBox.confirm( 'æ¯å¦ç¡®è®¤å¯¼åºï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { proxy.download("/stockInventory/exportStockInventory", {topParentProductId: props.productId}, 'åºåä¿¡æ¯.xlsx') }).catch(() => { proxy.$modal.msg("已忶") ElMessageBox.confirm("æ¯å¦ç¡®è®¤å¯¼åºï¼", "导åº", { confirmButtonText: "确认", cancelButtonText: "åæ¶", type: "warning", }) } .then(() => { proxy.download( "/stockInventory/exportStockInventory", { topParentProductId: props.productId }, "åºåä¿¡æ¯.xlsx" ); }) .catch(() => { proxy.$modal.msg("已忶"); }); }; onMounted(() => { getList() }) getList(); }); </script> <style scoped lang="scss"> src/views/safeProduction/safeWorkApproval/components/infoFormDia.vue
@@ -218,7 +218,7 @@ approveDeptName: "", approveReason: "", checkResult: "", storageBlobDTOs: [], storageBlobDTOS: [], approverList: [], // æ°å¢å段ï¼å卿æèç¹ç审æ¹äººid startDate: "", // 请åå¼å§æ¶é´ endDate: "", // 请åç»ææ¶é´ @@ -298,7 +298,7 @@ approveProcessGetInfo({ id: row.approveId, approveReason: "1" }).then( res => { form.value = { ...res.data }; form.value.storageBlobDTOs = res.data.storageBlobVOS; form.value.storageBlobDTOS = res.data.storageBlobVOS; // 忾审æ¹äºº if (res.data && res.data.approveUserIds) { const userIds = res.data.approveUserIds.split(","); @@ -388,7 +388,7 @@ return; } } form.value.storageBlobDTOs = fileList.value; form.value.storageBlobDTOS = fileList.value; proxy.$refs.formRef.validate(valid => { if (valid) { if (operationType.value === "add" || currentApproveStatus.value == 3) { src/views/salesManagement/salesLedger/index.vue
@@ -1578,7 +1578,7 @@ selectedQuotation.value = null; let userLists = await userListNoPage(); userList.value = userLists.data; listCustomer({ current: -1, size: -1 }).then(res => { listCustomer({ current: -1, size: -1, type: 0 }).then(res => { customerOption.value = res.data.records; }); form.value.entryPerson = userStore.id; @@ -2654,7 +2654,7 @@ // åè´§ç¶æå¿ é¡»æ¯"å¾ åè´§"æ"å®¡æ ¸æç»" const statusStr = shippingStatus ? String(shippingStatus).trim() : ""; return statusStr === "å¾ åè´§" || statusStr === "å®¡æ ¸æç»"; return statusStr === "å¾ åè´§" || statusStr === "å®¡æ ¸æç»" || statusStr === "é¨ååè´§"; }; // æå¼éä»¶å¼¹çª