Compare commits

..

312 Commits

Author SHA1 Message Date
Chengliang fc6f1a0838 修复花名册搜索问题 2023-12-05 18:52:41 +08:00
Chengliang cf472e7a26 滚动条设置 2023-11-29 15:20:42 +08:00
Chengliang 6e5eec06fe 部门管理 2023-09-22 10:41:23 +08:00
Chengliang a710334a37 bug修复 2023-09-15 17:15:19 +08:00
Chengliang 8312b214ff 修改备注 2023-09-11 14:32:47 +08:00
Chengliang 9e6181d5f7 编制模块 2023-09-06 09:52:31 +08:00
Chengliang 403d040956 企通学配置 2023-08-22 18:07:47 +08:00
Chengliang a7a0de166e 企通学配置自定义 2023-08-21 18:09:48 +08:00
Chengliang 26f19c3283 修复 2023-08-17 10:56:56 +08:00
Chengliang 1a87a3f118 快捷条件设置 2023-08-16 13:58:08 +08:00
Chengliang 67947182fd 接口测试 2023-08-11 10:15:56 +08:00
Chengliang de6a309f42 接口测试 2023-08-11 09:39:58 +08:00
Chengliang 7c6e62c28f 接口测试 2023-08-10 09:34:44 +08:00
Chengliang 35b783ca72 接口测试 2023-08-09 17:14:53 +08:00
Chengliang 56cb6a800a 接口测试 2023-08-09 16:37:35 +08:00
Chengliang 72e58d764c 快捷搜索 2023-08-09 14:54:37 +08:00
Chengliang 37e6757110 花名册快捷搜索 2023-08-08 14:28:49 +08:00
Chengliang 72a3d27b16 bug修复 2023-08-04 17:49:42 +08:00
Chengliang 0e9eb6db03 岗位新增修改 2023-08-02 17:12:23 +08:00
Chengliang da97064838 测试 2023-07-31 09:28:22 +08:00
Chengliang 957c4d4774 页面优化需求 2023-07-26 19:09:22 +08:00
liang.cheng e37bc680bd Merge pull request 'feature/cl' (#38) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/38
2023-07-12 10:48:36 +08:00
Chengliang b15144beef 修复 2023-07-12 10:46:36 +08:00
Chengliang 34202c6758 test 2023-05-25 13:45:26 +08:00
Chengliang bc38036b33 火狐浏览器样式处理 2023-05-04 15:13:48 +08:00
Chengliang 638e110797 人员卡片页面formlabel和value重复问题 2023-05-04 14:44:13 +08:00
liang.cheng 00398d6930 Merge pull request '卡片页面修复' (#37) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/37
2023-03-27 13:37:22 +08:00
Chengliang 744174e49c 卡片页面修复 2023-03-27 10:47:30 +08:00
dxfeng 8e82c0e781 Merge pull request '岗位管理名称搜索BUG修复' (#36) from feature/dxfeng into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/36
2023-03-13 11:23:18 +08:00
dxfeng 0fac5a03a4 岗位管理名称搜索BUG修复 2023-03-13 11:21:52 +08:00
liang.cheng 3eebf5cb54 Merge pull request '修复' (#34) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/34
2023-01-29 09:45:17 +08:00
Chengliang 089cab455f 修复 2023-01-29 09:41:01 +08:00
liang.cheng a2066e8d68 Merge pull request '细节修复' (#32) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/32
2023-01-17 09:55:31 +08:00
Chengliang b71b401d7a 细节修复 2023-01-17 09:52:53 +08:00
liang.cheng 95735084d9 Merge pull request 'feature/cl' (#31) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/31
2023-01-16 09:54:48 +08:00
Chengliang fc1184c64d 花名册模板管理 2023-01-16 09:50:36 +08:00
Chengliang 5baac661e2 花名册 2023-01-13 14:37:03 +08:00
Chengliang 07cc8573be 花名册 2023-01-11 18:22:30 +08:00
Chengliang b15b08433f 花名册开发 2023-01-10 18:23:25 +08:00
liang.cheng 8df95c873e Merge pull request 'feature/cl' (#30) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/30
2023-01-06 18:04:42 +08:00
Chengliang d98f86be17 花名册开发 2023-01-06 18:01:46 +08:00
Chengliang a88de27c35 花名册功能 2023-01-05 18:02:33 +08:00
liang.cheng bd5d3b1704 Merge pull request 'feature/cl' (#29) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/29
2023-01-04 10:29:21 +08:00
Chengliang 9560631638 人员简历 2023-01-04 10:27:27 +08:00
Chengliang 7dfc190df6 人员简历 2023-01-03 09:31:59 +08:00
Chengliang a9bdbe3d2d 人员简历 2022-12-29 18:04:58 +08:00
liang.cheng a3950f3343 Merge pull request 'feature/cl' (#28) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/28
2022-12-28 17:07:34 +08:00
Chengliang 80b9c2f288 人员简历 2022-12-28 17:06:09 +08:00
Chengliang 54305211d4 修复 2022-12-26 11:11:14 +08:00
Chengliang 39da6bcd15 xiu fu 2022-12-16 18:53:54 +08:00
Chengliang 72263eb5f7 resolve 2022-12-16 16:06:51 +08:00
Chengliang faf2782dba bug 2022-12-15 19:45:38 +08:00
Chengliang 1d1d974e8d bug 2022-12-14 16:17:15 +08:00
liang.cheng 69620d54c4 Merge pull request 'feature/cl' (#27) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/27
2022-12-13 17:27:02 +08:00
Chengliang a709470921 test 2022-12-13 17:25:28 +08:00
Chengliang 17063a3f10 历史版本查看 2022-12-09 17:51:10 +08:00
liang.cheng 68c07ee8b9 Merge pull request 'feature/cl' (#26) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/26
2022-12-09 14:51:10 +08:00
Chengliang 458606d1a4 另存为版本 2022-12-09 14:47:19 +08:00
Chengliang 27729bf7c0 V2.0版本开发 2022-12-08 18:06:21 +08:00
Chengliang 55b503dc88 版本修改 2022-12-06 17:56:09 +08:00
Chengliang 04403d5d26 新建人员跳转 2022-11-29 16:59:04 +08:00
liang.cheng 2a79641bc8 Merge pull request '组织管理v1.0封版' (#25) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/25
2022-11-23 17:40:17 +08:00
Chengliang 267e71e9ef 组织管理v1.0封版 2022-11-23 17:38:59 +08:00
liang.cheng 814cf971e0 Merge pull request 'feature/cl' (#24) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/24
2022-11-21 13:51:11 +08:00
Chengliang d48b404468 bug修复 2022-11-21 13:49:31 +08:00
Chengliang 28cbe4d7e1 bug修复 2022-11-17 11:34:05 +08:00
Chengliang 5cce357d78 修复扩展页面 2022-11-16 09:18:19 +08:00
liang.cheng 82b09416bb Merge pull request '人员卡片' (#23) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/23
2022-11-14 19:21:29 +08:00
Chengliang aa77770e09 人员卡片 2022-11-14 19:20:18 +08:00
黎永顺 9eeadb416e 栏目自定义页面接口联调 2022-11-14 10:42:44 +08:00
黎永顺 6a6587bea7 Merge remote-tracking branch 'origin/dev' into dev 2022-11-11 17:09:33 +08:00
黎永顺 4318dc9830 栏目权限新增自定义项 2022-11-11 17:09:18 +08:00
liang.cheng 17bd109269 Merge pull request '导入设置' (#20) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/20
2022-11-11 17:07:10 +08:00
Chengliang 25dd4020ca 导入设置 2022-11-11 17:05:06 +08:00
liang.cheng 1cdf8f6487 Merge pull request '文件路径修改' (#19) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/19
2022-11-10 18:53:36 +08:00
Chengliang bd5db8d4c0 文件路径修改 2022-11-10 18:50:45 +08:00
liang.cheng 5b091c5e82 Merge pull request '其它导入' (#17) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/17
2022-11-10 16:13:21 +08:00
Chengliang 3dbcad0bd0 其它导入 2022-11-10 16:11:59 +08:00
黎永顺 6b3f35374c 栏目权限新增自定义项 2022-11-10 16:10:21 +08:00
liang.cheng daea5ba97b Merge pull request '权限' (#16) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/16
2022-11-09 17:05:07 +08:00
Chengliang 1fd6a4c644 权限 2022-11-09 17:02:55 +08:00
黎永顺 62e8ef22c1 栏目权限页面的编写 2022-11-09 14:03:32 +08:00
liang.cheng ddb59fa9f9 Merge pull request 'bug' (#15) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/15
2022-11-09 10:20:45 +08:00
Chengliang 71bc20765d bug 2022-11-09 10:07:18 +08:00
黎永顺 21002e1e7d 栏目权限页面的编写 2022-11-08 17:43:26 +08:00
黎永顺 c4e93a30c7 Merge remote-tracking branch 'origin/dev' into dev 2022-11-08 15:56:44 +08:00
黎永顺 1a1441ac95 栏目权限页面的编写 2022-11-08 15:56:34 +08:00
liang.cheng 967453d11b Merge pull request '权限' (#14) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/14
2022-11-08 09:51:44 +08:00
Chengliang 3b4592adb5 bug修复 2022-11-08 09:49:45 +08:00
黎永顺 69441eca6c 栏目权限页面的编写 2022-11-07 16:35:58 +08:00
Chengliang 9a3164e386 权限 2022-11-03 14:33:55 +08:00
liang.cheng bfc78bee60 Merge pull request '分权开关设置' (#13) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/13
2022-11-01 17:51:09 +08:00
Chengliang f2e3c11733 卡片页面bug修复 2022-11-01 17:48:33 +08:00
Chengliang 8931a06127 分权开关设置 2022-10-31 14:33:57 +08:00
18652063575 710293d536 新增人员权限两个页面 2022-10-31 13:52:22 +08:00
liang.cheng f4f27c8ad0 Merge pull request '模块管理分权中心完整' (#12) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/12
2022-10-27 14:29:58 +08:00
Chengliang a9282a27e1 模块管理分权中心完整 2022-10-27 14:27:44 +08:00
liang.cheng 748aa1f740 Merge pull request '弹出框修改' (#11) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/11
2022-10-26 16:08:23 +08:00
Chengliang 238ccbabf8 弹出框修改 2022-10-26 16:05:39 +08:00
liang.cheng 9a9c243ec7 Merge pull request 'bug封版修复' (#10) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/10
2022-10-25 17:52:21 +08:00
Chengliang f804b45dfa bug封版修复 2022-10-25 17:50:10 +08:00
liang.cheng 291015e859 Merge pull request 'bug修复' (#9) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/9
2022-10-24 19:29:17 +08:00
Chengliang 4d79c64bcd bug修复 2022-10-24 19:27:35 +08:00
liang.cheng f4b11171b1 Merge pull request 'bug修复' (#8) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/8
2022-10-21 17:52:51 +08:00
Chengliang ebf82547d2 bug修复 2022-10-21 17:51:28 +08:00
liang.cheng c9b6f9d701 Merge pull request 'feature/cl' (#7) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/7
2022-10-21 14:43:42 +08:00
Chengliang f9cb61f140 模块管理分权 2022-10-21 14:40:47 +08:00
Chengliang 8ca38016a7 模块管理分权 2022-10-21 14:39:24 +08:00
liang.cheng 1e450a2c3c Merge pull request '人员卡片页面重做' (#6) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/6
2022-10-21 14:39:03 +08:00
Chengliang edd7e4c2a6 人员卡片页面重做 2022-10-18 13:58:48 +08:00
liang.cheng f3cfd3493f Merge pull request '卡片修复' (#5) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/5
2022-09-29 09:50:25 +08:00
Chengliang e498634292 卡片修复 2022-09-29 09:49:15 +08:00
liang.cheng 7d73c055f0 Merge pull request '我的卡片页面锚点滚动' (#4) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/4
2022-09-27 17:53:23 +08:00
Chengliang 89587a6b1a 我的卡片页面锚点滚动 2022-09-27 17:50:56 +08:00
liang.cheng 1db5570f3b Merge pull request '我的卡片' (#3) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/3
2022-09-23 16:54:45 +08:00
Chengliang d651883081 我的卡片 2022-09-23 16:53:25 +08:00
liang.cheng 444a3576c0 Merge pull request '我的卡片页面' (#2) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/2
2022-09-22 18:58:12 +08:00
Chengliang 01dc126302 我的卡片页面 2022-09-22 18:55:14 +08:00
liang.cheng 29297b5c56 Merge pull request '我的卡片' (#1) from feature/cl into dev
Reviewed-on: http://221.226.25.34:3000/liang.cheng/trunk/pulls/1
2022-09-20 14:35:01 +08:00
Chengliang 0d3d6c79f0 我的卡片 2022-09-20 14:15:13 +08:00
reset 173de38912
!74 bug修复
Merge pull request !74 from reset/feature/cl
2022-09-16 10:12:43 +00:00
Chengliang dfda1222c4 fixed 2022-09-16 18:11:28 +08:00
reset c044172c8a
!73 bug修复
Merge pull request !73 from reset/feature/cl
2022-09-08 09:55:20 +00:00
Chengliang 0b5f70a080 fixed 2022-09-08 17:50:42 +08:00
18652063575 b63006a7bc 代码优化 2022-09-08 17:50:03 +08:00
reset e8c4068085
!72 fixed
Merge pull request !72 from reset/feature/cl
2022-09-07 11:25:41 +00:00
Chengliang f79a0a3ef5 fixed 2022-09-07 19:23:30 +08:00
18652063575 57b165f6d8 编辑页面编号设置 2022-09-06 20:09:24 +08:00
18652063575 a7592b2777 Merge remote-tracking branch 'origin/dev' into dev 2022-09-06 19:31:06 +08:00
18652063575 cbfed11819 【ID1000135】
编制管理-编制信息-新建编制
【ID1000132】
日志查看:翻页区显示不全
2022-09-06 19:30:44 +08:00
reset bf8b1fecc4
!71 bug修复
Merge pull request !71 from reset/feature/cl
2022-09-06 10:54:26 +00:00
Chengliang fc9c510619 fixed 2022-09-06 18:53:08 +08:00
18652063575 8a44f31d64 【ID1000165】
组织机构:分部/部门/岗位 新增页面 增加 预留编号
2022-09-06 10:08:08 +08:00
reset ac8f61cc15
!70 fixed
Merge pull request !70 from reset/feature/cl
2022-09-06 01:28:50 +00:00
Chengliang 4394a1abcb fixed 2022-09-06 09:26:38 +08:00
18652063575 8db2ed84c6 职务分类左侧树搜索折叠的问题 2022-09-05 16:17:36 +08:00
reset 59a0564a67
!69 bug修复
Merge pull request !69 from reset/feature/cl
2022-09-02 08:21:13 +00:00
Chengliang 64cfbffaf0 fixed 2022-09-02 16:17:54 +08:00
reset 579900a9fc
!68 fixed
Merge pull request !68 from reset/feature/cl
2022-09-02 03:03:07 +00:00
Chengliang a578e4e3ab 修复页面跳转 2022-09-02 11:00:27 +08:00
reset d8909f5145
!67 bug修复
Merge pull request !67 from reset/feature/cl
2022-08-30 03:50:51 +00:00
Chengliang 2128fcae7c 人员信息功能完善 2022-08-30 11:42:11 +08:00
reset aa80d43966
!66 人员信息管理
Merge pull request !66 from reset/feature/cl
2022-08-26 07:31:41 +00:00
Chengliang 67ccf9cbba 人员信息管理 2022-08-26 15:28:50 +08:00
reset 87b2bf78f5
!65 人员信息
Merge pull request !65 from reset/feature/cl
2022-08-23 09:56:55 +00:00
Chengliang 766df1a634 人员基础信息 2022-08-23 17:53:21 +08:00
reset 210e79a145
!64 bug修复
Merge pull request !64 from reset/feature/cl
2022-08-22 08:20:38 +00:00
Chengliang 07d2ff9832 fixed 2022-08-22 16:19:22 +08:00
liyongshun 7ba0a51fd4 职务分类左侧树折叠的问题 2022-08-22 16:13:10 +08:00
reset 95afc993f0
!62 权限完善
Merge pull request !62 from reset/feature/cl
2022-08-18 09:45:16 +00:00
Chengliang 1d9ac506e8 权限完善 2022-08-18 17:42:15 +08:00
reset 74f7329524
!61 fixed
Merge pull request !61 from reset/feature/cl
2022-08-17 07:15:55 +00:00
Chengliang 919b778398 fixed 2022-08-17 15:13:26 +08:00
reset 5830d46577
!60 fix
Merge pull request !60 from reset/feature/cl
2022-08-05 01:25:25 +00:00
Chengliang 68af2808dd fix 2022-08-05 09:22:29 +08:00
reset f619a3cce0
!59 编制流程说明
Merge pull request !59 from reset/feature/cl
2022-08-03 01:25:26 +00:00
Chengliang 5849a22514 编制流程说明 2022-08-03 09:23:36 +08:00
reset 5b24ef6e9f
!58 fixed..
Merge pull request !58 from reset/feature/cl
2022-07-27 06:57:14 +00:00
Chengliang 9263c27fd3 fix 2022-07-27 14:54:59 +08:00
reset 5977ad0d08
!57 新导入
Merge pull request !57 from reset/feature/cl
2022-07-25 09:55:07 +00:00
Chengliang d3ca08680f 新导入 2022-07-25 17:53:00 +08:00
Chengliang cb010edefa fixed 2022-07-22 14:04:28 +08:00
reset 58b440ad47
!56 系统扩展页
Merge pull request !56 from reset/feature/cl
2022-07-12 08:55:08 +00:00
Chengliang b5d1e00b91 扩展页面及优化 2022-07-12 16:45:03 +08:00
liyongshun 72ac0c5afe Merge branch 'dev' of https://gitee.com/jmlcl/trunk into dev 2022-07-11 10:24:58 +08:00
reset 234ca66f99
!55 需求优化2
Merge pull request !55 from reset/feature/cl
2022-07-11 02:19:11 +00:00
Chengliang 39e60335ec 需求优化2 2022-07-11 10:06:45 +08:00
liyongshun 00fad37019 Merge remote-tracking branch 'origin/dev' into dev 2022-07-11 09:07:43 +08:00
reset 38ceda8153
!54 fixed..
Merge pull request !54 from reset/feature/cl
2022-07-08 05:33:30 +00:00
Chengliang db5101250e fixed 2022-07-08 13:31:40 +08:00
liyongshun cb020c5f66 Merge remote-tracking branch 'origin/dev' into dev 2022-07-08 11:35:30 +08:00
liyongshun b5334c6830 职务分类新增和编辑成功列表查询失败的bug,以及新增时表单接口的调整 2022-07-08 10:25:32 +08:00
reset c52834678b
!53 增加操作日志
Merge pull request !53 from reset/feature/cl
2022-07-08 01:41:51 +00:00
liyongshun 6e152af3a2 职务分类新增和编辑成功列表查询失败的bug 2022-07-07 18:49:54 +08:00
Chengliang dd023861d7 增加操作日志 2022-07-07 18:06:02 +08:00
liyongshun d5e13c6057 弹框中的下拉框组件样式问题 2022-07-06 18:11:23 +08:00
liyongshun ba2d6f7f8b 更新代码 2022-07-06 11:21:13 +08:00
Chengliang 0f4c438bbf 日志操作增加 2022-07-05 18:54:56 +08:00
reset 6609f8f886
!50 基础数据导入
Merge pull request !50 from reset/feature/cl
2022-06-30 09:15:58 +00:00
Chengliang 98bb6e3ae4 基础数据导入 2022-06-30 17:14:04 +08:00
Chengliang 07dec3350f 优化 2022-06-29 18:37:25 +08:00
reset 4630958a14
!48 人员模块导入功能
Merge pull request !48 from reset/feature/cl
2022-06-27 10:50:34 +00:00
Chengliang c52d10323a 人员导入模块新增 2022-06-27 18:48:28 +08:00
reset c51824695f
!47 测试问题更新
Merge pull request !47 from reset/feature/cl
2022-06-24 10:00:45 +00:00
Chengliang 58b118ebe3 测试问题修改 2022-06-24 17:58:51 +08:00
reset b9d63ec406
!46 测试更新
Merge pull request !46 from reset/feature/cl
2022-06-24 06:40:55 +00:00
Chengliang 82b54b8bde 测试优化 2022-06-24 14:38:54 +08:00
reset 8de8feb216
!45 需求优化
Merge pull request !45 from reset/feature/cl
2022-06-23 03:55:20 +00:00
Chengliang 09d7776a3e 需求优化 2022-06-23 11:53:57 +08:00
reset 0c5e3cae8f
!44 需求优化
Merge pull request !44 from reset/feature/cl
2022-06-22 09:22:49 +00:00
Chengliang ebf1cb58d9 需求优化 2022-06-22 17:19:28 +08:00
liyongshun fda7c7c0d0 Merge branch 'dev' of https://gitee.com/jmlcl/trunk into dev 2022-06-22 16:09:56 +08:00
liyongshun 4878b6be1d 修改职务管理 2022-06-22 16:09:43 +08:00
reset c81ff2bca5
!43 需求统一优化处理
Merge pull request !43 from reset/feature/cl
2022-06-22 02:29:26 +00:00
Chengliang 4102c1e135 需求统一优化处理 2022-06-22 10:28:25 +08:00
reset 9fa6b9da32
!42 人员管理模块
Merge pull request !42 from reset/feature/cl
2022-06-21 10:42:37 +00:00
Chengliang 32a0c9cbd2 人员管理模块 2022-06-21 18:39:50 +08:00
Chengliang 74d5522239 人员管理 2022-06-20 17:08:10 +08:00
reset 5bd1d12a76
!40 v1.2
Merge pull request !40 from reset/feature/cl
2022-06-20 03:09:41 +00:00
Chengliang ed990bcfb2 完成v1.20 2022-06-20 11:08:19 +08:00
Chengliang 1dce448427 自定义设置页面初步完成 2022-06-17 18:06:07 +08:00
reset 860dd0212c
!39 自定义设置页面
Merge pull request !39 from reset/feature/cl
2022-06-16 10:36:23 +00:00
Chengliang 19e1d07e3c 自定义设置页面接口对接 2022-06-16 18:35:17 +08:00
Chengliang 2d1c756985 自定义页面树和tab接口对接 2022-06-16 08:43:36 +08:00
liyongshun 5be0bb68e6 编号设置合并 2022-06-15 13:17:33 +08:00
liyongshun a633a3a28c Merge branch 'liys_test' of gitee.com:jmlcl/trunk into dev 2022-06-15 11:21:50 +08:00
liyongshun 8f0306b95f 分支合并 2022-06-15 11:16:11 +08:00
liyongshun 2b1093ca1d 编号设置部分bug的修改 2022-06-15 11:02:24 +08:00
reset 34d7ab154a
!38 自定义设置合并
Merge pull request !38 from reset/test
2022-06-13 09:36:32 +00:00
Chengliang 88dd830ce3 自定义设置 2022-06-13 17:35:34 +08:00
Chengliang 1a35ec1bd5 自定义设置增加类型 2022-06-13 15:38:26 +08:00
Chengliang aa499d7855 自定义设置test 2022-06-10 17:51:55 +08:00
Chengliang 5bfb129380 自定义设置 2022-06-10 16:37:52 +08:00
liyongshun 938e17aaad 完成编号设置的功能 2022-06-09 16:51:37 +08:00
reset 6248c7d184
!37 岗位高级搜索bug修复
Merge pull request !37 from reset/feature/cl
2022-06-08 08:54:14 +00:00
Chengliang 74879c046d 岗位高级搜索bug修复 2022-06-08 16:51:54 +08:00
reset d724566384
!36 bug修复
Merge pull request !36 from reset/feature/cl
2022-06-08 06:13:28 +00:00
Chengliang faf37dba1d bug修复 2022-06-08 14:10:17 +08:00
liyongshun 88bf00cc8d 编号设置路径修改 2022-06-08 09:44:19 +08:00
liyongshun f50c8f2bde Merge branch 'dev' of gitee.com:jmlcl/trunk into dev 2022-06-07 18:14:46 +08:00
liyongshun cbaea8f2da 编号设置描述语修改 2022-06-07 18:14:39 +08:00
reset 76c5ceed96
!35 修改编制变更
Merge pull request !35 from reset/feature/cl
2022-06-07 10:13:11 +00:00
Chengliang 14b7080a28 修改编制变更 2022-06-07 18:11:10 +08:00
liyongshun dbc6134ccf Merge branch 'liys_dev' into dev 2022-06-07 18:10:06 +08:00
liyongshun 76051adc16 编号设置接口联调完成80% 2022-06-07 18:01:50 +08:00
reset d3f49f9be6
!33 编制补充
Merge pull request !33 from reset/feature/cl
2022-06-07 09:59:09 +00:00
Chengliang ce77261397 编制补充 2022-06-07 17:58:20 +08:00
Chengliang 79916567d5 编制修改 2022-06-07 17:56:29 +08:00
reset 58b99e41ff
!32 权限控制
Merge pull request !32 from reset/feature/cl
2022-06-07 08:53:33 +00:00
Chengliang 84b6f732c6 增加权限控制 2022-06-07 16:52:12 +08:00
reset cca368c495
!31 部门转移
Merge pull request !31 from reset/feature/cl
2022-06-07 01:35:22 +00:00
Chengliang 772f0b66ee 修复转移页面 2022-06-07 09:34:25 +08:00
reset 3b49f1e92e
!30 部门管理
Merge pull request !30 from reset/feature/cl
2022-06-06 08:50:59 +00:00
Chengliang 2b34890e6d 对接部门合并转移 复制 2022-06-06 16:48:19 +08:00
liyongshun 204613099a 部门编号设置 2022-06-06 14:01:41 +08:00
liyongshun f3877c843f Merge branch 'dev' into liys_dev 2022-06-04 21:50:09 +08:00
Chengliang aefcb9772b solve conflict 2022-06-02 17:06:47 +08:00
Chengliang f5afc77283 部门管理页面 2022-06-02 16:51:21 +08:00
Chengliang e2f8c060a6 check及操作按钮权限 2022-06-01 17:18:40 +08:00
reset b8f7c82534
!26 岗位复制及联查部门
Merge pull request !26 from reset/feature/cl
2022-06-01 08:27:45 +00:00
Chengliang 064c40d299 岗位剩余接口对接 2022-06-01 16:22:56 +08:00
reset 95b756b71d
!25 岗位扩展静态页面
Merge pull request !25 from reset/feature/cl
2022-05-30 09:13:49 +00:00
Chengliang 24d9f3bc9e 岗位扩展静态页面 2022-05-30 17:11:10 +08:00
liyongshun 5c2268f4f9 代码还原 2022-05-30 10:25:30 +08:00
reset 74e4f4ca88
!24 组织架构树
Merge pull request !24 from reset/feature/cl
2022-05-30 01:51:39 +00:00
Chengliang 211c0e6634 组织架构树 2022-05-30 09:49:02 +08:00
liyongshun 3591986440 Merge branch 'dev' of gitee.com:jmlcl/trunk into dev 2022-05-30 09:29:29 +08:00
reset 88b8e435df
!23 岗位页面初始化
Merge pull request !23 from reset/feature/cl
2022-05-26 09:30:47 +00:00
Chengliang 34107bee55 岗位页面初始化 2022-05-26 17:28:18 +08:00
reset 4668fb43e1
!22 编制管理页面
Merge pull request !22 from reset/feature/cl
2022-05-26 05:57:02 +00:00
Chengliang 27c8a11576 编制管理页面 2022-05-26 13:55:26 +08:00
reset c195435037
!21 日志操作
Merge pull request !21 from reset/feature/cl
2022-05-25 07:42:53 +00:00
Chengliang ed3a11e7b6 日志前端渲染 2022-05-25 15:39:34 +08:00
reset 35317e4b20
!20 完成显示列定制
Merge pull request !20 from reset/feature/cl
2022-05-25 07:00:13 +00:00
Chengliang 3c8f0cbfaf 完成显示列定制 2022-05-25 14:58:27 +08:00
reset 2a8f30575b
!19 1
Merge pull request !19 from reset/feature/cl
2022-05-25 05:24:49 +00:00
Chengliang bb8920e3a0 完成公司/分部页面 2022-05-25 11:50:31 +08:00
reset 539a7e7ddd
!18 1
Merge pull request !18 from reset/feature/cl
2022-05-24 11:05:01 +00:00
Chengliang 5f478dcbfd 公司/分部分页修改 2022-05-24 19:00:33 +08:00
reset 5172007efe
!16 初始化编制方案页面
Merge pull request !16 from reset/feature/cl
2022-05-24 02:12:42 +00:00
Chengliang 786bac5aa1 编制方案静态页面初始化 2022-05-24 10:11:29 +08:00
reset ced190d417
!15 编制方案
Merge pull request !15 from reset/feature/cl
2022-05-24 01:52:48 +00:00
Chengliang 0d449516e2 编制管理静态页面 2022-05-24 09:48:57 +08:00
liyongshun a907ebf6dd Merge branch 'liys_dev' into dev 2022-05-23 17:46:26 +08:00
liyongshun 395fdad5ac 部门管理模块 2022-05-23 17:40:49 +08:00
reset 502f084452
!14 接口对接
Merge pull request !14 from reset/feature/cl
2022-05-23 09:30:16 +00:00
Chengliang 4c2ff27e46 公司/分部接口对接 2022-05-23 17:28:38 +08:00
reset d2305558be
!13 1
Merge pull request !13 from reset/feature/cl
2022-05-19 08:18:05 +00:00
Chengliang de7e0d50c6 公司/分部联查部门 新增 2022-05-19 16:15:19 +08:00
reset 2a0a1eb81d
!12 1
Merge pull request !12 from reset/feature/cl
2022-05-19 01:37:46 +00:00
Chengliang 669f92dbf2 扩展页面 2022-05-19 09:35:39 +08:00
reset 6dafc9b020
!11 1
Merge pull request !11 from reset/feature/cl
2022-05-18 09:53:34 +00:00
Chengliang d52cf8170e 扩展页面跳转 2022-05-18 17:51:57 +08:00
reset fdc7db75d1
!9 1
Merge pull request !9 from reset/feature/cl
2022-05-18 08:11:02 +00:00
Chengliang 337f8f8dff 集团标识 2022-05-18 16:01:09 +08:00
reset 6e7e5fa991
!8 1
Merge pull request !8 from reset/feature/cl
2022-05-18 07:57:00 +00:00
Chengliang 8eb704e23d 保护模式 2022-05-18 15:50:35 +08:00
reset aba9ee3840
!7 集团管理编辑优化
Merge pull request !7 from reset/feature/cl
2022-05-18 07:30:22 +00:00
Chengliang 44715650db 集团编辑功能完善 2022-05-18 15:24:46 +08:00
reset e7e1410cef
!6 1
Merge pull request !6 from reset/feature/cl
2022-05-18 07:02:09 +00:00
Chengliang b96ffa4205 solve conflict 2022-05-18 15:01:04 +08:00
reset 15e223269d
!5 solve conflict
Merge pull request !5 from reset/feature/cl
2022-05-18 06:59:48 +00:00
Chengliang db16ec323a solve conflict 2022-05-18 14:58:44 +08:00
reset c3d7a9db71
!4 1
Merge pull request !4 from reset/feature/cl
2022-05-18 06:56:09 +00:00
Chengliang a89634f0df 1 2022-05-18 14:55:10 +08:00
Chengliang 507ff9df6c solve conflct 2022-05-18 14:53:44 +08:00
Chengliang eff03741b2 solve conflict 2022-05-18 14:49:46 +08:00
Chengliang b073384fc7 solve conflict 2022-05-18 14:46:36 +08:00
Chengliang 98ae042c26 公司/发布列表页面 2022-05-18 14:34:01 +08:00
liyongshun 821c46bb9d Merge branch 'liys_dev' into dev 2022-05-18 14:15:34 +08:00
liyongshun 24f3350420 修改编号设置页面交互 2022-05-18 14:15:10 +08:00
liyongshun 81f9b5ca2f Merge branch 'liys_dev' into dev 2022-05-18 14:08:33 +08:00
liyongshun 9303fe3f3c 编号组成交互的完成 2022-05-18 13:49:24 +08:00
liyongshun e1cc281cff 分部编号设置的页面完成50% 2022-05-17 18:32:09 +08:00
reset e0432a21c5
!3 公司/分部扩展页面
Merge pull request !3 from reset/feature/cl
2022-05-17 06:49:34 +00:00
Chengliang dd9646213f 公司/发布扩展页面 2022-05-17 14:47:54 +08:00
liyongshun 89aab7a742 Merge branch 'dev' of gitee.com:jmlcl/trunk into dev 2022-05-17 14:11:59 +08:00
liyongshun 596816ebb2 删除测试文件 2022-05-17 14:11:56 +08:00
Chengliang 1bf9f9aa81 公司/分部扩展页面 2022-05-16 17:32:27 +08:00
liyongshun aaa31935b3 Merge branch 'dev' of gitee.com:jmlcl/trunk into dev 2022-05-16 17:13:39 +08:00
liyongshun 5bc2f44073 职务管理模块接口联调 2022-05-16 17:13:37 +08:00
Chengliang bb7bd102ec 公司/分部管理 2022-05-16 13:36:54 +08:00
Chengliang 774bd7203f 公司/分部管理初始化 2022-05-16 10:32:21 +08:00
liyongshun 559ed2cbee Merge branch 'dev' of gitee.com:jmlcl/trunk into dev 2022-05-13 18:09:32 +08:00
liyongshun 9e8d36bbc4 职务管理页面的新增 2022-05-13 18:06:15 +08:00
liyongshun 2e167f4099 职务管理页面新增 2022-05-13 18:05:45 +08:00
Chengliang 811c9da4d1 集团管理静态页面 2022-05-13 16:56:52 +08:00
Chengliang 67304df567 完成职等页面 职级页面 2022-05-12 14:57:36 +08:00
Chengliang 8c6d1df37c 等级方案页面完成 职等页面完成静态页面 2022-05-10 18:02:06 +08:00
Chengliang fb6ae67485 等级方案页面完成列表渲染,高级搜索,禁用标记等 2022-05-07 17:46:35 +08:00
Chengliang b7c99835da 等级方案页面 2022-05-06 16:53:43 +08:00
Chengliang a2fa127bfe 测试 2022-05-05 16:28:47 +08:00
184 changed files with 37669 additions and 1609 deletions

3
.gitignore vendored
View File

@ -1 +1,4 @@
node_modules
.idea
.vscode

View File

@ -8,35 +8,16 @@
泛微前端脚手架--组织架构图
#### 软件架构
软件架构说明
#### 版本1.0 已封版
该版本组织分为2套数据 采用单向同步的方式
#### 功能介绍
组织架构图
组织分权
人员卡片等自定义功能
#### 安装教程
1. xxxx
2. xxxx
3. xxxx
#### 使用说明
1. xxxx
2. xxxx
3. xxxx
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
#### 特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
#### 迭代计划
由于当前版本两套数据不好管理 下版计划将数据源统一换成ecology数据源

12
package-lock.json generated
View File

@ -5,8 +5,10 @@
"packages": {
"": {
"dependencies": {
"baidu-template-pro": "^1.0.0",
"dom-to-image": "^2.6.0",
"file-saver": "^2.0.5",
"lodash": "^4.17.21",
"orgchart": "^3.1.1",
"rc-org-chart": "^1.0.6",
"react-org-tree": "^1.0.0",
@ -300,6 +302,11 @@
"resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"node_modules/baidu-template-pro": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/baidu-template-pro/-/baidu-template-pro-1.0.0.tgz",
"integrity": "sha512-gnw6uvCn4CvZZ9d1Tu+a0B7BjQuNXvDcxsJk7bwxTpNutj6JFIxcy2sS0rB2/0/t9GwatoEIXd8HV0qkXpdRow=="
},
"node_modules/base64-arraybuffer": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
@ -2212,6 +2219,11 @@
}
}
},
"baidu-template-pro": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/baidu-template-pro/-/baidu-template-pro-1.0.0.tgz",
"integrity": "sha512-gnw6uvCn4CvZZ9d1Tu+a0B7BjQuNXvDcxsJk7bwxTpNutj6JFIxcy2sS0rB2/0/t9GwatoEIXd8HV0qkXpdRow=="
},
"base64-arraybuffer": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",

View File

@ -1,7 +1,9 @@
{
"dependencies": {
"baidu-template-pro": "^1.0.0",
"dom-to-image": "^2.6.0",
"file-saver": "^2.0.5",
"lodash": "^4.17.21",
"orgchart": "^3.1.1",
"rc-org-chart": "^1.0.6",
"react-org-tree": "^1.0.0",

View File

@ -0,0 +1,7 @@
import {
WeaTools
} from 'ecCom'
export const getBasicDataImportHasRight = (params) => {
return WeaTools.callApi('/api/hrm/import/resource/getBasicDataImportHasRight', 'GET', params);
}

View File

@ -0,0 +1,24 @@
import { WeaTools } from 'ecCom'
export const getTableEdit = (params) => {
return WeaTools.callApi('/api/hrm/carddisplay/getCustomCardTable', 'GET', params);
}
export const userDefineCardItemSave = (params) => {
return WeaTools.callApi('/api/hrm/carddisplay/saveCustomCard', 'POST', params);
}
export const hasRight = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/cardAccess/hasRight', 'GET', params);
}
export const getTable = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/cardAccess/getTable', 'GET', params);
}
export const cardAccessSave = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/cardAccess/save', 'POST', params);
}
export const getCardButtonTable = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/cardAccess/getCardButtonTable', 'GET', params);
}
export const saveFieldDefinedInfo = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/cardAccess/saveCardButton', 'POST', params);
}

View File

@ -0,0 +1,25 @@
import {
WeaTools
} from 'ecCom'
/**
* 获取权限
* @param {[type]} moduleName [模块名]
* @param {Object} params [description]
* @return {[type]} [description]
*/
export const authorized = (moduleName, params = {}, apiMethod = 'getHasRight') => WeaTools.callApi(`/api/hrm/${moduleName}/${apiMethod}`, 'POST', params);
/**
* 应用分权
*/
export const detachable = (params = {}) => WeaTools.callApi('/api/hrm/common/getDetachable', 'GET', params);
export const getDetachableAll = (params = {}) => WeaTools.callApi('/api/hrm/common/getDetachableAll', 'GET', params);
export const checkAuthAndDetach = (moduleName, params = {}, apiMethod = 'getHasRight') => Promise.all([authorized(moduleName, params = {}, apiMethod || 'getHasRight'), detachable()])
export const exportExcel = (params = {}) => WeaTools.callApi('/api/ec/dev/table/export', 'POST', params)
export const isEnableMultiLang = (params = {}) => WeaTools.callApi('/api/hrm/common/isEnableMultiLang', 'GET', params)
export const getPinYin = (params = {}) => WeaTools.callApi('/api/workflow/formSetting/fieldSet/getPinYin', 'POST', params)

View File

@ -0,0 +1,100 @@
import {
WeaTools
} from 'ecCom'
export const getSearchList = (params) => {
return fetch('/api/bs/hrmorganization/comp/listComp', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getDeptListByPid = (params) => {
return fetch('/api/bs/hrmorganization/dept/getDeptListByPid', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const deleteTableData = (params) => {
return fetch('/api/bs/hrmorganization/comp/deleteByIds', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getAdvanceSearchCondition = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/comp/getSearchCondition', 'GET', params);
}
export const add = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/comp/saveBaseComp', 'POST', params);
}
export const version = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/version/subcompanyfielddefined/save', 'POST', params);
}
export const selectVersions = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/version/subcompanyfielddefined/getVersion', 'GET', params);
}
export const editResource = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/comp/updateComp', 'POST', params);
}
export const updateForbiddenTag = (params) => {
return fetch('/api/bs/hrmorganization/comp/updateForbiddenTagById', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const move = (params) => {
return fetch('/api/bs/hrmorganization/comp/moveCompany', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getCompanyForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/comp/getCompSaveForm', 'GET', params);
}
export const getMoveForm = () => {
return WeaTools.callApi('/api/bs/hrmorganization/comp/getMoveForm', 'GET');
}
export const getCompanyExtendForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/comp/getCompBaseForm', 'GET', params);
}
export const getHasRight = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/comp/getHasRight', 'GET', params);
}

View File

@ -0,0 +1,21 @@
import { WeaTools } from 'ecCom'
//作废
//获取导入表单
export const getImportForm = (params) => {
return WeaTools.callApi(`/api/hrm/import/resource/getImportForm`, 'GET', params);
}
//导入文件提交
export const saveImport = (params) => {
return WeaTools.callApi(`/api/bs/hrmorganization/commonimport/saveImportResource`, 'POST', params);
}
//获取导入结果回调数据
export const getImportProcessLog = (params) => {
return WeaTools.callApi(`/api/hrm/importlog/getImportProcessLog`, 'GET', params);
}
//获取导入结果
export const getImportResult = (params) => {
return WeaTools.callApi(`/api/hrm/importlog/getImportResult`, 'GET', params);
}

View File

@ -0,0 +1,133 @@
import {
WeaTools
} from 'ecCom'
export const getSearchList = (params) => {
return fetch('/api/bs/hrmorganization/dept/listPage', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const deleteTableData = (params) => {
return fetch('/api/bs/hrmorganization/dept/deleteByIds', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getAdvanceSearchCondition = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/dept/getSearchCondition', 'GET', params);
}
export const getPostionTable = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/dept/getJobListByPid', 'GET', params);
}
export const getCopyForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/dept/getCopyForm', 'GET', params);
}
export const getMergeForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/dept/getMergeForm', 'GET', params);
}
export const version = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/version/departmentfielddefined/save', 'POST', params);
}
export const exportData = (ids) => {
fetch('/api/bs/hrmorganization/common/department/export').then(res => res.blob().then(blob => {
var filename=`部门档案.xlsx`
var a = document.createElement('a');
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = filename;
a.click();
window.URL.revokeObjectURL(url);
}))
}
export const selectVersions = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/version/departmentfielddefined/getVersion', 'GET', params);
}
export const getTransferForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/dept/getMoveForm', 'GET', params);
}
export const add = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/dept/saveBaseForm', 'POST', params);
}
export const copy = (params) => {
return fetch('/api/bs/hrmorganization/dept/copyDepartment', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const merge = (params) => {
return fetch('/api/bs/hrmorganization/dept/mergeDepartment', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const transfer = (params) => {
return fetch('/api/bs/hrmorganization/dept/moveDepartment', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const editResource = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/dept/updateForm', 'POST', params);
}
export const updateForbiddenTag = (params) => {
return fetch('/api/bs/hrmorganization/dept/updateForbiddenTagById', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getDeptForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/dept/getSaveForm', 'GET', params);
}
export const getDeptExtendForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/dept/getDeptBaseForm', 'GET', params);
}
export const getHasRight = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/dept/getHasRight', 'GET', params);
}

View File

@ -0,0 +1,134 @@
import {
WeaTools
} from 'ecCom';
/**
* 获取tab数据
* @param {Object} params [description]
* @return {[type]} [description]
*/
export const getHasRight = (moduleName, params = {}) => WeaTools.callApi(`/api/bs/hrmorganization/fieldDefined/${moduleName}/getHasRight`, 'GET', params)
export const getTabInfo = (moduleName, params = {}) => WeaTools.callApi(`/api/bs/hrmorganization/fieldDefined/${moduleName}/getTabInfo`, 'GET', params)
export const getFieldDefinedInfo = (moduleName, params = {}) => WeaTools.callApi(`/api/bs/hrmorganization/fieldDefined/${moduleName}/getFieldDefinedInfo`, 'GET', params)
export const saveFieldDefinedInfo = (moduleName,params) => {
return fetch(`/api/bs/hrmorganization/fieldDefined/${moduleName}/saveFields`, {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const removeFieldDefinedInfo = (moduleName,params) => {
return fetch(`/api/bs/hrmorganization/fieldDefined/${moduleName}/del`, {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const saveGroupInfo = (moduleName,params) => {
return fetch(`/api/bs/hrmorganization/fieldDefined/${moduleName}/saveTitle`, {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const saveGroupSettingInfo = (moduleName,params) => {
return fetch(`/api/bs/hrmorganization/fieldDefined/${moduleName}/saveGroup`, {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const changeTypeInfo = (moduleName,params) => {
return fetch(`/api/bs/hrmorganization/fieldDefined/${moduleName}/changeTree`, {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const removeGroupInfo = (moduleName,params) => {
return fetch(`/api/bs/hrmorganization/fieldDefined/${moduleName}/deleteTitle`, {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getTree = (moduleName,params = {}) => WeaTools.callApi(`/api/bs/hrmorganization/fieldDefined/${moduleName}/getTree`, 'GET', params)
export const saveTree = (moduleName,params) => {
return fetch(`/api/bs/hrmorganization/fieldDefined/${moduleName}/saveTree`, {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const deleteTree = (moduleName,params) => {
return fetch(`/api/bs/hrmorganization/fieldDefined/${moduleName}/deleteTree`, {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const changeGroup = (moduleName,params) => {
return fetch(`/api/bs/hrmorganization/fieldDefined/${moduleName}/changeGroup`, {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getEncryptFieldSettingForm = (params = {}) => WeaTools.callApi(`/api/encrypt/fieldsetting/getEncryptFieldSettingForm`, 'GET', params)
export const saveEncryptFieldSettingForm = (params = {}) => WeaTools.callApi(`/api/encrypt/fieldsetting/saveEncryptFieldSettingForm`, 'POST', params)
//获取字段可查看范围列表
export const getEncryptFieldScopeList = (params = {}) => WeaTools.callApi('/api/encrypt/fieldsetting/getEncryptFieldScopeList', 'POST', params);
//获取字段可查看范围表单
export const getEncryptFieldScopeForm = (params = {}) => WeaTools.callApi('/api/encrypt/fieldsetting/getEncryptFieldScopeForm', 'GET', params);
//保存字段可查看范围
export const saveEncryptFieldScopeSetting = (params = {}) => WeaTools.callApi('/api/encrypt/fieldsetting/saveEncryptFieldScopeSetting', 'POST', params);
//删除字段可查看范围
export const delEncryptFieldScopeSetting = (params = {}) => WeaTools.callApi('/api/encrypt/fieldsetting/delEncryptFieldScopeSetting', 'POST', params);

View File

@ -0,0 +1,29 @@
import {
WeaTools
} from 'ecCom'
export const edit = (params) => {
return fetch('/api/bs/hrmorganization/group/updateGroup', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getTabInfo = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/group/getTabInfo', 'GET', params);
}
export const getGroupForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/group/getGroupFormField', 'GET', params);
}
export const getHasRight = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/group/getHasRight', 'GET', params);
}

View File

@ -0,0 +1,11 @@
import {
WeaTools
} from 'ecCom';
export const editResource = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/hrmresource/updateForm', 'POST', params);
}
export const getResourceExtendForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/hrmresource/getTabForm', 'GET', params);
}

View File

@ -0,0 +1,16 @@
import { WeaTools } from 'ecCom'
//获取导入表单
export const getImportForm = (params) => {
return WeaTools.callApi(`/api/bs/hrmorganization/commonimport/getCommonForm`, 'GET', params);
}
//导入文件提交
export const saveImport = (params) => {
return WeaTools.callApi(`/api/bs/hrmorganization/commonimport/saveCommonImport`, 'POST', params);
}
//获取导入结果
export const getImportResult = (params) => {
return WeaTools.callApi(`/api/bs/hrmorganization/commonimport/getImportResult`, 'GET', params);
}

View File

@ -0,0 +1,29 @@
import { WeaTools } from 'ecCom'
//获取导入表单
export const getImportForm = (params) => {
return WeaTools.callApi(`/api/hrm/import/resource/getImportForm`, 'GET', params);
}
//导入文件提交
export const saveImport = (params) => {
return WeaTools.callApi(`/api/bs/hrmorganization/commonimport/saveImportResource`, 'POST', params);
}
//获取导入结果回调数据
export const getImportProcessLog = (params) => {
return WeaTools.callApi(`/api/hrm/importlog/getImportProcessLog`, 'GET', params);
}
//获取导入结果
export const getImportResult = (params) => {
return WeaTools.callApi(`/api/hrm/importlog/getImportResult`, 'GET', params);
}
//历史导入信息查询
export const getImportHistory = (params) => {
return WeaTools.callApi(`/api/hrm/importlog/getImportHistory`, 'GET', params);
}
//导入日志
export const getImportLogDetail = (params) => {
return WeaTools.callApi(`/api/hrm/importlog/getImportColResultLog`, 'GET', params);
}
//导入日志 - 高级搜索
export const getImportLogSearchCondition = (params) => {
return WeaTools.callApi(`/api/hrm/importlog/getHistorySearchCondition`, 'GET', params);
}

View File

@ -1,6 +1,6 @@
import { WeaTools } from 'ecCom';
//组织架构图(简单)
//组织架构图(简单)
export const getSimpleOrganizationDatas = params => {
return WeaTools.callApi('/api/hrm/module/organization/simple/datas', 'GET', params);
};

View File

@ -0,0 +1,114 @@
import {
WeaTools
} from 'ecCom'
export const getSearchList = (params) => {
return fetch('/api/bs/hrmorganization/job/listPage', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const deleteTableData = (params) => {
return fetch('/api/bs/hrmorganization/job/deleteByIds', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getAdvanceSearchCondition = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/job/getSearchCondition', 'GET', params);
}
export const getHrmListByJobId = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/job/getHrmListByJobId', 'GET', params);
}
export const getCopyForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/job/getCopyForm', 'GET', params);
}
export const refresh = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/job/refresh', 'GET', params);
}
export const add = (params) => {
return fetch('/api/bs/hrmorganization/job/saveBaseForm', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const copy = (params) => {
return fetch('/api/bs/hrmorganization/job/copyJobItem', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const editResource = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/job/updateForm', 'POST', params);
}
export const updateForbiddenTag = (params) => {
return fetch('/api/bs/hrmorganization/job/updateForbiddenTagById', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getJobForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/job/getSaveForm', 'GET', params);
}
export const getSchemeInfo = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/sequence/getSchemeInfo', 'GET', params);
}
export const getJobExtendForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/job/getJobBaseForm', 'GET', params);
}
export const getHasRight = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/job/getHasRight', 'GET', params);
}
export const getLevelId = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/grade/getLevelId', 'GET', params);
}
export const getMergeForm = (params = {}) => {
return WeaTools.callApi('/api/bs/hrmorganization/job/getMergeForm', 'GET', params);
}
export const merge = (params) => {
return fetch('/api/bs/hrmorganization/job/mergeJob', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}

View File

@ -0,0 +1,72 @@
import {
WeaTools
} from 'ecCom'
export const getSearchList = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/grade/getGradeTable', 'GET', params);
}
export const deleteTableData = (params) => {
return fetch('/api/bs/hrmorganization/grade/deleteByIds', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getAdvanceSearchCondition = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/grade/getSearchCondition', 'GET', params);
}
export const add = (params) => {
return fetch('/api/bs/hrmorganization/grade/saveGrade', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const edit = (params) => {
return fetch('/api/bs/hrmorganization/grade/updateGrade', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const updateForbiddenTag = (params) => {
return fetch('/api/bs/hrmorganization/grade/updateForbiddenTagById', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getGradeForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/grade/getGradeForm', 'GET', params);
}
export const getTabInfo = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/grade/getTabInfo', 'GET', params);
}
export const getHasRight = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/grade/getHasRight', 'GET', params);
}
export const getTree = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/scheme/getTreeData', 'GET', params);
}

View File

@ -0,0 +1,72 @@
import {
WeaTools
} from 'ecCom'
export const getSearchList = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/level/getLevelTable', 'GET', params);
}
export const deleteTableData = (params) => {
return fetch('/api/bs/hrmorganization/level/deleteByIds', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getAdvanceSearchCondition = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/level/getSearchCondition', 'GET', params);
}
export const add = (params) => {
return fetch('/api/bs/hrmorganization/level/saveLevel', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const edit = (params) => {
return fetch('/api/bs/hrmorganization/level/updateLevel', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const updateForbiddenTag = (params) => {
return fetch('/api/bs/hrmorganization/level/updateForbiddenTagById', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getLevelForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/level/getLevelForm', 'GET', params);
}
export const getTabInfo = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/level/getTabInfo', 'GET', params);
}
export const getHasRight = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/level/getTableBtn', 'GET', params);
}
export const getTree = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/scheme/getTreeData', 'GET', params);
}

View File

@ -0,0 +1,12 @@
import {
WeaTools
} from 'ecCom'
export const getLogList = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/log/listPage', 'GET', params);
}
export const getAdvanceSearchCondition = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/log/getSearchCondition', 'GET', params);
}

View File

@ -0,0 +1,62 @@
import {
WeaTools
} from 'ecCom'
export const getSearchList = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/detach/getTable', 'GET', params);
}
export const getHasRight = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/detach/getTableBtn', 'GET', params);
}
export const getAdvanceSearchCondition = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/detach/getSearchCondition', 'GET', params);
}
export const getForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/detach/getForm', 'GET', params);
}
export const doDetachSwitch = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/detach/doDetach', 'GET', params);
}
export const deleteTableData = (params) => {
return fetch('/api/bs/hrmorganization/detach/deleteByIds', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const add = (params) => {
return fetch('/api/bs/hrmorganization/detach/save', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const edit = (params) => {
return fetch('/api/bs/hrmorganization/detach/update', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}

View File

@ -0,0 +1,27 @@
import { WeaTools } from 'ecCom'
//导入页面权限
export const getHasRight = () => {
return WeaTools.callApi(`/api/bs/hrmorganization/commonimport/getHasRight`, 'GET');
}
//选择导入字段
export const getImportFields = (params) => {
return WeaTools.callApi(`/api/bs/hrmorganization/commonimport/getImportFields`, 'GET', params);
}
//导入文件提交
export const saveImport = (params) => {
return WeaTools.callApi(`/api/bs/hrmorganization/commonimport/saveImport`, 'POST', params);
}
//获取导入表单
export const getImportForm = (params) => {
return WeaTools.callApi(`/api/bs/hrmorganization/commonimport/getImportForm`, 'GET', params);
}
//获取导入结果
export const getImportResult = (params) => {
return WeaTools.callApi(`/api/bs/hrmorganization/commonimport/getImportResult`, 'GET', params);
}

View File

@ -0,0 +1,115 @@
/*
* Author: 黎永顺
* Description:
* Date: 2022-06-07 09:52:01
* LastEditTime: 2022-06-15 13:06:02
*/
import { WeaTools } from "ecCom";
/**
* name:获取编号设置
* param {*} params serialtype SUBCOMPANY分部
* return {*}
*/
export const getCodeSetting = (params) => {
return WeaTools.callApi("/api/hrm/codeSetting/getCodeSetting", "GET", params);
};
/**
* name: 保存编号设置
* param {*} params
* return {*}
*/
export const saveOrUpdateCodeSetting = (params) => {
return WeaTools.callApi(
"/api/hrm/codeSetting/saveOrUpdateCodeSetting",
"POST",
params
);
};
/**
* name: 保存起始编号设置
* param {*} params
* return {*}
*/
export const saveStartNum = (params) => {
return WeaTools.callApi("/api/hrm/codeSetting/saveStartNum", "POST", params);
};
/**
* name: 起始编号设置
* param {*} params
* return {*}
*/
export const getStartNumForm = (params) => {
return WeaTools.callApi(
"/api/hrm/codeSetting/getStartNumForm",
"GET",
params
);
};
/**
* name: 高级搜索条件
* param {*} params
* return {*}
*/
export const getAdvanceSearchCondition = (params) => {
return WeaTools.callApi(
"/api/hrm/codeSetting/getAdvanceSearchCondition",
"GET",
params
);
};
/**
* name: 预留编号设置列表查询
* param {*} params
* return {*}
*/
export const getSearchReservedCodeList = (params) => {
return WeaTools.callApi(
"/api/hrm/codeSetting/getSearchReservedCodeList",
"POST",
params
);
};
/**
* name: 保存预留编号设置
* param {*} params
* return {*}
*/
export const saveReservedCode = (params) => {
return WeaTools.callApi(
"/api/hrm/codeSetting/saveReservedCode",
"POST",
params
);
};
/**
* name: 新增预留编号表单查询
* param {*} params
* return {*}
*/
export const getReservedCodeFrom = (params) => {
return WeaTools.callApi(
"/api/hrm/codeSetting/getReservedCodeFrom",
"GET",
params
);
};
/**
* name: 删除预留编号
* param {*} params
* return {*}
*/
export const deleteReservedCodeById = (params) => {
return WeaTools.callApi(
"/api/hrm/codeSetting/deleteReservedCodeById",
"POST",
params
);
};

View File

@ -0,0 +1,126 @@
/*
* Author: 黎永顺
* Description:
* Date: 2022-05-13 16:36:09
* LastEditTime: 2022-06-22 14:37:27
*/
import { WeaTools } from "ecCom";
export const getHasRight = params => {
return WeaTools.callApi(
"/api/bs/hrmorganization/postinfo/getHasRight",
"GET",
params
);
};
export const getSearchCondition = params => {
return WeaTools.callApi(
"/api/bs/hrmorganization/postinfo/getSearchCondition",
"GET",
params
);
};
export const getPostInfoForm = params => {
return WeaTools.callApi(
"/api/bs/hrmorganization/postinfo/getPostInfoForm",
"GET",
params
);
};
export const savePostInfo = params => {
return fetch("/api/bs/hrmorganization/postinfo/savePostInfo", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
});
};
export const updatePostInfo = params => {
return fetch("/api/bs/hrmorganization/postinfo/updatePostInfo", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
});
};
export const updateForbiddenTagById = params => {
return fetch("/api/bs/hrmorganization/postinfo/updateForbiddenTagById", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
});
};
export const savePost = params => {
return fetch("/api/bs/hrmorganization/post/savePost", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
});
};
export const updatePost = params => {
return fetch("/api/bs/hrmorganization/post/updatePost", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
});
};
export const deleteByIds = params => {
return fetch("/api/bs/hrmorganization/post/deleteByIds", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
});
};
export const deletePostinfoByIds = params => {
return fetch("/api/bs/hrmorganization/postinfo/deleteByIds", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
});
};
export const getTreeData = params => {
return WeaTools.callApi(
"/api/bs/hrmorganization/post/getTreeData",
"GET",
params
);
};
export const getPostForm = params => {
return WeaTools.callApi(
"/api/bs/hrmorganization/post/getPostForm",
"GET",
params
);
};
export const getPostInfoTable = params => {
return WeaTools.callApi(
"/api/bs/hrmorganization/postinfo/getPostInfoTable",
"GET",
params
);
};

View File

@ -0,0 +1,29 @@
import {
WeaTools
} from 'ecCom'
export const getHasRight = () => {
return WeaTools.callApi('/api/bs/hrmorganization/personnelresume/hasRight', 'GET');
}
export const getPersonnelResume = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/personnelresume/getResumeList', 'GET', params);
}
export const getAdvanceSearchCondition = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/personnelresume/personnelScreening', 'GET', params);
}
export const downloadPerResume = (type) => {
fetch(`/api/bs/hrmorganization/personnelresume/downloadPerResume?type=${type}`).then(res => res.blob().then(blob => {
var filename= type == 0 ? `人员简历合并导出.docx` : `全部简历.zip`
var a = document.createElement('a');
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = filename;
a.click();
window.URL.revokeObjectURL(url);
}))
}

View File

@ -0,0 +1,9 @@
import { WeaTools } from 'ecCom';
export const getQtxConfigInfo = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/config/selectConfigInfo', 'GET', params);
}
export const saveQtxConfigInfo = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/config/saveConfigInfo', 'POST', params);
}

View File

@ -0,0 +1,16 @@
import {
WeaTools
} from 'ecCom';
export const saveQuickSearchInfo = (params) => {
return WeaTools.callApi(`/api/bs/hrmorganization/quicksearch/saveQuickSearchInfo`, 'POST', params);
}
export const saveQuickSearchDetailInfo = (params) => {
return WeaTools.callApi(`/api/bs/hrmorganization/quicksearch/saveQuickSearchDetailInfo`, 'POST', params);
}
export const getQuickSearchInfo = (params) => WeaTools.callApi(`/api/bs/hrmorganization/quicksearch/getQuickSearchInfo`, 'GET', params);
export const getQuickSearchDetailInfo = (params) => WeaTools.callApi(`/api/bs/hrmorganization/quicksearch/getQuickSearchDetailInfo`, 'GET', params);

View File

@ -0,0 +1,66 @@
import {
WeaTools
} from 'ecCom'
export const getSearchList = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/scheme/getTable', 'GET', params);
}
export const deleteTableData = (params) => {
//return WeaTools.callApi('/api/bs/hrmorganization/scheme/deleteByIds', 'POST', params);
return fetch('/api/bs/hrmorganization/scheme/deleteByIds', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getAdvanceSearchCondition = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/scheme/getSearchCondition', 'GET', params);
}
export const add = (params) => {
//return WeaTools.callApi('/api/bs/hrmorganization/scheme/save', 'POST', params);
return fetch('/api/bs/hrmorganization/scheme/save', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const edit = (params) => {
return fetch('/api/bs/hrmorganization/scheme/updateScheme', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const updateForbiddenTag = (params) => {
return fetch('/api/bs/hrmorganization/scheme/updateForbiddenTagById', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getSchemeForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/scheme/getSchemeForm', 'GET', params);
}
export const getHasRight = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/scheme/getTableBtn', 'GET', params);
}

View File

@ -0,0 +1,122 @@
import {
WeaTools
} from 'ecCom'
export const getSearchList = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/hrmresource/listPage', 'GET', params);
}
export const getAdvanceSearchCondition = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/hrmresource/getSearchCondition', 'GET', params);
}
export const add = (params) => {
return fetch('/api/bs/hrmorganization/hrmresource/saveBaseForm', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getSchemeForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/hrmresource/getSaveForm', 'GET', params);
}
export const getHasRight = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/hrmresource/getHasRight', 'GET', params);
}
export const getQuickSearchCondition = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/quicksearch/getQuickSearchCondition', 'GET', params);
}
export const editResource = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/hrmresource/updateForm', 'POST', params);
}
export const getResourceExtendForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/hrmresource/getBaseForm', 'GET', params);
}
export const version = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/version/resourcefielddefined/save', 'POST', params);
}
export const exportResource = (ids) => {
fetch('/api/bs/hrmorganization/common/resource/export?ids='+ids).then(res => res.blob().then(blob => {
var filename=`人员档案.xlsx`
var a = document.createElement('a');
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = filename;
a.click();
window.URL.revokeObjectURL(url);
}))
}
export const saveSearchTemplate = (params) => {
return fetch('/api/bs/hrmorganization/hrmresource/saveSearchTemplate', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const saveCustomTemplate = (params) => {
return fetch('/api/bs/hrmorganization/hrmresource/saveCustomTemplate', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const deleteSearchTemplate = (params) => {
return fetch('/api/bs/hrmorganization/hrmresource/deleteSearchTemplate', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getSearchTemplate = (params) => {
return WeaTools.callApi(`/api/bs/hrmorganization/hrmresource/getSearchTemplate`, 'GET',params);
}
export const getTemplateSelectKeys = (params) => {
return WeaTools.callApi(`/api/bs/hrmorganization/hrmresource/getTemplateSelectKeys`, 'GET',params);
}
export const updateCustomTemplate = (params) => {
return WeaTools.callApi(`/api/bs/hrmorganization/hrmresource/updateCustomTemplate`, 'POST',params);
}
export const saveColumnsCustomTemplate = (params) => {
return WeaTools.callApi(`/api/bs/hrmorganization/hrmresource/saveColumnsCustomTemplate`, 'POST',params);
}
export const getEditTable = () => {
return WeaTools.callApi('/api/bs/hrmorganization/hrmresource/getCustomTemplate', 'GET');
}
export const getCustomTransferData = (id) => {
return WeaTools.callApi(`/api/bs/hrmorganization/hrmresource/getCustomTransferData?templateId=${id}`, 'GET');
}

View File

@ -0,0 +1,106 @@
import {
WeaTools
} from 'ecCom'
export const getSearchList = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/resourceBasicInfo/getTable', 'GET', params);
}
export const deleteTableData = (params) => {
return fetch('/api/bs/hrmorganization/resourceBasicInfo/delete', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const recoverData = (params) => {
return fetch('/api/bs/hrmorganization/resourceBasicInfo/recover', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getAdvanceSearchCondition = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/resourceBasicInfo/getSearchCondition', 'GET', params);
}
export const addType = (params) => {
return fetch('/api/bs/hrmorganization/resourceBasicInfo/saveResourceItemClass', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const editType = (params) => {
return fetch('/api/bs/hrmorganization/resourceBasicInfo/updateResourceItemClass', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const deleteType = (params) => {
return fetch('/api/bs/hrmorganization/resourceBasicInfo/deleteResourceItemClass', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getTypeForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/resourceBasicInfo/getItemClassForm', 'GET', params);
}
export const add = (params) => {
return fetch('/api/bs/hrmorganization/resourceBasicInfo/save', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const edit = (params) => {
return fetch('/api/bs/hrmorganization/resourceBasicInfo/update', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/resourceBasicInfo/getForm', 'GET', params);
}
export const getHasRight = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/resourceBasicInfo/getHasRight', 'GET', params);
}
export const getTree = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/resourceBasicInfo/getTreeData', 'GET', params);
}

View File

@ -0,0 +1,13 @@
import {
WeaTools
} from 'ecCom'
export const getCardData = (id) => {
return WeaTools.callApi(`/api/bs/hrmorganization/personnelcard/getPersonnelCard?id=${id}`, 'GET');
}
export const selectVersions = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/version/resourcefielddefined/getVersion', 'GET', params);
}

View File

@ -0,0 +1,69 @@
import {
WeaTools
} from 'ecCom'
export const getSearchList = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/sequence/getSequenceTable', 'GET', params);
}
export const deleteTableData = (params) => {
return fetch('/api/bs/hrmorganization/sequence/deleteByIds', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getAdvanceSearchCondition = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/sequence/getSearchCondition', 'GET', params);
}
export const add = (params) => {
return fetch('/api/bs/hrmorganization/sequence/saveSequence', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const edit = (params) => {
return fetch('/api/bs/hrmorganization/sequence/updateSequence', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const updateForbiddenTag = (params) => {
return fetch('/api/bs/hrmorganization/sequence/updateForbiddenTagById', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getSequenceForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/sequence/getSequenceForm', 'GET', params);
}
export const getTabInfo = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/sequence/getTabInfo', 'GET', params);
}
export const getHasRight = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/sequence/getHasRight', 'GET', params);
}

View File

@ -0,0 +1,53 @@
import {
WeaTools
} from 'ecCom'
export const getSearchList = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/staff/getTable', 'GET', params);
}
export const deleteTableData = (params) => {
return fetch('/api/bs/hrmorganization/staff/deleteByIds', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getAdvanceSearchCondition = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/staff/getSearchCondition', 'GET', params);
}
export const add = (params) => {
return fetch('/api/bs/hrmorganization/staff/saveStaff', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const edit = (params) => {
return fetch('/api/bs/hrmorganization/staff/updateStaff', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/staff/getForm', 'GET', params);
}
export const getHasRight = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/staff/getHasRight', 'GET', params);
}

View File

@ -0,0 +1,64 @@
import {
WeaTools
} from 'ecCom'
export const getSearchList = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/staffplan/getTable', 'GET', params);
}
export const deleteTableData = (params) => {
return fetch('/api/bs/hrmorganization/staffplan/deleteByIds', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getAdvanceSearchCondition = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/staffplan/getSearchCondition', 'GET', params);
}
export const add = (params) => {
return fetch('/api/bs/hrmorganization/staffplan/saveStaffPlan', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const edit = (params) => {
return fetch('/api/bs/hrmorganization/staffplan/updateStaffPlan', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const updateForbiddenTag = (params) => {
return fetch('/api/bs/hrmorganization/staffplan/updateForbiddenTagById', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
}
export const getSchemeForm = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/staffplan/getForm', 'GET', params);
}
export const getHasRight = (params) => {
return WeaTools.callApi('/api/bs/hrmorganization/staffplan/getHasRight', 'GET', params);
}

View File

@ -0,0 +1,79 @@
import {
WeaPopoverHrm,
WeaLocaleProvider
} from 'ecCom';
import {
WeaLogView
} from 'comsMobx';
import {
isEnableMultiLang
} from '../apis/common';
const WeaLogViewComp = WeaLogView.Component;
const {
LogStore
} = WeaLogView;
import LogView from "./log/LogView";
import {LogViewStore} from "../stores/logview"
class Home extends React.Component {
constructor(props) {
super(props);
this.state = {
keys: new Date().getTime(),
visible: false,
logViewStore: new LogViewStore()
}
window.setLogViewProp = this.setLogViewProp;
}
componentDidMount(){
isEnableMultiLang().then(data => {
window.inputType = {
inputType: 'NORMAL'
}
if (data.status === '1') {
if (data.isEnableMultiLang) {
window.inputType = {
inputType: 'MULTILANG',
isBase64: true
}
}
}
}, error => {
window.inputType = {
inputType: 'NORMAL'
}
});
}
setLogViewProp = (props) => {
this.setState({
visible: true,
logViewStore: new LogViewStore(),
...props
});
}
onCancel = () => {
this.setState({
visible: false
})
}
render() {
//const isSingle = window.location.pathname.indexOf('/spa/hrm/engine') > -1;
return (
<div style={{height:"100%"}}>
<WeaPopoverHrm inDialog={true} ecId={`${this && this.props && this.props.ecId || ''}_WeaPopoverHrm@jp3tsb`} />
<LogView ecId={`${this && this.props && this.props.ecId || ''}_LogView@mc1954`} {...this.state} onCancel={this.onCancel}/>
<WeaLocaleProvider ecId={`${this && this.props && this.props.ecId || ''}_WeaLocaleProvider@3on3aj`}>
{this.props.children}
</WeaLocaleProvider>
</div>
)
}
}
export default Home

View File

@ -0,0 +1,240 @@
import {
WeaNewScroll,
WeaSearchGroup,
WeaMoreButton,
WeaDialog
} from 'ecCom'
import {
inject,
observer,
} from 'mobx-react'
import {
Spin,
Button,
Pagination,
Steps,
Upload,
Icon,
Row,
Col,
Progress
} from 'antd'
import {
WeaSwitch,
WeaTableNew
} from 'comsMobx'
import {
i18n
} from '../public/i18n';
import { addContentPath } from '../util/index.js'
const Step = Steps.Step;
const Dragger = Upload.Dragger;
const WeaTable = WeaTableNew.WeaTable;
@inject("importDialog")
@observer
export default class ImportDialog extends React.Component {
constructor(props) {
super(props);
this.state = {
width: 800,
height: 600,
title: '数据导入',
}
}
getCircle() {
let style = {
width: 20,
height: 20,
backgroundColor: '#D8D8D8',
webkitBorderRadius: 10,
mozBorderRadius: 10,
msBorderRadius: 10,
oBorderRadius: 10,
borderRadius: 10,
//paddingLeft: 6,
textAlign: 'center',
}
return style;
}
getIllustration(val, url, index, link) {
let p;
if (index == 0) {
p = (<p>{i18n.label.downLoadTemplete()}: <a href={addContentPath(url)}>{i18n.label.importTemplate()}</a></p>);
} else {
p = (<p><div dangerouslySetInnerHTML={{ __html: val }} /></p>);
}
return p;
}
next() {
const { importDialog } = this.props;
let { current, steps } = importDialog;
current = current + 1;
if (current === steps.length) {
current = 0;
importDialog.init();
}
importDialog.current = current;
current === steps.length - 1 && importDialog.startImport();
}
getForm() {
const {
importDialog
} = this.props;
const {
condition
} = importDialog;
let _arr = [];
condition.map((c, i) => {
let arr = [];
c.items.map((field, index) => {
arr.push({
com: (
<div>
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@hz50xl@${index}`}>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@fgfbrv@${index}`} span={1} offset={4} style={{ marginTop: 15 }}>
<div style={this.getCircle()}>
<div style={{ paddingTop: 2 }}>{index + 1}</div>
</div>
</Col>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@5rom81@${index}`} span={17} style={{ marginTop: 15 }}>
{this.getIllustration(field.value, field.link, index, field)}
</Col>
</Row>
</div>
),
colSpan: 1
})
})
_arr.push(<div><WeaSearchGroup ecId={`${this && this.props && this.props.ecId || ''}_WeaSearchGroup@bo47pp@${i}`} needTigger={true} title={c.title} showGroup={c.defaultshow} items={arr} col={1} /></div>)
});
return _arr;
}
setFileId(fileInfo) {
const { importDialog } = this.props;
fileInfo.file.response && importDialog.setExcelfile(fileInfo.file.response.data.fileid);
importDialog.filelist = fileInfo.fileList;
}
reRenderColumns(c) {
c.forEach(item => {
if (item.dataIndex == 'operatedetail') {
item.render = function (text, record) {
return <span style={{ color: '#FF0000' }}>{text}</span>
}
}
});
}
render() {
const {
importDialog
} = this.props, {
importVisible,steps,current, pvisable, percent, failnum, succnum, importResultTip, importResultStore, importStatus, loading, date
} = importDialog, {
width,
height,
title
} = this.state;
const buttons = [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@jd6baw`} type="primary" onClick={() => this.next()}>{current === steps.length - 1 ? '关闭' : '开始导入'}</Button>),
];
const props = {
name: 'file',
action: '/api/doc/upload/uploadFile',
accept: '.xls,.xlsx',
multiple:false
};
return (
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@1txk5f`}
title={title}
icon="icon-coms-upload"
iconBgcolor="#217346"
visible={importVisible}
closable={true}
hasScroll={true}
onCancel={() => importDialog.init()}
buttons={buttons}
style={{ width: width, height: height }}
>
<div style={{ marginTop: 24 }}>
<Steps current={current}>
{steps.map((s, i) => <Step key={i} title={s.title} description={s.description} />)}
</Steps>
</div>
<div style={{ padding: 24 }}>
{
current == 0 && <WeaNewScroll ecId={`${this && this.props && this.props.ecId || ''}_WeaNewScroll@2908z2`} ref="scrollBar">
<Dragger
{...props}
onChange={
(fileInfo) => {
this.setFileId(fileInfo)
}
}
>
<div style={{ padding: '25px 0' }}>
<p className="ant-upload-drag-icon">
<Icon type="inbox" />
</p>
<p className="ant-upload-text">点击或将文件拖拽到此区域上传</p>
<p className="ant-upload-hint">支持单个或批量上传严禁上传公司内部资料及其他违禁文件</p>
</div>
</Dragger>
{this.getForm()}
</WeaNewScroll>
}
{
current == 1 && <div>
{
importStatus == 'over' && <div className="hrm-import-result-icon" style={{ paddingTop: failnum == 0 ? 100 : 15 }}>
<div style={{ width: 30, height: 30, borderRadius: 25, padding: 8, display: 'inline-block', backgroundColor: succnum > 0 ? '#54D3A2' : '#FF0000' }}>
<Icon ecId={`${this && this.props && this.props.ecId || ''}_Icon@2fblod`} type={succnum > 0 ? 'check' : 'cross'} style={{ color: '#fff' }} />
</div><span style={{ paddingLeft: 5 }}>{importResultTip}</span>
</div>
}
{
failnum > 0 &&
<WeaTable ecId={`${this && this.props && this.props.ecId || ''}_WeaTable@h7l6fo`}
comsWeaTableStore={importResultStore}
bordered
needScroll={true}
scroll={{ y: 330 }}
getColumns={c => this.reRenderColumns(c)}
/>
}
<WeaDialog
title="导入进度"
onCancel={() => importDialog.pvisable = false}
visible={pvisable}
style={{ width: 300, height: 50 }}
>
<div style={{ "padding": "15px" }}>
<Progress percent={percent} strokeWidth={7} />
</div>
</WeaDialog>
</div>
}
</div>
</WeaDialog>
)
}
}

View File

@ -0,0 +1,169 @@
import {
WeaDialog,
WeaFormItem,
WeaNewScroll,
WeaSearchGroup,
WeaMoreButton,
WeaPopoverHrm
} from 'ecCom'
import {
Spin,
Button,
} from 'antd'
import {
WeaSwitch
} from 'comsMobx'
import {
i18n
} from '../public/i18n';
import AttachToNumberField from './NewNumberField';
export default class NewAndEditDialog extends React.Component {
constructor(props) {
super(props);
this.state = {
width: 700,
}
}
getForm() {
const {
condition,
form,
isFormInit,
} = this.props;
let arr = [];
isFormInit && condition.map(c => {
c.items.map((field, index) => {
arr.push(<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@jacv6v@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
error={form.getError(field)}
tipPosition="bottom"
wrapperCol={{ span: `${field.fieldcol}` }}>
{<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@7vxyfr@${index}`} fieldConfig={field} form={form} formParams={form.getFormParams()} onChange={this.onChange} />}
{field.domkey[0] == 'subcompanycode' && field.viewAttr != '1' && <AttachToNumberField field={field} form={form} isEdit={true}/>}
{field.domkey[0] == 'departmentcode' && field.viewAttr != '1' && <AttachToNumberField field={field} form={form} isEdit={true}/>}
{/* {field.domkey[0] == 'job_no' && field.viewAttr != '1' && <AttachToNumberField field={field} form={form} isEdit={true}/>}
{field.domkey[0] == 'work_code' && field.viewAttr != '1' && <AttachToNumberField field={field} form={form} isEdit={true}/>} */}
</WeaFormItem>)
})
})
return <div style={{"height":"100%","padding":"30px"}} className="wea-form-item-group">{arr}</div>
}
onChange = data => {
const {
bindChangeEnvent,
moduleName
} = this.props;
if (moduleName == 'jobGrade' && data.schemeId) {
bindChangeEnvent(data.schemeId.value);
}
if (moduleName == 'staffScheme' && data.planYear) {
bindChangeEnvent(data.planYear.value);
}
if (moduleName == 'staff' && data.planId) {
bindChangeEnvent(data);
}
};
onBlur = data => {
//console.log("onBlur 回调", data);
};
getSearchGroupForm() {
const {
condition,
form,
isFormInit,
isEdit
} = this.props;
let arr = [];
isFormInit && condition.map((c, i) => {
let _arr = [];
c.items.map((field, index) => {
_arr.push({
com: (
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@merei2@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
error={form.getError(field)}
tipPosition="bottom"
wrapperCol={{ span: `${field.fieldcol}` }}
underline={isEdit ? false : true}
>
<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@5r6c5a@${index}`} fieldConfig={field} form={form} formParams={form.getFormParams()} onChange={this.onChange}
onBlur={this.onBlur} />
{field.domkey[0] == 'subcompanycode' && field.viewAttr != '1' && <AttachToNumberField field={field} form={form} isEdit={true}/>}
{field.domkey[0] == 'departmentcode' && field.viewAttr != '1' && <AttachToNumberField field={field} form={form} isEdit={true}/>}
{/* {field.domkey[0] == 'job_no' && field.viewAttr != '1' && <AttachToNumberField field={field} form={form} isEdit={true}/>}
{field.domkey[0] == 'work_code' && field.viewAttr != '1' && <AttachToNumberField field={field} form={form} isEdit={true}/>} */}
</WeaFormItem>
),
colSpan: 1
})
})
arr.push(<WeaSearchGroup ecId={`${this && this.props && this.props.ecId || ''}_WeaSearchGroup@qaih5l@${i}`} needTigger={true} title={c.title} showGroup={c.defaultshow} items={_arr} col={1} />)
})
return arr;
}
render() {
const {
title,
visible,
save,
onCancel,
loading,
isEdit,
height,
conditionLen,
saveAndSetting
} = this.props, {
width,
} = this.state;
const buttons = [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@jd6baw`} type="primary" onClick={() => save()} disabled={loading}>{i18n.button.save()}</Button>),
(saveAndSetting && <Button ecId={`${this && this.props && this.props.ecId || ''}_Button@jd6baw`} type="primary" onClick={() => saveAndSetting()} disabled={loading}>{i18n.button.saveAndSetting()}</Button>),
(<WeaMoreButton ecId={`${this && this.props && this.props.ecId || ''}_WeaMoreButton@e4f4n1`} />)
];
return (
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@1txk5f`}
className="new-edit-wrapper"
title={title}
icon="icon-coms-hrm"
iconBgcolor="#217346"
visible={visible}
closable={true}
hasScroll={true}
onCancel={() => onCancel()}
buttons={isEdit ? buttons : buttons.slice(1, 2)}
style={{ width: width, height: height }}
initLoadCss
>
{
loading ? <div className='hrm-loading-center-small'>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@4ygl4a`} spinning={loading}></Spin>
</div>
: conditionLen > 1 ? this.getSearchGroupForm() : this.getForm()}
</WeaDialog>
)
}
}

View File

@ -0,0 +1,140 @@
import React, { PureComponent } from "react";
import { i18n } from "../public/i18n";
import { WeaTools } from "ecCom";
/**
* 添加多级路径
*
* @param {*} url
*/
export const addContentPath = (url) => {
const ecologyContentPath = window.ecologyContentPath || "";
if (url && ecologyContentPath) {
//避免重复添加ecologyContentPath
//避免传入的参数不是链接
if (url.startsWith("/") && !url.startsWith(ecologyContentPath)) {
url = ecologyContentPath + url;
}
}
return url;
};
export default class AttachToNumberField extends PureComponent {
constructor(props) {
super(props);
this.state = {
canRe: false,
canCheck: false,
canNew: false
};
this.typeMap = {
subcompanycode: "SUBCOMPANY",
departmentcode: "DEPARTMENT",
job_no: "JOBTITLES",
// work_code: "USER"
};
}
componentWillMount() {
const { field: { domkey: [targetKey] } } = this.props;
this.targetKey = targetKey;
this.type = this.typeMap[this.targetKey];
}
componentDidMount() {
this.init(this.props.isEdit);
}
componentWillReceiveProps(nextProps) {
if (nextProps.form != this.props.form) {
this.init(nextProps.isEdit);
}
}
init = (isEdit) => {
WeaTools.callApi("/api/hrm/codeSetting/getHasSelect", "GET", {}).then(res => {
if (res) {
//后台设置页面开关关闭,接口不会返回对应的权限,所以这里做下兼容
const target = res[this.type] || { hasSelect: false, hasRight: false };
const { hasSelect, hasRight } = target;
this.setState({
canRe: hasSelect && isEdit,
canCheck: hasSelect,
canNew: hasRight
});
}
});
};
handleClick = (e) => {
const urlMap = {
select: {
title: i18n.label.selectReserveNumber(),
url: addContentPath(`/spa/hrm/engine.html#/hrmengine/reservedNumber?type=${this.type}&isSimple=1`)
},
add: {
title: i18n.label.newReserveNumber(),
url: addContentPath(`/spa/hrm/engine.html#/hrmengine/newReservedNumberContent?type=${this.type}`)
}
};
const { title, url } = urlMap[e.target.id];
ecCom.WeaTools.createDialog({
title,
url,
moduleName: "hrm",
style: { width: 800, height: 600 },
callback: this.updateFormField,
onCancel: () => { // 关闭通信
}
}).show();
};
updateFormField = (value) => {
const { form } = this.props;
form.updateFields({
[this.targetKey]: value
});
};
//重新生成编号
reNumber = () => {
const { form, useId } = this.props;
const fieldMap = {
subcompanycode: "subshowid",
departmentcode: "showid",
jobtitlecode: "jobactivityid",
workcode: "useid"
},
fieldname = fieldMap[this.targetKey];
WeaTools.callApi("/api/hrm/codeSetting/regenerateCode", "POST", {
serialtype: this.type,
[`${this.type.toLocaleLowerCase()}id`]: form.getFormParams()[fieldname] || useId
}).then(res => {
const { api_status, code } = res;
if (api_status) {
if (code) {
this.updateFormField(code);
} else {
message.error(res.api_errormsg);
}
}
});
};
render() {
const { canRe, canCheck, canNew } = this.state;
return (
<div>
{canRe && <a onClick={this.reNumber}>{i18n.label.reNumber()}</a>}
{canCheck && <a onClick={this.handleClick} style={{ marginLeft: canRe && 10 }}
id="select">{i18n.label.selectReserveNumber()}</a>}
{canCheck && canNew &&
<a style={{ marginLeft: 10 }} onClick={this.handleClick} id="add">{i18n.label.newReserveNumber()}</a>}
</div>
);
}
}

View File

@ -0,0 +1,91 @@
import {
WeaDialog,
WeaFormItem,
WeaNewScroll,
WeaSearchGroup,
WeaMoreButton,
WeaTable
} from 'ecCom'
import {
Spin,
Button,
} from 'antd'
import {
WeaSwitch
} from 'comsMobx'
import {
i18n
} from '../public/i18n';
export default class NewTableDialog extends React.Component {
constructor(props) {
super(props);
this.state = {
width: 800,
}
}
render() {
const {
title,
visible,
onCancel,
loading,
height,
dataSource,
columns
} = this.props, {
width,
} = this.state;
const pagination = {
total: dataSource.length,
showSizeChanger: true,
showQuickJumper: true,
onShowSizeChange(current, pageSize) {
},
onChange(current) {
},
showTotal(total) {
return `${total}`
}
};
const buttons = [
//(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@jd6baw`} type="primary" onClick={() => save()} disabled={loading}>{i18n.button.save()}</Button>),
(<WeaMoreButton ecId={`${this && this.props && this.props.ecId || ''}_WeaMoreButton@e4f4n1`} />)
];
return (
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@1txk5f`}
title={title}
icon="icon-coms-hrm"
iconBgcolor="#217346"
visible={visible}
closable={true}
hasScroll={true}
onCancel={() => onCancel()}
buttons={buttons}
style={{ width: width, height: height }}
>
{
loading ? <div className='hrm-loading-center-small'>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@4ygl4a`} spinning={loading}></Spin>
</div> : <WeaTable rowKey={record => record.id}
dataSource={dataSource} childrenColumnName="children"
columns={columns}
loading={loading}
pagination={pagination}
indentSize={15}
/>
}
</WeaDialog>
)
}
}

View File

@ -0,0 +1,71 @@
import {
WeaNewScroll,
WeaSearchGroup,
WeaMoreButton,
WeaDialog
} from 'ecCom'
import {
Spin,
Button,
Pagination
} from 'antd'
import {
WeaSwitch,
WeaTableNew
} from 'comsMobx'
import {
i18n
} from '../public/i18n';
import '../style/common.less';
const WeaTable = WeaTableNew.WeaTable;
export default class NewWeaTableDialog extends React.Component {
constructor(props) {
super(props);
this.state = {
width: 800,
}
}
render() {
const {
title,
visible,
onCancel,
height,
tableStore
} = this.props, {
width,
} = this.state;
const buttons = [
//(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@jd6baw`} type="primary" onClick={() => save()} disabled={loading}>{i18n.button.save()}</Button>),
(<WeaMoreButton ecId={`${this && this.props && this.props.ecId || ''}_WeaMoreButton@e4f4n1`} />)
];
return (
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@1txk5f`}
title={title}
icon="icon-coms-hrm"
iconBgcolor="#217346"
visible={visible}
closable={true}
hasScroll={true}
onCancel={() => onCancel()}
buttons={buttons}
style={{ width: width, height: height }}
>
<WeaTable ecId={`${this && this.props && this.props.ecId || ''}_WeaTable@pgmg3x`}
comsWeaTableStore={tableStore}
hasOrder={true}
needScroll={true}
/>
</WeaDialog>
)
}
}

View File

@ -0,0 +1,59 @@
import {
observer
} from 'mobx-react';
import {
WeaDialog,
WeaTableEdit
} from 'ecCom';
import {
Spin,
Button, Modal
} from 'antd'
import * as mobx from "mobx";
const toJS = mobx.toJS;
@observer
export default class NewWeaTableEditDialog extends React.Component {
constructor(props) {
super(props);
}
onRowSelect = (sRowKeys, rows, dataIndex, selectedDatas) => {
const { store } = this.props;
if (dataIndex === undefined || selectedDatas === undefined) {
return;
}
store.setEnableRows(selectedDatas.isused);
};
render() {
const {
store,
} = this.props, {
temlateManageDialog,
relatedData
} = store;
const { datas, columns, loading,selectedData } = relatedData;
return (
<WeaDialog
{...temlateManageDialog}
initLoadCss
>
<WeaTableEdit
ecId={`${this && this.props && this.props.ecId || ""}_WeaTableEdit@7rorir`}
deleteConfirm
title="模板"
showCopy={false}
columns={toJS(columns)}
datas={toJS(datas)}
copyFilterProps={["id"]}
selectedData={!loading && toJS(selectedData)}
onChange={e => store.setTableEditDatas(e)}
onRowSelect={(sRowKeys, rows, dataIndex, selectedDatas) => this.onRowSelect(sRowKeys, rows, dataIndex, selectedDatas)}
/>
</WeaDialog>
);
}
}

View File

@ -0,0 +1,135 @@
import {
WeaDialog,
WeaFormItem,
WeaNewScroll,
WeaSearchGroup,
WeaMoreButton,
WeaPopoverHrm
} from 'ecCom'
import {
Row,
Col,
Spin,
Button,
} from 'antd'
import {
WeaSwitch
} from 'comsMobx'
import {
i18n
} from '../public/i18n';
import AttachToNumberField from './NewNumberField';
import "../style/common.less";
export default class SearchPanelDialog extends React.Component {
constructor(props) {
super(props);
this.state = {
width: 700,
}
}
getForm() {
const {
condition,
form,
isFormInit,
} = this.props;
let arr = [];
isFormInit && condition.map(c => {
c.items.map((field, index) => {
arr.push(<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@4cc308@${index}`} span={(index % 2 == 0) ? 10 : 11} offset={1}>
<div style={{ marginTop: 20 }}>
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@u6ex85@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
{<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@p7d3td@${index}`} fieldConfig={field} form={form} formParams={form.getFormParams()} />}
</WeaFormItem>
</div>
</Col>)
})
})
return <Row ecId={`${this && this.props && this.props.ecId || ''}_Row@ppeb6z`}>{arr}</Row>
}
getSearchGroupForm() {
const {
condition,
form,
isFormInit,
} = this.props;
let arr = [];
isFormInit && condition.map((c, i) => {
let _arr = [];
c.items.map((field, index) => {
_arrarr.push(<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@4cc308@${index}`} span={(index % 2 == 0) ? 10 : 11} offset={1}>
<div style={{ marginTop: 20 }}>
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@u6ex85@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
{<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@p7d3td@${index}`} fieldConfig={field} form={form} formParams={form.getFormParams()} />}
</WeaFormItem>
</div>
</Col>)
})
arr.push(<WeaSearchGroup ecId={`${this && this.props && this.props.ecId || ''}_WeaSearchGroup@qaih5l@${i}`} needTigger={true} title={c.title} showGroup={c.defaultshow} items={_arr} col={1} />)
})
return <Row ecId={`${this && this.props && this.props.ecId || ''}_Row@ppeb6z`}>{arr}</Row>;
}
render() {
const {
title,
visible,
search,
onCancel,
loading,
height,
conditionLen,
form
} = this.props, {
width,
} = this.state;
const buttons = [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@jd6baw`} type="primary" onClick={() => search()} disabled={loading}>{i18n.button.search()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@jd6baw`} onClick={() => form.reset()} disabled={loading}>{i18n.button.reset()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@jd6baw`} onClick={() => onCancel()} disabled={loading}>{i18n.button.cancel()}</Button>)
];
return (
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@1txk5f`}
className="new-edit-wrapper"
title={title}
icon="icon-coms-hrm"
iconBgcolor="#217346"
visible={visible}
closable={true}
hasScroll={true}
onCancel={() => onCancel()}
buttons={buttons}
style={{ width: width, height: height }}
initLoadCss
>
{
loading ? <div className='hrm-loading-center-small'>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@4ygl4a`} spinning={loading}></Spin>
</div>
: conditionLen > 1 ? this.getSearchGroupForm() : this.getForm()}
</WeaDialog>
)
}
}

View File

@ -0,0 +1,24 @@
import "../style/common.less";
export default class SelectTag extends React.Component {
constructor(props) {
super(props);
}
render() {
const {
bagColor,
text,
} = this.props;
const bagStyle = {
background:bagColor
}
return (
<div className="list-select-tag">
<div class="select-value" style={bagStyle}> {text} </div>
</div>
)
}
}

View File

@ -0,0 +1,93 @@
import {
WeaFormItem,
WeaTab,
WeaTableEdit
} from 'ecCom'
import {
Spin,
Button,
Tooltip,
Row, Col, Select
} from 'antd'
import { chunk, isEmpty } from 'lodash';
import { toJS } from "mobx";
const Option = Select.Option;
export default class VersionsSlider extends React.Component {
componentDidMount() {
}
isEmptyObject(obj) {
for (let key in obj) {
return false;
}
return true;
}
render() {
const {
versionList,
handleChange
} = this.props;
const newData = chunk(versionList.datas, 2);
return (
<div style={{ "marginTop": "50px", "paddingLeft": "30px", "height": "30px", "lineHeight": "30px", "paddingRight": "30px" }}>
<Row>
<Col span={8}>
<p>操作人: {versionList.operateName}</p>
</Col>
<Col span={8}>
<p>操作时间: {versionList.operateTime}</p>
</Col>
<Col span={8}>
<div>版本: <Select showSearch
style={{ width: 100 }}
placeholder="请选择版本"
defaultValue="1.0"
optionFilterProp="children"
notFoundContent="无法找到"
onChange={handleChange}
>
{
versionList.versions.map((item) => {
return (<Option value={item.value}>V{item.value}</Option>)
})
}
</Select></div>
</Col>
</Row>
<div style={{ "marginTop": "30px", "width": "100%" }}>
{newData.map((item, index) => {
return (
<div key={index} style={{ "display": "flex" }}>
{item.map((subItem) => {
return (
<div style={{ "width": "50%", "height": "40px", "overflow": "hidden", "testOverflow": "ellipsis", "whiteSpace": "nowrap" }}>
<span style={{ "width": "80px", "display": "inline-block", "textAlign": "right", "color": "#999999" }}>{subItem.fieldId}</span>
{subItem.fieldValue.length > 10 ? <Tooltip placement="topLeft" title={subItem.fieldValue}>
<span style={{ "marginLeft": "20px" }}>{subItem.fieldValue}</span>
</Tooltip> : <span style={{ "marginLeft": "20px" }}>{subItem.fieldValue}</span>}
</div>
);
})}
</div>
);
})}
</div>
</div>
)
}
}

View File

@ -0,0 +1,48 @@
import React, { Component } from "react";
import { WeaTableEdit } from "ecCom";
import { inject, observer } from "mobx-react";
import { toJS } from "mobx";
@inject("columnSetting")
@observer
class CustomItem extends Component {
componentDidMount() {
this.init();
}
init = () => {
const { columnSetting } = this.props;
columnSetting.loadTabThreeRelatedData();
};
onRowSelect = (sRowKeys, rows, dataIndex, selectedDatas) => {
const { columnSetting } = this.props;
if (dataIndex === undefined || selectedDatas === undefined) {
return;
}
columnSetting.setEnableThreeRows(selectedDatas.status);
};
render() {
const { columnSetting } = this.props, { tabThreeRelatedData } = columnSetting;
const { datas, columns, selectedData, loading } = tabThreeRelatedData;
return (
<div>
<WeaTableEdit
ecId={`${this && this.props && this.props.ecId || ""}_WeaTableEdit@7rorir`}
draggable
deleteConfirm
title=""
columns={toJS(columns)}
datas={toJS(datas)}
copyFilterProps={["id"]}
selectedData={!loading && toJS(selectedData)}
onChange={e => columnSetting.setCustomTableEditDatas(e)}
onRowSelect={(sRowKeys, rows, dataIndex, selectedDatas) => this.onRowSelect(sRowKeys, rows, dataIndex, selectedDatas)}
/>
</div>
);
}
}
export default CustomItem;

View File

@ -0,0 +1,50 @@
import { inject, observer } from "mobx-react";
import React, { Component } from "react";
import { WeaTableEdit } from "ecCom";
import * as mobx from "mobx";
const toJS = mobx.toJS;
@inject("columnSetting")
@observer
export default class DefineShowItems extends Component {
constructor(props) {
super(props);
}
componentDidMount() {
this.init();
}
init = () => {
const { columnSetting } = this.props;
columnSetting.loadTabTwoRelatedData();
};
onRowSelect = (sRowKeys, rows, dataIndex, selectedDatas) => {
const { columnSetting } = this.props;
if (dataIndex === undefined || selectedDatas === undefined) {
return;
}
columnSetting.setEnableRows(selectedDatas.isused);
};
render() {
const { columnSetting } = this.props, { tabTwoRelatedData } = columnSetting;
const { datas, columns, selectedData, loading } = tabTwoRelatedData;
return (
<WeaTableEdit
ecId={`${this && this.props && this.props.ecId || ""}_WeaTableEdit@7rorir`}
draggable
deleteConfirm
title=""
columns={toJS(columns)}
datas={toJS(datas)}
copyFilterProps={["id"]}
selectedData={!loading && toJS(selectedData)}
onChange={e => columnSetting.setTableEditDatas(e)}
onRowSelect={(sRowKeys, rows, dataIndex, selectedDatas) => this.onRowSelect(sRowKeys, rows, dataIndex, selectedDatas)}
/>
);
}
}

View File

@ -0,0 +1,106 @@
import React, { Component } from "react";
import { WeaRightMenu, WeaTab, WeaTop } from "ecCom";
import { inject, observer } from "mobx-react";
import { Button } from "antd";
import PermissionItem from "./permissionItem";
import DefineShowItems from "./defineShowItems";
import CustomItem from "./customItem";
import { i18n } from "../../public/i18n";
import { renderNoright } from "../../util";
@inject("columnSetting")
@observer
class ColumnSetting extends Component {
componentDidMount() {
this.init();
}
init = () => {
const { columnSetting } = this.props;
columnSetting.getRight();
};
getTopMenuBtns = () => {
return [
<Button type="primary" onClick={this.save}>保存</Button>
];
};
getDropMenuDatas = () => {
return [
{
key: "save",
icon: <i className="icon-coms-Preservation"/>,
content: "保存"
}
];
};
getTabName = () => {
return [{
key: "0",
title: i18n.label.defineShowItems()
}, {
key: "1",
title: i18n.label.columnPermission()
}, {
key: "2",
title: i18n.label.columnCustom()
}];
};
save = () => {
const { columnSetting } = this.props;
const { selectedKey } = columnSetting;
selectedKey === "0" ?
columnSetting.userDefineCardItemSave() :
selectedKey === "1" ?
columnSetting.columnPermissionSave() : columnSetting.customItemSave();
};
render() {
const { columnSetting } = this.props;
const { selectedKey, authorized } = columnSetting;
if (authorized === false) {
return renderNoright();
}
return (
authorized && <div style={{ height: "100%" }}>
<WeaRightMenu
ecId={`${this && this.props && this.props.ecId || ""}_WeaRightMenu@k6oc4u`}
datas={[{
key: "save",
icon: <i className="icon-coms-Preservation"/>,
content: "保存"
}]}
onClick={key => (key && this[key]())}
>
<WeaTop
ecId={`${this && this.props && this.props.ecId || ""}_WeaTop@bj98s7`}
title={i18n.label.cardColumnSet()}
icon={<i className="icon-coms-hrm"/>}
iconBgcolor="#217346"
loading={true}
buttons={this.getTopMenuBtns()}
showDropIcon={true}
dropMenuDatas={this.getDropMenuDatas()}
onDropMenuClick={(e) => (e && this[e]())}
/>
<WeaTab
ecId={`${this && this.props && this.props.ecId || ""}_WeaTab@8mmoen`}
selectedKey={selectedKey}
datas={this.getTabName()}
keyParam="key"
onChange={(key) => columnSetting.setSelectedKey(key)}
/>
{
selectedKey === "0" ?
<DefineShowItems ecId={`${this && this.props && this.props.ecId || ""}_DefineShowItems@q1hmoj`}/> :
selectedKey === "1" ?
<PermissionItem ecId={`${this && this.props && this.props.ecId || ""}_SysShowItems@0wqtjk`}/> :
<CustomItem ecId={`${this && this.props && this.props.ecId || ""}_CustomItems@0wqtjk`}/>
}
</WeaRightMenu>
</div>
);
}
}
export default ColumnSetting;

View File

@ -0,0 +1,89 @@
import React, { Component } from "react";
import { WeaTableNew } from "comsMobx";
import { WeaBrowser, WeaCheckbox } from "ecCom";
import { inject, observer } from "mobx-react";
import { toJS } from "mobx";
const WeaTable = WeaTableNew.WeaTable;
@inject("columnSetting")
@observer
class PermissionItem extends Component {
componentDidMount() {
this.init();
}
init = () => {
const { columnSetting } = this.props;
columnSetting.loadTabOneRelatedData();
};
changeSaveParams = (record, value, dataIndex) => {
const { columnSetting } = this.props;
const list = _.isEmpty(columnSetting.columnsPermissionData) ? toJS(columnSetting.tableStore.datas) : columnSetting.columnsPermissionData;
const dataSource = _.map([...list], it => {
if (record.id === it.id) {
return {
...it,
[dataIndex]: value
};
}
return { ...it };
});
columnSetting.setColumnsPermissionData(dataSource);
};
renderRenderColumns = columns => {
columns.forEach((c, index) => {
if (c.dataIndex === "status" || c.dataIndex === "all_people" ||
c.dataIndex === "superior" || c.dataIndex === "all_superior") {
c.render = (text, record) => {
return (
<WeaCheckbox
value={record[c.dataIndex]}
onChange={value => {
this.changeSaveParams(record, value, c.dataIndex);
}}
/>
);
};
} else if (c.dataIndex === "custom") {
c.render = (text, record) => {
const custom = record[c.dataIndex].split(",");
const customspan = record[`${c.dataIndex}span`].split(",");
const replaceDatas = _.map(custom, (item, index) => ({ id: custom[index], name: customspan[index] }));
return (
<WeaBrowser
inputStyle={{ width: 200 }}
type={65}
isSingle={false}
title="多角色"
linkUrl="/spa/hrm/engine.html#/hrmengine/roleInfo/info?id="
replaceDatas={replaceDatas}
onChange={value => {
this.changeSaveParams(record, value, c.dataIndex);
}}
/>
);
};
}
});
};
render() {
const { columnSetting } = this.props, { tableStore } = columnSetting;
return (
<div>
<WeaTable
ecId={`${(this && this.props && this.props.ecId) || ""}_WeaTable@b43a4c`}
comsWeaTableStore={tableStore}
hasOrder={true}
needScroll={true}
getColumns={c => this.renderRenderColumns(c)}
onOperatesClick={(record, index, operate) =>
this.onOperatesClick(record, index, operate)}
/>
</div>
);
}
}
export default PermissionItem;

View File

@ -0,0 +1,326 @@
/**
* @Author: 程亮
* @Date: 2022-05-18 14:52:39
* @LastEditTime: 2023-08-04 16:52:47
* @Description:
* @FilePath: /trunk/src4js/pc4mobx/organization/components/company/CompanyExtend.js
*/
import { Button, Modal, message, Row, Col, Spin, Select,Tooltip } from 'antd';
import { chunk,isEmpty } from 'lodash';
import cloneDeep from 'lodash/cloneDeep'
import forEach from 'lodash/forEach'
import { WeaAlertPage, WeaTools, WeaTableEdit, WeaSearchGroup, WeaRightMenu, WeaFormItem, WeaTab, WeaTop, WeaSlideModal } from 'ecCom'
import { WeaSwitch } from 'comsMobx';
import { inject, observer } from 'mobx-react';
import * as mobx from 'mobx';
import { i18n } from '../../public/i18n';
import '../../style/common.less';
import VersionsSlider from '../VersionsSlider';
const toJS = mobx.toJS;
import '../../style/common.less';
import AttachToNumberField from "../NewNumberField";
@inject('companyExtend')
@inject('company')
@observer
export default class CompanyExtend extends React.Component {
componentDidMount() {
this.handleHashChange();
window.addEventListener('hashchange', this.handleHashChange);
}
componentWillUnmount() {
window.removeEventListener('hashchange', this.handleHashChange);
}
handleHashChange = () => {
const { companyExtend, company } = this.props;
let { hash } = window.location;
hash = hash.split("?")[0];
let id = hash.match("[^/]+(?=/$|$)")[0];
companyExtend.init();
companyExtend.setId(id);
companyExtend.getData();
}
getTabChildren = () => {
const { companyExtend } = this.props;
let { tableInfo, isEditor, tabkey, onRowSelect, selectedRowKeys, detailSelectedKey } = companyExtend;
let tabChildren = [];
tableInfo = toJS(tableInfo);
tableInfo && tableInfo.map((t, i) => {
if (detailSelectedKey == i) {
tabChildren.push(
<WeaTableEdit ecId={`${this && this.props && this.props.ecId || ''}_WeaTableEdit@b813my@${i}`}
ref={(ref) => companyExtend.setPersonalEditTables(ref)}
showTitle={isEditor}
// title={'列表信息'}
//addFirstRow={isEditor}
columns={t.tabinfo.columns}
datas={t.tabinfo.datas}
onChange={this.tableEditChange}
selectedRowKeys={toJS(selectedRowKeys)}
onRowSelect={keys => onRowSelect(keys)}
onBtnsSelect={key => this.onBtnsSelect(key, i)}
viewAttr={isEditor ? 2 : 1}
getRowSelection={isEditor ? (rowSelection) => {
Object.assign(rowSelection, {
getCheckboxProps: record => ({
disabled: record.viewAttr === 1, // 配置无法勾选的列
})
})
return rowSelection;
} : () => null}
/>
);
}
})
return tabChildren;
}
onBtnsSelect = (key, index) => {
const {
companyExtend
} = this.props, {
tableInfo,
selectedRows,
setSelectedRowKeys,
selectedRowKeys
} = companyExtend;
const datas = tableInfo[index].tabinfo.datas;
if (key === 'copy') {
tableInfo[index].tabinfo.datas = datas.map((data, i) => {
if (!selectedRows[index].includes(i)) {
data.viewAttr = 2;
}
return data
})
}
if (key === 'delete') {
tableInfo[index].tabinfo.datas = datas.map((data, i) => {
if (selectedRows[index].includes(i)) {
data.viewAttr = 1;
}
return data
});
setSelectedRowKeys(selectedRowKeys.filter(row => !selectedRows[index].includes(row)))
}
}
getSearchs = () => {
const { companyExtend } = this.props;
let { form, conditions, isEditor } = companyExtend;
const { isFormInit } = form;
let group = [];
let tipPosition = 'bottom';
window.e9HideFormFieldKeys = [];
isFormInit && conditions.forEach((c, i) => {
let items = [];
c.items.forEach((field, j) => {
if (c.hide || (!isEmpty(field.otherParams) && field.otherParams.hide)) {
window.e9HideFormFieldKeys.push(field.domkey[0]);
} else {
items.push({
com: (<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@vh6j67@${j}`}
underline={!isEditor}
label={`${field.label}`}
error={form.getError(field)}
tipPosition={tipPosition}
className={j === 1 && "minH5"}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@d4vaqk@${j}`} fieldConfig={field} form={form} />
{field.domkey[0] == 'subcompanycode' && isEditor &&<AttachToNumberField field={field} form={form} isEdit={true} />}
</WeaFormItem>),
colSpan: 1
});
}
});
group.push(<WeaSearchGroup ecId={`${this && this.props && this.props.ecId || ''}_WeaSearchGroup@x9hby9@${i}`} className={`${isEditor ? 'hrm-center' : ''}`}
needTigger={true} hide={c.hide} title={c.title} showGroup={c.defaultshow} items={items} col={2} />)
});
return group;
}
tableEditChange = (data) => {
const { companyExtend } = this.props;
let { detailSelectedKey = '0', tableInfo } = companyExtend;
tableInfo = toJS(tableInfo);
let d = cloneDeep(tableInfo);
d[Number(detailSelectedKey)].tabinfo.datas = data;
companyExtend.updateTableInfo(d);
}
getRightMenu = () => {
const { companyExtend } = this.props;
const { isEditor, buttons } = companyExtend;
let arr = [];
try {
if (buttons.hasEdit) {
if (isEditor) {
arr = [{
icon: <i className='icon-coms-common' />,
content: i18n.button.save(),
key: 'save',
onClick: key => {
this.saveEditCard();
}
}, {
icon: <i className='icon-coms-go-back' />,
content: i18n.button.back(),
key: 'back',
onClick: key => {
this.backCard();
}
}]
} else {
arr = [{
icon: <i className='icon-coms-edit' />,
content: i18n.button.modify(),
key: 'editCard',
onClick: key => {
this.editCard();
}
}
//, {
// icon: <i className='icon-coms-common' />,
// content: i18n.button.version(),
// key: 'view',
// onClick: key => {
// this.view();
// }
// }
]
}
}
} catch (e) { }
return arr;
}
getTopButtons = () => {
const { companyExtend } = this.props;
const { isEditor, buttons } = companyExtend;
const save = <Button ecId={`${this && this.props && this.props.ecId || ''}_Button@pkes6y`} type="primary" onClick={this.saveEditCard} >{i18n.button.save()}</Button>;
const back = <Button ecId={`${this && this.props && this.props.ecId || ''}_Button@pl1fw8`} type="primary" onClick={this.backCard} >{i18n.button.back()}</Button>;
const edit = <Button ecId={`${this && this.props && this.props.ecId || ''}_Button@vkeda5`} type="primary" onClick={this.editCard} >{i18n.button.modify()}</Button>;
const view = <Button ecId={`${this && this.props && this.props.ecId || ''}_Button@vkeda5`} type="primary" onClick={this.view} >{i18n.button.version()}</Button>;
const btns = [];
try {
if (isEditor) {
if (buttons.hasSave) {
btns.push(save);
btns.push(back);
}
} else {
if (buttons.hasEdit) {
btns.push(edit);
//btns.push(view);
}
}
} catch (e) { }
return btns;
}
editCard = () => {
const { companyExtend } = this.props;
companyExtend.edit();
}
saveEditCard = () => {
const { companyExtend } = this.props;
companyExtend.save();
}
backCard = () => {
this.handleHashChange();
}
view = () => {
const { companyExtend } = this.props;
companyExtend.selectVersions();
}
onClose = () => {
const { companyExtend } = this.props;
companyExtend.open = false;
}
changeData(key) {
const {
companyExtend
} = this.props;
companyExtend.changeData(key);
}
render() {
const { companyExtend } = this.props;
const { loading, tabkey, tabInfo, topTab, selectedKey, date, detailSelectedKey, isEditor, open, versionList } = companyExtend;
try {
return (
<div className='hrm-my-cardInfo' style={{ height: '100%', position: 'relative' }}>
<WeaRightMenu ecId={`${this && this.props && this.props.ecId || ''}_WeaRightMenu@k6oc4u`}
datas={this.getRightMenu()}
>
<WeaTop ecId={`${this && this.props && this.props.ecId || ''}_WeaTop@bj98s7`}
loading={true}
title={isEditor ? i18n.label.updateCompany() : i18n.label.viewCompany()}
icon={<i className='icon-coms-hrm' />}
iconBgcolor='#217346'
buttons={this.getTopButtons()}
showDropIcon={true}
dropMenuDatas={this.getRightMenu()}
>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@9c3zts`}
datas={topTab}
keyParam="viewCondition" //主键
selectedKey={selectedKey}
onChange={this.changeData.bind(this)}
/>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@4fj4z2`} spinning={loading}>
{this.getSearchs()}
{
!isEmpty(tabInfo) && <div className='hrm-my-cardInfo_detial_tabs'>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@vjrq63`}
type='card'
keyParam='key'
datas={toJS(tabInfo)}
selectedKey={detailSelectedKey}
onChange={v => {
companyExtend.updateDetailSelectedKey(v);
}}
/>
{this.getTabChildren()}
</div>
}
</Spin>
</WeaTop>
</WeaRightMenu>
<WeaSlideModal visible={open}
top={6}
width={40}
height={94}
direction={'right'}
measure={'%'}
content={!isEmpty(versionList) ? <VersionsSlider versionList={versionList} handleChange={val => companyExtend.changeVersion(val)}/> : <div style={{"textAlign":"center","color":"red","fontSize":"20px","marginTop": "50px"}}> 暂无历史版本 </div>}
onClose={this.onClose}
onAnimationEnd={() => console.log('onAnimationEnd')} />
</div>
)
} catch (e) {
return <WeaAlertPage ecId={`${this && this.props && this.props.ecId || ''}_WeaAlertPage@h1wgnu`}>
<div style={{ color: '#000' }}>{i18n.message.authFailed()}</div>
</WeaAlertPage>
}
}
}

View File

@ -0,0 +1,630 @@
import React from 'react'
import * as mobx from 'mobx'
import {
inject,
observer,
} from 'mobx-react'
import {
WeaTop,
WeaTab,
WeaFormItem,
WeaRightMenu,
WeaTable
} from 'ecCom'
import {
Row,
Col,
Spin,
Modal,
Button,
message,
Switch,
Menu, Dropdown, Icon, Tooltip
} from 'antd'
import {
WeaSwitch,
WeaTableNew
} from 'comsMobx'
import {
i18n
} from '../../public/i18n';
import '../../style/common.less';
import NewTableDialog from '../NewTableDialog';
import NewAndEditDialog from '../NewAndEditDialog';
import NewWeaTable from '../NewWeaTableDialog';
import { renderNoright } from '../../util';
import {
CompanyExtendStore
} from '../../stores/companyextend';
const companyExtend = new CompanyExtendStore();
const toJS = mobx.toJS;
const confirm = Modal.confirm;
@inject('company')
@observer
export default class Company extends React.Component {
constructor(props) {
super(props);
}
componentWillMount() {
}
componentDidMount() {
this.init();
}
componentWillReceiveProps(nextProps) {
const {
company
} = this.props;
if (this.props.location.key !== nextProps.location.key) {
this.init();
}
}
init() {
const {
company
} = this.props;
company.getTableInfo();
company.getHasRight();
company.getMoveForm();
}
getTopMenuBtns() {
const {
company
} = this.props;
const {
topMenu,
selectedRowKeys
} = company;
let btns = [];
topMenu.map((item, i) => {
if (item.menuFun !== 'batchDelete') {
btns.push(<Button type='primary' onClick={() => this.handleClick(item)}>{item.menuName}</Button>);
} else {
btns.push(<Button type='primary' onClick={() => this.handleClick(item)} disabled={selectedRowKeys.length > 0 ? false : true} >{item.menuName}</Button>);
}
});
return btns;
}
log = () => {
window.setLogViewProp({
logMoudleType: 8,
keys: new Date().getTime(),
});
}
handleClick(item) {
const {
company
} = this.props;
const {
isPanelShow
} = company;
isPanelShow && company.setPanelStatus(false);
this[item.menuFun] && this[item.menuFun]();
}
new() {
const {
company
} = this.props;
company.setNeDialogTitle(i18n.label.newCompany());
company.setNewVisible(true);
company.getCompanyForm();
}
//联查部门
select(id) {
const {
company
} = this.props;
company.setNeDialogTitle(i18n.label.selectDept());
company.setVisible(true);
company.setDialogLoadingStatus(true);
company.getDeptTable(id);
}
//查看
view(id) {
//companyExtend.isEditor = true;
window.open(`/spa/organization/static/index.html#/main/organization/companyExtend/${id}`, "_blank")
}
transfer(id) {
const {
company
} = this.props;
confirm({
title: i18n.confirm.defaultTitle(),
content: this.getTransferForm(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
company.transfer(id)
},
onCancel() {
return false;
},
});
}
version(record) {
const {
company
} = this.props;
confirm({
title: i18n.confirm.defaultTitle(),
content: `确认将{${record.subCompanyDesc}}存为新版本?`,
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
company.version(record.id);
},
onCancel() {
return false;
},
});
}
getTransferForm() {
const {
company
} = this.props;
const {
transferCondition,
form2,
} = company;
let formParams = form2.getFormParams();
const {
isFormInit
} = form2;
let arr = [];
isFormInit && transferCondition.map(c => {
c.items.map((field, index) => {
arr.push(
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@u6ex85@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
{<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@p7d3td@${index}`} fieldConfig={field} form={form2} formParams={formParams} />}
</WeaFormItem>
)
})
})
return arr;
}
batchDelete() {
const {
company
} = this.props;
const {
selectedRowKeys
} = company;
let keys = toJS(selectedRowKeys).toString();
company.setIds(keys);
this.showConfirm('batchDel');
}
showConfirm(v) {
let _this = this;
confirm({
title: i18n.confirm.defaultTitle(),
content: (v == 'del') ? i18n.confirm.delete() : i18n.confirm.batchDeleteConfirm(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
_this.onOk();
},
onCancel() {
return false;
},
});
}
onOk() {
const {
company
} = this.props;
company.delete();
}
getDropMenuDatas() {
const {
company
} = this.props;
const {
rightMenu
} = company;
let menus = [];
toJS(rightMenu).map((item, index) => {
let obj = {
key: item.menuFun,
icon: <i className={`${item.menuIcon}`} />,
content: item.menuName,
}
if (item.menuFun == 'collection' || item.menuFun == 'help' || item.menuFun == 'pageAddress') {
obj.disabled = true;
}
menus.push(obj);
})
return menus;
}
handleMenuClick(key) {
const {
company
} = this.props;
const {
isPanelShow
} = company;
isPanelShow && company.setPanelStatus(false);
this[key] && this[key]();
}
onSearchChange(val) {
const {
company
} = this.props;
const {
form
} = company;
company.setCompanyName(val);
!this.isEmptyObject(form.getFormParams()) && company.updateFields(val);
}
reRenderColumns(columns) {
const {
company
} = this.props;
let _this = this;
// `${columns}` && columns.push({
// title: '',
// dataIndex: 'ops',
// key: 'ops',
// width: 80,
// className:"wea-table-operates",
// render: ( text, record, index )=> {
// const menu = (
// <Menu>
// <Menu.Item>
// <a href='javascript:void(0);' onClick={() => { _this.doDel(record.id) }}>删除</a>
// </Menu.Item>
// <Menu.Item>
// <a href='javascript:void(0);' onClick={() => { _this.select(record.id) }}>联查部门</a>
// </Menu.Item>
// </Menu>
// )
// return (
// <Dropdown overlay={menu}>
// <i class="icon-coms-more" />
// </Dropdown>
// )
// }
// });
columns.forEach((c, index) => {
if (c.dataIndex == 'canceled') {
c.render = function (text, record) {
return <Switch checked={record.canceled == "0" ? true : false} onChange={checked => _this.updateForbiddenTag(checked, record.id)} />
}
};
if (c.dataIndex == 'subCompanyDesc') {
c.className = "wea-table-indent"
c.render = function (text, record) {
return <a onClick={() => {
window.open(`/spa/organization/static/index.html#/main/organization/companyExtend/${record.id}`, "_blank")
}}>{text}</a>
}
}
if (c.dataIndex == 'operate') {
c.className = "wea-table-operates"
c.width = 80
c.render = function (text, record) {
const menu = (
<Menu>
<Menu.Item key="1" disabled={record.isUsed === 0 ? false : true} style={record.isUsed === 0 ? { display: 'block' } : { display: 'none' }}>
<a href='javascript:void(0);' onClick={() => {
_this.doDel(record.id)
}}>删除</a>
</Menu.Item>
<Menu.Item key="2">
<a href='javascript:void(0);' onClick={() => {
_this.select(record.id)
}}>联查部门</a>
</Menu.Item>
<Menu.Item key="3">
<a href='javascript:void(0);' onClick={() => {
_this.view(record.id)
}}>查看</a>
</Menu.Item>
<Menu.Item key="4">
<a href='javascript:void(0);' onClick={() => {
_this.transfer(record.id)
}}>转移</a>
</Menu.Item>
{/* <Menu.Item key="5">
<a href='javascript:void(0);' onClick={() => { _this.version(record) }}>另存为版本</a>
</Menu.Item> */}
</Menu>
)
return <Dropdown overlay={menu}>
<i class="icon-coms-more" />
</Dropdown>
}
}
})
return columns;
}
updateForbiddenTag(checked, id) {
const {
company
} = this.props;
confirm({
title: i18n.confirm.defaultTitle(),
content: (checked == true) ? i18n.confirm.enableTag() : i18n.confirm.forbiddenTag(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
company.updateForbiddenTag(checked, id);
},
onCancel() {
return false;
},
});
}
doDel(id) {
const {
company
} = this.props;
company.setIds(id);
this.showConfirm('del');
}
handleSave() {
const {
company
} = this.props;
company.setSaveAndSetting(false);
company.save();
}
handleSaveAndSetting() {
const {
company
} = this.props;
company.setSaveAndSetting(true);
company.save();
}
getTabBtn() {
const {
company
} = this.props;
const {
form
} = company;
const btn = [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@bx87i8`} type="primary" onClick={() => {
company.setCurrent(1); company.setPageSize(10); company.getTableInfo(); company.setPanelStatus(false)
}}>{i18n.button.search()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@218ju6`} onClick={() => form.reset()}>{i18n.button.reset()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@5u9mfz`} onClick={() => company.setPanelStatus(false)}>{i18n.button.cancel()}</Button>),
];
return btn;
}
getPanelComponents() {
const {
company
} = this.props;
const {
searchCondition,
form,
searchConditionLoading
} = company;
let arr = [];
let formParams = form.getFormParams();
const {
isFormInit
} = form;
isFormInit && searchCondition.map(c => {
c.items.map((field, index) => {
arr.push(<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@4cc308@${index}`} span={(index % 2 == 0) ? 10 : 11} offset={1}>
<div style={{ marginTop: 20 }}>
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@u6ex85@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
{<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@p7d3td@${index}`} fieldConfig={field} form={form} formParams={formParams} />}
</WeaFormItem>
</div>
</Col>)
})
})
if (searchConditionLoading) {
return (
<div className='hrm-loading-center-small' style={{ top: '25%' }}>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@lbktzb`} spinning={searchConditionLoading}></Spin>
</div>
)
} else {
return <Row ecId={`${this && this.props && this.props.ecId || ''}_Row@ppeb6z`} onKeyDown={(e) => {
if (e.keyCode == 13 && e.target.tagName === "INPUT") {
company.getTableInfo();
company.setPanelStatus(false)
}
}}>{arr}</Row>
}
}
//非空判断
isEmptyObject(obj) {
for (let key in obj) {
return false;
}
return true;
}
render() {
const {
company
} = this.props;
const {
isPanelShow, companyName, conditionNum, visible, condition, form,
tableStore, dataSource, columns, loading, date, nEdialogTitle, dialogLoading,
form1, isEdit, newVisible, deptDataSource, deptColumns, selectedRowKeys, total, current, pageSize, init, hasRight
} = company;
if (hasRight === false) {
return renderNoright();
}
const rowSelection = {
selectedRowKeys: selectedRowKeys,
type: "checkbox",
onChange(selectedRowKeys, selectedRows) {
company.setSelectedRowKeys(selectedRowKeys);
},
getCheckboxProps: record => ({
disabled: record.isUsed === 1, // 配置无法勾选的列
}),
};
const pagination = {
current: current,
pageSize: pageSize,
total: total,
showSizeChanger: true,
showQuickJumper: true,
onShowSizeChange(current, pageSize) {
},
onChange(current) {
},
showTotal(total) {
return `${total}`
}
};
return (
hasRight && <div ref='page' style={{ height: '100%' }}>
<WeaRightMenu ecId={`${this && this.props && this.props.ecId || ''}_WeaRightMenu@k6oc4u`}
datas={this.getDropMenuDatas()}
onClick={key => this.handleMenuClick(key)}
>
<WeaTop ecId={`${this && this.props && this.props.ecId || ''}_WeaTop@bj98s7`}
title={i18n.label.companyName()}
icon={<i className='icon-coms-hrm' />}
iconBgcolor='#217346'
loading={true}
buttons={this.getTopMenuBtns()}
showDropIcon={true}
dropMenuDatas={this.getDropMenuDatas()}
onDropMenuClick={(e) => this.handleMenuClick(e)}
>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@9c3zts`}
searchType={['base', 'advanced']}
showSearchAd={isPanelShow}
searchsBaseValue={this.isEmptyObject(form.getFormParams()) ? companyName : form.getFormParams().companyName}
setShowSearchAd={bool => company.setPanelStatus(bool)}
hideSearchAd={() => company.setPanelStatus(false)}
searchsAd={isPanelShow ? this.getPanelComponents() : <div></div>}
advanceHeight={Math.ceil(conditionNum / 2) * 52 + 20}
hasMask={false}
buttonsAd={this.getTabBtn()}
onSearch={() => {
company.setCurrent(1);
company.setPageSize(10);
company.getTableInfo()
}}
onSearchChange={val => this.onSearchChange(val)}
/>
{
init ? <div className='hrm-new-weatable-spin'>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@4ygl4a`} spinning={init}></Spin>
</div> :
<WeaTable rowKey={record => record.id} ecId={`${this && this.props && this.props.ecId || ''}_WeaTable@pgmg3x`}
loading={loading}
dataSource={dataSource} childrenColumnName="children"
columns={this.reRenderColumns(columns)}
rowSelection={rowSelection}
pagination={pagination}
onChange={(pagination, filters, sorter) => {
company.setSortParams(sorter);
company.setCurrent(pagination.current);
company.setPageSize(pagination.pageSize);
company.getTableInfo();
}}
indentSize={15}
/>
}
</WeaTop>
</WeaRightMenu>
<NewTableDialog ecId={`${this && this.props && this.props.ecId || ''}_NewTableDialog@q4rrwm`}
title={nEdialogTitle}
visible={visible}
loading={dialogLoading}
height={400}
dataSource={deptDataSource} //联查部门数据
columns={deptColumns}
onCancel={() => company.setVisible(false)}
/>
<NewAndEditDialog ecId={`${this && this.props && this.props.ecId || ''}_NewAndEditDialog@q4rrwm`}
title={nEdialogTitle}
visible={newVisible}
condition={toJS(condition)}
form={form1}
isFormInit={form1.isFormInit}
loading={dialogLoading}
isEdit={isEdit}
height={350}
conditionLen={1}
save={() => this.handleSave()}
onCancel={() => company.setNewVisible(false)}
saveAndSetting={() => this.handleSaveAndSetting()}
/>
</div>
)
}
}

View File

@ -0,0 +1,131 @@
import {
WeaDialog,
WeaFormItem,
WeaNewScroll,
WeaSearchGroup,
WeaMoreButton,
} from 'ecCom'
import {
Spin,
Button,
} from 'antd'
import {
WeaSwitch
} from 'comsMobx'
import {
i18n
} from '../../public/i18n';
export default class NewPopconfirm extends React.Component {
constructor(props) {
super(props);
this.state = {
value: '0'
}
}
renderComponent(field, index,form) {
return <WeaFormItem style={{ margin: "10px" }} ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@jacv6v@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
error={form.getError(field)}
tipPosition="bottom"
wrapperCol={{ span: `${field.fieldcol}` }}>
{<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@7vxyfr@${index}`} fieldConfig={field} form={form} formParams={form.getFormParams()}
onChange={this.onChange} />}
</WeaFormItem>
}
getForm() {
const {
condition,
form,
isFormInit,
isMerge
} = this.props, {
value
} = this.state;
form.updateFields({
moveType: {
value: this.state.value
}
});
let arr = [];
isFormInit && condition.map(c => {
c.items.map((field, index) => {
if(!isMerge){
if (field.domkey[0] !== 'company' && field.domkey[0] !== 'department') {
arr.push(
this.renderComponent(field,index,form)
)
}
value === '0' && field.domkey[0] === 'company' && arr.push(
this.renderComponent(field,index,form)
)
value === '1' && field.domkey[0] === 'department' && arr.push(
this.renderComponent(field,index,form)
)
}else{
arr.push(
this.renderComponent(field,index,form))
}
})
})
return <div className="wea-form-item-group">{arr}</div>
}
onChange = data => {
data.moveType && this.setState({
value:data.moveType.value
})
};
render() {
const {
title,
visible,
save,
onCancel,
loading,
height,
width,
form
} = this.props
const a = form.getFormParams();
const buttons = [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@jd6baw`} type="primary" onClick={() => {
save();this.setState({value:form.getFormParams().moveType})
}} disabled={loading}>{i18n.button.ok()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@jd6baw`} type="primary" onClick={() => {
this.setState({value:form.getFormParams().moveType});onCancel()
}} disabled={loading}>{i18n.button.cancel()}</Button>)
];
return (
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@1txk5f`}
title={title}
icon="icon-coms-hrm"
iconBgcolor="#217346"
visible={visible}
closable={true}
hasScroll={true}
onCancel={() => {
this.setState({value:"0"});onCancel()
}}
buttons={buttons}
style={{ width: width, height: height }}
>
{
loading ? <div className='hrm-loading-center-small'>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@4ygl4a`} spinning={loading}></Spin>
</div>
: this.getForm()
}
</WeaDialog>
)
}
}

View File

@ -0,0 +1,758 @@
/**
* @Author: 程亮
* @Date: 2022-06-02 09:19:37
* @LastEditTime: 2023-09-21 18:55:33
* @Description:
* @FilePath: /trunk/src4js/pc4mobx/organization/components/department/department.js
*/
import React from 'react'
import * as mobx from 'mobx'
import {
inject,
observer,
} from 'mobx-react'
import {
WeaTop,
WeaTab,
WeaFormItem,
WeaRightMenu,
WeaTable,
WeaLeftRightLayout,
WeaOrgTree,
WeaDialog,
WeaPopoverHrm
} from 'ecCom'
import {
Row,
Col,
Spin,
Modal,
Button,
message,
Switch,
Menu, Dropdown, Icon
} from 'antd'
import {
WeaSwitch,
WeaTableNew
} from 'comsMobx'
import {
i18n
} from '../../public/i18n';
import '../../style/common.less';
import { renderNoright } from '../../util';
import NewAndEditDialog from '../NewAndEditDialog';
import NewTableDialog from '../NewTableDialog';
import NewPopconfirm from './NewPopconfirm'
const toJS = mobx.toJS;
const confirm = Modal.confirm;
@inject('department')
@observer
export default class Department extends React.Component {
constructor(props) {
super(props);
}
componentWillMount() {
}
componentDidMount() {
this.init();
}
componentWillReceiveProps(nextProps) {
const {
department
} = this.props;
if (this.props.location.key !== nextProps.location.key) {
this.init();
}
}
init() {
const {
department
} = this.props;
department.getTableInfo();
department.getHasRight();
department.getCopyForm();
}
getTopMenuBtns() {
const {
department
} = this.props;
const {
topMenu,
selectedRowKeys,
selectTreeNodeInfo
} = department;
let btns = [];
topMenu.map((item, i) => {
if (item.menuFun === 'batchDelete') {
btns.push(<Button type='primary' onClick={() => this.handleClick(item)} disabled={selectedRowKeys.length > 0 ? false : true} >{item.menuName}</Button>);
} else if (item.menuFun === 'copy') {
btns.push(<Button type='primary' onClick={() => this.handleClick(item)} disabled={selectedRowKeys.length > 0 ? false : true} >{item.menuName}</Button>);
} else {
btns.push(<Button type='primary' onClick={() => this.handleClick(item)}>{item.menuName}</Button>);
}
});
return btns;
}
handleClick(item) {
const {
department
} = this.props;
const {
isPanelShow
} = department;
isPanelShow && department.setPanelStatus(false);
this[item.menuFun] && this[item.menuFun]();
}
new() {
const {
department
} = this.props;
department.setNeDialogTitle(i18n.label.newDept());
department.setNewVisible(true);
department.getDeptForm();
}
export() {
const {
department
} = this.props;
department.exportData();
}
//联查岗位
select(id) {
const {
department
} = this.props;
department.setNeDialogTitle("联查岗位");
department.setVisible(true);
department.setDialogLoadingStatus(true);
department.getPostionTable(id);
}
//合并
merge(id) {
const {
department
} = this.props;
department.setNeDialogTitle(i18n.label.mergeDept());
department.setConfirmVisible(true);
department.setIds(id);
department.setIsMerge(true);
department.getMergeForm(id);
}
//转移
transfer(id) {
const {
department
} = this.props;
department.setNeDialogTitle(i18n.label.transferDept());
department.setConfirmVisible(true);
department.setIds(id);
department.setIsMerge(false);
department.getTransferForm(id);
}
//查看
view(id) {
window.open(`/spa/organization/static/index.html#/main/organization/departmentExtend/${id}`, "_blank")
}
copy(id) {
const {
department
} = this.props;
const {
selectedRowKeys
} = department;
let keys = id == undefined ? toJS(selectedRowKeys).toString() : id;
department.setIds(keys);
confirm({
title: i18n.confirm.defaultTitle(),
content: this.getCopyForm(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
department.copy()
},
onCancel() {
return false;
},
});
}
getCopyForm() {
const {
department
} = this.props;
const {
copyCondition,
form2,
} = department;
let formParams = form2.getFormParams();
const {
isFormInit
} = form2;
let arr = [];
isFormInit && copyCondition.map(c => {
c.items.map((field, index) => {
arr.push(
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@u6ex85@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
{<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@p7d3td@${index}`} fieldConfig={field} form={form2} formParams={formParams} />}
</WeaFormItem>
)
})
})
return arr;
}
log = () => {
window.setLogViewProp({
logMoudleType: 9,
keys: new Date().getTime(),
});
}
batchDelete() {
const {
department
} = this.props;
const {
selectedRowKeys
} = department;
let keys = toJS(selectedRowKeys).toString();
department.setIds(keys);
this.showConfirm('batchDel');
}
showConfirm(v) {
let _this = this;
confirm({
title: i18n.confirm.defaultTitle(),
content: (v == 'del') ? i18n.confirm.delete() : i18n.confirm.batchDeleteConfirm(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
_this.onOk();
},
onCancel() {
return false;
},
});
}
onOk() {
const {
department
} = this.props;
department.delete();
}
getDropMenuDatas() {
const {
department
} = this.props;
const {
rightMenu
} = department;
let menus = [];
toJS(rightMenu).map((item, index) => {
let obj = {
key: item.menuFun,
icon: <i className={`${item.menuIcon}`} />,
content: item.menuName,
}
if (item.menuFun == 'collection' || item.menuFun == 'help' || item.menuFun == 'pageAddress') {
obj.disabled = true;
}
menus.push(obj);
})
return menus;
}
handleMenuClick(key) {
const {
department
} = this.props;
const {
isPanelShow
} = department;
isPanelShow && department.setPanelStatus(false);
this[key] && this[key]();
}
updateForbiddenTag(checked, id) {
const {
department
} = this.props;
confirm({
title: i18n.confirm.defaultTitle(),
content: (checked == true) ? i18n.confirm.enableTag() : i18n.confirm.forbiddenTag(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
department.updateForbiddenTag(checked, id);
},
onCancel() {
return false;
},
});
}
onSearchChange(val) {
const {
department
} = this.props;
const {
form
} = department;
department.setDepartmentName(val);
!this.isEmptyObject(form.getFormParams()) && department.updateFields(val);
}
version(record) {
const {
department
} = this.props;
confirm({
title: i18n.confirm.defaultTitle(),
content: `确认将{${record.departmentMark}}存为新版本?`,
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
department.version(record.id);
},
onCancel() {
return false;
},
});
}
reRenderColumns(columns) {
const {
department
} = this.props;
let _this = this;
columns.forEach((c, index) => {
if (c.dataIndex == 'canceled') {
c.render = function (text, record) {
return <Switch checked={record.canceled == "0" ? true : false} onChange={checked => _this.updateForbiddenTag(checked, record.id)} />
}
};
if (c.dataIndex == 'departmentMark') {
c.className = "wea-table-indent"
c.render = function (text, record) {
return <a href='javascript:void(0);' onClick={() => {
window.open(`/spa/organization/static/index.html#/main/organization/departmentExtend/${record.id}`, "_blank")
}}>{text}</a>
}
}
if (c.dataIndex == 'operate') {
c.className = "wea-table-operates"
c.width = 80
c.render = function (text, record) {
const menu = (
<Menu>
<Menu.Item key="0">
<a href='javascript:void(0);' onClick={() => {
_this.view(record.id)
}}>查看</a>
</Menu.Item>
<Menu.Item key="1" disabled={record.isUsed === 0 ? false : true} style={record.isUsed === 0 ? { display: 'block' } : { display: 'none' }}>
<a href='javascript:void(0);' onClick={() => {
_this.doDel(record.id)
}}>删除</a>
</Menu.Item>
<Menu.Item key="2">
<a href='javascript:void(0);' onClick={() => {
_this.merge(record.id)
}}>合并</a>
</Menu.Item>
<Menu.Item key="3">
<a href='javascript:void(0);' onClick={() => {
_this.transfer(record.id)
}}>转移</a>
</Menu.Item>
<Menu.Item key="4">
<a href='javascript:void(0);' onClick={() => {
_this.select(record.id)
}}>联查岗位</a>
</Menu.Item>
<Menu.Item key="5">
<a href='javascript:void(0);' onClick={() => {
_this.copy(record.id)
}}>复制</a>
</Menu.Item>
{/* <Menu.Item key="6">
<a href='javascript:void(0);' onClick={() => { _this.version(record) }}>另存为版本</a>
</Menu.Item> */}
</Menu>
)
return <Dropdown overlay={menu}>
<i class="icon-coms-more" />
</Dropdown>
}
}
})
return columns;
}
doDel(id) {
const {
department
} = this.props;
department.setIds(id);
this.showConfirm('del');
}
handleSave() {
const {
department
} = this.props;
department.setSaveAndSetting(false);
department.save();
}
handleSaveAndSetting() {
const {
department
} = this.props;
department.setSaveAndSetting(true);
department.save();
}
PopconfirmSave() {
const {
department
} = this.props;
const { isMerge } = department;
isMerge && department.merge();
!isMerge && department.transfer();
}
getTabBtn() {
const {
department
} = this.props;
const {
form
} = department;
const btn = [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@bx87i8`} type="primary" onClick={() => {
department.setCurrent(1); department.setPageSize(10); department.getTableInfo(); department.setPanelStatus(false)
}}>{i18n.button.search()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@218ju6`} onClick={() => form.reset()}>{i18n.button.reset()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@5u9mfz`} onClick={() => department.setPanelStatus(false)}>{i18n.button.cancel()}</Button>),
];
return btn;
}
getPanelComponents() {
const {
department
} = this.props;
const {
searchCondition,
form,
searchConditionLoading
} = department;
let arr = [];
let formParams = form.getFormParams();
const {
isFormInit
} = form;
isFormInit && searchCondition.map(c => {
c.items.map((field, index) => {
arr.push(<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@4cc308@${index}`} span={(index % 2 == 0) ? 10 : 11} offset={1}>
<div style={{ marginTop: 20 }}>
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@u6ex85@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
{<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@p7d3td@${index}`} fieldConfig={field} form={form} formParams={formParams} />}
</WeaFormItem>
</div>
</Col>)
})
})
if (searchConditionLoading) {
return (
<div className='hrm-loading-center-small' style={{ top: '25%' }}>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@lbktzb`} spinning={searchConditionLoading}></Spin>
</div>
)
} else {
return <Row ecId={`${this && this.props && this.props.ecId || ''}_Row@ppeb6z`} onKeyDown={(e) => {
if (e.keyCode == 13 && e.target.tagName === "INPUT") {
department.getTableInfo();
department.setPanelStatus(false)
}
}}>{arr}</Row>
}
}
//非空判断
isEmptyObject(obj) {
for (let key in obj) {
return false;
}
return true;
}
//左侧树
getTree = () => {
const {
department
} = this.props;
const {
companysId,
} = department
let tree = (
<WeaOrgTree ecId={`${this && this.props && this.props.ecId || ''}_WeaOrgTree@dhi1ro`}
ref='WeaOrgTree'
dataUrl={"/api/bs/hrmorganization/dept/getSearchTree"}
loading
needSearch
noCache={true}
needDropMenu={false}
//onSelect={this.selectVirtual} //组织维度回调函数
isLoadSubDepartment={true}
topPrefix={'hrmSearch'}
companysId={companysId}
inputLeftDom={`<b>${i18n.label.organization()}</b>`}
treeNodeClick={this.treeNodeClick}
expandAllChildrenOnSearch={true}
renderNode={item => this.renderNode(item)}
/>
)
return tree;
}
renderNode(item) {
return <div className='text-elli' title={item.name}>
<i className={item.icon} style={{ marginRight: '5px' }}></i>
{item.name}
{item.canceled && <span style={{ color: 'red' }}>({i18n.label.forbidden()})</span>}
</div>
}
treeNodeClick = (event, ids, nodeids, nodes) => {
const {
department
} = this.props;
const {
form,
companysId
} = department;
const type = event.node.props.type || '0';
const id = event.node.props.id || '';
let params = {};
form.resetConditionValue();
department.setPanelStatus(false)
// department.tabkey = 'default_3';
department.nodeType = type;
if (type == '0') {
params['virtualtype'] = companysId;
}
if (type == '1') {
params['subcompanyid1'] = id;
}
if (type == '2') {
params['departmentid'] = id;
}
department.doSearch(params);
}
render() {
const {
department
} = this.props;
const {
isPanelShow, departmentName, conditionNum, visible, condition, form,
tableStore, dataSource, columns, loading, date, nEdialogTitle, dialogLoading,
form1, isEdit, newVisible, jobDataSource, jobColumns, selectedRowKeys, total, current, pageSize, init,
defaultShowLeft, confirmVisible, confirmLoading, postionDataSource, postionColumns, isMerge, hasRight
} = department;
if (hasRight === false) {
return renderNoright();
}
const rowSelection = {
selectedRowKeys: selectedRowKeys,
type: "checkbox",
onChange(selectedRowKeys, selectedRows) {
department.setSelectedRowKeys(selectedRowKeys);
},
getCheckboxProps: record => ({
disabled: record.isUsed === 1, // 配置无法勾选的列
}),
};
const pagination = {
current: current,
pageSize: pageSize,
total: total,
showSizeChanger: true,
showQuickJumper: true,
onShowSizeChange(current, pageSize) {
},
onChange(current) {
},
showTotal(total) {
return `${total}`
}
};
return (
hasRight && <div ref='page' style={{ height: '100%' }}>
<WeaRightMenu ecId={`${this && this.props && this.props.ecId || ''}_WeaRightMenu@k6oc4u`}
datas={this.getDropMenuDatas()}
onClick={key => this.handleMenuClick(key)}
>
<WeaTop ecId={`${this && this.props && this.props.ecId || ''}_WeaTop@bj98s7`}
title={i18n.label.deptManage()}
icon={<i className='icon-coms-hrm' />}
iconBgcolor='#217346'
loading={true}
buttons={this.getTopMenuBtns()}
showDropIcon={true}
dropMenuDatas={this.getDropMenuDatas()}
onDropMenuClick={(e) => this.handleMenuClick(e)}
>
<WeaLeftRightLayout ecId={`${this && this.props && this.props.ecId || ''}_WeaLeftRightLayout@7muhhb`} isNew={true} showLeft={defaultShowLeft} leftCom={this.getTree()}>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@9c3zts`}
searchType={['base', 'advanced']}
showSearchAd={isPanelShow}
searchsBaseValue={this.isEmptyObject(form.getFormParams()) ? departmentName : form.getFormParams().departmentName}
setShowSearchAd={bool => department.setPanelStatus(bool)}
hideSearchAd={() => department.setPanelStatus(false)}
searchsAd={isPanelShow ? this.getPanelComponents() : <div></div>}
advanceHeight={Math.ceil(conditionNum / 2) * 52 + 20}
hasMask={false}
buttonsAd={this.getTabBtn()}
onSearch={() => {
department.setCurrent(1);
department.setPageSize(10);
department.getTableInfo()
}}
onSearchChange={val => this.onSearchChange(val)}
/>
{
init ? <div className='hrm-new-weatable-spin'>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@4ygl4a`} spinning={init}></Spin>
</div> :
<WeaTable rowKey={record => record.id} ecId={`${this && this.props && this.props.ecId || ''}_WeaTable@pgmg3x`}
loading={loading}
dataSource={dataSource} childrenColumnName="children"
columns={this.reRenderColumns(columns)}
rowSelection={rowSelection}
pagination={pagination}
onChange={(pagination, filters, sorter) => {
department.setSortParams(sorter);
department.setCurrent(pagination.current);
department.setPageSize(pagination.pageSize);
department.getTableInfo();
}}
indentSize={15}
/>
}
</WeaLeftRightLayout>
</WeaTop>
</WeaRightMenu>
<NewTableDialog ecId={`${this && this.props && this.props.ecId || ''}_NewTableDialog@q4rrwm`}
title={nEdialogTitle}
visible={visible}
loading={dialogLoading}
height={400}
dataSource={postionDataSource} //联查岗位数据
columns={postionColumns}
onCancel={() => department.setVisible(false)}
/>
<NewAndEditDialog ecId={`${this && this.props && this.props.ecId || ''}_NewAndEditDialog@q4rrwm`}
title={nEdialogTitle}
visible={newVisible}
condition={toJS(condition)}
form={form1}
isFormInit={form1.isFormInit}
loading={dialogLoading}
isEdit={isEdit}
height={400}
conditionLen={1}
save={() => this.handleSave()}
onCancel={() => department.setNewVisible(false)}
saveAndSetting={() => this.handleSaveAndSetting()}
moduleName={"department"}
bindChangeEnvent={val => department.updateConditions(val)}
>
</NewAndEditDialog>
<NewPopconfirm ecId={`${this && this.props && this.props.ecId || ''}_NewPopconfirm@q4rrwm`}
title={nEdialogTitle}
visible={confirmVisible}
condition={toJS(condition)}
form={form1}
isFormInit={form1.isFormInit}
loading={confirmLoading}
height={100}
width={320}
isMerge={isMerge}
defaultValue={"0"}
save={() => this.PopconfirmSave()}
onCancel={() => department.setConfirmVisible(false)}
/>
</div>
)
}
}

View File

@ -0,0 +1,324 @@
/**
* @Author: 程亮
* @Date: 2022-06-02 09:20:03
* @LastEditTime: 2023-08-04 16:51:56
* @Description:
* @FilePath: /trunk/src4js/pc4mobx/organization/components/department/departmentExtend.js
*/
import { Button, Modal, message, Row, Col, Spin } from 'antd';
import isEmpty from 'lodash/isEmpty'
import cloneDeep from 'lodash/cloneDeep'
import forEach from 'lodash/forEach'
import { WeaAlertPage, WeaTools, WeaTableEdit, WeaSearchGroup, WeaRightMenu, WeaFormItem, WeaTab, WeaTop,WeaSlideModal } from 'ecCom'
import { WeaSwitch } from 'comsMobx';
import { inject, observer } from 'mobx-react';
import * as mobx from 'mobx';
import { i18n } from '../../public/i18n';
import AttachToNumberField from "../NewNumberField";
import VersionsSlider from '../VersionsSlider';
const toJS = mobx.toJS;
import '../../style/common.less';
@inject('departmentExtend')
@inject('department')
@observer
export default class DepartmentExtendStore extends React.Component {
componentDidMount() {
this.handleHashChange();
window.addEventListener('hashchange', this.handleHashChange);
}
componentWillUnmount() {
window.removeEventListener('hashchange', this.handleHashChange);
}
handleHashChange = () => {
const { departmentExtend, department } = this.props;
let { hash } = window.location;
hash = hash.split("?")[0];
let id = hash.match("[^/]+(?=/$|$)")[0];
departmentExtend.init();
departmentExtend.setId(id);
departmentExtend.getData();
}
view = () => {
const { departmentExtend } = this.props;
departmentExtend.selectVersions();
}
onClose = () => {
const { departmentExtend } = this.props;
departmentExtend.open = false;
}
getTabChildren = () => {
const { departmentExtend } = this.props;
let { tableInfo, isEditor, tabkey, onRowSelect, selectedRowKeys, detailSelectedKey } = departmentExtend;
let tabChildren = [];
tableInfo = toJS(tableInfo);
tableInfo && tableInfo.map((t, i) => {
if (detailSelectedKey == i) {
tabChildren.push(
<WeaTableEdit ecId={`${this && this.props && this.props.ecId || ''}_WeaTableEdit@b813my@${i}`}
ref={(ref) => departmentExtend.setPersonalEditTables(ref)}
showTitle={isEditor}
// title={'列表信息'}
//addFirstRow={isEditor}
columns={t.tabinfo.columns}
datas={t.tabinfo.datas}
onChange={this.tableEditChange}
selectedRowKeys={toJS(selectedRowKeys)}
onRowSelect={keys => onRowSelect(keys)}
onBtnsSelect={key => this.onBtnsSelect(key, i)}
viewAttr={isEditor ? 2 : 1}
getRowSelection={isEditor ? (rowSelection) => {
Object.assign(rowSelection, {
getCheckboxProps: record => ({
disabled: record.viewAttr === 1, // 配置无法勾选的列
})
})
return rowSelection;
} : () => null}
/>
);
}
})
return tabChildren;
}
onBtnsSelect = (key, index) => {
const {
departmentExtend
} = this.props, {
tableInfo,
selectedRows,
setSelectedRowKeys,
selectedRowKeys
} = departmentExtend;
const datas = tableInfo[index].tabinfo.datas;
if (key === 'copy') {
tableInfo[index].tabinfo.datas = datas.map((data, i) => {
if (!selectedRows[index].includes(i)) {
data.viewAttr = 2;
}
return data
})
}
if (key === 'delete') {
tableInfo[index].tabinfo.datas = datas.map((data, i) => {
if (selectedRows[index].includes(i)) {
data.viewAttr = 1;
}
return data
});
setSelectedRowKeys(selectedRowKeys.filter(row => !selectedRows[index].includes(row)))
}
}
getSearchs = () => {
const { departmentExtend } = this.props;
let { form, conditions, isEditor } = departmentExtend;
const { isFormInit } = form;
let group = [];
let tipPosition = 'bottom';
window.e9HideFormFieldKeys = [];
isFormInit && conditions.forEach((c, i) => {
let items = [];
c.items.forEach((field, j) => {
if (c.hide || (!isEmpty(field.otherParams) && field.otherParams.hide)) {
window.e9HideFormFieldKeys.push(field.domkey[0]);
} else {
items.push({
com: (<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@vh6j67@${j}`}
underline={!isEditor}
label={`${field.label}`}
error={form.getError(field)}
tipPosition={tipPosition}
className={j === 1 && "minH5"}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@d4vaqk@${j}`} fieldConfig={field} form={form} />
{field.domkey[0] == 'departmentcode' && field.viewAttr != '1' && <AttachToNumberField field={field} form={form} isEdit={true}/>}
</WeaFormItem>),
colSpan: 1
});
}
});
group.push(<WeaSearchGroup ecId={`${this && this.props && this.props.ecId || ''}_WeaSearchGroup@x9hby9@${i}`} className={`${isEditor ? 'hrm-center' : ''}`}
needTigger={true} hide={c.hide} title={c.title} showGroup={c.defaultshow} items={items} col={2} />)
});
return group;
}
tableEditChange = (data) => {
const { departmentExtend } = this.props;
let { detailSelectedKey = '0', tableInfo } = departmentExtend;
tableInfo = toJS(tableInfo);
let d = cloneDeep(tableInfo);
d[Number(detailSelectedKey)].tabinfo.datas = data;
departmentExtend.updateTableInfo(d);
}
getRightMenu = () => {
const { departmentExtend } = this.props;
const { isEditor, buttons } = departmentExtend;
let arr = [];
try {
if (buttons.hasEdit) {
if (isEditor) {
arr = [{
icon: <i className='icon-coms-common' />,
content: i18n.button.save(),
key: 'save',
onClick: key => {
this.saveEditCard();
}
}, {
icon: <i className='icon-coms-go-back' />,
content: i18n.button.back(),
key: 'back',
onClick: key => {
this.backCard();
}
}]
} else {
arr = [{
icon: <i className='icon-coms-edit' />,
content: i18n.button.modify(),
key: 'editCard',
onClick: key => {
this.editCard();
}
}
// , {
// icon: <i className='icon-coms-common' />,
// content: i18n.button.version(),
// key: 'view',
// onClick: key => {
// this.view();
// }
// }
]
}
}
} catch (e) { }
return arr;
}
getTopButtons = () => {
const { departmentExtend } = this.props;
const { isEditor, buttons } = departmentExtend;
const save = <Button ecId={`${this && this.props && this.props.ecId || ''}_Button@pkes6y`} type="primary" onClick={this.saveEditCard} >{i18n.button.save()}</Button>;
const back = <Button ecId={`${this && this.props && this.props.ecId || ''}_Button@pl1fw8`} type="primary" onClick={this.backCard} >{i18n.button.back()}</Button>;
const edit = <Button ecId={`${this && this.props && this.props.ecId || ''}_Button@vkeda5`} type="primary" onClick={this.editCard} >{i18n.button.modify()}</Button>;
const view = <Button ecId={`${this && this.props && this.props.ecId || ''}_Button@vkeda5`} type="primary" onClick={this.view} >{i18n.button.version()}</Button>;
const btns = [];
try {
if (isEditor) {
if (buttons.hasSave) {
btns.push(save);
btns.push(back);
}
} else {
if (buttons.hasEdit) {
btns.push(edit);
//btns.push(view);
}
}
} catch (e) { }
return btns;
}
editCard = () => {
const { departmentExtend } = this.props;
departmentExtend.edit();
}
saveEditCard = () => {
const { departmentExtend } = this.props;
departmentExtend.save();
}
backCard = () => {
this.handleHashChange();
}
changeData(key) {
const {
departmentExtend
} = this.props;
departmentExtend.changeData(key);
}
render() {
const { departmentExtend } = this.props;
const { loading, tabkey, tabInfo, topTab, selectedKey, date, detailSelectedKey,isEditor,open, versionList } = departmentExtend;
try {
return (
<div className='hrm-my-cardInfo' style={{ height: '100%', position: 'relative' }}>
<WeaRightMenu ecId={`${this && this.props && this.props.ecId || ''}_WeaRightMenu@k6oc4u`}
datas={this.getRightMenu()}
>
<WeaTop ecId={`${this && this.props && this.props.ecId || ''}_WeaTop@bj98s7`}
loading={loading}
title={isEditor ? i18n.label.editDept() : i18n.label.departmentInfo()}
icon={<i className='icon-coms-hrm' />}
iconBgcolor='#217346'
buttons={this.getTopButtons()}
showDropIcon={true}
dropMenuDatas={this.getRightMenu()}
>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@9c3zts`}
datas={topTab}
keyParam="viewCondition" //主键
selectedKey={selectedKey}
onChange={this.changeData.bind(this)}
/>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@4fj4z2`} spinning={loading}>
{this.getSearchs()}
{
!isEmpty(tabInfo) && <div className='hrm-my-cardInfo_detial_tabs'>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@vjrq63`}
type='card'
keyParam='key'
datas={toJS(tabInfo)}
selectedKey={detailSelectedKey}
onChange={v => {
departmentExtend.updateDetailSelectedKey(v);
}}
/>
{this.getTabChildren()}
</div>
}
</Spin>
</WeaTop>
</WeaRightMenu>
<WeaSlideModal visible={open}
top={6}
width={40}
height={94}
direction={'right'}
measure={'%'}
content={!isEmpty(versionList) ? <VersionsSlider versionList={versionList} handleChange={val => departmentExtend.changeVersion(val)}/> : <div style={{"textAlign":"center","color":"red","fontSize":"20px","marginTop": "50px"}}> 暂无历史版本 </div>}
onClose={this.onClose}
onAnimationEnd={() => console.log('onAnimationEnd')} />
</div>
)
} catch (e) {
return <WeaAlertPage ecId={`${this && this.props && this.props.ecId || ''}_WeaAlertPage@h1wgnu`}>
<div style={{ color: '#000' }}>{i18n.message.authFailed()}</div>
</WeaAlertPage>
}
}
}

View File

@ -0,0 +1,441 @@
import React from 'react'
import * as mobx from 'mobx'
import {
inject,
observer
} from 'mobx-react'
import {
WeaTop,
WeaTab,
WeaFormItem,
WeaRightMenu,
WeaAlertPage
} from 'ecCom'
import {
Row,
Col,
Spin,
Modal,
Button,
message,
Switch
} from 'antd'
import {
WeaSwitch,
WeaTableNew
} from 'comsMobx'
import {
i18n
} from '../../public/i18n';
import '../../style/common.less';
import NewAndEditDialog from '../NewAndEditDialog';
import { renderNoright } from '../../util'; // 从util文件引入公共的方法
const toJS = mobx.toJS;
const confirm = Modal.confirm;
const WeaTable = WeaTableNew.WeaTable;
@inject('managerDetach')
@observer
export default class ManagerDetach extends React.Component {
constructor(props) {
super(props);
}
componentWillMount() {
}
componentDidMount() {
this.init();
}
componentWillUnmount() {
}
componentWillReceiveProps(nextProps) {
const {
managerDetach
} = this.props;
if (this.props.location.key !== nextProps.location.key) {
this.init();
}
}
init() {
const {
managerDetach
} = this.props;
managerDetach.getHasRight();
managerDetach.getTableInfo();
}
getTopMenuBtns() {
const {
managerDetach
} = this.props;
const {
topMenu,
tableStore
} = managerDetach;
let btns = [];
topMenu.map((item, i) => {
if (item.menuFun !== 'batchDelete') {
btns.push(<Button type='primary' onClick={() => this.handleClick(item)}>{item.menuName}</Button>);
} else {
btns.push(<Button type='primary' onClick={() => this.handleClick(item)} disabled={tableStore.selectedRowKeys.length > 0 ? false : true} >{item.menuName}</Button>);
}
});
return btns;
}
handleClick(item) {
const {
managerDetach
} = this.props;
const {
isPanelShow
} = managerDetach;
isPanelShow && managerDetach.setPanelStatus(false);
this[item.menuFun] && this[item.menuFun]();
}
new() {
const {
managerDetach
} = this.props;
managerDetach.setNeDialogTitle(i18n.label.newManagerDetach());
managerDetach.setIsNew(true);
managerDetach.setVisible(true);
managerDetach.getForm();
}
batchDelete() {
const {
managerDetach
} = this.props;
const {
tableStore
} = managerDetach;
let keys = toJS(tableStore.selectedRowKeys).toString();
managerDetach.setIds(keys);
this.showConfirm('batchDel');
}
showConfirm(v) {
let _this = this;
confirm({
title: i18n.confirm.defaultTitle(),
content: (v == 'del') ? i18n.confirm.delete() : i18n.confirm.batchDeleteConfirm(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
_this.onOk();
},
onCancel() {
return false;
},
});
}
onOk() {
const {
managerDetach
} = this.props;
managerDetach.delete();
}
getDropMenuDatas() {
const {
managerDetach
} = this.props;
const {
rightMenu
} = managerDetach;
let menus = [];
toJS(rightMenu).map((item, index) => {
let obj = {
key: item.menuFun,
icon: <i className={`${item.menuIcon}`} />,
content: item.menuName,
}
if (item.menuFun == 'collection' || item.menuFun == 'help' || item.menuFun == 'pageAddress') {
obj.disabled = true;
}
menus.push(obj);
})
return menus;
}
handleMenuClick(key) {
const {
managerDetach
} = this.props;
const {
isPanelShow
} = managerDetach;
isPanelShow && managerDetach.setPanelStatus(false);
this[key] && this[key]();
}
getTabBtn() {
const {
managerDetach
} = this.props;
const {
form2
} = managerDetach;
const btn = [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@bx87i8`} type="primary" onClick={() => {
managerDetach.getTableInfo(); managerDetach.setPanelStatus(false)
}}>{i18n.button.search()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@218ju6`} onClick={() => form2.reset()}>{i18n.button.reset()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@5u9mfz`} onClick={() => managerDetach.setPanelStatus(false)}>{i18n.button.cancel()}</Button>),
];
return btn;
}
custom = () => {
const {
managerDetach
} = this.props, {
tableStore,
} = managerDetach;
tableStore.setColSetVisible(true);
tableStore.tableColSet(true);
}
onSearchChange(val) {
const {
managerDetach
} = this.props;
const {
form2
} = managerDetach;
managerDetach.setManagerName(val);
!this.isEmptyObject(form2.getFormParams()) && managerDetach.updateFields(val);
}
reRenderColumns(columns) {
let _this = this;
// columns.forEach((c, index) => {
// })
}
doDetachSwitch(checked) {
const {
managerDetach
} = this.props;
confirm({
title: i18n.confirm.defaultTitle(),
content: (checked == true) ? "确定启用组织管理分权吗" : "确定取消组织管理分权",
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
managerDetach.setDetach(checked);
},
onCancel() {
return false;
},
});
}
onOperatesClick(record, rowIndex, operate) {
const {
index
} = operate;
(index == '0') && this.doEdit(record.randomFieldId);
(index == '1') && this.doDel(record.randomFieldId);
}
doEdit(id) {
const {
managerDetach
} = this.props;
managerDetach.setNeDialogTitle(i18n.label.editManagerDetach());
managerDetach.setDetachId(id);
managerDetach.setIsNew(false);
managerDetach.setVisible(true);
managerDetach.getForm();
}
doDel(id) {
const {
managerDetach
} = this.props;
managerDetach.setIds(id);
this.showConfirm('del');
}
log = () => {
window.setLogViewProp({
logMoudleType: 14,
keys: new Date().getTime(),
});
}
handleSave() {
const {
managerDetach
} = this.props;
const {
isNew
} = managerDetach;
isNew && managerDetach.save();
!isNew && managerDetach.edit();
}
getPanelComponents() {
const {
managerDetach
} = this.props;
const {
searchCondition,
form2,
searchConditionLoading
} = managerDetach;
let arr = [];
let formParams = form2.getFormParams();
const {
isFormInit
} = form2;
isFormInit && searchCondition.map(c => {
c.items.map((field, index) => {
arr.push(<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@4cc308@${index}`} span={(index % 2 == 0) ? 10 : 11} offset={1}>
<div style={{ marginTop: 20 }}>
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@u6ex85@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
{<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@p7d3td@${index}`} fieldConfig={field} form={form2} formParams={formParams} />}
</WeaFormItem>
</div>
</Col>)
})
})
if (searchConditionLoading) {
return (
<div className='hrm-loading-center-small' style={{ top: '25%' }}>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@lbktzb`} spinning={searchConditionLoading}></Spin>
</div>
)
} else {
return <Row ecId={`${this && this.props && this.props.ecId || ''}_Row@ppeb6z`} onKeyDown={(e) => {
if (e.keyCode == 13 && e.target.tagName === "INPUT") {
managerDetach.getTableInfo();
managerDetach.setPanelStatus(false)
}
}}>{arr}</Row>
}
}
isEmptyObject(obj) {
for (let key in obj) {
return false;
}
return true;
}
render() {
const {
managerDetach
} = this.props;
const {
isPanelShow, form2, managerName, conditionNum, tableStore, nEdialogTitle, visible, condition,
form, dialogLoading, isEdit, date, hasRight,isDetach
} = managerDetach;
if (hasRight === false) {
return renderNoright();
}
return (
hasRight && <div ref='page' style={{ height: '100%' }}>
<WeaRightMenu ecId={`${this && this.props && this.props.ecId || ''}_WeaRightMenu@k6oc4u`}
datas={this.getDropMenuDatas()}
onClick={key => this.handleMenuClick(key)}
>
<div style={{"width":"100%","height":"50px","lineHeight":"50px"}}>
<span style={{"marginLeft":"20px","fontWeight":"bold"}}>启用组织管理分权:</span>
<Switch style={{"marginLeft":"20px"}} checked={isDetach == "true" ? true : false} onChange={checked => this.doDetachSwitch(checked)} />
</div>
<WeaTop ecId={`${this && this.props && this.props.ecId || ''}_WeaTop@bj98s7`}
title={i18n.label.mangerDetachName()}
icon={<i className='icon-coms-hrm' />}
iconBgcolor='#217346'
loading={true}
buttons={this.getTopMenuBtns()}
showDropIcon={true}
dropMenuDatas={this.getDropMenuDatas()}
onDropMenuClick={(e) => this.handleMenuClick(e)}
>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@9c3zts`}
searchType={['base', 'advanced']}
showSearchAd={isPanelShow}
searchsBaseValue={this.isEmptyObject(form2.getFormParams()) ? managerName : form2.getFormParams().ecManager}
setShowSearchAd={bool => managerDetach.setPanelStatus(bool)}
hideSearchAd={() => managerDetach.setPanelStatus(false)}
searchsAd={isPanelShow ? this.getPanelComponents() : <div></div>}
advanceHeight={Math.ceil(conditionNum / 2) * 52 + 20}
hasMask={false}
buttonsAd={this.getTabBtn()}
onSearch={() => managerDetach.getTableInfo()}
onSearchChange={val => this.onSearchChange(val)}
/>
<WeaTable ecId={`${this && this.props && this.props.ecId || ''}_WeaTable@pgmg3x`}
comsWeaTableStore={tableStore}
hasOrder={true}
needScroll={true}
getColumns={c => this.reRenderColumns(c)}
onOperatesClick={(record, index, operate) => this.onOperatesClick(record, index, operate)}
/>
</WeaTop>
</WeaRightMenu>
<NewAndEditDialog ecId={`${this && this.props && this.props.ecId || ''}_NewAndEditDialog@q4rrwm`}
title={nEdialogTitle}
visible={visible}
condition={toJS(condition)}
form={form}
isFormInit={form.isFormInit}
loading={dialogLoading}
isEdit={isEdit}
height={200}
conditionLen={1}
save={() => this.handleSave()}
onCancel={() => managerDetach.setVisible(false)}
/>
</div>
)
}
}

View File

@ -0,0 +1,143 @@
import React, {
Component
} from 'react';
import {
Button,
Form,
Row,
Col
} from 'antd';
import {
WeaFormItem,
WeaNewScroll,
WeaSearchGroup,
} from 'ecCom';
import {
WeaSwitch
} from 'comsMobx';
import _ from 'lodash';
export default class AdvanceSearchFormInfo extends Component {
renderForm = () => {
const {
form,
formFields,
itemRender
} = this.props;
let arr = [];
let formParams = form.getFormParams();
formFields.map(c => {
let _arr = [];
c.items.map((field, index) => {
const customerRender = itemRender != null ? itemRender[field.domkey[0]] : null;
const itemProps = {
ratio1to2: true,
label: field.label,
labelCol: {
span: `${window.HrmEngineLabelCol}`
},
error: form.getError(field),
tipPosition: 'bottom',
wrapperCol: {
span: `${window.HrmEngineWrapperCol}`
}
}
let coms;
if (customerRender == null) {
coms = <WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@2tsobq@${index}`} fieldConfig={field} form={form}/>;
} else {
coms = customerRender(field, form, formParams);
}
coms != null && _arr.push(
(
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@xgrs6h@${index}`} span={11} offset={index % 2 === 0 ? 1 : 0}>
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@l40w8j@${index}`}
ratio1to2
label={`${field.label}`}
labelCol={{span: `${window.HrmEngineLabelCol}`}}
error={form.getError(field)}
tipPosition={'bottom'}
wrapperCol={{span: `${window.HrmEngineWrapperCol}`}}
>
{coms}
</WeaFormItem>
</Col>
)
)
if (_arr.length === 2 || index === c.items.length - 1) {
const clone = [..._arr];
_arr.length = 0;
arr.push(<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@s73jjd@${index}`} gutter={8} style={{marginTop: '10px'}}>{clone}</Row>);
}
})
})
return <Form ecId={`${this && this.props && this.props.ecId || ''}_Form@ojbzkx`}>{arr}</Form>;
}
renderGroupForm = () => {
const {
form,
formFields,
itemRender
} = this.props;
let formParams = form.getFormParams();
let arr = [];
formFields.map((c, i) => {
let _arr = [];
c.items.map((field, index) => {
const customerRender = itemRender != null ? itemRender[field.domkey[0]] : null;
const itemProps = {
ratio1to2: true,
label: field.label,
labelCol: {
span: `${window.HrmEngineLabelCol}`
},
error: form.getError(field),
tipPosition: 'bottom',
wrapperCol: {
span: `${window.HrmEngineWrapperCol}`
}
}
let coms;
if (customerRender == null) {
coms = <WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@baa9pz@${index}`} fieldConfig={field} form={form}/>;
} else {
coms = customerRender(field, form, formParams);
}
coms != null && _arr.push({
com: (
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@t6u2oa@${index}`}
ratio1to2
label={`${field.label}`}
labelCol={{span: `${window.HrmEngineLabelCol}`}}
error={form.getError(field)}
wrapperCol={{span: `${window.HrmEngineWrapperCol}`}}
>
{coms}
</WeaFormItem>
),
col: field.colSpan || 2
})
})
arr.push(<WeaSearchGroup ecId={`${this && this.props && this.props.ecId || ''}_WeaSearchGroup@w7lkbb@${i}`} showGroup={c.defaultshow} items={_arr} fontSize={13}/>);
})
return arr;
}
renderFormComponent = () => {
const {
formFields
} = this.props;
const com = formFields.length > 1 ? this.renderGroupForm() : this.renderForm();
return com;
}
render() {
return (
<WeaNewScroll ecId={`${this && this.props && this.props.ecId || ''}_WeaNewScroll@sx3az2`} height={'100%'}>
{this.renderGroupForm()}
</WeaNewScroll>
)
}
}

View File

@ -0,0 +1,26 @@
import React, {Component} from 'react';
import {observer} from 'mobx-react';
import { WeaDialog } from "ecCom";
import Tip from './Tip';
import FormInfo from './FormInfo';
@observer
export default class EncryptSetting extends Component{
render(){
const {store} = this.props;
const {encryptDialogProps, formTarget, encryptFormItemRender} = store;
const {
encryptForm,
encryptFormFields,
} = formTarget;
return (
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@9corpv`} {...encryptDialogProps}>
<Tip ecId={`${this && this.props && this.props.ecId || ''}_Tip@p2simx`} />
<div className='encryptForm' style={{width: '70%', marginLeft: '15%'}}>
<FormInfo ecId={`${this && this.props && this.props.ecId || ''}_FormInfo@0dc7ac`} center={false} form={encryptForm} formFields={encryptFormFields} itemRender={encryptFormItemRender}/>
</div>
</WeaDialog>
)
}
}

View File

@ -0,0 +1,195 @@
import React, {
Component
} from 'react';
import {
observer
} from 'mobx-react';
import {
WeaRightMenu,
WeaTableEdit,
WeaDialog
} from 'ecCom';
import classnames from 'classnames';
import EncryptSetting from './EncryptSetting';
import ViewRangeForm from './ViewRangeForm';
import ViewRangeSetting from './ViewRangeSetting';
import FormInfo from './FormInfo';
@observer
export default class FieldDef extends Component {
constructor(props) {
super(props);
this.state = {
resize: new Date().getTime()
}
}
componentDidMount() {
window.addEventListener('resize', this.resizeHandle);
}
componentWillUnmount() {
window.removeEventListener('resize', this.resizeHandle);
}
resizeHandle = (e) => {
this.setState({
resize: new Date().getTime()
})
}
render() {
const {
resize
} = this.state;
const {
rightMenu,
store,
resetClass
} = this.props;
const {
setEditTable,
tableEditConfig,
formTarget,
dialogParams,
setDialogVisible,
getDialogOpButtons,
showError,
editorDialogRightMenu,
refreshFeildDef,
refreshForm,
dropdownSelectedKey,
moduleName,
isJobTreeNode
} = store;
const classes = classnames({
'tabPane': true,
'tabPane-include': resetClass
})
const {
groupInfoFrom,
groupInfoFromFields,
typeInfoFrom,
typeInfoFromFields,
childInfoForm,
childInfoFormFields
} = formTarget;
const {
editGroupInfo,
editTypeInfo,
groupInfoSetting,
createChildInfo,
childInfoSetting
} = dialogParams;
let tableProps = {};
if (this.tabDom) {
tableProps = {
scroll: {
y: this.tabDom.offsetHeight - 80,
}
}
//人员卡片字段定义页面
// if (moduleName === 'resourcefielddefined') {
// if ((window.e9_locale.userLanguage == 7)) { //系统语言为中文
// Object.assign(tableProps.scroll, {
// x: 1200
// });
// } else {
// Object.assign(tableProps.scroll, {
// x: isJobTreeNode ? 1400 : 1900
// });
// }
// }
}
const rMenu = [...rightMenu, ...store.getBasicMenus(this.props.logSmallType, this.props.targetId)]
return (
<div className={classes} style={{"height":"calc(100% - 47px)"}} ref={dom => {
this.tabDom = dom
}}>
<WeaRightMenu ecId={`${this && this.props && this.props.ecId || ''}_WeaRightMenu@43qdk8`} datas={rMenu}>
<WeaTableEdit ecId={`${this && this.props && this.props.ecId || ''}_WeaTableEdit@5fu5eh`} tableProps={tableProps} viewAttr={3} rowKey={'fieldidrowKey'}
ref={(editTable) => setEditTable(editTable, 'fieldDef')}
{...tableEditConfig['fieldDef']}
/>
</WeaRightMenu>
<EncryptSetting ecId={`${this && this.props && this.props.ecId || ''}_EncryptSetting@imlc4x`} store={store} />
<ViewRangeSetting ecId={`${this && this.props && this.props.ecId || ''}_ViewRangeSetting@2vmdra`} store={store} />
<ViewRangeForm ecId={`${this && this.props && this.props.ecId || ''}_ViewRangeForm@bg4o68`} store={store} />
{/* 新增分组 */}
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@etbstc`}
icon="icon-coms-hrm"
iconBgcolor="#217346"
style={{ width: 440, height: 70 }}
title={editGroupInfo.title}
visible={editGroupInfo.visible}
onCancel={() => setDialogVisible('editGroupInfo', false)}
buttons={getDialogOpButtons()}
moreBtn={{ datas: editorDialogRightMenu }}
>
<FormInfo ecId={`${this && this.props && this.props.ecId || ''}_FormInfo@x4akor`} center={false} form={groupInfoFrom} formFields={groupInfoFromFields} menu={editorDialogRightMenu} />
</WeaDialog>
{/* 新增类型 */}
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@etbstc`}
icon="icon-coms-hrm"
iconBgcolor="#217346"
style={{ width: 440, height: 70 }}
title={editTypeInfo.title}
visible={editTypeInfo.visible}
onCancel={() => setDialogVisible('editTypeInfo', false)}
buttons={getDialogOpButtons()}
moreBtn={{ datas: editorDialogRightMenu }}
>
<FormInfo ecId={`${this && this.props && this.props.ecId || ''}_FormInfo@x4akor`} center={false} form={typeInfoFrom} formFields={typeInfoFromFields} menu={editorDialogRightMenu} />
</WeaDialog>
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@hxqf4v`}
icon="icon-coms-hrm"
iconBgcolor="#217346"
style={{ width: 620, height: 450 }}
title={groupInfoSetting.title}
visible={groupInfoSetting.visible}
onCancel={() => setDialogVisible('groupInfoSetting', false, '')}
buttons={getDialogOpButtons()}
moreBtn={{ datas: editorDialogRightMenu }}
>
<WeaRightMenu ecId={`${this && this.props && this.props.ecId || ''}_WeaRightMenu@u3ghz1`} datas={editorDialogRightMenu}>
<WeaTableEdit ecId={`${this && this.props && this.props.ecId || ''}_WeaTableEdit@9x9otf`}
ref={(editTable) => setEditTable(editTable, 'groupSetting')}
tableProps={{ scroll: { y: 360 } }}
{...tableEditConfig['groupSetting']} />
</WeaRightMenu>
</WeaDialog>
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@dirux3`}
icon="icon-coms-hrm"
iconBgcolor="#217346"
style={{ width: 440, height: createChildInfo.height }}
title={createChildInfo.title}
visible={createChildInfo.visible}
onCancel={() => setDialogVisible('createChildInfo', false)}
buttons={getDialogOpButtons()}
moreBtn={{ datas: editorDialogRightMenu }}
>
<FormInfo ecId={`${this && this.props && this.props.ecId || ''}_FormInfo@mypkxi`} center={false} form={childInfoForm} formFields={childInfoFormFields} menu={editorDialogRightMenu} />
</WeaDialog>
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@k8ta6q`}
icon="icon-coms-hrm"
iconBgcolor="#217346"
style={{ width: 620, height: 450 }}
title={childInfoSetting.title}
visible={childInfoSetting.visible}
onCancel={() => setDialogVisible('childInfoSetting', false, '')}
buttons={getDialogOpButtons()}
moreBtn={{ datas: editorDialogRightMenu }}
>
<WeaRightMenu ecId={`${this && this.props && this.props.ecId || ''}_WeaRightMenu@i9bjcx`} datas={editorDialogRightMenu}>
<WeaTableEdit ecId={`${this && this.props && this.props.ecId || ''}_WeaTableEdit@mma0l9`}
ref={(editTable) => setEditTable(editTable, 'childInfoSetting')}
tableProps={{ scroll: { y: 360 } }}
{...tableEditConfig['childInfoSetting']} />
</WeaRightMenu>
</WeaDialog>
</div>
)
};
}

View File

@ -0,0 +1,182 @@
import '../../style/index.less';
import React, {
Component
} from 'react';
import {
inject,
observer
} from 'mobx-react';
import {
WeaTop,
WeaAlertPage,
WeaLeftTree,
WeaLeftRightLayout,
WeaDropdown
} from 'ecCom';
import { Spin } from 'antd';
import Tabs from './Tabs';
import FieldDef from './FieldDef';
import {
i18n
} from '../../public/i18n';
const { ButtonSelect } = WeaDropdown;
import { renderNoright } from '../../util';
@inject('fieldDefined')
@observer
export default class FieldDefined extends Component {
constructor(props) {
super(props);
this.state = {
logSmallType: ''
}
}
componentDidMount() {
this.init(this.props);
}
componentWillReceiveProps(nextProps) {
if (this.props.location.key !== nextProps.location.key) {
this.init(nextProps);
}
}
init = (props) => {
const {
fieldDefined: store,
params
} = props, {
checkAuthorized,
initData,
initResourceData
} = store, {
type: moduleType
} = params
let moduleName, logSmallType;
if (moduleType === 'subCompany') {
moduleName = 'subcompanyfielddefined';
} else if (moduleType === 'department') {
moduleName = 'departmentfielddefined';
} else if(moduleType === 'job') {
moduleName = 'jobfielddefined';
}else {
moduleName = 'resourcefielddefined';
}
// let callbackFunc = () => initData(false, true, moduleName);
// if (moduleType === 'resource')
//let callbackFunc = () => initResourceData(moduleName);
//checkAuthorized(moduleName, null, callbackFunc);
initResourceData(moduleName);
this.setState({ logSmallType })
}
tabChangeHandle = (key) => {
const {
fieldDefined: store
} = this.props, {
tabConfig
} = store;
store.setActiveTab(tabConfig, key);
}
render() {
const {
fieldDefined: store,
params
} = this.props, {
//containerInitFinished,//权限验证
refreshMainTabComponent,
spinning,
hasRight
} = store, {
type: moduleType
} = params, {
tabConfig,
btnsAndMenus,
formTarget,
activeTabInfo,
treeConfig,
refreshTree,
selectedTreeNodeInfo,
dropdownProps,
feildDefRemoveable
} = store, {
btns,
menus,
tabBtnDef
} = btnsAndMenus(tabConfig), {
conditionForm: form,
conditionFormFields: fields,
} = formTarget, tabProps = {
tabConfig: tabConfig,
tabChangeHandle: this.tabChangeHandle,
activeTabInfo,
rightMenu: menus,
store: store,
conditionForm: form,
conditionFormFields: fields,
tabBtnDef: [
...tabBtnDef,
<ButtonSelect ecId={`${this && this.props && this.props.ecId || ''}_ButtonSelect@qbn2pl`}
{...dropdownProps()}
btnProps={{
style: { padding: 0, background: 'transparent', border: 'none', color: feildDefRemoveable ? '#dadada' : '#34A2FF', fontSize: 20, marginTop: 2 },
disabled: feildDefRemoveable,
}}
/>
]
}, title = moduleType === 'subCompany' ? i18n.module.subCompanyFieldDef() : moduleType === 'department' ? i18n.module.departmentFieldDef() : moduleType === 'job' ? i18n.module.jobFieldDef() : i18n.module.resourceFieldDef(),
topProps = {
title,
icon: <i className='icon-coms-hrm' />,
iconBgcolor: '#217346',
showDropIcon: true,
buttons: btns,
dropMenuDatas: menus
};
let logType;
let children = [];
if (hasRight === false) {
return renderNoright();
}
const {
data,
onSelectedTreeNode,
selectedKeys,
onExpand,
treeExpandKeys
} = store.toJS(treeConfig);
const treeCom = (
<WeaLeftTree ecId={`${this && this.props && this.props.ecId || ''}_WeaLeftTree@ifgbi1`}
datas={data}
onSelect={onSelectedTreeNode}
selectedKeys={selectedKeys}
onExpand={onExpand}
expandedKeys={treeExpandKeys} />
)
children = [
(
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@hwytf7`} spinning={spinning}>
<WeaTop ecId={`${this && this.props && this.props.ecId || ''}_WeaTop@rdv0wt`} {...topProps}>
<WeaLeftRightLayout ecId={`${this && this.props && this.props.ecId || ''}_WeaLeftRightLayout@q6b87k`} leftCom={treeCom}>
{
<Tabs ecId={`${this && this.props && this.props.ecId || ''}_Tabs@4k4wsi`} {...tabProps}>
<FieldDef ecId={`${this && this.props && this.props.ecId || ''}_FieldDef@pliw94`} logSmallType={logType || this.state.logSmallType} targetId={activeTabInfo.tabInfo ? activeTabInfo.tabInfo.groupid : ''} resetClass={true} />
</Tabs>
}
</WeaLeftRightLayout>
</WeaTop>
</Spin>
)
]
return (
hasRight && <div className="hrm_module_container fieldDef">
{children}
</div>
)
}
}

View File

@ -0,0 +1,153 @@
import React, {
Component
} from 'react';
import {
observer
} from 'mobx-react';
import {
Button
} from 'antd';
import {
WeaFormItem,
WeaSearchGroup,
WeaCheckbox
} from 'ecCom';
import {
WeaSwitch
} from 'comsMobx';
import findIndex from 'lodash/findIndex';
@observer
export default class FormInfo extends Component {
renderForm = () => {
const {
formFields,
form,
colCount,
itemRender,
onSelectedChangeHandle,
showLabel,
multiColumn,
custLabelCol,
childrenComponents,
onSwitchChange,
} = this.props;
let groupArr = [];
const formParams = form.getFormParams();
const labelVisible = showLabel == null || showLabel == true;
const col = colCount ? colCount : 1;
const labelCol = labelVisible ? (custLabelCol || `${window.HrmEngineLabelCol}`) : 0;
const itemProps = {
ratio1to2: labelVisible && custLabelCol == null,
style: {
marginLeft: 0 //labelVisible ? -30 : 0
},
tipPosition: 'bottom',
labelCol: {
span: labelCol
},
wrapperCol: {
span: 24 - labelCol
}
}
const textAreaProps = {
minRows: 4,
maxRows: 4
}
formFields.map((fields, i) => {
let formItems = [];
fields.items.map((field, index) => {
const customerRender = itemRender != null ? itemRender[field.domkey[0]] : null;
const showCheckbox = field.checkbox || false;
let label = field.label;
if (showCheckbox)
label = <WeaCheckbox ecId={`${this && this.props && this.props.ecId || ''}_WeaCheckbox@1id63c@${index}`} content={label} value={field.checkboxValue} onChange={(v) => {
field.checkboxValue = v === '1'; onSelectedChangeHandle && onSelectedChangeHandle(field, v)
}}/>
let coms;
if (customerRender == null) {
coms = <WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@7zfwo9@${index}`} fieldConfig={{...field, ...textAreaProps, hasBorder: field.viewAttr === 1}} form={form} formParams={formParams} onChange={datas => onSwitchChange && onSwitchChange(datas)}/>;
} else {
coms = customerRender(field, textAreaProps, form, formParams);
}
Object.assign(itemProps, {
label,
error: form.getError(field)
})
let col = 1;
if (multiColumn != null) { //检查有哪些字段需要一行显示多个
const idx = findIndex(multiColumn, item => item.key === field.domkey[0]);
if (idx > -1) {
col = field.colSpan || 1;
if (multiColumn[idx].labelCol != null) //检查字段是否有配置标题宽度
Object.assign(itemProps, {
labelCol: {
span: multiColumn[idx].labelCol
},
wrapperCol: {
span: 24 - multiColumn[idx].labelCol
}
})
} else {
Object.assign(itemProps, {
labelCol: {
span: labelCol
},
wrapperCol: {
span: 24 - labelCol
}
})
}
}
coms != null && formItems.push({
com: (
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@rv2s0m@${index}`} {...itemProps}>
{coms}
</WeaFormItem>
),
col
})
if (childrenComponents && childrenComponents[field.domkey[0]]) {
childrenComponents[field.domkey[0]]().map(child => formItems.push(child));
}
})
groupArr.push(
(
<WeaSearchGroup ecId={`${this && this.props && this.props.ecId || ''}_WeaSearchGroup@zglygj@${i}`}
center={this.props.center != null ? this.props.center : true}
needTigger={true}
title={formFields.length < 2 ? null : fields.title}
showGroup={true}
items={formItems}
col={col}
fontSize={14}/>
)
)
});
return groupArr;
}
render() {
const {
formFields,
className,
showError
} = this.props;
if (formFields == null)
return (<div></div>)
return (
<div className={className}>
{this.renderForm()}
</div>
)
}
}

View File

@ -0,0 +1,178 @@
import React from 'react'
import * as mobx from 'mobx'
import {
inject,
observer
} from 'mobx-react'
import {
WeaTop, WeaFormItem, WeaTable, WeaRightMenu, WeaHelpfulTip,
WeaNewScroll, WeaSearchGroup, WeaLocaleProvider, WeaTab, WeaTableEdit
} from 'ecCom'
import {
Row, Col, Button, Modal, message, Input, Dropdown, Icon, Menu
} from 'antd'
import { WeaSwitch } from 'comsMobx'
import {
i18n
} from '../../public/i18n';
const getLabel = WeaLocaleProvider.getLabel;
const toJS = mobx.toJS;
const confirm = Modal.confirm;
@inject('qtxConfig')
@observer
export default class QtxConfig extends React.Component {
constructor(props) {
super(props);
}
componentWillMount() {
}
componentDidMount() {
const {
qtxConfig
} = this.props;
qtxConfig.initList();
}
componentWillUnmount() {
}
componentWillReceiveProps(nextProps) {
const {
qtxConfig
} = this.props;
if (this.props.location.key !== nextProps.location.key) {
qtxConfig.initList();
}
}
getDropMenuDatas() {
const {
qtxConfig
} = this.props, {
rightMenu
} = qtxConfig
let menus = [];
toJS(rightMenu).map((item, index) => {
let obj = {
key: item.menuFun,
icon: <i className={`${item.menuIcon}`} />,
content: item.menuName,
}
menus.push(obj);
})
return menus;
}
getTopMenuBtns() {
const {
qtxConfig
} = this.props, {
topMenu
} = qtxConfig
let btns = [];
topMenu.map((item, i) => {
btns.push(<Button type='primary' onClick={() => { this[item.menuFun] && this[item.menuFun](); }}>{item.menuName}</Button>);
});
return btns;
}
save = () => {
const {
qtxConfig
} = this.props;
let result = this.tableEdit.refs.edit.doRequiredCheck();
result.pass && qtxConfig.saveQtxConfigInfo();
}
login = () => {
window.open("/api/bs/hrmorganization/config/ssoLogin", "_blank")
}
getFormItems = () => {
const { qtxConfig } = this.props;
const { configFields, configForm } = qtxConfig;
const arr = [];
const formParams = configForm.getFormParams();
const { isFormInit } = configForm;
isFormInit && configFields.map((field, index) => {
arr.push(<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@4cc308@${index}`} offset={1}>
<div style={{ marginTop: 20 }}>
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@u6ex85@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
{<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@p7d3td@${index}`} fieldConfig={field} form={configForm} formParams={formParams} />}
{<WeaHelpfulTip
style={{"marginLeft":"20px"}}
ecId={`${this && this.props && this.props.ecId || ""}_WeaHelpfulTip@4vdvfp@${index}`}
title="未启用的情况下,企通学配置信息将从qtx_sso_login.properties配置文件中读取" />}
</WeaFormItem>
</div>
</Col>)
})
return <Row>{arr}</Row>
}
render() {
const { qtxConfig: store } = this.props;
const { editTableData } = store, {
datas, columns, selectedData, loading
} = editTableData;
return (
<div ref='page' style={{ height: '100%' }}>
<WeaRightMenu ecId={`${this && this.props && this.props.ecId || ''}_WeaRightMenu@k6oc4u`}
datas={this.getDropMenuDatas()}
onClick={key => { this[key] && this[key]() }}
>
<WeaTop ecId={`${this && this.props && this.props.ecId || ''}_WeaTop@bj98s7`}
title={"企通学配置自定义"}
icon={<i className='icon-coms-hrm' />}
iconBgcolor='#217346'
loading={true}
buttons={this.getTopMenuBtns()}
showDropIcon={true}
dropMenuDatas={this.getDropMenuDatas()}
onDropMenuClick={(key) => { this[key] && this[key]() }}
>
<WeaSearchGroup ecId={`${this && this.props && this.props.ecId || ''}_WeaSearchGroup@ddy3vv`} needTigger={false} showGroup={true} title={getLabel(82751, "基础设置")}>
{this.getFormItems()}
</WeaSearchGroup>
<WeaSearchGroup ecId={`${this && this.props && this.props.ecId || ''}_WeaSearchGroup@s8pupj`} needTigger={false} showGroup={true} title={getLabel(-1, "数据库设置")}>
<WeaTableEdit
ecId={`${this && this.props && this.props.ecId || ""}_WeaTableEdit@7rorir`}
ref={el => {this.tableEdit = el}}
draggable
deleteConfirm
showCopy={false}
title=""
columns={toJS(columns)}
datas={toJS(datas)}
selectedData={!loading && toJS(selectedData)}
onChange={e => store.setTableEditDatas(e)}
/>
</WeaSearchGroup>
</WeaTop>
</WeaRightMenu>
</div>
)
}
}

View File

@ -0,0 +1,262 @@
import React from 'react'
import * as mobx from 'mobx'
import {
inject,
observer
} from 'mobx-react'
import {
WeaTop, WeaFormItem, WeaTable, WeaRightMenu,
WeaNewScroll, WeaSearchGroup, WeaLocaleProvider, WeaTab
} from 'ecCom'
import {
Row, Col, Button, Modal, message, Input, Dropdown, Icon, Menu
} from 'antd'
import { WeaSwitch } from 'comsMobx'
import {
i18n
} from '../../public/i18n';
import QuickSearchTableEdit from './QuickSearchTableEdit';
import QuickSearchDetail from './QuickSearchDetail';
const getLabel = WeaLocaleProvider.getLabel;
const toJS = mobx.toJS;
const confirm = Modal.confirm;
@inject('quickSearch')
@observer
export default class QuickSearch extends React.Component {
constructor(props) {
super(props);
}
componentWillMount() {
}
componentDidMount() {
const {
quickSearch
} = this.props;
quickSearch.initList();
}
componentWillUnmount() {
}
componentWillReceiveProps(nextProps) {
const {
quickSearch
} = this.props;
if (this.props.location.key !== nextProps.location.key) {
quickSearch.initList();
}
}
getDropMenuDatas() {
const {
quickSearch
} = this.props,{
rightMenu
} = quickSearch
let menus = [];
toJS(rightMenu).map((item, index) => {
let obj = {
key: item.menuFun,
icon: <i className={`${item.menuIcon}`} />,
content: item.menuName,
}
menus.push(obj);
})
return menus;
}
getTopMenuBtns() {
const {
quickSearch
} = this.props,{
topMenu
} = quickSearch
let btns = [];
topMenu.map((item, i) => {
btns.push(<Button type='primary' onClick={() => {this[item.menuFun] && this[item.menuFun]();}}>{item.menuName}</Button>);
});
return btns;
}
save = () => {
const {
quickSearch
} = this.props;
quickSearch.saveQuickSearchInfo();
}
getFormItems = () => {
const { quickSearch } = this.props;
const { quickSearchFields, quickSearchForm } = quickSearch;
const arr = [];
const formParams = quickSearchForm.getFormParams();
const { isFormInit } = quickSearchForm;
isFormInit && quickSearchFields.map((field, index) => {
arr.push(<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@4cc308@${index}`} offset={1}>
<div style={{ marginTop: 20 }}>
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@u6ex85@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
{<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@p7d3td@${index}`} fieldConfig={field} form={quickSearchForm} formParams={formParams} />}
</WeaFormItem>
</div>
</Col>)
})
return <Row>{arr}</Row>
}
getSearchButton = () => {
return [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@7xw5i9@addRow`} type="primary" shape="circle" title={getLabel(611, '添加')} size="small" disabled={0} onClick={() => {
this.addRow();
}}><i className="anticon anticon-plus"></i></Button>),
<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@lzrtmm@delRow`} shape="circle" title={getLabel(126371, '删除')} size="small" onClick={() => {
this.delRow();
}} ><i className="anticon anticon-minus"></i></Button>
]
}
addRow = () => {
const { quickSearch } = this.props;
let { quickSearchData } = quickSearch;
let datas = quickSearchData.datas;
if(datas.length>=8){
message.error(getLabel('387795',"最多只能添加8项"));
return;
}
let time = new Date().getTime();
let type = quickSearchData.options.length > 0 ? quickSearchData.options[0].type : '2';
let fieldid = quickSearchData.options.length > 0 ? quickSearchData.options[0].key : '';
let customname = quickSearchData.options.length > 0 ? quickSearchData.options[0].showname : '';
let isdetailtable = quickSearchData.options.length > 0 ? quickSearchData.options[0].isdetailtable : '0';
let obj = {
key: "new_" + time,
fieldid: fieldid,
customname: customname,
range: type == '1' ? getLabel('387636', "内容自定义") : getLabel('387637', "字段本身值"),
condition: type == '1' ? getLabel('68', "设置") : '',
orderid: 0,
type: type,
isdetailtable: isdetailtable
}
datas = toJS(datas);
datas.push(obj);
quickSearch.setQuickSearchData(datas);
}
delRow = () => {
const { quickSearch } = this.props;
let { qcSelectedRowKeys } = quickSearch;
if (qcSelectedRowKeys.length <= 0) {
message.error(getLabel(22346, '请选择要删除的信息', 'label'));
return;
}
const that = this;
Modal.confirm({
title: getLabel(83601, '您确认要删除选中的记录吗?'),
onOk() {
let { datas } = quickSearch.quickSearchData;
datas = toJS(datas);
datas = that.delFromArray(datas, qcSelectedRowKeys);
quickSearch.qcSelectedRowKeys = [];
quickSearch.setQuickSearchData(datas);
},
onCancel() {},
});
}
delFromArray = (array, selectRowIds) => {
for (let i = 0; i < selectRowIds.length; i++) {
let key = selectRowIds[i];
for (let j = 0; j < array.length; j++) {
if (array[j]["key"] == key) {
array.splice(j, 1);
break;
}
}
}
return array;
}
onSelectChange = (keys, rows) => {
let keyarr = [];
rows.map(row => {
keyarr.push(row.key);
});
const { quickSearch } = this.props;
quickSearch.qcSelectedRowKeys = keyarr;
}
onChange = (data) => {
const { quickSearch } = this.props;
quickSearch.setQuickSearchData(data);
}
render() {
const { quickSearch: store } = this.props;
const { qcSelectedRowKeys } = store;
const rowSelection = {
selectedRowKeys: qcSelectedRowKeys,
onChange: this.onSelectChange,
}
return (
<div ref='page' style={{ height: '100%' }}>
<WeaRightMenu ecId={`${this && this.props && this.props.ecId || ''}_WeaRightMenu@k6oc4u`}
datas={this.getDropMenuDatas()}
onClick={key => {this[key] && this[key]()}}
>
<WeaTop ecId={`${this && this.props && this.props.ecId || ''}_WeaTop@bj98s7`}
title={"快捷搜索自定义"}
icon={<i className='icon-coms-hrm' />}
iconBgcolor='#217346'
loading={true}
buttons={this.getTopMenuBtns()}
showDropIcon={true}
dropMenuDatas={this.getDropMenuDatas()}
onDropMenuClick={(key) => {this[key] && this[key]()}}
>
<WeaNewScroll ecId={`${this && this.props && this.props.ecId || ''}_WeaNewScroll@weabdm`}>
<WeaSearchGroup ecId={`${this && this.props && this.props.ecId || ''}_WeaSearchGroup@ddy3vv`} needTigger={false} showGroup={true} title={getLabel(82751, "基础设置")}>
{this.getFormItems()}
</WeaSearchGroup>
<WeaSearchGroup ecId={`${this && this.props && this.props.ecId || ''}_WeaSearchGroup@s8pupj`} needTigger={false} showGroup={true} title={getLabel(384165, "条件字段")}>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@sxnhjh`}
keyParam="key" //主键
buttons={this.getSearchButton()}
/>
<QuickSearchTableEdit ecId={`${this && this.props && this.props.ecId || ''}_QuickSearchTableEdit@1xviqu`}
datas={toJS(store.quickSearchData.datas)}
options={toJS(store.quickSearchData.options)}
onChange={this.onChange}
rowSelection={rowSelection}
ListProps={this.props}
/>
</WeaSearchGroup>
</WeaNewScroll>
<QuickSearchDetail ecId={`${this && this.props && this.props.ecId || ''}_QuickSearchDetail@plu05u`} {...this.props}/>
</WeaTop>
</WeaRightMenu>
</div>
)
}
}

View File

@ -0,0 +1,280 @@
import React from 'react';
import { observer } from 'mobx-react';
import { WeaDialog, WeaNewScroll, WeaLocaleProvider, WeaRightMenu } from 'ecCom';
import { WeaScope, WeaInput, WeaInputNumber, WeaSearchGroup, WeaTab, WeaError, WeaHelpfulTip } from 'ecCom';
const getLabel = WeaLocaleProvider.getLabel;
import { Button, Table, Modal, message } from 'antd';
import { observable, toJS, } from "mobx";
import { WeaForm } from 'comsMobx';
import $ from 'jquery';
@observer
export default class QuickSearchDetail extends React.Component {
constructor(props) {
super(props);
}
onSelectChange = (keys, rows) => {
let keyarr = [];
rows.map(row => {
keyarr.push(row.key);
});
const { quickSearch } = this.props;
quickSearch.qcDetailRowKeys = keyarr;
}
save = () => {
const { quickSearch } = this.props;
quickSearch.saveQuickSearchDetailInfo();
}
closeDialog = () => {
const { quickSearch } = this.props;
quickSearch.quickSearchDetailVisable = false;
}
onChange = (data) => {
const { quickSearch } = this.props;
quickSearch.setQuickSearchDetailData(data);
}
getSearchButton = () => {
const { quickSearch } = this.props;
const buttons = new Array();
buttons.push(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@spalvu@addRow`} type="primary" shape="circle" title={getLabel(611, '添加')} size="small" disabled={0} onClick={() => {
this.addRow();
}}><i className="anticon anticon-plus"></i></Button>);
buttons.push(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@zz4kgt@delRow`} title={getLabel(126371, '删除')} shape="circle" size="small" onClick={() => {
this.delRow();
}} ><i className="anticon anticon-minus"></i></Button>);
return buttons;
}
addRow = () => {
const { quickSearch } = this.props;
let { quickSearchDetailData } = quickSearch;
let datas = quickSearchDetailData;
let time = new Date().getTime();
let obj = {
key: "new_" + time,
customname: '',
orderid: 0,
minnum: '',
maxnum: '',
type: quickSearch.qcData.qcType,
fieldid: quickSearch.qcData.fieldid,
customid: quickSearch.customid
}
datas = toJS(datas);
datas.push(obj);
quickSearch.setQuickSearchDetailData(datas);
}
delRow = () => {
const { quickSearch } = this.props;
let { qcDetailRowKeys } = quickSearch;
if (qcDetailRowKeys.length <= 0) {
message.error(getLabel(22346, '请选择要删除的信息', 'label'));
return;
}
const that = this;
Modal.confirm({
title: getLabel(83601, '您确认要删除选中的记录吗?'),
onOk() {
let datas = quickSearch.quickSearchDetailData;
datas = toJS(datas);
datas = that.delFromArray(datas, qcDetailRowKeys);
quickSearch.qcDetailRowKeys = [];
quickSearch.setQuickSearchDetailData(datas);
},
onCancel() { },
});
}
delFromArray = (array, selectRowIds) => {
for (let i = 0; i < selectRowIds.length; i++) {
let key = selectRowIds[i];
for (let j = 0; j < array.length; j++) {
if (array[j]["key"] == key) {
array.splice(j, 1);
break;
}
}
}
return array;
}
render() {
const { quickSearch: store } = this.props, {
qcDetailRowKeys
} = store;
const rowSelection = {
qcDetailRowKeys,
onChange: this.onSelectChange,
}
const Height = $(".wea-dialog-body")[0] && $(".wea-dialog-body")[0].style.height;
const buttons = [
<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@va8uvk@save`} onClick={() => this.save()} type="primary">{getLabel(86, "保存")}</Button>,
<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@edy7ux@closeDialog`} onClick={() => { this.closeDialog() }}>{getLabel(309, "关闭")}</Button>
]
return (
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@d0kgwh`} style={{ width: 800, height: 550 }}
visible={store.quickSearchDetailVisable}
title={getLabel('387685', "自定义条件设置")}
iconBgcolor="#217346"
icon='icon-coms-hrm'
onCancel={this.closeDialog}
buttons={buttons}
>
<WeaNewScroll ecId={`${this && this.props && this.props.ecId || ''}_WeaNewScroll@x6apdm`} ref="sc" height={Height?Height:530}>
<WeaSearchGroup ecId={`${this && this.props && this.props.ecId || ''}_WeaSearchGroup@d5750t`} needTigger={false} showGroup={true} >
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@85m7gk`}
keyParam="key" //主键
buttons={this.getSearchButton()}
/>
<QuickSearchTableEdit ecId={`${this && this.props && this.props.ecId || ''}_QuickSearchTableEdit@immgug`}
datas={toJS(store.quickSearchDetailData)}
precision={store.precision}
onChange={this.onChange}
rowSelection={rowSelection}
ListProps={this.props}
/>
</WeaSearchGroup>
</WeaNewScroll>
</WeaDialog>
)
}
}
@observer
class QuickSearchTableEdit extends React.Component{
getColumns = () => {
let columnArray = [
{
title: getLabel(195, "名称"), dataIndex: "customname", key: "customname", width: "40%",
com: [{ label: '', type: 'INPUT', key: 'customname', viewAttr: 3, otherParams: { isBase64: true, inputType: "multilang" } }]
},
{
title: <div>
{getLabel(387588, "内容自定义条件")}&nbsp;
<WeaHelpfulTip ecId={`${this && this.props && this.props.ecId || ''}_WeaHelpfulTip@6znscx@condition`}
width = {196} //如果要自定义宽度,在这里设置
title={getLabel('526162','数值关系: 下限值 <= 数值 < 上限值') }
/>
</div>, dataIndex: "condition", key: "condition", width: "40%",
com: [{ label: '', type: 'SCOP', key: 'condition', viewAttr: 3 }]
},
{
title: getLabel(88, "顺序"), dataIndex: "orderid", key: "orderid", width: "20%",
com: [{ label: '', type: 'INPUTNUMBER', key: 'orderid', viewAttr: 2, otherParams: { max: 999, step: 1 } }]
}
];
columnArray = columnArray.map((col) => {
let _col = { ...col };
_col.render = (text, record, index) => {
return this.getColRender(_col, text, record, index);
}
return _col
});
return columnArray;
}
getColRender = (_col, text, record, index) => {
const { datas } = this.props;
const { quickSearch: { quickSearchRefObj } } = this.props.ListProps;
const { com, } = _col;
let _com = [];
com.map((c) => {
if (typeof c.props === 'object') {
_com.push(<span></span>);
} else {
const { key, viewAttr = 2, type = 'INPUT', width, otherParams = {} } = c;
const _type = type.toUpperCase();
_com.push(
<span>
{
_type === 'INPUT' &&
<WeaError ecId={`${this && this.props && this.props.ecId || ''}_WeaError@z6mgxq@${index}`}
tipPosition={(index == 0 || index+1==datas.length) ? 'top':'bottom'}
error={getLabel('385869', "此项必填")}
style={{ width: "98%" }}
ref={ref => quickSearchRefObj[`error_${key}_${index}`] = ref}
>
<WeaInput ecId={`${this && this.props && this.props.ecId || ''}_WeaInput@mz6i71@${index}`}
value={record[key]}
viewAttr={viewAttr}
onChange={(value) => this.onEdit(record, index, key, value)}
{...otherParams}
/>
</WeaError>
}
{
_type === 'SCOP' &&
<WeaError ecId={`${this && this.props && this.props.ecId || ''}_WeaError@bvnfbi@${index}`}
tipPosition={(index == 0 || index+1==datas.length) ? 'top':'bottom'}
error={getLabel('385869', "此项必填")}
ref={ref => quickSearchRefObj[`error_${key}_${index}`] = ref}
>
<div className={(record['minnum'] === '' || record['minnum'] == undefined) && (record['maxnum'] === '' || record['maxnum'] == undefined) ? "required" : ""}>
<WeaScope ecId={`${this && this.props && this.props.ecId || ''}_WeaScope@zu7wra@${index}`}
isMobx
hideOps={true}
precision={this.props.precision}
value={[record['minnum'], record['maxnum']]}
onChange={(value) => this.onEdit(record, index, key, value)}
/>
</div>
</WeaError>
}
{
_type === 'INPUTNUMBER' &&
<WeaInputNumber ecId={`${this && this.props && this.props.ecId || ''}_WeaInputNumber@chty4d@${index}`}
value={record[key]}
style={{ width, display: 'inline-block' }}
viewAttr={viewAttr}
onChange={(value1) => this.onEdit(record, index, key, value1)}
{...otherParams}
/>
}
</span>
)
}
});
return (
<div>
{_com}
</div>
)
}
onEdit = (record, index, key, value) => {
const { datas } = this.props;
let _datas = [...datas];
_datas[index][key] = value;
if (key == 'condition') {
_datas[index].minnum = value[0] === undefined ? "" : value[0];
_datas[index].maxnum = value[1] === undefined ? "" : value[1];
}
typeof this.props.onChange === 'function' && this.props.onChange(_datas);
}
render() {
const { datas, rowSelection } = this.props;
return (
<div className="wev-cube-table-inner-warp">
<Table ecId={`${this && this.props && this.props.ecId || ''}_Table@nytlcm`}
rowSelection={rowSelection}
columns={this.getColumns()}
dataSource={datas}
pagination={false}
/>
</div>
)
}
}

View File

@ -0,0 +1,233 @@
import React from 'react'
import * as mobx from 'mobx'
import {
inject,
observer
} from 'mobx-react'
import {
WeaTable, WeaLocaleProvider, WeaSelect, WeaInput, WeaInputNumber
} from 'ecCom'
import {
Row, Col, Button, Modal, message, Input, Dropdown, Icon, Menu
} from 'antd'
import {
i18n
} from '../../public/i18n';
const getLabel = WeaLocaleProvider.getLabel;
import jQuery from "jquery";
const toJS = mobx.toJS;
export default class QuickSearchTableEdit extends React.Component {
/**========================table字段类型=====================*/
getColumns = () => {
let columnArray = [
{
title: getLabel(261, "字段"), dataIndex: "fieldid", key: "fieldid", width: "18%",
com: [{ label: '', type: 'SELECT', isLink: true, key: 'fieldid', options: [] }]
},
{
title: getLabel(195, "名称"), dataIndex: "customname", key: "customname", width: "18%",
com: [{
label: '', type: 'INPUT', key: 'customname', viewAttr: 2, otherParams: { isBase64: true, inputType: "multilang" }
}]
},
{
title: getLabel(389518, "查询范围"), dataIndex: "range", key: "range", width: "8%",
com: [{ label: '', type: 'INPUT', key: 'range', viewAttr: 1 }]
},
{
title: getLabel(387588, "内容自定义条件"), dataIndex: "condition", key: "condition", width: "15%",
com: [{ label: '', type: 'BUTTON', key: 'condition', viewAttr: 1 }]
}, {
title: getLabel(21657, "显示模式"), dataIndex: "showmodel", key: "showmodel", width: "15%",
com: [{
label: '',
type: 'SELECT',
key: 'showmodel',
viewAttr: 1,
options: [ { key: '0', showname: getLabel(19852, '平铺') },]
}]
}
];
columnArray = columnArray.map((col) => {
let _col = { ...col };
_col.render = (text, record, index) => {
return this.getColRender(_col, text, record, index);
}
return _col
});
return columnArray;
}
getColRender = (_col, text, record, index) => {
const {
quickSearch: store
} = this.props;
const { com } = _col;
let _com = [];
com.map((c, idn) => {
if (typeof c.props === 'object') {
_com.push(<span></span>);
} else {
const { key, isLink = false, viewAttr = 2, type = 'INPUT', width, otherParams = {}, detailtype = 1, options = [] } = c;
const _type = type.toUpperCase();
record.range = record.type == '1' ? getLabel('387636', "内容自定义") : getLabel('387637', "字段本身值");
record.condition = record.type == '1' ? getLabel('68', "设置") : '';
if (_type === 'INPUT') {
_com.push(<WeaInput ecId={`${this && this.props && this.props.ecId || ''}_WeaInput@gedh14@${idn}`}
style={{ minWidth: 60 }}
value={record[key]}
viewAttr={viewAttr}
onChange={(value) => this.onEdit(record, index, key, value)}
{...otherParams}
length={100}
/>)
} else if (_type === 'BUTTON') {
_com.push(<a onClick={() => this.onClick(record)}
style={{ width, display: 'inline-block' }}>{record[key]}</a>);
} else if (_type === 'INPUTNUMBER') {
_com.push(<WeaInputNumber ecId={`${this && this.props && this.props.ecId || ''}_WeaInputNumber@9qqytl@${idn}`}
value={record[key]}
style={{ width, display: 'inline-block' }}
viewAttr={viewAttr}
onChange={(value) => this.onEdit(record, index, key, value)}
{...otherParams}
/>)
} else if (_type === 'SELECT') {
if (isLink) {
_com.push(<WeaSelect ecId={`${this && this.props && this.props.ecId || ''}_WeaSelect@h3f5u2@${idn}`}
style={{ width, display: 'inline-block', minWidth: 173 }}
options={toJS(this.props.options)}
viewAttr={viewAttr}
value={record[key]}
detailtype={detailtype}
onChange={(value) => {
this.onEdit(record, index, key, value)
}}
showSearch
filterOption={(inputValue, option) => this.selectFilterOption(inputValue, option)}
/>);
}else if (key === 'showmodel') {//可以设置平铺的类型
const opt = this.props.options.filter(item => item.fieldid === record.fieldid);
const isShowModel = opt[0] ? opt[0].isShowModel : false;
if (isShowModel) {
if (!record[key]) {
record[key] = '0'
}
_com.push(<WeaSelect ecId={`${this && this.props && this.props.ecId || ''}_WeaSelect@ffcq2z@${idn}`}
style={{ width, display: 'inline-block' }}
options={options}
viewAttr={viewAttr}
value={record[key]}
detailtype={detailtype}
onChange={(value) => {
this.onEdit(record, index, key, value)
}}
filterOption={(inputValue, option) => selectFilterOption(inputValue, option)}
/>);
}
}
}
}
});
return (
<div className="cube-quicksearch-list-form">{_com}</div>
)
};
onDropChange = (data) => {
typeof this.props.onChange === 'function' && this.props.onChange(data);
}
onClick = (record) => {
const { ListProps } = this.props;
const { quickSearch } = ListProps;
let key = record.key;
if (key.indexOf("new") >= 0 || record.fieldid != record.orifieldid) {
message.error(getLabel(82228, "请先保存再设置条件"));
return;
}
quickSearch.openQuickSearchDetail(record);
};
onEdit = (record, index, key, value, name, data) => {
const { datas } = this.props;
let _datas = [...datas];
_datas[index][key] = value;
if (key == 'fieldid') {
let opt = this.getType(value);
if (opt != null) {
_datas[index].type = opt['type'];
_datas[index].customname = opt['showname'];
_datas[index].range = _datas[index].type == '1' ? getLabel('387636', "内容自定义") : getLabel('387637', "字段本身值");
_datas[index].condition = _datas[index].type == '1' ? getLabel('68', "设置") : '';
_datas[index].isdetailtable = opt['isdetailtable'];
}
}
typeof this.props.onChange === 'function' && this.props.onChange(_datas);
}
getType = (key) => {
let option = null;
this.props.options.map(f => {
if (f.key == key) {
option = f;
}
});
return option;
}
/**
* 根据选择框的名称搜索过滤选项
* @param inputValue
* @param option
*/
selectFilterOption = (inputValue, option) => {
if (inputValue != "") {
const { children } = option["props"];
if (children) {
if ((typeof children) == "string") {
return children.toLowerCase().indexOf(inputValue.toLowerCase()) != -1;
} else if ((typeof children) == "object" && children.length > 0) {
const childrenNew = children[0]["props"]["children"];
if (childrenNew) {
return childrenNew.toLowerCase().indexOf(inputValue.toLowerCase()) != -1;
} else {
return false;
}
} else {
const childrenNew = children["props"]["children"];
if (childrenNew) {
return childrenNew.toLowerCase().indexOf(inputValue.toLowerCase()) != -1;
} else {
return false;
}
}
} else {
return false;
}
}
return true;
}
render() {
const { datas, rowSelection } = this.props;
return (
<div className="wev-cube-table-inner-warp">
<WeaTable ecId={`${this && this.props && this.props.ecId || ''}_WeaTable@ofga8g`}
rowSelection={rowSelection}
columns={this.getColumns()}
dataSource={datas}
pagination={false}
draggable={true}
onDrop={this.onDropChange}
/>
</div>
)
}
}

View File

@ -0,0 +1,220 @@
import React, {
Component
} from 'react';
import {
WeaTab
} from 'ecCom';
import {
observer
} from 'mobx-react';
import {
Button
} from 'antd';
import AdvanceSearchFormInfo from './AdvanceSearchFormInfo';
import {
cloneDeep
} from 'lodash';
import {
calFormHeight
} from '../../util/index';
import {
i18n
} from '../../public/i18n';
@observer
export default class Tabs extends Component {
constructor(props) {
super(props);
this.state = {
showSearchAd: false,
};
}
componentWillReceiveProps(nextProps) {
this.setState({
showSearchAd: false,
})
}
doSearch = () => {
const {
conditionForm,
tabConfig,
activeTabInfo,
} = this.props;
let tabInfo = tabConfig.tabs[activeTabInfo.activeTabIndex];
tabInfo.doSearch(conditionForm.getFormParams());
this.setState({
showSearchAd: false
});
}
doReset = () => {
const {
conditionForm
} = this.props;
conditionForm.resetConditionValue();
}
doCancel = () => {
const {
conditionForm
} = this.props;
this.setState({
showSearchAd: false,
});
}
getTabButtonsAd() {
return [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@xygary`} type="primary" onClick={this.doSearch}>{i18n.button.search()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@5l4fsp`} type="ghost" onClick={this.doReset}>{i18n.button.reset()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@yktxms`} type="ghost" onClick={this.doCancel}>{i18n.button.cancel()}</Button>)
]
}
renderForm = () => {
const {
conditionForm,
conditionFormFields,
itemRender
} = this.props;
const {
isFormInit
} = conditionForm;
if (isFormInit)
return <AdvanceSearchFormInfo ecId={`${this && this.props && this.props.ecId || ''}_AdvanceSearchFormInfo@5us8i8`} form={conditionForm} formFields={conditionFormFields} itemRender={itemRender}/>
else
return '';
}
initTab = (props) => {
return React.cloneElement(<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@3x9y9h`}/>, {
...props
});
}
renderTabNav = () => {
//data
const {
activeTabInfo,
tabConfig,
tabChangeHandle,
tabBtnDef,
conditionForm,
conditionFormFields,
advanceHeight,
store,
leftStyle,
} = this.props;
let tabInfo = tabConfig.tabs[activeTabInfo.activeTabIndex];
let tabsData = cloneDeep(tabConfig.tabs) || [];
tabsData != null && tabsData.map(tab => {
if (typeof(tab.title) == 'function'){
tab.title = tab.title();
}
delete tab.topButtonDef;
delete tab.tabButtonDef;
});
let tabProps = {
type: 'editable-inline',
datas: tabsData,
keyParam: tabConfig.keyParam,
selectedKey: tabConfig.activeTabKey,
onChange: tabChangeHandle,
leftStyle
}
tabBtnDef && Object.assign(tabProps, {
buttons: tabBtnDef
});
const searchType = tabInfo.searchType || [];
if (searchType.length > 0) {
Object.assign(tabProps, {
searchType: searchType,
onSearch: (value) => {
if (searchType.indexOf('advanced') >= 0) {
tabInfo.doSearch(conditionForm.getFormParams());
} else {
tabInfo.doSearch({
[tabInfo.searchKey]: value
});
}
}
});
if (searchType.indexOf('advanced') >= 0 && conditionForm != null && conditionForm.isFormInit) {
const formParams = conditionForm.getFormParams();
Object.assign(tabProps, {
searchsBaseValue: formParams[tabInfo.searchKey] || '',
showSearchAd: this.state.showSearchAd,
setShowSearchAd: (bool) => {
this.setState({
showSearchAd: bool
})
},
onSearchChange: (value) => conditionForm.updateFields({
[tabInfo.searchKey]: {
value
}
}, false),
buttonsAd: this.getTabButtonsAd(),
searchsAd: <div
onKeyDown={(e) =>{
if (e.keyCode == 13 && e.target.tagName === "INPUT") {
tabInfo.doSearch(conditionForm.getFormParams());
this.setState({
showSearchAd: false
})
}
} }
>{this.renderForm()}</div>
});
Object.assign(tabProps, {
//advanceHeight: calFormHeight(conditionFormFields.length, _.keys(formParams).length)
advanceHeight: advanceHeight ? advanceHeight : calFormHeight(conditionFormFields.length, conditionForm.fieldArr)
});
}
}
tabConfig.onTabEdit && Object.assign(tabProps, {
onEdit: tabConfig.onTabEdit
});
return this.initTab(tabProps);
}
renderTabContent = () => {
const {
children,
activeTabInfo,
rightMenu,
store
} = this.props;
if (Array.isArray(children)) {
return React.cloneElement(children[activeTabInfo.activeTabIndex], {
rightMenu,
activeTabIndex: activeTabInfo.activeTabIndex,
store
});
} else {
return React.cloneElement(children, {
rightMenu,
activeTabIndex: activeTabInfo.activeTabIndex,
store
});
}
}
render() {
const {
tabConfig
} = this.props;
return (
<div style={{width: '100%', height: '100%'}}>
{tabConfig.tabs.length > 0 && this.renderTabNav()}
{tabConfig.tabs.length > 0 && this.renderTabContent()}
</div>
);
}
}

View File

@ -0,0 +1,13 @@
import React, {Component} from 'react';
import {WeaLocaleProvider} from 'ecCom';
const {getLabel} = WeaLocaleProvider;
export default class Tip extends Component{
render(){
const label = this.props.label || getLabel('524355','提示: 字段一旦加密后无法取消,同时加密后的字段不支持查询,请谨慎操作!');
return (
<div className={'data_security_tip_info' || this.props.className}><i className="icon-coms-Invalid" />{label}</div>
)
}
}

View File

@ -0,0 +1,16 @@
import React, {Component} from 'react';
import {observer} from 'mobx-react';
import { WeaAuth } from "ecCom";
@observer
export default class ViewRangeForm extends Component{
render(){
const {store} = this.props;
const {viewRangeAuthProps} = store;
return (
<WeaAuth ecId={`${this && this.props && this.props.ecId || ''}_WeaAuth@xuisnk`} {...viewRangeAuthProps}>
</WeaAuth>
)
}
}

View File

@ -0,0 +1,21 @@
import React, {Component} from 'react';
import {observer} from 'mobx-react';
import { WeaDialog, WeaTab } from "ecCom";
import {WeaTableNew} from "comsMobx";
const {WeaTable} = WeaTableNew;
@observer
export default class ViewRangeSetting extends Component{
render(){
const {store} = this.props;
const {dialogProps, rangeViewTabProps, rangeViewTableProps} = store;
return (
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@hsilps`} {...dialogProps}>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@36lgpj`} {...rangeViewTabProps} />
<WeaTable ecId={`${this && this.props && this.props.ecId || ''}_WeaTable@fjlkzk`} {...rangeViewTableProps} />
</WeaDialog>
)
}
}

View File

@ -0,0 +1,231 @@
import React from 'react'
import * as mobx from 'mobx'
import {
inject,
observer,
} from 'mobx-react'
import {
WeaTop,
WeaTab,
WeaFormItem,
WeaRightMenu,
} from 'ecCom'
import {
Row,
Col,
Spin,
Modal,
Button,
message,
Switch
} from 'antd'
import {
WeaSwitch,
WeaTableNew
} from 'comsMobx'
import {
i18n
} from '../../public/i18n';
import '../../style/common.less';
import NewAndEditDialog from '../NewAndEditDialog';
import { renderNoright } from '../../util';
const toJS = mobx.toJS;
const confirm = Modal.confirm;
@inject('group')
@observer
export default class Group extends React.Component {
constructor(props) {
super(props);
}
componentWillMount() {
}
componentDidMount() {
this.init();
}
componentWillReceiveProps(nextProps) {
const {
group
} = this.props;
if (this.props.location.key !== nextProps.location.key) {
this.init();
}
}
init() {
const {
group
} = this.props;
group.getGroupForm();
group.getHasRight();
}
getTopMenuBtns() {
const {
group
} = this.props;
const {
topMenu,
tableStore
} = group;
let btns = [];
topMenu.map((item, i) => {
btns.push(<Button type='primary' onClick={() => this.handleClick(item)}>{item.menuName}</Button>);
});
return btns;
}
getDropMenuDatas() {
const {
group
} = this.props;
const {
rightMenu
} = group;
let menus = [];
toJS(rightMenu).map((item, index) => {
let obj = {
key: item.menuFun,
icon: <i className={`${item.menuIcon}`} />,
content: item.menuName,
}
if (item.menuFun == 'collection' || item.menuFun == 'help' || item.menuFun == 'pageAddress') {
obj.disabled = true;
}
menus.push(obj);
})
return menus;
}
doEdit(id) {
const {
group
} = this.props;
group.setNeDialogTitle(i18n.label.editGroup());
group.setVisible(true);
group.getForm();
}
handleSave() {
const {
group
} = this.props;
group.edit();
}
handleMenuClick(key) {
this[key] && this[key]();
}
handleClick(item) {
this[item.menuFun] && this[item.menuFun]();
}
changeData(key) {
const {
group
} = this.props;
group.changeData(key);
}
getFormField() {
const {
group
} = this.props;
const { form1, groupCondition } = group;
const { isFormInit } = form1;
const formParams = form1.getFormParams();
let items = [];
isFormInit && toJS(groupCondition).map(c => {
c.items.map((fields, index) => {
items.push(<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@zzk1d0@${index}`}
underline={true}
label={`${fields.label}`}
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}>
<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@p0qhmz@${index}`} fieldConfig={fields} form={form1} formParams={formParams} />
</WeaFormItem>);
});
});
return <div className="wea-form-item-group">{items}</div>;
}
render() {
const {
group
} = this.props;
const {
nEdialogTitle, visible, condition, form, dialogLoading, isEdit, topTab, selectedKey, date, hasRight,loading
} = group;
if (hasRight === false) {
return renderNoright();
}
return (
hasRight && <div ref='page' style={{ height: '100%' }}>
<WeaRightMenu ecId={`${this && this.props && this.props.ecId || ''}_WeaRightMenu@k6oc4u`}
datas={this.getDropMenuDatas()}
onClick={key => this.handleMenuClick(key)}
>
<WeaTop ecId={`${this && this.props && this.props.ecId || ''}_WeaTop@bj98s7`}
title={i18n.label.groupInfo()}
icon={<i className='icon-coms-hrm' />}
iconBgcolor='#217346'
loading={true}
buttons={this.getTopMenuBtns()}
showDropIcon={true}
dropMenuDatas={this.getDropMenuDatas()}
onDropMenuClick={(e) => this.handleMenuClick(e)}
>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@9c3zts`}
datas={topTab}
keyParam="viewCondition" //主键
selectedKey={selectedKey}
onChange={this.changeData.bind(this)}
/>
<div className='organization-group'>
{
loading ? <div className='organization-group-loading'>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@4ygl4a`} spinning={loading}></Spin>
</div> : this.getFormField()}
</div>
</WeaTop>
</WeaRightMenu>
<NewAndEditDialog ecId={`${this && this.props && this.props.ecId || ''}_NewAndEditDialog@q4rrwm`}
title={nEdialogTitle}
visible={visible}
condition={toJS(condition)}
form={form}
isFormInit={form.isFormInit}
loading={dialogLoading}
isEdit={isEdit}
height={250}
conditionLen={3}
save={() => this.handleSave()}
onCancel={() => group.setVisible(false)}
/>
</div>
)
}
}

View File

@ -0,0 +1,355 @@
import {
inject,
observer
} from 'mobx-react';
import {
WeaUpload,
WeaDialog,
WeaFormItem,
WeaSearchGroup,
WeaNewScroll,
WeaSelect,
WeaInput,
WeaAlertPage,
WeaLocaleProvider
} from 'ecCom'
import {
Row,
Col,
Button,
Spin
} from 'antd'
import {
WeaSwitch
} from 'comsMobx'
import React from 'react'
import {
i18n
} from '../../public/i18n';
import { addContentPath, renderNoright } from '../../util/index.js'
import '../../style/common.less'
const getLabel = WeaLocaleProvider.getLabel;
@inject('datasImport')
@inject('resource')
@observer
export default class DatasImport extends React.Component {
constructor(props) {
super(props);
}
componentDidMount() {
const {
datasImport
} = this.props;
datasImport.list = [];
}
getCircle() {
let style = {
width: 20,
height: 20,
backgroundColor: '#D8D8D8',
webkitBorderRadius: 10,
mozBorderRadius: 10,
msBorderRadius: 10,
oBorderRadius: 10,
borderRadius: 10,
//paddingLeft: 6,
textAlign: 'center',
}
return style;
}
getForm() {
const {
datasImport
} = this.props;
const {
condition
} = datasImport;
let _arr = [];
condition.map((c, i) => {
let arr = [];
if (i == 0) { //基本信息
c.items.map((field, index) => {
arr.push({
com: (
<div>
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@m9t2kn@${index}`}>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@rc5who@${index}`} span={1} offset={4}>
<div style={{ marginTop: 15 }}>
<div style={this.getCircle()}><div style={{ paddingTop: 2 }}>{index + 1}</div></div>
</div>
</Col>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@f1sc6s@${index}`} span={14}>
<div style={{ marginTop: 15 }}>
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@5gsx6o@${index}`}>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@qrdxst@${index}`} span={field.labelcol} style={{ overflow: 'hidden', whiteSpace: 'nowrap', textOverflow: 'ellipsis' }} title={field.label}>{field.label}:</Col>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@7jy5um@${index}`} span={field.fieldcol}>
{this.getDom(field)}
</Col>
</Row>
</div>
</Col>
</Row>
</div>
),
colSpan: 1,
})
})
}
if (i == 1) { //导入说明
c.items.map((field, index) => {
arr.push({
com: (
<div>
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@hz50xl@${index}`}>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@fgfbrv@${index}`} span={1} offset={4} style={{ marginTop: 15 }}>
<div style={this.getCircle()}>
<div style={{ paddingTop: 2 }}>{index + 1}</div>
</div>
</Col>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@5rom81@${index}`} span={17} style={{ marginTop: 15 }}>
{this.getIllustration(field.value, field.link, index, field)}
</Col>
</Row>
</div>
),
colSpan: 1
})
})
}
_arr.push(<div><WeaSearchGroup ecId={`${this && this.props && this.props.ecId || ''}_WeaSearchGroup@bo47pp@${i}`} needTigger={true} title={c.title} showGroup={c.defaultshow} items={arr} col={1} /></div>)
});
return _arr;
}
getDom(field) {
const {
datasImport
} = this.props;
const {
templetName,
filelist,
getTemplateUrl,
importParams
} = datasImport;
let dom;
let domkey = field.domkey;
if (domkey[0] == 'templet') {
dom = <a href={addContentPath(field.value)}>{i18n.label.importTemplate()}</a>;
} else if (domkey[0] === 'exportData') {
const href = datasImport.operateType === 'add' ? field.otherParams.fileVal[0].add : field.otherParams.fileVal[0].update;
if (datasImport.importType === 'matrix') {
dom = <a onClick={() => {
getTemplateUrl(datasImport.otherParams.matrixid, datasImport.operateType, importParams)
}}>{i18n.label.importTemplate()}</a>
} else
dom = <a href={addContentPath(href)}>{i18n.label.importTemplate()}</a>;
} else if (domkey[0] == 'excelfile' || domkey[0] == 'importfile') {
dom = (<div>
<div style={{ float: 'left', marginTop: -10 }}>
<WeaUpload ecId={`${this && this.props && this.props.ecId || ''}_WeaUpload@iu8n01`}
uploadUrl='/api/doc/upload/uploadFile'
category='string'
limitType='xls,xlsx'
maxFilesNumber={1}
datas={filelist}
{...field.otherParams}
onChange={
(ids, list) => {
this.setFileId(ids, list)
}
} >
<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@87232v`}>{i18n.button.selectFile()}</Button>
</WeaUpload>
</div>
<div style={{ float: 'left', paddingLeft: 10 }}>
{filelist.length == 0 ? <p>{i18n.label.noFileSelected()}</p> : filelist.map(file => <p>{file.filename}</p>)}
</div>
</div>)
} else if (domkey[0].indexOf('keyField') > -1) {
const vals = field.options.filter(v => v.selected == true);
let val = '';
vals.length > 0 && (val = vals[0].key);
dom = <WeaSelect ecId={`${this && this.props && this.props.ecId || ''}_WeaSelect@yzc92h`}
style={{ width: 200 }}
options={field.options}
value={datasImport.importParams[domkey[0]] || field.value || val}
onChange={(v) => {
datasImport.setParam(domkey[0], v)
}}
/>
} else if (domkey[0] == 'importType') {
dom = <WeaSelect ecId={`${this && this.props && this.props.ecId || ''}_WeaSelect@holhhb`}
style={{ width: 200 }}
options={field.options}
value={datasImport.operateType}
onChange={(v) => {
datasImport.operateType = v
}}
/>
} else {
dom = <WeaInput ecId={`${this && this.props && this.props.ecId || ''}_WeaInput@rg6f3p`} hasBorder={true} viewAttr={1} value={field.value} />
}
return dom;
}
getIllustration(val, url, index, link) {
const {
datasImport
} = this.props;
const {
templetName,
getTemplateUrl,
importParams
} = datasImport;
let p;
if (index == 0) {
if (url instanceof Object) {
const href = datasImport.operateType === 'add' ? url.add : url.update;
let dom;
if (datasImport.importType === 'matrix') {
dom = <a onClick={() => {
getTemplateUrl(datasImport.otherParams.matrixid, datasImport.operateType, importParams)
}}>{i18n.label.importTemplate()}</a>
} else
dom = <a href={addContentPath(href)}>{i18n.label.importTemplate()}</a>;
p = (<p>{i18n.label.downLoadTemplete()}{dom}</p>);
} else if (url != null) {
if (datasImport.importType === 'matrix') {
p = (<p>{i18n.label.downLoadTemplete()}<a onClick={() => {
getTemplateUrl(datasImport.otherParams.matrixid, datasImport.operateType)
}}>{i18n.label.importTemplate()}</a></p>);
} else
p = (<p>{i18n.label.downLoadTemplete()}<a href={addContentPath(url)}>{i18n.label.importTemplate()}</a></p>);
} else {
p = (<p><div dangerouslySetInnerHTML={{ __html: val }} /></p>);
}
} else {
p = (<p><div dangerouslySetInnerHTML={{ __html: val }} /></p>);
}
return p;
}
setFileId(ids, list) {
const {
datasImport
} = this.props;
datasImport.excelfile = ids;
datasImport.filelist = list;
}
onUploading(s) {
const {
datasImport
} = this.props;
datasImport.status = s;
}
submit() {
const {
datasImport,
resource
} = this.props;
datasImport.saveImport({}, () => {
this.refs.scroll && this.refs.scroll.scrollToLast();
});
// resource.getTableInfo();
// resource.getHasRight();
}
cancel() {
const {
datasImport,
onClose
} = this.props;
datasImport.visible = false
datasImport.init();
onClose && onClose();
}
importHistoryQuery() {
const {
datasImport
} = this.props;
datasImport.visibleHistory = true;
datasImport.getImportHistory();
}
render() {
const {
datasImport,
mainTitle,
importLog,
viewLog,
viewLogTitle,
} = this.props;
const {
title,
visible,
titleResult,
visibleResult,
importResultColumns,
importProcessLogDatas,
failnum,
succnum,
importResultTip,
importResultStore,
importStatus,
errorInfo,
setScrollRef,
single,
showLoadingSpin,
condition
} = datasImport;
const buttons = condition.length ? [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@ip7b32`} type="primary" onClick={() => this.submit()}>{i18n.button.submit()}</Button>),
] : [];
let dialogHeight = window.innerHeight - 150;
if (dialogHeight > 560) dialogHeight = 560;
return (
<div>
{
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@s55z5q`}
title={mainTitle || title}
icon="icon-coms-hrm"
iconBgcolor="#217346"
visible={visible}
closable={true}
onCancel={() => this.cancel()}
buttons={buttons}
style={{ width: 870, height: dialogHeight }}
moreBtn={{
datas: condition ? [{
key: '1',
content: i18n.button.submit(),
icon: <i className='icon-coms-Preservation' />,
onClick: () => this.submit(),
}] : []
}}
>
{condition.length ? (
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@1fvd3j`} spinning={showLoadingSpin}>
<WeaNewScroll ecId={`${this && this.props && this.props.ecId || ''}_WeaNewScroll@2908z2`} height={dialogHeight} ref="scrollBar">
{this.getForm()}
</WeaNewScroll>
</Spin>
) : <div></div>
}
</WeaDialog>
}
</div>
)
}
}

View File

@ -0,0 +1,204 @@
import React from 'react'
import {
toJS
} from 'mobx'
import {
inject,
observer,
} from 'mobx-react'
import {
WeaTop,
WeaAlertPage,
} from 'ecCom'
import {
Spin,
} from 'antd';
import {
i18n
} from '../../public/i18n';
import ImportResource from '../importresource/Import';
//import Import from '../importRelatedComponet/index'
import {addContentPath} from '../../util/index.js'
import '../../style/import.css'
@inject('hrmBasicDataImport')
@inject('hrmImportResource')
@inject('hrmImportCommon')
@observer
export default class BasicInfoImport extends React.Component {
constructor(props) {
super(props);
}
componentWillMount() {
let bool = window.location.href.indexOf('/spa/hrm/engine.html') > -1;
if (bool) {
document.title = i18n.module.basicInfoImport();
}
}
componentDidMount() {
const {
hrmBasicDataImport
} = this.props, {
getRight
} = hrmBasicDataImport;
getRight();
}
getImportCard = () => {
const {
hrmBasicDataImport
} = this.props, {
isMouseOver,
curIndex,
cardConfig,
setMouseStatus,
} = hrmBasicDataImport;
let arr = [];
cardConfig.map((c, index) => {
arr.push(<div className='hrm-card-out' style={(index == 0 || index == 4) ? {marginLeft:0} : {}} onMouseEnter={() => setMouseStatus(index, true)} onMouseLeave={() => setMouseStatus(index, false)}>
<div className='hrm-card-inwrap' style={curIndex==index&&isMouseOver?{backgroundColor:'#858585'}:{backgroundColor:c.bgColor}}>
{ curIndex == index && isMouseOver ? this.getLinkName(c.linkName,index) : this.getIcon(c.icon)}
{ curIndex == index && isMouseOver ? this.getSubTitle(c.subTitle,c.url) : this.getTitle(c.title)}
</div>
</div>)
});
return arr;
}
getIcon = (icon) => {
return (<div className='hrm-card-icon'>
<i className={icon} />
</div>)
}
getTitle = (title) => {
return (<div className='hrm-card-title'>{title}</div>)
}
getLinkName = (linkName, index) => {
return (<div style={{width:'100%',height:95}}>
<div style={{textAlign:'center',paddingTop:45}}>
<a onClick={()=>this.handleClick(index)} style={{color:'#fff',textDecoration: 'underline',fontSize:15}}>{linkName}</a>
</div>
</div>)
}
getSubTitle = (subTitle, url) => {
return (<div style={{height:35,textAlign:'right',paddingRight:10,backgroundColor:'#6A6A6A',color: '#fff',paddingTop:5}}><a href={addContentPath(url)} target='_blank' className='hrm-import-link'>{subTitle}</a></div>)
}
handleClick = (index) => {
const {
hrmImportResource,
hrmImportCommon,
} = this.props, {
setTempletName,
setImportDialogTitle,
setImportType,
setImportDialogVisible
} = hrmImportCommon;
switch (index) {
case 0: //@lvyi
hrmImportResource.visible = true;
hrmImportResource.title = i18n.button.importOrg();
hrmImportResource.importType = 'company';
hrmImportResource.getImportForm();
break;
case 1:
setTempletName(i18n.label.importTemplate());
setImportDialogTitle(i18n.button.postSystemImport());
setImportType('jobtitle');
setImportDialogVisible(true);
break;
case 2: //@lvyi
hrmImportResource.visible = true;
hrmImportResource.title = i18n.button.importResource();
hrmImportResource.importType = 'resource';
hrmImportResource.getImportForm();
break;
case 3:
setTempletName(i18n.label.importTemplate());
setImportDialogTitle(i18n.button.groupInfoImport());
setImportType('group');
setImportDialogVisible(true);
break;
case 4:
setTempletName(i18n.label.importTemplate());
setImportDialogTitle(i18n.button.personalAndWorkInfoImport());
setImportType('resourcedetial');
setImportDialogVisible(true);
break;
case 5:
setTempletName(i18n.label.importTemplate());
setImportDialogTitle(i18n.button.areaInfoImport());
setImportType('area');
setImportDialogVisible(true);
break;
case 6:
setTempletName(i18n.label.importTemplate());
setImportDialogTitle(i18n.button.workingPlaceImport());
setImportType('location');
setImportDialogVisible(true);
break;
case 7:
setTempletName(i18n.label.importTemplate());
setImportDialogTitle(i18n.button.majorImport());
setImportType('special');
setImportDialogVisible(true);
break;
}
}
render() {
const {
hrmBasicDataImport,
hrmImportResource,
hrmImportCommon,
} = this.props, {
title,
isMouseOver,
loading,
authorized,
} = hrmBasicDataImport;
if (!authorized) {
return (
<div style={{height: '100%'}}>
{loading ? <div className='hrm-loading-center'>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@976rc9`} spinning={loading} size='large'></Spin>
</div>
: <div className="hrm-wea-alert-page">
<WeaAlertPage ecId={`${this && this.props && this.props.ecId || ''}_WeaAlertPage@0t0ln7`}>
<div style={{ color: '#000' }}>
{i18n.message.authFailed()}
</div>
</WeaAlertPage>
</div>
}
</div>
)
} else {
return (
<WeaTop ecId={`${this && this.props && this.props.ecId || ''}_WeaTop@sp0zb8`}
title={title}
icon={<i className='icon-coms-hrm'/>}
iconBgcolor='#217346'
loading={true}
showDropIcon={true}
>
<div className='hrm-import-wrap'>{this.getImportCard()}</div>
{hrmImportResource.visible && <ImportResource ecId={`${this && this.props && this.props.ecId || ''}_ImportResource@633i8k`} />}
{/*其它导入暂时未实现 {hrmImportCommon.importDialog.visible && <Import ecId={`${this && this.props && this.props.ecId || ''}_Import@6c06u8`} />} */}
</WeaTop>
)
}
}
}

View File

@ -0,0 +1,363 @@
import {
inject,
observer
} from 'mobx-react';
import {
WeaUpload,
WeaDialog,
WeaFormItem,
WeaSearchGroup,
WeaNewScroll,
WeaSelect,
WeaInput
} from 'ecCom'
import {
Row,
Col,
Button,
Spin
} from 'antd'
import {
WeaSwitch
} from 'comsMobx'
import React from 'react'
import ImportResult from './ImportResult'
import ImportHistory from './ImportHistory'
import {
WeaLocaleProvider
} from 'ecCom';
import {
i18n
} from '../../public/i18n';
import {addContentPath} from '../../util/index.js'
import '../../style/common.less'
@inject('hrmImportResource')
@observer
export default class ImportResource extends React.Component {
constructor(props) {
super(props);
}
componentDidMount() {
const {
hrmImportResource
} = this.props;
hrmImportResource.list = [];
}
getCircle() {
let style = {
width: 20,
height: 20,
backgroundColor: '#D8D8D8',
webkitBorderRadius: 10,
mozBorderRadius: 10,
msBorderRadius: 10,
oBorderRadius: 10,
borderRadius: 10,
//paddingLeft: 6,
textAlign: 'center',
}
return style;
}
getForm() {
const {
hrmImportResource
} = this.props;
const {
condition
} = hrmImportResource;
let _arr = [];
condition.map((c, i) => {
let arr = [];
if (i == 0) { //基本信息
c.items.map((field, index) => {
arr.push({
com: (
<div>
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@m9t2kn@${index}`}>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@rc5who@${index}`} span={1} offset={4}>
<div style={{ marginTop: 15 }}>
<div style={this.getCircle()}><div style={{ paddingTop: 2 }}>{index + 1}</div></div>
</div>
</Col>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@f1sc6s@${index}`} span={14}>
<div style={{ marginTop: 15 }}>
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@5gsx6o@${index}`}>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@qrdxst@${index}`} span={field.labelcol} style={{overflow: 'hidden',whiteSpace: 'nowrap',textOverflow: 'ellipsis'}} title={field.label}>{field.label}:</Col>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@7jy5um@${index}`} span={field.fieldcol}>
{this.getDom(field)}
</Col>
</Row>
</div>
</Col>
</Row>
</div>
),
colSpan: 1,
})
})
}
if (i == 1) { //导入说明
c.items.map((field, index) => {
arr.push({
com: (
<div>
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@hz50xl@${index}`}>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@fgfbrv@${index}`} span={1} offset={4} style={{ marginTop: 15 }}>
<div style={this.getCircle()}>
<div style={{ paddingTop: 2 }}>{index + 1}</div>
</div>
</Col>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@5rom81@${index}`} span={17} style={{ marginTop: 15 }}>
{this.getIllustration(field.value, field.link, index, field)}
</Col>
</Row>
</div>
),
colSpan: 1
})
})
}
_arr.push(<div><WeaSearchGroup ecId={`${this && this.props && this.props.ecId || ''}_WeaSearchGroup@bo47pp@${i}`} needTigger={true} title={c.title} showGroup={c.defaultshow} items={arr} col={1} /></div>)
});
return _arr;
}
getDom(field) {
const {
hrmImportResource
} = this.props;
const {
templetName,
filelist,
getTemplateUrl,
importParams
} = hrmImportResource;
let dom;
let domkey = field.domkey;
if (domkey[0] == 'templet') {
dom = <a href={addContentPath(field.value)}>{i18n.label.importTemplate()}</a>;
} else if (domkey[0] === 'exportData') {
const href = hrmImportResource.operateType === 'add' ? field.otherParams.fileVal[0].add : field.otherParams.fileVal[0].update;
if(hrmImportResource.importType === 'matrix'){
dom = <a onClick={() => {
getTemplateUrl(hrmImportResource.otherParams.matrixid, hrmImportResource.operateType, importParams)
}}>{i18n.label.importTemplate()}</a>
}else
dom = <a href={addContentPath(href)}>{i18n.label.importTemplate()}</a>;
} else if (domkey[0] == 'excelfile' || domkey[0] == 'importfile') {
dom = (<div>
<div style={{ float: 'left', marginTop: -10 }}>
<WeaUpload ecId={`${this && this.props && this.props.ecId || ''}_WeaUpload@iu8n01`}
uploadUrl='/api/doc/upload/uploadFile'
category='string'
limitType='xls,xlsx'
maxFilesNumber={1}
datas={filelist}
{...field.otherParams}
onChange = {
(ids, list) => {
this.setFileId(ids, list)
}
} >
<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@87232v`}>{i18n.button.selectFile()}</Button>
</WeaUpload>
</div>
<div style={{ float: 'left', paddingLeft: 10 }}>
{filelist.length == 0 ? <p>{i18n.label.noFileSelected()}</p> : filelist.map(file => <p>{file.filename}</p>)}
</div>
</div>)
} else if (domkey[0].indexOf('keyField') > -1) {
const vals = field.options.filter(v => v.selected == true);
let val = '';
vals.length>0 && (val = vals[0].key);
dom = <WeaSelect ecId={`${this && this.props && this.props.ecId || ''}_WeaSelect@yzc92h`}
style={{width: 200}}
options={field.options}
value={hrmImportResource.importParams[domkey[0]] || field.value || val}
onChange={(v) => {
hrmImportResource.setParam(domkey[0], v)
}}
/>
} else if (domkey[0] == 'importType') {
dom = <WeaSelect ecId={`${this && this.props && this.props.ecId || ''}_WeaSelect@holhhb`}
style={{width: 200}}
options={field.options}
value={hrmImportResource.operateType}
onChange={(v) => {
hrmImportResource.operateType = v
}}
/>
} else {
dom = <WeaInput ecId={`${this && this.props && this.props.ecId || ''}_WeaInput@rg6f3p`} hasBorder={true} viewAttr={1} value={field.value}/>
}
return dom;
}
getIllustration(val, url, index, link) {
const {
hrmImportResource
} = this.props;
const {
templetName,
getTemplateUrl,
importParams
} = hrmImportResource;
let p;
if (index == 0) {
if (url instanceof Object) {
const href = hrmImportResource.operateType === 'add' ? url.add : url.update;
let dom;
if(hrmImportResource.importType === 'matrix'){
dom = <a onClick={() => {
getTemplateUrl(hrmImportResource.otherParams.matrixid, hrmImportResource.operateType, importParams)
}}>{i18n.label.importTemplate()}</a>
}else
dom = <a href={addContentPath(href)}>{i18n.label.importTemplate()}</a>;
p = (<p>{i18n.label.downLoadTemplete()}{dom}</p>);
} else if (url != null) {
if(hrmImportResource.importType === 'matrix'){
p = (<p>{i18n.label.downLoadTemplete()}<a onClick={() => {
getTemplateUrl(hrmImportResource.otherParams.matrixid, hrmImportResource.operateType)
}}>{i18n.label.importTemplate()}</a></p>);
}else
p = (<p>{i18n.label.downLoadTemplete()}<a href={addContentPath(url)}>{i18n.label.importTemplate()}</a></p>);
} else {
p = (<p><div dangerouslySetInnerHTML={{ __html: val }} /></p>);
}
} else {
p = (<p><div dangerouslySetInnerHTML={{ __html: val }} /></p>);
}
return p;
}
setFileId(ids, list) {
const {
hrmImportResource
} = this.props;
hrmImportResource.excelfile = ids;
hrmImportResource.filelist = list;
}
onUploading(s) {
const {
hrmImportResource
} = this.props;
hrmImportResource.status = s;
}
submit() {
const {
hrmImportResource
} = this.props;
hrmImportResource.saveImport({}, () => {
this.refs.scroll && this.refs.scroll.scrollToLast()
});
}
cancel() {
const {
hrmImportResource,
onClose
} = this.props;
hrmImportResource.visible = false
hrmImportResource.init();
onClose && onClose();
}
importHistoryQuery() {
const {
hrmImportResource
} = this.props;
hrmImportResource.visibleHistory = true;
hrmImportResource.getImportHistory();
}
render() {
const {
hrmImportResource,
mainTitle,
importLog,
viewLog,
viewLogTitle,
} = this.props;
const {
title,
visible,
titleResult,
visibleResult,
importResultColumns,
importProcessLogDatas,
failnum,
succnum,
importResultTip,
importResultStore,
importStatus,
errorInfo,
setScrollRef,
single,
showLoadingSpin,
condition
} = hrmImportResource;
const buttons = condition.length ? [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@ip7b32`} type="primary" onClick={() => this.submit()}>{i18n.button.submit()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@itogxo`} type="primary" onClick={() => this.importHistoryQuery()}>{importLog || i18n.button.importHistoryQuery()}</Button>),
] : [];
let dialogHeight = window.innerHeight - 150;
if (dialogHeight > 560) dialogHeight = 560;
return (
<div>
{
single && visible ?
<WeaNewScroll ecId={`${this && this.props && this.props.ecId || ''}_WeaNewScroll@mkyv9k`} height={'100%'} ref="scrollBar">
{this.getForm()}
</WeaNewScroll>
:
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@s55z5q`}
title={mainTitle || title}
icon="icon-coms-hrm"
iconBgcolor="#217346"
visible={visible}
closable={true}
onCancel={() => this.cancel()}
buttons={buttons}
style={{ width: 870, height: dialogHeight }}
moreBtn={{datas:condition ? [{
key: '1',
content: i18n.button.submit(),
icon: <i className='icon-coms-Preservation'/>,
onClick: () => this.submit(),
},
{
key: '2',
content: importLog || i18n.button.importHistoryQuery(),
icon: <i className='icon-coms-Preservation'/>,
onClick: () => this.importHistoryQuery(),
}
]: []}}
>
{ condition.length ? (
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@1fvd3j`} spinning={showLoadingSpin}>
<WeaNewScroll ecId={`${this && this.props && this.props.ecId || ''}_WeaNewScroll@2908z2`} height={dialogHeight} ref="scrollBar">
{this.getForm()}
</WeaNewScroll>
</Spin>
): ''}
</WeaDialog>
}
<ImportResult ecId={`${this && this.props && this.props.ecId || ''}_ImportResult@66ry2w`} {...this.props} />
<ImportHistory ecId={`${this && this.props && this.props.ecId || ''}_ImportHistory@72i8fh`} {...this.props} />
</div>
)
}
}

View File

@ -0,0 +1,137 @@
import {
inject,
observer
} from 'mobx-react';
import {
WeaDialog,
} from 'ecCom'
import {
Modal,
Table,
Button,
} from 'antd'
import React from 'react'
import {
WeaTableNew
} from 'comsMobx';
import ImportLog from './ImportLog'
import {
i18n
} from '../../public/i18n';
const WeaTable = WeaTableNew.WeaTable;
@inject('hrmImportResource')
@observer
class ImportHistory extends React.Component {
constructor(props) {
super(props);
}
reRenderColumns(c) {
let _this = this;
c.forEach(item => {
if (item.dataIndex == 'operator') {
item.render = function(text, record) {
return <span><a onClick={() => _this.jumpToHrmCard(record.operator)}>{record.operatorspan}</a></span>
}
}
if (item.dataIndex == 'allnum') {
item.render = function(text, record) {
return <span><a onClick={() => _this.jumpToImportResult(record.randomFieldId)}>{record.allnumspan}</a></span>
}
}
});
}
jumpToHrmCard(id) {
window.open(`/spa/hrm/index_mobx.html#/main/hrm/card/cardInfo/${id}`);
}
jumpToImportResult(pId) {
const {
hrmImportResource
} = this.props;
hrmImportResource.dialogKey = new Date().getTime();
hrmImportResource.visibleResult = true;
hrmImportResource.getImportResult({
pId,
importType: 'resource'
});
}
queryImportLog() {
const {
hrmImportResource
} = this.props;
let params = {};
params.importType = 'resource';
hrmImportResource.pId = '';
hrmImportResource.getImportLogDetail(params);
hrmImportResource.getImportLogSearchCondition(params);
hrmImportResource.visibleImportLog = true;
}
cancel() {
const {
hrmImportResource
} = this.props;
hrmImportResource.visibleHistory = false;
}
render() {
const {
hrmImportResource,
importLog,
viewLog,
} = this.props;
const {
titleHistory,
visibleHistory,
onCancel,
importHistoryStore
} = hrmImportResource;
const buttons = [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@oowgk9`} type="primary" disabled={importHistoryStore.loading} onClick={() => this.queryImportLog()}>{viewLog || i18n.button.queryImportLog()}</Button>),
];
let dialogHeight = window.innerHeight - 150;
if (dialogHeight > 510) dialogHeight = 510;
return (
<div>
<ImportLog ecId={`${this && this.props && this.props.ecId || ''}_ImportLog@s3uk7x`} {...this.props} />
{visibleHistory &&
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@no8hhj`}
title={importLog || titleHistory()}
icon="icon-coms-hrm"
iconBgcolor="#217346"
visible={visibleHistory}
closable={true}
onCancel={() => this.cancel()}
buttons={buttons}
style={{ width: 870, height: dialogHeight }}
moreBtn={{datas:[{
key: '1',
content: viewLog || i18n.button.queryImportLog(),
icon: <i className='icon-coms-Preservation'/>,
onClick: () => this.queryImportLog(),
}
]}}
>
<WeaTable ecId={`${this && this.props && this.props.ecId || ''}_WeaTable@6eke2r`}
comsWeaTableStore={importHistoryStore}
hasOrder={true}
needScroll={true}
scroll={{ y: dialogHeight - 80 }}
rowKey={(record, index) => index}
getColumns={c => this.reRenderColumns(c)}
/>
</WeaDialog>
}
</div>
)
}
}
export default ImportHistory

View File

@ -0,0 +1,183 @@
import {
inject,
observer
} from 'mobx-react';
import {
WeaTab,
WeaDialog,
WeaFormItem,
WeaSearchGroup,
} from 'ecCom'
import {
Row,
Col,
Button,
} from 'antd'
import * as mobx from 'mobx';
const toJS = mobx.toJS;
import {
WeaSwitch
} from 'comsMobx'
import {
WeaTableNew
} from 'comsMobx';
import React from 'react'
const WeaTable = WeaTableNew.WeaTable;
import {
i18n
} from '../../public/i18n';
@inject('hrmImportResource')
@observer
class ImportLog extends React.Component {
constructor(props) {
super(props);
}
componentWillReceiveProps(nextProps) {
}
getSearchs() {
const {
hrmImportResource
} = this.props;
const {
form,
searchCondition
} = hrmImportResource;
const {
isFormInit
} = form;
let group = [];
const formParams = form.getFormParams();
isFormInit && toJS(searchCondition).map((c, i) => {
let items = [];
c.items.map((fields, index) => {
let hide = false;
let dom = <WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@irw1ly@${index}`} fieldConfig={fields} form={form} formParams={formParams}/>;
items.push({
com: (<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@3cqs16@${index}`}
label={`${fields.label}`}
labelCol={{span: `${fields.labelcol}`}}
wrapperCol={{span: `${fields.fieldcol}`}}>
{dom}
</WeaFormItem>),
colSpan: 1,
hide: hide
})
});
group.push(<WeaSearchGroup ecId={`${this && this.props && this.props.ecId || ''}_WeaSearchGroup@8sj3te@${i}`} needTigger={true} title={c.title} showGroup={c.defaultshow} items={items}/>)
});
return group;
}
jumpToHrmCard(id) {
window.open(`/spa/hrm/index_mobx.html#/main/hrm/card/cardInfo/${id}`);
}
reRenderColumns(c) {
let _this = this;
let status = "";
c.forEach(item => {
if (item.dataIndex == 'operator') {
item.render = function(text, record) {
return <span><a onClick={ () => _this.jumpToHrmCard(record.operator)}>{record.operatorspan}</a></span>
}
} else if (item.dataIndex == 'status') {
item.render = function(text, record) {
status = text;
return <span style={{ color: text=='1'?"":"#FF0000"}}>{text=='1'?i18n.label.success():i18n.label.fail()}</span>
}
} else if (item.dataIndex == 'operatedetail') {
item.render = function(text, record) {
return <span style={{ color: "#FF0000" }}>{status=="1"?"":text}</span>
}
}
});
}
cancel() {
const {
hrmImportResource
} = this.props;
hrmImportResource.visibleImportLog = false;
}
render() {
const {
hrmImportResource,
viewLogTitle
} = this.props;
const {
form,
titleImportLog,
visibleImportLog,
importLogStore,
showSearchAd
} = hrmImportResource;
const btn = [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@a9qnqh`} type="primary" onClick={()=>{
hrmImportResource.doSearch();hrmImportResource.showSearchAd=false
}}>{i18n.button.search()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@bi5gen`} type="ghost" onClick={()=>{
form.reset();
}}>{i18n.button.reset()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@co57et`} type="ghost" onClick={()=>hrmImportResource.showSearchAd=false}>{i18n.button.cancel()}</Button>)
]
return (
<div>
{
visibleImportLog &&
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@h4j5ho`}
title={viewLogTitle || titleImportLog()}
icon="icon-coms-hrm"
iconBgcolor="#217346"
visible={visibleImportLog}
closable={true}
onCancel={() => {
this.cancel()
} }
//buttons={buttons}
style={{width: 970, height: 510}}
>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@98vruz`}
searchType={['advanced']}
showSearchAd={showSearchAd}
searchsAd={<div
onKeyDown={(e) =>{
if (e.keyCode == 13 && e.target.tagName === "INPUT") {
hrmImportResource.doSearch();
hrmImportResource.showSearchAd=false
}
}
}
>{this.getSearchs()}</div>}
setShowSearchAd={bool => {
hrmImportResource.showSearchAd = bool
}}
hideSearchAd={() => hrmImportResource.showSearchAd = false}
advanceHeight={200}
hasMask={false}
buttonsAd={btn}
/>
<WeaTable ecId={`${this && this.props && this.props.ecId || ''}_WeaTable@8ajuei`}
comsWeaTableStore={importLogStore}
hasOrder={true}
needScroll={true}
scroll={{ y: 380 }}
rowKey={(record,index) => index}
getColumns={c => this.reRenderColumns(c)}
/>
</WeaDialog>
}
</div>
)
}
}
export default ImportLog

View File

@ -0,0 +1,187 @@
import {
inject,
observer
} from 'mobx-react';
import {
WeaDialog,
WeaNewScroll,
} from 'ecCom'
import {
Row,
Col,
Icon,
Spin,
Modal,
Table,
Button,
} from 'antd'
import isEmpty from 'lodash/isEmpty';
import React from 'react'
import {
WeaTableNew
} from 'comsMobx';
import {
toJS
} from 'mobx';
const WeaTable = WeaTableNew.WeaTable;
import {
i18n
} from '../../public/i18n';
@inject('hrmImportResource')
@observer
class ImportResult extends React.Component {
constructor(props) {
super(props);
}
componentDidMount() {
const {
hrmImportResource
} = this.props;
hrmImportResource.errorInfo = '';
}
getButtons() {
const {
hrmImportResource
} = this.props;
const {
failnum,
importStatus
} = hrmImportResource;
const buttons = [];
if (importStatus == 'over') {
// if (failnum > 0) {
// buttons.push(<Button type="primary" onClick={() => this.submit()}>下载错误数据</Button>);
// }
// buttons.push(<Button type="primary" onClick={() => this.submit()}>下载全部数据</Button>);
buttons.push(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@w1j5fh`} type="primary" onClick={() => this.getImportLog()}>{i18n.button.getImportLog()}</Button>);
}
return buttons;
}
reRenderColumns(c) {
c.forEach(item => {
if (item.dataIndex == 'operatedetail') {
item.render = function(text, record) {
return <span style={{ color: '#FF0000' }}>{text}</span>
}
}
});
}
cancel() {
const {
hrmImportResource
} = this.props;
this.dialogKey = new Date().getTime();
hrmImportResource.visibleResult = false;
}
getImportLog() {
const {
hrmImportResource
} = this.props;
hrmImportResource.visibleImportLog = true;
let params = {};
params.importType = 'resource';
hrmImportResource.getImportLogSearchCondition(params);
hrmImportResource.getImportLogDetail(params);
}
render() {
const {
hrmImportResource
} = this.props;
const {
titleResult,
visibleResult,
importResultColumns,
importProcessLogDatas,
failnum,
succnum,
importResultTip,
importResultStore,
importStatus,
errorInfo,
setScrollRef,
dialogKey
} = hrmImportResource;
const buttons = [];
if (importStatus == 'over') {
buttons.push(
{
key: '1',
content: i18n.button.getImportLog(),
icon: <i className='icon-coms-Preservation'/>,
onClick: () => this.getImportLog(),
}
);
}
return (
<div>
{
visibleResult &&
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@a3ftyh`}
key={dialogKey}
title={titleResult()}
icon="icon-coms-hrm"
iconBgcolor="#217346"
visible={visibleResult}
closable={true}
onCancel={() => this.cancel()}
buttons={this.getButtons()}
style={{ width: 720, height: 480 }}
moreBtn={{datas:buttons}}
>
<div className="hrm-import-dialog">
{
importStatus == '' || importStatus == 'importing' || importStatus == 'error'?<div>
{
importStatus == 'error'?<div className="hrm-import-result-icon" style={{ paddingTop: 15 }}>
<div style={{ width: 30, height: 30, borderRadius: 25, padding: 8, display: 'inline-block', backgroundColor:'#FF0000' }}>
<Icon ecId={`${this && this.props && this.props.ecId || ''}_Icon@gxbhrn`} type={'cross'} style={{ color: '#fff' }} />
</div><span style={{ paddingLeft: 5}}>{importResultTip}</span>
</div>:
<div className="hrm-import-process"><Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@u5jll2`} tip={i18n.message.serverImportProcessing()}></Spin></div>
}
<div className="wea-new-table">
<WeaNewScroll ecId={`${this && this.props && this.props.ecId || ''}_WeaNewScroll@iflhfl`} height={340} ref={(scroll)=>{
hrmImportResource.setScrollTarget(scroll)
}}>
<Table ecId={`${this && this.props && this.props.ecId || ''}_Table@quyttr`} dataSource={toJS(importProcessLogDatas)} columns={toJS(importResultColumns)} pagination={false} />
</WeaNewScroll>
</div>
</div> : <div>
<div className="hrm-import-result-icon" style={{ paddingTop: failnum == 0 ? 150 : 15 }}>
<div style={{ width: 30, height: 30, borderRadius: 25, padding: 8, display: 'inline-block', backgroundColor: succnum > 0 ? '#54D3A2' : '#FF0000' }}>
<Icon ecId={`${this && this.props && this.props.ecId || ''}_Icon@2fblod`} type={succnum > 0 ? 'check' : 'cross'} style={{ color: '#fff' }} />
</div><span style={{ paddingLeft: 5 }}>{importResultTip}</span>
</div>
{
failnum > 0 &&
<WeaTable ecId={`${this && this.props && this.props.ecId || ''}_WeaTable@h7l6fo`}
comsWeaTableStore={importResultStore}
bordered
needScroll={true}
// pagination={true}
scroll={{ y: 330 }}
// rowKey={(record, index) => index}
getColumns={c => this.reRenderColumns(c)}
/>
}
</div>
}
</div>
</WeaDialog>
}
</div>
)
}
}
export default ImportResult

View File

@ -0,0 +1,721 @@
/**
* @Author: 程亮
* @Date: 2022-05-26 14:05:59
* @LastEditTime: 2023-08-14 11:39:45
* @Description:
* @FilePath: /trunk/src4js/pc4mobx/organization/components/job/Job.js
*/
import React from 'react'
import * as mobx from 'mobx'
import {
inject,
observer,
} from 'mobx-react'
import {
WeaTop,
WeaTab,
WeaFormItem,
WeaRightMenu,
WeaTable,
WeaLeftRightLayout,
WeaOrgTree, WeaDialog
} from 'ecCom'
import {
Row,
Col,
Spin,
Modal,
Button,
message,
Switch,
Menu, Dropdown, Icon
} from 'antd'
import {
WeaSwitch,
WeaTableNew
} from 'comsMobx'
import {
i18n
} from '../../public/i18n';
import '../../style/common.less';
import NewAndEditDialog from '../NewAndEditDialog';
import NewWeaTableDialog from '../NewWeaTableDialog';
import { renderNoright } from '../../util';
const toJS = mobx.toJS;
const confirm = Modal.confirm;
//const WeaTable = WeaTableNew.WeaTable
@inject('job')
@observer
export default class Job extends React.Component {
constructor(props) {
super(props);
}
componentWillMount() {
}
componentDidMount() {
this.init();
}
componentWillReceiveProps(nextProps) {
const {
job
} = this.props;
if (this.props.location.key !== nextProps.location.key) {
this.init();
}
}
init() {
const {
job
} = this.props;
job.initData();
}
getTopMenuBtns() {
const {
job
} = this.props;
const {
topMenu,
selectedRowKeys
} = job;
let btns = [];
topMenu.map((item, i) => {
if (item.menuFun === 'batchDelete') {
btns.push(<Button type='primary' onClick={() => this.handleClick(item)} disabled={selectedRowKeys.length > 0 ? false : true} >{item.menuName}</Button>);
} else if (item.menuFun === 'copy') {
btns.push(<Button type='primary' onClick={() => this.handleClick(item)} disabled={selectedRowKeys.length > 0 ? false : true} >{item.menuName}</Button>);
} else {
btns.push(<Button type='primary' onClick={() => this.handleClick(item)}>{item.menuName}</Button>);
}
});
return btns;
}
handleClick(item) {
const {
job
} = this.props;
const {
isPanelShow
} = job;
isPanelShow && job.setPanelStatus(false);
this[item.menuFun] && this[item.menuFun]();
}
new() {
const {
job
} = this.props;
job.setNeDialogTitle(i18n.label.newPost());
job.setNewVisible(true);
job.getJobForm();
}
refresh() {
const {
job
} = this.props;
job.refresh();
}
//联查人员
select(id) {
const {
job
} = this.props;
job.setNeDialogTitle("联查人员");
job.setVisible(true);
job.getHrmTable(id);
}
merge(id) {
const {
job
} = this.props;
confirm({
title: i18n.confirm.defaultTitle(),
content: this.getCopyForm({ isCopy: false }),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
job.merge(id)
},
onCancel() {
return false;
},
});
}
copy(id) {
const {
job
} = this.props;
const {
selectedRowKeys,
} = job;
let keys = id == undefined ? toJS(selectedRowKeys).toString() : id;
job.setIds(keys);
confirm({
title: i18n.confirm.defaultTitle(),
content: this.getCopyForm({ isCopy: true }),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
job.copy()
},
onCancel() {
return false;
},
});
}
getCopyForm(params) {
const {
job
} = this.props;
const {
copyCondition,
mergeCondition,
form2,
} = job;
params.isCopy ? form2.initFormFields(copyCondition) : form2.initFormFields(mergeCondition);
let formParams = form2.getFormParams();
let condition = params.isCopy ? copyCondition : mergeCondition;
const {
isFormInit
} = form2;
let arr = [];
isFormInit && condition.map(c => {
c.items.map((field, index) => {
arr.push(
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@u6ex85@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
{<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@p7d3td@${index}`} fieldConfig={field} form={form2} formParams={formParams} />}
</WeaFormItem>
)
})
})
return arr;
}
batchDelete() {
const {
job
} = this.props;
const {
selectedRowKeys
} = job;
let keys = toJS(selectedRowKeys).toString();
job.setIds(keys);
this.showConfirm('batchDel');
}
showConfirm(v) {
let _this = this;
confirm({
title: i18n.confirm.defaultTitle(),
content: (v == 'del') ? i18n.confirm.delete() : i18n.confirm.batchDeleteConfirm(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
_this.onOk();
},
onCancel() {
return false;
},
});
}
onOk() {
const {
job
} = this.props;
job.delete();
}
getDropMenuDatas() {
const {
job
} = this.props;
const {
rightMenu
} = job;
let menus = [];
toJS(rightMenu).map((item, index) => {
let obj = {
key: item.menuFun,
icon: <i className={`${item.menuIcon}`} />,
content: item.menuName,
}
if (item.menuFun == 'collection' || item.menuFun == 'help' || item.menuFun == 'pageAddress') {
obj.disabled = true;
}
menus.push(obj);
})
return menus;
}
handleMenuClick(key) {
const {
job
} = this.props;
const {
isPanelShow
} = job;
isPanelShow && job.setPanelStatus(false);
this[key] && this[key]();
}
updateForbiddenTag(checked, id) {
const {
job
} = this.props;
confirm({
title: i18n.confirm.defaultTitle(),
content: (checked == true) ? i18n.confirm.enableTag() : i18n.confirm.forbiddenTag(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
job.updateForbiddenTag(checked, id);
},
onCancel() {
return false;
},
});
}
onSearchChange(val) {
const {
job
} = this.props;
const {
form
} = job;
job.setJobName(val);
!this.isEmptyObject(form.getFormParams()) && job.updateFields(val);
}
reRenderColumns(columns) {
const {
job
} = this.props;
let _this = this;
columns.forEach((c, index) => {
if (c.dataIndex == 'forbiddenTag') {
c.render = function (text, record) {
return <Switch checked={record.forbiddenTag == "0" ? true : false} onChange={checked => _this.updateForbiddenTag(checked, record.id)} />
}
};
if (c.dataIndex == 'jobTitleName') {
c.render = function (text, record) {
return <a href='javascript:void(0);' onClick={() => {
window.open(`/spa/organization/static/index.html#/main/organization/jobExtend/${record.id}`, "_blank")
}}>{text}</a>
}
}
if (c.dataIndex == 'operate') {
c.className = "wea-table-operates"
c.width = 80
c.render = function (text, record) {
const menu = (
<Menu>
<Menu.Item key="0">
<a href='javascript:void(0);' onClick={() => {
_this.view(record.id)
}}>查看</a>
</Menu.Item>
<Menu.Item key="1">
<a href='javascript:void(0);' onClick={() => {
_this.doDel(record.id)
}}>删除</a>
</Menu.Item>
<Menu.Item key="2">
<a href='javascript:void(0);' onClick={() => {
_this.select(record.id)
}}>联查人员</a>
</Menu.Item>
{/* <Menu.Item key="3">
<a href='javascript:void(0);' onClick={() => { _this.merge(record.id) }}>合并</a>
</Menu.Item>
<Menu.Item key="4">
<a href='javascript:void(0);' onClick={() => { _this.copy(record.id) }}>复制</a>
</Menu.Item> */}
</Menu>
)
return <Dropdown overlay={menu}>
<i class="icon-coms-more" />
</Dropdown>
}
}
})
return columns;
}
doDel(id) {
const {
job
} = this.props;
job.setIds(id);
this.showConfirm('del');
}
view(id) {
window.open(`/spa/organization/static/index.html#/main/organization/jobExtend/${id}`, "_blank")
}
handleSave() {
const {
job
} = this.props;
job.setSaveAndSetting(false);
job.save();
}
handleSaveAndSetting() {
const {
job
} = this.props;
job.setSaveAndSetting(true);
job.save()
}
getTabBtn() {
const {
job
} = this.props;
const {
form
} = job;
const btn = [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@bx87i8`} type="primary" onClick={() => {
job.setCurrent(1); job.setPageSize(10); job.getTableInfo(); job.setPanelStatus(false)
}}>{i18n.button.search()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@218ju6`} onClick={() => form.reset()}>{i18n.button.reset()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@5u9mfz`} onClick={() => job.setPanelStatus(false)}>{i18n.button.cancel()}</Button>),
];
return btn;
}
getPanelComponents() {
const {
job
} = this.props;
const {
searchCondition,
form,
searchConditionLoading
} = job;
let arr = [];
let formParams = form.getFormParams();
const {
isFormInit
} = form;
isFormInit && searchCondition.map(c => {
c.items.map((field, index) => {
arr.push(<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@4cc308@${index}`} span={(index % 2 == 0) ? 10 : 11} offset={1}>
<div style={{ marginTop: 20 }}>
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@u6ex85@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
{<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@p7d3td@${index}`} fieldConfig={field} form={form} formParams={formParams} />}
</WeaFormItem>
</div>
</Col>)
})
})
if (searchConditionLoading) {
return (
<div className='hrm-loading-center-small' style={{ top: '25%' }}>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@lbktzb`} spinning={searchConditionLoading}></Spin>
</div>
)
} else {
return <Row ecId={`${this && this.props && this.props.ecId || ''}_Row@ppeb6z`} onKeyDown={(e) => {
if (e.keyCode == 13 && e.target.tagName === "INPUT") {
job.getTableInfo();
job.setPanelStatus(false)
}
}}>{arr}</Row>
}
}
//非空判断
isEmptyObject(obj) {
for (let key in obj) {
return false;
}
return true;
}
//左侧树
getTree = () => {
const {
job
} = this.props;
const {
companysId,
} = job
let tree = (
<WeaOrgTree ecId={`${this && this.props && this.props.ecId || ''}_WeaOrgTree@dhi1ro`}
ref='WeaOrgTree'
dataUrl={"/api/bs/hrmorganization/job/getSearchTree"}
// dataUrl={"/api/hrm/base/getHrmSearchTree"}
loading
needSearch
noCache={true}
needDropMenu={false}
//onSelect={this.selectVirtual} //组织维度回调函数
isLoadSubDepartment={true}
topPrefix={'hrmSearch'}
companysId={companysId}
inputLeftDom={`<b>${i18n.label.organization()}</b>`}
treeNodeClick={this.treeNodeClick}
expandAllChildrenOnSearch={true}
renderNode={item => this.renderNode(item)}
/>
)
return tree;
}
renderNode(item) {
return <div className='text-elli' title={item.name}>
<i className={item.icon} style={{ marginRight: '5px' }}></i>
{item.name}
{item.canceled && <span style={{ color: 'red' }}>({i18n.label.forbidden()})</span>}
</div>
}
treeNodeClick = (event, ids, nodeids, nodes) => {
const {
job
} = this.props;
const {
form,
companysId
} = job;
const type = event.node.props.type || '0';
const id = event.node.props.id || '';
let params = {};
form.resetConditionValue();
job.setPanelStatus(false)
// job.tabkey = 'default_3';
job.nodeType = type;
if (type == '0') {
params['virtualtype'] = companysId;
}
if (type == '1') {
params['subcompanyid1'] = id;
}
if (type == '2') {
params['departmentid'] = id;
}
job.doSearch(params);
}
log = () => {
window.setLogViewProp({
logMoudleType: 10,
keys: new Date().getTime(),
});
}
render() {
const {
job
} = this.props;
const {
isPanelShow, jobTitleName, conditionNum, visible, condition, form,
tableStore, dataSource, columns, loading, date, nEdialogTitle, dialogLoading,
form1, isEdit, newVisible, selectedRowKeys, total, current, pageSize, init,
defaultShowLeft, form2, hasRight, jobtitleVisible
} = job;
if (hasRight === false) {
return renderNoright();
}
const rowSelection = {
selectedRowKeys: selectedRowKeys,
onChange(selectedRowKeys, selectedRows) {
job.setSelectedRowKeys(selectedRowKeys);
},
getCheckboxProps: record => ({
disabled: record.isUsed === 1, // 配置无法勾选的列
}),
};
const pagination = {
current: current,
pageSize: pageSize,
total: total,
showSizeChanger: true,
showQuickJumper: true,
onShowSizeChange(current, pageSize) {
},
onChange(current) {
},
showTotal(total) {
return `${total}`
}
};
return (
hasRight && <div ref='page' style={{ height: '100%' }}>
<WeaRightMenu ecId={`${this && this.props && this.props.ecId || ''}_WeaRightMenu@k6oc4u`}
datas={this.getDropMenuDatas()}
onClick={key => this.handleMenuClick(key)}
>
<WeaTop ecId={`${this && this.props && this.props.ecId || ''}_WeaTop@bj98s7`}
title={i18n.label.jobName()}
icon={<i className='icon-coms-hrm' />}
iconBgcolor='#217346'
loading={true}
buttons={this.getTopMenuBtns()}
showDropIcon={true}
dropMenuDatas={this.getDropMenuDatas()}
onDropMenuClick={(e) => this.handleMenuClick(e)}
>
<WeaLeftRightLayout ecId={`${this && this.props && this.props.ecId || ''}_WeaLeftRightLayout@7muhhb`} isNew={true} showLeft={defaultShowLeft} leftCom={this.getTree()}>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@9c3zts`}
searchType={['base', 'advanced']}
showSearchAd={isPanelShow}
searchsBaseValue={this.isEmptyObject(form.getFormParams()) ? jobTitleName : form.getFormParams().jobTitleName}
setShowSearchAd={bool => job.setPanelStatus(bool)}
hideSearchAd={() => job.setPanelStatus(false)}
searchsAd={isPanelShow ? this.getPanelComponents() : <div></div>}
advanceHeight={Math.ceil(conditionNum / 2) * 52 + 20}
hasMask={false}
buttonsAd={this.getTabBtn()}
onSearch={() => {
job.setCurrent(1);
job.setPageSize(10);
job.getTableInfo()
}}
onSearchChange={val => this.onSearchChange(val)}
/>
{
init ? <div className='hrm-new-weatable-spin'>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@4ygl4a`} spinning={init}></Spin>
</div> :
<WeaTable rowKey={record => record.id} ecId={`${this && this.props && this.props.ecId || ''}_WeaTable@pgmg3x`}
loading={loading}
dataSource={dataSource} childrenColumnName="children"
columns={this.reRenderColumns(columns)}
rowSelection={rowSelection}
pagination={pagination}
onChange={(pagination, filters, sorter) => {
job.setSortParams(sorter);
job.setCurrent(pagination.current);
job.setPageSize(pagination.pageSize);
job.getTableInfo();
}}
indentSize={15}
/>
}
</WeaLeftRightLayout>
</WeaTop>
</WeaRightMenu>
<NewWeaTableDialog ecId={`${this && this.props && this.props.ecId || ''}_NewTableDialog@q4rrwm`}
title={nEdialogTitle}
visible={visible}
height={400}
tableStore={tableStore}
onCancel={() => job.setVisible(false)}
/>
<NewAndEditDialog ecId={`${this && this.props && this.props.ecId || ''}_NewAndEditDialog@q4rrwm`}
title={nEdialogTitle}
visible={newVisible}
condition={toJS(condition)}
form={form1}
isFormInit={form1.isFormInit}
loading={dialogLoading}
isEdit={isEdit}
height={400}
conditionLen={2}
save={() => this.handleSave()}
onCancel={() => job.setNewVisible(false)}
saveAndSetting={() => this.handleSaveAndSetting()}
moduleName={"job"}
/>
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@fw8u8f`}
onCancel={() => job.jobtitleVisible = false}
icon='icon-coms-hrm'
iconBgcolor='#217346'
title={"添加岗位"}
callback={
datas => {
const {
id,
jobtitlemark
} = datas;
form1.updateFields({
ec_jobTitle: {
value: id,
valueSpan: jobtitlemark,
valueObj: [{
id,
name: jobtitlemark
}]
}
});
job.jobtitleVisible = false;
}
}
url={'/spa/hrm/engine.html#/hrmengine/posts?type=0'}
visible={jobtitleVisible}
style={{ width: 600, height: 500 }}
/>
</div>
)
}
}

View File

@ -0,0 +1,295 @@
/**
* @Author: 程亮
* @Date: 2022-05-26 14:07:12
* @LastEditTime: 2022-07-12 16:25:58
* @Description:
* @FilePath: /trunk/src4js/pc4mobx/organization/components/job/JobExtend.js
*/
import { Button, Modal, message, Row, Col, Spin } from 'antd';
import isEmpty from 'lodash/isEmpty'
import cloneDeep from 'lodash/cloneDeep'
import forEach from 'lodash/forEach'
import { WeaAlertPage, WeaTools, WeaTableEdit, WeaSearchGroup, WeaRightMenu, WeaFormItem, WeaTab, WeaTop } from 'ecCom'
import { WeaSwitch } from 'comsMobx';
import { inject, observer } from 'mobx-react';
import * as mobx from 'mobx';
import { i18n } from '../../public/i18n';
const toJS = mobx.toJS;
import '../../style/common.less';
import AttachToNumberField from "../NewNumberField";
@inject('jobExtend')
@inject('job')
@observer
export default class JobExtend extends React.Component {
componentDidMount() {
this.init();
}
init = () => {
const { jobExtend, job } = this.props;
let { hash } = window.location;
hash = hash.split("?")[0];
let id = hash.match("[^/]+(?=/$|$)")[0];
jobExtend.init();
jobExtend.setId(id);
jobExtend.getData();
}
getTabChildren = () => {
const { jobExtend } = this.props;
let { tableInfo, isEditor, tabkey, onRowSelect, selectedRowKeys, detailSelectedKey } = jobExtend;
let tabChildren = [];
tableInfo = toJS(tableInfo);
tableInfo && tableInfo.map((t, i) => {
if (detailSelectedKey == i) {
tabChildren.push(
<WeaTableEdit ecId={`${this && this.props && this.props.ecId || ''}_WeaTableEdit@b813my@${i}`}
ref={(ref) => jobExtend.setPersonalEditTables(ref)}
showTitle={isEditor}
// title={'列表信息'}
//addFirstRow={isEditor}
columns={t.tabinfo.columns}
datas={t.tabinfo.datas}
onChange={this.tableEditChange}
selectedRowKeys={toJS(selectedRowKeys)}
onRowSelect={keys => onRowSelect(keys)}
onBtnsSelect={key => this.onBtnsSelect(key, i)}
viewAttr={isEditor ? 2 : 1}
getRowSelection={isEditor ? (rowSelection) => {
Object.assign(rowSelection, {
getCheckboxProps: record => ({
disabled: record.viewAttr === 1, // 配置无法勾选的列
})
})
return rowSelection;
} : () => null}
/>
);
}
})
return tabChildren;
}
onBtnsSelect = (key, index) => {
const {
jobExtend
} = this.props, {
tableInfo,
selectedRows,
setSelectedRowKeys,
selectedRowKeys
} = jobExtend;
const datas = tableInfo[index].tabinfo.datas;
if (key === 'copy') {
tableInfo[index].tabinfo.datas = datas.map((data, i) => {
if (!selectedRows[index].includes(i)) {
data.viewAttr = 2;
}
return data
})
}
if (key === 'delete') {
tableInfo[index].tabinfo.datas = datas.map((data, i) => {
if (selectedRows[index].includes(i)) {
data.viewAttr = 1;
}
return data
});
setSelectedRowKeys(selectedRowKeys.filter(row => !selectedRows[index].includes(row)))
}
}
getSearchs = () => {
const { jobExtend } = this.props;
let { form, condition, isEditor } = jobExtend;
const { isFormInit } = form;
let group = [];
let tipPosition = 'bottom';
window.e9HideFormFieldKeys = [];
isFormInit && condition.forEach((c, i) => {
let items = [];
c.items.forEach((field, j) => {
if (c.hide || (!isEmpty(field.otherParams) && field.otherParams.hide)) {
window.e9HideFormFieldKeys.push(field.domkey[0]);
} else {
items.push({
com: (<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@vh6j67@${j}`}
underline={!isEditor}
label={`${field.label}`}
error={form.getError(field)}
tipPosition={tipPosition}
className={j === 1 && "minH5"}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@d4vaqk@${j}`} fieldConfig={field} form={form} onChange={this.onChange} />
{field.domkey[0] == 'job_no' && field.viewAttr != '1' && <AttachToNumberField field={field} form={form} isEdit={true}/>}
</WeaFormItem>),
colSpan: 1
});
}
});
group.push(<WeaSearchGroup ecId={`${this && this.props && this.props.ecId || ''}_WeaSearchGroup@x9hby9@${i}`} className={`${isEditor ? 'hrm-center' : ''}`}
needTigger={true} hide={c.hide} title={c.title} showGroup={c.defaultshow} items={items} col={2} />)
});
return group;
}
onChange = (data) => {
const { jobExtend } = this.props;
if (data.sequence_id || data.grade_id) {
jobExtend.updateConditions(data);
}
}
tableEditChange = (data) => {
const { jobExtend } = this.props;
let { detailSelectedKey = '0', tableInfo } = jobExtend;
tableInfo = toJS(tableInfo);
let d = cloneDeep(tableInfo);
d[Number(detailSelectedKey)].tabinfo.datas = data;
jobExtend.updateTableInfo(d);
}
getRightMenu = () => {
const { jobExtend } = this.props;
const { isEditor, buttons } = jobExtend;
let arr = [];
try {
if (buttons.hasEdit) {
if (isEditor) {
arr = [{
icon: <i className='icon-coms-common' />,
content: i18n.button.save(),
key: 'save',
onClick: key => {
this.saveEditCard();
}
}, {
icon: <i className='icon-coms-go-back' />,
content: i18n.button.back(),
key: 'back',
onClick: key => {
this.backCard();
}
}]
} else {
arr = [{
icon: <i className='icon-coms-edit' />,
content: i18n.button.modify(),
key: 'editCard',
onClick: key => {
this.editCard();
}
}
]
}
}
} catch (e) { }
return arr;
}
getTopButtons = () => {
const { jobExtend } = this.props;
const { isEditor, buttons } = jobExtend;
const save = <Button ecId={`${this && this.props && this.props.ecId || ''}_Button@pkes6y`} type="primary" onClick={this.saveEditCard} >{i18n.button.save()}</Button>;
const back = <Button ecId={`${this && this.props && this.props.ecId || ''}_Button@pl1fw8`} type="primary" onClick={this.backCard} >{i18n.button.back()}</Button>;
const edit = <Button ecId={`${this && this.props && this.props.ecId || ''}_Button@vkeda5`} type="primary" onClick={this.editCard} >{i18n.button.modify()}</Button>;
const btns = [];
try {
if (isEditor) {
if (buttons.hasSave) {
btns.push(save);
btns.push(back);
}
} else {
if (buttons.hasEdit) {
btns.push(edit);
}
}
} catch (e) { }
return btns;
}
editCard = () => {
const { jobExtend } = this.props;
jobExtend.edit();
}
saveEditCard = () => {
const { jobExtend } = this.props;
jobExtend.save();
}
backCard = () => {
this.init();
}
changeData(key) {
const {
jobExtend
} = this.props;
jobExtend.changeData(key);
}
render() {
const { jobExtend } = this.props;
const { loading, tabkey, tabInfo, topTab, selectedKey, date, detailSelectedKey, isEditor } = jobExtend;
try {
return (
<div className='hrm-my-cardInfo' style={{ height: '100%', position: 'relative' }}>
<WeaRightMenu ecId={`${this && this.props && this.props.ecId || ''}_WeaRightMenu@k6oc4u`}
datas={this.getRightMenu()}
>
<WeaTop ecId={`${this && this.props && this.props.ecId || ''}_WeaTop@bj98s7`}
loading={true}
title={isEditor ? i18n.label.editJobInfo() : i18n.label.jobsInfo()}
icon={<i className='icon-coms-hrm' />}
iconBgcolor='#217346'
buttons={this.getTopButtons()}
showDropIcon={true}
dropMenuDatas={this.getRightMenu()}
>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@9c3zts`}
datas={topTab}
keyParam="viewCondition" //主键
selectedKey={selectedKey}
onChange={this.changeData.bind(this)}
/>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@4fj4z2`} spinning={loading}>
{this.getSearchs()}
{
!isEmpty(tabInfo) && <div className='hrm-my-cardInfo_detial_tabs'>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@vjrq63`}
type='card'
keyParam='key'
datas={toJS(tabInfo)}
selectedKey={detailSelectedKey}
onChange={v => {
jobExtend.updateDetailSelectedKey(v);
}}
/>
{this.getTabChildren()}
</div>
}
</Spin>
</WeaTop>
</WeaRightMenu>
</div>
)
} catch (e) {
return <WeaAlertPage ecId={`${this && this.props && this.props.ecId || ''}_WeaAlertPage@h1wgnu`}>
<div style={{ color: '#000' }}>{i18n.message.authFailed()}</div>
</WeaAlertPage>
}
}
}

View File

@ -0,0 +1,223 @@
import React from 'react'
import * as mobx from 'mobx'
import {
inject,
observer
} from 'mobx-react'
import {
WeaTop,
WeaTab,
WeaFormItem,
WeaDialog,
WeaSearchGroup,
WeaProgress
} from 'ecCom'
import {
Row,
Col,
Spin,
Modal,
Button,
message,
Switch
} from 'antd'
import {
WeaSwitch,
WeaTableNew
} from 'comsMobx'
import {
i18n
} from '../../public/i18n';
import '../../style/common.less';
const toJS = mobx.toJS;
const confirm = Modal.confirm;
const WeaTable = WeaTableNew.WeaTable;
export default class LogView extends React.Component {
constructor(props) {
super(props);
this.state = ({
height: 502,
width: 1075,
dialogTitle: '日志查看',
showSearchAd: false,
//**** */
detailDialogTitle: "",
detailVisible: false,
record:{}
})
}
componentWillMount() {
}
componentDidMount() {
}
componentWillReceiveProps(nextProps) {
this.setState({ showSearchAd: false })
if (this.props.keys !== nextProps.keys) {
nextProps.logViewStore.init(nextProps.logMoudleType);
}
}
doView(record) {
this.setState({
record:record,
detailVisible: true,
detailDialogTitle: record.operate_typespan + " - " + record.operate_module_name + " : "+record.value
})
}
reRenderColumns(columns) {
let _this = this;
columns.forEach((c, index) => {
if (c.dataIndex == 'message') {
c.render = function (text, record) {
return <a href='javascript:void(0);' className="common" onClick={() => {
_this.doView(record)
}}>查看</a>
}
};
})
}
getPanelComponents() {
const {
logViewStore
} = this.props;
const {
searchCondition,
form,
searchConditionLoading
} = logViewStore;
let arr = [];
let formParams = form.getFormParams();
const {
isFormInit
} = form;
isFormInit && searchCondition.map(c => {
c.items.map((field, index) => {
arr.push(<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@4cc308@${index}`} span={(index % 2 == 0) ? 10 : 11} offset={1}>
<div style={{ marginTop: 20 }}>
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@u6ex85@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
{<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@p7d3td@${index}`} fieldConfig={field} form={form} formParams={formParams} />}
</WeaFormItem>
</div>
</Col>)
})
})
if (searchConditionLoading) {
return (
<div className='hrm-loading-center-small' style={{ top: '25%' }}>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@lbktzb`} spinning={searchConditionLoading}></Spin>
</div>
)
} else {
return <Row ecId={`${this && this.props && this.props.ecId || ''}_Row@ppeb6z`} onKeyDown={(e) => {
if (e.keyCode == 13 && e.target.tagName === "INPUT") {
logViewStore.getTableInfo();
this.setState({ showSearchAd: false })
}
}}>{arr}</Row>
}
}
getTabBtn() {
const {
logViewStore
} = this.props;
const {
form
} = logViewStore;
const btn = [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@bx87i8`} type="primary" onClick={() => {
logViewStore.getTableInfo(); this.setState({ showSearchAd: false })
}}>{i18n.button.search()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@218ju6`} onClick={() => form.reset()}>{i18n.button.reset()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@5u9mfz`} onClick={() => this.setState({ showSearchAd: false })}>{i18n.button.cancel()}</Button>),
];
return btn;
}
render() {
const {
visible, onCancel, logViewStore
} = this.props, {
tableStore, conditionNum
} = logViewStore, {
height, dialogTitle, width, showSearchAd, detailDialogTitle, detailVisible,record
} = this.state;
return (
<div>
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@1txk5f`}
title={dialogTitle}
icon="icon-coms-currency"
iconBgcolor="#217346"
visible={visible}
closable={true}
hasScroll={false}
onCancel={() => onCancel()}
style={{ height: height, width: width}}
initLoadCss
className="logWrapper"
>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@9c3zts`}
searchType={['advanced']}
showSearchAd={showSearchAd}
setShowSearchAd={bool => {
this.setState({ showSearchAd: bool })
}}
advanceHeight={161}
searchsAd={showSearchAd ? this.getPanelComponents() : <div></div>}
buttonsAd={this.getTabBtn()}
/>
<div style={{"padding":"0 10px 10px 10px"}}>
<WeaTable ecId={`${this && this.props && this.props.ecId || ''}_WeaTable@pgmg3x`}
comsWeaTableStore={tableStore}
hasOrder={true}
needScroll={true}
getColumns={c => this.reRenderColumns(c)}
/>
</div>
</WeaDialog>
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@1txk5f`}
title={detailDialogTitle}
icon="icon-coms-currency"
iconBgcolor="#217346"
visible={detailVisible}
closable={true}
hasScroll={true}
onCancel={() => this.setState({
detailVisible: false
})}
style={{ height: 676, width: 1000 }}
>
<div className='content' style={{ "padding": "20px","height": "100%" }}>
<div style={{ "height": "40%","overflow-x": "auto"}} dangerouslySetInnerHTML={{ __html: record.message }} ></div>
{/* <WeaProgress percent={100} strokeColor="#217346" /> */}
<div style={{"marginTop":"20px","fontSize":"20px","color":"#217346"}}>原始参数查看</div>
<div dangerouslySetInnerHTML={{ __html: record.params_str }} style={{"overflow-x": "auto","height":"50%","marginTop":"20px"}}></div>
</div>
</WeaDialog>
</div>
)
}
}

View File

@ -0,0 +1,57 @@
;(function(window){
//符合commonjs规范引入依赖
if(typeof module !== 'undefined'){
window.saveAs = require('file-saver')
window.baidu = require('baidu-template-pro')
}
function getModelHtml(mhtml,style=''){
return`
Content-Type: text/html; charset="utf-8"
<!DOCTYPE html>
<html>
<head>
<style>
${style}
</style>
</head>
<body>
${mhtml}
</body>
</html>
`
}
//主函数
let exportWord = ({mhtml,style,filename,data,selector})=>{
if(selector){
let nodes = window.document.querySelectorAll(selector)
mhtml = nodes.length>0?Array.from(nodes).reduce((a,b)=>a+b.innerHTML,''):''
}
//没有baiduTemplatePro.js依赖时必须传入selector
if (!selector && typeof baidu === 'undefined') {
console.error("wordExport : missing (selector) for params without depandency (baiduTemplatePro.js)");
return;
}
if (typeof saveAs === "undefined") {
console.error("wordExport : missing dependency (FileSaver.js)");
return;
}
//没有模板引擎时将获取节点的html字符串生成模板
let html = typeof baidu !== 'undefined'?baidu.template(getModelHtml(mhtml,style),data):getModelHtml(mhtml)
let blob = new Blob([html],{type:'application/msword;charset=utf-8'})
saveAs(blob,filename+'.doc')
}
//添加exportWord到全局对象
window.exportWord = window.exportWord||exportWord
//如果符合commonjs规范exports出去
if(typeof module==='object'&&typeof module.exports==='object'){
module.exports = {exportWord}
}
})(window)

View File

@ -0,0 +1,154 @@
import React from 'react'
import {
toJS
} from 'mobx'
import {
inject,
observer,
} from 'mobx-react'
import {
WeaTop,
WeaAlertPage,
WeaBrowser
} from 'ecCom'
import {
Spin,
} from 'antd';
import {
i18n
} from '../../public/i18n';
import '../../style/import.css';
import { addContentPath } from '../../util/index.js';
import StepDialog from './stepDialog';
import { renderNoright } from '../../util';
@inject("newImport")
@observer
export default class newImport extends React.Component {
constructor(props) {
super(props);
this.state = ({
title: '数据导入',
})
}
componentDidMount() {
const {newImport} = this.props;
newImport.getHasRight();
}
componentWillMount() {
}
getImportCard = () => {
const {
newImport
} = this.props, {
isMouseOver,
curIndex,
cardConfig,
setMouseStatus,
} = newImport;
let arr = [];
cardConfig.map((c, index) => {
arr.push(<div className='hrm-card-out' style={(index == 0 || index == 4) ? { marginLeft: 0 } : {}} onMouseEnter={() => setMouseStatus(index, true)} onMouseLeave={() => setMouseStatus(index, false)}>
<div className='hrm-card-inwrap' style={curIndex == index && isMouseOver ? { backgroundColor: '#858585' } : { backgroundColor: c.bgColor }}>
{curIndex == index && isMouseOver ? this.getLinkName(c.linkName, index) : this.getIcon(c.icon)}
{curIndex == index && isMouseOver ? this.getSubTitle(c.subTitle, c.url) : this.getTitle(c.title)}
</div>
</div>)
});
return arr;
}
getIcon = (icon) => {
return (<div className='hrm-card-icon'>
<i className={icon} />
</div>)
}
getTitle = (title) => {
return (<div className='hrm-card-title'>{title}</div>)
}
getLinkName = (linkName, index) => {
return (<div style={{ width: '100%', height: 95 }}>
<div style={{ textAlign: 'center', paddingTop: 45 }}>
<a onClick={() => this.handleClick(index)} style={{ color: '#fff', textDecoration: 'underline', fontSize: 15 }}>{linkName}</a>
</div>
</div>)
}
getSubTitle = (subTitle, url) => {
return (<div style={{ height: 35, textAlign: 'right', paddingRight: 10, backgroundColor: '#6A6A6A', color: '#fff', paddingTop: 5 }}><a href={addContentPath(url)} target='_blank' className='hrm-import-link'>{subTitle}</a></div>)
}
handleClick = (index) => {
const {
newImport
} = this.props, {
} = newImport;
switch (index) {
case 0:
newImport.importType = 'company';
break;
case 1:
newImport.importType = 'department';
break;
// case 2:
// newImport.importType = 'jobtitle';
// break;
case 2:
newImport.importType = 'resource';
break;
case 3:
newImport.importType = 'joblevel';
break;
}
newImport.buttonTitle = i18n.button.nextStep();
newImport.current = 0;
newImport.visible = true;
newImport.getImportField();
}
render() {
const {
newImport,
} = this.props, {
visible,
hasRight
} = newImport, {
title,
} = this.state;
if (hasRight === false) {
return renderNoright();
}
return (
hasRight && <WeaTop ecId={`${this && this.props && this.props.ecId || ''}_WeaTop@sp0zb8`}
title={title}
icon={<i className='icon-coms-hrm' />}
iconBgcolor='#217346'
loading={true}
showDropIcon={true}
>
<div className='hrm-import-wrap'>{this.getImportCard()}</div>
{visible && <StepDialog ecId={`${this && this.props && this.props.ecId || ''}_StepDialog@633i8k`} />}
</WeaTop>
)
}
}

View File

@ -0,0 +1,295 @@
import {
WeaSearchGroup,
WeaTransfer,
WeaNewScroll,
WeaSelect,
WeaUpload,
WeaDialog,
WeaInput
} from 'ecCom'
import {
Spin,
Button,
Pagination,
Steps,
Row,
Col,
Progress,
Icon
} from 'antd'
import {
inject,
observer,
} from 'mobx-react'
import {
WeaSwitch,
WeaTableNew
} from 'comsMobx'
import {
i18n
} from '../../public/i18n';
import { addContentPath } from '../../util/index.js'
import { toJS } from 'mobx';
const WeaTable = WeaTableNew.WeaTable;
@inject("newImport")
@observer
export default class StepDialog extends React.Component {
constructor(props) {
super(props);
this.state = {
data: [],
selectedKeys: []
}
}
getCircle() {
let style = {
width: 20,
height: 20,
backgroundColor: '#D8D8D8',
webkitBorderRadius: 10,
mozBorderRadius: 10,
msBorderRadius: 10,
oBorderRadius: 10,
borderRadius: 10,
//paddingLeft: 6,
textAlign: 'center',
}
return style;
}
getForm() {
const {
newImport
} = this.props;
const {
condition
} = newImport;
let _arr = [];
condition.map((c, i) => {
let arr = [];
if (i == 0) { //基本信息
c.items.map((field, index) => {
arr.push({
com: (
<div>
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@m9t2kn@${index}`}>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@rc5who@${index}`} span={1} offset={4}>
<div style={{ marginTop: 15 }}>
<div style={this.getCircle()}><div style={{ paddingTop: 2 }}>{index + 1}</div></div>
</div>
</Col>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@f1sc6s@${index}`} span={14}>
<div style={{ marginTop: 15 }}>
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@5gsx6o@${index}`}>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@qrdxst@${index}`} span={field.labelcol} style={{ overflow: 'hidden', whiteSpace: 'nowrap', textOverflow: 'ellipsis' }} title={field.label}>{field.label}:</Col>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@7jy5um@${index}`} span={field.fieldcol}>
{this.getDom(field)}
</Col>
</Row>
</div>
</Col>
</Row>
</div>
),
colSpan: 1,
})
})
}
if (i == 1) { //导入说明
c.items.map((field, index) => {
arr.push({
com: (
<div>
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@hz50xl@${index}`}>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@fgfbrv@${index}`} span={1} offset={4} style={{ marginTop: 15 }}>
<div style={this.getCircle()}>
<div style={{ paddingTop: 2 }}>{index + 1}</div>
</div>
</Col>
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@5rom81@${index}`} span={17} style={{ marginTop: 15 }}>
{this.getIllustration(field.value, field.link, index, field)}
</Col>
</Row>
</div>
),
colSpan: 1
})
})
}
_arr.push(<div><WeaSearchGroup ecId={`${this && this.props && this.props.ecId || ''}_WeaSearchGroup@bo47pp@${i}`} needTigger={true} title={c.title} showGroup={c.defaultshow} items={arr} col={1} /></div>)
});
return _arr;
}
getDom(field) {
const {
newImport
} = this.props;
const {
filelist
} = newImport;
let dom;
let domkey = field.domkey;
if (domkey[0] == 'templet') {
dom = <a href={addContentPath(field.value)}>{i18n.label.importTemplate()}</a>;
} else if (domkey[0].indexOf('keyField') > -1) {
const vals = field.options.filter(v => v.selected == true);
let val = '';
vals.length > 0 && (val = vals[0].key);
dom = <WeaSelect ecId={`${this && this.props && this.props.ecId || ''}_WeaSelect@yzc92h`}
style={{ width: 200 }}
options={field.options}
value={newImport.importParams[domkey[0]] || field.value || val}
onChange={(v) => {
newImport.setParam(domkey[0], v)
}}
/>
} else if (domkey[0] == 'importType') {
dom = <WeaSelect ecId={`${this && this.props && this.props.ecId || ''}_WeaSelect@holhhb`}
style={{ width: 200 }}
options={field.options}
value={newImport.operateType}
onChange={(v) => {
newImport.operateType = v
}}
/>
} else if (domkey[0] == 'excelfile' || domkey[0] == 'importfile') {
dom = (<div>
<div style={{ float: 'left', marginTop: -10 }}>
<WeaUpload ecId={`${this && this.props && this.props.ecId || ''}_WeaUpload@iu8n01`}
uploadUrl='/api/doc/upload/uploadFile'
category='string'
limitType='xls,xlsx'
maxFilesNumber={1}
viewAttr={3}
datas={filelist}
{...field.otherParams}
onChange={
(ids, list) => {
this.setFileId(ids, list)
}
} >
<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@87232v`}>{i18n.button.selectFile()}</Button>
</WeaUpload>
</div>
<div style={{ float: 'left', paddingLeft: 10 }}>
{filelist.length == 0 ? <p style={{marginLeft:10}}>{i18n.label.noFileSelected()}</p> : filelist.map(file => <p>{file.filename}</p>)}
</div>
</div>)
}else {
dom = <WeaInput ecId={`${this && this.props && this.props.ecId || ''}_WeaInput@rg6f3p`} hasBorder={true} viewAttr={1} value={field.value}/>
}
return dom;
}
setFileId(ids, list) {
const {
newImport
} = this.props;
newImport.excelfile = ids;
newImport.filelist = list;
}
getIllustration(val, url, index, link) {
const {
newImport
} = this.props;
const {
importParams
} = newImport;
let p;
if (index == 0) {
p = (<p>{i18n.label.downLoadTemplete()}: <a href={addContentPath(url)}>{i18n.label.importTemplate()}</a></p>);
} else {
p = (<p><div dangerouslySetInnerHTML={{ __html: val }} /></p>);
}
return p;
}
reRenderColumns(c) {
c.forEach(item => {
if (item.dataIndex == 'operatedetail') {
item.render = function (text, record) {
return <span style={{ color: '#FF0000' }}>{text}</span>
}
}
});
}
render = () => {
const {
newImport
} = this.props, {
data, selectedKeys, current, pvisable, percent, failnum, succnum, importResultTip, importResultStore, importStatus, loading, date
} = newImport;
return (
<div>
{
current == 0 &&
<div>
<p style={{"color":"red","fontSize":"15px"}}>注意:右侧列表默认加载的为必填字段</p>
<WeaTransfer
data={toJS(data)}
selectedKeys={toJS(selectedKeys)}
onChange={(keys, datas) => {
newImport.setSelectedKeys(keys);
newImport.setSelectData(datas);
}}
/>
</div>
}
{
current == 1 && <WeaNewScroll ecId={`${this && this.props && this.props.ecId || ''}_WeaNewScroll@2908z2`} ref="scrollBar">
{this.getForm()}
</WeaNewScroll>
}
{
current == 2 && <div>
{
importStatus == 'over' && <div className="hrm-import-result-icon" style={{ paddingTop: failnum == 0 ? 100 : 15 }}>
<div style={{ width: 30, height: 30, borderRadius: 25, padding: 8, display: 'inline-block', backgroundColor: succnum > 0 ? '#54D3A2' : '#FF0000' }}>
<Icon ecId={`${this && this.props && this.props.ecId || ''}_Icon@2fblod`} type={succnum > 0 ? 'check' : 'cross'} style={{ color: '#fff' }} />
</div><span style={{ paddingLeft: 5 }}>{importResultTip}</span>
</div>
}
{
failnum > 0 &&
<WeaTable ecId={`${this && this.props && this.props.ecId || ''}_WeaTable@h7l6fo`}
comsWeaTableStore={importResultStore}
bordered
needScroll={true}
scroll={{ y: 330 }}
getColumns={c => this.reRenderColumns(c)}
/>
}
<WeaDialog
title="导入进度"
onCancel={() => newImport.pvisable = false}
visible={pvisable}
style={{ width: 300, height: 50 }}
>
<div style={{ "padding": "15px" }}>
<Progress percent={percent} strokeWidth={7} />
</div>
</WeaDialog>
</div>
}
</div>
)
}
}

View File

@ -0,0 +1,99 @@
import {
WeaNewScroll,
WeaSearchGroup,
WeaMoreButton,
WeaDialog
} from 'ecCom'
import {
inject,
observer,
} from 'mobx-react'
import {
Spin,
Button,
Pagination,
Steps
} from 'antd'
import {
WeaSwitch,
WeaTableNew
} from 'comsMobx'
import {
i18n
} from '../../public/i18n';
const Step = Steps.Step;
import StepContent from './stepContent';
import "../../style/common.less";
@inject("newImport")
@observer
export default class StepDialog extends React.Component {
constructor(props) {
super(props);
this.state = {
width: 800,
height: 600,
title: '数据导入',
}
}
next() {
const {newImport} = this.props;
let {current,steps} = newImport;
current = current + 1;
if (current === steps.length) {
current = 0;
newImport.init();
}
newImport.current = current;
current === 1 && newImport.getImportForm();
current === steps.length - 1 && newImport.startImport();
}
render() {
const {
newImport
} = this.props, {
current,
visible,
steps
} = newImport,{
width,
height,
title
} = this.state;
const buttons = [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@jd6baw`} type="primary" onClick={() => this.next()}>{current === steps.length - 1 ? '关闭' : i18n.button.nextStep()}</Button>),
];
return (
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@1txk5f`}
className="new-edit-wrapper"
title={title}
icon="icon-coms-upload"
iconBgcolor="#217346"
visible={visible}
closable={true}
hasScroll={true}
onCancel={() => newImport.init()}
buttons={buttons}
style={{ width: width, height: height }}
initLoadCss
>
<div style={{ marginTop: 24 }}>
<Steps current={current}>
{steps.map((s, i) => <Step key={i} title={s.title} description={s.description} />)}
</Steps>
</div>
<div style={{ padding: 24 }}>
<StepContent ecId={`${this && this.props && this.props.ecId || ''}_StepContent@633i8k`}/>
</div>
</WeaDialog>
)
}
}

View File

@ -0,0 +1,455 @@
/*
* Author: 黎永顺
* Description:
* Date: 2022-05-17 16:02:56
* LastEditTime: 2022-06-14 14:16:16
*/
import React, { Component, Fragment } from "react";
import { Button, Modal } from "antd";
import {
WeaTableEdit,
WeaDialog,
WeaMoreButton,
WeaFormItem,
WeaSelect,
WeaInput,
WeaInputNumber,
} from "ecCom";
import Preview from "./preview";
import { i18n } from "../../../../public/i18n";
import _ from "lodash";
import "../index.less";
class NumberComposition extends Component {
constructor() {
super();
this.state = {
visible: false,
objectData: {
numField: "string",
numFieldName: "字符串",
},
dataSource: [],
};
}
componentDidMount() {
const enums = {
STRING: "字符串",
NUMBER: "流水号位数",
YEAR: "当前年份",
MONTH: "当前月份",
DAY: "当前日期",
SUBCOMPANY: "分部编号",
DEPARTMENT: "部门编号",
JOBTITLES: "岗位编号",
};
let num = 0;
const { dataSource: details, onChange } = this.props;
for (let i in details) {
if (details[i].ruletype === "STRING") {
details[i].showorder = num;
num++;
}
}
const tmpV = _.map(details, (it, index) => {
const { ruletype, rulevalue, showorder } = it;
return {
id: index,
value: rulevalue,
strLogo: Number(showorder) + 1,
numFieldName:
ruletype === "STRING"
? `${enums[ruletype]}${Number(showorder) + 1}`
: enums[ruletype],
numField: _.toLower(ruletype),
};
});
this.setState(
{
dataSource: !_.isEmpty(tmpV)
? tmpV
: [
{
id: 1,
value: "",
strLogo: 1,
numFieldName: "字符串1",
numField: "string",
},
{
id: 2,
value: 3,
numFieldName: "流水号位数",
numField: "number",
},
],
},
() => {
onChange && onChange(this.state.dataSource);
}
);
}
/**
* name:复选框禁用
* param undefined
* return {*}
*/
getRowSelection = (rowSelection) => {
const { dataSource } = this.state;
const hasMonthNum = dataSource.some((item) => item.numField === "month");
const hasDayNum = dataSource.some((item) => item.numField === "day");
const sel = { ...rowSelection };
sel.getCheckboxProps = (record) => {
return {
disabled:
record.numField === "number" ||
(hasMonthNum && record.numField === "year") ||
(hasDayNum && record.numField === "month"),
};
};
return sel;
};
/**
* name: 字段保存
* return {*}
*/
handleSave = () => {
let newDataSource = [];
const { objectData, dataSource } = this.state;
const { onChange } = this.props;
const { numField, numFieldName } = objectData;
const stringRow = _.filter(dataSource, (it) => it.numField === "string"); //字符串列表
const maxStrLen = !_.isEmpty(stringRow)
? _.sortBy(stringRow, function (o) {
return -o.strLogo;
})[0].strLogo
: 0; //字符串列表
const maxIdLen = _.sortBy(dataSource, function (o) {
return -o.id;
})[0].id; //字符串列表
const index = _.findIndex(dataSource, (item) => item.numField !== "string");
const lastStrindex = _.findLastIndex(
dataSource,
(item) => item.numField === "string"
);
if (numField === "subcompany" || numField === "department" || numField === "jobtitles") {
if (_.findIndex(dataSource, it => it.numField === numField) !== -1) {
Modal.warning({
title: "信息确认",
content: `已经添加过一个${numFieldName},请选择其他编号字段!`,
onOk() { },
okText: "确认",
});
return;
}
}
if (numField === "year" || numField === "month" || numField === "day") {
const hasYearOrMonthOrDay = _.some(
dataSource,
(it) => it.numField === numField
);
const hasYearNum = dataSource.some((item) => item.numField === "year");
const hasMonthNum = dataSource.some((item) => item.numField === "month");
if (!hasYearOrMonthOrDay) {
if (numField === "month" && !hasYearNum) {
Modal.warning({
title: "信息确认",
content: `添加【${numFieldName}】时,请先添加【当前年份】!`,
onOk() { },
okText: "确认",
});
return;
}
if (numField === "day" && (!hasYearNum || !hasMonthNum)) {
Modal.warning({
title: "信息确认",
content: `添加【${numFieldName}】时,请先添加【当前年份】和【当前月份】!`,
onOk() { },
okText: "确认",
});
return;
}
} else {
this.showConfirm();
return;
}
}
// 如果前n项为空或者当中包含非字符串项
if (index > lastStrindex) {
if (numField === "month") {
const tmpVLastYearindex = _.findLastIndex(
dataSource,
(item) => item.numField === "year"
);
dataSource.splice(tmpVLastYearindex + 1, 0, {
id: maxIdLen + 1,
value: "",
numFieldName:
numField === "string"
? `${numFieldName}${stringRow.length + 1}`
: numFieldName,
numField,
});
} else if (numField === "day") {
const tmpVLastMonthindex = _.findLastIndex(
dataSource,
(item) => item.numField === "month"
);
dataSource.splice(tmpVLastMonthindex + 1, 0, {
id: maxIdLen + 1,
value: "",
numFieldName:
numField === "string"
? `${numFieldName}${stringRow.length + 1}`
: numFieldName,
numField,
});
} else {
const tmpVLastStrindex = _.findLastIndex(
dataSource,
(item) => item.numField === "string"
);
dataSource.splice(tmpVLastStrindex + 1, 0, {
id: maxIdLen + 1,
value: "",
strLogo: maxStrLen + 1,
numFieldName:
numField === "string"
? `${numFieldName}${maxStrLen + 1}`
: numFieldName,
numField,
});
}
newDataSource = [...dataSource];
} else {
if (numField === "month") {
const tmpVLastYearindex = _.findLastIndex(
dataSource,
(item) => item.numField === "year"
);
dataSource.splice(tmpVLastYearindex + 1, 0, {
id: maxIdLen + 1,
value: "",
numFieldName:
numField === "string"
? `${numFieldName}${stringRow.length + 1}`
: numFieldName,
numField,
});
} else if (numField === "day") {
const tmpVLastMonthindex = _.findLastIndex(
dataSource,
(item) => item.numField === "month"
);
dataSource.splice(tmpVLastMonthindex + 1, 0, {
id: maxIdLen + 1,
value: "",
numFieldName:
numField === "string"
? `${numFieldName}${stringRow.length + 1}`
: numFieldName,
numField,
});
} else {
const tmpVLastStrindex = _.findLastIndex(
dataSource,
(item) => item.numField === "string"
);
dataSource.splice(tmpVLastStrindex, 0, {
id: maxIdLen + 1,
value: "",
strLogo: maxStrLen + 1,
numFieldName:
numField === "string"
? `${numFieldName}${maxStrLen + 1}`
: numFieldName,
numField,
});
}
newDataSource = [...dataSource];
}
this.setState({
visible: false,
objectData: { numField: "string", numFieldName: "字符串" },
dataSource: newDataSource,
});
onChange && onChange(newDataSource);
};
/**
* name:年月日字段重复提示
* return {*}
*/
showConfirm = () => {
const { objectData } = this.state;
Modal.warning({
title: "信息确认",
content: `已经添加过一个${objectData.numFieldName},请选择其他编号字段!`,
footer: [],
onOk() { },
okText: "确认",
});
};
handleChangeInput = (value, index, record) => {
const { dataSource } = this.state;
const { onChange } = this.props;
this.setState(
{
dataSource: _.map(dataSource, (it) => {
if (it.id === record.id) {
return {
...it,
value,
};
}
return { ...it };
}),
},
() => {
onChange && onChange(this.state.dataSource);
}
);
};
handleDragChange = (dataSource) => {
const { onChange } = this.props;
this.setState({ dataSource });
onChange && onChange(dataSource);
};
render() {
const { visible, objectData, dataSource } = this.state;
const { options } = this.props;
const { numField, numFieldName } = objectData;
const columns = [
{
title: "",
dataIndex: "numFieldName",
key: "numFieldName",
colSpan: 1,
com: [{ label: "", type: "TEXT" }],
width: "20%",
},
{
title: "",
useRecord: true,
dataIndex: "custom",
key: "custom",
com: [
{
type: "custom",
key: "custom",
render: (text, record, index) => {
const { numField } = record;
if (
numField === "year" ||
numField === "month" ||
numField === "day" ||
numField === "subcompany" ||
numField === "department" ||
numField === "jobtitles"
) {
return <span></span>;
}
if (numField === "number") {
return (
<WeaInputNumber
id="customNumberInput"
value={record.value}
onChange={(value) =>
this.handleChangeInput(value, index, record)
}
/>
);
}
return (
<WeaInput
id="custom"
value={record.value}
onChange={(value) =>
this.handleChangeInput(value, index, record)
}
/>
);
},
},
],
colSpan: 1,
width: "70%",
},
];
const buttons = [
<Button
ecId={`${(this && this.props && this.props.ecId) || ""}_Button@jd6baw`}
onClick={this.handleSave}
type="primary">
{i18n.button.save()}
</Button>,
<WeaMoreButton
ecId={`${(this && this.props && this.props.ecId) || ""
}_WeaMoreButton@e4f4n1`}
/>,
];
return (
<Fragment>
<WeaTableEdit
draggable={true}
columns={columns}
datas={dataSource}
getRowSelection={this.getRowSelection}
pushTitleIntoHeader
showCopy={false}
btnsType="inline"
deleteConfirm
addType="func"
addFunc={() =>
this.setState({
visible: true,
})
}
onChange={this.handleDragChange}
/>
{/* 预览 */}
<Preview dataSource={dataSource} />
{/* 新增弹框 */}
<WeaDialog
onCancel={() =>
this.setState({
visible: false,
})
}
icon="icon-coms-hrm"
iconBgcolor="#217346"
title={i18n.label.addNumberField()}
visible={visible}
hasScroll
initLoadCss
maxHeight={150}
buttons={buttons}>
<div style={{ padding: "20px 20%" }}>
<WeaFormItem
label="编号字段"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}>
<WeaSelect
options={options}
value={numField}
viewAttr={2}
onChange={(numField, numFieldName) => {
this.setState({ objectData: { numField, numFieldName } });
}}
/>
</WeaFormItem>
</div>
</WeaDialog>
</Fragment>
);
}
}
export default NumberComposition;

View File

@ -0,0 +1,50 @@
/*
* Author: 黎永顺
* Description: 编号设置预览
* Date: 2022-05-18 10:21:09
* LastEditTime: 2022-06-08 16:37:01
*/
import React, { Component } from "react";
class Preview extends Component {
render() {
const { dataSource } = this.props;
return (
<div className="preview">
<span className="label">预览</span>
<div className="content">
{_.map(
_.map(dataSource, (item) => {
const { numField, numFieldName } = item;
if (
numField === "year" ||
numField === "month" ||
numField === "day" ||
numField === "subcompany" ||
numField === "department" ||
numField === "jobtitles"
) {
return {
...item,
value: numFieldName,
};
}
return { ...item };
}),
(it, idx) => {
const { numFieldName, value } = it;
return (
<div className="item" key={idx}>
<div title={numFieldName}>{numFieldName}</div>
<div>{value}</div>
</div>
);
}
)}
</div>
</div>
);
}
}
export default Preview;

View File

@ -0,0 +1,397 @@
/*
* Author: 黎永顺
* Description: 预留编号设置
* Date: 2022-06-08 09:53:51
* LastEditTime: 2022-06-15 11:00:55
*/
import React, { Component } from "react";
import { Row, Col, Spin, Modal, Button, Alert, message } from "antd";
import { inject, observer } from "mobx-react";
import { toJS } from "mobx";
import { i18n } from "../../../../public/i18n";
import {
WeaTab,
WeaButtonIcon,
WeaFormItem,
WeaDialog,
WeaMoreButton,
WeaSearchGroup,
} from "ecCom";
import { WeaSwitch, WeaTableNew } from "comsMobx";
const WeaTable = WeaTableNew.WeaTable;
@inject("numberSet")
@observer
class ReservedNumberSetting extends Component {
constructor() {
super();
this.state = {
addVisible: false,
showSearchAd: false,
reservedcode: "",
previewStr: "",
date: "",
};
}
componentWillReceiveProps(nextProps) {
const { numberSet, onChangeAddVisible } = this.props;
const { reservedForm } = numberSet;
if (nextProps.addVisible !== this.props.addVisible) {
!nextProps.addVisible &&
this.setState({ addVisible: false }, () => {
reservedForm.reset();
onChangeAddVisible && onChangeAddVisible();
});
}
}
/**
* name:渲染搜索栏
* return {*}
*/
getPanelComponents = () => {
const { numberSet } = this.props;
const { searchCondition, form } = numberSet;
let colList = [];
const { isFormInit } = form;
isFormInit &&
searchCondition.map((c) => {
c.items.map((field, index) => {
colList.push(
<Col
ecId={`${(this && this.props && this.props.ecId) || ""
}_Col@4cc308@${index}`}
span={index % 2 == 0 ? 10 : 11}
offset={1}>
<div style={{ marginTop: 20 }}>
<WeaFormItem
ecId={`${(this && this.props && this.props.ecId) || ""
}_WeaFormItem@u6ex85@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
{
<WeaSwitch
ecId={`${(this && this.props && this.props.ecId) || ""
}_WeaSwitch@p7d3td@${index}`}
fieldConfig={field}
form={form}
/>
}
</WeaFormItem>
</div>
</Col>
);
});
});
return (
<Row ecId={`${(this && this.props && this.props.ecId) || ""}_Row@ppeb6z`}>
{colList}
</Row>
);
};
onSearchChange = (reservedcode) => {
const { numberSet } = this.props;
const { form } = numberSet;
this.setState({ reservedcode });
!_.isEmpty(form.getFormParams()) &&
form.updateFields({
reservedcode: {
value: reservedcode,
},
});
};
/**
* name: 查询
* return {*}
*/
handelSearch = () => {
const { onSearchReservedNumberset } = this.props;
onSearchReservedNumberset && onSearchReservedNumberset();
};
/**
* name: 删除 预留编号
* return {*}
*/
handleDelete = () => {
const { numberSet, onDeleteReservedNumber } = this.props;
const { tableStore } = numberSet;
const selectedKeys = toJS(tableStore.selectedRowKeys);
Modal.confirm({
title: "信息确认",
content: `确定要删除选择的记录吗?`,
onOk: () => {
onDeleteReservedNumber &&
onDeleteReservedNumber(selectedKeys.join(","));
},
onCancel: () => { },
});
};
handleAddReservedNumber = () => {
const { onAddReservedNumber } = this.props;
this.setState({ addVisible: true }, () => {
onAddReservedNumber && onAddReservedNumber();
});
};
/**
* name: 提交预留编号设置
* return {*}
*/
handleSubmitReservedNumber = () => {
const { numberSet, onSubmitReservedNumber } = this.props;
const { reservedForm, condition } = numberSet;
reservedForm.validateForm().then((f) => {
if (f.isValid) {
const { desc: reserveddesc, flowcode: reservedcodes } =
reservedForm.getFormParams() || {};
if (!/(^[1-9]\d*$)/.test(reservedcodes)) {
message.warning(`"流水号"格式不正确,请重新输入!`);
return;
}
onSubmitReservedNumber &&
onSubmitReservedNumber({
reserveddesc,
reservedcodes: this.state.previewStr,
});
} else {
message.warning("请完善表单信息");
f.showErrors();
this.setState({ date: new Date() }); // 改变一个state的变量,强制页面刷新
}
});
};
/**
* name: 新增预留编号表单渲染
* return {*}
*/
getReservedForm = () => {
const { condition, reservedForm } = this.props.numberSet;
let reservedFormItem = [];
const { isFormInit } = reservedForm;
isFormInit &&
condition.map((c, i) => {
let switchItem = [];
c.items.map((field, index) => {
switchItem.push({
com: (
<div>
{i === condition.length - 1 && index === 0 && (
<div style={{ width: 280 }}>
<Alert
message="填写完上方编号组成后才会显示当前流水号"
type="warning"
showIcon
/>
</div>
)}
<WeaFormItem
ecId={`${(this && this.props && this.props.ecId) || ""
}_WeaFormItem@merei2@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
tipPosition="bottom"
wrapperCol={{ span: `${field.fieldcol}` }}>
<WeaSwitch
ecId={`${(this && this.props && this.props.ecId) || ""
}_WeaSwitch@5r6c5a@${index}`}
fieldConfig={field}
form={reservedForm}
formParams={reservedForm.getFormParams()}
onChange={this.handleFormItemChange}
/>
{field.domkey[0] === "flowcode" && (
<p>格式为5,6-10,21,66,99</p>
)}
</WeaFormItem>
</div>
),
colSpan: 1,
});
});
reservedFormItem.push(
<WeaSearchGroup
ecId={`${(this && this.props && this.props.ecId) || ""
}_WeaSearchGroup@qaih5l@${i}`}
needTigger={true}
title={c.title}
showGroup={c.defaultshow}
items={switchItem}
col={1}
/>
);
});
return reservedFormItem;
};
/**
* name: 输出指定个数0
* param {*} num
* param {*} length
* return {*}
*/
prefixInteger = (num, length) => {
return (Array(length).join("0") + num).slice(-length);
};
/**
* name: 字符串替换
* param {*} str
* param {*} index
* param {*} char
* return {*}
*/
replaceStr2 = (str, index, char) => {
return str.substring(0, index) + char;
};
/**
* name: 预留编号的设置
* param {*} formVal
* return {*}
*/
handleFormItemChange = (formVal) => {
const { numberSet, onSubmitReservedNumber } = this.props;
const { reservedForm, condition } = numberSet;
const NumberOfData = reservedForm.getFormParams() || {};
let previewStr = "",
originStr = "";
for (let i in NumberOfData) {
if (
i.indexOf("STRING") > -1 ||
i.indexOf("YEAR") > -1 ||
i.indexOf("MONTH") > -1 ||
i.indexOf("DAY") > -1
) {
originStr = originStr + NumberOfData[i];
}
}
let integer_0 = this.prefixInteger(0, Number(NumberOfData["NUMBER"]));
//预留流水号值输入
if (_.hasIn(formVal, "flowcode")) {
const inputValue = formVal["flowcode"].value;
if (inputValue.length <= Number(NumberOfData["NUMBER"])) {
previewStr =
originStr +
this.replaceStr2(
integer_0,
integer_0.length - inputValue.length,
inputValue
);
} else {
previewStr = originStr + previewStr + inputValue;
}
this.setState({ previewStr: inputValue ? previewStr : "" });
} else if (
_.hasIn(formVal, "YEAR") ||
_.hasIn(formVal, "MONTH") ||
_.hasIn(formVal, "DAY")
) {
const { flowcode } = NumberOfData;
if (flowcode.length <= Number(NumberOfData["NUMBER"])) {
previewStr =
originStr +
this.replaceStr2(
integer_0,
integer_0.length - flowcode.length,
flowcode
);
} else {
previewStr = originStr + previewStr + flowcode;
}
this.setState({ previewStr });
}
};
render() {
const {
showSearchAd,
reservedcodem,
addVisible,
reservedcode,
date,
previewStr,
} = this.state;
const { numberSet, loading } = this.props;
const { form, tableStore, reservedForm } = numberSet;
return (
<div>
<WeaTab
searchType={["base", "advanced"]}
showSearchAd={showSearchAd}
advanceHeight={200}
setShowSearchAd={(bool) => {
this.setState({
showSearchAd: bool,
});
}}
searchsAd={this.getPanelComponents()}
searchsBaseValue={
_.isEmpty(form.getFormParams())
? reservedcode
: form.getFormParams().reservedcode
}
onSearchChange={this.onSearchChange}
onSearch={this.handelSearch}
onAdReset={() => form.reset()}
onAdSearch={this.handelSearch}
hasMask={false}
buttons={[
<WeaButtonIcon
buttonType="add"
type="primary"
onClick={this.handleAddReservedNumber}
/>,
<WeaButtonIcon
buttonType="del"
type="primary"
onClick={this.handleDelete}
disabled={_.isEmpty(toJS(tableStore.selectedRowKeys))}
/>,
]}
/>
<WeaTable
ecId={`${(this && this.props && this.props.ecId) || ""
}_WeaTable@b43d3f`}
comsWeaTableStore={tableStore}
hasOrder={true}
needScroll={true}
/>
{/* 起始/预留编号设置 */}
<WeaDialog
title={`新建预留编号`}
visible={addVisible}
onCancel={() => {
reservedForm.resetForm();
this.setState({ addVisible: false, previewStr: "" });
}}
icon="icon-coms-hrm"
iconBgcolor="#217346"
hasScroll
style={{ width: 640, height: 480 }}
buttons={[
<Button
ecId={`${(this && this.props && this.props.ecId) || ""
}_Button@jd6baw`}
type="primary"
loading={loading}
onClick={this.handleSubmitReservedNumber}>
{i18n.button.save()}
</Button>,
<WeaMoreButton
ecId={`${(this && this.props && this.props.ecId) || ""
}_WeaMoreButton@e4f4n1`}
/>,
]}>
{this.getReservedForm()}
<WeaSearchGroup title="预留编号预览" showGroup>
<p style={{ textAlign: "center", color: "#30b7f5" }}>
{previewStr}
</p>
</WeaSearchGroup>
</WeaDialog>
</div>
);
}
}
export default ReservedNumberSetting;

View File

@ -0,0 +1,142 @@
/*
* Author: 黎永顺
* Description: 起始编号设置
* Date: 2022-06-07 15:27:43
* LastEditTime: 2022-06-15 10:47:55
*/
import React, { Component, Fragment } from "react";
import { WeaTableEdit, WeaInputNumber, WeaDatePicker, WeaBrowser, WeaError } from "ecCom";
import moment from 'moment';
const enumStr = {
YEAR: '年',
MONTH: '月份',
DAY: '日期'
}
const browserProps = {
iconBgcolor: '#217346',
icon: 'icon-coms-hrm',
isSingle: false,
inputStyle: { width: 200 },
viewAttr: 3
}
class StartNumberSetting extends Component {
constructor() {
super();
this.state = {
startDate: '',
endDate: '',
subCompanyId: '',
jobtitlesId: ""
}
}
handleDatePickerChange = (val, type) => {
this.setState({
[type]: val
}, () => {
const { startDate, endDate, subCompanyId, jobtitlesId } = this.state;
const { onSet } = this.props;
onSet('start', { startDate, endDate, subCompanyId, jobtitlesId })
})
}
handleBrowserChange = (val, type) => {
this.setState({
[type]: val
}, () => {
const { onSet } = this.props;
onSet('start', { ...this.state, [type]: val })
})
}
handleChangeTable = (datas) => {
const { onChange, startNumberInfo } = this.props;
const newColumns = _.map(startNumberInfo.columns, (it) => ({
...it,
com: [{ type: "INPUTNUMBER", key: it.dataIndex, viewAttr: 3, min: 0 }],
}));
onChange && onChange(newColumns, datas);
};
getRowSelection = (rowSelection) => {
return null;
};
render() {
const { startDate, endDate } = this.state;
const { startNumberInfo, companyInfo } = this.props;
const { deptSerial = {}, dateSerial = {}, jobtitlesSerial = {} } = companyInfo;
const newColumns = _.map(startNumberInfo.columns, (it) => ({
...it,
com: [{ type: it.dataIndex === 'startnum' ? "INPUTNUMBER" : "TEXT", key: it.dataIndex, viewAttr: 3, min: 0 }],
}));
const format = dateSerial.key === "YEAR" ? "YYYY" : dateSerial.key === "MONTH" ? "YYYY-MM" : "yyyy-MM-dd";
const formatVal = dateSerial.key === "YEAR" ? "YYYY" : dateSerial.key === "MONTH" ? "YYYY-MM" : "yyyy-MM-DD";
return (
<Fragment>
{dateSerial.enable == '1' && (
<div style={{ padding: "20px 30px" }}>
<span style={{ width: 100, display: "inline-block" }}>{enumStr[dateSerial.key]}</span>
<WeaDatePicker format={format} value={moment(startDate ? startDate : new Date()).format(formatVal)} onChange={val => this.handleDatePickerChange(val, 'startDate')} />
<span> </span>
<WeaDatePicker format={format} value={moment(endDate ? endDate : new Date()).format(formatVal)} onChange={val => this.handleDatePickerChange(val, 'endDate')} />
</div>
)}
{
(deptSerial.enable == '1' && (deptSerial.key === "SUBCOMPANY" || deptSerial.key === "DEPARTMENT")) && (
<div style={{ paddingLeft: 30, marginTop: 20, display: "flex", alignItems: "center" }}>
<span style={{ display: "inline-block", width: 100 }}>分部名称</span>
<WeaError name='dept' tipPosition='bottom' error={'分部名称必填!'}>
<WeaBrowser
{...browserProps}
title={"分部名称"}
type={194}
onChange={ids => this.handleBrowserChange(ids, 'subCompanyId')}
/>
</WeaError>
</div>
)
}
{
(deptSerial.enable == '1' && deptSerial.key === "DEPARTMENT") && (
<div style={{ paddingLeft: 30, marginTop: 20, display: "flex", alignItems: "center" }}>
<span style={{ display: "inline-block", width: 100 }}>部门名称</span>
<WeaError name='dept' tipPosition='bottom' error={'部门名称必填!'}>
<WeaBrowser
{...browserProps}
title={"部门名称"}
type={57}
onChange={ids => this.handleBrowserChange(ids, 'deptId')}
/>
</WeaError>
</div>
)
}
{
(jobtitlesSerial.enable == '1' && jobtitlesSerial.key === "JOBTITLES") && (
<div style={{ paddingLeft: 30, marginTop: 20, display: "flex", alignItems: "center" }}>
<span style={{ display: "inline-block", width: 100 }}>岗位名称</span>
<WeaError name='dept' tipPosition='bottom' error={'岗位名称必填!'}>
<WeaBrowser
{...browserProps}
title={"岗位名称"}
type={278}
onChange={ids => this.handleBrowserChange(ids, 'jobtitlesId')}
/>
</WeaError>
</div>
)
}
<WeaTableEdit
draggable={false}
showAdd={false}
showDelete={false}
showCopy={false}
getRowSelection={this.getRowSelection}
columns={newColumns}
datas={startNumberInfo.dataSource}
onChange={this.handleChangeTable}
/>
</Fragment>
);
}
}
export default StartNumberSetting;

View File

@ -0,0 +1,154 @@
/*
* Author: 黎永顺
* Description: 起始编号及预留编号设置
* Date: 2022-05-17 15:51:41
* LastEditTime: 2022-06-14 18:29:38
*/
import React, { Component, Fragment } from "react";
import { Button, Modal } from "antd";
import StartNumberSetting from "./startNumberSetting";
import ReservedNumberSetting from "./reservedNumberSetting";
import { WeaFormItem, WeaDialog, WeaMoreButton } from "ecCom";
import { i18n } from "../../../../public/i18n";
class StartReservedNumberSet extends Component {
constructor() {
super();
this.state = {
reservedAddVisible: true,
dialogProps: {
type: "start",
visible: false,
title: "",
},
};
}
handleClickStartNumber = (type) => {
const { onSet } = this.props;
const { dialogProps } = this.state;
onSet && onSet(type);
this.setState({
dialogProps: {
...dialogProps,
type,
visible: true,
title: type === "start" ? "起始编号" : "预留编号",
},
});
};
handleChangeTable = (newColumns, datas) => {
const { onChange } = this.props;
onChange && onChange(newColumns, datas);
};
handleSave = () => {
const { onSaveStartNumber } = this.props;
Modal.confirm({
title: "信息确认",
content: `是否保存数据?`,
onOk: () => {
onSaveStartNumber && onSaveStartNumber();
},
onCancel: () => { },
});
};
handleClose = () => {
this.setState({
dialogProps: {
...this.state.dialogProps,
visible: false,
},
});
};
handleCloseReservedModal = () => {
this.setState({
reservedAddVisible: false,
});
};
render() {
const { dialogProps, reservedAddVisible } = this.state;
const { type } = dialogProps;
const {
onSet,
companyInfo,
startNumberInfo,
onDeleteReservedNumber,
onAddReservedNumber,
onSubmitReservedNumber,
onSearchReservedNumberset,
loading,
} = this.props;
return (
<Fragment>
<WeaFormItem
label="起始编号"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}>
<i
className="icon-coms-Flow-setting"
onClick={() => this.handleClickStartNumber("start")}></i>
</WeaFormItem>
<WeaFormItem
label="预留编号"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}>
<i
className="icon-coms-Flow-setting"
onClick={() => this.handleClickStartNumber("reserved")}></i>
</WeaFormItem>
{/* 起始/预留编号设置 */}
<WeaDialog
onCancel={this.handleClose}
icon="icon-coms-hrm"
iconBgcolor="#217346"
{...dialogProps}
hasScroll
style={{ width: 900, height: 480 }}
buttons={
type === "start"
? [
<Button
ecId={`${(this && this.props && this.props.ecId) || ""
}_Button@jd6baw`}
onClick={this.handleSave}
type="primary">
{i18n.button.save()}
</Button>,
<WeaMoreButton
ecId={`${(this && this.props && this.props.ecId) || ""
}_WeaMoreButton@e4f4n1`}
/>,
]
: [
<WeaMoreButton
ecId={`${(this && this.props && this.props.ecId) || ""
}_WeaMoreButton@e4f4n1`}
/>,
]
}>
{type === "start" ? (
<StartNumberSetting
onSet={onSet}
companyInfo={companyInfo}
startNumberInfo={startNumberInfo}
onChange={this.handleChangeTable}
/>
) : (
<ReservedNumberSetting
addVisible={reservedAddVisible}
onDeleteReservedNumber={onDeleteReservedNumber}
onAddReservedNumber={onAddReservedNumber}
onSubmitReservedNumber={onSubmitReservedNumber}
onSearchReservedNumberset={onSearchReservedNumberset}
loading={loading}
onChangeAddVisible={() =>
this.setState({ reservedAddVisible: true })
}
/>
)}
</WeaDialog>
</Fragment>
);
}
}
export default StartReservedNumberSet;

View File

@ -0,0 +1,417 @@
/*
* Author: 黎永顺
* Description: 分部编号设置
* Date: 2022-05-17 14:30:57
* LastEditTime: 2022-06-14 18:26:07
*/
import React, { Component, Fragment } from "react";
import { inject, observer } from "mobx-react";
import { Button, message } from "antd";
import {
WeaTop,
WeaFormItem,
WeaCheckbox,
WeaSearchGroup,
WeaSelect,
WeaHelpfulTip,
} from "ecCom";
import StartReservedNumberSet from "./components/startReservedNumberSet";
import { serialFieldOptions } from "../constants";
import NumberComposition from "./components/numberComposition";
import { i18n } from "../../../public/i18n";
import moment from "moment";
import "./index.less";
@inject("numberSet")
@observer
export default class BranchNumSetting extends Component {
constructor() {
super();
this.state = {
options: [],
loading: false,
dataSource: [],
startNumberInfo: {
columns: [],
dataSource: [],
},
subCompanyInfo: {
details: [],
serialenable: "0",
dateSerial: {
enable: "0",
key: "",
},
},
};
}
componentDidMount() {
this.getCodeSetting();
}
getCodeSetting = () => {
const { numberSet } = this.props;
numberSet
.getCodeSetting({ serialtype: "SUBCOMPANY" })
.then(({ api_status, details, serialenable, dateSerial = {} }) => {
if (api_status && !_.isEmpty(details)) {
this.setState({
subCompanyInfo: { details, serialenable, dateSerial },
});
}
});
};
handleSubmit = () => {
let promise = new Promise((resolve, reject) => {
const { numberSet } = this.props;
const { dataSource, subCompanyInfo } = this.state;
const { serialenable, dateSerial } = subCompanyInfo;
const details = _.map(dataSource, (it, showorder) => {
const { numField, value: rulevalue } = it;
return {
ruletype: _.upperCase(numField),
rulevalue,
showorder,
};
});
const payload = {
datas: JSON.stringify({
serialenable,
details,
dateSerial,
serialtype: "SUBCOMPANY",
}),
};
this.setState({ loading: true });
numberSet.saveOrUpdateCodeSetting(payload).then(({ api_status }) => {
this.setState({ loading: false });
if (api_status) {
message.success("保存成功");
resolve(api_status);
} else {
reject("接口调用失败");
}
});
});
return promise;
};
handleChangeCode = (data) => {
const tmpV = _.filter(
data,
(it) =>
it.numField === "year" ||
it.numField === "month" ||
it.numField === "day"
);
this.setState({
dataSource: _.cloneDeep(data),
options: _.map(tmpV, (it) => {
const { numFieldName: showname, numField: key } = it;
return { key: _.upperCase(key), showname };
}),
});
};
handleSetNumber = (type, data = {}) => {
this.handleSubmit().then((res) => {
const { numberSet } = this.props;
const { subCompanyInfo } = this.state;
const { dateSerial } = subCompanyInfo;
if (type === "start") {
const formatVal = dateSerial.key === "YEAR" ? "YYYY" : dateSerial.key === "MONTH" ? "YYYY-MM" : "YYYY-MM-DD";
const payload = {
coderuleid: 1,
type: dateSerial.enable == '1' ? dateSerial.key : '',
dateStart: data.startDate ? data.startDate : moment().format(formatVal),
dateEnd: data.endDate ? data.endDate : moment().format(formatVal),
subCompanyId: "",
deptId: "",
jobtitlesId: "",
};
numberSet
.getStartNumForm(payload)
.then(({ api_status, columns, dataSource }) => {
if (api_status) {
this.setState({
startNumberInfo: { columns, dataSource },
});
}
});
} else {
numberSet.getAdvanceSearchCondition();
numberSet.getSearchReservedCodeList({
serialtype: "SUBCOMPANY",
checkboxType: "multi",
});
}
});
};
handleChangeTable = (newColumns, datas) => {
this.setState({
startNumberInfo: {
...this.state.startNumberInfo,
columns: newColumns,
dataSource: datas,
},
});
};
handleSubmitStartNumber = () => {
const { numberSet } = this.props;
const payload = {
datas: JSON.stringify({
coderuleid: 1,
...this.state.startNumberInfo,
}),
};
numberSet.saveStartNum(payload).then(({ api_status }) => {
if (api_status) {
message.success("保存成功");
this.numberSetRef.handleClose();
}
});
};
/**
* name: 删除预留编号
* param {*} ids
* return {*}
*/
deleteReservedNumber = (ids) => {
const { numberSet } = this.props;
numberSet.deleteReservedCodeById({ ids }).then(({ api_status }) => {
if (api_status) {
message.success("删除成功");
numberSet.getSearchReservedCodeList({
serialtype: "SUBCOMPANY",
checkboxType: "multi",
});
}
});
};
/**
* name:新增预留编号
* return {*}
*/
handleAddReservedNumber = () => {
const { numberSet } = this.props;
const { reservedForm } = numberSet;
const { options } = this.state;
numberSet.getReservedCodeFrom({ serialtype: "SUBCOMPANY" }).then(() => {
const type = _.get(_.last(options), ['key']);
const format = type === "YEAR" ? "YYYY" : type === "MONTH" ? "YYYY-MM" : "YYYY-MM-DD"
const payload = {
coderuleid: 1,
type,
dateStart: moment().format(format),
dateEnd: moment().format(format),
subCompanyId: "",
deptId: "",
jobtitlesId: "",
};
numberSet
.getStartNumForm(payload)
.then(({ api_status, dataSource }) => {
if (api_status && !_.isEmpty(dataSource)) {
const currentnumber = _.get(_.last(dataSource), ['startnum']);
reservedForm.updateFields({
currentnumber: {
value: currentnumber,
},
});
}
});
})
};
/**
* name: 保存预留设置
* param {*} params
* return {*}
*/
handleSubmitReservedNumber = (params) => {
const { numberSet } = this.props;
const payload = { ...params, serialtype: "SUBCOMPANY" };
this.setState({ loading: true });
numberSet.saveReservedCode(payload).then(({ api_status }) => {
this.setState({ loading: false });
if (api_status) {
message.success("保存成功");
this.numberSetRef.handleCloseReservedModal();
numberSet.getSearchReservedCodeList({
serialtype: "SUBCOMPANY",
checkboxType: "multi",
});
}
});
};
/**
* name:提示文本
* return {*}
*/
helpContent = () => {
return (
<div>
<p>开启后可根据设置的分部编号规则自动生成分部编号涉及场景如下</p>
<p>1.手动新建和手动编辑分部时可选择重新生成编号和选择预留分部编号</p>
<p>2.组织结构导入-添加新分部且分部编号列为空时会自动生成分部编号</p>
<p>3.导入人员-添加时新创建的分部可自动生成分部编号</p>
<p>注意开启前请先确认分部编号字段已启用</p>
</div>
);
};
render() {
const { numberSet } = this.props;
const { options, subCompanyInfo, loading, startNumberInfo } = this.state;
const { details, serialenable, dateSerial } = subCompanyInfo;
const btns = [
<Button type="primary" onClick={this.handleSubmit} loading={loading}>
保存
</Button>,
];
const dropMenuDatas = [
{
key: "save",
disabled: false,
icon: <i className="icon-coms-Preservation" />,
content: "保存",
onClick: (key) => this.handleSubmit(),
},
];
return (
<div className="branch-wapper">
<WeaTop
title={i18n.label.branchNumSetting()}
icon={<i className="icon-coms-hrm" />}
iconBgcolor="#217346"
buttons={btns}
showDropIcon={true}
dropMenuDatas={dropMenuDatas}
/>
<div className="branch-content">
<div className="switch-wrapper">
<WeaFormItem
label="分部编号自动生成"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}>
<WeaCheckbox
value={serialenable}
helpfulTip={this.helpContent}
helpfulTipProps={{ placement: "top" }}
display="switch"
id="num-set-switch"
onChange={(checkVal) =>
this.setState({
subCompanyInfo: {
...subCompanyInfo,
serialenable: checkVal,
},
})
}
/>
</WeaFormItem>
</div>
{/* 内容区 */}
{serialenable === "1" && (
<Fragment>
<div className="numberComposition">
<WeaSearchGroup title={"编号组成"} showGroup>
<NumberComposition
onChange={this.handleChangeCode}
dataSource={details}
options={serialFieldOptions}
/>
</WeaSearchGroup>
</div>
{!_.isEmpty(options) && (
<div className="codeNumbering">
<WeaSearchGroup title={"编号流水规则"} showGroup>
<div className="switch-wrapper">
<WeaFormItem
label="日期单独流水"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}>
<div className="codeNumbering-operateWapper">
<WeaCheckbox
value={dateSerial.enable ? dateSerial.enable : "0"}
display="switch"
id="dept-date-set-switch"
onChange={(isSingle) =>
this.setState({
subCompanyInfo: {
...subCompanyInfo,
dateSerial: {
...dateSerial,
enable: isSingle,
key: isSingle == '0' ? 'YEAR' : dateSerial.key
},
},
})
}
/>
{dateSerial.enable == "1" && (
<WeaSelect
options={_.map(options, item => ({ ...item, showname: item.showname.substr(2, 1) }))}
value={dateSerial.key}
detailtype={3}
supportCancel
onChange={(key) =>
this.setState({
subCompanyInfo: {
...subCompanyInfo,
dateSerial: {
...dateSerial,
key,
},
},
})
}
/>
)}
<WeaHelpfulTip
width={200}
title="开启后可设置按年、按月或按天单独流水如设置按年单独流水那每年的1月1日开始流水号从001开始重新流水。"
placement="topLeft"
/>
</div>
</WeaFormItem>
</div>
</WeaSearchGroup>
</div>
)}
<div className="startReservedNumberSet">
<WeaSearchGroup
title={"起始编号及预留编号设置"}
showGroup
center>
<StartReservedNumberSet
ref={(dom) => (this.numberSetRef = dom)}
loading={loading}
onSet={this.handleSetNumber}
companyInfo={subCompanyInfo}
startNumberInfo={startNumberInfo}
onChange={this.handleChangeTable}
onSaveStartNumber={this.handleSubmitStartNumber}
onDeleteReservedNumber={this.deleteReservedNumber}
onAddReservedNumber={this.handleAddReservedNumber}
onSubmitReservedNumber={this.handleSubmitReservedNumber}
onSearchReservedNumberset={() =>
numberSet.getSearchReservedCodeList({
serialtype: "SUBCOMPANY",
checkboxType: "multi",
})
}
/>
</WeaSearchGroup>
</div>
</Fragment>
)}
</div>
</div>
);
}
}

View File

@ -0,0 +1,88 @@
.branch-wapper,
.dept-number-set {
height: 100%;
display: flex;
flex-direction: column;
.branch-content,
.dept-content {
flex: 1;
overflow: hidden auto;
.switch-wrapper {
width: 100%;
padding: 20px 20% 40px 30%;
}
.numberComposition .ant-table-thead {
background: #f7fbfe;
}
.codeNumbering {
.codeNumbering-operateWapper {
display: flex;
align-items: center;
.wea-select {
width: inherit !important;
margin-left: 8px;
}
.wea-helpful-tip {
margin-left: 8px;
margin-top: 3px;
}
}
}
.numberComposition {
.preview {
margin-top: 20px;
padding-left: 5%;
overflow-x: auto;
width: 100%;
white-space: nowrap;
display: flex;
align-items: center;
.content {
vertical-align: middle;
margin-left: 30px;
white-space: nowrap;
.item {
display: inline-block;
text-align: center;
&>div {
border: 1px solid #0070c0;
margin-left: -1px;
min-width: 100px;
max-width: 200px;
line-height: 30px;
height: 30px;
white-space: nowrap;
overflow: hidden;
-o-text-overflow: ellipsis;
text-overflow: ellipsis;
color: #0070c0;
}
&>div:last-child {
margin-top: -1px;
color: #c63;
}
}
}
}
}
.startReservedNumberSet {
.icon-coms-Flow-setting {
font-size: 16px;
cursor: pointer;
line-height: 30px;
}
}
}
}

View File

@ -0,0 +1,18 @@
export const serialFieldOptions = [
{
key: "string",
showname: "字符串",
},
{
key: "year",
showname: "当前年份",
},
{
key: "month",
showname: "当前月份",
},
{
key: "day",
showname: "当前日期",
},
]

View File

@ -0,0 +1,481 @@
/*
* Author: 黎永顺
* Description: 部门编号设置
* Date: 2022-06-06 09:37:39
* LastEditTime: 2022-06-15 09:52:04
*/
import React, { Component, Fragment } from "react";
import { inject, observer } from "mobx-react";
import { Button, message } from "antd";
import {
WeaTop,
WeaFormItem,
WeaCheckbox,
WeaSearchGroup,
WeaSelect,
WeaHelpfulTip,
} from "ecCom";
import StartReservedNumberSet from "../branchNumSetting/components/startReservedNumberSet";
import NumberComposition from "../branchNumSetting/components/numberComposition";
import { serialFieldOptions } from "../constants";
import { i18n } from "../../../public/i18n";
import moment from "moment";
import "../branchNumSetting/index.less";
const deptSerialFieldOptions = [{ key: 'subcompany', showname: "分部编号" }]
@inject("numberSet")
@observer
export default class DeptNumberSet extends Component {
constructor() {
super();
this.state = {
options: [],
loading: false,
dataSource: [],
startNumberInfo: {
columns: [],
dataSource: [],
},
subCompanyInfo: {
details: [],
serialenable: "0",
deptSerial: {
enable: "0",
key: "",
},
dateSerial: {
enable: "0",
key: "",
},
},
};
}
componentDidMount() {
this.getCodeSetting();
}
getCodeSetting = () => {
const { numberSet } = this.props;
numberSet
.getCodeSetting({ serialtype: "DEPARTMENT" })
.then(({ api_status, details, serialenable, dateSerial = {}, deptSerial = {} }) => {
if (api_status && !_.isEmpty(details)) {
this.setState({
subCompanyInfo: { details, serialenable, dateSerial, deptSerial },
});
}
});
};
handleSubmit = () => {
let promise = new Promise((resolve, reject) => {
const { numberSet } = this.props;
const { dataSource, subCompanyInfo } = this.state;
const { serialenable, dateSerial, deptSerial } = subCompanyInfo;
const details = _.map(dataSource, (it, showorder) => {
const { numField, value: rulevalue } = it;
return {
ruletype: _.upperCase(numField),
rulevalue,
showorder,
};
});
const payload = {
datas: JSON.stringify({
serialenable,
details,
dateSerial,
deptSerial,
serialtype: "DEPARTMENT",
}),
};
this.setState({ loading: true });
numberSet.saveOrUpdateCodeSetting(payload).then(({ api_status }) => {
this.setState({ loading: false });
if (api_status) {
message.success("保存成功");
resolve(api_status);
} else {
reject("接口调用失败");
}
});
});
return promise;
};
handleChangeCode = (data) => {
const tmpV = _.filter(
data,
(it) =>
it.numField === "year" ||
it.numField === "month" ||
it.numField === "day" ||
it.numField === "subcompany" ||
it.numField === "department" ||
it.numField === "jobtitles"
);
this.setState({
dataSource: _.cloneDeep(data),
options: _.map(tmpV, (it) => {
const { numFieldName: showname, numField: key } = it;
return { key: _.upperCase(key), showname };
}),
});
};
handleSetNumber = (type, data = {}) => {
this.handleSubmit().then((res) => {
const { numberSet } = this.props;
const { subCompanyInfo } = this.state;
const { dateSerial, deptSerial } = subCompanyInfo;
if (type === "start") {
const formatVal = dateSerial.key === "YEAR" ? "YYYY" : dateSerial.key === "MONTH" ? "YYYY-MM" : "YYYY-MM-DD";
let payload = {
coderuleid: 2,
type: dateSerial.enable == '1' ? dateSerial.key : '',
dateStart: data.startDate ? data.startDate : moment().format(formatVal),
dateEnd: data.endDate ? data.endDate : moment().format(formatVal),
subCompanyId: data.subCompanyId ? data.subCompanyId : "",
deptId: "",
jobtitlesId: "",
};
if (deptSerial.enable === '1' && !data.subCompanyId) return
if (deptSerial.enable === '1' && data.subCompanyId) {
payload = { ...payload, type: payload.type + ',' + deptSerial.key }
}
numberSet.getStartNumForm(payload).then(({ api_status, columns, dataSource }) => {
if (api_status) {
this.setState({
startNumberInfo: { columns, dataSource },
});
}
});
} else {
numberSet.getAdvanceSearchCondition();
numberSet.getSearchReservedCodeList({
serialtype: "DEPARTMENT",
checkboxType: "multi",
});
}
});
};
handleChangeTable = (newColumns, datas) => {
this.setState({
startNumberInfo: {
...this.state.startNumberInfo,
columns: newColumns,
dataSource: datas,
},
});
};
handleSubmitStartNumber = () => {
const { numberSet } = this.props;
const payload = {
datas: JSON.stringify({
coderuleid: 2,
...this.state.startNumberInfo,
}),
};
numberSet.saveStartNum(payload).then(({ api_status }) => {
if (api_status) {
message.success("保存成功");
this.numberSetRef.handleClose();
}
});
};
/**
* name: 删除预留编号
* param {*} ids
* return {*}
*/
deleteReservedNumber = (ids) => {
const { numberSet } = this.props;
numberSet.deleteReservedCodeById({ ids }).then(({ api_status }) => {
if (api_status) {
message.success("删除成功");
numberSet.getSearchReservedCodeList({
serialtype: "DEPARTMENT",
checkboxType: "multi",
});
}
});
};
/**
* name:新增预留编号
* return {*}
*/
handleAddReservedNumber = () => {
const { numberSet } = this.props;
const { reservedForm } = numberSet;
const { options } = this.state;
numberSet.getReservedCodeFrom({ serialtype: "DEPARTMENT" }).then(() => {
const type = _.get(_.last(options), ['key']);
const format = type === "YEAR" ? "YYYY" : type === "MONTH" ? "YYYY-MM" : "YYYY-MM-DD"
const payload = {
coderuleid: 2,
type,
dateStart: moment().format(format),
dateEnd: moment().format(format),
subCompanyId: "",
deptId: "",
jobtitlesId: "",
};
numberSet
.getStartNumForm(payload)
.then(({ api_status, dataSource }) => {
if (api_status && !_.isEmpty(dataSource)) {
const currentnumber = _.get(_.last(dataSource), ['startnum']);
reservedForm.updateFields({
currentnumber: {
value: currentnumber,
},
});
}
});
})
};
/**
* name: 保存预留设置
* param {*} params
* return {*}
*/
handleSubmitReservedNumber = (params) => {
const { numberSet } = this.props;
const payload = { ...params, serialtype: "DEPARTMENT" };
numberSet.saveReservedCode(payload).then(({ api_status }) => {
if (api_status) {
message.success("保存成功");
this.numberSetRef.handleCloseReservedModal();
numberSet.getSearchReservedCodeList({
serialtype: "DEPARTMENT",
checkboxType: "multi",
});
}
});
};
/**
* name:提示文本
* return {*}
*/
helpContent = () => {
return (
<div>
<p>开启后可根据设置的部门编号规则自动生成部门编号涉及场景如下</p>
<p>1.手动新建和手动编辑部门时可选择重新生成编号和选择预留部门编号</p>
<p>2.导入人员-添加时新创建的部门可自动生成部门编号</p>
<p>3.组织结构导入-添加新部门且部门编号列为空时可自动生成部门编号</p>
<p>注意开启前请先确认部门编号字段已启用</p>
</div>
);
};
render() {
const { options, subCompanyInfo, loading, startNumberInfo } = this.state;
const { numberSet } = this.props;
const { details, serialenable, dateSerial = {}, deptSerial = {} } = subCompanyInfo;
const btns = [
<Button type="primary" onClick={this.handleSubmit} loading={loading}>
保存
</Button>,
];
const dropMenuDatas = [
{
key: "save",
disabled: false,
icon: <i className="icon-coms-Preservation" />,
content: "保存",
onClick: (key) => this.handleSubmit(),
},
];
return (
<div className="dept-number-set">
<WeaTop
title={i18n.label.deptNumSetting()}
icon={<i className="icon-coms-hrm" />}
iconBgcolor="#217346"
buttons={btns}
showDropIcon={true}
dropMenuDatas={dropMenuDatas}
/>
<div className="dept-content">
<div className="switch-wrapper">
<WeaFormItem
label="部门编号自动生成"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}>
<WeaCheckbox
value={serialenable}
helpfulTip={this.helpContent}
helpfulTipProps={{ placement: "top" }}
display="switch"
id="num-set-switch"
onChange={(checkVal) =>
this.setState({
subCompanyInfo: {
...subCompanyInfo,
serialenable: checkVal,
},
})
}
/>
</WeaFormItem>
</div>
{/* 内容区 */}
{serialenable === "1" && (
<Fragment>
<div className="numberComposition">
<WeaSearchGroup title={"编号组成"} showGroup>
<NumberComposition
onChange={this.handleChangeCode}
dataSource={details}
options={[...serialFieldOptions, ...deptSerialFieldOptions]}
/>
</WeaSearchGroup>
</div>
{!_.isEmpty(options) && (
<div className="codeNumbering">
<WeaSearchGroup title={"编号流水规则"} showGroup>
{
!_.isEmpty(_.filter(options, item => ["YEAR", "MONTH", "DAY"].includes(item.key))) &&
<div className="switch-wrapper" style={{ paddingBottom: !_.isEmpty(_.filter(options, item => !["YEAR", "MONTH", "DAY"].includes(item.key))) && 0 }}>
<WeaFormItem
label="日期单独流水"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}>
<div className="codeNumbering-operateWapper">
<WeaCheckbox
value={dateSerial.enable ? dateSerial.enable : "0"}
display="switch"
id="dept-date-set-switch"
onChange={(isSingle) =>
this.setState({
subCompanyInfo: {
...subCompanyInfo,
dateSerial: {
...dateSerial,
enable: isSingle,
key: isSingle == '0' ? 'YEAR' : dateSerial.key
},
},
})
}
/>
{dateSerial.enable == "1" && (
<WeaSelect
options={_.map(_.filter(options, item => ["YEAR", "MONTH", "DAY"].includes(item.key)), it => ({ ...it, showname: it.showname.substr(2, 1) }))}
value={dateSerial.key}
detailtype={3}
supportCancel
onChange={(key) =>
this.setState({
subCompanyInfo: {
...subCompanyInfo,
dateSerial: {
...dateSerial,
key,
},
},
})
}
/>
)}
<WeaHelpfulTip
width={200}
title="开启后可设置按年、按月或按天单独流水如设置按年单独流水那每年的1月1日开始流水号从001开始重新流水。"
placement="topLeft"
/>
</div>
</WeaFormItem>
</div>
}
{
!_.isEmpty(_.filter(options, item => !["YEAR", "MONTH", "DAY"].includes(item.key))) &&
<div className="switch-wrapper">
<WeaFormItem
label="机构单独流水"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}>
<div className="codeNumbering-operateWapper">
<WeaCheckbox
value={deptSerial.enable ? deptSerial.enable : "0"}
display="switch"
id="dept-set-switch"
onChange={(isSingle) =>
this.setState({
subCompanyInfo: {
...subCompanyInfo,
deptSerial: {
...deptSerial,
enable: isSingle,
},
},
})
}
/>
{deptSerial.enable == "1" && (
<WeaSelect
options={_.map(_.filter(options, item => ["SUBCOMPANY", "DEPARTMENT"].includes(item.key)), it => ({ ...it, showname: it.showname.substr(0, 2) }))}
value={deptSerial.key}
detailtype={3}
supportCancel
onChange={(key) =>
this.setState({
subCompanyInfo: {
...subCompanyInfo,
deptSerial: {
...deptSerial,
key,
},
},
})
}
/>
)}
<WeaHelpfulTip
width={200}
title="开启后,可选择按分部进行单独流水"
placement="topLeft"
/>
</div>
</WeaFormItem>
</div>
}
</WeaSearchGroup>
</div>
)}
<div className="startReservedNumberSet">
<WeaSearchGroup
title={"起始编号及预留编号设置"}
showGroup
center>
<StartReservedNumberSet
ref={(dom) => (this.numberSetRef = dom)}
onSet={this.handleSetNumber}
companyInfo={subCompanyInfo}
loading={loading}
startNumberInfo={startNumberInfo}
onChange={this.handleChangeTable}
onSaveStartNumber={this.handleSubmitStartNumber}
onDeleteReservedNumber={this.deleteReservedNumber}
onAddReservedNumber={this.handleAddReservedNumber}
onSubmitReservedNumber={this.handleSubmitReservedNumber}
onSearchReservedNumberset={() =>
numberSet.getSearchReservedCodeList({
serialtype: "DEPARTMENT",
checkboxType: "multi",
})
}
/>
</WeaSearchGroup>
</div>
</Fragment>
)}
</div>
</div>
);
}
}

View File

@ -0,0 +1,413 @@
/*
* Author: 黎永顺
* Description: 岗位编号设置
* Date: 2022-06-06 09:37:39
* LastEditTime: 2022-06-15 12:47:43
*/
import React, { Component, Fragment } from "react";
import { inject, observer } from "mobx-react";
import { Button, message } from "antd";
import {
WeaTop,
WeaFormItem,
WeaCheckbox,
WeaSearchGroup,
WeaSelect,
WeaHelpfulTip,
} from "ecCom";
import StartReservedNumberSet from "../branchNumSetting/components/startReservedNumberSet";
import NumberComposition from "../branchNumSetting/components/numberComposition";
import { serialFieldOptions } from "../constants";
import { i18n } from "../../../public/i18n";
import moment from "moment";
import "../branchNumSetting/index.less";
@inject("numberSet")
@observer
export default class PostNumberSet extends Component {
constructor() {
super();
this.state = {
options: [],
loading: false,
dataSource: [],
startNumberInfo: {
columns: [],
dataSource: [],
},
subCompanyInfo: {
details: [],
serialenable: "0",
dateSerial: {
enable: "0",
key: "",
},
},
};
}
componentDidMount() {
this.getCodeSetting();
}
getCodeSetting = () => {
const { numberSet } = this.props;
numberSet
.getCodeSetting({ serialtype: "JOBTITLES" })
.then(({ api_status, details, serialenable, dateSerial = {} }) => {
if (api_status && !_.isEmpty(details)) {
this.setState({
subCompanyInfo: { details, serialenable, dateSerial },
});
}
});
};
handleSubmit = () => {
let promise = new Promise((resolve, reject) => {
const { numberSet } = this.props;
const { dataSource, subCompanyInfo } = this.state;
const { serialenable, dateSerial } = subCompanyInfo;
const details = _.map(dataSource, (it, showorder) => {
const { numField, value: rulevalue } = it;
return {
ruletype: _.upperCase(numField),
rulevalue,
showorder,
};
});
const payload = {
datas: JSON.stringify({
serialenable,
details,
dateSerial,
serialtype: "JOBTITLES",
}),
};
this.setState({ loading: true });
numberSet.saveOrUpdateCodeSetting(payload).then(({ api_status }) => {
this.setState({ loading: false });
if (api_status) {
message.success("保存成功");
resolve(api_status);
} else {
reject("接口调用失败");
}
});
});
return promise;
};
handleChangeCode = (data) => {
const tmpV = _.filter(
data,
(it) =>
it.numField === "year" ||
it.numField === "month" ||
it.numField === "day"
);
this.setState({
dataSource: _.cloneDeep(data),
options: _.map(tmpV, (it) => {
const { numFieldName: showname, numField: key } = it;
return { key: _.upperCase(key), showname };
}),
});
};
handleSetNumber = (type, data = {}) => {
this.handleSubmit().then(() => {
const { numberSet } = this.props;
const { subCompanyInfo } = this.state;
const { dateSerial } = subCompanyInfo;
if (type === "start") {
const formatVal = dateSerial.key === "YEAR" ? "YYYY" : dateSerial.key === "MONTH" ? "YYYY-MM" : "YYYY-MM-DD";
const payload = {
coderuleid: 4,
type: dateSerial.enable == '1' ? dateSerial.key : '',
dateStart: data.startDate ? data.startDate : moment().format(formatVal),
dateEnd: data.endDate ? data.endDate : moment().format(formatVal),
subCompanyId: "",
deptId: "",
jobtitlesId: "",
};
numberSet
.getStartNumForm(payload)
.then(({ api_status, columns, dataSource }) => {
if (api_status) {
this.setState({
startNumberInfo: { columns, dataSource },
});
}
});
} else {
numberSet.getAdvanceSearchCondition();
numberSet.getSearchReservedCodeList({
serialtype: "JOBTITLES",
checkboxType: "multi",
});
}
});
};
handleChangeTable = (newColumns, datas) => {
this.setState({
startNumberInfo: {
...this.state.startNumberInfo,
columns: newColumns,
dataSource: datas,
},
});
};
handleSubmitStartNumber = () => {
const { numberSet } = this.props;
const payload = {
datas: JSON.stringify({
coderuleid: 4,
...this.state.startNumberInfo,
}),
};
numberSet.saveStartNum(payload).then(({ api_status }) => {
if (api_status) {
message.success("保存成功");
this.numberSetRef.handleClose();
}
});
};
/**
* name: 删除预留编号
* param {*} ids
* return {*}
*/
deleteReservedNumber = (ids) => {
const { numberSet } = this.props;
numberSet.deleteReservedCodeById({ ids }).then(({ api_status }) => {
if (api_status) {
message.success("删除成功");
numberSet.getSearchReservedCodeList({
serialtype: "JOBTITLES",
checkboxType: "multi",
});
}
});
};
/**
* name:新增预留编号
* return {*}
*/
handleAddReservedNumber = () => {
const { numberSet } = this.props;
const { reservedForm } = numberSet;
const { options } = this.state;
numberSet.getReservedCodeFrom({ serialtype: "JOBTITLES" }).then(() => {
const type = _.get(_.last(options), ['key']);
const format = type === "YEAR" ? "YYYY" : type === "MONTH" ? "YYYY-MM" : "YYYY-MM-DD"
const payload = {
coderuleid: 4,
type,
dateStart: moment().format(format),
dateEnd: moment().format(format),
subCompanyId: "",
deptId: "",
jobtitlesId: "",
};
numberSet
.getStartNumForm(payload)
.then(({ api_status, dataSource }) => {
if (api_status && !_.isEmpty(dataSource)) {
const currentnumber = _.get(_.last(dataSource), ['startnum']);
reservedForm.updateFields({
currentnumber: {
value: currentnumber,
},
});
}
});
})
};
/**
* name: 保存预留设置
* param {*} params
* return {*}
*/
handleSubmitReservedNumber = (params) => {
const { numberSet } = this.props;
const payload = { ...params, serialtype: "JOBTITLES" };
numberSet.saveReservedCode(payload).then(({ api_status }) => {
if (api_status) {
message.success("保存成功");
this.numberSetRef.handleCloseReservedModal();
numberSet.getSearchReservedCodeList({
serialtype: "JOBTITLES",
checkboxType: "multi",
});
}
});
};
/**
* name:提示文本
* return {*}
*/
helpContent = () => {
return (
<div>
<p>开启后可根据设置的部门编号规则自动生成部门编号涉及场景如下</p>
<p>1.手动新建和手动编辑部门时可选择重新生成编号和选择预留部门编号</p>
<p>2.导入人员-添加时新创建的部门可自动生成部门编号</p>
<p>3.组织结构导入-添加新部门且部门编号列为空时可自动生成部门编号</p>
<p>注意开启前请先确认部门编号字段已启用</p>
</div>
);
};
render() {
const { numberSet } = this.props;
const { options, subCompanyInfo, loading, startNumberInfo } = this.state;
const { details, serialenable, dateSerial } = subCompanyInfo;
const btns = [
<Button type="primary" onClick={this.handleSubmit} loading={loading}>
保存
</Button>,
];
const dropMenuDatas = [
{
key: "save",
disabled: false,
icon: <i className="icon-coms-Preservation" />,
content: "保存",
onClick: (key) => this.handleSubmit(),
},
];
return (
<div className="dept-number-set">
<WeaTop
title={i18n.label.postNumSetting()}
icon={<i className="icon-coms-hrm" />}
iconBgcolor="#217346"
buttons={btns}
showDropIcon={true}
dropMenuDatas={dropMenuDatas}
/>
<div className="dept-content">
<div className="switch-wrapper">
<WeaFormItem
label="岗位编号自动生成"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}>
<WeaCheckbox
value={serialenable}
helpfulTip={this.helpContent}
helpfulTipProps={{ placement: "top" }}
display="switch"
id="num-set-switch"
onChange={(checkVal) =>
this.setState({
subCompanyInfo: {
...subCompanyInfo,
serialenable: checkVal,
},
})
}
/>
</WeaFormItem>
</div>
{/* 内容区 */}
{serialenable === "1" && (
<Fragment>
<div className="numberComposition">
<WeaSearchGroup title={"编号组成"} showGroup>
<NumberComposition
onChange={this.handleChangeCode}
dataSource={details}
options={serialFieldOptions}
/>
</WeaSearchGroup>
</div>
{!_.isEmpty(options) && (
<div className="codeNumbering">
<WeaSearchGroup title={"编号流水规则"} showGroup>
<div className="switch-wrapper">
<WeaFormItem
label="日期单独流水"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}>
<div className="codeNumbering-operateWapper">
<WeaCheckbox
value={dateSerial.enable ? dateSerial.enable : "0"}
display="switch"
id="dept-date-set-switch"
onChange={(isSingle) =>
this.setState({
subCompanyInfo: {
...subCompanyInfo,
dateSerial: {
...dateSerial,
enable: isSingle,
key: isSingle == '0' ? 'YEAR' : dateSerial.key
},
},
})
}
/>
{dateSerial.enable == "1" && (
<WeaSelect
options={_.map(options, item => ({ ...item, showname: item.showname.substr(2, 1) }))}
value={dateSerial.key}
detailtype={3}
supportCancel
onChange={(key) =>
this.setState({
subCompanyInfo: {
...subCompanyInfo,
dateSerial: {
...dateSerial,
key,
},
},
})
}
/>
)}
<WeaHelpfulTip
width={200}
title="开启后可设置按年、按月或按天单独流水如设置按年单独流水那每年的1月1日开始流水号从001开始重新流水。"
placement="topLeft"
/>
</div>
</WeaFormItem>
</div>
</WeaSearchGroup>
</div>
)}
<div className="startReservedNumberSet">
<WeaSearchGroup
title={"起始编号及预留编号设置"}
showGroup
center>
<StartReservedNumberSet
ref={(dom) => (this.numberSetRef = dom)}
onSet={this.handleSetNumber}
companyInfo={subCompanyInfo}
loading={loading}
startNumberInfo={startNumberInfo}
onChange={this.handleChangeTable}
onSaveStartNumber={this.handleSubmitStartNumber}
onDeleteReservedNumber={this.deleteReservedNumber}
onAddReservedNumber={this.handleAddReservedNumber}
onSubmitReservedNumber={this.handleSubmitReservedNumber}
onSearchReservedNumberset={() =>
numberSet.getSearchReservedCodeList({
serialtype: "JOBTITLES",
checkboxType: "multi",
})
}
/>
</WeaSearchGroup>
</div>
</Fragment>
)}
</div>
</div>
);
}
}

View File

@ -0,0 +1,529 @@
/*
* Author: 黎永顺
* Description: 岗位编号设置
* Date: 2022-06-06 09:37:39
* LastEditTime: 2022-06-15 10:36:30
*/
import React, { Component, Fragment } from "react";
import { inject, observer } from "mobx-react";
import { Button, message } from "antd";
import {
WeaTop,
WeaFormItem,
WeaCheckbox,
WeaSearchGroup,
WeaSelect,
WeaHelpfulTip,
} from "ecCom";
import StartReservedNumberSet from "../branchNumSetting/components/startReservedNumberSet";
import NumberComposition from "../branchNumSetting/components/numberComposition";
import { serialFieldOptions } from "../constants";
import { i18n } from "../../../public/i18n";
import moment from "moment";
import "../branchNumSetting/index.less";
const resourceSerialFieldOptions = [
{ key: 'subcompany', showname: "分部编号" },
{ key: 'department', showname: "部门编号" },
{ key: 'jobtitles', showname: "岗位编号" }
]
@inject("numberSet")
@observer
export default class ResourceNumberSet extends Component {
constructor() {
super();
this.state = {
options: [],
loading: false,
dataSource: [],
startNumberInfo: {
columns: [],
dataSource: [],
},
subCompanyInfo: {
details: [],
serialenable: "0",
deptSerial: {
enable: "0",
key: "",
},
jobtitlesSerial: {
enable: "0",
key: "",
},
dateSerial: {
enable: "0",
key: "",
},
},
};
}
componentDidMount() {
this.getCodeSetting();
}
getCodeSetting = () => {
const { numberSet } = this.props;
numberSet
.getCodeSetting({ serialtype: "USER" })
.then(({ api_status, details, serialenable, dateSerial = {}, jobtitlesSerial = {}, deptSerial = {} }) => {
if (api_status && !_.isEmpty(details)) {
this.setState({
subCompanyInfo: { details, serialenable, dateSerial, jobtitlesSerial, deptSerial },
});
}
});
};
handleSubmit = () => {
let promise = new Promise((resolve, reject) => {
const { numberSet } = this.props;
const { dataSource, subCompanyInfo } = this.state;
const { serialenable, dateSerial, jobtitlesSerial, deptSerial } = subCompanyInfo;
const details = _.map(dataSource, (it, showorder) => {
const { numField, value: rulevalue } = it;
return {
ruletype: _.upperCase(numField),
rulevalue,
showorder,
};
});
const payload = {
datas: JSON.stringify({
serialenable,
details,
dateSerial,
jobtitlesSerial, deptSerial,
serialtype: "USER",
}),
};
this.setState({ loading: true });
numberSet.saveOrUpdateCodeSetting(payload).then(({ api_status }) => {
this.setState({ loading: false });
if (api_status) {
message.success("保存成功");
resolve(api_status);
} else {
reject("接口调用失败");
}
});
});
return promise;
};
handleChangeCode = (data) => {
const tmpV = _.filter(
data,
(it) =>
it.numField === "year" ||
it.numField === "month" ||
it.numField === "day" ||
it.numField === "subcompany" ||
it.numField === "department" ||
it.numField === "jobtitles"
);
this.setState({
dataSource: _.cloneDeep(data),
options: _.map(tmpV, (it) => {
const { numFieldName: showname, numField: key } = it;
return { key: _.upperCase(key), showname };
}),
});
};
handleSetNumber = (type, data = {}) => {
this.handleSubmit().then(() => {
const { numberSet } = this.props;
const { subCompanyInfo } = this.state;
const { dateSerial, deptSerial, jobtitlesSerial } = subCompanyInfo;
if (type === "start") {
const formatVal = dateSerial.key === "YEAR" ? "YYYY" : dateSerial.key === "MONTH" ? "YYYY-MM" : "YYYY-MM-DD";
let payload = {
coderuleid: 3,
type: dateSerial.enable == '1' ? dateSerial.key : '',
dateStart: data.startDate ? data.startDate : moment().format(formatVal),
dateEnd: data.endDate ? data.endDate : moment().format(formatVal),
subCompanyId: data.subCompanyId ? data.subCompanyId : "",
deptId: data.deptId ? data.deptId : "",
jobtitlesId: data.jobtitlesId ? data.jobtitlesId : "",
};
if (deptSerial.enable === '1' && deptSerial.key === 'SUBCOMPANY' && !data.subCompanyId) return
if (deptSerial.enable === '1' && deptSerial.key === 'DEPARTMENT' && !data.deptId) return
if (jobtitlesSerial.enable === '1' && !data.jobtitlesId) return
if (deptSerial.enable === '1' && data.subCompanyId) {
payload = { ...payload, type: payload.type + ',' + deptSerial.key }
}
if (jobtitlesSerial.enable === '1' && data.jobtitlesId) {
payload = { ...payload, type: payload.type + ',' + jobtitlesSerial.key }
}
numberSet
.getStartNumForm(payload)
.then(({ api_status, columns, dataSource }) => {
if (api_status) {
this.setState({
startNumberInfo: { columns, dataSource },
});
}
});
} else {
numberSet.getAdvanceSearchCondition();
numberSet.getSearchReservedCodeList({
serialtype: "USER",
checkboxType: "multi",
});
}
});
};
handleChangeTable = (newColumns, datas) => {
this.setState({
startNumberInfo: {
...this.state.startNumberInfo,
columns: newColumns,
dataSource: datas,
},
});
};
handleSubmitStartNumber = () => {
const { numberSet } = this.props;
const payload = {
datas: JSON.stringify({
coderuleid: 4,
...this.state.startNumberInfo,
}),
};
numberSet.saveStartNum(payload).then(({ api_status }) => {
if (api_status) {
message.success("保存成功");
this.numberSetRef.handleClose();
}
});
};
/**
* name: 删除预留编号
* param {*} ids
* return {*}
*/
deleteReservedNumber = (ids) => {
const { numberSet } = this.props;
numberSet.deleteReservedCodeById({ ids }).then(({ api_status }) => {
if (api_status) {
message.success("删除成功");
numberSet.getSearchReservedCodeList({
serialtype: "USER",
checkboxType: "multi",
});
}
});
};
/**
* name:新增预留编号
* return {*}
*/
handleAddReservedNumber = () => {
const { numberSet } = this.props;
const { reservedForm } = numberSet;
const { options } = this.state;
numberSet.getReservedCodeFrom({ serialtype: "USER" }).then(() => {
const type = _.get(_.last(options), ['key']);
const format = type === "YEAR" ? "YYYY" : type === "MONTH" ? "YYYY-MM" : "YYYY-MM-DD"
const payload = {
coderuleid: 3,
type,
dateStart: moment().format(format),
dateEnd: moment().format(format),
subCompanyId: "",
deptId: "",
jobtitlesId: "",
};
numberSet
.getStartNumForm(payload)
.then(({ api_status, dataSource }) => {
if (api_status && !_.isEmpty(dataSource)) {
const currentnumber = _.get(_.last(dataSource), ['startnum']);
reservedForm.updateFields({
currentnumber: {
value: currentnumber,
},
});
}
});
})
};
/**
* name: 保存预留设置
* param {*} params
* return {*}
*/
handleSubmitReservedNumber = (params) => {
const { numberSet } = this.props;
const payload = { ...params, serialtype: "USER" };
numberSet.saveReservedCode(payload).then(({ api_status }) => {
if (api_status) {
message.success("保存成功");
this.numberSetRef.handleCloseReservedModal();
numberSet.getSearchReservedCodeList({
serialtype: "USER",
checkboxType: "multi",
});
}
});
};
/**
* name:提示文本
* return {*}
*/
helpContent = () => {
return (
<div>
<p>开启后可根据设置的部门编号规则自动生成部门编号涉及场景如下</p>
<p>1.手动新建和手动编辑部门时可选择重新生成编号和选择预留部门编号</p>
<p>2.导入人员-添加时新创建的部门可自动生成部门编号</p>
<p>3.组织结构导入-添加新部门且部门编号列为空时可自动生成部门编号</p>
<p>注意开启前请先确认部门编号字段已启用</p>
</div>
);
};
render() {
const { options, subCompanyInfo, loading, startNumberInfo } = this.state;
const { numberSet } = this.props;
const { details, serialenable, dateSerial, jobtitlesSerial, deptSerial } = subCompanyInfo;
const btns = [
<Button type="primary" onClick={this.handleSubmit} loading={loading}>
保存
</Button>,
];
const dropMenuDatas = [
{
key: "save",
disabled: false,
icon: <i className="icon-coms-Preservation" />,
content: "保存",
onClick: (key) => this.handleSubmit(),
},
];
return (
<div className="dept-number-set">
<WeaTop
title={i18n.label.userNumSetting()}
icon={<i className="icon-coms-hrm" />}
iconBgcolor="#217346"
buttons={btns}
showDropIcon={true}
dropMenuDatas={dropMenuDatas}
/>
<div className="dept-content">
<div className="switch-wrapper">
<WeaFormItem
label="人员编号自动生成"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}>
<WeaCheckbox
value={serialenable}
helpfulTip={this.helpContent}
helpfulTipProps={{ placement: "top" }}
display="switch"
id="num-set-switch"
onChange={(checkVal) =>
this.setState({
subCompanyInfo: {
...subCompanyInfo,
serialenable: checkVal,
},
})
}
/>
</WeaFormItem>
</div>
{/* 内容区 */}
{serialenable === "1" && (
<Fragment>
<div className="numberComposition">
<WeaSearchGroup title={"编号组成"} showGroup>
<NumberComposition
onChange={this.handleChangeCode}
dataSource={details}
options={[...serialFieldOptions, ...resourceSerialFieldOptions]}
/>
</WeaSearchGroup>
</div>
{!_.isEmpty(options) && (
<div className="codeNumbering">
<WeaSearchGroup title={"编号流水规则"} showGroup>
{
!_.isEmpty(_.filter(options, item => ["YEAR", "MONTH", "DAY"].includes(item.key))) &&
<div className="switch-wrapper" style={{ paddingBottom: !_.isEmpty(_.filter(options, item => !["YEAR", "MONTH", "DAY"].includes(item.key))) && 0 }}>
<WeaFormItem
label="日期单独流水"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}>
<div className="codeNumbering-operateWapper">
<WeaCheckbox
value={dateSerial.enable ? dateSerial.enable : "0"}
display="switch"
id="dept-date-set-switch"
onChange={(isSingle) =>
this.setState({
subCompanyInfo: {
...subCompanyInfo,
dateSerial: {
...dateSerial,
enable: isSingle,
key: isSingle == '0' ? 'YEAR' : dateSerial.key
},
},
})
}
/>
{dateSerial.enable == "1" && (
<WeaSelect
options={_.map(_.filter(options, item => ["YEAR", "MONTH", "DAY"].includes(item.key)), it => ({ ...it, showname: it.showname.substr(2, 1) }))}
value={dateSerial.key}
detailtype={3}
supportCancel
onChange={(key) =>
this.setState({
subCompanyInfo: {
...subCompanyInfo,
dateSerial: {
...dateSerial,
key,
},
},
})
}
/>
)}
<WeaHelpfulTip
width={200}
title="开启后可设置按年、按月或按天单独流水如设置按年单独流水那每年的1月1日开始流水号从001开始重新流水。"
placement="topLeft"
/>
</div>
</WeaFormItem>
</div>
}
{
!_.isEmpty(_.filter(options, item => ["SUBCOMPANY", "DEPARTMENT"].includes(item.key))) &&
<div className="switch-wrapper" style={{ paddingBottom: !_.isEmpty(_.filter(options, item => !["JOBTITLES"].includes(item.key))) && 0 }}>
<WeaFormItem
label="机构单独流水"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}>
<div className="codeNumbering-operateWapper">
<WeaCheckbox
value={deptSerial.enable ? deptSerial.enable : "0"}
display="switch"
id="dept-set-switch"
onChange={(isSingle) =>
this.setState({
subCompanyInfo: {
...subCompanyInfo,
deptSerial: {
...deptSerial,
enable: isSingle,
},
},
})
}
/>
{deptSerial.enable == "1" && (
<WeaSelect
options={_.map(_.filter(options, item => ["SUBCOMPANY", "DEPARTMENT"].includes(item.key)), it => ({ ...it, showname: it.showname.substr(0, 2) }))}
value={deptSerial.key}
detailtype={3}
supportCancel
onChange={(key) =>
this.setState({
subCompanyInfo: {
...subCompanyInfo,
deptSerial: {
...deptSerial,
key,
},
},
})
}
/>
)}
<WeaHelpfulTip
width={200}
title="开启后,可选择按分部进行单独流水"
placement="topLeft"
/>
</div>
</WeaFormItem>
</div>
}
{
!_.isEmpty(_.filter(options, item => ["JOBTITLES"].includes(item.key))) &&
<div className="switch-wrapper">
<WeaFormItem
label="岗位单独流水"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}>
<div className="codeNumbering-operateWapper">
<WeaCheckbox
value={jobtitlesSerial.enable ? jobtitlesSerial.enable : "0"}
display="switch"
id="dept-set-switch"
onChange={(isSingle) =>
this.setState({
subCompanyInfo: {
...subCompanyInfo,
jobtitlesSerial: {
...jobtitlesSerial,
enable: isSingle,
},
},
})
}
/>
<WeaHelpfulTip
width={200}
title="开启后,可选择按岗位进行单独流水"
placement="topLeft"
/>
</div>
</WeaFormItem>
</div>
}
</WeaSearchGroup>
</div>
)}
<div className="startReservedNumberSet">
<WeaSearchGroup
title={"起始编号及预留编号设置"}
showGroup
center>
<StartReservedNumberSet
ref={(dom) => (this.numberSetRef = dom)}
onSet={this.handleSetNumber}
companyInfo={subCompanyInfo}
loading={loading}
startNumberInfo={startNumberInfo}
onChange={this.handleChangeTable}
onSaveStartNumber={this.handleSubmitStartNumber}
onDeleteReservedNumber={this.deleteReservedNumber}
onAddReservedNumber={this.handleAddReservedNumber}
onSubmitReservedNumber={this.handleSubmitReservedNumber}
onSearchReservedNumberset={() =>
numberSet.getSearchReservedCodeList({
serialtype: "USER",
checkboxType: "multi",
})
}
/>
</WeaSearchGroup>
</div>
</Fragment>
)}
</div>
</div>
);
}
}

View File

@ -0,0 +1,371 @@
import React, { Component } from "react";
import { Menu, message, Modal, Tree } from "antd";
import { WeaInputSearch } from "ecCom";
import { i18n } from "../../../public/i18n";
import NewAndEditDialog from "../../NewAndEditDialog";
import { inject, observer } from "mobx-react";
import { toJS } from "mobx";
import "../index.less";
const confirm = Modal.confirm;
const TreeNode = Tree.TreeNode;
@inject("officeManageStore")
@observer
class LeftTree extends Component {
constructor(props) {
super(props);
this.state = {
loading: false,
expandedKeys: [],
treeData: [],
copyTree: [],
copyExpandedKeys: [],
searchValue: "",
rightClickNodeTreeItem: null
};
}
componentDidMount() {
this.getTreeData();
document.addEventListener("click", this.handleClick);
}
componentWillUnmount() {
document.removeEventListener("click", this.handleClick);
}
componentWillReceiveProps(nextProps) {
if (
nextProps.deleteOfficeClassifyFlag !== this.props.deleteOfficeClassifyFlag
) {
const { officeManageStore } = this.props;
const { officeClassifyId } = officeManageStore;
this.handleDelete(officeClassifyId);
}
}
getTreeData = () => {
const { officeManageStore } = this.props;
officeManageStore.getTreeData().then(res => {
const { code, data, msg } = res;
if (code === 200) {
let cp = JSON.stringify([data]);
this.setState({
treeData: [data],
expandedKeys: this.expandedKeysFun([data]),
copyTree: cp,
copyExpandedKeys: []
});
} else {
message.error(res.msg);
}
});
};
handleClick = () => {
this.setState({ rightClickNodeTreeItem: null });
};
onSelect = node => {
const { officeManageStore } = this.props;
const [postId] = node;
const officeId = !postId
? officeManageStore.officeClassifyId
: postId !== "-1" ? postId : "";
officeManageStore.setOfficeClassifyId(officeId);
officeManageStore.getPostInfoTable(officeId);
this.setState({
rightClickNodeTreeItem: null
});
};
treeNodeonRightClick = e => {
this.setState({
rightClickNodeTreeItem: {
pageX: e.event.pageX,
pageY: e.event.pageY,
id: e.node.props["eventKey"],
categoryName: e.node.props["data-title"]
}
});
};
arrayTreeFilter = (data, predicate, filterText) => {
const nodes = data;
if (!(nodes && nodes.length)) {
return;
}
const newChildren = [];
for (const node of nodes) {
if (predicate(node, filterText)) {
newChildren.push(node);
node.children = this.arrayTreeFilter(
node.children,
predicate,
filterText
);
} else {
const subs = this.arrayTreeFilter(node.children, predicate, filterText);
if ((subs && subs.length) || predicate(node, filterText)) {
node.children = subs;
newChildren.push(node);
}
}
}
return newChildren;
};
filterFn = (data, filterText) => {
if (!filterText) {
return true;
}
return new RegExp(filterText, "i").test(data.title);
};
flatTreeFun = treeData => {
let arr = [];
const flatTree = treeData => {
treeData.map((item, index) => {
arr.push(item);
if (item.children && item.children.length > 0) {
flatTree(item.children);
item.children = [];
}
});
};
flatTree(treeData);
return arr;
};
expandedKeysFun = treeData => {
if (treeData && treeData.length == 0) {
return [];
}
let arr = [];
const expandedKeysFn = treeData => {
treeData.map((item, index) => {
arr.push(item.key);
if (item.children && item.children.length > 0) {
expandedKeysFn(item.children);
}
});
};
expandedKeysFn(treeData);
return arr;
};
onChange = value => {
if (_.isEmpty(value)) {
let { copyTree, copyExpandedKeys, expandedKeys } = this.state;
this.setState({
treeData: JSON.parse(copyTree),
expandedKeys,
searchValue: value
});
} else {
let { copyTree } = this.state;
let res = this.arrayTreeFilter(
JSON.parse(copyTree),
this.filterFn,
value
);
let expkey = this.expandedKeysFun(res);
this.setState({
treeData: res,
expandedKeys: expkey,
searchValue: value
});
}
};
getNodeTreeRightClickMenu = () => {
const { pageX, pageY } = { ...this.state.rightClickNodeTreeItem };
const tmpStyle = {
position: "absolute",
left: `${pageX}px`,
top: `${pageY}px`
};
const menu = (
<Menu
onClick={this.handleMenuClick}
style={tmpStyle}
className="rightmenu">
<Menu.Item key="ADD">新增</Menu.Item>
<Menu.Item key="DELETE">删除</Menu.Item>
</Menu>
);
return this.state.rightClickNodeTreeItem == null ? "" : menu;
};
handleMenuClick = menu => {
const { officeManageStore } = this.props;
const { id } = this.state.rightClickNodeTreeItem;
const { key } = menu;
switch (key) {
case "ADD":
officeManageStore.getPostForm();
officeManageStore.setOfficeVisible(true);
break;
case "DELETE":
confirm({
title: i18n.confirm.defaultTitle(),
content: i18n.confirm.delete(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk: () => this.handleDelete(id),
onCancel() {
return false;
}
});
break;
default:
break;
}
};
renderTreeNode = data => {
//生成树结构函数
if (data.length == 0) {
return;
}
let { expandedKeys, searchValue } = this.state;
return data.map(item => {
const index = item.title.indexOf(searchValue);
const beforeStr = item.title.substr(0, index);
const afterStr = item.title.substr(index + searchValue.length);
const title =
index > -1
? <span>
{beforeStr}
<span style={{ color: "red" }}>
{searchValue}
</span>
{afterStr}
</span>
: <span>
{item.title}
</span>;
if (item.children && item.children.length > 0) {
return (
<TreeNode key={item.key} title={title} className="tree-node">
{this.renderTreeNode(item.children)}
</TreeNode>
);
}
return <TreeNode key={item.key} title={title} className="tree-node"/>;
});
};
onExpand = keys => {
const { expandedKeys } = this.state;
this.setState({
expandedKeys: expandedKeys.includes("-1") ? [] : keys
});
};
handleSave = () => {
const {
form1,
savePost,
updatePost,
officeClassifyId,
officeVisible
} = this.props.officeManageStore;
form1.validateForm().then(f => {
if (f.isValid) {
// 验证通过, balabala业务代码
const payload = { ...form1.getFormParams(), id: officeClassifyId };
const result =
officeClassifyId && officeVisible.type === "editPlan"
? updatePost(payload)
: savePost(payload);
this.setState({ loading: true });
result.then(({ code, msg }) => {
this.setState({ loading: false });
if (code === 200) {
message.success(
officeClassifyId && officeVisible.type === "editPlan"
? "编辑成功"
: "新增成功"
);
this.getTreeData();
this.props.officeManageStore.setOfficeVisible({
bool: false,
type: officeVisible.type
});
} else {
message.error(msg || "新增失败");
}
});
} else {
f.showErrors();
this.setState({ date: new Date() }); // 改变一个state的变量,强制页面刷新
}
});
};
handleDelete = ids => {
const { deleteByIds } = this.props.officeManageStore;
deleteByIds({ ids }).then(({ code, msg }) => {
if (code === 200) {
message.success("删除成功");
this.props.officeManageStore.setOfficeClassifyId("");
this.getTreeData();
} else {
message.error(msg || "删除失败");
}
});
};
render() {
let { expandedKeys, treeData, searchValue, loading } = this.state;
const { officeManageStore } = this.props;
const {
officeCondition,
form1,
officeVisible,
officeClassifyId
} = officeManageStore;
return (
<div>
<div style={{ padding: 10 }}>
<WeaInputSearch
value={searchValue}
style={{ width: "100%" }}
onChange={this.onChange}
/>
</div>
<Tree
onExpand={this.onExpand}
expandedKeys={expandedKeys}
// 右击注释
// onRightClick={this.treeNodeonRightClick}
onSelect={this.onSelect}>
{this.renderTreeNode(treeData)}
</Tree>
{this.getNodeTreeRightClickMenu()}
<NewAndEditDialog
ecId={`${(this && this.props && this.props.ecId) ||
""}_NewAndEditDialog@q4rrwm`}
title={
officeClassifyId && officeVisible.type === "editPlan"
? i18n.label.editOfficeClassifyName()
: i18n.label.newOfficeClassifyName()
}
visible={officeVisible.bool}
condition={toJS(officeCondition)}
form={form1}
isFormInit={form1.isFormInit}
loading={loading}
isEdit={true}
height={150}
conditionLen={1}
save={() => this.handleSave()}
onCancel={() =>
officeManageStore.setOfficeVisible({
bool: false,
type: officeVisible.type
})}
/>
</div>
);
}
}
export default LeftTree;

View File

@ -0,0 +1,22 @@
// office-wapper
.office-wapper {
height: 100%;
display: flex;
flex-direction: column;
.rightmenu {
border-right: none;
box-shadow: 0 2px 8px rgb(0, 0, 0 /15%);
.ant-menu-item {
padding: 0 40px;
}
}
.tree-node {
.ant-tree-node-content-wrapper {
width: 100%;
}
}
}

View File

@ -0,0 +1,524 @@
import React, { Component } from "react";
import { toJS } from "mobx";
import { inject, observer } from "mobx-react";
import { i18n } from "../../public/i18n";
import LeftTree from "./components/leftTree";
import NewAndEditDialog from "../NewAndEditDialog";
import { WeaFormItem, WeaLeftRightLayout, WeaRightMenu, WeaTab, WeaTop } from "ecCom";
import { Button, Col, message, Modal, Row, Spin, Switch } from "antd";
import { WeaSwitch, WeaTableNew } from "comsMobx";
import "./index.less";
import { renderNoright } from "../../util";
import ImportDialog from '../ImportDialog';
const confirm = Modal.confirm;
const WeaTable = WeaTableNew.WeaTable;
@inject("officeManageStore")
@inject('importDialog')
@observer
export default class OfficeManage extends Component {
constructor(props) {
super(props);
this.state = {
date: "",
editId: "",
loading: false,
deleteOfficeClassifyFlag: false
};
}
componentDidMount() {
const { officeManageStore } = this.props;
officeManageStore.getTreeData && officeManageStore.getTreeData();
officeManageStore.getHasRight && officeManageStore.getHasRight();
officeManageStore.getPostInfoTable && officeManageStore.getPostInfoTable();
}
getDropMenuDatas = () => {
const { officeManageStore } = this.props;
const { rightMenu } = officeManageStore;
let menus = [];
toJS(rightMenu).map((item, index) => {
let obj = {
key: item.menuFun,
icon: <i className={`${item.menuIcon}`}/>,
content: item.menuName
};
if (
item.menuFun == "collection" ||
item.menuFun == "help" ||
item.menuFun == "pageAddress"
) {
obj.disabled = true;
}
menus.push(obj);
});
return menus;
};
showlog = () => {
window.setLogViewProp({
logMoudleType: 6,
keys: new Date().getTime()
});
};
handleMenuClick = key => {
const { officeManageStore,importDialog } = this.props;
const { isPanelShow, tableStore, officeClassifyId } = officeManageStore;
isPanelShow && officeManageStore.setPanelStatus(false);
switch (key) {
case "new":
officeManageStore.getPostInfoForm({ planId: officeClassifyId });
officeManageStore.setVisible(true);
officeManageStore.setNeDialogTitle(i18n.label.newOfficeName());
break;
case "log":
this.showlog();
break;
case "custom":
tableStore.setColSetVisible(true);
tableStore.tableColSet(true);
break;
case "import":
importDialog.importVisible=true;
importDialog.importModule='postInfo';
importDialog.current = 0;
importDialog.getImportForm();
break;
default:
break;
}
};
handleSave() {
const {
form,
condition,
savePostInfo,
updatePostInfo
} = this.props.officeManageStore;
const { editId } = this.state;
form.validateForm().then(f => {
if (f.isValid) {
// 验证通过, balabala业务代码
const payload = editId
? { ...form.getFormParams(), id: editId }
: { ...form.getFormParams() };
this.setState({ loading: true });
if (editId) {
updatePostInfo(payload).then(({ code, msg }) => {
this.setState({ loading: false });
if (code === 200) {
message.success("编辑成功");
this.setState({ editId: "" }, () => {
this.props.officeManageStore.setVisible(false);
this.props.officeManageStore.getPostInfoTable(this.props.officeManageStore.officeClassifyId);
});
} else {
message.error(msg || "编辑失败");
}
});
return;
}
savePostInfo(payload).then(({ code, msg }) => {
this.setState({ loading: false });
if (code === 200) {
message.success("新增成功");
this.setState({ editId: "" }, () => {
this.props.officeManageStore.setVisible(false);
this.props.officeManageStore.getPostInfoTable(this.props.officeManageStore.officeClassifyId);
});
} else {
message.error(msg || "新增失败");
}
});
} else {
f.showErrors();
this.setState({ date: new Date() }); // 改变一个state的变量,强制页面刷新
}
});
}
getTopMenuBtns = () => {
const { officeManageStore,importDialog } = this.props;
const { topMenu, tableStore, officeClassifyId } = officeManageStore;
let btns = [];
topMenu.map((item, i) => {
if (item.menuFun !== "batchDelete" && item.menuFun !== "delPlan") {
btns.push(
<Button
type="primary"
disabled={item.menuFun == "editPlan" && !officeClassifyId}
onClick={() => {
const { officeManageStore } = this.props;
if (item.menuFun == "new") {
officeManageStore.isPanelShow &&
officeManageStore.setPanelStatus(false);
officeManageStore.getPostInfoForm({ planId: officeClassifyId });
officeManageStore.setVisible(true);
officeManageStore.setNeDialogTitle(i18n.label.newOfficeName());
} else if (
item.menuFun == "addPlan" ||
item.menuFun == "editPlan"
) {
officeManageStore.getPostForm(
item.menuFun == "editPlan" ? officeClassifyId : ""
);
officeManageStore.setOfficeVisible({
bool: true,
type: item.menuFun
});
}else if(item.menuFun == "import") {
importDialog.importVisible=true;
importDialog.importModule='postInfo';
importDialog.current = 0;
importDialog.getImportForm();
}
}}>
{item.menuName}
</Button>
);
} else if (item.menuFun === "delPlan") {
btns.push(
<Button
type="primary"
onClick={() => {
confirm({
title: i18n.confirm.defaultTitle(),
content: i18n.confirm.delete(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk: () => {
this.setState({
deleteOfficeClassifyFlag: !this.state
.deleteOfficeClassifyFlag
});
},
onCancel() {
return false;
}
});
}}
disabled={
!officeClassifyId ||
(officeClassifyId && !_.isEmpty(toJS(tableStore.datas)))
}>
{item.menuName}
</Button>
);
} else {
btns.push(
<Button
type="primary"
onClick={() => {
const { officeManageStore } = this.props;
const { tableStore } = officeManageStore;
const ids = toJS(tableStore.selectedRowKeys).toString();
this.showConfirm("batchDel", ids);
}}
disabled={tableStore.selectedRowKeys.length > 0 ? false : true}>
{item.menuName}
</Button>
);
}
});
return btns;
};
showConfirm = (v, ids) => {
confirm({
title: i18n.confirm.defaultTitle(),
content:
v == "del" ? i18n.confirm.delete() : i18n.confirm.batchDeleteConfirm(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk: () => this.deletePostinfoByIds(ids),
onCancel() {
return false;
}
});
};
deletePostinfoByIds = ids => {
const { officeManageStore } = this.props;
const { deletePostinfoByIds } = officeManageStore;
deletePostinfoByIds({ ids }).then(({ code, msg }) => {
if (code === 200) {
message.success("删除成功");
officeManageStore.getPostInfoTable(officeManageStore.officeClassifyId);
} else {
message.error(msg || "删除失败");
}
});
};
reRenderColumns = columns => {
let _this = this;
columns.forEach((c, index) => {
if (c.dataIndex == "forbidden_tag") {
c.render = function (text, record) {
return (
<Switch
checked={record.forbidden_tag == "0" ? true : false}
onChange={checked => {
confirm({
title: i18n.confirm.defaultTitle(),
content:
record.forbidden_tag === "0" ? "确定禁用该记录吗?" : "确定启用该记录吗?",
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk: () => _this.updateForbiddenTag(checked, record.id),
onCancel() {
return false;
}
});
}}
/>
);
};
}
});
};
updateForbiddenTag = (forbiddentag, id) => {
const { officeManageStore } = this.props;
const { updateForbiddenTagById } = officeManageStore;
const payload = {
id,
forbiddentag
};
updateForbiddenTagById(payload).then(({ code, msg }) => {
if (code === 200) {
message.success("操作成功");
officeManageStore.getPostInfoTable(officeManageStore.officeClassifyId, true);
} else {
message.error(msg || "操作失败");
}
});
};
onOperatesClick = (record, index, operate) => {
operate.index == "0" && this.doEdit(record.randomFieldId);
operate.index === "1" && this.showConfirm("del", record.randomFieldId);
};
doEdit = editId => {
this.setState({ editId });
const { officeManageStore } = this.props;
officeManageStore.isPanelShow && officeManageStore.setPanelStatus(false);
officeManageStore.getPostInfoForm({ id: editId });
officeManageStore.setVisible(true);
officeManageStore.setNeDialogTitle(i18n.label.editOfficeName());
};
getPanelComponents = () => {
const { officeManageStore } = this.props;
const {
searchCondition,
form2,
searchConditionLoading
} = officeManageStore;
let arr = [];
let formParams = form2.getFormParams();
const { isFormInit } = form2;
isFormInit &&
searchCondition.map(c => {
c.items.map((field, index) => {
arr.push(
<Col
ecId={`${(this && this.props && this.props.ecId) ||
""}_Col@4cc308@${index}`}
span={index % 2 == 0 ? 10 : 11}
offset={1}>
<div style={{ marginTop: 20 }}>
<WeaFormItem
ecId={`${(this && this.props && this.props.ecId) ||
""}_WeaFormItem@u6ex85@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
{
<WeaSwitch
ecId={`${(this && this.props && this.props.ecId) ||
""}_WeaSwitch@p7d3td@${index}`}
fieldConfig={field}
form={form2}
formParams={formParams}
/>
}
</WeaFormItem>
</div>
</Col>
);
});
});
if (searchConditionLoading) {
return (
<div className="hrm-loading-center-small" style={{ top: "25%" }}>
<Spin
ecId={`${(this && this.props && this.props.ecId) ||
""}_Spin@lbktzb`}
spinning={searchConditionLoading}
/>
</div>
);
} else {
return (
<Row
ecId={`${(this && this.props && this.props.ecId) || ""}_Row@ppeb6z`}
onKeyDown={e => {
if (e.keyCode == 13 && e.target.tagName === "INPUT") {
officeManageStore.getPostInfoTable();
officeManageStore.setPanelStatus(false);
}
}}>
{arr}
</Row>
);
}
};
getTabBtn = () => {
const { officeManageStore } = this.props;
const { form2 } = officeManageStore;
const btn = [
<Button
ecId={`${(this && this.props && this.props.ecId) || ""}_Button@bx87i8`}
type="primary"
onClick={() => {
officeManageStore.getPostInfoTable();
officeManageStore.setPanelStatus(false);
}}>
{i18n.button.search()}
</Button>,
<Button
ecId={`${(this && this.props && this.props.ecId) || ""}_Button@218ju6`}
onClick={() => form2.reset()}>
{i18n.button.reset()}
</Button>,
<Button
ecId={`${(this && this.props && this.props.ecId) || ""}_Button@5u9mfz`}
onClick={() => officeManageStore.setPanelStatus(false)}>
{i18n.button.cancel()}
</Button>
];
return btn;
};
onSearchChange = val => {
const { officeManageStore } = this.props;
const { form2 } = officeManageStore;
officeManageStore.setPostInfoName(val);
!_.isEmpty(form2.getFormParams()) && officeManageStore.updateFields(val);
};
render() {
const { officeManageStore,importDialog } = this.props;
const { date, loading, deleteOfficeClassifyFlag } = this.state;
const {
isPanelShow,
form2,
postInfoName,
conditionNum,
tableStore,
nEdialogTitle,
visible,
condition,
form,
dialogLoading,
hasRight
} = officeManageStore;
const {importVisible} = importDialog;
if (hasRight === false) {
return renderNoright();
}
return (
hasRight && <div className="office-wapper">
<WeaTop
ecId={`${(this && this.props && this.props.ecId) ||
""}_WeaTop@446d12`}
title={i18n.label.officeName()}
icon={<i className="icon-coms-hrm"/>}
iconBgcolor="#217346"
loading={true}
buttons={this.getTopMenuBtns()}
showDropIcon={true}
dropMenuDatas={this.getDropMenuDatas()}
onDropMenuClick={e => this.handleMenuClick(e)}>
</WeaTop>
<WeaLeftRightLayout
isNew={true}
leftCom={
<LeftTree deleteOfficeClassifyFlag={deleteOfficeClassifyFlag}/>
}>
<WeaRightMenu
ecId={`${(this && this.props && this.props.ecId) ||
""}_WeaRightMenu@cea97d`}
datas={this.getDropMenuDatas()}
onClick={key => this.handleMenuClick(key)}>
<WeaTab
ecId={`${(this && this.props && this.props.ecId) ||
""}_WeaTab@39c727`}
searchType={["base", "advanced"]}
showSearchAd={isPanelShow}
searchsBaseValue={
_.isEmpty(form2.getFormParams())
? postInfoName
: form2.getFormParams().postInfoName
}
setShowSearchAd={bool => officeManageStore.setPanelStatus(bool)}
hideSearchAd={() => officeManageStore.setPanelStatus(false)}
searchsAd={isPanelShow ? this.getPanelComponents() : <div/>}
advanceHeight={Math.ceil(conditionNum / 2) * 52 + 20}
hasMask={false}
buttonsAd={this.getTabBtn()}
onSearch={() => officeManageStore.getPostInfoTable()}
onSearchChange={val => this.onSearchChange(val)}
/>
<WeaTable
ecId={`${(this && this.props && this.props.ecId) ||
""}_WeaTable@b43a4c`}
comsWeaTableStore={tableStore}
hasOrder={true}
needScroll={true}
rowSelection={{
getCheckboxProps: record => {
console.log(record);
return {
disabled: true // 配置无法勾选的列
};
}
}}
getColumns={c => this.reRenderColumns(c)}
onOperatesClick={(record, index, operate) =>
this.onOperatesClick(record, index, operate)}
/>
<NewAndEditDialog
ecId={`${(this && this.props && this.props.ecId) ||
""}_NewAndEditDialog@q4rrwm`}
title={nEdialogTitle}
visible={visible}
condition={toJS(condition)}
form={form}
isFormInit={form.isFormInit}
loading={dialogLoading || loading}
isEdit={true}
height={400}
conditionLen={1}
save={() => this.handleSave()}
onCancel={() => {
officeManageStore.setVisible(false);
this.setState({ editId: "" });
}}
/>
</WeaRightMenu>
{importVisible && <ImportDialog ecId={`${this && this.props && this.props.ecId || ''}_ImportDialog@633i8k`} />}
</WeaLeftRightLayout>
</div>
);
}
}

View File

@ -0,0 +1,476 @@
import React from 'react'
import * as mobx from 'mobx'
import {
inject,
observer,
} from 'mobx-react'
import {
WeaTop,
WeaTab,
WeaFormItem,
WeaRightMenu,
WeaLeftRightLayout,
WeaLeftTree
} from 'ecCom'
import {
Row,
Col,
Spin,
Modal,
Button,
message,
Switch
} from 'antd'
import {
WeaSwitch,
WeaTableNew
} from 'comsMobx'
import {
i18n
} from '../../public/i18n';
import '../../style/common.less';
import NewAndEditDialog from '../NewAndEditDialog';
import { renderNoright } from '../../util';
const toJS = mobx.toJS;
const confirm = Modal.confirm;
const WeaTable = WeaTableNew.WeaTable;
@inject('jobGrade')
@observer
export default class JobGrade extends React.Component {
constructor(props) {
super(props);
}
componentWillMount() {
}
componentDidMount() {
this.init();
}
componentWillReceiveProps(nextProps) {
const {
jobGrade
} = this.props;
if (this.props.location.key !== nextProps.location.key) {
this.init();
}
}
init() {
const {
jobGrade
} = this.props;
jobGrade.getHasRight();
jobGrade.initData();
}
getTopMenuBtns() {
const {
jobGrade
} = this.props;
const {
topMenu,
tableStore
} = jobGrade;
let btns = [];
topMenu.map((item, i) => {
if (item.menuFun !== 'batchDelete') {
btns.push(<Button type='primary' onClick={() => this.handleClick(item)}>{item.menuName}</Button>);
} else {
btns.push(<Button type='primary' onClick={() => this.handleClick(item)} disabled={tableStore.selectedRowKeys.length > 0 ? false : true} >{item.menuName}</Button>);
}
});
return btns;
}
handleClick(item) {
const {
jobGrade
} = this.props;
const {
isPanelShow
} = jobGrade;
isPanelShow && jobGrade.setPanelStatus(false);
this[item.menuFun] && this[item.menuFun]();
}
new() {
const {
jobGrade
} = this.props;
jobGrade.setNeDialogTitle(i18n.label.newJobGrade());
jobGrade.setIsNew(true);
jobGrade.setVisible(true);
jobGrade.getForm();
}
custom = () => {
const {
jobGrade
} = this.props, {
tableStore,
} = jobGrade;
tableStore.setColSetVisible(true);
tableStore.tableColSet(true);
}
batchDelete() {
const {
jobGrade
} = this.props;
const {
tableStore
} = jobGrade;
let keys = toJS(tableStore.selectedRowKeys).toString();
jobGrade.setIds(keys);
this.showConfirm('batchDel');
}
showConfirm(v) {
let _this = this;
confirm({
title: i18n.confirm.defaultTitle(),
content: (v == 'del') ? i18n.confirm.delete() : i18n.confirm.batchDeleteConfirm(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
_this.onOk();
},
onCancel() {
return false;
},
});
}
onOk() {
const {
jobGrade
} = this.props;
jobGrade.delete();
}
getDropMenuDatas() {
const {
jobGrade
} = this.props;
const {
rightMenu
} = jobGrade;
let menus = [];
toJS(rightMenu).map((item, index) => {
let obj = {
key: item.menuFun,
icon: <i className={`${item.menuIcon}`} />,
content: item.menuName,
}
if (item.menuFun == 'collection' || item.menuFun == 'help' || item.menuFun == 'pageAddress') {
obj.disabled = true;
}
menus.push(obj);
})
return menus;
}
handleMenuClick(key) {
const {
jobGrade
} = this.props;
const {
isPanelShow
} = jobGrade;
isPanelShow && jobGrade.setPanelStatus(false);
this[key] && this[key]();
}
getTabBtn() {
const {
jobGrade
} = this.props;
const {
form2
} = jobGrade;
const btn = [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@bx87i8`} type="primary" onClick={() => {
jobGrade.getTableInfo(); jobGrade.setPanelStatus(false)
}}>{i18n.button.search()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@218ju6`} onClick={() => form2.reset()}>{i18n.button.reset()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@5u9mfz`} onClick={() => jobGrade.setPanelStatus(false)}>{i18n.button.cancel()}</Button>),
];
return btn;
}
onSearchChange(val) {
const {
jobGrade
} = this.props;
const {
form2
} = jobGrade;
jobGrade.setGradeName(val);
!this.isEmptyObject(form2.getFormParams()) && jobGrade.updateFields(val);
}
changeData(key) {
const {
jobGrade
} = this.props;
jobGrade.changeData(key);
}
reRenderColumns(columns) {
let _this = this;
columns.forEach((c, index) => {
if (c.dataIndex == 'forbidden_tag') {
c.render = function (text, record) {
return <Switch checked={record.forbidden_tag == "0" ? true : false} onChange={checked => _this.updateForbiddenTag(checked, record.id)} />
}
};
})
}
updateForbiddenTag(checked, id) {
const {
jobGrade
} = this.props;
confirm({
title: i18n.confirm.defaultTitle(),
content: (checked == true) ? i18n.confirm.enableTag() : i18n.confirm.forbiddenTag(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
jobGrade.updateForbiddenTag(checked, id);
},
onCancel() {
return false;
},
});
}
onOperatesClick(record, rowIndex, operate) {
const {
index
} = operate;
(index == '0') && this.doEdit(record.randomFieldId);
(index == '1') && this.doDel(record.randomFieldId);
}
doEdit(id) {
const {
jobGrade
} = this.props;
jobGrade.setNeDialogTitle(i18n.label.editJobGrade());
jobGrade.setGradeId(id);
jobGrade.setIsNew(false);
jobGrade.setVisible(true);
jobGrade.getForm();
}
doDel(id) {
const {
jobGrade
} = this.props;
jobGrade.setIds(id);
this.showConfirm('del');
}
handleSave() {
const {
jobGrade
} = this.props;
const {
isNew
} = jobGrade;
isNew && jobGrade.save();
!isNew && jobGrade.edit();
}
log = () => {
window.setLogViewProp({
logMoudleType: 3,
keys: new Date().getTime(),
});
}
getPanelComponents() {
const {
jobGrade
} = this.props;
const {
searchCondition,
form2,
searchConditionLoading
} = jobGrade;
let arr = [];
let formParams = form2.getFormParams();
const {
isFormInit
} = form2;
isFormInit && searchCondition.map(c => {
c.items.map((field, index) => {
arr.push(<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@4cc308@${index}`} span={(index % 2 == 0) ? 10 : 11} offset={1}>
<div style={{ marginTop: 20 }}>
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@u6ex85@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
{<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@p7d3td@${index}`} fieldConfig={field} form={form2} formParams={formParams} />}
</WeaFormItem>
</div>
</Col>)
})
})
if (searchConditionLoading) {
return (
<div className='hrm-loading-center-small' style={{ top: '25%' }}>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@lbktzb`} spinning={searchConditionLoading}></Spin>
</div>
)
} else {
return <Row ecId={`${this && this.props && this.props.ecId || ''}_Row@ppeb6z`} onKeyDown={(e) => {
if (e.keyCode == 13 && e.target.tagName === "INPUT") {
jobGrade.getTableInfo();
jobGrade.setPanelStatus(false)
}
}}>{arr}</Row>
}
}
//非空判断
isEmptyObject(obj) {
for (let key in obj) {
return false;
}
return true;
}
render() {
const {
jobGrade
} = this.props;
const {
isPanelShow, form2, gradeName, conditionNum, tableStore, nEdialogTitle, visible, condition,
form, dialogLoading, isEdit, selectedKey, topTab, topTabCount, date, hasRight, treeConfig, treeLoading
} = jobGrade;
if (hasRight === false) {
return renderNoright();
}
const {
data,
onSelectedTreeNode,
selectedKeys,
onExpand,
treeExpandKeys
} = toJS(treeConfig);
const treeCom = (
hasRight && <WeaLeftTree ecId={`${this && this.props && this.props.ecId || ''}_WeaLeftTree@ifgbi1`}
datas={data}
searchLabel={"等级方案"}
onSelect={onSelectedTreeNode}
selectedKeys={selectedKeys}
onExpand={onExpand}
loading={treeLoading}
expandedKeys={treeExpandKeys} />
)
return (
hasRight && <div ref='page' style={{ height: '100%' }}>
<WeaRightMenu ecId={`${this && this.props && this.props.ecId || ''}_WeaRightMenu@k6oc4u`}
datas={this.getDropMenuDatas()}
onClick={key => this.handleMenuClick(key)}
>
<WeaTop ecId={`${this && this.props && this.props.ecId || ''}_WeaTop@bj98s7`}
title={i18n.label.gradeName()}
icon={<i className='icon-coms-hrm' />}
iconBgcolor='#217346'
loading={true}
buttons={this.getTopMenuBtns()}
showDropIcon={true}
dropMenuDatas={this.getDropMenuDatas()}
onDropMenuClick={(e) => this.handleMenuClick(e)}
>
<WeaLeftRightLayout ecId={`${this && this.props && this.props.ecId || ''}_WeaLeftRightLayout@q6b87k`} leftCom={treeCom}>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@9c3zts`}
datas={topTab}
counts={topTabCount}
keyParam="viewCondition" //主键
countParam="groupId" //数量
selectedKey={selectedKey}
onChange={this.changeData.bind(this)}
searchType={['base', 'advanced']}
showSearchAd={isPanelShow}
searchsBaseValue={this.isEmptyObject(form2.getFormParams()) ? gradeName : form2.getFormParams().gradeName}
setShowSearchAd={bool => jobGrade.setPanelStatus(bool)}
hideSearchAd={() => jobGrade.setPanelStatus(false)}
searchsAd={isPanelShow ? this.getPanelComponents() : <div></div>}
advanceHeight={Math.ceil(conditionNum / 2) * 52 + 20}
hasMask={false}
buttonsAd={this.getTabBtn()}
onSearch={() => jobGrade.getTableInfo()}
onSearchChange={val => this.onSearchChange(val)}
/>
<WeaTable ecId={`${this && this.props && this.props.ecId || ''}_WeaTable@pgmg3x`}
comsWeaTableStore={tableStore}
hasOrder={true}
needScroll={true}
getColumns={c => this.reRenderColumns(c)}
onOperatesClick={(record, index, operate) => this.onOperatesClick(record, index, operate)}
/>
</WeaLeftRightLayout>
</WeaTop>
</WeaRightMenu>
<NewAndEditDialog ecId={`${this && this.props && this.props.ecId || ''}_NewAndEditDialog@q4rrwm`}
title={nEdialogTitle}
visible={visible}
condition={toJS(condition)}
form={form}
isFormInit={form.isFormInit}
loading={dialogLoading}
isEdit={isEdit}
height={280}
conditionLen={1}
save={() => this.handleSave()}
onCancel={() => jobGrade.setVisible(false)}
moduleName={"jobGrade"}
bindChangeEnvent={val => jobGrade.updateConditions(val)}
/>
</div>
)
}
}

View File

@ -0,0 +1,469 @@
import React from 'react'
import * as mobx from 'mobx'
import {
inject,
observer,
} from 'mobx-react'
import {
WeaTop,
WeaTab,
WeaFormItem,
WeaRightMenu,
WeaLeftRightLayout,
WeaLeftTree
} from 'ecCom'
import {
Row,
Col,
Spin,
Modal,
Button,
message,
Switch
} from 'antd'
import {
WeaSwitch,
WeaTableNew
} from 'comsMobx'
import {
i18n
} from '../../public/i18n';
import '../../style/common.less';
import NewAndEditDialog from '../NewAndEditDialog';
import { renderNoright } from '../../util';
const toJS = mobx.toJS;
const confirm = Modal.confirm;
const WeaTable = WeaTableNew.WeaTable;
@inject('jobLevel')
@observer
export default class JobLevel extends React.Component {
constructor(props) {
super(props);
}
componentWillMount() {
}
componentDidMount() {
this.init();
}
componentWillReceiveProps(nextProps) {
const {
jobLevel
} = this.props;
if (this.props.location.key !== nextProps.location.key) {
this.init();
}
}
init() {
const {
jobLevel
} = this.props;
jobLevel.getHasRight();
jobLevel.initData();
}
getTopMenuBtns() {
const {
jobLevel
} = this.props;
const {
topMenu,
tableStore
} = jobLevel;
let btns = [];
topMenu.map((item, i) => {
if (item.menuFun !== 'batchDelete') {
btns.push(<Button type='primary' onClick={() => this.handleClick(item)}>{item.menuName}</Button>);
} else {
btns.push(<Button type='primary' onClick={() => this.handleClick(item)} disabled={tableStore.selectedRowKeys.length > 0 ? false : true} >{item.menuName}</Button>);
}
});
return btns;
}
handleClick(item) {
const {
jobLevel
} = this.props;
const {
isPanelShow
} = jobLevel;
isPanelShow && jobLevel.setPanelStatus(false);
this[item.menuFun] && this[item.menuFun]();
}
new() {
const {
jobLevel
} = this.props;
jobLevel.setNeDialogTitle(i18n.label.newJobLevel());
jobLevel.setIsNew(true);
jobLevel.setVisible(true);
jobLevel.getForm();
}
batchDelete() {
const {
jobLevel
} = this.props;
const {
tableStore
} = jobLevel;
let keys = toJS(tableStore.selectedRowKeys).toString();
jobLevel.setIds(keys);
this.showConfirm('batchDel');
}
showConfirm(v) {
let _this = this;
confirm({
title: i18n.confirm.defaultTitle(),
content: (v == 'del') ? i18n.confirm.delete() : i18n.confirm.batchDeleteConfirm(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
_this.onOk();
},
onCancel() {
return false;
},
});
}
onOk() {
const {
jobLevel
} = this.props;
jobLevel.delete();
}
getDropMenuDatas() {
const {
jobLevel
} = this.props;
const {
rightMenu
} = jobLevel;
let menus = [];
toJS(rightMenu).map((item, index) => {
let obj = {
key: item.menuFun,
icon: <i className={`${item.menuIcon}`} />,
content: item.menuName,
}
if (item.menuFun == 'collection' || item.menuFun == 'help' || item.menuFun == 'pageAddress') {
obj.disabled = true;
}
menus.push(obj);
})
return menus;
}
handleMenuClick(key) {
const {
jobLevel
} = this.props;
const {
isPanelShow
} = jobLevel;
isPanelShow && jobLevel.setPanelStatus(false);
this[key] && this[key]();
}
getTabBtn() {
const {
jobLevel
} = this.props;
const {
form2
} = jobLevel;
const btn = [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@bx87i8`} type="primary" onClick={() => {
jobLevel.getTableInfo(); jobLevel.setPanelStatus(false)
}}>{i18n.button.search()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@218ju6`} onClick={() => form2.reset()}>{i18n.button.reset()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@5u9mfz`} onClick={() => jobLevel.setPanelStatus(false)}>{i18n.button.cancel()}</Button>),
];
return btn;
}
onSearchChange(val) {
const {
jobLevel
} = this.props;
const {
form2
} = jobLevel;
jobLevel.setLevelName(val);
!this.isEmptyObject(form2.getFormParams()) && jobLevel.updateFields(val);
}
changeData(key) {
const {
jobLevel
} = this.props;
jobLevel.changeData(key);
}
reRenderColumns(columns) {
let _this = this;
columns.forEach((c, index) => {
if (c.dataIndex == 'forbidden_tag') {
c.render = function (text, record) {
return <Switch checked={record.forbidden_tag == "0" ? true : false} onChange={checked => _this.updateForbiddenTag(checked, record.id)} />
}
};
})
}
updateForbiddenTag(checked, id) {
const {
jobLevel
} = this.props;
confirm({
title: i18n.confirm.defaultTitle(),
content: (checked == true) ? i18n.confirm.enableTag() : i18n.confirm.forbiddenTag(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
jobLevel.updateForbiddenTag(checked, id);
},
onCancel() {
return false;
},
});
}
onOperatesClick(record, rowIndex, operate) {
const {
index
} = operate;
(index == '0') && this.doEdit(record.randomFieldId);
(index == '1') && this.doDel(record.randomFieldId);
}
custom = () => {
const {
jobLevel
} = this.props, {
tableStore,
} = jobLevel;
tableStore.setColSetVisible(true);
tableStore.tableColSet(true);
}
doEdit(id) {
const {
jobLevel
} = this.props;
jobLevel.setNeDialogTitle(i18n.label.editJobLevel());
jobLevel.setLevelId(id);
jobLevel.setIsNew(false);
jobLevel.setVisible(true);
jobLevel.getForm();
}
doDel(id) {
const {
jobLevel
} = this.props;
jobLevel.setIds(id);
this.showConfirm('del');
}
handleSave() {
const {
jobLevel
} = this.props;
const {
isNew
} = jobLevel;
isNew && jobLevel.save();
!isNew && jobLevel.edit();
}
getPanelComponents() {
const {
jobLevel
} = this.props;
const {
searchCondition,
form2,
searchConditionLoading
} = jobLevel;
let arr = [];
let formParams = form2.getFormParams();
const {
isFormInit
} = form2;
isFormInit && searchCondition.map(c => {
c.items.map((field, index) => {
arr.push(<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@4cc308@${index}`} span={(index % 2 == 0) ? 10 : 11} offset={1}>
<div style={{ marginTop: 20 }}>
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@u6ex85@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
{<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@p7d3td@${index}`} fieldConfig={field} form={form2} formParams={formParams} />}
</WeaFormItem>
</div>
</Col>)
})
})
if (searchConditionLoading) {
return (
<div className='hrm-loading-center-small' style={{ top: '25%' }}>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@lbktzb`} spinning={searchConditionLoading}></Spin>
</div>
)
} else {
return <Row ecId={`${this && this.props && this.props.ecId || ''}_Row@ppeb6z`} onKeyDown={(e) => {
if (e.keyCode == 13 && e.target.tagName === "INPUT") {
jobLevel.getTableInfo();
jobLevel.setPanelStatus(false)
}
}}>{arr}</Row>
}
}
//非空判断
isEmptyObject(obj) {
for (let key in obj) {
return false;
}
return true;
}
log = () => {
window.setLogViewProp({
logMoudleType: 2,
keys: new Date().getTime(),
});
}
render() {
const {
jobLevel
} = this.props;
const {
isPanelShow, form2, levelName, conditionNum, tableStore, nEdialogTitle, visible, condition,
form, dialogLoading, isEdit, selectedKey, topTab, topTabCount, date, hasRight, treeConfig, treeLoading
} = jobLevel;
if (hasRight === false) {
return renderNoright();
}
const {
data,
onSelectedTreeNode,
selectedKeys,
onExpand,
treeExpandKeys
} = toJS(treeConfig);
const treeCom = (
<WeaLeftTree ecId={`${this && this.props && this.props.ecId || ''}_WeaLeftTree@ifgbi1`}
datas={data}
searchLabel={"等级方案"}
onSelect={onSelectedTreeNode}
selectedKeys={selectedKeys}
onExpand={onExpand}
loading={treeLoading}
expandedKeys={treeExpandKeys} />
)
return (
hasRight && <div ref='page' style={{ height: '100%' }}>
<WeaRightMenu ecId={`${this && this.props && this.props.ecId || ''}_WeaRightMenu@k6oc4u`}
datas={this.getDropMenuDatas()}
onClick={key => this.handleMenuClick(key)}
>
<WeaTop ecId={`${this && this.props && this.props.ecId || ''}_WeaTop@bj98s7`}
title={i18n.label.levelName()}
icon={<i className='icon-coms-hrm' />}
iconBgcolor='#217346'
loading={true}
buttons={this.getTopMenuBtns()}
showDropIcon={true}
dropMenuDatas={this.getDropMenuDatas()}
onDropMenuClick={(e) => this.handleMenuClick(e)}
>
<WeaLeftRightLayout ecId={`${this && this.props && this.props.ecId || ''}_WeaLeftRightLayout@q6b87k`} leftCom={treeCom}>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@9c3zts`}
datas={topTab}
counts={topTabCount}
keyParam="viewCondition" //主键
countParam="groupId" //数量
selectedKey={selectedKey}
onChange={this.changeData.bind(this)}
searchType={['base', 'advanced']}
showSearchAd={isPanelShow}
searchsBaseValue={this.isEmptyObject(form2.getFormParams()) ? levelName : form2.getFormParams().levelName}
setShowSearchAd={bool => jobLevel.setPanelStatus(bool)}
hideSearchAd={() => jobLevel.setPanelStatus(false)}
searchsAd={isPanelShow ? this.getPanelComponents() : <div></div>}
advanceHeight={Math.ceil(conditionNum / 2) * 52 + 20}
hasMask={false}
buttonsAd={this.getTabBtn()}
onSearch={() => jobLevel.getTableInfo()}
onSearchChange={val => this.onSearchChange(val)}
/>
<WeaTable ecId={`${this && this.props && this.props.ecId || ''}_WeaTable@pgmg3x`}
comsWeaTableStore={tableStore}
hasOrder={true}
needScroll={true}
getColumns={c => this.reRenderColumns(c)}
onOperatesClick={(record, index, operate) => this.onOperatesClick(record, index, operate)}
/>
</WeaLeftRightLayout>
</WeaTop>
</WeaRightMenu>
<NewAndEditDialog ecId={`${this && this.props && this.props.ecId || ''}_NewAndEditDialog@q4rrwm`}
title={nEdialogTitle}
visible={visible}
condition={toJS(condition)}
form={form}
isFormInit={form.isFormInit}
loading={dialogLoading}
isEdit={isEdit}
height={250}
conditionLen={1}
save={() => this.handleSave()}
onCancel={() => jobLevel.setVisible(false)}
/>
</div>
)
}
}

View File

@ -0,0 +1,443 @@
import React from 'react'
import * as mobx from 'mobx'
import {
inject,
observer
} from 'mobx-react'
import {
WeaTop,
WeaTab,
WeaFormItem,
WeaRightMenu,
WeaAlertPage
} from 'ecCom'
import {
Row,
Col,
Spin,
Modal,
Button,
message,
Switch
} from 'antd'
import {
WeaSwitch,
WeaTableNew
} from 'comsMobx'
import {
i18n
} from '../../public/i18n';
import '../../style/common.less';
import NewAndEditDialog from '../NewAndEditDialog';
import { renderNoright } from '../../util'; // 从util文件引入公共的方法
const toJS = mobx.toJS;
const confirm = Modal.confirm;
const WeaTable = WeaTableNew.WeaTable;
@inject('rankScheme')
@observer
export default class RankScheme extends React.Component {
constructor(props) {
super(props);
}
componentWillMount() {
}
componentDidMount() {
this.init();
}
componentWillUnmount() {
}
componentWillReceiveProps(nextProps) {
const {
rankScheme
} = this.props;
if (this.props.location.key !== nextProps.location.key) {
this.init();
}
}
init() {
const {
rankScheme
} = this.props;
rankScheme.getTableInfo();
rankScheme.getHasRight();
}
getTopMenuBtns() {
const {
rankScheme
} = this.props;
const {
topMenu,
tableStore
} = rankScheme;
let btns = [];
topMenu.map((item, i) => {
if (item.menuFun !== 'batchDelete') {
btns.push(<Button type='primary' onClick={() => this.handleClick(item)}>{item.menuName}</Button>);
} else {
btns.push(<Button type='primary' onClick={() => this.handleClick(item)} disabled={tableStore.selectedRowKeys.length > 0 ? false : true} >{item.menuName}</Button>);
}
});
return btns;
}
handleClick(item) {
const {
rankScheme
} = this.props;
const {
isPanelShow
} = rankScheme;
isPanelShow && rankScheme.setPanelStatus(false);
this[item.menuFun] && this[item.menuFun]();
}
new() {
const {
rankScheme
} = this.props;
rankScheme.setNeDialogTitle(i18n.label.newRankScheme());
rankScheme.setIsNew(true);
rankScheme.setVisible(true);
rankScheme.getForm();
}
batchDelete() {
const {
rankScheme
} = this.props;
const {
tableStore
} = rankScheme;
let keys = toJS(tableStore.selectedRowKeys).toString();
rankScheme.setIds(keys);
this.showConfirm('batchDel');
}
showConfirm(v) {
let _this = this;
confirm({
title: i18n.confirm.defaultTitle(),
content: (v == 'del') ? i18n.confirm.delete() : i18n.confirm.batchDeleteConfirm(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
_this.onOk();
},
onCancel() {
return false;
},
});
}
onOk() {
const {
rankScheme
} = this.props;
rankScheme.delete();
}
getDropMenuDatas() {
const {
rankScheme
} = this.props;
const {
rightMenu
} = rankScheme;
let menus = [];
toJS(rightMenu).map((item, index) => {
let obj = {
key: item.menuFun,
icon: <i className={`${item.menuIcon}`} />,
content: item.menuName,
}
if (item.menuFun == 'collection' || item.menuFun == 'help' || item.menuFun == 'pageAddress') {
obj.disabled = true;
}
menus.push(obj);
})
return menus;
}
handleMenuClick(key) {
const {
rankScheme
} = this.props;
const {
isPanelShow
} = rankScheme;
isPanelShow && rankScheme.setPanelStatus(false);
this[key] && this[key]();
}
getTabBtn() {
const {
rankScheme
} = this.props;
const {
form2
} = rankScheme;
const btn = [
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@bx87i8`} type="primary" onClick={() => {
rankScheme.getTableInfo(); rankScheme.setPanelStatus(false)
}}>{i18n.button.search()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@218ju6`} onClick={() => form2.reset()}>{i18n.button.reset()}</Button>),
(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@5u9mfz`} onClick={() => rankScheme.setPanelStatus(false)}>{i18n.button.cancel()}</Button>),
];
return btn;
}
custom = () => {
const {
rankScheme
} = this.props, {
tableStore,
} = rankScheme;
tableStore.setColSetVisible(true);
tableStore.tableColSet(true);
}
onSearchChange(val) {
const {
rankScheme
} = this.props;
const {
form2
} = rankScheme;
rankScheme.setSchemeName(val);
!this.isEmptyObject(form2.getFormParams()) && rankScheme.updateFields(val);
}
reRenderColumns(columns) {
let _this = this;
columns.forEach((c, index) => {
if (c.dataIndex == 'forbidden_tag') {
c.render = function (text, record) {
return <Switch checked={record.forbidden_tag == "0" ? true : false} onChange={checked => _this.updateForbiddenTag(checked, record.id)} />
}
};
})
}
updateForbiddenTag(checked, id) {
const {
rankScheme
} = this.props;
confirm({
title: i18n.confirm.defaultTitle(),
content: (checked == true) ? i18n.confirm.enableTag() : i18n.confirm.forbiddenTag(),
okText: i18n.button.ok(),
cancelText: i18n.button.cancel(),
onOk() {
rankScheme.updateForbiddenTag(checked, id);
},
onCancel() {
return false;
},
});
}
onOperatesClick(record, rowIndex, operate) {
const {
index
} = operate;
(index == '0') && this.doEdit(record.randomFieldId);
(index == '1') && this.doDel(record.randomFieldId);
}
doEdit(id) {
const {
rankScheme
} = this.props;
rankScheme.setNeDialogTitle(i18n.label.editRankScheme());
rankScheme.setSchemeId(id);
rankScheme.setIsNew(false);
rankScheme.setVisible(true);
rankScheme.getForm();
}
doDel(id) {
const {
rankScheme
} = this.props;
rankScheme.setIds(id);
this.showConfirm('del');
}
log = () => {
window.setLogViewProp({
logMoudleType: 1,
keys: new Date().getTime(),
});
}
handleSave() {
const {
rankScheme
} = this.props;
const {
isNew
} = rankScheme;
isNew && rankScheme.save();
!isNew && rankScheme.edit();
}
getPanelComponents() {
const {
rankScheme
} = this.props;
const {
searchCondition,
form2,
searchConditionLoading
} = rankScheme;
let arr = [];
let formParams = form2.getFormParams();
const {
isFormInit
} = form2;
isFormInit && searchCondition.map(c => {
c.items.map((field, index) => {
arr.push(<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@4cc308@${index}`} span={(index % 2 == 0) ? 10 : 11} offset={1}>
<div style={{ marginTop: 20 }}>
<WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@u6ex85@${index}`}
label={`${field.label}`}
labelCol={{ span: `${field.labelcol}` }}
wrapperCol={{ span: `${field.fieldcol}` }}>
{<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@p7d3td@${index}`} fieldConfig={field} form={form2} formParams={formParams} />}
</WeaFormItem>
</div>
</Col>)
})
})
if (searchConditionLoading) {
return (
<div className='hrm-loading-center-small' style={{ top: '25%' }}>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@lbktzb`} spinning={searchConditionLoading}></Spin>
</div>
)
} else {
return <Row ecId={`${this && this.props && this.props.ecId || ''}_Row@ppeb6z`} onKeyDown={(e) => {
if (e.keyCode == 13 && e.target.tagName === "INPUT") {
rankScheme.getTableInfo();
rankScheme.setPanelStatus(false)
}
}}>{arr}</Row>
}
}
//非空判断
isEmptyObject(obj) {
for (let key in obj) {
return false;
}
return true;
}
render() {
const {
rankScheme
} = this.props;
const {
isPanelShow, form2, schemeName, conditionNum, tableStore, nEdialogTitle, visible, condition,
form, dialogLoading, isEdit, date, hasRight
} = rankScheme;
if (hasRight === false) {
return renderNoright();
}
return (
hasRight && <div ref='page' style={{ height: '100%' }}>
<WeaRightMenu ecId={`${this && this.props && this.props.ecId || ''}_WeaRightMenu@k6oc4u`}
datas={this.getDropMenuDatas()}
onClick={key => this.handleMenuClick(key)}
>
<WeaTop ecId={`${this && this.props && this.props.ecId || ''}_WeaTop@bj98s7`}
title={i18n.label.schemeName()}
icon={<i className='icon-coms-hrm' />}
iconBgcolor='#217346'
loading={true}
buttons={this.getTopMenuBtns()}
showDropIcon={true}
dropMenuDatas={this.getDropMenuDatas()}
onDropMenuClick={(e) => this.handleMenuClick(e)}
>
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@9c3zts`}
searchType={['base', 'advanced']}
showSearchAd={isPanelShow}
searchsBaseValue={this.isEmptyObject(form2.getFormParams()) ? schemeName : form2.getFormParams().schemeName}
setShowSearchAd={bool => rankScheme.setPanelStatus(bool)}
hideSearchAd={() => rankScheme.setPanelStatus(false)}
searchsAd={isPanelShow ? this.getPanelComponents() : <div></div>}
advanceHeight={Math.ceil(conditionNum / 2) * 52 + 20}
hasMask={false}
buttonsAd={this.getTabBtn()}
onSearch={() => rankScheme.getTableInfo()}
onSearchChange={val => this.onSearchChange(val)}
/>
<WeaTable ecId={`${this && this.props && this.props.ecId || ''}_WeaTable@pgmg3x`}
comsWeaTableStore={tableStore}
hasOrder={true}
needScroll={true}
getColumns={c => this.reRenderColumns(c)}
onOperatesClick={(record, index, operate) => this.onOperatesClick(record, index, operate)}
/>
</WeaTop>
</WeaRightMenu>
<NewAndEditDialog ecId={`${this && this.props && this.props.ecId || ''}_NewAndEditDialog@q4rrwm`}
title={nEdialogTitle}
visible={visible}
condition={toJS(condition)}
form={form}
isFormInit={form.isFormInit}
loading={dialogLoading}
isEdit={isEdit}
height={200}
conditionLen={1}
save={() => this.handleSave()}
onCancel={() => rankScheme.setVisible(false)}
/>
</div>
)
}
}

View File

@ -0,0 +1,61 @@
import {
WeaFormItem,
} from 'ecCom'
import {
Spin,
Button,
Timeline
} from 'antd'
import {
i18n
} from '../../public/i18n';
import '../../style/common.less';
export default class AnchorDetect extends React.Component {
constructor(props) {
super(props);
this.state = {
}
}
componentDidMount() {
}
componentWillUnmount() {
}
render() {
const {
anchorList,
activity,
onChange
} = this.props;
const activityStyle = {
color:"#4aacf4"
}
return (
<div className='right'>
<Timeline>
{
anchorList.map((item,index) => {
return(
<Timeline.Item color={activity == index ? 'blue' : 'gray'} dot={activity == index ? <i className="icon-coms-position" color='#4aacf4'/> : ''}>
<span style={activity == index ? activityStyle : {}} className='title' onClick={() => onChange(item.id,index)}>{item.title}</span>
</Timeline.Item>
)
})
}
</Timeline>
</div>
)
}
}

View File

@ -0,0 +1,91 @@
import {
observer
} from 'mobx-react';
import {
WeaTransfer,
WeaInputSearch,
WeaSelect
} from 'ecCom';
import {
toJS
} from 'mobx';
import isEmpty from 'lodash/isEmpty'
import {
Spin
} from 'antd'
@observer
export default class Customization extends React.Component {
constructor(props) {
super(props);
}
rightHeader = () => {
const {
store
} = this.props, {
transfer,
inputSearchStyle,
search,
customTemplates,
templates,
searchTemplateId,
customTemplateId
} = store, {
transferRightIptVal,
} = transfer;
return (
<div className="trasfer-header">
<span>已选</span>
<WeaInputSearch
style={inputSearchStyle}
value={transferRightIptVal}
onSearchChange={store.updateTransferRightptVal}
/>
<WeaSelect
style={store.selectStyle}
options={search ? templates : customTemplates}
value={search ? searchTemplateId : customTemplateId}
onChange={v => store.getTemplateSelectKeys(v)}
/>
</div>
)
}
render() {
const {
store
} = this.props, {
TRANSFER,
transfer,
leftHeader,
rightHeader,
searchDialog,
search
} = store, {
transferDatas,
transferKeys
} = transfer;
return (
<div className='customization' style={{ padding: 20 }}>
{
!searchDialog.loading ? <WeaTransfer
{...TRANSFER}
data={toJS(transferDatas)}
selectedKeys={toJS(transferKeys)}
leftHeader={leftHeader}
rightHeader={rightHeader}
/> : <div className='hrm-loading-center-small' style={{ top: '25%' }}>
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@lbktzb`} spinning={searchDialog.loading}></Spin>
</div>
}
</div>
);
}
}

Some files were not shown because too many files have changed in this diff Show More