src/api/collaborativeApproval/approvalProcess.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/basicData/supplierManage/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/collaborativeApproval/approvalProcess/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/inventoryManagement/issueManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/inventoryManagement/receiptManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/inventoryManagement/stockManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/salesManagement/salesLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/collaborativeApproval/approvalProcess.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,48 @@ // ååå®¡æ¹ import request from "@/utils/request"; export function approveProcessListPage(query) { return request({ url: '/approveProcess/list', method: 'get', params: query, }) } export function getDept(query) { return request({ url: '/approveProcess/getDept', method: 'get', params: query, }) } export function approveProcessGetInfo(query) { return request({ url: '/approveProcess/get', method: 'get', params: query, }) } // æ°å¢å®¡æ¹æµç¨ export function approveProcessAdd(query) { return request({ url: '/approveProcess/add', method: 'post', data: query, }) } // ä¿®æ¹å®¡æ¹æµç¨ export function approveProcessUpdate(query) { return request({ url: '/approveProcess/update', method: 'post', data: query, }) } // å é¤å®¡æ¹æµç¨ export function approveProcessDelete(query) { return request({ url: '/approveProcess/deleteIds', method: 'delete', data: query, }) } src/views/basicData/supplierManage/index.vue
@@ -199,13 +199,13 @@ <template #tip> <div class="el-upload__tip text-center"> <span>ä» å è®¸å¯¼å ¥xlsãxlsxæ ¼å¼æä»¶ã</span> <el-link <!-- <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate" >ä¸è½½æ¨¡æ¿</el-link > > --> </div> </template> </el-upload> @@ -350,6 +350,7 @@ }; /** æäº¤ä¸ä¼ æä»¶ */ function submitFileForm() { console.log(upload.url + '?updateSupport=' + upload.updateSupport) proxy.$refs["uploadRef"].submit(); } const getList = () => { @@ -367,6 +368,8 @@ title: "", // æ¯å¦ç¦ç¨ä¸ä¼ isUploading: false, // æ¯å¦æ´æ°å·²ç»åå¨çç¨æ·æ°æ® updateSupport: 1, // 设置ä¸ä¼ ç请æ±å¤´é¨ headers: { Authorization: "Bearer " + getToken() }, // ä¸ä¼ çå°å @@ -377,6 +380,19 @@ upload.title = "ä¾åºåå¯¼å ¥"; upload.open = true; } /**æä»¶ä¸ä¼ ä¸å¤ç */ const handleFileUploadProgress = (event, file, fileList) => { upload.isUploading = true; }; /** æä»¶ä¸ä¼ æåå¤ç */ const handleFileSuccess = (response, file, fileList) => { upload.open = false; upload.isUploading = false; proxy.$refs["uploadRef"].handleRemove(file); getList(); }; // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { selectedRows.value = selection; src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
@@ -9,31 +9,32 @@ <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> <el-row> <el-col :span="24"> <el-form-item label="æµç¨ç¼å·ï¼" prop="supplier"> <el-input v-model="form.model" placeholder="èªå¨ç¼å·" clearable disabled/> <el-form-item label="æµç¨ç¼å·ï¼" prop="approveId"> <el-input v-model="form.approveId" placeholder="èªå¨ç¼å·" clearable disabled/> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item label="ç³è¯·é¨é¨ï¼" prop="productId"> <el-tree-select v-model="form.productId" placeholder="è¯·éæ©" clearable check-strictly @change="getModels" :data="productOptions" :render-after-expand="false" style="width: 100%" /> <el-form-item label="ç³è¯·é¨é¨ï¼" prop="approveDeptId"> <el-select v-model="form.approveDeptId" placeholder="éæ©é¨é¨" > <el-option v-for="user in productOptions" :key="user.deptId" :label="user.deptName" :value="user.deptId" /> </el-select> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item label="审æ¹äºç±ï¼" prop="model"> <el-input v-model="form.model" placeholder="请è¾å ¥" clearable type="textarea" /> <el-form-item label="审æ¹äºç±ï¼" prop="approveReason"> <el-input v-model="form.approveReason" placeholder="请è¾å ¥" clearable type="textarea" /> </el-form-item> </el-col> </el-row> @@ -59,9 +60,9 @@ > <el-option v-for="user in userList" :key="user.id" :label="user.name" :value="user.id" :key="user.userId" :label="user.nickName" :value="user.userId" /> </el-select> <div> @@ -79,14 +80,14 @@ </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="ç³è¯·äººï¼" prop="checkName"> <el-input v-model="form.checkName" placeholder="请è¾å ¥" clearable/> <el-form-item label="ç³è¯·äººï¼" prop="approveUser"> <el-input v-model="form.approveUser" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ç³è¯·æ¥æï¼" prop="checkTime"> <el-form-item label="ç³è¯·æ¥æï¼" prop="approveTime"> <el-date-picker v-model="form.checkTime" v-model="form.approveTime" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" @@ -110,42 +111,39 @@ <script setup> import {ref, reactive, toRefs, getCurrentInstance} from "vue"; import {getOptions} from "@/api/procurementManagement/procurementLedger.js"; import {productTreeList} from "@/api/basicData/product.js"; import {qualityInspectAdd, qualityInspectUpdate} from "@/api/qualityManagement/rawMaterialInspection.js"; import { approveProcessAdd, approveProcessGetInfo, approveProcessUpdate, getDept } from "../../../../api/collaborativeApproval/approvalProcess.js"; import {userListNoPage} from "../../../../api/system/user.js"; const { proxy } = getCurrentInstance() const emit = defineEmits(['close']) import useUserStore from "@/store/modules/user"; const userStore = useUserStore(); const dialogFormVisible = ref(false); const operationType = ref('') const data = reactive({ form: { checkTime: "", supplier: "", checkName: "", productName: "", productId: "", model: "", unit: "", quantity: "", checkCompany: "", approveTime: "", approveId: "", approveUser: "", approveDeptId: "", approveReason: "", checkResult: "", approverList: [] // æ°å¢å段ï¼å卿æèç¹ç审æ¹äººid }, rules: { checkTime: [{ required: false, message: "请è¾å ¥", trigger: "blur" },], supplier: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], checkName: [{ required: false, message: "请è¾å ¥", trigger: "blur" }], productId: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], model: [{ required: false, message: "请è¾å ¥", trigger: "blur" }], unit: [{ required: false, message: "请è¾å ¥", trigger: "blur" }], quantity: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], checkCompany: [{ required: false, message: "请è¾å ¥", trigger: "blur" }], approveTime: [{ required: false, message: "请è¾å ¥", trigger: "change" },], approveId: [{ required: false, message: "请è¾å ¥", trigger: "blur" }], approveUser: [{ required: false, message: "请è¾å ¥", trigger: "blur" }], approveDeptId: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], approveReason: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], checkResult: [{ required: false, message: "请è¾å ¥", trigger: "blur" }], }, }); const { form, rules } = toRefs(data); const supplierList = ref([]); const productOptions = ref([]); // 审æ¹äººèç¹ç¸å ³ @@ -153,11 +151,7 @@ { id: 1, userId: null } ]) let nextApproverId = 2 const userList = ref([ { id: 1, name: 'å¼ ä¸' }, { id: 2, name: 'æå' }, { id: 3, name: 'çäº' } ]) const userList = ref([]) function addApproverNode() { approverNodes.value.push({ id: nextApproverId++, userId: null }) } @@ -169,46 +163,41 @@ const openDialog = (type, row) => { operationType.value = type; dialogFormVisible.value = true; getOptions().then((res) => { supplierList.value = res.data; userListNoPage().then((res) => { userList.value = res.data; }); getProductOptions(); form.value = {} approverNodes.value = [ { id: 1, userId: null } ] form.value.approveUser = userStore.nickName; form.value.approveTime = getCurrentDate(); if (operationType.value === 'edit') { form.value = {...row} // 忾审æ¹äººèç¹ 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 } } else { approverNodes.value = [{ id: 1, userId: null }] nextApproverId = 2 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 // } }) } } const getProductOptions = () => { productTreeList().then((res) => { productOptions.value = convertIdToValue(res); getDept().then((res) => { productOptions.value = res.data; }); }; const getModels = (value) => { form.value.productName = findNodeById(productOptions.value, value); }; const findNodeById = (nodes, productId) => { for (let i = 0; i < nodes.length; i++) { if (nodes[i].value === productId) { return nodes[i].label; // æ¾å°èç¹ï¼è¿å该èç¹ } if (nodes[i].children && nodes[i].children.length > 0) { const foundNode = findNodeById(nodes[i].children, productId); if (foundNode) { return foundNode; // å¨åèç¹ä¸æ¾å°ï¼è¿å该èç¹ } } } return null; // æ²¡ææ¾å°èç¹ï¼è¿ånull }; function convertIdToValue(data) { return data.map((item) => { @@ -227,17 +216,22 @@ // æäº¤äº§å表å const submitForm = () => { // æ¶éææèç¹ç审æ¹äººid form.value.approverList = approverNodes.value.map(node => node.userId) form.value.approverIds = approverNodes.value.map(node => node.userId).join(',') // 审æ¹äººå¿ å¡«æ ¡éª const hasEmptyApprover = approverNodes.value.some(node => !node.userId) if (hasEmptyApprover) { proxy.$modal.msgError("请为ææå®¡æ¹èç¹éæ©å®¡æ¹äººï¼") return } proxy.$refs.formRef.validate(valid => { if (valid) { form.value.inspectType = 0 if (operationType.value === "add") { qualityInspectAdd(form.value).then(res => { approveProcessAdd(form.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå"); closeDia(); }) } else { qualityInspectUpdate(form.value).then(res => { approveProcessUpdate(form.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå"); closeDia(); }) @@ -251,6 +245,14 @@ dialogFormVisible.value = false; emit('close') }; // è·åå½åæ¥æå¹¶æ ¼å¼å为 YYYY-MM-DD function getCurrentDate() { const today = new Date(); const year = today.getFullYear(); const month = String(today.getMonth() + 1).padStart(2, "0"); // æä»½ä»0å¼å§ const day = String(today.getDate()).padStart(2, "0"); return `${year}-${month}-${day}`; } defineExpose({ openDialog, }); src/views/collaborativeApproval/approvalProcess/index.vue
@@ -46,6 +46,7 @@ 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: { @@ -56,53 +57,55 @@ const tableColumn = ref([ { label: "审æ¹ç¶æ", prop: "checkResult", prop: "approveStatus", dataType: "tag", formatData: (params) => { if (params == 0) { return "å¾ å®¡æ ¸"; } else if (params == 1) { return "已宿"; return "å®¡æ ¸ä¸"; } else if (params == 2) { return "ä¸éè¿"; return "å®¡æ ¸å®æ"; } else { return 'å®¡æ ¸ä¸'; return 'ä¸éè¿'; } }, formatType: (params) => { if (params == 'ä¸åæ ¼') { return "danger"; } else if (params == 'åæ ¼') { if (params == 0) { return "warning"; } else if (params == 1) { return "primary"; } else if (params == 2) { return "success"; } else { return null; return 'danger'; } }, }, { label: "æµç¨ç¼å·", prop: "supplier", prop: "approveId", width: 230 }, { label: "ç³è¯·é¨é¨", prop: "checkName", prop: "approveDeptName", }, { label: "审æ¹äºç±", prop: "productName", prop: "approveReason", }, { label: "ç³è¯·äºº", prop: "model", prop: "approveUser", }, { label: "ç³è¯·æ¥æ", prop: "unit", prop: "approveTime", }, { label: "ç»ææ¥æ", prop: "quantity", prop: "approveOverTime", width: 120 }, { @@ -166,7 +169,7 @@ }; const getList = () => { tableLoading.value = true; qualityInspectListPage({...page, ...searchForm.value, inspectType: 0}).then(res => { approveProcessListPage({...page, ...searchForm.value,}).then(res => { tableLoading.value = false; tableData.value = res.data.records page.total = res.data.total; @@ -207,24 +210,10 @@ type: "warning", }) .then(() => { qualityInspectDel(ids).then((res) => { approveProcessDelete(ids).then((res) => { proxy.$modal.msgSuccess("å 餿å"); getList(); }); }) .catch(() => { proxy.$modal.msg("已忶"); }); }; // å¯¼åº const handleOut = () => { ElMessageBox.confirm("éä¸çå 容å°è¢«å¯¼åºï¼æ¯å¦ç¡®è®¤å¯¼åºï¼", "导åº", { confirmButtonText: "确认", cancelButtonText: "åæ¶", type: "warning", }) .then(() => { proxy.download("/quality/qualityInspect/export", {inspectType: 0}, "åæææ£éª.xlsx"); }) .catch(() => { proxy.$modal.msg("已忶"); src/views/inventoryManagement/issueManagement/index.vue
@@ -26,7 +26,7 @@ <el-table-column label="è§æ ¼åå·" prop="specificationModel" width="160" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" width="70" show-overflow-tooltip /> <el-table-column label="å ¥åºæ°é" prop="inboundNum" width="90" show-overflow-tooltip /> <el-table-column label="å¾ åºåºæ°é" prop="inboundNum0" width="90" show-overflow-tooltip /> <el-table-column label="åºåæ°é" prop="inboundNum0" width="90" show-overflow-tooltip /> <el-table-column label="å«ç¨åä»·" prop="taxInclusiveUnitPrice" width="100" show-overflow-tooltip /> <el-table-column label="å«ç¨æ»ä»·" prop="taxInclusiveTotalPrice" width="100" show-overflow-tooltip /> <el-table-column label="ç¨ç(%)" prop="taxRate" width="80" show-overflow-tooltip /> src/views/inventoryManagement/receiptManagement/index.vue
@@ -240,6 +240,7 @@ const openForm = async (type, row) => { operationType.value = type dialogFormVisible.value = true selectedRows.value = [] if (type === 'add') { // æ°å¢æ¶åå§å表å @@ -270,6 +271,7 @@ ...item, quantityStock: item.quantityStock || 0 // 妿已æå ¥åºæ°éåä¿ç })) selectedRows.value = productList.value } catch (error) { console.error('å 载产å失败:', error) proxy.$modal.msgError('å 载产å失败') src/views/inventoryManagement/stockManagement/index.vue
@@ -40,7 +40,7 @@ <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 v-model="dialogFormVisible" :title="operationType === 'add' ? 'æ°å¢åºåº' : 'ç¼è¾åºåº'" width="70%" <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? 'æ°å¢åºå' : 'ç¼è¾åºå'" width="70%" @close="closeDia"> <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> <el-row :gutter="30"> src/views/salesManagement/salesLedger/index.vue
@@ -3,7 +3,7 @@ <div class="search_form"> <el-form :model="searchForm" :inline="true"> <el-form-item label="客æ·åç§°ï¼"> <el-input v-model="searchForm.customerContractNo" placeholder="请è¾å ¥" clearable prefix-icon="Search" <el-input v-model="searchForm.customerName" placeholder="请è¾å ¥" clearable prefix-icon="Search" @change="handleQuery" /> </el-form-item> <el-form-item label="客æ·ååå·ï¼">