| src/api/lavorissce/issue.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/lavorissue/issue/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/lavorissue/ledger/EditModal.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/lavorissue/ledger/Form.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/lavorissue/ledger/Modal.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/lavorissue/ledger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/personnelManagement/onboarding/components/formDia.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/lavorissce/issue.js
@@ -81,3 +81,11 @@ data: query }) } // å é¤å³ä¿ç¨å export function getDeptPositionByDeptIdLabor(query) { return request({ url: '/deptPosition/getDeptPositionByDeptIdLabor', method: 'get', params: query }) } src/views/lavorissue/issue/index.vue
@@ -35,9 +35,10 @@ </el-tree> </div> <div class="right"> <div v-if="currentPosition" class="position-config"> <div v-if="currentDept || currentPosition" class="position-config"> <div class="title"> <span>å²ä½é ç½®ï¼{{ currentPosition.label }}</span> <span v-if="currentPosition">å²ä½é ç½®ï¼{{ currentPosition.label }}</span> <span v-else-if="currentDept">é¨é¨é ç½®ï¼{{ currentDept.label }}</span> </div> <div class="q-toolbar"> <el-button size="small" type="primary" @click="openAddItemDialog">æ°å¢ç¨å</el-button> @@ -58,7 +59,7 @@ </el-table-column> </el-table> </div> <div v-else class="empty">è¯·éæ©å·¦ä¾§å²ä½è¿è¡é ç½®</div> <div v-else class="empty">è¯·éæ©å·¦ä¾§é¨é¨æå²ä½è¿è¡é ç½®</div> </div> </div> <!-- æ°å¢é¨é¨/å²ä½å¼¹çª --> @@ -224,7 +225,7 @@ const addItemForm = reactive({ id: undefined, dictId: undefined, quantity: 0, quarter: 1 }) function openAddItemDialog() { if (!currentPosition.value) return if (!currentDept.value && !currentPosition.value) return addItemDialogTitle.value = 'æ°å¢ç¨å' addItemForm.id = undefined addItemForm.dictId = undefined @@ -234,7 +235,7 @@ } function openEditItemDialog(row) { if (!currentPosition.value || !row) return if ((!currentDept.value && !currentPosition.value) || !row) return addItemDialogTitle.value = 'ç¼è¾ç¨å' addItemForm.id = row.id addItemForm.dictId = row.dictId @@ -248,12 +249,13 @@ } async function onConfirmAddItem() { if (!currentPosition.value) return if (!currentDept.value && !currentPosition.value) return addItemSaving.value = true try { const qNum = Number(addItemForm.quarter) || 1 const deptPositionId = currentPosition.value.id ?? currentPosition.value.raw?.id ?? currentPosition.value?.id if (addItemForm.id) { // ç¼è¾ç¨å await updateLaborConf({ id: addItemForm.id, dictId: addItemForm.dictId, @@ -261,15 +263,20 @@ quarter: qNum, }) } else { // æ°å¢ç¨å const currentId = currentPosition.value?.id ?? currentPosition.value?.raw?.id ?? currentDept.value?.id ?? currentDept.value?.raw?.id await addLaborConf({ deptPositionId, deptPositionId: currentId, dictId: addItemForm.dictId, num: Number(addItemForm.quantity) || 0, quarter: qNum, }) } const posId = currentPosition.value.raw?.id ?? currentPosition.value.id await loadLaborConf(posId) // éæ°å è½½ç¨åé ç½®å表 const currentId = currentPosition.value?.id ?? currentPosition.value?.raw?.id ?? currentDept.value?.id ?? currentDept.value?.raw?.id await loadLaborConf(currentId) addItemDialogVisible.value = false ElMessage.success('ä¿åæå') } catch (e) { @@ -280,7 +287,7 @@ } async function onDeleteItem(row) { if (!currentPosition.value || !row) return if ((!currentDept.value && !currentPosition.value) || !row) return try { await ElMessageBox.confirm('ç¡®å®å é¤è¯¥ç¨åé ç½®åï¼', 'æç¤º', { type: 'warning' }) } catch { @@ -288,8 +295,9 @@ } try { await deleteLaborConf([row.id]) const posId = currentPosition.value.raw?.id ?? currentPosition.value.id await loadLaborConf(posId) // éæ°å è½½ç¨åé ç½®å表 const currentId = currentPosition.value?.id ?? currentPosition.value?.raw?.id ?? currentDept.value?.id ?? currentDept.value?.raw?.id await loadLaborConf(currentId) ElMessage.success('å 餿å') } catch (e) { ElMessage.error((e && (e.msg || e.message)) || 'å é¤å¤±è´¥') @@ -367,11 +375,13 @@ if (node.type === 1) { currentDept.value = node currentPosition.value = null // éæ©é¨é¨æ¶ï¼å è½½é¨é¨çº§å«çç¨åé ç½® loadLaborConf(node.raw.id) } else if (node.type === 2) { const dept = findDeptById(departments, node.parentDeptId) if (dept) currentDept.value = mapDeptToTree(dept) currentPosition.value = node.raw // éæ©å²ä½æ¶ï¼æè¦æ±æ¥è¯¢ç¨åé ç½®å表 // éæ©å²ä½æ¶ï¼æ¥è¯¢ç¨åé ç½®å表 loadLaborConf(node.raw.id) } } src/views/lavorissue/ledger/EditModal.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,189 @@ <template> <el-dialog :title="modalOptions.title" v-model="visible" @close="close" width="60%"> <el-form :model="form" label-width="100px" :rules="formRules" ref="formRef"> <el-form-item label="å²ä½åç§°" prop="deptPositionId"> <el-select v-model="form.deptPositionId" placeholder="è¯·éæ©" clearable @change="handlePositionChange"> <el-option :label="item.name" :value="item.id" v-for="(item,index) in positionOptions" :key="item.id" /> </el-select> </el-form-item> <el-form-item label="å³ä¿ç±»å" prop="dictType"> <el-select v-model="form.dictType" placeholder="è¯·éæ©" clearable > <el-option :label="item.label" :value="item.value" v-for="(item,index) in sys_lavor_issue_type" :key="value" /> </el-select> </el-form-item> <el-form-item label="å³ä¿ç¨å" prop="dictId"> <el-select v-model="form.dictId" placeholder="è¯·éæ©" clearable> <el-option :label="item.dictName" :value="item.dictId" v-for="(item,index) in laborSuppliesOptions" :key="item.dictId" /> </el-select> </el-form-item> <el-form-item label="è¿åæ¥æ" prop="factoryDate"> <el-date-picker style="width: 100%" v-model="form.factoryDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©æ¥æ" clearable /> </el-form-item> <el-form-item label="åæ¾æ¥æ" prop="issueDate"> <el-date-picker style="width: 100%" v-model="form.issueDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©æ¥æ" clearable /> </el-form-item> <el-form-item label="åå·¥åç§°" prop="staffId"> <el-select v-model="form.staffId" placeholder="è¯·éæ©" clearable > <el-option :label="item.staffName" :value="item.id" v-for="(item,index) in personList" :key="id" /> </el-select> </el-form-item> <el-form-item label="åæ¾æ°é" prop="num"> <el-input-number :step="1" :min="0" style="width: 100%" v-model="form.num" placeholder="请è¾å ¥" /> </el-form-item> </el-form> <template #footer> <el-button type="primary" @click="sendForm" :loading="loading">{{ modalOptions.confirmText }}</el-button> <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button> </template> </el-dialog> </template> <script setup> import { ref, getCurrentInstance, onMounted, nextTick } from 'vue' import { useModal } from "@/hooks/useModal"; import { add, update } from "@/api/lavorissce/ledger"; import useFormData from "@/hooks/useFormData"; import useUserStore from "@/store/modules/user"; import {staffOnJobListPage} from "@/api/personnelManagement/employeeRecord.js"; import { getDept } from "@/api/collaborativeApproval/approvalProcess.js"; import { deptPositionListPage, getDeptPositionByDeptIdLabor } from "@/api/lavorissce/issue"; import { deepCopySameProperties } from '@/utils/util' import { ElMessage } from "element-plus"; const { proxy } = getCurrentInstance() defineOptions({ name: "æ¶å ¥æ°å¢ç¼è¾" }); const emits = defineEmits(["success"]); const formRef = ref(null) const userStore = useUserStore(); const { sys_lavor_issue } = proxy.useDict("sys_lavor_issue") const { sys_lavor_issue_type } = proxy.useDict("sys_lavor_issue_type") const productOptions = ref([]); const personList = ref([]); const positionOptions = ref([]); const laborSuppliesOptions = ref([]); const formRules = { deptPositionId: [{ required: true, trigger: "blur", message: "请è¾å ¥" }], dictType: [{ required: true, trigger: "change", message: "è¯·éæ©" }], dictId: [{ required: true, trigger: "change", message: "è¯·éæ©" }], adoptedDate: [{ required: true, trigger: "change", message: "è¯·éæ©" }], factoryDate: [{ required: true, trigger: "change", message: "è¯·éæ©" }], issueDate: [{ required: true, trigger: "change", message: "è¯·éæ©" }], } const { form, resetForm } = useFormData({ deptPositionId: undefined, dictType: undefined, dictId: undefined, adoptedDate: undefined, factoryDate: undefined, issueDate: undefined, staffId: undefined, num: undefined }); function getPersonList() { staffOnJobListPage({current: -1, size:-1, staffState: 1}).then(res => { personList.value = res.data.records }) } function getProductOptions() { getDept().then(res => { productOptions.value = res.data }) } function clearValidate() { formRef.value?.clearValidate() } function resetFormAndValidate() { resetForm() clearValidate() getProductOptions() getPersonList() } const { id, visible, loading, openModal, modalOptions, closeModal, } = useModal({ title: "å³ä¿å°è´¦" }); function sendForm() { formRef.value?.validate(async valid => { if (!valid) return const payload = { ...form } const { code } = id.value ? await update({ id: id.value, ...payload }) : await add(payload) if (code == 200) { emits("success") ElMessage({ message: "æä½æå", type: "success" }) close() } else { loading.value = false } }) } function close() { resetFormAndValidate() closeModal() } async function loadForm(row) { openModal(row.id) await nextTick() deepCopySameProperties(row, form) // å¦æä¼ å ¥äºå²ä½IDï¼èªå¨æ¥è¯¢å³ä¿ç¨åæ°æ® if (form.deptPositionId) { await handlePositionChange(form.deptPositionId) } } async function loadPositions() { const res = await deptPositionListPage({pageNum: -1, pageSize:-1}) positionOptions.value = res?.data?.records || res?.data || [] } async function handlePositionChange(deptPositionId) { if (!deptPositionId) { laborSuppliesOptions.value = [] form.dictId = undefined return } const res = await getDeptPositionByDeptIdLabor({ id: deptPositionId }) laborSuppliesOptions.value = res?.data || [] } onMounted(() => { loadPositions() getPersonList() }) defineExpose({ openModal, loadForm }) </script> src/views/lavorissue/ledger/Form.vue
@@ -1,70 +1,6 @@ <template> <el-form :model="form" label-width="100px" :rules="formRules" ref="formRef"> <el-form-item label="é¨é¨åç§°" prop="deptId"> <el-select v-model="form.deptId" placeholder="è¯·éæ©" clearable disabled > <el-option :label="item.deptName" :value="item.deptId" v-for="(item,index) in productOptions" :key="deptId" /> </el-select> </el-form-item> <el-form-item label="åå·¥åç§°" prop="staffId"> <el-select v-model="form.staffId" placeholder="è¯·éæ©" clearable > <el-option :label="item.staffName" :value="item.id" v-for="(item,index) in personList" :key="id" /> </el-select> </el-form-item> <el-form-item label="å³ä¿ç±»å" prop="dictType"> <el-select v-model="form.dictType" placeholder="è¯·éæ©" clearable > <el-option :label="item.label" :value="item.value" v-for="(item,index) in sys_lavor_issue_type" :key="value" /> </el-select> </el-form-item> <el-form-item label="å³ä¿é²å ·" prop="dictId"> <el-select v-model="form.dictId" placeholder="è¯·éæ©" clearable > <el-option :label="item.label" :value="item.value" v-for="(item,index) in sys_lavor_issue" :key="value" /> </el-select> </el-form-item> <el-form-item label="åæ¾æ°é" prop="num"> <el-input-number :step="1" :min="0" style="width: 100%" v-model="form.num" placeholder="请è¾å ¥" /> </el-form-item> <el-form-item label="è¿åæ¥æ" prop="factoryDate"> <el-date-picker style="width: 100%" v-model="form.factoryDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©æ¥æ" clearable /> </el-form-item> <el-form-item label="åæ¾æ¥æ" prop="issueDate"> <el-date-picker style="width: 100%" v-model="form.issueDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©æ¥æ" clearable /> </el-form-item> </el-form> </template> src/views/lavorissue/ledger/Modal.vue
@@ -1,70 +1,191 @@ <template> <el-dialog :title="modalOptions.title" v-model="visible" @close="close" width="30%"> <Form ref="formRef"></Form> <el-dialog :title="modalOptions.title" v-model="visible" @close="close" width="60%"> <el-form :model="form" label-width="100px" :rules="formRules" ref="formRef"> <el-form-item label="å²ä½åç§°" prop="deptPositionId"> <el-select v-model="form.deptPositionId" placeholder="è¯·éæ©" clearable @change="handlePositionChange"> <el-option :label="item.name" :value="item.id" v-for="(item,index) in positionOptions" :key="item.id" /> </el-select> </el-form-item> <el-form-item label="å³ä¿ç±»å" prop="dictType"> <el-select v-model="form.dictType" placeholder="è¯·éæ©" clearable> <el-option :label="item.label" :value="item.value" v-for="(item,index) in sys_lavor_issue_type" :key="item.value" /> </el-select> </el-form-item> <el-form-item label="å³ä¿ç¨å" prop="dictId"> <el-select v-model="form.dictId" placeholder="è¯·éæ©" clearable> <el-option :label="item.dictName" :value="item.dictId" v-for="(item,index) in laborSuppliesOptions" :key="item.dictId" /> </el-select> </el-form-item> <el-form-item label="è¿åæ¥æ" prop="factoryDate"> <el-date-picker style="width: 100%" v-model="form.factoryDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©æ¥æ" clearable /> </el-form-item> <el-form-item label="åæ¾æ¥æ" prop="issueDate"> <el-date-picker style="width: 100%" v-model="form.issueDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©æ¥æ" clearable /> </el-form-item> <el-form-item label="å工䏿°é" required> <div style="width:100%"> <div style="margin-bottom:8px; text-align:right;"> <el-button size="small" type="primary" @click="addItemRow">æ°å¢ä¸è¡</el-button> </div> <el-table :data="form.laborIssueList" border size="small"> <el-table-column label="åå·¥åç§°" width="220"> <template #default="scope"> <el-select v-model="scope.row.staffId" placeholder="è¯·éæ©" filterable> <el-option :label="p.staffName" :value="p.id" v-for="p in personList" :key="p.id" /> </el-select> </template> </el-table-column> <el-table-column label="åæ¾æ°é" align="center"> <template #default="scope"> <el-input-number v-model="scope.row.num" :min="0" :step="1" /> </template> </el-table-column> <el-table-column label="æä½" width="120" align="center"> <template #default="scope"> <el-button link type="danger" size="small" @click="removeItemRow(scope.$index)">å é¤</el-button> </template> </el-table-column> </el-table> </div> </el-form-item> </el-form> <template #footer> <el-button type="primary" @click="sendForm" :loading="loading"> {{ modalOptions.confirmText }} </el-button> <el-button type="primary" @click="sendForm" :loading="loading">{{ modalOptions.confirmText }}</el-button> <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button> </template> </el-dialog> </template> <script setup> import { ref, getCurrentInstance, onMounted, nextTick } from 'vue' import { useModal } from "@/hooks/useModal"; import { add, update } from "@/api/lavorissce/ledger"; import Form from "./Form.vue"; import useFormData from "@/hooks/useFormData"; import useUserStore from "@/store/modules/user"; import {staffOnJobListPage} from "@/api/personnelManagement/employeeRecord.js"; import { getDept } from "@/api/collaborativeApproval/approvalProcess.js"; import { deptPositionListPage, getDeptPositionByDeptIdLabor } from "@/api/lavorissce/issue"; import { deepCopySameProperties } from '@/utils/util' import { ElMessage } from "element-plus"; const { proxy } = getCurrentInstance() defineOptions({ name: "æ¶å ¥æ°å¢ç¼è¾", }); defineOptions({ name: "æ¶å ¥æ°å¢ç¼è¾" }); const emits = defineEmits(["success"]); const formRef = ref(); const formRef = ref(null) const userStore = useUserStore(); const { sys_lavor_issue } = proxy.useDict("sys_lavor_issue") const { sys_lavor_issue_type } = proxy.useDict("sys_lavor_issue_type") const productOptions = ref([]); const personList = ref([]); const positionOptions = ref([]); const laborSuppliesOptions = ref([]); const formRules = { deptPositionId: [{ required: true, trigger: "blur", message: "请è¾å ¥" }], dictType: [{ required: true, trigger: "change", message: "è¯·éæ©" }], dictId: [{ required: true, trigger: "change", message: "è¯·éæ©" }], adoptedDate: [{ required: true, trigger: "change", message: "è¯·éæ©" }], factoryDate: [{ required: true, trigger: "change", message: "è¯·éæ©" }], issueDate: [{ required: true, trigger: "change", message: "è¯·éæ©" }], } const { form, resetForm } = useFormData({ deptPositionId: undefined, dictType: undefined, dictId: undefined, adoptedDate: undefined, factoryDate: undefined, issueDate: undefined, laborIssueList: [ { staffId: undefined, num: undefined } ], }); function getPersonList() { staffOnJobListPage({current: -1, size:-1, staffState: 1}).then(res => { personList.value = res.data.records }) } function getProductOptions() { getDept().then(res => { productOptions.value = res.data }) } function clearValidate() { formRef.value?.clearValidate() } function resetFormAndValidate() { resetForm() clearValidate() getProductOptions() getPersonList() } function addItemRow() { form.laborIssueList.push({ staffId: undefined, num: undefined }) } function removeItemRow(index) { form.laborIssueList.splice(index, 1) } const { id, visible, loading, openModal, modalOptions, handleConfirm, closeModal, } = useModal({ title: "å³ä¿å°è´¦" }); const sendForm = () => { proxy.$refs.formRef.$refs.formRef.validate(async valid => { if (valid) { const {code} = id.value ? await update({id: id.value, ...formRef.value.form}) : await add(formRef.value.form); if (code == 200) { emits("success"); ElMessage({message: "æä½æå", type: "success"}); close(); } else { loading.value = false; function sendForm() { formRef.value?.validate(async valid => { if (!valid) return // é¢å¤æ ¡éªå¤äººæç» if (!Array.isArray(form.laborIssueList) || form.laborIssueList.length === 0) { ElMessage.error('请è³å°æ·»å ä¸è¡å工䏿°é') return } for (const row of form.laborIssueList) { if (!row.staffId) { ElMessage.error('è¯·éæ©åå·¥'); return } if (row.num == null || row.num === '' || Number(row.num) < 0) { ElMessage.error('请è¾å ¥æ°é'); return } } const payload = { ...form } const { code } = id.value ? await update({ id: id.value, ...payload }) : await add(payload) if (code == 200) { emits("success") ElMessage({ message: "æä½æå", type: "success" }) close() } else { loading.value = false } }) }; } const close = () => { formRef.value.resetFormAndValidate(); closeModal(); }; function close() { resetFormAndValidate() closeModal() } const loadForm = async (row) => { openModal(row.id); await nextTick(); formRef.value.loadForm(row); async function loadForm(row) { openModal(row.id) await nextTick() deepCopySameProperties(row, form) } async function loadPositions() { const res = await deptPositionListPage({pageNum: -1, pageSize:-1}) positionOptions.value = res?.data?.records || res?.data || [] } }; async function handlePositionChange(deptPositionId) { if (!deptPositionId) { laborSuppliesOptions.value = [] form.dictId = undefined return } const res = await getDeptPositionByDeptIdLabor({ id: deptPositionId }) laborSuppliesOptions.value = res?.data || [] } defineExpose({ openModal, loadForm, }); onMounted(() => { loadPositions() getPersonList() }) defineExpose({ openModal, loadForm }) </script> src/views/lavorissue/ledger/index.vue
@@ -67,6 +67,7 @@ </PIMTable> </div> <Modal ref="modalRef" @success="getTableData"></Modal> <EditModal ref="editModalRef" @success="getTableData"></EditModal> <files-dia ref="filesDia"></files-dia> </div> </template> @@ -76,6 +77,7 @@ import { listPage,deleteLedger,update } from "@/api/lavorissce/ledger"; import { onMounted, getCurrentInstance } from "vue"; import Modal from "./Modal.vue"; import EditModal from "./EditModal.vue"; import { ElMessageBox, ElMessage } from "element-plus"; import dayjs from "dayjs"; import FilesDia from "./filesDia.vue"; @@ -85,6 +87,7 @@ const multipleList = ref([]); const { proxy } = getCurrentInstance(); const modalRef = ref(); const editModalRef = ref(); const { payment_methods } = proxy.useDict("payment_methods"); const { income_types } = proxy.useDict("income_types"); const filesDia = ref() @@ -216,7 +219,7 @@ modalRef.value.openModal(); }; const edit = (row) => { modalRef.value.loadForm(row); editModalRef.value.loadForm(row); }; /** æç´¢æé®æä½ */ src/views/personnelManagement/onboarding/components/formDia.vue
@@ -187,7 +187,7 @@ async function loadPositions() { try { positionLoading.value = true const res = await deptPositionListPage({pageNum: 1, pageSize: 9999}) const res = await deptPositionListPage({pageNum: -1, pageSize:-1}) positionOptions.value = res?.data?.records || res?.data || [] } finally { positionLoading.value = false