| 5 天以前 | huminmin | ![]() |
| 5 天以前 | gongchunyi | ![]() |
| 5 天以前 | huminmin | ![]() |
| 5 天以前 | spring | ![]() |
| 5 天以前 | spring | ![]() |
| 5 天以前 | zhangwencui | ![]() |
| 5 天以前 | gongchunyi | ![]() |
| 5 天以前 | spring | ![]() |
| 5 天以前 | spring | ![]() |
| 5 天以前 | zss | ![]() |
| 5 天以前 | huminmin | ![]() |
| 6 天以前 | zhangwencui | ![]() |
| 6 天以前 | zhangwencui | ![]() |
src/api/collaborativeApproval/noticeManagement.js
@@ -1,78 +1,78 @@ import request from '@/utils/request' import request from "@/utils/request"; // æ¥è¯¢å ¬åå表 export function listNotice(query) { return request({ url: '/collaborativeApproval/notice/page', method: 'get', params: query }) return request({ url: "/collaborativeApproval/notice/page", method: "get", params: query, }); } // æ¥è¯¢å ¬åè¯¦ç» export function getNotice(noticeId) { return request({ url: '/collaborativeApproval/notice/' + noticeId, method: 'get' }) return request({ url: "/collaborativeApproval/notice/" + noticeId, method: "get", }); } // æ°å¢å ¬å export function addNotice(data) { return request({ url: '/collaborativeApproval/notice/add', method: 'post', data: data }) return request({ url: "/collaborativeApproval/notice/add", method: "post", data: data, }); } // ä¿®æ¹å ¬å export function updateNotice(data) { return request({ url: '/collaborativeApproval/notice/update', method: 'put', data: data }) return request({ url: "/collaborativeApproval/notice/update", method: "put", data: data, }); } // å é¤å ¬å export function delNotice(ids) { return request({ url: '/collaborativeApproval/notice/' + ids, method: 'delete', }) return request({ url: "/collaborativeApproval/notice/" + ids, method: "delete", }); } // è·åå ¬åæ°é export function getCount() { return request({ url: '/collaborativeApproval/notice/count', method: 'get', }) return request({ url: "/collaborativeApproval/notice/count", method: "get", }); } // æ¥è¯¢å ¬åç±»åå表 export function listNoticeType() { return request({ url: '/noticeType/list', method: 'get' }) return request({ url: "/noticeType/list", method: "get", }); } // æ°å¢å ¬åç±»å export function addNoticeType(data) { return request({ url: '/noticeType/add', method: 'post', data: data }) return request({ url: "/noticeType/add", method: "post", data: data, }); } // å é¤å ¬åç±»å export function delNoticeType(id) { return request({ url: '/noticeType/del', method: 'delete', data: { id } }) } return request({ url: "/noticeType/del", method: "delete", data: [id], }); } src/api/inventoryManagement/stockInRecord.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ import request from "@/utils/request"; // æ¥è¯¢å ¥åºä¿¡æ¯å表 export const getStockInRecordListPage = (params) => { return request({ url: "/stockInRecord/listPage", method: "get", params, }); }; export const updateStockInRecord = (id, data) => { return request({ url: "/stockInRecord/" + id, method: "put", data: data, }); }; export const batchDeleteStockInRecords = (ids) => { return request({ url: "/stockInRecord", method: "delete", data: ids, }); }; src/api/inventoryManagement/stockInventory.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ import request from "@/utils/request.js"; // å页æ¥è¯¢åºåè®°å½å表 export const getStockInventoryListPage = (params) => { return request({ url: "/stockInventory/pagestockInventory", method: "get", params, }); }; // å建åºåè®°å½ export const createStockInventory = (params) => { return request({ url: "/stockInventory/addstockInventory", method: "post", params, }); }; // åå°åºåè®°å½ export const subtractStockInventory = (params) => { return request({ url: "/stockInventory/subtractStockInventory", method: "post", params, }); }; src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
@@ -16,7 +16,7 @@ </el-row> <el-row> <el-col :span="24"> <el-form-item label="ç³è¯·é¨é¨ï¼" prop="approveDeptId"> <el-form-item label="ç³è¯·é¨é¨ï¼"> <el-select disabled v-model="form.approveDeptId" @@ -178,7 +178,7 @@ </template> <script setup> import { computed, getCurrentInstance, reactive, ref, toRefs } from "vue"; import { computed, getCurrentInstance, nextTick, reactive, ref, toRefs } from "vue"; import { approveProcessDetails, getDept, @@ -251,7 +251,31 @@ userList.value = res.data; }); form.value = {...row} getProductOptions() // ç«å³æ¸ é¤è¡¨åéªè¯ç¶æï¼å ä¸ºåæ®µæ¯disabledçï¼ä¸éè¦éªè¯ï¼ nextTick(() => { if (formRef.value) { formRef.value.clearValidate(); } }); // ç¡®ä¿é项å è½½å®æååå¹é å¼ç±»å getProductOptions().then(() => { // ç¡®ä¿å¼ç±»åå¹é ï¼å¦æé项已å è½½ï¼ if (productOptions.value.length > 0 && form.value.approveDeptId) { const matchedOption = productOptions.value.find(opt => opt.deptId == form.value.approveDeptId || String(opt.deptId) === String(form.value.approveDeptId) ); if (matchedOption) { form.value.approveDeptId = matchedOption.deptId; } } // 忬¡æ¸ é¤éªè¯ï¼ç¡®ä¿é项å è½½åå¼å¹é æ£ç¡® nextTick(() => { if (formRef.value) { formRef.value.clearValidate(); } }); }); // æ¥ä»·å®¡æ¹ï¼ç¨å®¡æ¹äºç±å段æ¿è½½çâæ¥ä»·åå·â廿¥æ¥ä»·å表 if (isQuotationApproval.value) { @@ -287,17 +311,26 @@ }) } const getProductOptions = () => { getDept().then((res) => { return getDept().then((res) => { productOptions.value = res.data; }); }; // æäº¤å®¡æ¹ const submitForm = (status) => { const filteredActivities = activities.value.filter(activity => activity.isShen); filteredActivities[0].approveNodeStatus = status; if (!filteredActivities || filteredActivities.length === 0) { proxy.$modal.msgError("æªæ¾å°å¾ 审æ¹çèç¹"); return; } const currentActivity = filteredActivities[0]; if (!currentActivity) { proxy.$modal.msgError("æªæ¾å°å¾ 审æ¹çèç¹"); return; } currentActivity.approveNodeStatus = status; // 夿æ¯å¦ä¸ºæå䏿¥ const isLast = activities.value.findIndex(a => a.isShen) === activities.value.length-1; updateApproveNode({ ...filteredActivities[0], isLast }).then(() => { updateApproveNode({ ...currentActivity, isLast }).then(() => { proxy.$modal.msgSuccess("æäº¤æå"); closeDia(); }); src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
@@ -298,7 +298,6 @@ userListNoPageByTenantId().then((res) => { userList.value = res.data; }); getProductOptions(); form.value = {} approverNodes.value = [ { id: 1, userId: null } @@ -308,6 +307,9 @@ // è·åå½åç¨æ·ä¿¡æ¯å¹¶è®¾ç½®é¨é¨ID form.value.approveDeptId = userStore.currentDeptId // å è½½é¨é¨é项ï¼å¹¶å¨å è½½å®æå设置é¨é¨åç§° getProductOptions(); if (operationType.value === 'edit') { fileList.value = row.commonFileList form.value.tempFileIds = fileList.value.map(file => file.id) @@ -330,8 +332,18 @@ } } const getProductOptions = () => { getDept().then((res) => { return getDept().then((res) => { productOptions.value = res.data; // 妿已æé¨é¨IDï¼èªå¨è®¾ç½®é¨é¨åç§°ï¼ç¨äºéªè¯ï¼ if (form.value.approveDeptId && productOptions.value.length > 0) { const matchedDept = productOptions.value.find(dept => dept.deptId == form.value.approveDeptId || String(dept.deptId) === String(form.value.approveDeptId) ); if (matchedDept) { form.value.approveDeptName = matchedDept.deptName; } } }); }; function convertIdToValue(data) { src/views/collaborativeApproval/noticeManagement/index.vue
@@ -617,34 +617,23 @@ }; if (row.id) { // ç¼è¾æ¨¡å¼ - å å é¤åæ·»å ï¼å ä¸ºåªæ add å del æ¥å£ï¼ delNoticeType(row.id).then(res => { if (res.code === 200) { addNoticeType(data).then(addRes => { if (addRes.code === 200) { ElMessage.success('ç¼è¾æå'); row.editing = false; delete row.originalNoticeType; fetchNoticeTypeList().then(() => { // 妿å½åéä¸çç±»å被ç¼è¾ï¼éè¦éæ°è·åæ°æ® if (activeNoticeTypeTab.value === String(row.id)) { fetchNoticesByType(addRes.data?.id || row.id); } }); } }); } }); } else { // æ°å¢æ¨¡å¼ addNoticeType(data).then(res => { if (res.code === 200) { ElMessage.success('æ°å¢æå'); row.editing = false; fetchNoticeTypeList(); } }); // ç¼è¾æ¨¡å¼ - ä¼ å ¥id data.id = row.id; } addNoticeType(data).then(res => { if (res.code === 200) { ElMessage.success(row.id ? 'ç¼è¾æå' : 'æ°å¢æå'); row.editing = false; delete row.originalNoticeType; fetchNoticeTypeList().then(() => { // 妿å½åéä¸çç±»å被ç¼è¾ï¼éè¦éæ°è·åæ°æ® if (row.id && activeNoticeTypeTab.value === String(row.id)) { fetchNoticesByType(res.data?.id || row.id); } }); } }); }; const handleDeleteNoticeType = (row) => { src/views/collaborativeApproval/rulesRegulationsManagement/index.vue
@@ -1,101 +1,166 @@ <template> <div class="app-container"> <!-- è§ç« å¶åº¦ç®¡ç--> <el-card class="box-card"> <template #header> <div class="card-header"> <span>è§ç« å¶åº¦åå¸</span> </div> <!-- è§ç« å¶åº¦ç®¡ç--> <el-card class="box-card"> <template #header> <div class="card-header"> <span>è§ç« å¶åº¦åå¸</span> </div> </template> <div class="tab-content"> <el-row :gutter="20" class="mb-20"> <span class="ml-10">å¶åº¦æ é¢ï¼</span> <el-col :span="6"> <el-input v-model="regulationSearchForm.title" placeholder="请è¾å ¥å¶åº¦æ é¢" clearable /> </el-col> <span class="search_title">å¶åº¦åç±»ï¼</span> <el-col :span="4"> <el-select v-model="regulationSearchForm.category" placeholder="å¶åº¦åç±»" clearable> <el-option label="人äºå¶åº¦" value="hr" /> <el-option label="è´¢å¡å¶åº¦" value="finance" /> <el-option label="å®å ¨å¶åº¦" value="safety" /> <el-option label="ææ¯å¶åº¦" value="tech" /> </el-select> </el-col> <el-col :span="8"> <el-button type="primary" @click="searchRegulations">æç´¢</el-button> <el-button @click="resetRegulationSearch">éç½®</el-button> <el-button @click="handleExport">导åº</el-button> <el-button type="success" @click="handleAdd"> åå¸å¶åº¦ </el-button> </el-col> </el-row> <el-table :data="regulations" border v-loading="tableLoading" style="width: 100%"> <el-table-column prop="regulationNum" label="å¶åº¦ç¼å·" width="120" /> <el-table-column prop="title" label="å¶åº¦æ é¢" min-width="150" /> <el-table-column prop="category" label="åç±»" width="120"> <template #default="scope"> <el-tag>{{ getCategoryText(scope.row.category) }}</el-tag> </template> <div class="tab-content"> <el-row :gutter="20" class="mb-20"> <span class="ml-10">å¶åº¦æ é¢ï¼</span> <el-col :span="6"> <el-input v-model="regulationSearchForm.title" placeholder="请è¾å ¥å¶åº¦æ é¢" clearable /> </el-col> <span class="search_title">å¶åº¦åç±»ï¼</span> <el-col :span="4"> <el-select v-model="regulationSearchForm.category" placeholder="å¶åº¦åç±»" clearable> <el-option label="人äºå¶åº¦" value="hr" /> <el-option label="è´¢å¡å¶åº¦" value="finance" /> <el-option label="å®å ¨å¶åº¦" value="safety" /> <el-option label="ææ¯å¶åº¦" value="tech" /> </el-select> </el-col> <el-col :span="8"> <el-button type="primary" @click="searchRegulations">æç´¢</el-button> <el-button @click="resetRegulationSearch">éç½®</el-button> <el-button @click="handleExport">导åº</el-button> <el-button type="success" @click="handleAdd"> åå¸å¶åº¦ </el-button> </el-col> </el-row> <el-table :data="regulations" border v-loading="tableLoading" style="width: 100%"> <el-table-column prop="regulationNum" label="å¶åº¦ç¼å·" width="120" /> <el-table-column prop="title" label="å¶åº¦æ é¢" min-width="150" /> <el-table-column prop="category" label="åç±»" width="120"> <template #default="scope"> <el-tag>{{ getCategoryText(scope.row.category) }}</el-tag> </template> </el-table-column> <el-table-column prop="version" label="çæ¬" width="120" /> <el-table-column prop="createUserName" label="åå¸äºº" width="120" /> <el-table-column prop="createTime" label="å叿¶é´" width="180" /> <el-table-column prop="status" label="ç¶æ" width="100"> <template #default="scope"> <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'"> {{ scope.row.status === 'active' ? 'çæä¸' : 'å·²åºæ¢' }} </el-tag> </template> </el-table-column> <el-table-column prop="readCount" label="已读人æ°" width="100" /> <el-table-column label="æä½" width="320" fixed="right"> <template #default="scope"> <el-button link @click="viewRegulation(scope.row)">æ¥ç</el-button> <el-button link type="primary" @click="handleEdit(scope.row)">ç¼è¾</el-button> <el-button link type="danger" @click="repealEdit(scope.row)">åºå¼</el-button> <el-button link type="success" @click="viewVersionHistory(scope.row)">çæ¬åå²</el-button> <el-button link type="warning" @click="viewReadStatus(scope.row)">é è¯»ç¶æ</el-button> <el-button link type="primary" @click="openFileDialog(scope.row)">éä»¶</el-button> </template> </el-table-column> </el-table> </div> </el-card> </el-table-column> <el-table-column prop="version" label="çæ¬" width="120" /> <el-table-column prop="createUserName" label="åå¸äºº" width="120" /> <el-table-column prop="createTime" label="å叿¶é´" width="180" /> <el-table-column prop="status" label="ç¶æ" width="100"> <template #default="scope"> <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'"> {{ scope.row.status === 'active' ? 'çæä¸' : 'å·²åºæ¢' }} </el-tag> </template> </el-table-column> <el-table-column prop="readCount" label="已读人æ°" width="100" /> <el-table-column label="æä½" width="320" fixed="right"> <template #default="scope"> <el-button link @click="viewRegulation(scope.row)">æ¥ç</el-button> <el-button link type="primary" @click="handleEdit(scope.row)">ç¼è¾</el-button> <el-button link type="danger" @click="repealEdit(scope.row)">åºå¼</el-button> <el-button link type="success" @click="viewVersionHistory(scope.row)">çæ¬åå²</el-button> <!-- <el-button link type="warning" @click="viewReadStatus(scope.row)">é è¯»ç¶æ</el-button> --> <el-button link type="primary" @click="openFileDialog(scope.row)">éä»¶</el-button> </template> </el-table-column> </el-table> </div> </el-card> <!-- ç¨å°ç³è¯·å¯¹è¯æ¡ï¼å·²ç§»é¤ï¼ --> <!-- è§ç« å¶åº¦åå¸å¯¹è¯æ¡ --> <el-dialog v-model="showRegulationDialog" :title="operationType === 'add' ? 'åå¸å¶åº¦' : 'ç¼è¾å¶åº¦'" width="800px"> <el-form :model="regulationForm" :rules="regulationRules" ref="regulationFormRef" label-width="100px"> <el-form-item label="å¶åº¦ç¼å·" prop="regulationNum"> <el-input v-model="regulationForm.regulationNum" placeholder="请è¾å ¥å¶åº¦ç¼å·" /> <el-dialog v-model="showRegulationDialog" :title="operationType === 'add' ? 'åå¸å¶åº¦' : 'ç¼è¾å¶åº¦'" width="800px"> <el-form :model="regulationForm" :rules="regulationRules" ref="regulationFormRef" label-width="100px"> <el-form-item label="å¶åº¦ç¼å·" prop="regulationNum"> <el-input v-model="regulationForm.regulationNum" placeholder="请è¾å ¥å¶åº¦ç¼å·" /> </el-form-item> <el-form-item label="å¶åº¦æ é¢" prop="title"> <el-input v-model="regulationForm.title" placeholder="请è¾å ¥å¶åº¦æ é¢" /> <el-form-item label="å¶åº¦æ é¢" prop="title"> <el-input v-model="regulationForm.title" placeholder="请è¾å ¥å¶åº¦æ é¢" /> </el-form-item> <el-form-item label="å¶åº¦åç±»" prop="category"> <el-select v-model="regulationForm.category" placeholder="è¯·éæ©å¶åº¦åç±»" style="width: 100%"> <el-option label="人äºå¶åº¦" value="hr" /> <el-option label="è´¢å¡å¶åº¦" value="finance" /> <el-option label="å®å ¨å¶åº¦" value="safety" /> <el-option label="ææ¯å¶åº¦" value="tech" /> <el-form-item label="å¶åº¦åç±»" prop="category"> <el-select v-model="regulationForm.category" placeholder="è¯·éæ©å¶åº¦åç±»" style="width: 100%"> <el-option label="人äºå¶åº¦" value="hr" /> <el-option label="è´¢å¡å¶åº¦" value="finance" /> <el-option label="å®å ¨å¶åº¦" value="safety" /> <el-option label="ææ¯å¶åº¦" value="tech" /> </el-select> </el-form-item> <el-form-item label="å¶åº¦å 容" prop="content"> <el-input v-model="regulationForm.content" type="textarea" :rows="10" placeholder="请è¾å ¥å¶åº¦è¯¦ç»å 容" /> <el-form-item label="å¶åº¦å 容" prop="content"> <el-input v-model="regulationForm.content" type="textarea" :rows="10" placeholder="请è¾å ¥å¶åº¦è¯¦ç»å 容" /> </el-form-item> <el-form-item label="å¶åº¦çæ¬" prop="version"> <el-input v-model="regulationForm.version" placeholder="请è¾å ¥å¶åº¦çæ¬" /> <el-form-item label="å¶åº¦çæ¬" prop="version"> <el-input v-model="regulationForm.version" placeholder="请è¾å ¥å¶åº¦çæ¬" /> </el-form-item> <el-form-item label="çææ¶é´" prop="effectiveTime"> <el-date-picker v-model="regulationForm.effectiveTime" type="datetime" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" placeholder="éæ©çææ¶é´" style="width: 100%" /> <el-form-item label="çææ¶é´" prop="effectiveTime"> <el-date-picker v-model="regulationForm.effectiveTime" type="datetime" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" placeholder="éæ©çææ¶é´" style="width: 100%" /> </el-form-item> <el-form-item label="éç¨èå´" prop="scope"> <el-form-item label="éç¨èå´" prop="scope"> <el-checkbox-group v-model="regulationForm.scope"> <el-checkbox label="all">å ¨ä½åå·¥</el-checkbox> <el-checkbox label="manager">管çå±</el-checkbox> @@ -104,7 +169,8 @@ <el-checkbox label="tech">ææ¯é¨é¨</el-checkbox> </el-checkbox-group> </el-form-item> <el-form-item label="æ¯å¦éè¦ç¡®è®¤" prop="requireConfirm"> <el-form-item label="æ¯å¦éè¦ç¡®è®¤" prop="requireConfirm"> <el-switch v-model="regulationForm.requireConfirm" /> <span class="ml-10">å¼å¯ååå·¥éè¦é 读确认</span> </el-form-item> @@ -112,17 +178,19 @@ <template #footer> <span class="dialog-footer"> <el-button @click="showRegulationDialog = false">åæ¶</el-button> <el-button type="primary" @click="submitRegulation">åå¸å¶åº¦</el-button> <el-button type="primary" @click="submitRegulation">åå¸å¶åº¦</el-button> </span> </template> </el-dialog> <!-- ç¨å°è¯¦æ å¯¹è¯æ¡ï¼å·²ç§»é¤ï¼ --> <!-- è§ç« å¶åº¦è¯¦æ å¯¹è¯æ¡ --> <el-dialog v-model="showRegulationDetailDialog" title="è§ç« å¶åº¦è¯¦æ " width="800px"> <el-dialog v-model="showRegulationDetailDialog" title="è§ç« å¶åº¦è¯¦æ " width="800px"> <div v-if="currentRegulationDetail"> <el-descriptions :column="2" border> <el-descriptions :column="2" border> <el-descriptions-item label="å¶åº¦ç¼å·">{{ currentRegulationDetail.id }}</el-descriptions-item> <el-descriptions-item label="å¶åº¦æ é¢">{{ currentRegulationDetail.title }}</el-descriptions-item> <el-descriptions-item label="åç±»">{{ getCategoryText(currentRegulationDetail.category) }}</el-descriptions-item> @@ -135,19 +203,30 @@ <div class="regulation-content">{{ currentRegulationDetail.content }}</div> </div> <!-- 妿tableData>0 æ¾ç¤º --> <div style="margin: 10px 0;" v-if="tableData && tableData.length > 0" > <el-button type="success" @click="resetForm(currentRegulationDetail)">确认æ¥ç</el-button> <div style="margin: 10px 0;" v-if="tableData && tableData.length > 0"> <el-button type="success" @click="resetForm(currentRegulationDetail)">确认æ¥ç</el-button> </div> </div> </el-dialog> <!-- çæ¬åå²å¯¹è¯æ¡ --> <el-dialog v-model="showVersionHistoryDialog" title="çæ¬åå²" width="800px"> <el-table :data="versionHistory" style="width: 100%;margin-bottom: 10px"> <el-table-column prop="version" label="çæ¬å·" width="100" /> <el-table-column prop="updateTime" label="æ´æ°æ¶é´" width="180" /> <el-table-column prop="createUserName" label="æ´æ°äºº" width="120" /> <el-table-column prop="changeLog" label="åæ´è¯´æ"> <el-dialog v-model="showVersionHistoryDialog" title="çæ¬åå²" width="800px"> <el-table :data="versionHistory" style="width: 100%;margin-bottom: 10px"> <el-table-column prop="version" label="çæ¬å·" width="100" /> <el-table-column prop="updateTime" label="æ´æ°æ¶é´" width="180" /> <el-table-column prop="createUserName" label="æ´æ°äºº" width="120" /> <el-table-column prop="changeLog" label="åæ´è¯´æ"> <template #default="scope"> <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'"> {{ scope.row.status === 'active' ? 'çæä¸' : 'å·²åºæ¢' }} @@ -156,15 +235,27 @@ </el-table-column> </el-table> </el-dialog> <!-- é è¯»ç¶æå¯¹è¯æ¡ --> <el-dialog v-model="showReadStatusDialog" title="é è¯»ç¶æ" width="800px"> <el-table :data="readStatusList" style="width: 100%;margin-bottom: 10px"> <el-table-column prop="employee" label="åå·¥å§å" width="120" /> <el-table-column prop="department" label="æå±é¨é¨" width="150" /> <el-table-column prop="createTime" label="é 读æ¶é´" width="180" /> <el-table-column prop="confirmTime" label="确认æ¶é´" width="180" /> <el-table-column prop="status" label="ç¶æ" width="100"> <el-dialog v-model="showReadStatusDialog" title="é è¯»ç¶æ" width="800px"> <el-table :data="readStatusList" style="width: 100%;margin-bottom: 10px"> <el-table-column prop="employee" label="åå·¥å§å" width="120" /> <el-table-column prop="department" label="æå±é¨é¨" width="150" /> <el-table-column prop="createTime" label="é 读æ¶é´" width="180" /> <el-table-column prop="confirmTime" label="确认æ¶é´" width="180" /> <el-table-column prop="status" label="ç¶æ" width="100"> <template #default="scope"> <el-tag :type="scope.row.status === 'confirmed' ? 'success' : 'warning'"> {{ scope.row.status === 'confirmed' ? '已确认' : 'æªç¡®è®¤' }} @@ -173,412 +264,437 @@ </el-table-column> </el-table> </el-dialog> <FileListDialog ref="fileListDialogRef" v-model="fileDialogVisible" :show-upload-button="true" :show-delete-button="true" :delete-method="handleAttachmentDelete" :rules-regulations-management-id="currentFileRuleId" :name-column-label="'éä»¶åç§°'" @upload="handleAttachmentUpload" /> <FileListDialog ref="fileListDialogRef" v-model="fileDialogVisible" :show-upload-button="true" :show-delete-button="true" :delete-method="handleAttachmentDelete" :rules-regulations-management-id="currentFileRuleId" :name-column-label="'éä»¶åç§°'" @upload="handleAttachmentUpload" /> </div> </template> <script setup> import { ref, reactive, onMounted, getCurrentInstance } from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' import { listRuleManagement,addRuleManagement,updateRuleManagement,delRuleManagement,getReadingStatusByRuleId,addReadingStatus,updateReadingStatus } from '@/api/collaborativeApproval/sealManagement.js' import FileListDialog from '@/components/Dialog/FileListDialog.vue' import { listRuleFiles, delRuleFile, addRuleFile } from '@/api/collaborativeApproval/rulesRegulationsManagementFile.js' import { ref, reactive, onMounted, getCurrentInstance } from "vue"; import { ElMessage, ElMessageBox } from "element-plus"; import { listRuleManagement, addRuleManagement, updateRuleManagement, delRuleManagement, getReadingStatusByRuleId, addReadingStatus, updateReadingStatus, } from "@/api/collaborativeApproval/sealManagement.js"; import FileListDialog from "@/components/Dialog/FileListDialog.vue"; import { listRuleFiles, delRuleFile, addRuleFile, } from "@/api/collaborativeApproval/rulesRegulationsManagementFile.js"; // ååºå¼æ°æ® const operationType = ref('add') const tableData = ref([]) const tableLoading = ref(false) // å页忰 const page = reactive({ current: 1, size: 10, total: 0 }) // éä»¶å¼¹çª const fileDialogVisible = ref(false) const fileListDialogRef = ref(null) const currentFileRuleId = ref(null) const filePage = reactive({ current: 1, size: 10, total: 0 }) // è§ç« å¶åº¦ç¸å ³ const showRegulationDialog = ref(false) const showRegulationDetailDialog = ref(false) const showVersionHistoryDialog = ref(false) const showReadStatusDialog = ref(false) const currentRegulationDetail = ref(null) const regulationFormRef = ref() const regulationForm = reactive({ id: '', regulationNum: '', title: '', category: '', content: '', version: '', status: 'active', readCount: 0, effectiveTime: '', scope: [], requireConfirm: false }) // ååºå¼æ°æ® const operationType = ref("add"); const tableData = ref([]); const tableLoading = ref(false); // å页忰 const page = reactive({ current: 1, size: 10, total: 0, }); // éä»¶å¼¹çª const fileDialogVisible = ref(false); const fileListDialogRef = ref(null); const currentFileRuleId = ref(null); const filePage = reactive({ current: 1, size: 10, total: 0, }); // è§ç« å¶åº¦ç¸å ³ const showRegulationDialog = ref(false); const showRegulationDetailDialog = ref(false); const showVersionHistoryDialog = ref(false); const showReadStatusDialog = ref(false); const currentRegulationDetail = ref(null); const regulationFormRef = ref(); const regulationForm = reactive({ id: "", regulationNum: "", title: "", category: "", content: "", version: "", status: "active", readCount: 0, effectiveTime: "", scope: [], requireConfirm: false, }); const readStatus = ref({ id: '', ruleId: '', employee: '', department: '', createTime: '', confirmTime: '', status: 'unconfirmed' }) const readStatus = ref({ id: "", ruleId: "", employee: "", department: "", createTime: "", confirmTime: "", status: "unconfirmed", }); const regulationRules = { title: [{ required: true, message: '请è¾å ¥å¶åº¦æ é¢', trigger: 'blur' }], category: [{ required: true, message: 'è¯·éæ©å¶åº¦åç±»', trigger: 'change' }], content: [{ required: true, message: '请è¾å ¥å¶åº¦å 容', trigger: 'blur' }], effectiveTime: [{ required: true, message: 'è¯·éæ©çææ¶é´', trigger: 'change' }], scope: [{ required: true, message: 'è¯·éæ©éç¨èå´', trigger: 'change' }] } const regulationRules = { title: [{ required: true, message: "请è¾å ¥å¶åº¦æ é¢", trigger: "blur" }], category: [{ required: true, message: "è¯·éæ©å¶åº¦åç±»", trigger: "change" }], content: [{ required: true, message: "请è¾å ¥å¶åº¦å 容", trigger: "blur" }], effectiveTime: [ { required: true, message: "è¯·éæ©çææ¶é´", trigger: "change" }, ], scope: [{ required: true, message: "è¯·éæ©éç¨èå´", trigger: "change" }], }; const regulationSearchForm = reactive({ title: '', category: '' }) const regulationSearchForm = reactive({ title: "", category: "", }); const regulations = ref([]) const regulations = ref([]); const versionHistory = ref([]) const versionHistory = ref([]); const readStatusList = ref([]) const readStatusList = ref([]); // { employee: 'éå¿å¼º', department: 'éå®é¨', readTime: '2025-01-11 10:30:00', confirmTime: '2025-01-11 10:35:00', status: 'confirmed' }, // { employee: 'åé å©·', department: 'ææ¯é¨', readTime: '2025-01-11 14:20:00', confirmTime: '', status: 'unconfirmed' }, // { employee: 'ç建å½', department: 'è´¢å¡é¨', readTime: '2025-01-12 09:15:00', confirmTime: '2025-01-12 09:20:00', status: 'confirmed' } // å¶åº¦åç±» const getCategoryText = (category) => { const categoryMap = { hr: '人äºå¶åº¦', finance: 'è´¢å¡å¶åº¦', safety: 'å®å ¨å¶åº¦', tech: 'ææ¯å¶åº¦' } return categoryMap[category] || 'æªç¥' } // æç´¢å¶åº¦ const searchRegulations = () => { page.current=1 getRegulationList() } // éç½®å¶åº¦æç´¢ const resetRegulationSearch = () => { regulationSearchForm.title = '' regulationSearchForm.category = '' searchRegulations() } // æ°å¢ const handleAdd = () => { operationType.value = 'add' resetRegulationForm() showRegulationDialog.value = true } // å¶åº¦åç±» const getCategoryText = category => { const categoryMap = { hr: "人äºå¶åº¦", finance: "è´¢å¡å¶åº¦", safety: "å®å ¨å¶åº¦", tech: "ææ¯å¶åº¦", }; return categoryMap[category] || "æªç¥"; }; // æç´¢å¶åº¦ const searchRegulations = () => { page.current = 1; getRegulationList(); }; // éç½®å¶åº¦æç´¢ const resetRegulationSearch = () => { regulationSearchForm.title = ""; regulationSearchForm.category = ""; searchRegulations(); }; // æ°å¢ const handleAdd = () => { operationType.value = "add"; resetRegulationForm(); showRegulationDialog.value = true; }; // ç¼è¾ const handleEdit = (row) => { operationType.value = 'edit' Object.assign(regulationForm, row) showRegulationDialog.value = true } // åºå¼ const repealEdit = (row) => { operationType.value = 'edit' Object.assign(regulationForm, row) regulationForm.status = 'repealed' ElMessageBox.confirm('确认åºå¼è¯¥å¶åº¦ï¼', 'æç¤º', { confirmButtonText: 'ç¡®å®', cancelButtonText: 'åæ¶', type: 'warning' }).then(() => { updateRuleManagement(regulationForm).then(res => { if(res.code == 200){ ElMessage.success('å¶åº¦åºå¼æå') // showRegulationDialog.value = false getRegulationList() resetRegulationForm() } // ç¼è¾ const handleEdit = row => { operationType.value = "edit"; Object.assign(regulationForm, row); showRegulationDialog.value = true; }; // åºå¼ const repealEdit = row => { operationType.value = "edit"; Object.assign(regulationForm, row); regulationForm.status = "repealed"; ElMessageBox.confirm("确认åºå¼è¯¥å¶åº¦ï¼", "æç¤º", { confirmButtonText: "ç¡®å®", cancelButtonText: "åæ¶", type: "warning", }) }).catch(() => { ElMessage({ type: 'info', message: '已忶åºå¼' }) }) } // åå¸å¶åº¦ const submitRegulation = async () => { try { await regulationFormRef.value.validate() if(operationType.value == 'add'){ addRuleManagement(regulationForm).then(res => { if(res.code == 200){ ElMessage.success('å¶åº¦å叿å') showRegulationDialog.value = false getRegulationList() resetRegulationForm() } .then(() => { updateRuleManagement(regulationForm).then(res => { if (res.code == 200) { ElMessage.success("å¶åº¦åºå¼æå"); // showRegulationDialog.value = false getRegulationList(); resetRegulationForm(); } }); }) }else{ updateRuleManagement(regulationForm).then(res => { if(res.code == 200){ ElMessage.success('å¶åº¦ç¼è¾æå') showRegulationDialog.value = false resetRegulationForm() getRegulationList() }})} }catch(err){ ElMessage.error(err.msg) } } //éç½®å¶åº¦è¡¨å const resetRegulationForm = () => { Object.assign(regulationForm, { id: '', regulationNum: '', title: '', category: '', content: '', version: '', status: 'active', readCount: 0, effectiveTime: '', scope: [], requireConfirm: false }) } // æ¥çå¶åº¦çæ¬åå² const viewVersionHistory = (row) => { showVersionHistoryDialog.value = true const params = { category: row.category } listRuleManagement(page,params).then(res => { if(res.code == 200){ versionHistory.value = res.data.records .catch(() => { ElMessage({ type: "info", message: "已忶åºå¼", }); }); }; // åå¸å¶åº¦ const submitRegulation = async () => { try { await regulationFormRef.value.validate(); if (operationType.value == "add") { addRuleManagement(regulationForm).then(res => { if (res.code == 200) { ElMessage.success("å¶åº¦å叿å"); showRegulationDialog.value = false; getRegulationList(); resetRegulationForm(); } }); } else { updateRuleManagement(regulationForm).then(res => { if (res.code == 200) { ElMessage.success("å¶åº¦ç¼è¾æå"); showRegulationDialog.value = false; resetRegulationForm(); getRegulationList(); } }); } } catch (err) { ElMessage.error(err.msg); } }) } // æ¥çå¶åº¦è¯¦æ const viewRegulation = (row) => { currentRegulationDetail.value = row showRegulationDetailDialog.value = true getReadingStatusByRuleId(row.id).then(res => { if(res.code == 200){ readStatusList.value = res.data if(readStatusList.value.length==0 && tableData.value.length>0){ }; //éç½®å¶åº¦è¡¨å const resetRegulationForm = () => { Object.assign(regulationForm, { id: "", regulationNum: "", title: "", category: "", content: "", version: "", status: "active", readCount: 0, effectiveTime: "", scope: [], requireConfirm: false, }); }; // æ¥çå¶åº¦çæ¬åå² const viewVersionHistory = row => { showVersionHistoryDialog.value = true; const params = { category: row.category, }; listRuleManagement(page, params).then(res => { if (res.code == 200) { versionHistory.value = res.data.records; } }); }; // æ¥çå¶åº¦è¯¦æ const viewRegulation = row => { currentRegulationDetail.value = row; showRegulationDetailDialog.value = true; getReadingStatusByRuleId(row.id).then(res => { if (res.code == 200) { readStatusList.value = res.data; if (readStatusList.value.length == 0 && tableData.value.length > 0) { const params = { ruleId: row.id, employee: tableData.value[0].staffName, department: tableData.value[0].postJob, status: 'unconfirmed' ruleId: row.id, employee: tableData.value[0].staffName, department: tableData.value[0].postJob, status: "unconfirmed", }; addReadingStatus(params).then(res => { if (res.code == 200) { ElMessage.success("å¶åº¦é 读æå"); } }); } addReadingStatus(params).then(res => { if(res.code == 200){ ElMessage.success('å¶åº¦é 读æå') } }) } } }) } // æ¥çå¶åº¦é è¯»ç¶æ const viewReadStatus = (row) => { showReadStatusDialog.value = true //æ¥çé è¯»ç¶æå表 getReadingStatusByRuleId(row.id).then(res => { if(res.code == 200){ readStatusList.value = res.data } }) } //确认æ¥ç const resetForm = (row) => { console.log("row",row) row.readCount = row.readCount + 1 updateRuleManagement(row).then(res => { if(res.code == 200){ ElMessage.success('æ¥çæ°éä¿®æ¹æå') //ä¿®æ¹é è¯»ç¶æ //æ ¹æ®å¶åº¦idåå½åç»å½çåå·¥å¾å°é è¯»ç¶æ // let item = readStatusList.value.filter(item => item.employee == tableData.value[0].staffName ) // if(item.length>0){ // item[0].status = 'confirmed', // item[0].confirmTime = new Date().toISOString().replace('T', ' ').split('.')[0]; // } // çéå½åå工对åºè¯¥å¶åº¦çé è¯»ç¶æè®°å½ let statusItem = readStatusList.value.find(item => item.employee === tableData.value[0].staffName && item.ruleId === row.id); if (statusItem) { // 妿æ¾å°è®°å½ï¼æ´æ°ç¶æå确认æ¶é´ statusItem.status = 'confirmed'; // æ ¼å¼åæ¶é´ä¸º"YYYY-MM-DD HH:mm:ss"æ ¼å¼ const now = new Date(); statusItem.confirmTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}`; // statusItem.confirmTime = new Date().toISOString().replace('T', ' ').split('.')[0]; updateReadingStatus(statusItem).then(res => { if(res.code == 200){ ElMessage.success('å¶åº¦é è¯»ç¶æä¿®æ¹æå') } }) }); }; // æ¥çå¶åº¦é è¯»ç¶æ const viewReadStatus = row => { showReadStatusDialog.value = true; //æ¥çé è¯»ç¶æå表 getReadingStatusByRuleId(row.id).then(res => { if (res.code == 200) { readStatusList.value = res.data; } }); }; //确认æ¥ç const resetForm = row => { console.log("row", row); row.readCount = row.readCount + 1; updateRuleManagement(row).then(res => { if (res.code == 200) { ElMessage.success("æ¥çæ°éä¿®æ¹æå"); //ä¿®æ¹é è¯»ç¶æ //æ ¹æ®å¶åº¦idåå½åç»å½çåå·¥å¾å°é è¯»ç¶æ // let item = readStatusList.value.filter(item => item.employee == tableData.value[0].staffName ) // if(item.length>0){ // item[0].status = 'confirmed', // item[0].confirmTime = new Date().toISOString().replace('T', ' ').split('.')[0]; // } // çéå½åå工对åºè¯¥å¶åº¦çé è¯»ç¶æè®°å½ let statusItem = readStatusList.value.find( item => item.employee === tableData.value[0].staffName && item.ruleId === row.id ); if (statusItem) { // 妿æ¾å°è®°å½ï¼æ´æ°ç¶æå确认æ¶é´ statusItem.status = "confirmed"; // æ ¼å¼åæ¶é´ä¸º"YYYY-MM-DD HH:mm:ss"æ ¼å¼ const now = new Date(); statusItem.confirmTime = `${now.getFullYear()}-${String( now.getMonth() + 1 ).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")} ${String( now.getHours() ).padStart(2, "0")}:${String(now.getMinutes()).padStart( 2, "0" )}:${String(now.getSeconds()).padStart(2, "0")}`; // statusItem.confirmTime = new Date().toISOString().replace('T', ' ').split('.')[0]; updateReadingStatus(statusItem).then(res => { if (res.code == 200) { ElMessage.success("å¶åº¦é è¯»ç¶æä¿®æ¹æå"); } }); } } }); }; // 导åºè§ç« å¶åº¦ const { proxy } = getCurrentInstance(); const handleExport = () => { proxy.download( "/rulesRegulationsManagement/export", { ...regulationSearchForm }, "è§ç« å¶åº¦.xlsx" ); }; // éä»¶ï¼æ¥è¯¢ const fetchRuleFiles = async rulesRegulationsManagementId => { const params = { current: filePage.current, size: filePage.size, rulesRegulationsManagementId, }; const res = await listRuleFiles(params); const records = res?.data?.records || []; filePage.total = res?.data?.total || records.length; const mapped = records.map(item => ({ id: item.id, name: item.fileName || item.name, url: item.fileUrl || item.url, raw: item, })); fileListDialogRef.value?.setList(mapped); }; // æå¼éä»¶å¼¹çª const openFileDialog = async row => { currentFileRuleId.value = row.id; fileDialogVisible.value = true; await fetchRuleFiles(row.id); }; // å·æ°éä»¶å表 const refreshFileList = async () => { if (!currentFileRuleId.value) return; await fetchRuleFiles(currentFileRuleId.value); }; // ä¸ä¼ éä»¶ï¼ç±åç»ä»¶è§¦åï¼ const handleAttachmentUpload = async filePayload => { if (!currentFileRuleId.value) return; const payload = { name: filePayload?.fileName || filePayload?.name, url: filePayload?.fileUrl || filePayload?.url, rulesRegulationsManagementId: currentFileRuleId.value, }; await addRuleFile(payload); ElMessage.success("æä»¶ä¸ä¼ æå"); await refreshFileList(); }; // å é¤éä»¶ const handleAttachmentDelete = async row => { if (!row?.id) return false; try { await ElMessageBox.confirm("确认å é¤è¯¥éä»¶ï¼", "æç¤º", { type: "warning" }); } catch { return false; } }) } await delRuleFile([row.id]); ElMessage.success("å 餿å"); await refreshFileList(); }; // 导åºè§ç« å¶åº¦ const { proxy } = getCurrentInstance() const handleExport = () => { proxy.download('/rulesRegulationsManagement/export', { ...regulationSearchForm }, 'è§ç« å¶åº¦.xlsx') } // è·åè§ç« å¶åº¦åè¡¨æ°æ® const getRegulationList = async () => { tableLoading.value = true; listRuleManagement(page, regulationSearchForm) .then(res => { regulations.value = res.data.records; // è¿æ»¤æå·²åºå¼çå¶åº¦ // regulations.value = res.data.records.filter(item => item.status !== 'repealed') page.value.total = res.data.total; tableLoading.value = false; }) .catch(err => { tableLoading.value = false; }); }; // éä»¶ï¼æ¥è¯¢ const fetchRuleFiles = async (rulesRegulationsManagementId) => { const params = { current: filePage.current, size: filePage.size, rulesRegulationsManagementId } const res = await listRuleFiles(params) const records = res?.data?.records || [] filePage.total = res?.data?.total || records.length const mapped = records.map(item => ({ id: item.id, name: item.fileName || item.name, url: item.fileUrl || item.url, raw: item })) fileListDialogRef.value?.setList(mapped) } // æå¼éä»¶å¼¹çª const openFileDialog = async (row) => { currentFileRuleId.value = row.id fileDialogVisible.value = true await fetchRuleFiles(row.id) } // å·æ°éä»¶å表 const refreshFileList = async () => { if (!currentFileRuleId.value) return await fetchRuleFiles(currentFileRuleId.value) } // ä¸ä¼ éä»¶ï¼ç±åç»ä»¶è§¦åï¼ const handleAttachmentUpload = async (filePayload) => { if (!currentFileRuleId.value) return const payload = { name: filePayload?.fileName || filePayload?.name, url: filePayload?.fileUrl || filePayload?.url, rulesRegulationsManagementId: currentFileRuleId.value } await addRuleFile(payload) ElMessage.success('æä»¶ä¸ä¼ æå') await refreshFileList() } // å é¤éä»¶ const handleAttachmentDelete = async (row) => { if (!row?.id) return false try { await ElMessageBox.confirm('确认å é¤è¯¥éä»¶ï¼', 'æç¤º', { type: 'warning' }) } catch { return false } await delRuleFile([row.id]) ElMessage.success('å 餿å') await refreshFileList() } // è·åè§ç« å¶åº¦åè¡¨æ°æ® const getRegulationList = async () => { tableLoading.value = true listRuleManagement(page,regulationSearchForm) .then(res => { regulations.value = res.data.records // è¿æ»¤æå·²åºå¼çå¶åº¦ // regulations.value = res.data.records.filter(item => item.status !== 'repealed') page.value.total = res.data.total; tableLoading.value = false; }).catch(err => { tableLoading.value = false; }) } onMounted(() => { // åå§å getRegulationList() }) onMounted(() => { // åå§å getRegulationList(); }); </script> <style scoped> .app-container { padding: 20px; } .app-container { padding: 20px; } .card-header { display: flex; justify-content: space-between; align-items: center; } .card-header { display: flex; justify-content: space-between; align-items: center; } .tab-content { padding: 20px 0; } .tab-content { padding: 20px 0; } .mb-20 { margin-bottom: 20px; } .mb-20 { margin-bottom: 20px; } .mt-20 { margin-top: 20px; } .mt-20 { margin-top: 20px; } .ml-10 { margin-left: 10px; } .ml-10 { margin-left: 10px; } .regulation-content { background-color: #f5f5f5; padding: 15px; border-radius: 4px; line-height: 1.6; white-space: pre-wrap; height: 200px; } .regulation-content { background-color: #f5f5f5; padding: 15px; border-radius: 4px; line-height: 1.6; white-space: pre-wrap; height: 200px; } .dialog-footer { display: flex; justify-content: flex-end; gap: 10px; } .dialog-footer { display: flex; justify-content: flex-end; gap: 10px; } </style> src/views/inventoryManagement/receiptManagement/components/formDia.vue
ÎļþÒÑɾ³ý src/views/inventoryManagement/receiptManagement/components/formDiaProduct.vue
ÎļþÒÑɾ³ý src/views/inventoryManagement/receiptManagement/index.vue
@@ -1,300 +1,81 @@ <template> <div class="app-container"> <el-tabs v-model="activeTab" @tab-change="handleTabChange"> <el-tab-pane label="æåå ¥åº" name="production"> <div class="search_form"> <div> <span class="search_title ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery"/> <span class="search_title ml10">产å大类ï¼</span> <el-input v-model="searchForm.productCategory" style="width: 240px" placeholder="请è¾å ¥" clearable/> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢ </el-button> </div> <div> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤ </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 => row.id" show-summary style="width: 100%" :summary-method="summarizeMainTable" 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="createTime" show-overflow-tooltip/> <el-table-column label="éå®ååå·" prop="salesContractNo" width="180" 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="unit" width="70" show-overflow-tooltip/> <el-table-column label="å ¥åºæ°é" prop="inboundNum" width="100" show-overflow-tooltip/> <el-table-column label="åä»·(å )" prop="unitPrice" width="150"></el-table-column> <el-table-column label="æ»ä»·(å )" prop="totalPrice" width="150"></el-table-column> <!-- <el-table-column fixed="right" label="æä½" min-width="60" align="center"> <template #default="scope"> <el-button link type="primary" size="small" @click="openForm('edit', scope.row, 'production');">ç¼è¾</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"/> </div> </el-tab-pane> <el-tab-pane label="åæå ¥åº" name="purchase"> <div class="search_form"> <div> <span class="search_title ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery"/> <span class="search_title ml10">产å大类ï¼</span> <el-input v-model="searchForm.productCategory" style="width: 240px" placeholder="请è¾å ¥" clearable/> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢ </el-button> </div> <div> <el-button type="primary" @click="openForm('add', 'purchase')">æ°å¢å ¥åº </el-button> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤ </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 => row.id" show-summary style="width: 100%" :summary-method="summarizeMainTable" 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="createTime" width="100" show-overflow-tooltip/> <el-table-column label="éè´ååå·" prop="purchaseContractNumber" width="180" show-overflow-tooltip/> <el-table-column label="ä¾åºååç§°" prop="supplierName" width="240" 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="unit" width="70" show-overflow-tooltip/> <el-table-column label="å ¥åºæ°é" prop="inboundNum" width="100" show-overflow-tooltip/> <el-table-column label="å«ç¨åä»·(å )" prop="taxInclusiveUnitPrice" width="150"></el-table-column> <el-table-column label="å«ç¨æ»ä»·(å )" prop="taxInclusiveTotalPrice" width="150"></el-table-column> <el-table-column label="å ¥åºäºº" prop="createBy" width="80" show-overflow-tooltip/> <el-table-column fixed="right" label="æä½" min-width="60" align="center"> <template #default="scope"> <el-button link :disabled="scope.row.type == 1" type="primary" size="small" @click="openForm('edit', scope.row, 'purchase');">ç¼è¾ </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"/> </div> </el-tab-pane> <el-tab-pane label="çäº§å ¥åº" name="product"> <div class="search_form"> <div> <span class="search_title ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery"/> <span class="search_title ml10">产å大类ï¼</span> <el-input v-model="searchForm.productCategory" style="width: 240px" placeholder="请è¾å ¥" clearable/> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢ </el-button> </div> <div> <el-button type="primary" @click="openForm('add', 'purchase')">æ°å¢å ¥åº </el-button> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤ </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 => row.id" show-summary style="width: 100%" :summary-method="summarizeMainTable" 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="createTime" width="100" 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="unit" width="220" show-overflow-tooltip/> <el-table-column label="å ¥åºæ°é" prop="inboundNum" width="220" show-overflow-tooltip/> <el-table-column label="å ¥åºäºº" prop="createBy" width="220" show-overflow-tooltip/> </el-table> <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="pageProductChange"/> </div> </el-tab-pane> </el-tabs> <form-dia ref="formDia" @close="handleQuery" @success="handleQuery"></form-dia> <form-dia-product ref="formDiaProduct" @close="handleQuery" @success="handleQuery"></form-dia-product> <div class="search_form"> <div> <span class="search_title ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery"/> <span class="search_title ml10">产å大类ï¼</span> <el-input v-model="searchForm.productName" style="width: 240px" placeholder="请è¾å ¥" clearable/> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢ </el-button> </div> <div> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤ </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 => row.id" show-summary style="width: 100%" :summary-method="summarizeMainTable" 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="inboundBatches" width="280" show-overflow-tooltip/> <el-table-column label="å ¥åºæ¶é´" prop="createTime" 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="stockInNum" show-overflow-tooltip/> <el-table-column label="å ¥åºäºº" prop="createBy" show-overflow-tooltip/> </el-table> <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="pageProductChange"/> </div> </div> </template> @@ -309,29 +90,16 @@ nextTick, } from "vue"; import {ElMessageBox} from "element-plus"; import useUserStore from "@/store/modules/user"; import dayjs from "dayjs"; import { getStockInPage, getStockInPageByProduction, getStockInPageByProductProduction, delStockIn, } from "@/api/inventoryManagement/stockIn.js"; import FormDia from "./components/formDia.vue"; import FormDiaProduct from "./components/formDiaProduct.vue"; // è·åå½åæ¥æ function getCurrentDate() { return dayjs().format("YYYY-MM-DD"); } getStockInRecordListPage, batchDeleteStockInRecords, } from "@/api/inventoryManagement/stockInRecord.js"; const {proxy} = getCurrentInstance(); const tableData = ref([]); const selectedRows = ref([]); const tableLoading = ref(false); const formDia = ref(); const formDiaProduct = ref(); const activeTab = ref("production"); // å½åæ¿æ´»ç tab const page = reactive({ @@ -342,9 +110,7 @@ const data = reactive({ searchForm: { supplierName: "", customerName: "", productCategory: "", productName: "", timeStr: "", }, }); @@ -365,89 +131,18 @@ page.size = obj.limit; getList(); }; const getList = () => { tableLoading.value = true; const params = {...page}; // æ ¹æ®ä¸åç tab ç±»åä¼ éä¸åçæ¥è¯¢åæ° if (activeTab.value === "production") { params.customerName = searchForm.value.customerName; params.timeStr = searchForm.value.timeStr; } else { params.supplierName = searchForm.value.supplierName; params.timeStr = searchForm.value.timeStr; } params.productCategory = searchForm.value.productCategory; if (activeTab.value === "product") { getStockInPageByProductProduction(params) .then(res => { tableLoading.value = false; tableData.value = res.data.records; }); }else { // æ ¹æ®ä¸åç tab ç±»åè°ç¨ä¸åçæ¥å£ const apiCall = activeTab.value === "production" ? getStockInPageByProduction(params) : getStockInPage(params); apiCall .then(res => { tableLoading.value = false; tableData.value = res.data.records; // åç«¯è®¡ç®æ»ä»·ï¼æ»ä»· = unitPrice * inboundNum tableData.value = tableData.value.map(item => { // 使ç¨å ¥åºæ°éè®¡ç®æ»ä»· const inboundNum = Number(item.inboundNum) || 0; const unitPrice = Number(item.unitPrice) || 0; const taxInclusiveUnitPrice = Number(item.taxInclusiveUnitPrice) || 0; // æ ¹æ®æ ç¾é¡µç±»å计ç®ä¸åçæ»ä»· if (activeTab.value === "production") { // æååºåï¼æ»ä»· = unitPrice * å ¥åºæ°é item.totalPrice = (unitPrice * inboundNum).toFixed(2); } else { // åæåææåºåï¼å«ç¨æ»ä»· = taxInclusiveUnitPrice * å ¥åºæ°é item.taxInclusiveTotalPrice = ( taxInclusiveUnitPrice * inboundNum ).toFixed(2); } return item; }); total.value = res.data.total; }) .catch(() => { tableLoading.value = false; }); } }; // 忢 tab const handleTabChange = tabName => { page.current = 1; // 忢 tab æ¶æ¸ 空æç´¢æ¡ä»¶ searchForm.value.supplierName = ""; searchForm.value.customerName = ""; searchForm.value.timeStr = ""; searchForm.value.productCategory = ""; getList(); }; // æå¼å¼¹æ¡ const openForm = async (type, row, tabType) => { const currentTab = tabType || activeTab.value; await nextTick(() => { if (currentTab === "production") { formDiaProduct.value?.openDialog(type, row); } else { formDia.value?.openDialog(type, row); } }); params.timeStr = searchForm.value.timeStr; params.productName = searchForm.value.productName; getStockInRecordListPage(params) .then(res => { tableData.value = res.data.records; }).finally(() => { tableLoading.value = false; }) }; // è¡¨æ ¼éæ©æ°æ® @@ -500,20 +195,7 @@ type: "warning", }) .then(() => { // æ ¹æ®å½å tab ç±»åéæ©ä¸åçå 餿¥å£åtypeåæ° let deleteApi, deleteParams; if (activeTab.value === "production") { // æåå é¤ï¼typeä¼ 2 deleteApi = delStockIn; deleteParams = {ids, type: 2}; } else { // åæå é¤ï¼typeä¼ 1 deleteApi = delStockIn; deleteParams = {ids, type: 1}; } deleteApi(deleteParams) batchDeleteStockInRecords(ids) .then(() => { proxy.$modal.msgSuccess("å 餿å"); getList(); src/views/inventoryManagement/stockManagement/New.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,163 @@ <template> <div> <el-dialog v-model="isShow" title="æ°å¢åºå" width="800" @close="closeModal" > <el-form label-width="140px" :model="formState" label-position="top" ref="formRef"> <el-form-item label="产ååç§°" prop="productModelId" :rules="[ { required: true, message: 'è¯·éæ©äº§å', trigger: 'change', } ]" > <el-button type="primary" @click="showProductSelectDialog = true"> {{ formState.productName ? formState.productName : 'éæ©äº§å' }} </el-button> </el-form-item> <el-form-item label="è§æ ¼" prop="productModelName" > <el-input v-model="formState.productModelName" disabled /> </el-form-item> <el-form-item label="åä½" prop="unit" > <el-input v-model="formState.unit" disabled /> </el-form-item> <el-form-item label="æ°é" prop="qualitity" > <el-input-number v-model="formState.qualitity" :step="1" :min="0" style="width: 100%" /> </el-form-item> <el-form-item label="夿³¨" prop="remark"> <el-input v-model="formState.remark" type="textarea" /> </el-form-item> </el-form> <!-- 产åéæ©å¼¹çª --> <ProductSelectDialog v-model="showProductSelectDialog" @confirm="handleProductSelect" single /> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="handleSubmit">确认</el-button> <el-button @click="closeModal">åæ¶</el-button> </div> </template> </el-dialog> </div> </template> <script setup> import {ref, computed, getCurrentInstance} from "vue"; import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue"; import {createStockInventory} from "@/api/inventoryManagement/stockInventory.js"; const props = defineProps({ visible: { type: Boolean, required: true, }, }); const emit = defineEmits(['update:visible', 'completed']); // ååºå¼æ°æ®ï¼æ¿ä»£é项å¼ç dataï¼ const formState = ref({ productId: undefined, productModelId: undefined, productName: "", productModelName: "", unit: "", qualitity: 0, remark: '', }); const isShow = computed({ get() { return props.visible; }, set(val) { emit('update:visible', val); }, }); const showProductSelectDialog = ref(false); let { proxy } = getCurrentInstance() const closeModal = () => { // éç½®è¡¨åæ°æ® formState.value = { productId: undefined, productModelId: undefined, productName: "", productModelName: "", description: '', }; isShow.value = false; }; // 产åéæ©å¤ç const handleProductSelect = async (products) => { if (products && products.length > 0) { const product = products[0]; console.log(product) formState.value.productId = product.productId; formState.value.productName = product.productName; formState.value.productModelName = product.model; formState.value.productModelId = product.id; formState.value.unit = product.unit; showProductSelectDialog.value = false; // 触å表åéªè¯æ´æ° proxy.$refs["formRef"]?.validateField('productModelId'); } }; const handleSubmit = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { // éªè¯æ¯å¦éæ©äºäº§ååè§æ ¼ if (!formState.value.productModelId) { proxy.$modal.msgError("è¯·éæ©äº§å"); return; } if (!formState.value.productModelId) { proxy.$modal.msgError("è¯·éæ©è§æ ¼"); return; } createStockInventory(formState.value).then(res => { // å ³éæ¨¡ææ¡ isShow.value = false; // åç¥ç¶ç»ä»¶å·²å®æ emit('completed'); proxy.$modal.msgSuccess("æäº¤æå"); }) } }) }; defineExpose({ closeModal, handleSubmit, isShow, }); </script> src/views/inventoryManagement/stockManagement/Subtract.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,180 @@ <template> <div> <el-dialog v-model="isShow" title="é¢ç¨" width="800" @close="closeModal" > <el-form label-width="140px" :model="formState" label-position="top" ref="formRef"> <el-form-item label="产ååç§°" prop="productModelId" :rules="[ { required: true, message: 'è¯·éæ©äº§å', trigger: 'change', } ]" > <el-button type="primary" @click="showProductSelectDialog = true" disabled> {{ formState.productName ? formState.productName : 'éæ©äº§å' }} </el-button> </el-form-item> <el-form-item label="è§æ ¼" prop="productModelName" > <el-input v-model="formState.model" disabled /> </el-form-item> <el-form-item label="åä½" prop="unit" > <el-input v-model="formState.unit" disabled /> </el-form-item> <el-form-item label="æ°é" prop="qualitity" > <el-input-number v-model="formState.qualitity" :step="1" :min="0" style="width: 100%" /> </el-form-item> <el-form-item label="夿³¨" prop="remark"> <el-input v-model="formState.remark" type="textarea" /> </el-form-item> </el-form> <!-- 产åéæ©å¼¹çª --> <ProductSelectDialog v-model="showProductSelectDialog" @confirm="handleProductSelect" single /> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="handleSubmit">确认</el-button> <el-button @click="closeModal">åæ¶</el-button> </div> </template> </el-dialog> </div> </template> <script setup> import {ref, computed, getCurrentInstance} from "vue"; import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue"; import {subtractStockInventory} from "@/api/inventoryManagement/stockInventory.js"; const props = defineProps({ visible: { type: Boolean, required: true, }, record: { type: Object, default: () => {}, } }); const emit = defineEmits(['update:visible', 'completed']); onMounted(() => { initFormData() }) const initFormData = () => { if (props.record) { formState.value = { ...formState.value, ...props.record, } } } // ååºå¼æ°æ®ï¼æ¿ä»£é项å¼ç dataï¼ const formState = ref({ productId: undefined, productModelId: undefined, productName: "", model: "", unit: "", qualitity: 0, remark: '', }); const isShow = computed({ get() { return props.visible; }, set(val) { emit('update:visible', val); }, }); const showProductSelectDialog = ref(false); let { proxy } = getCurrentInstance() const closeModal = () => { // éç½®è¡¨åæ°æ® formState.value = { productId: undefined, productModelId: undefined, productName: "", productModelName: "", description: '', }; isShow.value = false; }; // 产åéæ©å¤ç const handleProductSelect = async (products) => { if (products && products.length > 0) { const product = products[0]; console.log(product) formState.value.productId = product.productId; formState.value.productName = product.productName; formState.value.productModelName = product.model; formState.value.productModelId = product.id; formState.value.unit = product.unit; showProductSelectDialog.value = false; // 触å表åéªè¯æ´æ° proxy.$refs["formRef"]?.validateField('productModelId'); } }; const handleSubmit = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { // éªè¯æ¯å¦éæ©äºäº§ååè§æ ¼ if (!formState.value.productModelId) { proxy.$modal.msgError("è¯·éæ©äº§å"); return; } if (!formState.value.productModelId) { proxy.$modal.msgError("è¯·éæ©è§æ ¼"); return; } subtractStockInventory(formState.value).then(res => { // å ³éæ¨¡ææ¡ isShow.value = false; // åç¥ç¶ç»ä»¶å·²å®æ emit('completed'); proxy.$modal.msgSuccess("æäº¤æå"); }) } }) }; defineExpose({ closeModal, handleSubmit, isShow, }); </script> src/views/inventoryManagement/stockManagement/index.vue
@@ -2,150 +2,48 @@ <div class="app-container"> <div class="search_form"> <div> <span class="search_title">ä¾åºååç§°ï¼</span> <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <span class="search_title ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <span class="search_title ml10">产å大类ï¼</span> <el-input v-model="searchForm.productName" style="width: 240px" placeholder="请è¾å ¥" clearable/> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <!-- <el-button type="primary" @click="openForm('add')">æ°å¢</el-button> --> <el-button type="primary" @click="isShowNewModal = true">æ°å¢åºå</el-button> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</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 => row.id" show-summary style="width: 100%" :row-class-name="tableRowClassName" :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)"> :expand-row-keys="expandedRowKeys" :row-key="row => row.id" 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="createTime" width="100" show-overflow-tooltip /> <el-table-column label="ä¾åºååç§°" prop="supplierName" width="240" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productCategory" width="100" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" width="200" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" width="80" show-overflow-tooltip /> <el-table-column label="åºåæ°é" prop="inboundNum0" width="100" show-overflow-tooltip /> <el-table-column label="åºåé¢è¦æ°é" prop="warnNum" width="130" 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="100" show-overflow-tooltip /> <el-table-column label="ä¸å«ç¨æ»ä»·" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºäºº" prop="createBy" width="80" show-overflow-tooltip /> <el-table-column label="å ¥åºæ¥æ" prop="createTime" 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="qualitity" show-overflow-tooltip /> <el-table-column label="åºåé¢è¦æ°é" prop="warnNum" show-overflow-tooltip /> <el-table-column label="æè¿æ´æ°æ¶é´" prop="updateTime" show-overflow-tooltip /> <el-table-column fixed="right" label="æä½" min-width="60" align="center"> <template #default="scope"> <el-button link type="primary" size="small" @click="openForm('edit', scope.row);">ç¼è¾</el-button> <el-button link type="primary" size="small" @click="showSubtractModal(scope.row)" :disabled="scope.row.qualitity > 0">é¢ç¨</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" /> </div> <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"> <el-col :span="12"> <el-form-item label="ä¾åºååç§°ï¼" prop="supplierName"> <el-input disabled v-model="form.supplierName" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="产å大类ï¼" prop="productId"> <el-select disabled v-model="form.productCategory" placeholder="è¯·éæ©" clearable filterable> <el-option v-for="item in productList" :key="item.id" :label="item.productName" :value="item.productName" /> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="è§æ ¼åå·ï¼" prop="productManageId"> <el-select disabled v-model="form.specificationModel" placeholder="请å éæ©äº§å大类" clearable filterable :disabled="!form.productCategory"> <el-option v-for="item in productModelList" :key="item.id" :label="item.model" :value="item.id" /> </el-select> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="åä½ï¼" prop="customerId"> <el-input disabled v-model="form.unit" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="åºåæ¶é´ï¼" prop="projectName"> <el-date-picker style="width: 100%" v-model="form.updateTime" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="å ¥åºæ¶é´ï¼" prop="projectName"> <el-date-picker style="width: 100%" v-model="form.createTime" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <new-stock-inventory v-if="isShowNewModal" v-model:visible="isShowNewModal" @completed="handleQuery" /> <el-col :span="12"> <el-form-item label="å«ç¨åä»·ï¼" prop="customerId"> <el-input disabled v-model="form.taxInclusiveUnitPrice" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="å«ç¨æ»ä»·ï¼" prop="customerContractNo"> <el-input disabled v-model="form.taxInclusiveTotalPrice" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="ç¨çï¼" prop="customerId"> <el-input disabled v-model="form.taxRate" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ä¸å«ç¨æ»ä»·ï¼" prop="entryDate"> <el-input disabled v-model="form.taxExclusiveTotalPrice" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="åºåºäººï¼" prop="entryPerson"> <el-select v-model="form.createUser" placeholder="è¯·éæ©" clearable> <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" /> </el-select> </el-form-item> </el-col> <!-- <el-col :span="12">--> <!-- <el-form-item label="åºåé¢è¦æ°éï¼" prop="warnNum">--> <!-- <el-input v-model="form.warnNum" placeholder="请è¾å ¥æä½åºå" clearable />--> <!-- </el-form-item>--> <!-- </el-col>--> </el-row> </el-form> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="submitForm">确认</el-button> <el-button @click="closeDia">åæ¶</el-button> </div> </template> </el-dialog> <subtract-stock-inventory v-if="isShowSubtractModal" v-model:visible="isShowSubtractModal" :record="record" @completed="handleQuery" /> </div> </template> @@ -153,84 +51,30 @@ import pagination from '@/components/PIMTable/Pagination.vue' import { ref, reactive, toRefs, onMounted, getCurrentInstance } from 'vue' import { ElMessageBox } from "element-plus"; import useUserStore from '@/store/modules/user' import { userListNoPageByTenantId } from "@/api/system/user.js"; import { productTreeList,modelList } from "@/api/basicData/product.js" import { getCurrentDate } from "@/utils/index.js"; import { getStockManagePage, delStockManage, } from "@/api/inventoryManagement/stockManage.js"; import { updateManagement,updateStockIn } from "@/api/inventoryManagement/stockIn.js"; import { getStockInventoryListPage } from "@/api/inventoryManagement/stockInventory.js"; const NewStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/New.vue")); const SubtractStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/Subtract.vue")); const userStore = useUserStore() const { proxy } = getCurrentInstance() const tableData = ref([]) const productData = ref([]) const selectedRows = ref([]) const userList = ref([]) const productList = ref([]) const productModelList = ref([]) // const customerOption = ref([]) const record = ref({}) const tableLoading = ref(false) const page = reactive({ current: 1, size: 100, }) const total = ref(0) const fileList = ref([]) const loading = ref(false); // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref('') const dialogFormVisible = ref(false) // æ¯å¦æ¾ç¤ºæ°å¢å¼¹æ¡ const isShowNewModal = ref(false) // æ¯å¦æ¾ç¤ºé¢ç¨å¼¹æ¡ const isShowSubtractModal = ref(false) const data = reactive({ searchForm: { supplierName: '', timeStr: '', }, form: { supplierId: null, supplierName: '', productId: null, productName: '', userId: userStore.userId, nickName: '', productModelId: null, model: '', unit: '', productrecordId: null, taxInclusiveUnitPrice: '', taxInclusiveTotalPrice: '', taxRate: '', taxExclusiveTotalPrice: '', inboundTime: '', inboundBatch: '', stockQuantity: '', boundTime: '', warnNum: '', // æ°å¢æä½åºååæ®µ salesLedgerProductId: null, }, rules: { supplierName: [{ required: true, message: '请è¾å ¥ä¾åºååç§°', trigger: 'blur' }], productCategory: [{ required: true, message: 'è¯·éæ©äº§å大类', trigger: 'change' }], specificationModel: [{ required: true, message: '请è¾å ¥è§æ ¼åå·', trigger: 'blur' }], unit: [{ required: true, message: '请è¾å ¥åä½', trigger: 'blur' }], stockQuantity: [{ required: true, message: '请è¾å ¥åºåºæ°é', trigger: 'blur' }], taxInclusiveUnitPrice: [{ required: true, message: '请è¾å ¥å«ç¨åä»·', trigger: 'blur' }], taxInclusiveTotalPrice: [{ required: true, message: '请è¾å ¥å«ç¨æ»ä»·', trigger: 'blur' }], taxRate: [{ required: true, message: '请è¾å ¥ç¨ç', trigger: 'blur' }], taxExclusiveTotalPrice: [{ required: true, message: '请è¾å ¥ä¸å«ç¨æ»ä»·', trigger: 'blur' }], boundTime: [{ required: true, message: 'è¯·éæ©åºåæ¶é´', trigger: 'change' }], inboundTime: [{ required: true, message: 'è¯·éæ©å ¥åºæ¶é´', trigger: 'change' }], inboundPerson: [{ required: true, message: 'è¯·éæ©åºåºäºº', trigger: 'change' }], warnNum: [{ required: true, message: '请è¾å ¥æä½åºå', trigger: 'blur' }], } }) const { searchForm, form, rules } = toRefs(data) const { searchForm } = toRefs(data) // æ¥è¯¢å表 /** æç´¢æé®æä½ */ @@ -245,7 +89,7 @@ } const getList = () => { tableLoading.value = true getStockManagePage({ ...searchForm.value, ...page }).then(res => { getStockInventoryListPage({ ...searchForm.value, ...page }).then(res => { tableLoading.value = false tableData.value = res.data.records total.value = res.data.total @@ -256,19 +100,19 @@ }) } // ç¹å»é¢ç¨ const showSubtractModal = (row) => { record.value = row isShowSubtractModal.value = true } // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { // è¿æ»¤æåæ°æ® selectedRows.value = selection.filter(item => item.id); console.log('selection', selectedRows.value) } const expandedRowKeys = ref([]) // 主表åè®¡æ¹æ³ const summarizeMainTable = (param) => { return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']); }; // è¡¨æ ¼è¡ç±»å const tableRowClassName = ({ row }) => { @@ -279,74 +123,6 @@ } return stock < warn ? 'row-low-stock' : ''; }; // æå¼å¼¹æ¡ const openForm = async (type, row) => { operationType.value = type form.value = {} productData.value = [] let userLists = await userListNoPageByTenantId() userList.value = userLists.data if (type === 'edit') { form.value = { ...row } productTreeList().then(res =>{ productList.value = res productList.value.forEach(i =>{ if (i.label === row.productCategory) { modelList({ id: i.id }).then((res) => { productModelList.value = res; }); } }) }) } form.value.entryDate = getCurrentDate() // 设置é»è®¤å½å ¥æ¥æä¸ºå½åæ¥æ dialogFormVisible.value = true } // æäº¤è¡¨å const submitForm = () => { console.log(form.value) proxy.$refs["formRef"].validate(valid => { if (valid) { updateManagement(form.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeDia() getList() // æäº¤åæ£æ¥åºåå¹¶å°è¯å建请è´å // checkStockAndCreatePurchase(); }) } }) } // æ£æ¥åºåå¹¶å建请è´å // const checkStockAndCreatePurchase = async () => { // const stockList = tableData.value; // // handList() // for (const item of stockList) { // if (item.inboundNum0 < item.warnNum) { // try { // const stockInData = { // id: item.id, // quantityStock: item.warnNum + item.totalInboundNum,// ä½¿ç¨æ°æ ¼å¼å彿° // }; // loading.value = true // await updateStockIn(stockInData) // proxy.$modal.msgSuccess(`产å ${item.productCategory} ä¿®æ¹å ¥åºæå`) // loading.value = false // } catch (error) { // proxy.$modal.msgError(`产å ${item.productCategory} çæè¯·è´å失败ï¼è¯·æå¨å¤ç`); // // } // } // } // }; // å ³éå¼¹æ¡ const closeDia = () => { proxy.resetForm("formRef") dialogFormVisible.value = false } // å¯¼åº const handleOut = () => { @@ -363,47 +139,9 @@ proxy.$modal.msg("已忶") }) } // å é¤ const handleDelete = () => { let ids = [] if (selectedRows.value.length > 0) { // æ£æ¥æ¯å¦æä»äººç»´æ¤çæ°æ® const unauthorizedData = selectedRows.value.filter(item => item.createUser !== userStore.id); if (unauthorizedData.length > 0) { proxy.$modal.msgWarning("ä¸å¯å é¤ä»äººç»´æ¤çæ°æ®"); return; } ids = selectedRows.value.map(item => item.id); } else { proxy.$modal.msgWarning('è¯·éæ©æ°æ®') return } ElMessageBox.confirm( 'éä¸çå 容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { delStockManage({ids:ids}).then(res => { proxy.$modal.msgSuccess("å 餿å") getList() }) }).catch(() => { proxy.$modal.msg("已忶") }) } onMounted(() => { getList() // checkStockAndCreatePurchase(); // æ¯å°æ¶æ£æ¥ä¸æ¬¡åºå // const intervalId = setInterval(checkStockAndCreatePurchase, 60 * 60 * 1000); // onUnmounted(() => { // // ç»ä»¶å¸è½½æ¶æ¸ é¤å®æ¶å¨ // clearInterval(intervalId); // }); }) </script> src/views/personnelManagement/analytics/index.vue
@@ -17,12 +17,12 @@ <span v-else>{{ item.value }}{{ item.unit }}</span> </div> <div class="card-label">{{ item.label }}</div> <div class="card-trend" :class="item.trend > 0 ? 'positive' : 'negative'" v-if="item.showTrend !== false"> <el-icon> <component :is="item.trend > 0 ? 'ArrowUp' : 'ArrowDown'" /> </el-icon> {{ Math.abs(item.trend) }}% </div> <!-- <div class="card-trend" :class="item.trend > 0 ? 'positive' : 'negative'" v-if="item.showTrend !== false">--> <!-- <el-icon>--> <!-- <component :is="item.trend > 0 ? 'ArrowUp' : 'ArrowDown'" />--> <!-- </el-icon>--> <!-- {{ Math.abs(item.trend) }}%--> <!-- </div>--> </div> </div> </el-card> src/views/procurementManagement/paymentLedger/index.vue
@@ -238,7 +238,7 @@ const getPaymenRecordtList = (supplierId) => { tableLoadingSon.value = true; paymentRecordList({supplierId: supplierId}) paymentRecordList(supplierId) .then((res) => { tableLoadingSon.value = false; tableDataSon.value = res.data; src/views/productionManagement/productionReporting/index.vue
@@ -187,11 +187,11 @@ prop: "quantity", width: 120, }, // { // label: "æ¥åºæ°é", // prop: "scrapQuantity", // width: 120, // }, { label: "æ¥åºæ°é", prop: "scrapQty", width: 120, }, { label: "åä½", prop: "unit", src/views/productionManagement/workOrder/index.vue
@@ -180,6 +180,13 @@ style="width: 300px" placeholder="请è¾å ¥æ¬æ¬¡ç产æ°é" /> </el-form-item> <el-form-item label="æ¥åºæ°é"> <el-input v-model.number="reportForm.scrapQty" type="number" min="1" style="width: 300px" placeholder="请è¾å ¥æ¥åºæ°é" /> </el-form-item> <el-form-item label="çç»ä¿¡æ¯"> <el-select v-model="reportForm.userId" style="width: 300px" @@ -427,6 +434,7 @@ reportForm.workOrderId = row.id; reportForm.reportWork = row.reportWork; reportForm.productMainId = row.productMainId; reportForm.scrapQty = row.scrapQty; // è·åå½åç»å½ç¨æ·ä¿¡æ¯ï¼è®¾ç½®ä¸ºé»è®¤éä¸ getUserProfile() .then(res => { src/views/reportAnalysis/dataDashboard/index.vue
@@ -49,7 +49,7 @@ </div> </div> <!-- å·¥åºå¨å¶åæ°éæ±ç¶å¾ --> <div style="height: 82%;margin-top: 20px"> <div style="height: 70%"> <Echarts ref="chart" :chartStyle="chartStyle" :grid="grid" @@ -1614,7 +1614,7 @@ display: flex; gap: 12px; width: 100%; height: 94px; height: 54px; justify-content: space-between; align-items: center; } @@ -1956,7 +1956,7 @@ /* ç产订åè¿åº¦è¡¨æ ¼æ ·å¼ */ .progress-table-container { height: 250px; height: 200px; overflow-y: auto; overflow-x: hidden; margin-top: 10px; src/views/salesManagement/invoiceRegistration/index.vue
@@ -555,12 +555,12 @@ const allProductData = []; results.forEach((result, index) => { const contract = selectedRows.value[index]; const contractId = contract.id; // const contractId = contract.id; if (result.productData) { result.productData.forEach(item => { allProductData.push({ ...item, id: contractId, // æç¡®è®¾ç½®ååID // id: contractId, // æç¡®è®¾ç½®ååID salesContractNo: contract.salesContractNo, // æ·»å éå®ååå· customerName: contract.customerName, // æ·»å 客æ·åç§° customerContractNo: contract.customerContractNo // æ·»å 客æ·ååå·