renyuanjibenziliao.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. <template>
  2. <div style="margin: 0 auto">
  3. <el-container>
  4. <!-- 左侧树形结构 -->
  5. <el-aside width="210px" >
  6. <div class="JKWTree-tree" style="height: 746px">
  7. <h3>组织架构</h3>
  8. <el-tree :data="treeData" :props="defaultProps" @node-click="handleNodeClick" @node-expand="handleNodeExpand">
  9. <template #default="{node,data}">
  10. {{data['名称']}}<{{data['num']}}人>
  11. </template>
  12. </el-tree>
  13. </div>
  14. </el-aside>
  15. <!-- 右侧内容区域 -->
  16. <el-container>
  17. <el-main>
  18. <!-- 搜索框 -->
  19. <div class="gva-search-box">
  20. <el-form ref="elSearchFormRef" :inline="true" :model="searchInfo" class="demo-form-inline" :rules="searchRule" @keyup.enter="onSubmit">
  21. <!-- 左侧查询输入框 -->
  22. <el-form-item>
  23. <el-input v-model="searchInfo.ke" placeholder="搜索员工编号或员工姓名" clearable style="width: 200px;"></el-input>
  24. </el-form-item>
  25. <!-- 右侧查询和重置按钮 -->
  26. <el-form-item>
  27. <el-button type="primary" icon="search" @click="onSubmit">查询</el-button>
  28. <!-- <el-button icon="refresh" @click="onReset">重置</el-button>-->
  29. <el-button type="primary" icon="plus" @click="openDialog">新增</el-button>
  30. <el-button type="primary" icon="Download" @click="exportToExcel" style="float: right;">导出到Excel</el-button>
  31. <el-dialog v-model="dialogexportToExcel" title="员工基本资料导出" width="50%">
  32. </el-dialog>
  33. </el-form-item>
  34. </el-form>
  35. </div>
  36. <!-- 表格及操作按钮 -->
  37. <div class="gva-table-box">
  38. <!-- 导出字段选择对话框 -->
  39. <el-dialog title="选择导出字段" :visible.sync="exportDialogVisible" width="30%">
  40. <el-checkbox-group v-model="selectedExportFields">
  41. <el-checkbox label="employeenumber">员工编号</el-checkbox>
  42. <el-checkbox label="employeename">员工姓名</el-checkbox>
  43. <el-checkbox label="gender">性别</el-checkbox>
  44. <!-- 添加更多字段选项 -->
  45. </el-checkbox-group>
  46. <div slot="footer" class="dialog-footer">
  47. <el-button @click="exportDialogVisible = false">取 消</el-button>
  48. <el-button type="primary" @click="exportSelectedFields">确 定</el-button>
  49. </div>
  50. </el-dialog>
  51. <!-- 表格 -->
  52. <el-table ref="multipleTable"
  53. style="width: 100%;height: 580px"
  54. tooltip-effect="dark"
  55. :data="tableData"
  56. border
  57. row-key="ID"
  58. highlight-current-row="true"
  59. @row-dblclick="updateCompanyFunc"
  60. @row-click="tableRowClick"
  61. @selection-change="handleSelectionChange">
  62. <el-table-column type="selection" width="55" />
  63. <el-table-column align="left" label="员工编号" prop="员工编号" width="100" />
  64. <el-table-column align="left" label="员工姓名" prop="员工姓名" width="100"/>
  65. <el-table-column align="left" label="性别" prop="性别" />
  66. <el-table-column align="left" label="聘用日期" prop="聘用日期" width="160" />
  67. <el-table-column align="left" label="转正日期" prop="转正日期" width="160" />
  68. <el-table-column align="left" label="所在部门" prop="所在部门" width="140" />
  69. <el-table-column align="left" label="职称职务" prop="职称职务" width="300" />
  70. <el-table-column align="left" label="身份证号" prop="身份证号" width="170" />
  71. <el-table-column align="left" label="出生日期" prop="出生日期" width="160" />
  72. <el-table-column align="left" label="人员性质" prop="人员性质" width="120" />
  73. <el-table-column align="left" label="人员类别" prop="人员类别" width="100" />
  74. <el-table-column align="left" label="班次类型" prop="班次类型" width="120" />
  75. <el-table-column align="left" label="工资表类别" prop="工资表类别" width="160" />
  76. <el-table-column align="left" label="薪酬核算分组" prop="薪酬核算分组" width="120" />
  77. <el-table-column align="left" label="MES在职" prop="在职状态" width="100" />
  78. <el-table-column align="left" label="U8在职" prop="U8在职" width="100" />
  79. <el-table-column align="left" label="U8离职日期" prop="U8离职日期" width="160" />
  80. <el-table-column align="left" label="创建用户" prop="sys_id" width="160" />
  81. <el-table-column align="left" label="创建时间" prop="sys_rq" width="160" />
  82. <el-table-column align="left" label="修改时间" prop="mod_rq" width="160" />
  83. </el-table>
  84. <!-- 分页 -->
  85. <div class="gva-pagination">
  86. <el-pagination layout="total, sizes, prev, pager, next, jumper" :current-page="page"
  87. :page-size="pageSize" :page-sizes="[10, 30, 50, 100]" :total="total"
  88. @current-change="handleCurrentChange" @size-change="handleSizeChange" />
  89. </div>
  90. </div>
  91. <!-- 弹窗 -->
  92. <el-dialog
  93. v-model="dialogFormVisible"
  94. :before-close="closeDialog"
  95. :title="type==='create'?'添加员工基本资料':'修改员工基本资料'"
  96. destroy-on-close
  97. >
  98. <el-row>
  99. <!-- 左侧表单 -->
  100. <el-col :span="8">
  101. <el-scrollbar height="500px">
  102. <el-form :model="formDataTest" label-position="right" ref="elFormRef" :rules="rule" label-width="100px">
  103. <el-form-item label="员工编号:" prop="address">
  104. <el-input v-model="formDataTest['员工编号']" :clearable="true" placeholder="请输入员工编号" style="width: 180px;" />
  105. </el-form-item>
  106. <el-form-item label="性别:" prop="gender">
  107. <el-input v-model="formDataTest['性别']" :clearable="true" placeholder="请输入性别" style="width: 180px;" />
  108. </el-form-item>
  109. <el-form-item label="身份证号:" prop="idCard">
  110. <el-input v-model="formDataTest['身份证号']" :clearable="true" placeholder="请输入身份证" style="width: 180px;" />
  111. </el-form-item>
  112. <el-form-item label="部门名称:" prop="department">
  113. <el-input v-model="formDataTest['所在部门']" :clearable="true" placeholder="请输入部门名称" style="width: 180px;" />
  114. </el-form-item>
  115. <el-form-item label="入职日期:" prop="joinDate">
  116. <el-input v-model="formDataTest['聘用日期']" :clearable="true" placeholder="请输入入职日期" style="width: 180px;" />
  117. </el-form-item>
  118. <el-form-item label="人员类别:" prop="joinDate">
  119. <el-select v-model="formDataTest['人员类别']" placeholder="请选择人员类别" style="width: 180px;">
  120. <el-option label="生产" value="生产"></el-option>
  121. <el-option label="行政" value="行政"></el-option>
  122. </el-select>
  123. </el-form-item>
  124. <el-form-item label="班次类型:" prop="joinDate">
  125. <el-input v-model="formDataTest['班次类型']" :clearable="true" placeholder="请输入班次类型" style="width: 180px;" />
  126. </el-form-item>
  127. <el-form-item label="工资表类别:" prop="joinDate">
  128. <el-select v-model="formDataTest['工资表类别']" placeholder="请选择工资表类别" style="width: 180px;">
  129. <el-option label="职员级计时工资表" value="职员级计时工资表"></el-option>
  130. <el-option label="另发工资" value="另发工资"></el-option>
  131. <el-option label="操作级计件工资表" value="操作级计件工资表"></el-option>
  132. <el-option label="操作级计时工资表" value="操作级计时工资表"></el-option>
  133. </el-select>
  134. </el-form-item>
  135. </el-form>
  136. </el-scrollbar>
  137. </el-col>
  138. <!-- 中间表单 -->
  139. <el-col :span="8">
  140. <el-scrollbar height="500px">
  141. <el-form :model="formDataTest" label-position="right" ref="elFormRef" :rules="rule" label-width="100px">
  142. <el-form-item label="员工姓名:" prop="name">
  143. <el-input v-model="formDataTest['员工姓名']" :clearable="true" placeholder="请输入姓名" style="width: 180px;" />
  144. </el-form-item>
  145. <el-form-item label="出生日期:" prop="birthDate">
  146. <el-input v-model="formDataTest['出生日期']" :clearable="true" placeholder="" style="width: 180px;" />
  147. </el-form-item>
  148. <el-form-item label="职务:" prop="position">
  149. <el-input v-model="formDataTest['职称职务']" :clearable="true" placeholder="请输入职务" style="width: 180px;" />
  150. </el-form-item>
  151. <!-- <el-form-item label="部门编号:" prop="departmentId">-->
  152. <!-- <el-input v-model="formDataTest['部门编号']" :clearable="true" placeholder="请输入部门编号" style="width: 180px;" />-->
  153. <!-- </el-form-item>-->
  154. <el-form-item label="转正日期:" prop="departmentId">
  155. <el-input v-model="formDataTest['转正日期']" :clearable="true" placeholder="请输入转正日期" style="width: 180px;" />
  156. </el-form-item>
  157. <el-form-item label="扣减司龄:" prop="departmentId">
  158. <el-input v-model="formDataTest['扣减司龄']" :clearable="true" placeholder="" style="width: 180px;" />
  159. </el-form-item>
  160. <el-form-item label="人员性质:" prop="departmentId">
  161. <el-select v-model="formDataTest['人员性质']" placeholder="请选择人员性质" style="width: 180px;">
  162. <el-option label="退休返聘" value="退休返聘"></el-option>
  163. <el-option label="劳动合同工" value="劳动合同工"></el-option>
  164. <el-option label="借用" value="借用"></el-option>
  165. <el-option label="劳务派遣" value="劳务派遣"></el-option>
  166. <el-option label="实习生" value="实习生"></el-option>
  167. </el-select>
  168. </el-form-item>
  169. <el-form-item label="U8状态:" prop="joinDate">
  170. <el-input v-model="formDataTest['U8在职']" :clearable="true" placeholder="" style="width: 180px;" />
  171. </el-form-item>
  172. <el-form-item label="在职状态:" prop="joinDate">
  173. <el-input v-model="formDataTest['在职状态']" :clearable="true" placeholder="" style="width: 180px;" />
  174. </el-form-item>
  175. </el-form>
  176. </el-scrollbar>
  177. </el-col>
  178. <!-- 右侧图片 -->
  179. </el-row>
  180. <!-- 添加 编辑页面 取消 确定 -->
  181. <template #footer>
  182. <div class="dialog-footer">
  183. <el-button @click="closeDialog">取 消</el-button>
  184. <el-button type="primary" @click="enterDialog">确 定</el-button>
  185. </div>
  186. </template>
  187. </el-dialog>
  188. </el-main>
  189. </el-container>
  190. </el-container>
  191. </div>
  192. </template>
  193. <script setup>
  194. // 全量引入格式化工具 请按需保留
  195. import {createCompany, deleteCompany, deleteCompanyByIds, updateCompany, findCompany, getCompanyList} from '@/api/company'
  196. import {getDictFunc, formatDate, formatBoolean, filterDict, ReturnArrImg, onDownloadFile} from '@/utils/format'
  197. import {ElMessage, ElMessageBox} from 'element-plus'
  198. import {ref, reactive} from 'vue'
  199. import {getCustom, getDepartment, getProductData, getStaffList, ygjbzledit} from '@/api/yunyin/yunying'
  200. defineOptions({name: 'Company'})
  201. // =========== 导出Excel表格 ===========
  202. const exportToExcel = () => {
  203. console.log('点击了导出按钮')
  204. dialogexportToExcel.value = true;
  205. }
  206. // 导出Excel弹窗
  207. const dialogexportToExcel = ref(false)
  208. // =========== 获取左侧树侧形结构 ===========
  209. const treeData = ref({})
  210. const defaultProps = {
  211. children: 'children',
  212. label: '名称' // 将label设置为中文名称对应的字段名
  213. };
  214. const _department_code = ref(null)
  215. const getDepartmentdata = async () => {
  216. try {
  217. const data = await getDepartment() //接口调用函数
  218. treeData.value = data.data;
  219. } catch (error) {
  220. console.error(error)
  221. }
  222. }
  223. getDepartmentdata();
  224. const numTime = 0
  225. //点击左侧树形 获取右侧table列表
  226. const tableData = reactive([])
  227. const handleNodeClick = async (node) => {
  228. _department_code.value = node.编号;
  229. _getStaffList()
  230. };
  231. // 点击管理中心 显示全部数据
  232. const handleNodeExpand = async (node) => {
  233. _department_code.value = node.编号;
  234. _getStaffList()
  235. }
  236. //封装的方法
  237. const _getStaffList = async ()=>{
  238. let params = {}
  239. params.department_code = _department_code.value;
  240. params.limit = pageSize.value;
  241. params.page = page.value;
  242. try {
  243. const WorkListdata = await getStaffList(params);//接口调用函数
  244. tableData.splice(0,tableData.length,...WorkListdata.data.list);//表格数据
  245. total.value = WorkListdata.data.total;//共多少条total
  246. } catch (error) {
  247. console.error(error);
  248. }
  249. }
  250. // 分页相关的响应式变量
  251. const page = ref(1)
  252. const total = ref(0)
  253. const pageSize = ref(10)
  254. // 分页
  255. const handleCurrentChange = (val) => {
  256. page.value = val;
  257. _getStaffList();
  258. };
  259. // 修改页面容量 点击多少条/页
  260. const handleSizeChange = (val) => {
  261. page.value = 10;//默认显示十条
  262. pageSize.value = val;
  263. _getStaffList();
  264. };
  265. // 自动化生成的字典(可能为空)以及字段
  266. const formData = ref({
  267. address: '',
  268. image: '',
  269. name: '',
  270. })
  271. let formDataTest = reactive({})
  272. // 验证规则
  273. const rule = reactive({})
  274. const searchRule = reactive({
  275. createdAt: [{
  276. validator: (rule, value, callback) => {
  277. if (searchInfo.value.startCreatedAt && !searchInfo.value.endCreatedAt) {
  278. callback(new Error('请填写结束日期'))
  279. } else if (!searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt) {
  280. callback(new Error('请填写开始日期'))
  281. } else if (searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt && (
  282. searchInfo.value.startCreatedAt.getTime() === searchInfo.value.endCreatedAt
  283. .getTime() || searchInfo.value.startCreatedAt.getTime() > searchInfo.value
  284. .endCreatedAt.getTime())) {
  285. callback(new Error('开始日期应当早于结束日期'))
  286. } else {
  287. callback()
  288. }
  289. },
  290. trigger: 'change'
  291. }],
  292. })
  293. const elFormRef = ref()
  294. const elSearchFormRef = ref()
  295. const searchInfo = ref({})
  296. // 重置
  297. const onReset = () => {
  298. searchInfo.value = {}
  299. getTableData()
  300. }
  301. // 搜索
  302. const onSubmit = () => {
  303. const searchValue = searchInfo._rawValue.ke; // 获取搜索框输入的值
  304. console.log(searchValue);
  305. // elSearchFormRef.value?.validate(async (valid) => {
  306. // if (valid) {
  307. // try {
  308. // const response = await getStaffList({ search: searchValue }); // 将搜索框输入的值作为 search 参数发送给后台
  309. // console.log(response);
  310. // } catch (error) {
  311. // console.error('发生错误:', error);
  312. // }
  313. // } else {
  314. // console.log('验证不通过');
  315. // }
  316. // });
  317. };
  318. // 查询
  319. const getTableData = async () => {
  320. // console.log(table)
  321. }
  322. getTableData()
  323. // 行为控制标记(弹窗内部需要增还是改)
  324. const type = ref('')
  325. //修改
  326. const updateCompanyFunc = async (row) => {
  327. const product_code = row.员工编号;
  328. formDataTest = row;
  329. console.log(row);
  330. // const response = await ygjbzledit({ product_code: product_code });
  331. // console.log(response);
  332. dialogFormVisible.value = true;
  333. };
  334. // 弹窗控制标记
  335. const dialogFormVisible = ref(false)
  336. // 打开弹窗
  337. const openDialog = () => {
  338. type.value = 'create'
  339. dialogFormVisible.value = true
  340. }
  341. // 关闭弹窗
  342. const closeDialog = () => {
  343. dialogFormVisible.value = false
  344. formData.value = {
  345. address: '',
  346. image: '',
  347. name: '',
  348. }
  349. }
  350. // 弹窗确定
  351. const enterDialog = async () => {
  352. elFormRef.value?.validate(async (valid) => {
  353. if (!valid) return
  354. let res
  355. switch (type.value) {
  356. case 'create':
  357. res = await createCompany(formData.value)
  358. break
  359. case 'update':
  360. res = await updateCompany(formData.value)
  361. break
  362. default:
  363. res = await createCompany(formData.value)
  364. break
  365. }
  366. if (res.code === 0) {
  367. ElMessage({
  368. type: 'success',
  369. message: '创建/更改成功'
  370. })
  371. closeDialog()
  372. getTableData()
  373. }
  374. })
  375. }
  376. </script>
  377. <style>
  378. .JKWTree-container {
  379. display: flex;
  380. }
  381. .JKWTree-tree {
  382. width: 300px;
  383. background-color: #fff;
  384. padding: 10px;
  385. margin-right: 20px;
  386. }
  387. .JKWTree-tree h3 {
  388. font-size: 15px;
  389. font-weight: 700;
  390. margin: 10px 0;
  391. }
  392. .JKWTree-content {
  393. flex: 1;
  394. }
  395. /* 图片上传 */
  396. .upload-box {
  397. width: 200px;
  398. height: 200px;
  399. border: 2px dashed #e2e2e2;
  400. display: flex;
  401. justify-content: center;
  402. align-items: center;
  403. position: relative;
  404. cursor: pointer;
  405. }
  406. .uploaded-image {
  407. width: 100%;
  408. height: 100%;
  409. object-fit: cover;
  410. }
  411. .upload-icon {
  412. font-size: 40px;
  413. color: #c0c4cc;
  414. }
  415. .file-input {
  416. display: none;
  417. }
  418. .el-table .warning-row {
  419. background: oldlace;
  420. }
  421. /* 选中某行时的背景色*/
  422. .el-table__body tr.current-row>td {
  423. background: #ff80ff !important;
  424. }
  425. </style>