| multiple/assets/favicon/BTWfavicon.ico | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| multiple/assets/favicon/JFHYfavicon.ico | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| multiple/assets/logo/BTWLogo.png | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| multiple/assets/logo/JFHYLogo.png | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| multiple/config.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/api/mock/dataCheck.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/api/personnelManagement/staffSalaryMain.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/mock/dataCheck/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/personnelManagement/monthlyStatistics/components/auditDia.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/personnelManagement/monthlyStatistics/components/formDia.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/personnelManagement/monthlyStatistics/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
multiple/assets/favicon/BTWfavicon.ico
multiple/assets/favicon/JFHYfavicon.ico
multiple/assets/logo/BTWLogo.png
multiple/assets/logo/JFHYLogo.png
multiple/config.json
@@ -278,6 +278,24 @@ "logo": "logo/NYLogo.png", "favicon": "favicon/NYfavicon.ico" }, "JFHY": { "env": { "VITE_APP_TITLE": "山西éç¦æè¿åè´¸æéå ¬å¸", "VITE_BASE_API": "http://36.134.76.148:9100", "VITE_JAVA_API": "http://36.134.76.148:9099" }, "logo": "logo/JFHYLogo.png", "favicon": "favicon/JFHYfavicon.ico" }, "BTW": { "env": { "VITE_APP_TITLE": "山西æ¯ç¹ç»´ç§ææéå ¬å¸", "VITE_BASE_API": "http://36.134.76.148:9102", "VITE_JAVA_API": "http://36.134.76.148:9101" }, "logo": "logo/BTWLogo.png", "favicon": "favicon/BTWfavicon.ico" }, "logo": "/src/assets/logo/logo.png", "favicon": "/public/favicon.ico" } src/api/mock/dataCheck.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,10 @@ import request from "@/utils/request"; // æ£æµæå®æ¨¡åçåºç¡æ°æ®æ¯å¦å°±ç»ª export function dataCheck(modules) { return request({ url: "/mock/dataCheck", method: "post", data: { modules }, }); } src/api/personnelManagement/staffSalaryMain.js
@@ -48,3 +48,12 @@ data: ids, }); } // è·åå¯ç¨é¨é¨åè¡¨ï¼æ ¹æ®æä»½æ¥è¯¢ï¼æé¤å·²åæ¾å·¥èµè¡¨çé¨é¨ï¼ export function staffSalaryMainAvailableDepts(salaryMonth) { return request({ url: "/staffSalaryMain/availableDepts", method: "get", params: { salaryMonth }, }); } src/views/mock/dataCheck/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,65 @@ <template> <div class="app-container"> <el-card header="åºç¡æ°æ®æ£æµ"> <el-checkbox-group v-model="selectedModules"> <el-checkbox label="sales">é宿¨¡å</el-checkbox> <el-checkbox label="purchase">éè´æ¨¡å</el-checkbox> <el-checkbox label="quality">è´¨éæ¨¡å</el-checkbox> </el-checkbox-group> <div style="margin-top: 16px"> <el-button type="primary" @click="handleCheck" :loading="checking"> å¼å§æ£æµ </el-button> </div> </el-card> <el-card v-if="checkResult" header="æ£æµç»æ" style="margin-top: 16px"> <el-alert :title="`éè¿ ${checkResult.passedItems} / ${checkResult.totalItems} 项`" :type="checkResult.passedItems === checkResult.totalItems ? 'success' : 'warning'" :closable="false" show-icon /> <el-table :data="checkResult.items" style="margin-top: 12px" border> <el-table-column prop="module" label="模å" width="100" /> <el-table-column prop="itemName" label="æ£æµé¡¹" width="160" /> <el-table-column prop="minRequired" label="æä½è¦æ±" width="80" align="center" /> <el-table-column prop="currentCount" label="å½åæ°é" width="80" align="center" /> <el-table-column label="ç¶æ" width="80" align="center"> <template #default="{ row }"> <el-tag :type="row.passed ? 'success' : 'danger'"> {{ row.passed ? "éè¿" : "æªéè¿" }} </el-tag> </template> </el-table-column> <el-table-column prop="message" label="æç¤º" min-width="200" /> </el-table> </el-card> </div> </template> <script setup> import { ref } from "vue"; import { ElMessage } from "element-plus"; import { dataCheck } from "@/api/mock/dataCheck.js"; const selectedModules = ref(["sales", "purchase", "quality"]); const checking = ref(false); const checkResult = ref(null); const handleCheck = async () => { if (selectedModules.value.length === 0) { ElMessage.warning("请è³å°éæ©ä¸ä¸ªæ¨¡å"); return; } checking.value = true; try { const res = await dataCheck(selectedModules.value); checkResult.value = res.data; } finally { checking.value = false; } }; </script> <style scoped></style> src/views/personnelManagement/monthlyStatistics/components/auditDia.vue
@@ -86,7 +86,7 @@ <script setup> import { ref, computed, reactive, toRefs, getCurrentInstance, watch } from "vue"; import { ElMessage } from "element-plus"; import Cookies from "js-cookie"; import useUserStore from "@/store/modules/user"; import FormDialog from "@/components/Dialog/FormDialog.vue"; import { staffSalaryMainUpdate } from "@/api/personnelManagement/staffSalaryMain.js"; @@ -98,6 +98,7 @@ }); const { proxy } = getCurrentInstance(); const userStore = useUserStore(); const dialogVisible = computed({ get: () => props.modelValue, @@ -176,15 +177,21 @@ return; } const username = Cookies.get("username") || ""; const userIdRaw = Cookies.get("userId"); const auditUserId = userIdRaw ? Number(userIdRaw) : undefined; const username = userStore.name || ""; const currentUserId = Number(userStore.id); const assignedAuditUserId = Number(row?.auditUserId); // æééªè¯ï¼åªææå®çå®¡æ ¸äººæè½è¿è¡å®¡æ ¸ if (!currentUserId || currentUserId !== assignedAuditUserId) { ElMessage.warning("æ¨ä¸æ¯æå®çå®¡æ ¸äººï¼æ æ³è¿è¡å®¡æ ¸æä½"); return; } // æå»ºå®¡æ ¸æ°æ® const submitData = { id: row.id, status: Number(auditResult.value) === 2 ? 2 : 4, // 2=ä¸éè¿ 4=éè¿(å¾ åæ¾) auditUserId, auditUserId: currentUserId, auditUserName: username, }; loading.value = true; src/views/personnelManagement/monthlyStatistics/components/formDia.vue
@@ -36,6 +36,18 @@ </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="éæ©å·¥èµæä»½" prop="salaryMonth"> <el-date-picker v-model="form.salaryMonth" type="month" value-format="YYYY-MM" format="YYYY-MM" placeholder="è¯·éæ©å·¥èµæä»½" style="width: 100%" clearable /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="éæ©é¨é¨" prop="deptIds"> <el-select v-model="form.deptIds" @@ -47,20 +59,9 @@ <el-option v-for="item in deptOptions" :key="item.deptId" :label="item.deptName" :value="item.deptId" /> :value="item.deptId" :disabled="isDeptDisabled(item.deptId)" /> </el-select> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="éæ©å·¥èµæä»½" prop="salaryMonth"> <el-date-picker v-model="form.salaryMonth" type="month" value-format="YYYY-MM" format="YYYY-MM" placeholder="è¯·éæ©å·¥èµæä»½" style="width: 100%" clearable /> </el-form-item> </el-col> <el-col :span="6"> @@ -344,18 +345,20 @@ computed, getCurrentInstance, nextTick, watch, } from "vue"; import { ArrowUp } from "@element-plus/icons-vue"; import FormDialog from "@/components/Dialog/FormDialog.vue"; import { listDept } from "@/api/system/dept.js"; import { staffOnJobList } from "@/api/personnelManagement/monthlyStatistics.js"; import { bankList } from "@/api/personnelManagement/bank.js"; import { staffSalaryMainAdd, staffSalaryMainUpdate, staffSalaryMainCalculateSalary, staffSalaryMainCalculateByEmployeeId, } from "@/api/personnelManagement/staffSalaryMain.js"; import { bankList } from "@/api/personnelManagement/bank.js"; import { staffSalaryMainAdd, staffSalaryMainUpdate, staffSalaryMainCalculateSalary, staffSalaryMainCalculateByEmployeeId, staffSalaryMainAvailableDepts, } from "@/api/personnelManagement/staffSalaryMain.js"; import { userListNoPageByTenantId } from "@/api/system/user.js"; const emit = defineEmits(["update:modelValue", "close"]); @@ -378,6 +381,7 @@ const addPersonVisible = ref(false); const taxDialogVisible = ref(false); const deptOptions = ref([]); const availableDeptIds = ref(new Set()); const deptStaffTree = ref([]); const employeeList = ref([]); const selectedEmployees = ref([]); @@ -573,11 +577,32 @@ return list; } const loadDeptOptions = () => { // å è½½ææé¨é¨ const loadAllDeptOptions = () => { listDept().then(res => { const tree = res.data ?? []; deptOptions.value = flattenDept(tree); }); }; // å è½½å¯ç¨é¨é¨å表ï¼ç¨äºå¤æé¨é¨æ¯å¦å¯éï¼ const loadAvailableDepts = (salaryMonth) => { if (!salaryMonth) { availableDeptIds.value = new Set(); return; } staffSalaryMainAvailableDepts(salaryMonth).then(res => { const availableDepts = Array.isArray(res.data) ? res.data : []; availableDeptIds.value = new Set(availableDepts.map(d => d.deptId)); }); }; // 夿é¨é¨æ¯å¦ç¦ç¨ const isDeptDisabled = (deptId) => { // å¦ææ²¡æéæ©æä»½ï¼ææé¨é¨é½å¯é if (!form.value.salaryMonth) return false; // 妿已鿩æä»½ï¼åªæå¨å¯ç¨é¨é¨å表ä¸çé¨é¨æå¯é return !availableDeptIds.value.has(deptId); }; // æå»º é¨é¨-äººå æ ï¼ç¨äºæ°å¢äººåå¼¹çªï¼ @@ -621,9 +646,9 @@ const openDialog = (type, row) => { nextTick(() => { resetRecalcState(); loadDeptOptions(); loadBankOptions(); loadUserList(); loadAllDeptOptions(); employeeList.value = []; Object.assign(form.value, { id: undefined, @@ -655,8 +680,21 @@ employeeList.value = row.staffSalaryDetailList.map(e => normalizeEmployeeRow(e)); } } // ç¼è¾ç¶æä¸ææä»½æ¶ï¼å è½½å¯ç¨é¨é¨å表 if (type === "edit" && form.value.salaryMonth) { loadAvailableDepts(form.value.salaryMonth); } }); }; // çå¬å·¥èµæä»½ååï¼æ¸ 空é¨é¨éæ©å¹¶å è½½å¯ç¨é¨é¨å表 watch(() => form.value.salaryMonth, (newMonth, oldMonth) => { // 忢æä»½æ¶æ¸ ç©ºå·²éæ©çé¨é¨ if (newMonth !== oldMonth) { form.value.deptIds = []; } loadAvailableDepts(newMonth); }); const openAddPerson = () => { loadDeptStaffTree(); @@ -895,4 +933,4 @@ font-weight: bold; font-size: 18px; } </style> </style> src/views/personnelManagement/monthlyStatistics/index.vue
@@ -107,7 +107,7 @@ nextTick, } from "vue"; import { ElMessageBox } from "element-plus"; import Cookies from "js-cookie"; import useUserStore from "@/store/modules/user"; import FormDia from "./components/formDia.vue"; import BankSettingDia from "./components/bankSettingDia.vue"; import AuditDia from "./components/auditDia.vue"; @@ -167,7 +167,12 @@ { name: "å®¡æ ¸", type: "text", disabled: (row) => Number(row?.status) !== 3, disabled: (row) => { const currentUserId = Number(userStore.id); const auditUserId = Number(row?.auditUserId); // ç¶æä¸æ¯å¾ å®¡æ ¸ æ å½åç¨æ·ä¸æ¯æå®çå®¡æ ¸äººï¼åç¦ç¨å®¡æ ¸æé® return Number(row?.status) !== 3 || !currentUserId || currentUserId !== auditUserId; }, clickFun: (row) => openAudit(row), }, { @@ -193,6 +198,7 @@ const operationType = ref("add"); const currentRow = ref({}); const { proxy } = getCurrentInstance(); const userStore = useUserStore(); const bankSetting = ref({}); const bankDialogVisible = ref(false); const bankDiaRef = ref(null); @@ -378,8 +384,8 @@ const handleExport = () => { proxy.download( "/compensationPerformance/export", { ...searchForm.value, current: page.current, size: page.size }, "/staffSalaryMain/export", { ...searchForm.value }, "å·¥èµè¡¨.xlsx" ); }; @@ -404,4 +410,4 @@ .table_list { margin-top: 20px; } </style> </style>