From ea1cab4a1b6e3177e10651cff65e61493df41fff Mon Sep 17 00:00:00 2001 From: 曹睿 <360930172@qq.com> Date: 星期四, 03 七月 2025 10:53:50 +0800 Subject: [PATCH] Merge branch 'dev' of http://114.132.189.42:9002/r/product-inventory-management into dev --- src/views/personnelManagement/onboarding/components/formDia.vue | 161 ++- src/views/basicData/product/index.vue | 18 src/views/personnelManagement/employeeRecord/components/formDia.vue | 73 + src/views/personnelManagement/employeeRecord/index.vue | 223 +++++ src/views/system/user/profile/userAvatar.vue | 30 src/views/inventoryManagement/issueManagement/index.vue | 42 src/views/salesManagement/salesLedger/index.vue | 486 ++-------- src/views/personnelManagement/contractManagement/index.vue | 223 +++++ src/views/personnelManagement/dimission/components/formDia.vue | 163 ++- src/views/salesManagement/invoiceLedger/index.vue | 258 +---- src/api/personnelManagement/employeeRecord.js | 18 src/views/personnelManagement/contractManagement/components/formDia.vue | 73 + src/views/qualityManagement/metricMaintenance/index.vue | 310 +++++++ src/api/personnelManagement/onboarding.js | 42 src/components/FileUpload/index.vue | 49 src/views/procurementManagement/invoiceEntry/components/Modal.vue | 112 -- src/views/salesManagement/salesLedger/fileList.vue | 36 src/views/personnelManagement/dimission/index.vue | 146 ++- src/views/personnelManagement/onboarding/index.vue | 145 ++- 19 files changed, 1,640 insertions(+), 968 deletions(-) diff --git a/src/api/personnelManagement/employeeRecord.js b/src/api/personnelManagement/employeeRecord.js new file mode 100644 index 0000000..378756a --- /dev/null +++ b/src/api/personnelManagement/employeeRecord.js @@ -0,0 +1,18 @@ +import request from '@/utils/request' + +// 鏌ヨ鍦ㄨ亴鍛樺伐鍙拌处 +export function staffOnJobListPage(query) { + return request({ + url: '/staff/staffOnJob/listPage', + method: 'get', + params: query, + }) +} +// 鏌ヨ鍛樺伐鍏ヨ亴淇℃伅 +export function staffOnJobInfo(query) { + return request({ + url: '/staff/staffOnJob/staffNo', + method: 'get', + params: query, + }) +} \ No newline at end of file diff --git a/src/api/personnelManagement/onboarding.js b/src/api/personnelManagement/onboarding.js new file mode 100644 index 0000000..7212afa --- /dev/null +++ b/src/api/personnelManagement/onboarding.js @@ -0,0 +1,42 @@ +import request from '@/utils/request' + +// 鏌ヨ浜哄憳鍏ヨ亴鍒楄〃 +export function staffJoinListPage(query) { + return request({ + url: '/staff/staffJoinLeaveRecord/listPage', + method: 'get', + params: query, + }) +} +// 鏂板浜哄憳鍏ヨ亴 +export function staffJoinAdd(query) { + return request({ + url: '/staff/staffJoinLeaveRecord/add', + method: 'post', + data: query, + }) +} +// 淇敼浜哄憳鍏ヨ亴 +export function staffJoinUpdate(query) { + return request({ + url: '/staff/staffJoinLeaveRecord/update', + method: 'post', + data: query, + }) +} +// 鏌ヨ鍛樺伐鍏ヨ亴淇℃伅 +export function getStaffJoinInfo(query) { + return request({ + url: '/staff/staffJoinLeaveRecord/' + query, + method: 'get', + data: query, + }) +} +// 鍒犻櫎鍛樺伐 +export function staffJoinDel(query) { + return request({ + url: '/staff/staffJoinLeaveRecord/del', + method: 'delete', + data: query, + }) +} \ No newline at end of file diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue index e39a6ed..57e62b7 100644 --- a/src/components/FileUpload/index.vue +++ b/src/components/FileUpload/index.vue @@ -1,21 +1,8 @@ <template> <div class="upload-file"> - <el-upload - multiple - :action="uploadFileUrl" - :before-upload="handleBeforeUpload" - :file-list="fileList" - :data="data" - :limit="limit" - :on-error="handleUploadError" - :on-exceed="handleExceed" - :on-success="handleUploadSuccess" - :show-file-list="false" - :headers="headers" - class="upload-file-uploader" - ref="fileUpload" - v-if="!disabled" - > + <el-upload multiple :action="uploadFileUrl" :before-upload="handleBeforeUpload" :file-list="fileList" :data="data" + :limit="limit" :on-error="handleUploadError" :on-exceed="handleExceed" :on-success="handleUploadSuccess" + :show-file-list="false" :headers="headers" class="upload-file-uploader" ref="fileUpload" v-if="!disabled"> <!-- 涓婁紶鎸夐挳 --> <el-button type="primary">閫夊彇鏂囦欢</el-button> </el-upload> @@ -31,31 +18,13 @@ 鐨勬枃浠� </div> <!-- 鏂囦欢鍒楄〃 --> - <transition-group - class="upload-file-list el-upload-list el-upload-list--text" - name="el-fade-in-linear" - tag="ul" - > - <li - :key="file.uid" - class="el-upload-list__item ele-upload-list__item-content" - v-for="(file, index) in fileList" - > - <el-link - :href="`${baseUrl}${file.url}`" - :underline="false" - target="_blank" - > + <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul"> + <li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList"> + <el-link :href="`${baseUrl}${file.url}`" :underline="false" target="_blank"> <span class="el-icon-document"> {{ getFileName(file.name) }} </span> </el-link> <div class="ele-upload-list__item-content-action"> - <el-link - :underline="false" - @click="handleDelete(index)" - type="danger" - v-if="!disabled" - > 鍒犻櫎</el-link - > + <el-link :underline="false" @click="handleDelete(index)" type="danger" v-if="!disabled"> 鍒犻櫎</el-link> </div> </li> </transition-group> @@ -264,9 +233,11 @@ opacity: 0.5; background: #c8ebfb; } + .upload-file-uploader { margin-bottom: 5px; } + .upload-file-list .el-upload-list__item { border: 1px solid #e4e7ed; line-height: 2; @@ -274,12 +245,14 @@ position: relative; transition: none !important; } + .upload-file-list .ele-upload-list__item-content { display: flex; justify-content: space-between; align-items: center; color: inherit; } + .ele-upload-list__item-content-action .el-link { margin-right: 10px; } diff --git a/src/views/basicData/product/index.vue b/src/views/basicData/product/index.vue index cf83ff4..b17be1f 100644 --- a/src/views/basicData/product/index.vue +++ b/src/views/basicData/product/index.vue @@ -40,7 +40,13 @@ > <template #default="{ node, data }"> <div class="custom-tree-node"> - <span>{{ node.label }}</span> + <span class="tree-node-content"> + <el-icon class="orange-icon"> + <component :is="data.children && data.children.length > 0 + ? node.expanded ? 'FolderOpened' : 'Folder' : 'Tickets'" /> + </el-icon> + {{ data.label }} + </span> <div> <el-button type="primary" @@ -476,4 +482,14 @@ font-size: 14px; padding-right: 8px; } +.tree-node-content { + display: flex; + align-items: center; /* 鍨傜洿灞呬腑 */ + height: 100%; +} +.orange-icon { + color: orange; + font-size: 18px; + margin-right: 8px; /* 鍥炬爣涓庢枃瀛椾箣闂村姞鐐归棿璺� */ +} </style> diff --git a/src/views/inventoryManagement/issueManagement/index.vue b/src/views/inventoryManagement/issueManagement/index.vue index ef38d41..5b1088a 100644 --- a/src/views/inventoryManagement/issueManagement/index.vue +++ b/src/views/inventoryManagement/issueManagement/index.vue @@ -40,7 +40,7 @@ <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="paginationChange" /> </div> - <el-dialog v-model="dialogFormVisible" :title="'鏂板鍑哄簱'" width="70%" @close="closeDia"> + <el-dialog v-model="dialogFormVisible" :title="'鏂板鍑哄簱'" width="40%" @close="closeDia"> <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> <el-form-item label="鍑哄簱鏁伴噺锛�" prop="salesContractNo"> <el-input v-model="form.salesContractNo" placeholder="璇疯緭鍏�" clearable /> @@ -93,7 +93,6 @@ const fileList = ref([]) // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁 -const operationType = ref('') const dialogFormVisible = ref(false) const data = reactive({ searchForm: { @@ -177,32 +176,31 @@ // 鎵撳紑寮规 const openForm = async (row) => { - operationType.value = type - form.value = {} - productData.value = [] - let userLists = await userListNoPage() - userList.value = userLists.data - customerList().then(res => { - customerOption.value = res - }) - console.log('userStore.id', userStore.id) - form.value.entryPerson = userStore.id - if (type === 'edit') { - currentId.value = row.id; - getSalesLedgerWithProducts({ id: row.id, type: 1 }).then(res => { - form.value = { ...res } - form.value.entryPerson = Number(res.entryPerson) - productData.value = form.value.productData - fileList.value = form.value.salesLedgerFiles - }) - } + // form.value = {} + // productData.value = [] + // let userLists = await userListNoPage() + // userList.value = userLists.data + // customerList().then(res => { + // customerOption.value = res + // }) + // console.log('userStore.id', userStore.id) + // form.value.entryPerson = userStore.id + // if (type === 'edit') { + // currentId.value = row.id; + // getSalesLedgerWithProducts({ id: row.id, type: 1 }).then(res => { + // form.value = { ...res } + // form.value.entryPerson = Number(res.entryPerson) + // productData.value = form.value.productData + // fileList.value = form.value.salesLedgerFiles + // }) + // } // let userAll = await userStore.getInfo() // userList.value.forEach(element => { // if(userAll.user.nickName === element.nickName && userAll.user.userName === element.userName) { // form.value.entryPerson = userAll.user.userId // 璁剧疆榛樿涓氬姟鍛樹负褰撳墠鐢ㄦ埛 // } // }); - form.value.entryDate = getCurrentDate() // 璁剧疆榛樿褰曞叆鏃ユ湡涓哄綋鍓嶆棩鏈� + // form.value.entryDate = getCurrentDate() // 璁剧疆榛樿褰曞叆鏃ユ湡涓哄綋鍓嶆棩鏈� dialogFormVisible.value = true } diff --git a/src/views/personnelManagement/contractManagement/components/formDia.vue b/src/views/personnelManagement/contractManagement/components/formDia.vue new file mode 100644 index 0000000..6538273 --- /dev/null +++ b/src/views/personnelManagement/contractManagement/components/formDia.vue @@ -0,0 +1,73 @@ +<template> + <div> + <el-dialog + v-model="dialogFormVisible" + title="璇︽儏" + width="70%" + @close="closeDia" + > + <PIMTable + rowKey="id" + :column="tableColumn" + :tableData="tableData" + :tableLoading="tableLoading" + height="600" + ></PIMTable> + <template #footer> + <div class="dialog-footer"> + <el-button @click="closeDia">鍙栨秷</el-button> + </div> + </template> + </el-dialog> + </div> +</template> + +<script setup> +import {ref} from "vue"; +import {staffOnJobInfo} from "@/api/personnelManagement/employeeRecord.js"; +const { proxy } = getCurrentInstance() +const emit = defineEmits(['close']) + +const dialogFormVisible = ref(false); +const operationType = ref('') +const tableColumn = ref([ + { + label: "鍚堝悓骞撮檺", + prop: "contractTerm", + }, + { + label: "鍚堝悓寮�濮嬫棩鏈�", + prop: "contractStartTime", + }, + { + label: "鍚堝悓缁撴潫鏃ユ湡", + prop: "contractEndTime", + }, +]); +const tableData = ref([]); +const tableLoading = ref(false); + +// 鎵撳紑寮规 +const openDialog = (type, row) => { + operationType.value = type; + dialogFormVisible.value = true; + if (operationType.value === 'edit') { + staffOnJobInfo({staffNo: row.staffNo}).then(res => { + tableData.value = res.data + }) + } +} + +// 鍏抽棴寮规 +const closeDia = () => { + dialogFormVisible.value = false; + emit('close') +}; +defineExpose({ + openDialog, +}); +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/src/views/personnelManagement/contractManagement/index.vue b/src/views/personnelManagement/contractManagement/index.vue new file mode 100644 index 0000000..623d675 --- /dev/null +++ b/src/views/personnelManagement/contractManagement/index.vue @@ -0,0 +1,223 @@ +<template> + <div class="app-container"> + <div class="search_form"> + <div> + <span class="search_title">濮撳悕锛�</span> + <el-input + v-model="searchForm.staffName" + style="width: 240px" + placeholder="璇疯緭鍏ュ鍚嶆悳绱�" + @change="handleQuery" + clearable + :prefix-icon="Search" + /> + <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 @click="handleOut">瀵煎嚭</el-button> + <!-- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>--> + </div> + </div> + <div class="table_list"> + <PIMTable + rowKey="id" + :column="tableColumn" + :tableData="tableData" + :page="page" + :isSelection="true" + @selection-change="handleSelectionChange" + :tableLoading="tableLoading" + @pagination="pagination" + :total="page.total" + ></PIMTable> + </div> + <form-dia ref="formDia" @close="handleQuery"></form-dia> + </div> +</template> + +<script setup> +import { Search } from "@element-plus/icons-vue"; +import {onMounted, ref} from "vue"; +import FormDia from "@/views/personnelManagement/contractManagement/components/formDia.vue"; +import {ElMessageBox} from "element-plus"; +import {staffOnJobListPage} from "@/api/personnelManagement/employeeRecord.js"; + +const data = reactive({ + searchForm: { + staffName: "", + }, +}); +const { searchForm } = toRefs(data); +const tableColumn = ref([ + { + label: "鐘舵��", + prop: "staffState", + dataType: "tag", + formatData: (params) => { + if (params == 0) { + return "绂昏亴"; + } else if (params == 1) { + return "鍦ㄨ亴"; + } else { + return null; + } + }, + formatType: (params) => { + if (params == 0) { + return "danger"; + } else if (params == 1) { + return "primary"; + } else { + return null; + } + }, + }, + { + label: "鍛樺伐缂栧彿", + prop: "staffNo", + }, + { + label: "濮撳悕", + prop: "staffName", + }, + { + label: "鎬у埆", + prop: "sex", + }, + { + label: "绫嶈疮", + prop: "nativePlace", + }, + { + label: "宀椾綅", + prop: "postJob", + }, + { + label: "瀹跺涵浣忓潃", + prop: "adress", + }, + { + label: "绗竴瀛﹀巻", + prop: "firstStudy", + }, + { + label: "涓撲笟", + prop: "profession", + }, + { + label: "韬唤璇佸彿", + prop: "identityCard", + }, + { + label: "骞撮緞", + prop: "age", + }, + { + label: "鑱旂郴鐢佃瘽", + prop: "phone", + }, + { + label: "绱ф�ヨ仈绯讳汉", + prop: "emergencyContact", + width: 120 + }, + { + label: "鑱旂郴鐢佃瘽", + prop: "emergencyContactPhone", + }, + { + label: "鍚堝悓骞撮檺", + prop: "contractTerm", + }, + // { + // label: "鍚堝悓寮�濮嬫棩鏈�", + // prop: "contractStartTime", + // width: 120 + // }, + { + label: "鍚堝悓缁撴潫鏃ユ湡", + prop: "contractExpireTime", + width: 120 + }, + { + dataType: "action", + label: "鎿嶄綔", + align: "center", + fixed: 'right', + operation: [ + { + name: "璇︽儏", + type: "text", + clickFun: (row) => { + openForm("edit", row); + }, + }, + ], + }, +]); +const tableData = ref([]); +const selectedRows = ref([]); +const tableLoading = ref(false); +const page = reactive({ + current: 1, + size: 100, + total: 0, +}); +const formDia = ref() +const { proxy } = getCurrentInstance() + +// 鏌ヨ鍒楄〃 +/** 鎼滅储鎸夐挳鎿嶄綔 */ +const handleQuery = () => { + page.current = 1; + getList(); +}; +const pagination = (obj) => { + page.current = obj.page; + page.size = obj.limit; + getList(); +}; +const getList = () => { + tableLoading.value = true; + staffOnJobListPage({...page, ...searchForm.value,}).then(res => { + tableLoading.value = false; + tableData.value = res.data.records + page.total = res.data.total; + }).catch(err => { + tableLoading.value = false; + }) +}; +// 琛ㄦ牸閫夋嫨鏁版嵁 +const handleSelectionChange = (selection) => { + selectedRows.value = selection; +}; + +// 鎵撳紑寮规 +const openForm = (type, row) => { + nextTick(() => { + formDia.value?.openDialog(type, row) + }) +}; +// 瀵煎嚭 +const handleOut = () => { + ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", { + confirmButtonText: "纭", + cancelButtonText: "鍙栨秷", + type: "warning", + }) + .then(() => { + proxy.download("/staff/staffOnJob/export", {}, "鍚堝悓绠$悊.xlsx"); + }) + .catch(() => { + proxy.$modal.msg("宸插彇娑�"); + }); +}; +onMounted(() => { + getList(); +}); +</script> + +<style scoped></style> diff --git a/src/views/personnelManagement/dimission/components/formDia.vue b/src/views/personnelManagement/dimission/components/formDia.vue index 68185cc..dc96e2f 100644 --- a/src/views/personnelManagement/dimission/components/formDia.vue +++ b/src/views/personnelManagement/dimission/components/formDia.vue @@ -2,104 +2,123 @@ <div> <el-dialog v-model="dialogFormVisible" - :title="operationType === 'add' ? '鏂板绂昏亴' : '缂栬緫浜哄憳'" + :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="purchaseContractNumber"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="鍛樺伐缂栧彿锛�" prop="staffNo"> + <el-input v-model="form.staffNo" placeholder="璇疯緭鍏�" clearable :disabled="operationType !== 'add'"/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="濮撳悕锛�" prop="salesLedgerId"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="濮撳悕锛�" prop="staffName"> + <el-input v-model="form.staffName" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> - <el-form-item label="鎬у埆锛�" prop="purchaseContractNumber"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="鎬у埆锛�" prop="sex"> + <el-select v-model="form.sex"> + <el-option label="鐢�" value="鐢�" /> + <el-option label="濂�" value="濂�" /> + </el-select> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="绫嶈疮锛�" prop="salesLedgerId"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="绫嶈疮锛�" prop="nativePlace"> + <el-input v-model="form.nativePlace" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> - <el-form-item label="宀椾綅锛�" prop="purchaseContractNumber"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="宀椾綅锛�" prop="postJob"> + <el-input v-model="form.postJob" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="瀹跺涵浣忓潃锛�" prop="salesLedgerId"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="瀹跺涵浣忓潃锛�" prop="adress"> + <el-input v-model="form.adress" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> - <el-form-item label="绗竴瀛﹀巻锛�" prop="purchaseContractNumber"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="绗竴瀛﹀巻锛�" prop="firstStudy"> + <el-input v-model="form.firstStudy" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="涓撲笟锛�" prop="salesLedgerId"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="涓撲笟锛�" prop="profession"> + <el-input v-model="form.profession" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> - <el-form-item label="韬唤璇佸彿锛�" prop="purchaseContractNumber"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="韬唤璇佸彿锛�" prop="identityCard"> + <el-input v-model="form.identityCard" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="骞撮緞锛�" prop="salesLedgerId"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="骞撮緞锛�" prop="age"> + <el-input-number v-model="form.age" :precision="0" :step="1" style="width: 100%"/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> - <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="purchaseContractNumber"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="phone"> + <el-input v-model="form.phone" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="绱ф�ヨ仈绯讳汉锛�" prop="salesLedgerId"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="绱ф�ヨ仈绯讳汉锛�" prop="emergencyContact"> + <el-input v-model="form.emergencyContact" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> - <el-form-item label="绱ф�ヨ仈绯讳汉鑱旂郴鐢佃瘽锛�" prop="purchaseContractNumber"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="绱ф�ヨ仈绯讳汉鑱旂郴鐢佃瘽锛�" prop="emergencyContactPhone"> + <el-input v-model="form.emergencyContactPhone" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="鍚堝悓骞撮檺锛�" prop="salesLedgerId"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="鍚堝悓骞撮檺锛�" prop="contractTerm"> + <el-input-number v-model="form.contractTerm" :precision="0" :step="1" style="width: 100%"/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> - <el-form-item label="鍚堝悓寮�濮嬫棩鏈燂細" prop="purchaseContractNumber"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="鍚堝悓寮�濮嬫棩鏈燂細" prop="contractStartTime"> + <el-date-picker + v-model="form.contractStartTime" + type="date" + placeholder="璇烽�夋嫨鏃ユ湡" + value-format="YYYY-MM-DD" + format="YYYY-MM-DD" + clearable + style="width: 100%" + /> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="鍚堝悓缁撴潫鏃ユ湡锛�" prop="salesLedgerId"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="鍚堝悓缁撴潫鏃ユ湡锛�" prop="contractEndTime"> + <el-date-picker + v-model="form.contractEndTime" + type="date" + placeholder="璇烽�夋嫨鏃ユ湡" + value-format="YYYY-MM-DD" + format="YYYY-MM-DD" + clearable + style="width: 100%" + /> </el-form-item> </el-col> </el-row> @@ -116,45 +135,87 @@ <script setup> import {ref} from "vue"; +import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js"; +const { proxy } = getCurrentInstance() +const emit = defineEmits(['close']) const dialogFormVisible = ref(false); const operationType = ref('') const data = reactive({ - searchForm: { - purchaseContractNumber: "", - }, form: { - purchaseContractNumber: "", - salesLedgerId: "", - projectName: "", - recorderId: "", - entryDate: "", - productData: [], - supplierName: "", - supplierId: "", + staffNo: "", + staffName: "", + sex: "", + nativePlace: "", + postJob: "", + adress: "", + firstStudy: "", + profession: "", + identityCard: "", + age: 0, + phone: "", + emergencyContact: "", + emergencyContactPhone: "", + contractTerm: 0, + contractStartTime: "", + contractEndTime: "", + staffState: "", }, rules: { - purchaseContractNumber: [ - { required: true, message: "璇疯緭鍏�", trigger: "blur" }, - ], - projectName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], - supplierId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + staffNo: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },], + staffName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + sex: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + nativePlace: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + postJob: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + adress: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + firstStudy: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + profession: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + identityCard: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + age: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + phone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + emergencyContact: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + emergencyContactPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + contractTerm: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + contractStartTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + contractEndTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], }, }); const { form, rules } = toRefs(data); // 鎵撳紑寮规 const openDialog = (type, row) => { + operationType.value = type; dialogFormVisible.value = true; + if (operationType.value === 'edit') { + getStaffJoinInfo(row.id).then(res => { + form.value = {...res.data} + }) + } } // 鎻愪氦浜у搧琛ㄥ崟 const submitForm = () => { - + proxy.$refs.formRef.validate(valid => { + if (valid) { + form.value.staffState = 0 + if (operationType.value === "add") { + staffJoinAdd(form.value).then(res => { + proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); + closeDia(); + }) + } else { + staffJoinUpdate(form.value).then(res => { + proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); + closeDia(); + }) + } + } + }) } // 鍏抽棴寮规 const closeDia = () => { - // proxy.resetForm("formRef"); + proxy.resetForm("formRef"); dialogFormVisible.value = false; + emit('close') }; defineExpose({ openDialog, diff --git a/src/views/personnelManagement/dimission/index.vue b/src/views/personnelManagement/dimission/index.vue index 3692930..ccf43da 100644 --- a/src/views/personnelManagement/dimission/index.vue +++ b/src/views/personnelManagement/dimission/index.vue @@ -4,9 +4,9 @@ <div> <span class="search_title">濮撳悕锛�</span> <el-input - v-model="searchForm.customerName" + v-model="searchForm.staffName" style="width: 240px" - placeholder="璇疯緭鍏ュ悕绉版悳绱�" + placeholder="璇疯緭鍏ュ鍚嶆悳绱�" @change="handleQuery" clearable :prefix-icon="Search" @@ -17,6 +17,8 @@ </div> <div> <el-button type="primary" @click="openForm('add')">鏂板绂昏亴</el-button> + <el-button @click="handleOut">瀵煎嚭</el-button> + <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button> </div> </div> <div class="table_list"> @@ -29,53 +31,45 @@ @selection-change="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination" - :total="total" + :total="page.total" ></PIMTable> </div> - <form-dia ref="formDia"></form-dia> + <form-dia ref="formDia" @close="handleQuery"></form-dia> </div> </template> <script setup> import { Search } from "@element-plus/icons-vue"; -import { ref } from "vue"; -import FormDia from "@/views/personnelManagement/onboarding/components/formDia.vue"; +import {onMounted, ref} from "vue"; +import FormDia from "@/views/personnelManagement/dimission/components/formDia.vue"; +import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js"; +import {ElMessageBox} from "element-plus"; const data = reactive({ searchForm: { - customerName: "", - }, - form: { - salesLedgerId: "", - customerName: "", - salesman: "", - projectName: "", - productData: [], - }, - rules: { - salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }], + staffName: "", }, }); -const { searchForm, form, rules } = toRefs(data); +const { searchForm } = toRefs(data); const tableColumn = ref([ { label: "鐘舵��", - prop: "paymentDate", + prop: "staffState", dataType: "tag", formatData: (params) => { if (params == 0) { - return "鍦ㄨ亴"; - } else if (params == 1) { return "绂昏亴"; + } else if (params == 1) { + return "鍦ㄨ亴"; } else { return null; } }, formatType: (params) => { if (params == 0) { - return "primary"; - } else if (params == 1) { return "danger"; + } else if (params == 1) { + return "primary"; } else { return null; } @@ -83,67 +77,84 @@ }, { label: "鍛樺伐缂栧彿", - prop: "supplierName", + prop: "staffNo", }, { label: "濮撳悕", - prop: "currentPaymentAmount", + prop: "staffName", }, { label: "鎬у埆", - prop: "paymentMethod", + prop: "sex", }, { label: "绫嶈疮", - prop: "registrant", + prop: "nativePlace", }, { label: "宀椾綅", - prop: "registrationtDate", + prop: "postJob", }, { label: "瀹跺涵浣忓潃", - prop: "registrationtDate", + prop: "adress", }, { label: "绗竴瀛﹀巻", - prop: "registrationtDate", + prop: "firstStudy", }, { label: "涓撲笟", - prop: "registrationtDate", + prop: "profession", }, { label: "韬唤璇佸彿", - prop: "registrationtDate", + prop: "identityCard", }, { label: "骞撮緞", - prop: "registrationtDate", + prop: "age", }, { label: "鑱旂郴鐢佃瘽", - prop: "registrationtDate", + prop: "phone", }, { label: "绱ф�ヨ仈绯讳汉", - prop: "registrationtDate", + prop: "emergencyContact", + width: 120 }, { label: "鑱旂郴鐢佃瘽", - prop: "registrationtDate", + prop: "emergencyContactPhone", }, { label: "鍚堝悓骞撮檺", - prop: "registrationtDate", + prop: "contractTerm", }, { label: "鍚堝悓寮�濮嬫棩鏈�", - prop: "registrationtDate", + prop: "contractStartTime", + width: 120 }, { label: "鍚堝悓缁撴潫鏃ユ湡", - prop: "registrationtDate", + prop: "contractEndTime", + width: 120 + }, + { + dataType: "action", + label: "鎿嶄綔", + align: "center", + operation: [ + { + name: "缂栬緫", + type: "text", + clickFun: (row) => { + openForm("edit", row); + }, + }, + ], }, ]); const tableData = ref([]); @@ -152,8 +163,8 @@ const page = reactive({ current: 1, size: 100, + total: 0, }); -const total = ref(0); const formDia = ref() const { proxy } = getCurrentInstance() @@ -170,14 +181,17 @@ }; const getList = () => { tableLoading.value = true; - + staffJoinListPage({...page, ...searchForm.value, staffState: 0}).then(res => { + tableLoading.value = false; + tableData.value = res.data.records + page.total = res.data.total; + }).catch(err => { + tableLoading.value = false; + }) }; // 琛ㄦ牸閫夋嫨鏁版嵁 const handleSelectionChange = (selection) => { - console.log("selection", selection); - selectedRows.value = selection.filter( - (item) => item.salesContractNo !== undefined - ); + selectedRows.value = selection; }; // 鎵撳紑寮规 @@ -186,6 +200,48 @@ formDia.value?.openDialog(type, row) }) }; + +// 鍒犻櫎 +const handleDelete = () => { + let ids = []; + if (selectedRows.value.length > 0) { + ids = selectedRows.value.map((item) => item.id); + } else { + proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁"); + return; + } + ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", { + confirmButtonText: "纭", + cancelButtonText: "鍙栨秷", + type: "warning", + }) + .then(() => { + staffJoinDel(ids).then((res) => { + proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + getList(); + }); + }) + .catch(() => { + proxy.$modal.msg("宸插彇娑�"); + }); +}; +// 瀵煎嚭 +const handleOut = () => { + ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", { + confirmButtonText: "纭", + cancelButtonText: "鍙栨秷", + type: "warning", + }) + .then(() => { + proxy.download("/staff/staffJoinLeaveRecord/export", {staffState: 0}, "浜哄憳绂昏亴.xlsx"); + }) + .catch(() => { + proxy.$modal.msg("宸插彇娑�"); + }); +}; +onMounted(() => { + getList(); +}); </script> <style scoped></style> diff --git a/src/views/personnelManagement/employeeRecord/components/formDia.vue b/src/views/personnelManagement/employeeRecord/components/formDia.vue new file mode 100644 index 0000000..6538273 --- /dev/null +++ b/src/views/personnelManagement/employeeRecord/components/formDia.vue @@ -0,0 +1,73 @@ +<template> + <div> + <el-dialog + v-model="dialogFormVisible" + title="璇︽儏" + width="70%" + @close="closeDia" + > + <PIMTable + rowKey="id" + :column="tableColumn" + :tableData="tableData" + :tableLoading="tableLoading" + height="600" + ></PIMTable> + <template #footer> + <div class="dialog-footer"> + <el-button @click="closeDia">鍙栨秷</el-button> + </div> + </template> + </el-dialog> + </div> +</template> + +<script setup> +import {ref} from "vue"; +import {staffOnJobInfo} from "@/api/personnelManagement/employeeRecord.js"; +const { proxy } = getCurrentInstance() +const emit = defineEmits(['close']) + +const dialogFormVisible = ref(false); +const operationType = ref('') +const tableColumn = ref([ + { + label: "鍚堝悓骞撮檺", + prop: "contractTerm", + }, + { + label: "鍚堝悓寮�濮嬫棩鏈�", + prop: "contractStartTime", + }, + { + label: "鍚堝悓缁撴潫鏃ユ湡", + prop: "contractEndTime", + }, +]); +const tableData = ref([]); +const tableLoading = ref(false); + +// 鎵撳紑寮规 +const openDialog = (type, row) => { + operationType.value = type; + dialogFormVisible.value = true; + if (operationType.value === 'edit') { + staffOnJobInfo({staffNo: row.staffNo}).then(res => { + tableData.value = res.data + }) + } +} + +// 鍏抽棴寮规 +const closeDia = () => { + dialogFormVisible.value = false; + emit('close') +}; +defineExpose({ + openDialog, +}); +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/src/views/personnelManagement/employeeRecord/index.vue b/src/views/personnelManagement/employeeRecord/index.vue new file mode 100644 index 0000000..f1e04db --- /dev/null +++ b/src/views/personnelManagement/employeeRecord/index.vue @@ -0,0 +1,223 @@ +<template> + <div class="app-container"> + <div class="search_form"> + <div> + <span class="search_title">濮撳悕锛�</span> + <el-input + v-model="searchForm.staffName" + style="width: 240px" + placeholder="璇疯緭鍏ュ鍚嶆悳绱�" + @change="handleQuery" + clearable + :prefix-icon="Search" + /> + <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 @click="handleOut">瀵煎嚭</el-button> +<!-- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>--> + </div> + </div> + <div class="table_list"> + <PIMTable + rowKey="id" + :column="tableColumn" + :tableData="tableData" + :page="page" + :isSelection="true" + @selection-change="handleSelectionChange" + :tableLoading="tableLoading" + @pagination="pagination" + :total="page.total" + ></PIMTable> + </div> + <form-dia ref="formDia" @close="handleQuery"></form-dia> + </div> +</template> + +<script setup> +import { Search } from "@element-plus/icons-vue"; +import {onMounted, ref} from "vue"; +import FormDia from "@/views/personnelManagement/employeeRecord/components/formDia.vue"; +import {ElMessageBox} from "element-plus"; +import {staffOnJobListPage} from "@/api/personnelManagement/employeeRecord.js"; + +const data = reactive({ + searchForm: { + staffName: "", + }, +}); +const { searchForm } = toRefs(data); +const tableColumn = ref([ + { + label: "鐘舵��", + prop: "staffState", + dataType: "tag", + formatData: (params) => { + if (params == 0) { + return "绂昏亴"; + } else if (params == 1) { + return "鍦ㄨ亴"; + } else { + return null; + } + }, + formatType: (params) => { + if (params == 0) { + return "danger"; + } else if (params == 1) { + return "primary"; + } else { + return null; + } + }, + }, + { + label: "鍛樺伐缂栧彿", + prop: "staffNo", + }, + { + label: "濮撳悕", + prop: "staffName", + }, + { + label: "鎬у埆", + prop: "sex", + }, + { + label: "绫嶈疮", + prop: "nativePlace", + }, + { + label: "宀椾綅", + prop: "postJob", + }, + { + label: "瀹跺涵浣忓潃", + prop: "adress", + }, + { + label: "绗竴瀛﹀巻", + prop: "firstStudy", + }, + { + label: "涓撲笟", + prop: "profession", + }, + { + label: "韬唤璇佸彿", + prop: "identityCard", + }, + { + label: "骞撮緞", + prop: "age", + }, + { + label: "鑱旂郴鐢佃瘽", + prop: "phone", + }, + { + label: "绱ф�ヨ仈绯讳汉", + prop: "emergencyContact", + width: 120 + }, + { + label: "鑱旂郴鐢佃瘽", + prop: "emergencyContactPhone", + }, + { + label: "鍚堝悓骞撮檺", + prop: "contractTerm", + }, + // { + // label: "鍚堝悓寮�濮嬫棩鏈�", + // prop: "contractStartTime", + // width: 120 + // }, + { + label: "鍚堝悓缁撴潫鏃ユ湡", + prop: "contractExpireTime", + width: 120 + }, + { + dataType: "action", + label: "鎿嶄綔", + align: "center", + fixed: 'right', + operation: [ + { + name: "璇︽儏", + type: "text", + clickFun: (row) => { + openForm("edit", row); + }, + }, + ], + }, +]); +const tableData = ref([]); +const selectedRows = ref([]); +const tableLoading = ref(false); +const page = reactive({ + current: 1, + size: 100, + total: 0 +}); +const formDia = ref() +const { proxy } = getCurrentInstance() + +// 鏌ヨ鍒楄〃 +/** 鎼滅储鎸夐挳鎿嶄綔 */ +const handleQuery = () => { + page.current = 1; + getList(); +}; +const pagination = (obj) => { + page.current = obj.page; + page.size = obj.limit; + getList(); +}; +const getList = () => { + tableLoading.value = true; + staffOnJobListPage({...page, ...searchForm.value, staffState: 1}).then(res => { + tableLoading.value = false; + tableData.value = res.data.records + page.total = res.data.total; + }).catch(err => { + tableLoading.value = false; + }) +}; +// 琛ㄦ牸閫夋嫨鏁版嵁 +const handleSelectionChange = (selection) => { + selectedRows.value = selection; +}; + +// 鎵撳紑寮规 +const openForm = (type, row) => { + nextTick(() => { + formDia.value?.openDialog(type, row) + }) +}; +// 瀵煎嚭 +const handleOut = () => { + ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", { + confirmButtonText: "纭", + cancelButtonText: "鍙栨秷", + type: "warning", + }) + .then(() => { + proxy.download("/staff/staffOnJob/export", {staffState: 1}, "鍦ㄨ亴鍛樺伐鍙拌处.xlsx"); + }) + .catch(() => { + proxy.$modal.msg("宸插彇娑�"); + }); +}; +onMounted(() => { + getList(); +}); +</script> + +<style scoped></style> diff --git a/src/views/personnelManagement/onboarding/components/formDia.vue b/src/views/personnelManagement/onboarding/components/formDia.vue index c8bd008..4a7dd77 100644 --- a/src/views/personnelManagement/onboarding/components/formDia.vue +++ b/src/views/personnelManagement/onboarding/components/formDia.vue @@ -9,97 +9,116 @@ <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="purchaseContractNumber"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="鍛樺伐缂栧彿锛�" prop="staffNo"> + <el-input v-model="form.staffNo" placeholder="璇疯緭鍏�" clearable :disabled="operationType !== 'add'"/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="濮撳悕锛�" prop="salesLedgerId"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="濮撳悕锛�" prop="staffName"> + <el-input v-model="form.staffName" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> - <el-form-item label="鎬у埆锛�" prop="purchaseContractNumber"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="鎬у埆锛�" prop="sex"> + <el-select v-model="form.sex"> + <el-option label="鐢�" value="鐢�" /> + <el-option label="濂�" value="濂�" /> + </el-select> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="绫嶈疮锛�" prop="salesLedgerId"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="绫嶈疮锛�" prop="nativePlace"> + <el-input v-model="form.nativePlace" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> - <el-form-item label="宀椾綅锛�" prop="purchaseContractNumber"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="宀椾綅锛�" prop="postJob"> + <el-input v-model="form.postJob" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="瀹跺涵浣忓潃锛�" prop="salesLedgerId"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="瀹跺涵浣忓潃锛�" prop="adress"> + <el-input v-model="form.adress" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> - <el-form-item label="绗竴瀛﹀巻锛�" prop="purchaseContractNumber"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="绗竴瀛﹀巻锛�" prop="firstStudy"> + <el-input v-model="form.firstStudy" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="涓撲笟锛�" prop="salesLedgerId"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="涓撲笟锛�" prop="profession"> + <el-input v-model="form.profession" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> - <el-form-item label="韬唤璇佸彿锛�" prop="purchaseContractNumber"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="韬唤璇佸彿锛�" prop="identityCard"> + <el-input v-model="form.identityCard" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="骞撮緞锛�" prop="salesLedgerId"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="骞撮緞锛�" prop="age"> + <el-input-number v-model="form.age" :precision="0" :step="1" style="width: 100%"/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> - <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="purchaseContractNumber"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="phone"> + <el-input v-model="form.phone" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="绱ф�ヨ仈绯讳汉锛�" prop="salesLedgerId"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="绱ф�ヨ仈绯讳汉锛�" prop="emergencyContact"> + <el-input v-model="form.emergencyContact" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> - <el-form-item label="绱ф�ヨ仈绯讳汉鑱旂郴鐢佃瘽锛�" prop="purchaseContractNumber"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="绱ф�ヨ仈绯讳汉鑱旂郴鐢佃瘽锛�" prop="emergencyContactPhone"> + <el-input v-model="form.emergencyContactPhone" placeholder="璇疯緭鍏�" clearable/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="鍚堝悓骞撮檺锛�" prop="salesLedgerId"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="鍚堝悓骞撮檺锛�" prop="contractTerm"> + <el-input-number v-model="form.contractTerm" :precision="0" :step="1" style="width: 100%"/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> - <el-form-item label="鍚堝悓寮�濮嬫棩鏈燂細" prop="purchaseContractNumber"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="鍚堝悓寮�濮嬫棩鏈燂細" prop="contractStartTime"> + <el-date-picker + v-model="form.contractStartTime" + type="date" + placeholder="璇烽�夋嫨鏃ユ湡" + value-format="YYYY-MM-DD" + format="YYYY-MM-DD" + clearable + style="width: 100%" + /> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="鍚堝悓缁撴潫鏃ユ湡锛�" prop="salesLedgerId"> - <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/> + <el-form-item label="鍚堝悓缁撴潫鏃ユ湡锛�" prop="contractEndTime"> + <el-date-picker + v-model="form.contractEndTime" + type="date" + placeholder="璇烽�夋嫨鏃ユ湡" + value-format="YYYY-MM-DD" + format="YYYY-MM-DD" + clearable + style="width: 100%" + /> </el-form-item> </el-col> </el-row> @@ -116,45 +135,87 @@ <script setup> import {ref} from "vue"; +import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js"; +const { proxy } = getCurrentInstance() +const emit = defineEmits(['close']) const dialogFormVisible = ref(false); const operationType = ref('') const data = reactive({ - searchForm: { - purchaseContractNumber: "", - }, form: { - purchaseContractNumber: "", - salesLedgerId: "", - projectName: "", - recorderId: "", - entryDate: "", - productData: [], - supplierName: "", - supplierId: "", + staffNo: "", + staffName: "", + sex: "", + nativePlace: "", + postJob: "", + adress: "", + firstStudy: "", + profession: "", + identityCard: "", + age: 0, + phone: "", + emergencyContact: "", + emergencyContactPhone: "", + contractTerm: 0, + contractStartTime: "", + contractEndTime: "", + staffState: "", }, rules: { - purchaseContractNumber: [ - { required: true, message: "璇疯緭鍏�", trigger: "blur" }, - ], - projectName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], - supplierId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + staffNo: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },], + staffName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + sex: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + nativePlace: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + postJob: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + adress: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + firstStudy: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + profession: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + identityCard: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + age: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + phone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + emergencyContact: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + emergencyContactPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + contractTerm: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + contractStartTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + contractEndTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], }, }); const { form, rules } = toRefs(data); // 鎵撳紑寮规 const openDialog = (type, row) => { + operationType.value = type; dialogFormVisible.value = true; + if (operationType.value === 'edit') { + getStaffJoinInfo(row.id).then(res => { + form.value = {...res.data} + }) + } } // 鎻愪氦浜у搧琛ㄥ崟 const submitForm = () => { - + proxy.$refs.formRef.validate(valid => { + if (valid) { + form.value.staffState = 1 + if (operationType.value === "add") { + staffJoinAdd(form.value).then(res => { + proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); + closeDia(); + }) + } else { + staffJoinUpdate(form.value).then(res => { + proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); + closeDia(); + }) + } + } + }) } // 鍏抽棴寮规 const closeDia = () => { - // proxy.resetForm("formRef"); + proxy.resetForm("formRef"); dialogFormVisible.value = false; + emit('close') }; defineExpose({ openDialog, diff --git a/src/views/personnelManagement/onboarding/index.vue b/src/views/personnelManagement/onboarding/index.vue index 2ad1e89..f7ddc71 100644 --- a/src/views/personnelManagement/onboarding/index.vue +++ b/src/views/personnelManagement/onboarding/index.vue @@ -4,9 +4,9 @@ <div> <span class="search_title">濮撳悕锛�</span> <el-input - v-model="searchForm.customerName" + v-model="searchForm.staffName" style="width: 240px" - placeholder="璇疯緭鍏ュ悕绉版悳绱�" + placeholder="璇疯緭鍏ュ鍚嶆悳绱�" @change="handleQuery" clearable :prefix-icon="Search" @@ -17,6 +17,8 @@ </div> <div> <el-button type="primary" @click="openForm('add')">鏂板鍏ヨ亴</el-button> + <el-button @click="handleOut">瀵煎嚭</el-button> + <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button> </div> </div> <div class="table_list"> @@ -29,53 +31,45 @@ @selection-change="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination" - :total="total" + :total="page.total" ></PIMTable> </div> - <form-dia ref="formDia"></form-dia> + <form-dia ref="formDia" @close="handleQuery"></form-dia> </div> </template> <script setup> import { Search } from "@element-plus/icons-vue"; -import { ref } from "vue"; +import {onMounted, ref} from "vue"; import FormDia from "@/views/personnelManagement/onboarding/components/formDia.vue"; +import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js"; +import {ElMessageBox} from "element-plus"; const data = reactive({ searchForm: { - customerName: "", - }, - form: { - salesLedgerId: "", - customerName: "", - salesman: "", - projectName: "", - productData: [], - }, - rules: { - salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }], + staffName: "", }, }); -const { searchForm, form, rules } = toRefs(data); +const { searchForm } = toRefs(data); const tableColumn = ref([ { label: "鐘舵��", - prop: "paymentDate", + prop: "staffState", dataType: "tag", formatData: (params) => { if (params == 0) { - return "鍦ㄨ亴"; - } else if (params == 1) { return "绂昏亴"; + } else if (params == 1) { + return "鍏ヨ亴"; } else { return null; } }, formatType: (params) => { if (params == 0) { - return "primary"; - } else if (params == 1) { return "danger"; + } else if (params == 1) { + return "primary"; } else { return null; } @@ -83,67 +77,85 @@ }, { label: "鍛樺伐缂栧彿", - prop: "supplierName", + prop: "staffNo", }, { label: "濮撳悕", - prop: "currentPaymentAmount", + prop: "staffName", }, { label: "鎬у埆", - prop: "paymentMethod", + prop: "sex", }, { label: "绫嶈疮", - prop: "registrant", + prop: "nativePlace", }, { label: "宀椾綅", - prop: "registrationtDate", + prop: "postJob", }, { label: "瀹跺涵浣忓潃", - prop: "registrationtDate", + prop: "adress", }, { label: "绗竴瀛﹀巻", - prop: "registrationtDate", + prop: "firstStudy", }, { label: "涓撲笟", - prop: "registrationtDate", + prop: "profession", }, { label: "韬唤璇佸彿", - prop: "registrationtDate", + prop: "identityCard", }, { label: "骞撮緞", - prop: "registrationtDate", + prop: "age", }, { label: "鑱旂郴鐢佃瘽", - prop: "registrationtDate", + prop: "phone", }, { label: "绱ф�ヨ仈绯讳汉", - prop: "registrationtDate", + prop: "emergencyContact", + width: 120 }, { label: "鑱旂郴鐢佃瘽", - prop: "registrationtDate", + prop: "emergencyContactPhone", }, { label: "鍚堝悓骞撮檺", - prop: "registrationtDate", + prop: "contractTerm", }, { label: "鍚堝悓寮�濮嬫棩鏈�", - prop: "registrationtDate", + prop: "contractStartTime", + width: 120 }, { label: "鍚堝悓缁撴潫鏃ユ湡", - prop: "registrationtDate", + prop: "contractEndTime", + width: 120 + }, + { + dataType: "action", + label: "鎿嶄綔", + align: "center", + fixed: 'right', + operation: [ + { + name: "缂栬緫", + type: "text", + clickFun: (row) => { + openForm("edit", row); + }, + }, + ], }, ]); const tableData = ref([]); @@ -152,8 +164,8 @@ const page = reactive({ current: 1, size: 100, + total: 0, }); -const total = ref(0); const formDia = ref() const { proxy } = getCurrentInstance() @@ -170,14 +182,17 @@ }; const getList = () => { tableLoading.value = true; - + staffJoinListPage({...page, ...searchForm.value, staffState: 1}).then(res => { + tableLoading.value = false; + tableData.value = res.data.records + page.total = res.data.total; + }).catch(err => { + tableLoading.value = false; + }) }; // 琛ㄦ牸閫夋嫨鏁版嵁 const handleSelectionChange = (selection) => { - console.log("selection", selection); - selectedRows.value = selection.filter( - (item) => item.salesContractNo !== undefined - ); + selectedRows.value = selection; }; // 鎵撳紑寮规 @@ -186,6 +201,48 @@ formDia.value?.openDialog(type, row) }) }; + +// 鍒犻櫎 +const handleDelete = () => { + let ids = []; + if (selectedRows.value.length > 0) { + ids = selectedRows.value.map((item) => item.id); + } else { + proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁"); + return; + } + ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", { + confirmButtonText: "纭", + cancelButtonText: "鍙栨秷", + type: "warning", + }) + .then(() => { + staffJoinDel(ids).then((res) => { + proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + getList(); + }); + }) + .catch(() => { + proxy.$modal.msg("宸插彇娑�"); + }); +}; +// 瀵煎嚭 +const handleOut = () => { + ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", { + confirmButtonText: "纭", + cancelButtonText: "鍙栨秷", + type: "warning", + }) + .then(() => { + proxy.download("/staff/staffJoinLeaveRecord/export", {staffState: 1}, "浜哄憳鍏ヨ亴.xlsx"); + }) + .catch(() => { + proxy.$modal.msg("宸插彇娑�"); + }); +}; +onMounted(() => { + getList(); +}); </script> <style scoped></style> diff --git a/src/views/procurementManagement/invoiceEntry/components/Modal.vue b/src/views/procurementManagement/invoiceEntry/components/Modal.vue index 7e38af6..3296bb3 100644 --- a/src/views/procurementManagement/invoiceEntry/components/Modal.vue +++ b/src/views/procurementManagement/invoiceEntry/components/Modal.vue @@ -1,12 +1,6 @@ <template> <el-dialog :title="modalOptions.title" v-model="visible" width="70%"> - <el-form - ref="formRef" - :model="form" - :rules="rules" - label-width="120px" - label-position="top" - > + <el-form ref="formRef" :model="form" :rules="rules" label-width="120px" label-position="top"> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseLedgerNo"> @@ -15,131 +9,61 @@ </el-col> <el-col :span="12"> <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo"> - <el-input - v-model="form.salesContractNo" - placeholder="鑷姩濉厖" - clearable - disabled - /> + <el-input v-model="form.salesContractNo" placeholder="鑷姩濉厖" clearable disabled /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName"> - <el-input - v-model="form.supplierName" - placeholder="鑷姩濉厖" - clearable - disabled - /> + <el-input v-model="form.supplierName" placeholder="鑷姩濉厖" clearable disabled /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName"> - <el-input - v-model="form.projectName" - placeholder="鑷姩濉厖" - clearable - disabled - /> + <el-input v-model="form.projectName" placeholder="鑷姩濉厖" clearable disabled /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber"> - <el-input - v-model="form.invoiceNumber" - placeholder="璇疯緭鍏�" - clearable - /> + <el-input v-model="form.invoiceNumber" placeholder="璇疯緭鍏�" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount"> - <el-input - type="number" - :step="0.01" - :min="0" - v-model="form.invoiceAmount" - placeholder="鑷姩濉厖" - clearable - :disabled="true" - /> + <el-input type="number" :step="0.01" :min="0" v-model="form.invoiceAmount" placeholder="鑷姩濉厖" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="褰曞叆浜猴細" prop="issUer"> - <el-input - v-model="form.issUer" - placeholder="璇疯緭鍏�" - clearable - disabled - /> + <el-input v-model="form.issUer" placeholder="璇疯緭鍏�" clearable disabled /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="entryDate"> - <el-date-picker - style="width: 100%" - v-model="form.entryDate" - type="date" - clearable - /> + <el-date-picker style="width: 100%" v-model="form.entryDate" type="date" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="涓婁紶闄勪欢"> - <FileUpload - :showTip="false" - accept="*" - :autoUpload="true" - :action="action" - :headers="{ - Authorization: 'Bearer ' + getToken(), - }" - :limit="10" - @success="uploadSuccess" - @remove="removeFile" - /> + <FileUpload :showTip="false" accept="*" :autoUpload="true" :action="action" :headers="{ + Authorization: 'Bearer ' + getToken(), + }" :limit="10" @success="uploadSuccess" @remove="removeFile" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="褰曞叆鏃ユ湡锛�" prop="enterDate"> - <el-date-picker - style="width: 100%" - v-model="form.enterDate" - type="date" - clearable - /> + <el-date-picker style="width: 100%" v-model="form.enterDate" type="date" clearable /> </el-form-item> </el-col> </el-row> <el-form-item label="浜у搧淇℃伅锛�"> </el-form-item> - <PIMTable - rowKey="id" - :column="columns" - :tableData="form.productData" - height="auto" - > + <PIMTable rowKey="id" :column="columns" :tableData="form.productData" height="auto"> <template #ticketsNumRef="{ row }"> - <el-input-number - v-model="row.ticketsNum" - placeholder="璇烽�夋嫨" - :min="0" - :step="0.1" - clearable - style="width: 100%" - @change="invoiceNumBlur(row)" - /> + <el-input-number v-model="row.ticketsNum" placeholder="璇烽�夋嫨" :min="0" :step="0.1" clearable style="width: 100%" + @change="invoiceNumBlur(row)" /> </template> <template #ticketsAmountRef="{ row }"> - <el-input-number - v-model="row.ticketsAmount" - placeholder="璇烽�夋嫨" - :min="0" - :step="0.1" - clearable - style="width: 100%" - @change="invoiceAmountBlur(row)" - /> + <el-input-number v-model="row.ticketsAmount" placeholder="璇烽�夋嫨" :min="0" :step="0.1" clearable + style="width: 100%" @change="invoiceAmountBlur(row)" /> </template> </PIMTable> </el-form> @@ -412,6 +336,8 @@ if (code == 200) { closeModal(); } + } else { + modalLoading.value = false; } }); }; diff --git a/src/views/qualityManagement/metricMaintenance/index.vue b/src/views/qualityManagement/metricMaintenance/index.vue new file mode 100644 index 0000000..1c2b207 --- /dev/null +++ b/src/views/qualityManagement/metricMaintenance/index.vue @@ -0,0 +1,310 @@ +<template> + <div class="app-container product-view"> + <div class="left"> + <div> + <el-input + v-model="search" + style="width: 210px" + placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�" + @change="searchFilter" + @clear="searchFilter" + clearable + prefix-icon="Search" + /> + </div> + <div ref="containerRef"> + <el-tree + ref="tree" + v-loading="treeLoad" + :data="list" + @node-click="handleNodeClick" + :expand-on-click-node="false" + default-expand-all + :default-expanded-keys="expandedKeys" + :draggable="true" + :filter-node-method="filterNode" + :props="{ children: 'children', label: 'label' }" + highlight-current + node-key="id" + style=" + height: calc(100vh - 190px); + overflow-y: scroll; + scrollbar-width: none; + " + > + <template #default="{ node, data }"> + <div class="custom-tree-node"> + <span class="tree-node-content"> + <el-icon class="orange-icon"> + <component :is="data.children && data.children.length > 0 + ? node.expanded ? 'FolderOpened' : 'Folder' : 'Tickets'" /> + </el-icon> + {{ data.label }} + </span> + </div> + </template> + </el-tree> + </div> + </div> + <div class="right"> + <div style="margin-bottom: 10px"> + <el-button type="primary" @click="openModelDia('add')"> + 鏂板妫�娴嬫寚鏍� + </el-button> + <ImportExcel @uploadSuccess="getModelList" /> + <el-button + type="danger" + @click="handleDelete" + style="margin-left: 10px" + plain + > + 鍒犻櫎 + </el-button> + </div> + <PIMTable + rowKey="id" + :column="tableColumn" + :tableData="tableData" + :page="page" + :isSelection="true" + @selection-change="handleSelectionChange" + :tableLoading="tableLoading" + @pagination="pagination" + :total="total" + ></PIMTable> + </div> + </div> +</template> + +<script setup> +import {ref} from "vue"; +import {delProductModel, modelListPage, productTreeList} from "@/api/basicData/product.js"; +import ImportExcel from "@/views/basicData/product/ImportExcel/index.vue"; +import {ElMessageBox} from "element-plus"; + +// 鏍� +const search = ref(""); +const treeLoad = ref(false); +const list = ref([]); +const expandedKeys = ref([]); +const currentId = ref(""); +const currentParentId = ref(""); +// 鎸囨爣琛ㄦ牸 +const tableData = ref([]); +const tableLoading = ref(false); +const total = ref(0); +const page = reactive({ + current: 1, + size: 10, +}); +const tableColumn = ref([ + { + label: "瑙勬牸鍨嬪彿", + prop: "model", + }, + { + label: "鍗曚綅", + prop: "unit", + }, + { + label: "鏍囧噯鍊�", + prop: "unit", + }, + { + label: "鍐呮帶鍊�", + prop: "unit", + }, + { + dataType: "action", + label: "鎿嶄綔", + align: "center", + operation: [ + { + name: "缂栬緫", + type: "text", + clickFun: (row) => { + openModelDia("edit", row); + }, + }, + ], + }, +]); +// 鎸囨爣寮规 +const modelDia = ref(false); +const modelOperationType = ref(""); +const data = reactive({ + form: { + productName: "", + }, + rules: { + productName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + }, + modelForm: { + model: "", + unit: "", + }, + modelRules: { + model: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + }, +}); +const { form, rules, modelForm, modelRules } = toRefs(data); + +// 鏌ヨ浜у搧鏍� +const getProductTreeList = () => { + treeLoad.value = true; + productTreeList() + .then((res) => { + list.value = res; + list.value.forEach((a) => { + expandedKeys.value.push(a.label); + }); + treeLoad.value = false; + }) + .catch((err) => { + treeLoad.value = false; + }); +}; +// 杩囨护浜у搧鏍� +const searchFilter = () => { + proxy.$refs.tree.filter(search.value); +}; +// 閫夋嫨浜у搧 +const handleNodeClick = (val, node, el) => { + // 鍙湁鍙跺瓙鑺傜偣鎵嶆墽琛屼互涓嬮�昏緫 + currentId.value = val.id; + currentParentId.value = val.parentId; + getModelList(); +}; +// 琛ㄦ牸閫夋嫨鏁版嵁 +const handleSelectionChange = (selection) => { + selectedRows.value = selection; +}; +// 鏌ヨ鎸囨爣鏁版嵁 +const pagination = (obj) => { + page.current = obj.page; + page.size = obj.limit; + getModelList(); +}; +const getModelList = () => { + tableLoading.value = true; + modelListPage({ + id: currentId.value, + current: page.current, + size: page.size, + }).then((res) => { + console.log("res", res); + tableData.value = res.records; + total.value = res.total; + tableLoading.value = false; + }); +}; +// 璋冪敤tree杩囨护鏂规硶 涓枃鑻辫繃婊� +const filterNode = (value, data, node) => { + if (!value) { + //濡傛灉鏁版嵁涓虹┖锛屽垯杩斿洖true,鏄剧ず鎵�鏈夌殑鏁版嵁椤� + return true; + } + // 鏌ヨ鍒楄〃鏄惁鏈夊尮閰嶆暟鎹紝灏嗗�煎皬鍐欙紝鍖归厤鑻辨枃鏁版嵁 + let val = value.toLowerCase(); + return chooseNode(val, data, node); // 璋冪敤杩囨护浜屽眰鏂规硶 +}; +// 杩囨护鐖惰妭鐐� / 瀛愯妭鐐� (濡傛灉杈撳叆鐨勫弬鏁版槸鐖惰妭鐐逛笖鑳藉尮閰嶏紝鍒欒繑鍥炶鑺傜偣浠ュ強鍏朵笅鐨勬墍鏈夊瓙鑺傜偣锛涘鏋滃弬鏁版槸瀛愯妭鐐癸紝鍒欒繑鍥炶鑺傜偣鐨勭埗鑺傜偣銆俷ame鏄腑鏂囧瓧绗︼紝enName鏄嫳鏂囧瓧绗�. +const chooseNode = (value, data, node) => { + if (data.label.indexOf(value) !== -1) { + return true; + } + const level = node.level; + // 濡傛灉浼犲叆鐨勮妭鐐规湰韬氨鏄竴绾ц妭鐐瑰氨涓嶇敤鏍¢獙浜� + if (level === 1) { + return false; + } + // 鍏堝彇褰撳墠鑺傜偣鐨勭埗鑺傜偣 + let parentData = node.parent; + // 閬嶅巻褰撳墠鑺傜偣鐨勭埗鑺傜偣 + let index = 0; + while (index < level - 1) { + // 濡傛灉鍖归厤鍒扮洿鎺ヨ繑鍥烇紝姝ゅname鍊兼槸涓枃瀛楃锛宔nName鏄嫳鏂囧瓧绗︺�傚垽鏂尮閰嶄腑鑻辨枃杩囨护 + if (parentData.data.label.indexOf(value) !== -1) { + return true; + } + // 鍚﹀垯鐨勮瘽鍐嶅線涓婁竴灞傚仛鍖归厤 + parentData = parentData.parent; + index++; + } + // 娌″尮閰嶅埌杩斿洖false + return false; +}; +// 鎵撳紑鎸囨爣寮规 +const openModelDia = (type, data) => { + modelOperationType.value = type; + modelDia.value = true; + modelForm.value.model = ""; + modelForm.value.model = ""; + modelForm.value.id = ""; + if (type === "edit") { + modelForm.value = { ...data }; + } +}; +// 鍒犻櫎鎸囨爣 +const handleDelete = () => { + let ids = []; + if (selectedRows.value.length > 0) { + ids = selectedRows.value.map((item) => item.id); + } else { + proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁"); + return; + } + ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", { + confirmButtonText: "纭", + cancelButtonText: "鍙栨秷", + type: "warning", + }).then(() => { + tableLoading.value = true; + delProductModel(ids).then((res) => { + proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + getModelList(); + }).finally(() => { + tableLoading.value = false; + }); + }).catch(() => { + proxy.$modal.msg("宸插彇娑�"); + }); +}; +getProductTreeList(); +</script> + +<style scoped> +.product-view { + display: flex; +} +.left { + width: 380px; + padding: 16px; + background: #ffffff; +} +.right { + width: calc(100% - 380px); + padding: 16px; + margin-left: 20px; + background: #ffffff; +} +.custom-tree-node { + flex: 1; + display: flex; + align-items: center; + justify-content: space-between; + font-size: 14px; + padding-right: 8px; +} +.tree-node-content { + display: flex; + align-items: center; /* 鍨傜洿灞呬腑 */ + height: 100%; +} +.orange-icon { + color: orange; + font-size: 18px; + margin-right: 8px; /* 鍥炬爣涓庢枃瀛椾箣闂村姞鐐归棿璺� */ +} +</style> \ No newline at end of file diff --git a/src/views/salesManagement/invoiceLedger/index.vue b/src/views/salesManagement/invoiceLedger/index.vue index 194b86c..e54abf1 100644 --- a/src/views/salesManagement/invoiceLedger/index.vue +++ b/src/views/salesManagement/invoiceLedger/index.vue @@ -3,40 +3,17 @@ <div class="search_form"> <el-form :inline="true" :model="searchForm"> <el-form-item label="瀹㈡埛鍚嶇О/鍚堝悓鍙�"> - <el-input - v-model="searchForm.searchText" - style="width: 240px" - placeholder="杈撳叆瀹㈡埛鍚嶇О/鍚堝悓鍙锋悳绱�" - @change="handleQuery" - clearable - :prefix-icon="Search" - /> + <el-input v-model="searchForm.searchText" style="width: 240px" placeholder="杈撳叆瀹㈡埛鍚嶇О/鍚堝悓鍙锋悳绱�" + @change="handleQuery" clearable :prefix-icon="Search" /> </el-form-item> <el-form-item label="寮�绁ㄦ棩鏈�"> - <el-date-picker - style="width: 240px" - v-model="searchForm.invoiceDate" - value-format="YYYY-MM-DD" - format="YYYY-MM-DD" - type="daterange" - start-placeholder="寮�濮嬫椂闂�" - end-placeholder="缁撴潫鏃堕棿" - clearable - @change="changeDateRange" - @clear="clearRange" - /> + <el-date-picker style="width: 240px" v-model="searchForm.invoiceDate" value-format="YYYY-MM-DD" + format="YYYY-MM-DD" type="daterange" start-placeholder="寮�濮嬫椂闂�" end-placeholder="缁撴潫鏃堕棿" clearable + @change="changeDateRange" @clear="clearRange" /> </el-form-item> <el-form-item label="褰曞叆鏃ユ湡"> - <el-date-picker - style="width: 100%" - v-model="searchForm.createTimeStart" - value-format="YYYY-MM-DD HH:mm:ss" - format="YYYY-MM-DD" - type="date" - placeholder="璇烽�夋嫨" - clearable - @change="handleQuery" - /> + <el-date-picker style="width: 100%" v-model="searchForm.createTimeStart" value-format="YYYY-MM-DD HH:mm:ss" + format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable @change="handleQuery" /> </el-form-item> <el-form-item label="涓嶆樉绀烘湁鍙戠エ琛�"> <el-checkbox v-model="searchForm.status" @change="handleQuery" /> @@ -49,143 +26,46 @@ </el-form> </div> <div class="table_list"> - <el-table - :data="tableData" - border - v-loading="tableLoading" - @selection-change="handleSelectionChange" - :row-key="(row) => row.id" - show-summary - :summary-method="summarizeMainTable" - height="calc(100vh - 18.5em)" - > + <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" + :row-key="(row) => row.id" show-summary :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="salesContractNo" - show-overflow-tooltip - width="180" - /> - <el-table-column - label="瀹㈡埛鍚堝悓鍙�" - prop="customerContractNo" - show-overflow-tooltip - width="180" - /> - <el-table-column - label="瀹㈡埛鍚嶇О" - prop="customerName" - show-overflow-tooltip - width="240" - /> - <el-table-column label="椤圭洰" prop="projectName" width="150" /> - <el-table-column label="浜у搧澶х被" prop="productCategory" /> - <el-table-column - label="瑙勬牸鍨嬪彿" - prop="specificationModel" - width="300" - show-overflow-tooltip - /> - <el-table-column - label="鍙戠エ鍙�" - prop="invoiceNo" - show-overflow-tooltip - /> - <el-table-column - label="鍙戠エ閲戦(鍏�)" - prop="invoiceTotal" - show-overflow-tooltip - :formatter="formattedNumber" - width="120" - /> + <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip width="180" /> + <el-table-column label="瀹㈡埛鍚堝悓鍙�" prop="customerContractNo" show-overflow-tooltip width="180" /> + <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" show-overflow-tooltip width="240" /> + <el-table-column label="椤圭洰" prop="projectName" width="200" /> + <el-table-column label="浜у搧澶х被" prop="productCategory" width="200" /> + <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="300" show-overflow-tooltip /> + <el-table-column label="鍙戠エ鍙�" prop="invoiceNo" width="200" show-overflow-tooltip /> + <el-table-column label="鍙戠エ閲戦(鍏�)" prop="invoiceTotal" show-overflow-tooltip :formatter="formattedNumber" + width="120" /> <el-table-column label="绋庣巼(%)" prop="taxRate" show-overflow-tooltip /> - <el-table-column - label="褰曞叆浜�" - prop="invoicePerson" - show-overflow-tooltip - /> - <el-table-column - label="褰曞叆鏃ユ湡" - prop="createTime" - show-overflow-tooltip - :formatter="formatDate" - width="180" - /> - <el-table-column - label="寮�绁ㄦ棩鏈�" - prop="invoiceDate" - show-overflow-tooltip - width="120" - /> - <el-table-column - label="鍙戠エ" - prop="invoiceFileName" - width="120" - align="center" - show-overflow-tooltip - > + <el-table-column label="褰曞叆浜�" prop="invoicePerson" show-overflow-tooltip /> + <el-table-column label="褰曞叆鏃ユ湡" prop="createTime" show-overflow-tooltip :formatter="formatDate" width="180" /> + <el-table-column label="寮�绁ㄦ棩鏈�" prop="invoiceDate" show-overflow-tooltip width="120" /> + <el-table-column label="鍙戠エ" prop="invoiceFileName" width="120" align="center" show-overflow-tooltip> <template #default="scope"> - <el-button - v-if="scope.row.invoiceFileName" - text - bg - type="primary" - @click="handleFile(scope.row.commonFiles)" - > + <el-button v-if="scope.row.invoiceFileName" text bg type="primary" + @click="handleFile(scope.row.commonFiles)"> 鏌ョ湅闄勪欢 </el-button> - <el-button - v-else - link - type="primary" - @click="handleDownload(scope.row)" - > + <el-button v-else link type="primary" @click="handleDownload(scope.row)"> 涓婁紶 </el-button> </template> </el-table-column> <el-table-column fixed="right" label="鎿嶄綔" width="150" align="center"> <template #default="scope"> - <el-button - link - type="primary" - size="small" - @click="openForm(scope.row)" - >缂栬緫</el-button - > - <el-button - link - type="primary" - size="small" - @click="delInvoiceLedger(scope.row)" - >鍒犻櫎</el-button - > + <el-button link type="primary" size="small" @click="openForm(scope.row)">缂栬緫</el-button> + <el-button link type="primary" size="small" @click="delInvoiceLedger(scope.row)">鍒犻櫎</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" - /> + <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="寮�绁ㄥ彴璐﹂〉闈�" - width="70%" - @close="closeDia" - > - <el-form - :model="form" - label-width="140px" - label-position="top" - :rules="rules" - ref="formRef" - > + <el-dialog v-model="dialogFormVisible" title="寮�绁ㄥ彴璐﹂〉闈�" 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="salesContractNo"> @@ -194,79 +74,41 @@ </el-col> <el-col :span="12"> <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName"> - <el-input - v-model="form.customerName" - placeholder="鑷姩濉厖" - clearable - disabled - /> + <el-input v-model="form.customerName" placeholder="鑷姩濉厖" clearable disabled /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNo"> - <el-input - v-model="form.invoiceNo" - placeholder="璇疯緭鍏�" - clearable - /> + <el-input v-model="form.invoiceNo" placeholder="璇疯緭鍏�" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceTotal"> - <el-input - type="number" - :step="0.01" - v-model="form.invoiceTotal" - placeholder="璇疯緭鍏�" - clearable - /> + <el-input type="number" :step="0.01" v-model="form.invoiceTotal" placeholder="璇疯緭鍏�" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="寮�绁ㄤ汉锛�" prop="invoicePerson"> - <el-input - v-model="form.invoicePerson" - placeholder="璇疯緭鍏�" - clearable - disabled - /> + <el-input v-model="form.invoicePerson" placeholder="璇疯緭鍏�" clearable disabled /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="invoiceDate"> - <el-date-picker - style="width: 100%" - v-model="form.invoiceDate" - value-format="YYYY-MM-DD" - format="YYYY-MM-DD" - type="date" - placeholder="璇烽�夋嫨" - clearable - /> + <el-date-picker style="width: 100%" v-model="form.invoiceDate" value-format="YYYY-MM-DD" + format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark"> - <el-upload - v-model:file-list="fileList" - :action="upload.url" - multiple - ref="fileUpload" - auto-upload - :headers="upload.headers" - accept=".pdf" - :limit="1" - :before-upload="handleBeforeUpload" - :on-error="handleUploadError" - :on-success="handleUploadSuccess" - :on-remove="handleRemove" - > + <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload + :headers="upload.headers" accept=".pdf" :limit="10" :before-upload="handleBeforeUpload" + :on-error="handleUploadError" :on-success="handleUploadSuccess" :on-remove="handleRemove"> <el-button type="primary">涓婁紶</el-button> <template #tip> <!-- 鏂囦欢鏍煎紡鏀寔 doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z--> @@ -288,22 +130,10 @@ <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark"> - <el-upload - v-model:file-list="fileList" - :action="upload.url" - multiple - ref="fileUpload" - auto-upload - :headers="upload.headers" - accept=".pdf" - :limit="1" - style="width: 100%" - :on-exceed="handleExceed" - :before-upload="handleBeforeUpload" - :on-error="handleUploadError" - :on-success="handleUploadSuccess" - :on-remove="handleRemove" - > + <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload + :headers="upload.headers" accept=".pdf" :limit="10" style="width: 100%" :on-exceed="handleExceed" + :before-upload="handleBeforeUpload" :on-error="handleUploadError" :on-success="handleUploadSuccess" + :on-remove="handleRemove"> <el-button type="primary">涓婁紶</el-button> <template #tip> <div class="el-upload__tip">鏂囦欢鏍煎紡浠呮敮鎸� pdf</div> diff --git a/src/views/salesManagement/salesLedger/fileList.vue b/src/views/salesManagement/salesLedger/fileList.vue new file mode 100644 index 0000000..d1c0cdd --- /dev/null +++ b/src/views/salesManagement/salesLedger/fileList.vue @@ -0,0 +1,36 @@ +<template> + <el-dialog v-model="dialogVisible" title="闄勪欢" width="30%" :before-close="handleClose"> + <el-table :data="tableData" border height="40vh"> + <el-table-column label="闄勪欢鍚嶇О" prop="name" min-width="400" show-overflow-tooltip /> + <el-table-column fixed="right" label="鎿嶄綔" width="100" align="center"> + <template #default="scope"> + <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">涓嬭浇</el-button> + </template> + </el-table-column> + </el-table> + </el-dialog> +</template> + +<script setup> +import { ref } from 'vue' + +const dialogVisible = ref(false) +const tableData = ref([]) +const { proxy } = getCurrentInstance(); +const handleClose = () => { + dialogVisible.value = false +} +const open = (list) => { + dialogVisible.value = true + tableData.value = list +} +const downLoadFile = (row) => { + proxy.$download.name(row.url); + +} +defineExpose({ + open +}) +</script> + +<style></style> \ No newline at end of file diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue index 7ed2f28..893c02b 100644 --- a/src/views/salesManagement/salesLedger/index.vue +++ b/src/views/salesManagement/salesLedger/index.vue @@ -3,51 +3,24 @@ <div class="search_form"> <el-form :model="searchForm" :inline="true"> <el-form-item label="瀹㈡埛鍚嶇О锛�"> - <el-input - v-model="searchForm.customerContractNo" - placeholder="璇疯緭鍏�" - clearable - prefix-icon="Search" - @change="handleQuery" - /> + <el-input v-model="searchForm.customerContractNo" placeholder="璇疯緭鍏�" clearable prefix-icon="Search" + @change="handleQuery" /> </el-form-item> <el-form-item label="瀹㈡埛鍚堝悓鍙凤細"> - <el-input - v-model="searchForm.customerContractNo" - placeholder="璇疯緭鍏�" - clearable - prefix-icon="Search" - @change="handleQuery" - /> + <el-input v-model="searchForm.customerContractNo" placeholder="璇疯緭鍏�" clearable prefix-icon="Search" + @change="handleQuery" /> </el-form-item> <el-form-item label="閿�鍞悎鍚屽彿锛�"> - <el-input - v-model="searchForm.salesContractNo" - placeholder="璇疯緭鍏�" - clearable - prefix-icon="Search" - @change="handleQuery" - /> + <el-input v-model="searchForm.salesContractNo" placeholder="璇疯緭鍏�" clearable prefix-icon="Search" + @change="handleQuery" /> </el-form-item> <el-form-item label="椤圭洰鍚嶇О锛�"> - <el-input - v-model="searchForm.projectName" - placeholder="璇疯緭鍏�" - clearable - prefix-icon="Search" - @change="handleQuery" - /> + <el-input v-model="searchForm.projectName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search" + @change="handleQuery" /> </el-form-item> <el-form-item label="褰曞叆鏃ユ湡锛�"> - <el-date-picker - v-model="searchForm.entryDate" - value-format="YYYY-MM-DD" - format="YYYY-MM-DD" - type="daterange" - placeholder="璇烽�夋嫨" - clearable - @change="changeDaterange" - /> + <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange" + placeholder="璇烽�夋嫨" clearable @change="changeDaterange" /> </el-form-item> <el-form-item> <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button> @@ -65,177 +38,61 @@ <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button> </div> </div> - <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" - @expand-change="expandChange" - height="calc(100vh - 18.5em)" - > + <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" @expand-change="expandChange" height="calc(100vh - 18.5em)"> <el-table-column align="center" type="selection" width="55" /> <el-table-column type="expand"> <template #default="props"> - <el-table - :data="props.row.children" - border - show-summary - :summary-method="summarizeChildrenTable" - > - <el-table-column - align="center" - label="搴忓彿" - type="index" - width="60" - /> + <el-table :data="props.row.children" border show-summary :summary-method="summarizeChildrenTable"> + <el-table-column align="center" label="搴忓彿" type="index" width="60" /> <el-table-column label="浜у搧澶х被" prop="productCategory" /> <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" /> <el-table-column label="鍗曚綅" prop="unit" /> <el-table-column label="鏁伴噺" prop="quantity" /> <el-table-column label="绋庣巼(%)" prop="taxRate" /> - <el-table-column - label="鍚◣鍗曚环(鍏�)" - prop="taxInclusiveUnitPrice" - :formatter="formattedNumber" - /> - <el-table-column - label="鍚◣鎬讳环(鍏�)" - prop="taxInclusiveTotalPrice" - :formatter="formattedNumber" - /> - <el-table-column - label="涓嶅惈绋庢�讳环(鍏�)" - prop="taxExclusiveTotalPrice" - :formatter="formattedNumber" - /> + <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" /> + <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" /> + <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" /> </el-table> </template> </el-table-column> <el-table-column align="center" label="搴忓彿" type="index" width="60" /> - <el-table-column - label="閿�鍞悎鍚屽彿" - prop="salesContractNo" - width="180" - show-overflow-tooltip - /> - <el-table-column - label="瀹㈡埛鍚堝悓鍙�" - prop="customerContractNo" - width="180" - show-overflow-tooltip - /> - <el-table-column - label="瀹㈡埛鍚嶇О" - prop="customerName" - width="300" - show-overflow-tooltip - /> - <el-table-column - label="涓氬姟鍛�" - prop="salesman" - width="100" - show-overflow-tooltip - /> - <el-table-column - label="椤圭洰鍚嶇О" - prop="projectName" - width="180" - show-overflow-tooltip - /> - <el-table-column - label="浠樻鏂瑰紡" - prop="paymentMethod" - show-overflow-tooltip - /> - <el-table-column - label="鍚堝悓閲戦(鍏�)" - prop="contractAmount" - width="180" - show-overflow-tooltip - :formatter="formattedNumber" - /> - <el-table-column - label="褰曞叆浜�" - prop="entryPersonName" - width="100" - show-overflow-tooltip - /> - <el-table-column - label="褰曞叆鏃ユ湡" - prop="entryDate" - width="120" - show-overflow-tooltip - /> - <el-table-column - label="绛捐鏃ユ湡" - prop="executionDate" - width="120" - show-overflow-tooltip - /> - <el-table-column - fixed="right" - label="鎿嶄綔" - min-width="60" - align="center" - > + <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" width="180" show-overflow-tooltip /> + <el-table-column label="瀹㈡埛鍚堝悓鍙�" prop="customerContractNo" width="180" show-overflow-tooltip /> + <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" width="300" show-overflow-tooltip /> + <el-table-column label="涓氬姟鍛�" prop="salesman" width="100" show-overflow-tooltip /> + <el-table-column label="椤圭洰鍚嶇О" prop="projectName" width="180" show-overflow-tooltip /> + <el-table-column label="浠樻鏂瑰紡" prop="paymentMethod" show-overflow-tooltip /> + <el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" width="180" show-overflow-tooltip + :formatter="formattedNumber" /> + <el-table-column label="褰曞叆浜�" prop="entryPersonName" width="100" show-overflow-tooltip /> + <el-table-column label="褰曞叆鏃ユ湡" prop="entryDate" width="120" show-overflow-tooltip /> + <el-table-column label="绛捐鏃ユ湡" prop="executionDate" width="120" show-overflow-tooltip /> + <el-table-column fixed="right" label="鎿嶄綔" min-width="100" 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="openForm('edit', scope.row)">缂栬緫</el-button> + <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">闄勪欢</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" - /> + <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-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="salesContractNo"> - <el-input - v-model="form.salesContractNo" - placeholder="鑷姩鐢熸垚" - clearable - disabled - /> + <el-input v-model="form.salesContractNo" placeholder="鑷姩鐢熸垚" clearable disabled /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="涓氬姟鍛橈細" prop="salesman"> <el-select v-model="form.salesman" placeholder="璇烽�夋嫨" clearable> - <el-option - v-for="item in userList" - :key="item.nickName" - :label="item.nickName" - :value="item.nickName" - /> + <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" + :value="item.nickName" /> </el-select> </el-form-item> </el-col> @@ -243,26 +100,13 @@ <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="瀹㈡埛鍚堝悓鍙凤細" prop="customerContractNo"> - <el-input - v-model="form.customerContractNo" - placeholder="璇疯緭鍏�" - clearable - /> + <el-input v-model="form.customerContractNo" placeholder="璇疯緭鍏�" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerId"> - <el-select - v-model="form.customerId" - placeholder="璇烽�夋嫨" - clearable - > - <el-option - v-for="item in customerOption" - :key="item.id" - :label="item.customerName" - :value="item.id" - > + <el-select v-model="form.customerId" placeholder="璇烽�夋嫨" clearable> + <el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.id"> {{ item.customerName + "鈥斺��" + item.taxpayerIdentificationNumber }} @@ -274,28 +118,13 @@ <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName"> - <el-input - v-model="form.projectName" - placeholder="璇疯緭鍏�" - clearable - /> + <el-input v-model="form.projectName" placeholder="璇疯緭鍏�" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="褰曞叆浜猴細" prop="entryPerson"> - <el-select - v-model="form.entryPerson" - placeholder="璇烽�夋嫨" - clearable - @change="changs" - disabled - > - <el-option - v-for="item in userList" - :key="item.userId" - :label="item.nickName" - :value="item.userId" - /> + <el-select v-model="form.entryPerson" placeholder="璇烽�夋嫨" clearable @change="changs" disabled> + <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" /> </el-select> </el-form-item> </el-col> @@ -303,132 +132,61 @@ <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="褰曞叆鏃ユ湡锛�" prop="entryDate"> - <el-date-picker - style="width: 100%" - v-model="form.entryDate" - value-format="YYYY-MM-DD" - format="YYYY-MM-DD" - type="date" - placeholder="璇烽�夋嫨" - clearable - disabled - /> + <el-date-picker style="width: 100%" v-model="form.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" + type="date" placeholder="璇烽�夋嫨" clearable disabled /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="绛捐鏃ユ湡锛�" prop="executionDate"> - <el-date-picker - style="width: 100%" - v-model="form.executionDate" - value-format="YYYY-MM-DD" - format="YYYY-MM-DD" - type="date" - placeholder="璇烽�夋嫨" - clearable - /> + <el-date-picker style="width: 100%" v-model="form.executionDate" value-format="YYYY-MM-DD" + format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="浠樻鏂瑰紡"> - <el-input - v-model="form.paymentMethod" - placeholder="璇疯緭鍏�" - clearable - /> + <el-input v-model="form.paymentMethod" placeholder="璇疯緭鍏�" clearable /> </el-form-item> </el-col> </el-row> <el-row> <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate"> - <el-button type="primary" @click="openProductForm('add')" - >娣诲姞</el-button - > - <el-button plain type="danger" @click="deleteProduct" - >鍒犻櫎</el-button - > + <el-button type="primary" @click="openProductForm('add')">娣诲姞</el-button> + <el-button plain type="danger" @click="deleteProduct">鍒犻櫎</el-button> </el-form-item> </el-row> - <el-table - :data="productData" - border - @selection-change="productSelected" - show-summary - :summary-method="summarizeMainTable" - > + <el-table :data="productData" border @selection-change="productSelected" show-summary + :summary-method="summarizeMainTable"> <el-table-column align="center" type="selection" width="55" /> - <el-table-column - align="center" - label="搴忓彿" - type="index" - width="60" - /> + <el-table-column align="center" label="搴忓彿" type="index" width="60" /> <el-table-column label="浜у搧澶х被" prop="productCategory" /> <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" /> <el-table-column label="鍗曚綅" prop="unit" /> <el-table-column label="鏁伴噺" prop="quantity" /> <el-table-column label="绋庣巼(%)" prop="taxRate" /> - <el-table-column - label="鍚◣鍗曚环(鍏�)" - prop="taxInclusiveUnitPrice" - :formatter="formattedNumber" - /> - <el-table-column - label="鍚◣鎬讳环(鍏�)" - prop="taxInclusiveTotalPrice" - :formatter="formattedNumber" - /> - <el-table-column - label="涓嶅惈绋庢�讳环(鍏�)" - prop="taxExclusiveTotalPrice" - :formatter="formattedNumber" - /> - <el-table-column - fixed="right" - label="鎿嶄綔" - min-width="60" - align="center" - > + <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" /> + <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" /> + <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" /> + <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center"> <template #default="scope"> - <el-button - link - type="primary" - size="small" - @click="openProductForm('edit', scope.row)" - >缂栬緫</el-button - > + <el-button link type="primary" size="small" @click="openProductForm('edit', scope.row)">缂栬緫</el-button> </template> </el-table-column> </el-table> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="澶囨敞路锛�" prop="remark"> - <el-input - v-model="form.remark" - placeholder="璇疯緭鍏�" - clearable - type="textarea" - :rows="2" - /> + <el-input v-model="form.remark" placeholder="璇疯緭鍏�" clearable type="textarea" :rows="2" /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark"> - <el-upload - v-model:file-list="fileList" - :action="upload.url" - multiple - ref="fileUpload" - auto-upload - :headers="upload.headers" - :before-upload="handleBeforeUpload" - :on-error="handleUploadError" - :on-success="handleUploadSuccess" - :on-remove="handleRemove" - > + <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload + :headers="upload.headers" :before-upload="handleBeforeUpload" :on-error="handleUploadError" + :on-success="handleUploadSuccess" :on-remove="handleRemove"> <el-button type="primary">涓婁紶</el-button> <template #tip> <div class="el-upload__tip"> @@ -448,53 +206,25 @@ </div> </template> </el-dialog> - <el-dialog - v-model="productFormVisible" - :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'" - width="40%" - @close="closeProductDia" - > - <el-form - :model="productForm" - label-width="140px" - label-position="top" - :rules="productRules" - ref="productFormRef" - > + <el-dialog v-model="productFormVisible" :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'" width="40%" + @close="closeProductDia"> + <el-form :model="productForm" label-width="140px" label-position="top" :rules="productRules" ref="productFormRef"> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="浜у搧澶х被锛�" prop="productCategory"> <!-- <el-select v-model="productForm.productCategory" placeholder="璇烽�夋嫨" clearable> <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/> </el-select> --> - <el-tree-select - v-model="productForm.productCategory" - placeholder="璇烽�夋嫨" - clearable - check-strictly - @change="getModels" - :data="productOptions" - :render-after-expand="false" - style="width: 100%" - /> + <el-tree-select v-model="productForm.productCategory" placeholder="璇烽�夋嫨" clearable check-strictly + @change="getModels" :data="productOptions" :render-after-expand="false" style="width: 100%" /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId"> - <el-select - v-model="productForm.productModelId" - placeholder="璇烽�夋嫨" - clearable - @change="getProductModel" - > - <el-option - v-for="item in modelOptions" - :key="item.id" - :label="item.model" - :value="item.id" - /> + <el-select v-model="productForm.productModelId" placeholder="璇烽�夋嫨" clearable @change="getProductModel"> + <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" /> </el-select> </el-form-item> </el-col> @@ -502,46 +232,25 @@ <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="鍗曚綅锛�" prop="unit"> - <el-input - v-model="productForm.unit" - placeholder="璇疯緭鍏�" - clearable - /> + <el-input v-model="productForm.unit" placeholder="璇疯緭鍏�" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="鏁伴噺锛�" prop="quantity"> - <el-input - type="number" - :step="0.1" - :min="0" - v-model="productForm.quantity" - placeholder="璇疯緭鍏�" - clearable - @change="mathNum" - /> + <el-input type="number" :step="0.1" :min="0" v-model="productForm.quantity" placeholder="璇疯緭鍏�" clearable + @change="mathNum" /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="鍚◣鍗曚环(鍏�)锛�" prop="taxInclusiveUnitPrice"> - <el-input - v-model="productForm.taxInclusiveUnitPrice" - placeholder="璇疯緭鍏�" - clearable - @change="mathNum" - /> + <el-input v-model="productForm.taxInclusiveUnitPrice" placeholder="璇疯緭鍏�" clearable @change="mathNum" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="绋庣巼(%)锛�" prop="taxRate"> - <el-select - v-model="productForm.taxRate" - placeholder="璇烽�夋嫨" - clearable - @change="mathNum" - > + <el-select v-model="productForm.taxRate" placeholder="璇烽�夋嫨" clearable @change="mathNum"> <el-option label="1" value="1" /> <el-option label="6" value="6" /> <el-option label="13" value="13" /> @@ -552,36 +261,19 @@ <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="鍚◣鎬讳环(鍏�)锛�" prop="taxInclusiveTotalPrice"> - <el-input - v-model="productForm.taxInclusiveTotalPrice" - placeholder="璇疯緭鍏�" - clearable - disabled - /> + <el-input v-model="productForm.taxInclusiveTotalPrice" placeholder="璇疯緭鍏�" clearable disabled /> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item - label="涓嶅惈绋庢�讳环(鍏�)锛�" - prop="taxExclusiveTotalPrice" - > - <el-input - v-model="productForm.taxExclusiveTotalPrice" - placeholder="璇疯緭鍏�" - clearable - disabled - /> + <el-form-item label="涓嶅惈绋庢�讳环(鍏�)锛�" prop="taxExclusiveTotalPrice"> + <el-input v-model="productForm.taxExclusiveTotalPrice" placeholder="璇疯緭鍏�" clearable disabled /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="鍙戠エ绫诲瀷锛�" prop="invoiceType"> - <el-select - v-model="productForm.invoiceType" - placeholder="璇烽�夋嫨" - clearable - > + <el-select v-model="productForm.invoiceType" placeholder="璇烽�夋嫨" clearable> <el-option label="澧炴櫘绁�" value="澧炴櫘绁�" /> <el-option label="澧炰笓绁�" value="澧炰笓绁�" /> </el-select> @@ -596,6 +288,7 @@ </div> </template> </el-dialog> + <FileList ref="fileListRef" /> </div> </template> @@ -606,6 +299,7 @@ import { ElMessageBox } from "element-plus"; import useUserStore from "@/store/modules/user"; import { userListNoPage } from "@/api/system/user.js"; +import FileList from "./fileList.vue"; import { ledgerListPage, productList, @@ -1112,6 +806,18 @@ ); } }; +/** + * 涓嬭浇鏂囦欢 + * + * @param row 涓嬭浇鏂囦欢鐨勭浉鍏充俊鎭璞� + */ +const fileListRef = ref(null) +const downLoadFile = (row) => { + getSalesLedgerWithProducts({ id: row.id, type: 1 }).then((res) => { + fileListRef.value.open(res.salesLedgerFiles) + }); + +} getList(); </script> @@ -1119,9 +825,11 @@ .ml-10 { margin-left: 10px; } + .table_list { margin-top: unset; } + .actions { display: flex; justify-content: space-between; diff --git a/src/views/system/user/profile/userAvatar.vue b/src/views/system/user/profile/userAvatar.vue index ae36e39..ff1c9ef 100644 --- a/src/views/system/user/profile/userAvatar.vue +++ b/src/views/system/user/profile/userAvatar.vue @@ -4,18 +4,9 @@ <el-dialog :title="title" v-model="open" width="800px" append-to-body @opened="modalOpened" @close="closeDialog"> <el-row> <el-col :xs="24" :md="12" :style="{ height: '350px' }"> - <vue-cropper - ref="cropper" - :img="options.img" - :info="true" - :autoCrop="options.autoCrop" - :autoCropWidth="options.autoCropWidth" - :autoCropHeight="options.autoCropHeight" - :fixedBox="options.fixedBox" - :outputType="options.outputType" - @realTime="realTime" - v-if="visible" - /> + <vue-cropper ref="cropper" :img="options.img" :info="true" :autoCrop="options.autoCrop" + :autoCropWidth="options.autoCropWidth" :autoCropHeight="options.autoCropHeight" :fixedBox="options.fixedBox" + :outputType="options.outputType" @realTime="realTime" v-if="visible" /> </el-col> <el-col :xs="24" :md="12" :style="{ height: '350px' }"> <div class="avatar-upload-preview"> @@ -26,15 +17,12 @@ <br /> <el-row> <el-col :lg="2" :md="2"> - <el-upload - action="#" - :http-request="requestUpload" - :show-file-list="false" - :before-upload="beforeUpload" - > + <el-upload action="#" :http-request="requestUpload" :show-file-list="false" :before-upload="beforeUpload"> <el-button> 閫夋嫨 - <el-icon class="el-icon--right"><Upload /></el-icon> + <el-icon class="el-icon--right"> + <Upload /> + </el-icon> </el-button> </el-upload> </el-col> @@ -94,7 +82,7 @@ } /** 瑕嗙洊榛樿涓婁紶琛屼负 */ -function requestUpload() {} +function requestUpload() { } /** 鍚戝乏鏃嬭浆 */ function rotateLeft() { @@ -133,7 +121,7 @@ formData.append("avatarfile", data, options.filename) uploadAvatar(formData).then(response => { open.value = false - options.img = import.meta.env.VITE_APP_BASE_API + response.imgUrl + options.img = import.meta.env.VITE_APP_BASE_API + '/profile/' + response.imgUrl userStore.avatar = options.img proxy.$modal.msgSuccess("淇敼鎴愬姛") visible.value = false -- Gitblit v1.9.3