From 2362a3399f333aec47afc83caf0bfb1887af24a5 Mon Sep 17 00:00:00 2001 From: 曹睿 <360930172@qq.com> Date: 星期四, 10 七月 2025 14:16:15 +0800 Subject: [PATCH] Merge branch 'dev' of http://114.132.189.42:9002/r/product-inventory-management into dev --- src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue | 55 +++++-------- src/api/collaborativeApproval/approvalProcess.js | 15 +++ src/api/system/user.js | 8 ++ src/views/basicData/supplierManage/index.vue | 3 src/store/modules/user.js | 1 src/views/basicData/customerFile/index.vue | 2 src/views/basicData/product/index.vue | 65 ++++++++++++--- src/views/inventoryManagement/issueManagement/index.vue | 4 src/views/inventoryManagement/stockManagement/index.vue | 4 src/views/collaborativeApproval/approvalProcess/index.vue | 19 ++-- src/views/salesManagement/salesLedger/index.vue | 8 + src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue | 48 +++++++---- 12 files changed, 149 insertions(+), 83 deletions(-) diff --git a/src/api/collaborativeApproval/approvalProcess.js b/src/api/collaborativeApproval/approvalProcess.js index 4f8ca33..415bed8 100644 --- a/src/api/collaborativeApproval/approvalProcess.js +++ b/src/api/collaborativeApproval/approvalProcess.js @@ -38,6 +38,14 @@ data: query, }) } +// 鎻愪氦瀹℃壒 +export function updateApproveNode(query) { + return request({ + url: '/approveNode/updateApproveNode', + method: 'post', + data: query, + }) +} // 鍒犻櫎瀹℃壒娴佺▼ export function approveProcessDelete(query) { return request({ @@ -45,4 +53,11 @@ method: 'delete', data: query, }) +} +// 鏌ヨ瀹℃壒娴佺▼ +export function approveProcessDetails(query) { + return request({ + url: '/approveNode/details/' + query, + method: 'get', + }) } \ No newline at end of file diff --git a/src/api/system/user.js b/src/api/system/user.js index 7192d9b..431f6b0 100644 --- a/src/api/system/user.js +++ b/src/api/system/user.js @@ -135,6 +135,14 @@ }) } // 鏌ヨ鐢ㄦ埛鍒楄〃 +export function userListNoPageByTenantId() { + return request({ + url: '/system/user/userListNoPageByTenantId', + method: 'get' + }) +} + +// 鏌ヨ鐢ㄦ埛鍒楄〃 export function userListNoPage() { return request({ url: '/system/user/userListNoPage', diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 5623661..2dd2797 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -52,6 +52,7 @@ this.avatar = avatar this.currentFactoryName = user.currentFactoryName this.nickName = user.nickName + this.currentDeptId = user.currentDeptId resolve(res) }).catch(error => { reject(error) diff --git a/src/views/basicData/customerFile/index.vue b/src/views/basicData/customerFile/index.vue index f0c1186..2294dd7 100644 --- a/src/views/basicData/customerFile/index.vue +++ b/src/views/basicData/customerFile/index.vue @@ -309,7 +309,7 @@ const tableLoading = ref(false); const page = reactive({ current: 1, - size: 10, + size: 100, total: 0, }); const total = ref(0); diff --git a/src/views/basicData/product/index.vue b/src/views/basicData/product/index.vue index b17be1f..3aa263e 100644 --- a/src/views/basicData/product/index.vue +++ b/src/views/basicData/product/index.vue @@ -55,7 +55,7 @@ > 缂栬緫 </el-button> - <el-button type="primary" link @click="openProDia('add', data)"> + <el-button type="primary" link @click="openProDia('add', data)" :disabled="node.level >= 3"> 娣诲姞浜у搧 </el-button> <el-button @@ -99,7 +99,7 @@ @pagination="pagination" ></PIMTable> </div> - <el-dialog v-model="productDia" title="浜у搧" width="400px"> + <el-dialog v-model="productDia" title="浜у搧" width="400px" @keydown.enter.prevent> <el-form :model="form" label-width="140px" @@ -114,6 +114,7 @@ v-model="form.productName" placeholder="璇疯緭鍏ヤ骇鍝佸悕绉�" clearable + @keydown.enter.prevent /> </el-form-item> </el-col> @@ -131,6 +132,7 @@ title="瑙勬牸鍨嬪彿" width="400px" @close="closeModelDia" + @keydown.enter.prevent > <el-form :model="modelForm" @@ -146,6 +148,7 @@ v-model="modelForm.model" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" clearable + @keydown.enter.prevent /> </el-form-item> </el-col> @@ -157,6 +160,7 @@ v-model="modelForm.unit" placeholder="璇疯緭鍏ュ崟浣�" clearable + @keydown.enter.prevent /> </el-form-item> </el-col> @@ -315,16 +319,53 @@ proxy.$refs.formRef.resetFields(); productDia.value = false; }; +// 灏佽涓�涓畨鍏ㄧ殑纭妗嗭紝褰诲簳闃绘Enter閿Е鍙� +const safeConfirm = (message, title) => { + // 鏍囪鏄惁鏄紶鏍囩偣鍑伙紙鐐瑰嚮鎸夐挳浼氳Е鍙慺ocus浜嬩欢锛� + let isMouseClick = false; + + return new Promise((resolve, reject) => { + const box = ElMessageBox.confirm(message, title, { + confirmButtonText: "纭", + cancelButtonText: "鍙栨秷", + type: "warning", + beforeClose: (action, instance, done) => { + if (action === "confirm") { + // 鍙湁榧犳爣鐐瑰嚮鏃舵墠鍏佽纭 + if (isMouseClick) { + done(); + resolve(); + } else { + // Enter閿Е鍙戞椂闃绘 + done(false); + } + } else { + // 鍙栨秷鎿嶄綔鐩存帴鍏佽 + done(); + reject(); + } + } + }); + + // 鐩戝惉纭鎸夐挳鐨刦ocus浜嬩欢锛堥紶鏍囩偣鍑讳細瑙﹀彂锛孍nter閿笉浼氾級 + setTimeout(() => { + const confirmBtn = document.querySelector('.el-message-box__btns .el-button--primary'); + if (confirmBtn) { + confirmBtn.addEventListener('focus', () => { + isMouseClick = true; + }); + } + }, 0); // 寤惰繜鑾峰彇锛岀‘淇滵OM宸叉覆鏌� + }); +}; +// 鍒犻櫎浜у搧 // 鍒犻櫎浜у搧 const remove = (node, data) => { - let ids = []; - ids.push(data.id); - ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", { - confirmButtonText: "纭", - cancelButtonText: "鍙栨秷", - type: "warning", - }) + let ids = [data.id]; + // 浣跨敤灏佽鐨剆afeConfirm + safeConfirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず") .then(() => { + // 纭鍒犻櫎閫昏緫 tableLoading.value = true; delProduct(ids) .then((res) => { @@ -400,11 +441,7 @@ proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁"); return; } - ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", { - confirmButtonText: "纭", - cancelButtonText: "鍙栨秷", - type: "warning", - }) + safeConfirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず") .then(() => { tableLoading.value = true; delProductModel(ids) diff --git a/src/views/basicData/supplierManage/index.vue b/src/views/basicData/supplierManage/index.vue index 22216e3..f5eb792 100644 --- a/src/views/basicData/supplierManage/index.vue +++ b/src/views/basicData/supplierManage/index.vue @@ -35,6 +35,7 @@ :isSelection="true" @selection-change="handleSelectionChange" :tableLoading="tableLoading" + @pagination="pagination" ></PIMTable> </div> <el-dialog @@ -297,7 +298,7 @@ const tableLoading = ref(false); const page = reactive({ current: 1, - size: 10, + size: 100, total: 0, }); diff --git a/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue b/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue index 57b5e38..7e9488a 100644 --- a/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue +++ b/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue @@ -13,24 +13,24 @@ :key="index" :type="activity.current ? 'primary' : ''" :hollow="activity.current" - :timestamp="activity.timestamp" + :timestamp="activity.approveNodeTime" > <el-card> - <span style="font-size: 18px;font-weight: 700">{{activity.content}}</span> + <span style="font-size: 18px;font-weight: 700">鑺傜偣{{activity.approveNodeOrder}}</span> <div style="margin: 10px 0"> - <span style="font-size: 16px;font-weight: 600">瀹℃壒浜猴細{{activity.people}}</span> + <span style="font-size: 16px;font-weight: 600">瀹℃壒浜猴細{{activity.approveNodeUser}}</span> </div> <div> <span style="margin-bottom: 8px;display: inline-block;font-size: 16px;font-weight: 600">瀹℃壒鎰忚锛�</span> <el-form-item - v-if="activity.current" - :prop="'activities.' + index + '.value'" + v-if="activity.approveNodeRemark == 1" + :prop="'activities.' + index + '.approveNodeReason'" :rules="[{ required: true, message: '瀹℃壒鎰忚涓嶈兘涓虹┖', trigger: 'blur' }]" > - <el-input v-model="activity.value" clearable type="textarea" :disabled="operationType === 'view'"></el-input> + <el-input v-model="activity.approveNodeReason" clearable type="textarea" :disabled="operationType === 'view'"></el-input> </el-form-item> <el-form-item v-else> - <el-input v-model="activity.value" clearable type="textarea" disabled></el-input> + <el-input v-model="activity.approveNodeReason" clearable type="textarea" disabled></el-input> </el-form-item> </div> </el-card> @@ -39,7 +39,8 @@ </el-form> <template #footer v-if="operationType === 'approval'"> <div class="dialog-footer"> - <el-button type="primary" @click="submitForm">纭</el-button> + <el-button type="primary" @click="submitForm(2)">涓嶉�氳繃</el-button> + <el-button type="primary" @click="submitForm(1)">閫氳繃</el-button> <el-button @click="closeDia">鍙栨秷</el-button> </div> </template> @@ -49,44 +50,32 @@ <script setup> import {getCurrentInstance, ref} from "vue"; +import {approveProcessDetails, updateApproveNode} from "../../../../api/collaborativeApproval/approvalProcess.js"; const emit = defineEmits(['close']) const { proxy } = getCurrentInstance() const dialogFormVisible = ref(false); const operationType = ref('') -const activities = ref([ - { - content: '鑺傜偣1', - timestamp: '', - type: 'primary', - hollow: true, - people: 'admin', - value: '' - }, - { - content: '鑺傜偣2', - timestamp: '', - type: '', - hollow: false, - current: true, - people: 'admin', - value: '' - }, -]) +const activities = ref([]) const formRef = ref(null); // 鎵撳紑寮规 const openDialog = (type, row) => { operationType.value = type; dialogFormVisible.value = true; + approveProcessDetails(row.approveId).then((res) => { + console.log(res) + activities.value = res.data + }) } // 鎻愪氦瀹℃壒 -const submitForm = () => { - formRef.value.validate(valid => { - if (valid) { - // 鏍¢獙閫氳繃鍚庣殑閫昏緫 - } - }) +const submitForm = (status) => { + const filteredActivities = activities.value.filter(activity => activity.approveNodeRemark == 1); + filteredActivities[0].approveNodeStatus = status + updateApproveNode(filteredActivities[0]).then(() => { + proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); + closeDia(); + }) } // 鍏抽棴寮规 const closeDia = () => { diff --git a/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue b/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue index 585bc43..e02d3ee 100644 --- a/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue +++ b/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue @@ -18,6 +18,7 @@ <el-col :span="24"> <el-form-item label="鐢宠閮ㄩ棬锛�" prop="approveDeptId"> <el-select + disabled v-model="form.approveDeptId" placeholder="閫夋嫨閮ㄩ棬" > @@ -81,7 +82,17 @@ <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="鐢宠浜猴細" prop="approveUser"> - <el-input v-model="form.approveUser" placeholder="璇疯緭鍏�" clearable/> + <el-select + v-model="form.approveUser" + placeholder="閫夋嫨浜哄憳" + > + <el-option + v-for="user in userList" + :key="user.userId" + :label="user.nickName" + :value="user.userId" + /> + </el-select> </el-form-item> </el-col> <el-col :span="12"> @@ -116,7 +127,7 @@ approveProcessUpdate, getDept } from "../../../../api/collaborativeApproval/approvalProcess.js"; -import {userListNoPage} from "../../../../api/system/user.js"; +import {userListNoPage, getUserProfile} from "../../../../api/system/user.js"; const { proxy } = getCurrentInstance() const emit = defineEmits(['close']) import useUserStore from "@/store/modules/user"; @@ -171,26 +182,27 @@ approverNodes.value = [ { id: 1, userId: null } ] - form.value.approveUser = userStore.nickName; + console.log(userStore) + form.value.approveUser = userStore.id; form.value.approveTime = getCurrentDate(); + + // 鑾峰彇褰撳墠鐢ㄦ埛淇℃伅骞惰缃儴闂↖D + form.value.approveDeptId = userStore.currentDeptId if (operationType.value === 'edit') { approveProcessGetInfo({id: row.approveId,approveReason: '1'}).then(res => { form.value = {...res.data} // 鍙嶆樉瀹℃壒浜� - // if (res.data && res.data.approverIds) { - // const nameArr = res.data.approverIds.split('锛�') - // approverNodes.value = nameArr.map((name, idx) => { - // const user = userList.value.find(u => u.name === name) - // return { id: idx + 1, userId: user ? user.id : null } - // }) - // nextApproverId = nameArr.length + 1 - // } else if (row.approverList && Array.isArray(row.approverList) && row.approverList.length > 0) { - // approverNodes.value = row.approverList.map((userId, idx) => ({ id: idx + 1, userId })) - // nextApproverId = row.approverList.length + 1 - // } else { - // approverNodes.value = [{ id: 1, userId: null }] - // nextApproverId = 2 - // } + if (res.data && res.data.approveUserIds) { + const userIds = res.data.approveUserIds.split(',') + approverNodes.value = userIds.map((userId, idx) => ({ + id: idx + 1, + userId: parseInt(userId.trim()) + })) + nextApproverId = userIds.length + 1 + } else { + approverNodes.value = [{ id: 1, userId: null }] + nextApproverId = 2 + } }) } } @@ -216,7 +228,7 @@ // 鎻愪氦浜у搧琛ㄥ崟 const submitForm = () => { // 鏀堕泦鎵�鏈夎妭鐐圭殑瀹℃壒浜篿d - form.value.approverIds = approverNodes.value.map(node => node.userId).join(',') + form.value.approveUserIds = approverNodes.value.map(node => node.userId).join(',') // 瀹℃壒浜哄繀濉牎楠� const hasEmptyApprover = approverNodes.value.some(node => !node.userId) if (hasEmptyApprover) { diff --git a/src/views/collaborativeApproval/approvalProcess/index.vue b/src/views/collaborativeApproval/approvalProcess/index.vue index ab98ab8..10fbf29 100644 --- a/src/views/collaborativeApproval/approvalProcess/index.vue +++ b/src/views/collaborativeApproval/approvalProcess/index.vue @@ -2,11 +2,11 @@ <div class="app-container"> <div class="search_form"> <div> - <span class="search_title">渚涘簲鍟嗭細</span> + <span class="search_title">娴佺▼缂栧彿锛�</span> <el-input - v-model="searchForm.supplier" + v-model="searchForm.approveId" style="width: 240px" - placeholder="璇疯緭鍏ヤ緵搴斿晢鎼滅储" + placeholder="璇疯緭鍏ユ祦绋嬬紪鍙锋悳绱�" @change="handleQuery" clearable :prefix-icon="Search" @@ -43,14 +43,13 @@ import { Search } from "@element-plus/icons-vue"; import {onMounted, ref} from "vue"; import {ElMessageBox} from "element-plus"; -import {qualityInspectDel, qualityInspectListPage} from "@/api/qualityManagement/rawMaterialInspection.js"; 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"; const data = reactive({ searchForm: { - supplier: "", + approveId: "", }, }); const { searchForm } = toRefs(data); @@ -85,19 +84,21 @@ { label: "娴佺▼缂栧彿", prop: "approveId", - width: 230 + width: 170 }, { label: "鐢宠閮ㄩ棬", prop: "approveDeptName", + width: 220 }, { label: "瀹℃壒浜嬬敱", prop: "approveReason", + width: 200 }, { label: "鐢宠浜�", - prop: "approveUser", + prop: "approveUserName", }, { label: "鐢宠鏃ユ湡", @@ -110,7 +111,7 @@ }, { label: "褰撳墠瀹℃壒浜�", - prop: "checkCompany", + prop: "approveUserCurrentName", width: 120 }, { @@ -199,7 +200,7 @@ const handleDelete = () => { let ids = []; if (selectedRows.value.length > 0) { - ids = selectedRows.value.map((item) => item.id); + ids = selectedRows.value.map((item) => item.approveId); } else { proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁"); return; diff --git a/src/views/inventoryManagement/issueManagement/index.vue b/src/views/inventoryManagement/issueManagement/index.vue index 2c28e35..859dc94 100644 --- a/src/views/inventoryManagement/issueManagement/index.vue +++ b/src/views/inventoryManagement/issueManagement/index.vue @@ -71,7 +71,7 @@ import { ref } from 'vue' import { ElMessageBox } from "element-plus"; import useUserStore from '@/store/modules/user' -import { userListNoPage } from "@/api/system/user.js"; +import { userListNoPageByTenantId } from "@/api/system/user.js"; import { getStockInPage } from "@/api/inventoryManagement/stockIn.js"; @@ -185,7 +185,7 @@ console.log('form',form.value) // 鍔犺浇鐢ㄦ埛鍒楄〃 try { - const userLists = await userListNoPage() + const userLists = await userListNoPageByTenantId() userList.value = userLists.data } catch (error) { console.error('鍔犺浇鐢ㄦ埛鍒楄〃澶辫触:', error) diff --git a/src/views/inventoryManagement/stockManagement/index.vue b/src/views/inventoryManagement/stockManagement/index.vue index 6356d7a..86f1a76 100644 --- a/src/views/inventoryManagement/stockManagement/index.vue +++ b/src/views/inventoryManagement/stockManagement/index.vue @@ -140,7 +140,7 @@ import { ref } from 'vue' import { ElMessageBox } from "element-plus"; import useUserStore from '@/store/modules/user' -import { userListNoPage } from "@/api/system/user.js"; +import { userListNoPageByTenantId } from "@/api/system/user.js"; import { productTreeList,modelList } from "@/api/basicData/product.js" import { getStockManagePage , @@ -257,7 +257,7 @@ operationType.value = type form.value = {} productData.value = [] - let userLists = await userListNoPage() + let userLists = await userListNoPageByTenantId() userList.value = userLists.data // customerList().then(res => { // customerOption.value = res diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue index 3ec809b..5a269d6 100644 --- a/src/views/salesManagement/salesLedger/index.vue +++ b/src/views/salesManagement/salesLedger/index.vue @@ -153,7 +153,7 @@ <el-row> <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate"> <el-button type="primary" @click="openProductForm('add')">娣诲姞</el-button> - <el-button plain type="danger" @click="deleteProduct">鍒犻櫎</el-button> + <el-button plain type="danger" @click="deleteProduct" >鍒犻櫎</el-button> </el-form-item> </el-row> <el-table :data="productData" border @selection-change="productSelected" show-summary @@ -631,14 +631,15 @@ const submitForm = () => { proxy.$refs["formRef"].validate((valid) => { if (valid) { - if (productData.value.length > 0) { + console.log('productData.value--', productData.value) + if (productData.value !== null && productData.value.length > 0) { form.value.productData = proxy.HaveJson(productData.value); } else { proxy.$modal.msgWarning("璇锋坊鍔犱骇鍝佷俊鎭�"); return; } let tempFileIds = []; - if (fileList.value.length > 0) { + if (fileList.value !== null && fileList.value.length > 0) { tempFileIds = fileList.value.map((item) => item.tempId); } form.value.tempFileIds = tempFileIds; @@ -682,6 +683,7 @@ }; const submitProductEdit = () => { productForm.value.salesLedgerId = currentId.value; + productForm.value.type = 1 addOrUpdateSalesLedgerProduct(productForm.value).then((res) => { proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); closeProductDia(); -- Gitblit v1.9.3