1 项目说明
1.1 工作说明
01.常见信息
a.环节
时间:
地点(内容):
人物(沟通):
-----------------------------------------------------------------------------------------------------
描述:
问题:
临时解决:
建议解决:
沟通人:
-----------------------------------------------------------------------------------------------------
1.明确:任务
2.确定:工期
3.沟通:业务逻辑
4.沟通:找XXX处理XXX的问题
5.原则:妥协、替代、临时、商量
b.转正前
文档驱动
编译、运行、构建、部署
优先级:临时、漏洞、日常
-----------------------------------------------------------------------------------------------------
刘润生,业务交接
赵仁梓,防火墙检查
安谦,编码问题,文件上传找不到
庞灿,生产前端build,接口优化,git合并分支
周志晨,控制层no mapper,大小写问题,金蝶工作流
庞灿,编码问题,前端路由重复注册,后端上传文件重命名规则
潘春林,调试单体服务,解决前端大屏适配、传值问题,mybatisplus多租户引发sql解析失败
c.转正后
设备异常信息共享平台
工作任务跟踪管理:迁移维修管理的新旧工号
中冠钢铁管理平台:负责hs相关的业务,比如【员工薪资】、【员工合同】
员工入职管理平台:负责全部业务代码
设备处的相关业务:状态监测、精度管理、设备管理、点检系统;厂、线、设备;关联数据、画UI
02.常见信息
a.系统
举报投诉平台
门禁视频监控系统
晋钢采购业务系统
安全隐患管理系统
工作任务跟踪管理
费用预算管理系统
集团宿舍办理平台
集团报表管理系统
印章物联网管理平台
-----------------------------------------------------------------------------------------------------
集团点餐系统
智慧园区管理平台
b.工号
JG57240,张瑜
J057117,庞灿
J057279,周志晨
J055647,曹晨松
J056918,赵仁梓
J057035,贾梦飞
J046311,郭慧芳
J057568,靳辰科
J043367,王子豪
-----------------------------------------------------------------------------------------------------
庞灿,2720155362
赵仁梓,zhaorenzi
贾梦飞,jiamengfei
潘春林,panchunlin
周志晨,zhouzhichen
03.账号信息
a.Ejia
https://e.jggroup.cn/home/download.html
15135890769
qwER159263
19135308032
@Qwfqw001017
b.ERP
https://jgerp.jggroup.cn/erp/ds/jsp/dsjjNeweip.jsp
J057240
qwER159263
J056918,赵仁梓
001017
J046311,郭慧芳
06521
c.Gogs
zhangyu
qwER159263
-----------------------------------------------------------------------------------------------------
庞灿,2720155362
赵仁梓,zhaorenzi
贾梦飞,jiamengfei
潘春林,panchunlin
周志晨,zhouzhichen
d.Vmware
J001680,袁秀峰
-----------------------------------------------------------------------------------------------------
JG57240,张瑜
4023615
-----------------------------------------------------------------------------------------------------
JG56918,赵仁梓
JG56918
-----------------------------------------------------------------------------------------------------
J057117,庞灿
J057117
e.Gitlab
JinGanglntegrate 后端
JinGanglntegrate-system 小程序
JinGanglntegrate-ui PC
JinGangPark-app H5
-----------------------------------------------------------------------------------------------------
J057117
pc272015
git clone https://gitlab.jggroup.cn/JinGangIntegrate/jingangintegrate.git realtime-performance/release
git clone https://gitlab.jggroup.cn/JinGangIntegrate/jingangintegrate-ui.git realtime-performance/release
-------------------------------------------------------------------------------------------------
J057983
Ww2255456..
git clone https://[email protected]/JinGangIntegrate/jingangintegrate.git
git clone https://[email protected]/JinGangIntegrate/jingangintegrate-system.git
git clone https://[email protected]/JinGangIntegrate/jingangintegrate-ui.git realtime-performance/release
f.Gitlab
git clone -b onboard-J057240 https://[email protected]/JinGangIntegrate/jingangintegrate.git
git clone -b onboard-J057240 https://[email protected]/JinGangIntegrate/jingangintegrate-ui.git
-----------------------------------------------------------------------------------------------------
# 进入所在目录
cd /Volumes/Samsung/software_yare/jh4j-cloud/jingangintegrate/jh4j-product-onboard/jh4j-product-onboard-service/target
# 启动(后端运行)
java -Xms512m -Xmx2048m -jar jh4j-product-onboard-service-2.3.0.jar --spring.application.name=jh4j-product-onboard
-----------------------------------------------------------------------------------------------------
# 进入所在目录
cd /Volumes/Samsung/software_yare/jh4j-cloud/jingangintegrate-ui/
# 启动(前端运行)
npx vite --mode dev
-----------------------------------------------------------------------------------------------------
J057983个人访问令牌:用户设置 -> 访问令牌 -> 个人访问令牌
J057983个人访问令牌:glpat-aDcVvyz2iUpmd7Fx4jWs
g.请假情况
e.jggroup.cn
-> 19135308032、@Qwfqw001017
-> 管理中心 选择 业务中心
-> 智能审批 选择 流程管理 选择 流程监控,筛选表单 选择 发起人(在职) 选择 J057240
-> 智能审批 选择 流程中心 选择 已办,筛选表单 选择 发起人(在职) 选择 J057240
1.2 排查信息
00.程序位置
a.查看pid、查看程序目录
ps -ef | grep java --查看进程
------------------------------------------------------------------------
lsof -i:9981 --命令1:查找9981对应pid
ps -ef | grep java | grep 1723891 --命令2:查找pid对应java
tail -f jeecgboot-2025-02-06.0.log --命令3:查看日志
------------------------------------------------------------------------
ps -ef | grep $(lsof -ti:9981) --组合命令
ps -ef | grep $(lsof -ti:9981) | grep java --组合命令
kill -9 [pid]
b.curl测试
curl --location 'http://172.17.10.201:9981/jeecg-boot/mo/isp/getIndicator' \
--header 'Content-Type: application/json' \
--data '{
"indicatorDate": 202501
}'
c.前端日志
tail -f /var/log/nginx/access.log --访问日志
tail -f /var/log/nginx/error.log --错误日志
d.后端日志
cd /root/myprojects/logs/ --每天日志
tail -f jeecgboot-2025-02-06.0.log --实时日志ONObject dataParam = new JSONObject();
dataPa
e.停止、启动
ps -ef | grep java --查看进程
kill [pid] --优雅停机
------------------------------------------------------------------------
sh /root/hr-project/backend-start.sh start --启动
tail -f /root/hr-project/hr-backend/jeecg-module-system/jeecg-system-start/logs/jeecgboot-2025-03-02.0.log --日志
01.查看系统
a.使用uname -a命令
uname -a --显示系统内核版本
b.查看发行版特定的版本文件:
cat /etc/redhat-release --适用于RedHat/CentOS系统
cat /etc/debian_version --适用于Debian系统
cat /etc/ubuntu-release --适用于Ubuntu系统
c.使用hostnamectl命令
hostnamectl --查看主机名和其他信息(适用于systemd系统)
d.查看性能1
lscpu --查看 CPU 信息
cat /proc/cpuinfo --查看详细的 CPU 信息
free -h --查看内存信息
cat /proc/meminfo --查看详细的内存信息
------------------------------------------------------------------------
df -h --查看磁盘使用情况
top --查看系统负载和性能
vmstat --查看系统的虚拟内存、进程、CPU 活动等信息
------------------------------------------------------------------------
dmesg | grep -i vmware --查看是否vmware虚拟化机器
lscpu | grep -i hypervisor --查看是否vmware虚拟化机器
e.查看性能2
echo "=== CPU 信息 ==="
lscpu | grep -E '^CPU\(s\):|^Model name:|^Socket\(s\):|^Thread\(s\) per core:|^Core\(s\) per socket:'
echo -e "\n=== 内存信息 ==="
free -h
echo -e "\n=== 磁盘信息 ==="
df -h --total | grep 'total'
echo -e "\n=== 显卡信息 ==="
lspci | grep -i --color 'vga\|3d\|2d'
02.查看ip端口
a.netstat命令
yum install net-tools --安装 net-tools
netstat -tunlp | grep 9981 --查看具体某个端
b.ss命令
ss -tunlp | grep 9981 --查看具体某个端
c.lsof命令
yum install lsof --安装 lsof
lsof -i --查看所有网络连接
lsof -i:9981
d.firewall-cmd命令
firewall-cmd --list-ports --查看所有开放的端口
firewall-cmd --query-port=9981/tcp --查询某个端口是否开放
03.防火墙
a.systemctl
systemctl stop firewalld --关闭防火墙
systemctl disable firewalld --禁止开机自启
systemctl status firewalld --防火墙状态
systemctl start firewalld --开启防火墙
systemctl enable firewalld --开启开机自启
b.firewall-cmd
firewall-cmd --reload --重启防火墙
firewall-cmd --zone=public --add-port=3306/tcp --permanent --开放3306端口
firewall-cmd --zone=public --remove-port=3306/tcp --permanent --关闭3306端口
firewall-cmd --zone=public --list-ports --查看开放端口
firewall-cmd --zone=public --query-port=3306/tcp --查看具体端口
firewall-cmd --state --查看防火墙状态
04.nginx
a.查看nginx配置文件
cd /etc/nginx/
ls
cat nginx.conf
b.查看conf.d目录下的配置
cd /etc/nginx/conf.d/
ls
cat *.conf
c.查看sites-enabled目录(如果存在)
cd /etc/nginx/sites-enabled/
ls
d.检查nginx配置是否正确
nginx -t
e.查看nginx进程
ps -ef | grep nginx
f.访问日志
tail -f /var/log/nginx/access.log
g.错误日志
tail -f /var/log/nginx/error.log
05.自定义DNS
a.编辑hosts文件
vi /etc/hosts
# 添加格式如下:
# IP地址 域名
192.168.1.100 example.com
192.168.1.101 test.com
b.修改DNS服务器
vi /etc/resolv.conf
# 添加或修改nameserver
nameserver 8.8.8.8
nameserver 114.114.114.114
d.刷新DNS缓存
systemctl restart NetworkManager
# 或
nscd -i hosts # 如果安装了nscd
e.测试DNS解析
nslookup example.com
ping example.com
f.查看DNS是否生效
# 查看当前DNS服务器
cat /etc/resolv.conf
# 测试DNS解析
dig @8.8.8.8 example.com
06.系统编码
a.linux
[root@localhost hr-backend]# stat /etc/locale.conf
File: /etc/locale.conf
Size: 19 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 67431224 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2025-03-08 10:50:06.920797929 +0800
Modify: 2022-01-11 10:28:26.559915054 +0800
Change: 2022-01-11 10:28:26.559915054 +0800
Birth: 2022-01-11 10:28:26.558915052 +0800
-----------------------------------------------------------------------------------------------------
通常情况下,Java会使用操作系统的默认字符编码
Access 字段表示文件的最后访问时间,这是指文件内容最后一次被读取的时间,而不是文件被修改或更改的时间
b.查看编码
$ locale
$ cat /etc/locale.conf
-----------------------------------------------------------------------------------------------------
LANG=C.UTF-8 不提供特定语言的特性;用默认的、简单的格式 晋钢服务器,默认编码
LANG=en_US.UTF-8 美国英语的语言特性;美国的习惯格式化日期、时间、货币 腾讯云服务器,默认编码
c.查看系统安装的字符编码
$ locale -a
-----------------------------------------------------------------------------------------------------
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
C
C.utf8
POSIX
zh_CN
zh_CN.gb18030
zh_CN.gbk
zh_CN.utf8
zh_HK
zh_HK.utf8
zh_SG
zh_SG.gbk
zh_SG.utf8
zh_TW
zh_TW.euctw
zh_TW.utf8
d.生成编码
# 打开 /etc/locale.gen 文件
vi /etc/locale.gen
# 确保文件中包含以下行(如果没有,请添加)
C.UTF-8 UTF-8
# 生成语言环境
sudo locale-gen
# 设置默认语言环境
sudo update-locale LANG=C.UTF-8
e.修改编码
# 临时更改
export LANG=C.UTF-8
# 永久更改
vi /etc/locale.conf
LANG=C.UTF-8
# 更新当前会话
source /etc/locale.conf
f.其他说明
a.如果要设置中文版的字体编,在每个文件中增加以下内容
# cat /etc/profile.d/locale.sh
# vim /etc/profile.d/locale.sh
export LC_CTYPE=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
# cat /etc/locale.conf
# vim /etc/locale.conf
LANG=zh_CN.UTF-8
# cat /etc/sysconfig/i18n
# vim /etc/sysconfig/i18n
LANG=zh_CN.UTF-8
# cat /etc/environment
# vim /etc/environment
LANG=zh_CN.UTF-8
LC_ALL=zh_CN.UTF-8
# source /etc/profile.d/locale.sh
# source /etc/locale.conf
# source /etc/sysconfig/i18n
# source /etc/environment
b.如果要设置英文版的字体编码。在每个文件中增加以下内容
# cat /etc/profile.d/locale.sh
# vim /etc/profile.d/locale.sh
export LC_CTYPE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
# cat /etc/locale.conf
# vim /etc/locale.conf
LANG=en_US.UTF-8
# cat /etc/sysconfig/i18n
# vim /etc/sysconfig/i18n
LANG=en_US.UTF-8
# cat /etc/environment
# vim /etc/environment
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
# source /etc/profile.d/locale.sh
# source /etc/locale.conf
# source /etc/sysconfig/i18n
# source /etc/environment
c.临时更改
export LANG=C.UTF-8
export LANG=zh_CN.utf8
1.3 服务信息1
00.源点数智
a.分类1
账号:admin
密码:admin@Xxgcz2023
b.分类2
账号:admin
密码:123456
c.分类3
账号:zhangsan
密码:qwER159263!
01.服务器
a.分类1
网址:172.17.10.201
账号:root
密码:jdwg8966..
-----------------------------------------------------------------------------------------------------
网址:http://hr.app.jggroup.cn/
路径:/root/hr-project/hr-front,hr-backend
分支:produce-manager-0.1.1
数据:mysql://172.17.10.100:3306/jeecg-boot-task dev
数据:mysql://172.17.10.201:3306/jeecg-boot-task prod
-----------------------------------------------------------------------------------------------------
SSH:ssh [email protected]
打开;code . 或者 Alt + P
编码:export LANG=zh_CN.utf8
启动:nohup env LANG=zh_CN.utf8 java -jar -Dfile.encoding=zh_CN.utf8 $JAR_HOME > $LOG_PATH 2>&1 &
-----------------------------------------------------------------------------------------------------
# ps -ef | grep java
root 6350 1 0 1月12 ? 01:44:34 java -jar /root/project/sales/springboot/target/sales-springboot-0.0.1-SNAPSHOT.jar
root 7090 1 0 1月12 ? 23:02:58 java -jar target/pay-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
root 22118 1 0 1月15 ? 01:09:24 java -jar /root/trucks/trucks-coming-manager/CarInOutServer/target/CarInOutServer-0.0.1-SNAPSHOT.jar
root 854877 1 0 6月01 ? 01:13:49 java -jar /root/myprojects/my-erp/backend/jeecg-module-system/jeecg-system-start/target/jeecg-system-start-3.4.4.jar
root 1169601 1 0 3月02 ? 16:32:42 java -jar /root/SafetyManagement/SafetyManagement/jeecg-module-system/jeecg-system-start/target/jeecg-system-start-3.7.0.jar
root 1890106 1 0 2月13 ? 01:03:21 java -jar /root/deviceManager/device-manager/material_admin/material-server/target/material-server-0.0.1-SNAPSHOT.jar
root 3445006 1 0 2月18 ? 00:55:07 java -jar /root/hello/test/backend/target/backend-1.0.jar
root 3759714 1 0 4月04 ? 11:22:28 java -jar -Dfile.encoding=zh_CN.utf8 /root/hr-project/hr-backend/jeecg-module-system/jeecg-system-start/target/jeecg-system-start-3.4.4.jar
b.分类2
网址:172.17.8.25
账号:root
密码:9MZ@#b3@KAez
-----------------------------------------------------------------------------------------------------
路径:/home/java:bin、device-app、device-cloud、jar、logs、my-erp(废弃)
SSH:ssh [email protected]
编码:export LANG=zh_CN.utf8
c.分类3
网址:172.17.12.21
账号:root
密码:jdwg8966..
SSH:ssh [email protected]
编码:export LANG=zh_CN.utf8
d.分类4
网址:172.17.10.105
账号:administrator
密码:jMJ65v6Kd9@#tJd
平台:windows系统,黑框别左击,点了要暂停,要回车,缩小窗口
-----------------------------------------------------------------------------------------------------
网址:http://jeecgmobile.app.jggroup.cn/
路径:D:\project\jeecg-task\jeecg-task
分支:produce-manager
数据:mysql://172.17.10.100:3306/jeecg-boot-task
e.分类5
网址:172.17.12.67
账号:root
密码:f5GZyc3TQk)v
自动化:方式1(pom配置ssh)、方式2(jenkins)
-----------------------------------------------------------------------------------------------------
网址:172.17.12.67:3306
账号:root
密码:K9@pR3!sT7$qL2%
02.数据库
a.分类1
网址:172.17.10.100:3306
账号:springboot
密码:springboot
b.分类2
网址:172.17.10.201:3306
账号:spring_finance
密码:17JVP028
-----------------------------------------------------------------------------------------------------
网址:172.17.10.201:3306
账号:root
密码:admin@Xxgcz2023
c.分类3
数据:只有【读】权限
网址:jdbc:oracle:thin:@172.17.9.131:1521:jgdb
账号:java_report_user
密码:nPYCgZuIDIqXBVFF
版本:Release 12.2.0.1.0
-----------------------------------------------------------------------------------------------------
数据:dssxjg
网址:jdbc:oracle:thin:@172.17.12.202:1521:jgdb
账号:javauser
密码:u8OEQgXA
位置:../apache-tomcat-9.0.105/conf/server.xml
-----------------------------------------------------------------------------------------------------
数据:dssxjgmq
网址:jdbc:oracle:thin:@172.17.12.205:1521:jgdbpro
账号:javauser
密码:JgJ@vauser
位置:../apache-tomcat-9.0.105/conf/server.xml
-----------------------------------------------------------------------------------------------------
数据:dssxjgqs
网址:jdbc:oracle:thin:@172.17.12.205:1521:jgdb
账号:javauser
密码:JgJ@vauser
位置:../apache-tomcat-9.0.105/conf/server.xml
-----------------------------------------------------------------------------------------------------
数据:dssxjgmes
网址:jdbc:oracle:thin:@172.17.9.20:1521:jgdb
账号:imes
密码:sa
位置:../apache-tomcat-9.0.105/conf/server.xml
d.分类4
说明:设备专用数据库
网址:jdbc:mysql://172.17.8.25:3306/device_cloud
账号:java_erp_iqu
密码:VFVSQmVFMUVSVE09
-----------------------------------------------------------------------------------------------------
网址:jdbc:mysql://172.17.8.25:3306/device_cloud
账号:root
密码:3edc$RFV
-----------------------------------------------------------------------------------------------------
网址:jdbc:mysql://172.17.8.25:3307/jh4j-cloud-onboard
账号:root
密码:123456
03.设备工程领域
a.权限账号记录
a.E家账号
网址:https://e.jggroup.cn/home/
账号:19135308032
密码:@Qwfqw001017
b.ERP账号
网址(正式环境):https://jgerp.jggroup.cn/erp/ds/jsp/dsjjNeweip.jsp
账号:J056918
密码:001017
-------------------------------------------------------------------------------------------------
网址(测试环境):http://erp.app.jggroup.cn/erp/ds/jsp/dsjjPortal.jsp
账号:J046311
密码:06521
c.工程管理系统(宝信)
网址:https://ppms.jggroup.cn/ppms-ui-base/login
账号:J056918
密码:jg123456
d.精度管理系统(内网访问)
网址:http://172.17.12.21:7000/index
账号:admin
密码:001017
e.智能点巡检(点检系统、在线检测)
网址:https://monitor.jggroup.cn/
账号:J057240
密码:aic123456
b.系统数据库记录
a.erp数据库(Orcale,只有查权限)
url: jdbc:oracle:thin:@172.17.9.131:1521:jgdb
username: java_report_user
password: nPYCgZuIDIqXBVFF
driver-class-name: oracle.jdbc.driver.OracleDriver
b.事故共享平台数据库(MySQL)
url:jdbc:mysql://172.17.8.25:3306/device_cloud?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: java_erp_iqu
password: VFVSQmVFMUVSVE09
driver-class-name: com.mysql.cj.jdbc.Driver
c.精度系统数据库(PostgreSQL)
driverClassName: org.postgresql.Driver
url: jdbc:postgresql://172.17.17.34:5432/bdia_cp
username: bdia
password: bdia_ly
1.4 服务信息2
01.基本信息
a.举报投诉平台
网址:complain.app.jggroup.cn 03-complain
账号:admin_jg
密码:admin@Xxgcz2023
b.集团点餐系统
网址:food-admin.app.jggroup.cn
账号:amdin
密码:
c.智慧园区管理平台
网址:172.17.10.80
账号:admin
密码:Jgxxzx8966@2024..
电子地图 -> 图上监控 -> 图上监控
交易查询 -> 信息查询、消费账户管理 -> 账户信息
安防管理 -> 实时预览 -> 监控点 -> 晋钢集团-> AR鹰眼
d.门禁视频监控系统
网址:oa.jggroup.cn:8880
账号:amdin
密码:xxxxx
e.晋钢采购业务系统
网址:purchases.jggroup.cn
账号:amdin
密码:xxxxx
f.安全隐患管理系统
网址:safemanager.app.jggroup.cn
账号:amdin
密码:xxxxx
g.晋钢业务管理
网址:hr.app.jggroup.cn jeecg-server/produce-manager-0.1.1
账号:admin
密码:admin@Xxgcz2023
h.工作任务跟踪管理
网址:jeecgmobile.app.jggroup.cn jeecg-server/task-manager
账号:admin
密码:admin@Xxgcz2023
i.集团宿舍办理平台
网址:Ejia子应用 02-day-report-server
账号:admin_jg
密码:admin@xxzx2024
j.费用预算管理系统
网址:erpfinance.app.jggroup.cn
账号:amdin
密码:xxxxx
k.集团宿舍办理平台
网址:hostel.ehome-sum.jggroup.cn
账号:amdin
密码:xxxxx
l.印章物联网管理平台
网址:stamp.app.jggroup.cn
账号:amdin
密码:xxxxx
m.晋钢智造实业
正式:https://jgerp.jggroup.cn
测试:http://erp.app.jggroup.cn
账户:J057240
密码:qwER159263
-----------------------------------------------------------------------------------------------------
账号:J056918,赵仁梓
密码:001017
-----------------------------------------------------------------------------------------------------
账号:J046311,郭慧芳
密码:06521
n.晋钢信息化系统,中冶京诚数科
网址:http://cerios.jggroup.cn
账号:49929
密码:123456
o.晋钢信息化综合管理平台
网址:http://172.17.8.57:81/login
账号:J057240
密码:aaaaA123#
密码:qwER159263.
02.校招信息
a.网址
名称:校招招聘
网址:http://hr.app.jggroup.cn/campus/
b.管理
名称:晋钢业务管理
网址:http://hr.app.jggroup.cn
账号:campl,登录用这个
工号:J95459
密码:jg.485625
c.代码
前端:11.jeecg-vue3_produce-ui-0.1.1/public/campus-registration.html
前端:11.jeecg-vue3_produce-ui-0.1.1/src/views/train/campus/JgTrainCampusList.vue
后端:11-jeecg-server_produce-manager-0.1.1/jg-biz-modules/jg-moudle-train/src/main/java/cn/jggroup/train/controller/JgTrainCampusController.java
数据库:jg_train_campus
d.部署
网址:172.17.10.201
账号:root
密码:jdwg8966..
-----------------------------------------------------------------------------------------------------
网址:http://hr.app.jggroup.cn/
路径:/root/hr-project/hr-front,hr-backend
分支:produce-manager-0.1.1
数据:mysql://172.17.10.100:3306/jeecg-boot-task dev
数据:mysql://172.17.10.201:3306/jeecg-boot-task prod
-----------------------------------------------------------------------------------------------------
查看:ps -ef | grep java
查看:/etc/nginx/nginx.conf
03.172.17.10.201
a.查看系统
a.参数
Static hostname: localhost.localdomain
Icon name: computer-vm
Chassis: vm
Machine ID: 92305feebc6240b381280ce8ff6aa3e3
Boot ID: 251b94bf7be545dcb731ff19014b83ad
Virtualization: vmware
Operating System: Rocky Linux 8.5 (Green Obsidian)
CPE OS Name: cpe:/o:rocky:rocky:8:GA
Kernel: Linux 4.18.0-348.7.1.el8_5.x86_64
Architecture: x86-64
b.说明
操作系统:Rocky Linux 8.5 (Green Obsidian)
内核版本:Linux 4.18.0-348.7.1.el8_5.x86_64
架构:x86-64
虚拟化:VMware
b.查看jar包
a.命令
$ ps -ef
$ ps -ef | grep java
b.说明
root 1410 1 0 1月12 ? 00:00:00 /bin/sh /software/mysql5.7.41/mysql/bin/mysqld_safe --datadir=/software/mysql5.7.41/data --pid-file=/software/mysql5.7.41/data/localh
mysql 1768 1410 0 1月12 ? 00:57:53 /software/mysql5.7.41/mysql/bin/mysqld --basedir=/software/mysql5.7.41/mysql --datadir=/software/mysql5.7.41/data --plugin-dir=/softw
-----------------------------------------------------------------------------------------------------
root 6350 1 0 1月12 ? 00:17:52 java -jar /root/project/sales/springboot/target/sales-springboot-0.0.1-SNAPSHOT.jar
port: 9991
context-path: /sales
jdbc:mysql://172.17.10.201:3306/jeecg-boot-task,root,admin@Xxgcz2023
root 7090 1 0 1月12 ? 03:52:14 java -jar target/pay-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
port: 8085
context-path: /pay-core
jdbc:mysql://172.17.10.100:3306/dashboard,springboot,springboot
root 22118 1 0 1月15 ? 00:11:46 java -jar /root/trucks/trucks-coming-manager/CarInOutServer/target/CarInOutServer-0.0.1-SNAPSHOT.jar
port: 8890
context-path: /
jdbc:mysql://localhost:3306/cpyy,root,root
root 232427 1 0 1月25 ? 01:56:13 java -jar /root/hr-project/hr-backend/jeecg-module-system/jeecg-system-start/target/jeecg-system-start-3.4.4.jar
server/jeecg-server,produce-manager-0.1.1
port: 9994
context-path: /jeecg-boot
jdbc:mysql://172.17.10.201:3306/jeecg-boot-task,root,admin@Xxgcz2023
http://hr.app.jggroup.cn
root 1723891 1 0 2月04 ? 00:20:11 java -jar /root/myprojects/my-erp/backend/jeecg-module-system/jeecg-system-start/target/jeecg-system-start-3.4.4.jar
server/my-erp,master
port: 9981
context-path: /jeecg-boot
jdbc:mysql://172.17.10.201:3306/jeecg-boot-finance,spring_finance,17JVP028
http://erpfinance.app.jggroup.cn
c.查看redis目录
[root@localhost logs]# ps -ef | grep redis
redis 3850 1 0 1月12 ? 00:33:22 /usr/bin/redis-server 127.0.0.1:6379
root 1731531 1730430 0 11:08 pts/0 00:00:00 grep --color=auto redis
c.nginx
a.位置
[root@localhost hr-backend]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
b.日志
tail -f /var/log/nginx/access.log --访问日志
tail -f /var/log/nginx/error.log --错误日志
c.配置文件
user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
client_max_body_size 20M;
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
server {
listen 9001;
server_name purchases.jggroup.cn;
location / {
root /root/project/feigang-frontend/dist;
index index.html;
try_files $uri $uri/ @router;
}
location @router {
rewrite ^.*$ /index.html last;
}
location /jeecg-boot {
proxy_pass http://127.0.0.1:8088/jeecg-boot;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 9002;
server_name hr.app.jggroup.cn;
location /mobile {
alias /root/hr-project/hr-backend/hr-mobile/dist;
index index.html;
try_files $uri $uri/ @router;
}
location / {
root /root/hr-project/hr-front/dist;
index index.html;
try_files $uri $uri/ @router;
}
location @router {
rewrite ^.*$ /index.html last;
}
location /jeecg-boot {
proxy_pass http://127.0.0.1:9994/jeecg-boot;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 9004;
server_name erpfinance.app.jggroup.cn;
location / {
root /root/myprojects/my-erp/frontend/dist/;
index index.html;
#try_files $uri $uri/ @router;
try_files $uri $uri/ /index.html;
}
location /jeecg-boot {
proxy_pass http://127.0.0.1:9981/jeecg-boot;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 9008;
server_name visitor.jggroup.cn;
location / {
root /root/visitor/visitor/dist;
index index.html;
try_files $uri $uri/ @router;
}
location @router {
rewrite ^.*$ /index.html last;
}
location /api {
proxy_pass http://127.0.0.1:9994/jeecg-boot;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
rewrite ^/api(.*)$ /jeecg-boot/api$1 break;
}
}
server {
listen 9013;
server_name salem.app.jggroup.cn;
location / {
root /root/project/sales/vue/dist;
index index.html;
try_files $uri $uri/ @router;
}
location @router {
rewrite ^.*$ /index.html last;
}
location /sales/api {
proxy_pas s http://127.0.0.1:9991;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 9025;
server_name safemanager.app.jggroup.cn;
location / {
root /root/SafetyManagement/SafetyManagement/securite-test-web-main/dist;
index index.html;
try_files $uri $uri/ @router;
}
location @router {
rewrite ^.*$ /index.html last;
}
location /jeecg-boot {
proxy_pass http://127.0.0.1:8081/jeecg-boot;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 9026;
server_name api-trucks.app.jggroup.cn;
location / {
root /root/trucks/trucks-coming-manager/CarInOutWeb/dist;
index index.html;
try_files $uri $uri/ @router;
}
location @router {
rewrite ^.*$ /index.html last;
}
location /api {
proxy_pass http://127.0.0.1:8890/api;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
2 源点数智管理平台
2.1 接入三方
01.抽离ejia公共
ejia:
# 工作流
workflow:
# 基础配置
base:
eid: 35315462
app-id: 500000132
app-secret: 2PUEflZt5I8mMwokziJ1
app-key: ecRjzQ6g7GILZk3ufA14
file-secret: e8Wyj0SULUe5z9GbZc7czgjI00NCOtXv
common-key: ztxih0oYpiiC1gB8
# 场景配置
configs:
prove:
app-id: SP35315462
secret: fkOMP1JAiAeiaLIBza8rXfHaTRpaUe
empower:
app-id: SP35315462
secret: TADFi9ASz5SGjj9JA9Sc7ATYa2L8GvQI
examine:
app-id: SP35315462
secret: fkOMP1JAiAeiaLIBza8rXfHaTRpaUe
# 同步组织架构
team:
yunzhijia:
eid: 35315462 # 企业eid
secret: TADFi9ASz5SGjj9JA9Sc7ATYa2L8GvQI # 资源秘钥
02.用户管理 -> 同步云之家到本地
a.src/views/system/user/index.vue
<JThirdAppButton biz-type="user" :selected-row-keys="selectedRowKeys" syncToLocal @sync-finally="onSyncFinally" />
b.src/components/jeecg/thirdApp/JThirdAppButton.vue
<template v-if="syncToApp || syncToLocal">
<JThirdAppDropdown v-if="enabledTypes.wechatEnterprise" type="wechatEnterprise" name="企微" v-bind="bindAttrs" v-on="bindEvents" />
<JThirdAppDropdown v-if="enabledTypes.dingtalk" type="dingtalk" name="钉钉" v-bind="bindAttrs" v-on="bindEvents" />
<JThirdAppDropdown v-if="enabledTypes.yunzhijia" type="yunzhijia" name="云之家" v-bind="bindAttrs" v-on="bindEvents" />
</template>
c.src/components/jeecg/thirdApp/JThirdAppDropdown.vue
<template>
<a-dropdown v-if="syncToApp && syncToLocal">
<a-button type="primary" preIcon="ant-design:sync-outlined">同步{{ name }}</a-button>
<template #overlay>
<a-menu @click="handleMenuClick">
<a-menu-item v-if="syncToApp" key="to-app">同步到{{ name }}</a-menu-item>
<a-menu-item v-if="syncToLocal" key="to-local">同步到本地</a-menu-item>
</a-menu>
</template>
</a-dropdown>
<a-button v-else-if="syncToApp" type="primary" preIcon="ant-design:sync-outlined" @click="handleMenuClick({ key: 'to-app' })"
>同步{{ name }}</a-button
>
<a-button v-else type="primary" preIcon="ant-design:sync-outlined" @click="handleMenuClick({ key: 'to-local' })">同步{{ name }}到本地</a-button>
</template>
d.src/components/jeecg/thirdApp/jThirdApp.api.ts
export const backEndUrl = {
// 获取启用的第三方App
getEnabledType: '/sys/thirdApp/getEnabledType',
// 企业微信
wechatEnterprise: {
user: '/sys/thirdApp/sync/wechatEnterprise/user',
depart: '/sys/thirdApp/sync/wechatEnterprise/depart',
},
// 钉钉
dingtalk: {
user: '/sys/thirdApp/sync/dingtalk/user',
depart: '/sys/thirdApp/sync/dingtalk/depart',
},
// 云之家
yunzhijia: {
user: '/sys/thirdApp/sync/yunZhiJia/user',
depart: '/sys/thirdApp/sync/yunZhiJia/depart',
}
};
e.修改src\components\jeecg\thirdApp\JThirdAppButton.vue
修改【内容】:发起异步请求,然后立即关闭窗口
-----------------------------------------------------------------------------------------------------
// 开始同步第三方App
function doSync(type, direction) {
let urls = backEndUrl[type];
console.log('url:' + urls);
if (!(urls && urls[props.bizType])) {
console.warn('配置出错');
return;
}
let url = urls[props.bizType] + direction;
let selectedRowKeys = props.selectedRowKeys;
let content = '确定要开始同步全部数据吗?同步将在后台进行。';
if (Array.isArray(selectedRowKeys) && selectedRowKeys.length > 0) {
content = `确定要开始同步这 ${selectedRowKeys.length} 项吗?`;
} else {
selectedRowKeys = [];
}
return new Promise((resolve) => {
Modal.confirm({
icon: createVNode(ExclamationCircleOutlined),
title: '同步',
content,
onOk: () => {
let params = { ids: selectedRowKeys.join(',') };
// 发起异步请求后直接关闭
defHttp.get({ url, params }, { isTransformResponse: false });
createMessage.success('已发起异步请求,请稍后前往【日志管理->操作日志】查看结果');
emit('sync-ok');
emit('sync-finally', {
type,
direction,
isToApp: direction === '/toApp',
isToLocal: direction === '/toLocal',
});
resolve();
},
onCancel() {
resolve();
},
});
});
}
03.部门管理 -> 云之家同步本地
a.src/views/system/depart/components/DepartLeftTree.vue
<a-button type="primary" preIcon="ant-design:sync-outlined" @click="onYunZhiJiaDepartToLocal">云之家同步本地</a-button>
b.src/views/system/depart/depart.api.ts
export const handYunZhiJiaDepartToLocal=(params, confirm=true )=>{
return new Promise((resolve,reject)=>{
const doGet = ()=>{
resolve(defHttp.get({url:Api.yunZhijiaDepartToLocal,params},{joinParamsToUrl:false}));
};
if(confirm){
createConfirm({
iconType: 'warning',
title: '云之家部门同步到本地',
content: '确定同步吗?',
onOk: ()=> doGet(),
onCancel: ()=> reject()
})
}else{
doGet();
}
});
}
-----------------------------------------------------------------------------------------------------
将默认参数从confirm=false,变成confirm=true
2.2 举报投诉平台
00.名称
03-complain
01.说明
a.备份
ry-complain
INSERT INTO `ry-complain`.`sys_user`(`user_id`, `dept_id`, `user_name`, `nick_name`, `user_type`, `email`, `phonenumber`, `sex`, `avatar`, `password`, `status`, `del_flag`, `login_ip`, `login_date`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1, 103, 'admin_jg', '若依', '00', '[email protected]', '15888888888', '1', '/profile/avatar/2023/04/28/7a8fa842-880a-46de-8f69-19c413384f1d.jpeg', '$2a$10$lDkEfIPLpi6JZ5UTZymqYOK.BGEV4m7f58IOMkX6PlreJVP.WLfGi', '0', '0', '172.16.10.1', '2025-01-09 09:30:52', 'admin', '2021-10-25 20:19:50', '', '2025-01-09 09:30:53', '管理员');
UPDATE `ry-complain`.`sys_user` SET `dept_id` = 103, `user_name` = 'admin_jg', `nick_name` = '若依', `user_type` = '00', `email` = '[email protected]', `phonenumber` = '15888888888', `sex` = '1', `avatar` = '/profile/avatar/2023/04/28/7a8fa842-880a-46de-8f69-19c413384f1d.jpeg', `password` = '$2a$10$lDkEfIPLpi6JZ5UTZymqYOK.BGEV4m7f58IOMkX6PlreJVP.WLfGi', `status` = '0', `del_flag` = '0', `login_ip` = '172.16.10.1', `login_date` = '2025-01-09 09:30:52', `create_by` = 'admin', `create_time` = '2021-10-25 20:19:50', `update_by` = '', `update_time` = '2025-01-09 09:30:53', `remark` = '管理员' WHERE `user_id` = 1;
20250214,$10$lDkEfIPLpi6JZ5UTZymqYOK.BGEV4m7f58IOMkX6PlreJVP.WLfGi
ruoyi-vue-v3.8.4,$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2
b.登录
http://127.0.0.1:80
admin_jg
默认:amdin123456
最新:admin@Xxgcz2023
02.越权获取其他员工的投诉内容【高危】,20250214
a.漏洞介绍
集团的举报投诉平台在提交投诉后会返回一串查询码,用于员工跟踪此次投诉的处理情况,
但是由于系统没有严格校验查询码的值,导致互联网其他用户可以批量获取到公司员工的投诉内容。
b.漏洞地址
http://complain.app.jggroup.cn/api/complain/list
c.漏洞详情
网页地址如下:
http://complain.app.jggroup.cn/#/ContentList
正常提交举报后,获取查询码1739255668298
-----------------------------------------------------------------------------------------------------
举报跟踪功能的数据包如下:
POST /api/complain/list HTTP/1.1
Host: complain.app.jggroup.cn
Content-Length: 45
Authorization:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0
Accept: application/json, text/plain, */*
Content-Type: application/x-www-form-urlencoded
Origin: http://complain.app.jggroup.cn
Referer: http://complain.app.jggroup.cn/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,mt;q=0.5
Connection: close
searchCode=17392556682%&pageNum=1&pageSize=10
-----------------------------------------------------------------------------------------------------
由于searchCode参数并没有进行严格校验,导致可以通过百分号进行模糊查询,从而获取到其他员工的投诉内容,共计598条。
可以获取到投诉时间、投诉人姓名和投诉内容
d.修复建议
严格校验searchCode参数,不允许通过模糊查询获取到其他员工的投诉内容。
2.3 晋钢业务管理
01.说明
晋钢业务管理 -> 管理中心 -> 文章:图片若为中文名,无法显示
02.生产编码
a.网络
http://hr.app.jggroup.cn/jeecg-boot/saleArticle/list?column=createTime&order=desc&pageNo=1&pageSize=10&_t=1741403732881
cn.jggroup.controller.SaleArticleController -> list/add接口
http://hr.app.jggroup.cn/jeecg-boot/sys/common/static/jeditor/冷系_1740709078688.png
http://hr.app.jggroup.cn/jeecg-boot/sys/common/static/jeditor/0b6fe99d55a1eb5d4479f60a1740707624759.png
b.日志
错误日志:tail -f /var/log/nginx/error.log
访问日志:tail -f /var/log/nginx/access.log
172.16.10.1 - - [08/Mar/2025:11:22:52 +0800] "GET /jeecg-boot/saleArticle/list?column=createTime&order=desc&pageNo=1&pageSize=10&_t=1741404172171 HTTP/1.0" 200 953
"http://hr.app.jggroup.cn/sales/list" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36" "10.70.20.135"
c.解决
# 20250308,临时解决
nohup java -jar -Djava.net.preferIPv4Stack=true -Dfile.encoding=C.UTF-8 /home/zdh/shanxi/oms/cloud/sxoms-dcloud/$APP_NAME >$LOG_FILE 2>&1 &
03.上传文件名
a.org.jeecg.modules.system.controller.CommonController
# 原版代码
# 原文件名_时间戳.扩展名(例如:test_1709913600000.jpg)
private String uploadLocal(MultipartFile mf,String bizPath){
// 获取文件名
String orgName = mf.getOriginalFilename();
orgName = CommonUtils.getFileName(orgName);
if(orgName.indexOf(SymbolConstant.SPOT)!=-1){
fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf("."));
}else{
fileName = orgName+ "_" + System.currentTimeMillis();
}
}
# 20250308,由他人更改
# _时间戳.扩展名(例如:_1709913600000.jpg)
String orgName = mf.getOriginalFilename();
orgName = new String(orgName.getBytes(), "UTF-8");
orgName = CommonUtils.getFileName(orgName);
if(orgName.indexOf(SymbolConstant.SPOT)!=-1){
//fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf("."));
fileName = "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf("."));
}else{
fileName = orgName+ "_" + System.currentTimeMillis();
}
b.重新部署
mvn clean
mvn package -DskipTests
# 无需install,直接重启jar包
04.上传逻辑
a.cn.jggroup.controller.SaleArticleController
@AutoLog(value = "发文表-编辑")
@ApiOperation(value="发文表-编辑", notes="发文表-编辑")
//@RequiresPermissions("test:sale_article:edit")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody SaleArticle saleArticle) {
if(saleArticle.getType().equals("1")){
saleArticle.setType("每日价格");
}
if (saleArticle.getType().equals("2")){
saleArticle.setType("政策发布");
}
if(saleArticle.getType().equals("3")){
saleArticle.setType("数据维护");
}
if(saleArticle.getFileName()!=null){
if (!saleArticle.getFilePath().contains("http://hr.app.jggroup.cn/")){
saleArticle.setFilePath("http://hr.app.jggroup.cn/jeecg-boot/sys/common/static/"+saleArticle.getFileName());
CloudflowConfiguration configuration=CloudflowConfiguration.proveConfig();
Cloudflow cloudflow = new Cloudflow(configuration);
byte[] bytes = HttpUtils.sendGetReturnBytes("",saleArticle.getFilePath());
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
String fileName= StringUtils.substringAfterLast(StringUtils.substringBeforeLast(saleArticle.getFileName(),"_"),"/");
try {
JSONObject uploadFileJson = cloudflow.uploadFile(byteArrayInputStream,fileName);
String fileId = uploadFileJson.getJSONArray("data").getJSONObject(0).getString("fileId");
String length = uploadFileJson.getJSONArray("data").getJSONObject(0).getString("length");
saleArticle.setFileId(fileId);
saleArticle.setFileSize(bytes.length);
} catch (IOException e) {
e.printStackTrace();
}
/*saleArticle.setFileName(substringAfterLast(substringBeforeLast(saleArticle.getFileName(),"_"),"/"));*/}
}
if(saleArticle.getArticle()!=null){
if(!saleArticle.getArticle().equals(saleArticleService.getById(saleArticle.getId()).getArticle())){
if(saleArticle.getArticle().contains("<img src=\"../jeecg-boot")){
saleArticle.setArticle(saleArticle.getArticle().replaceAll("<img width=\"100%\" src=\"../jeecg-boot","<img src=\"http://hr.app.jggroup.cn/jeecg-boot"));}
else {
saleArticle.setArticle(saleArticle.getArticle().replaceAll("<img width=\"100%\" src=\"jeecg-boot", "<img src=\"http://hr.app.jggroup.cn/jeecg-boot"));
}
}}
saleArticleService.updateById(saleArticle);
return Result.OK("编辑成功!");
}
@RequestMapping(value = "/audit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> audit(@RequestBody SaleArticle saleArticle) {
if(saleArticle.getType().equals("1")){
saleArticle.setType("每日价格");
}
if (saleArticle.getType().equals("2")){
saleArticle.setType("政策发布");
}
if(saleArticle.getType().equals("3")){
saleArticle.setType("数据维护");
}
if(saleArticle.getFileName()!=null){
if (!saleArticle.getFilePath().contains("http://hr.app.jggroup.cn/")){
CloudflowConfiguration configuration=CloudflowConfiguration.proveConfig();
Cloudflow cloudflow = new Cloudflow(configuration);
byte[] bytes = HttpUtils.sendGetReturnBytes("",saleArticle.getFilePath());
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
String fileName= StringUtils.substringAfterLast(StringUtils.substringBeforeLast(saleArticle.getFileName(),"_"),"/");
try {
JSONObject uploadFileJson = cloudflow.uploadFile(byteArrayInputStream,fileName);
String fileId = uploadFileJson.getJSONArray("data").getJSONObject(0).getString("fileId");
String length = uploadFileJson.getJSONArray("data").getJSONObject(0).getString("length");
saleArticle.setFileId(fileId);
saleArticle.setFileSize(bytes.length);
} catch (IOException e) {
e.printStackTrace();
}
/* saleArticle.setFileName(substringAfterLast(substringBeforeLast(saleArticle.getFileName(),"_"),"/"));*/}
}
if(saleArticle.getArticle()!=null){
if(!saleArticle.getArticle().equals(saleArticleService.getById(saleArticle.getId()).getArticle())){
if(saleArticle.getArticle().contains("<img src=\"../jeecg-boot")){
saleArticle.setArticle(saleArticle.getArticle().replaceAll("<img src=\"../jeecg-boot","<img width=\"100%\" src=\"http://hr.app.jggroup.cn/jeecg-boot"));}
else {
saleArticle.setArticle(saleArticle.getArticle().replaceAll("<img src=\"jeecg-boot", "<img width=\"100%\" src=\"http://hr.app.jggroup.cn/jeecg-boot"));
}
}}
saleArticleService.updateById(saleArticle);
return Result.OK("审核完成!");
}
b.说明
a.主要处理逻辑
1.文件上传
将文件上传到临时目录
然后转存到云存储系统
保存文件ID和大小信息
2.图片URL处理
将相对路径转换为绝对路径
基础URL:http://hr.app.jggroup.cn/jeecg-boot
处理两种路径格式:../jeecg-boot、jeecg-boot
3.图片样式处理
添加 width="100%" 属性
统一图片显示宽度为100%
b.潜在问题
1.路径硬编码
硬编码了域名 hr.app.jggroup.cn
建议改为配置文件管理
2.图片处理不完整
只处理了特定格式的路径
可能会遗漏其他格式的图片URL
3.重复代码
add、edit、audit 方法中有大量重复代码
建议抽取共用方法
硬编码了域名 hr.app.jggroup.cn
2.4 工作任务跟踪管理
01.基本信息
a.项目
server/jeecg-server.git
旧:task-manager分支
新:produce-manager分支,纠正
-----------------------------------------------------------------------------------------------------
server/jeecg-vue3.git
旧:task-manager分支
新:produce-ui分支,纠正
b.数据库,5.7.28版本
网址:172.17.10.100:3306
账号:springboot
密码:springboot
c.在线地址
网址:http://jeecgmobile.app.jggroup.cn
账号:admin
密码:admin@Xxgcz2023
d.服务器
网址:172.17.10.105
账号:administrator
密码:jMJ65v6Kd9@#tJd
平台:windows系统,黑框别左击,点了要暂停,要回车,缩小窗口
02.维修管理
a.页面
维修接车
维修列表
维修派工
已修档案
工时汇总
设置
b.数据库:jeecg-boot-task
jg_repair_dispatch
jg_repair_item
jg_repair_list
jg_repair_list_fittingitem
jg_repair_list_typeitem
jg_repair_truck
jg_repair_truck_item
c.20250607
id source target
1000001 JG0212002 J000002
要做到事是这个,这个系统里面是ERP上线之前开发的,里面的工号体系是旧的,想把里面的工号都换成现在使用的体系J0xxxxx这种
把里面的工号都换成现在使用的体系 J0xxxxx这种
d.修改表名
sys_user username IC13060002 替换为 J024754
-----------------------------------------------------------------------------------------------------
jg_repair_dispatch persion_id
jg_repair_list person_id
jg_repair_list_typeitem repair_person_id
jg_repair_truck person_id
-----------------------------------------------------------------------------------------------------
jg_repair_dispatch create_by、update_by
jg_repair_item create_by、update_by
jg_repair_list update_by
jg_repair_list_fittingitem create_by
jg_repair_list_typeitem create_by、update_by
03.操作说明
a.关系图
职位表(Postion)
↓
三方表(Third)<---> 用户(User) <---> 角色(Role) <---> 菜单(Menu)
↑ ↑ ↑
部门(Depart)------------------------
---------------------------------------------------------------------------------------------------------
IC13060002
123456
---------------------------------------------------------------------------------------------------------
J057240
qwER159263!
b.关系表
表名 新增 更新 删除 工号:IC13060002修改为J024754
组织表 sys_depart √ √ √ ×
组织表 sys_depart_permission ×
组织表 sys_depart_role 后续版本添加 ×
组织表 sys_depart_role_permission 后续版本添加 ×
组织表 sys_depart_role_user 后续版本添加 ×
菜单表 sys_permission ×
菜单表 sys_permission_data_rule ×
菜单表 sys_permission_v2 ×
职位表 sys_position √ √ √ ×
角色表 sys_role 系统维护 系统维护 系统维护 ×
角色表 sys_role_index ×
角色表 sys_role_permission ×
三方表 sys_third_account √ √ √ ×
用户表 sys_user √ √ √ √,修改username
用户表 sys_user_role,关联角色 √,固定user √,固定user √ ×
用户表 sys_user_depart,关联部门 √ √ √ ×
用户表 sys_user_agent,关联代理人,表字段有代理人、所属部门、所属公司 ×
用户表 sys_user_position,关联职位,表不存在,冗余到sys_user的post字段,存储方式为【处长助理】或【devleader,总经理】
用户表 sys_user_third,关联三方,表不存在,信息冗余到sys_third_account
c.维修管理:repair
jg_repair_dispatch persion_id、create_by、update_by persion_id 维修接车-新增,该id来自sys/user/list表查询的结果,故而必须修改【sys_user】中的username字段,调用 JgRepairTruckController.java 里的 add 接口
jg_repair_item create_by、update_by
jg_repair_list person_id、update_by person_id 维修列表-列表,该id是查询字段,调用 JgRepairTruckController.java 里的 queryPageList 接口
jg_repair_list_fittingitem create_by
jg_repair_list_typeitem repair_person_id、create_by、update_by repair_person_id 维修列表-维修项目-新增,该id来自sys/user/list表查询的结果,故而必须修改【sys_user】中的username字段,调用 JgRepairTruckController.java 里的 addJgRepairListTypeitem 接口
jg_repair_truck person_id、create_by person_id 维修接车单-新增,,该id来自sys/user/list表查询的结果,故而必须修改【sys_user】中的username字段,调用 JgRepairTruckController.java 里的 add 接口
jg_repair_truck_item
jg_truck create_by
jg_truck_type create_by
d.绩效管理:kpi
kpi_definition create_by、update_by
kpi_dept create_by
kpi_task_item create_by
kpi_task_item_attachment confirm_person_id、confirm_person
e.迁移说明
涉及RBAC:不影响登录,故不修改,但需停止【相关定时任务】
不涉及RBAC:维修管理:repair + 绩效管理:kpi 暴力修改persion_id,无需理会create_by、update_by
04.本地使用【测试环境】迁移【生产数据】
a.服务器
网址:172.17.10.105
账号:administrator
密码:jMJ65v6Kd9@#tJd
平台:windows系统,黑框别左击,点了要暂停,要回车,缩小窗口
b.迁移方案
第1种,停下jar包,直接更新数据库,大概6W条数据
第2种,新建库的权限,直接打开修改jar包配置
c.更改配置
a.环境
pom.xml有可能dev环境,实际指向prod
b.开启日志
第1处(logback-spring.xml将info修改为debug)
第2处(application-dev.yml将MP的log-impl打开SQL打印)
c.如若遇到redis错误,大概率是某处代码直接用了【无密码】的redis,而不是读取dev.yml配置文件
redis:
database: 5
host: localhost
port: 6379
password: myslayers
d.数据不一致
a.第1种,地址不一致
后端9994启动端口后,虽然整体前端系统对接9994端口启动了【系统】,
但是【系统某几个页面】若直接【调用指定的线上接口,如list = '/cn.jggroup.truck/jgRepairTruck/list'】,
则有可能实际操作为【线上数据】
b.第2种,使用微服务的负载均衡
如果本地启动服务后,同一网关下,负载均衡会将部分请求转发到【本地开发】,而非【生产环境】
e.注意事项
a.源码
定时任务涉及的表
中间件导入的数据
源码,增删改查是否彻底修改字段
b.测试
添加用户界面,测试走本地/生产接口
本地环境通过,再考虑迁移生产环境,确定迁移时间
c.迁移
直接操作生产数据,发生长事务/锁表/表涉及几个系统
批量迁移数据,建议单条执行,减少锁表、卡死终端
d.原则
服务器,次次都上当,当当不一样
下班附近,不动生产环境、生产数据
第1天查看数据情况,第2天找组长核对方案并确定时间
e.数据库
# 默认4MB
SHOW VARIABLES LIKE 'max_allowed_packet';
2.5 门禁视频监控系统
01.后台账号弱口令【高危】,20250214
a.漏洞介绍
系统后台账号存在弱口令,导致互联网其他用户可以登录到系统后台,获取到门禁系统的通行记录等敏感信息。
b.漏洞地址
http://oa.jggroup.cn:8880/#/user/login
c.漏洞详情
http://oa.jggroup.cn:8880/#/user/login
运输企业环保门禁视频监控系统存在弱口令账号(123\123456),可以登录到系统后台
后台可以看到通行记录6221条
登记车辆记录14911条
系统后台还泄露了其他敏感信息,此处不再进行赘述。
d.修复建议
1.修改弱口令,设置为12位以上由大小写字母和数字组成的特殊符号;
2.登录功能添加图形验证码机制,防止攻击者批量爆破弱口令账号。
2.6 集团宿舍办理平台
01.说明
a.备份
ry-vue
INSERT INTO `ry-vue`.`sys_user`(`user_id`, `dept_id`, `user_name`, `nick_name`, `user_type`, `email`, `phonenumber`, `sex`, `avatar`, `password`, `status`, `del_flag`, `login_ip`, `login_date`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`, `open_id`) VALUES (1, 103, 'admin_jg', '晋钢', '00', '[email protected]', '15888888888', '1', '', '$2a$10$oQhHeIxdSGQL7w2eLBxHEenvJTNdYIbNPjBTD6Q5EM2bN2SmBV/nO', '0', '0', '127.0.0.1', '2021-04-29 16:08:03', 'admin', '2021-04-29 16:08:03', '', NULL, '管理员', NULL);
UPDATE `ry-vue`.`sys_user` SET `dept_id` = 103, `user_name` = 'admin_jg', `nick_name` = '晋钢', `user_type` = '00', `email` = '[email protected]', `phonenumber` = '15888888888', `sex` = '1', `avatar` = '', `password` = '$2a$10$oQhHeIxdSGQL7w2eLBxHEenvJTNdYIbNPjBTD6Q5EM2bN2SmBV/nO', `status` = '0', `del_flag` = '0', `login_ip` = '127.0.0.1', `login_date` = '2021-04-29 16:08:03', `create_by` = 'admin', `create_time` = '2021-04-29 16:08:03', `update_by` = '', `update_time` = NULL, `remark` = '管理员', `open_id` = NULL WHERE `user_id` = 1;
20250214,$2a$10$oQhHeIxdSGQL7w2eLBxHEenvJTNdYIbNPjBTD6Q5EM2bN2SmBV/nO
ruoyi-vue-v3.8.4,$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2
b.登录
http://127.0.0.1:80
admin_jg
默认:amdin123456
最新:admin@xxzx2024
c.hostel-mobile/config/index.js
module.exports = {
dev: {
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {
'/api': {
target: 'http://192.168.50.229:8080',
changeOrigin: true,
}
},
host: '192.168.50.229',
port: 82,
autoOpenBrowser: false,
errorOverlay: true,
notifyOnErrors: true,
poll: false,
devtool: 'cheap-module-eval-source-map',
cacheBusting: true,
cssSourceMap: true
},
build: {
index: path.resolve(__dirname, '../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: './',
productionSourceMap: true,
productionGzip: false,
productionGzipExtensions: ['js', 'css'],
bundleAnalyzerReport: process.env.npm_config_report
}
}
d.hostel-ui/vue.config.js
devServer: {
host: '0.0.0.0',
port: port,
open: true,
proxy: {
//detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
//target: `http://localhost:9966`,
target:`http://hostel.ehome-sum.jggroup.cn/`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''
}
},
'/dashboard': {
//target: 'http://e1.jggroup.cn',
target: 'http://hostel.ehome-sum.jggroup.cn/',
changeOrigin: true,
pathRewrite: {
'^/dashboard': '/dashboard' // rewrite path
}
}
},
disableHostCheck: true
},
configureWebpack: {
name: name,
resolve: {
alias: {
'@': resolve('src')
}
}
},
e.ruoyi-ui/vue.config.js
devServer: {
host: '0.0.0.0',
port: port,
open: true,
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
target: `http://localhost:8080`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''
}
}
},
disableHostCheck: true
},
02.未授权获取宿舍员工的信息【高危】,20250214
a.构建
To install them, you can run: npm install --save babel-runtime/core-js/get-iterator babel-runtime/core-js/json/stringify babel-runtime/core-js/object/keys babel-runtime/core-js/promise babel-runtime/helpers/toConsumableArray qs vue-hot-reload-api
Error from chokidar (D:\): Error: EBUSY: resource busy or locked, lstat 'D:\DumpStack.log.tmp'
-----------------------------------------------------------------------------------------------------
"axios": "0.21.0",
"qs": "6.9.4",
"vant": "^2.12.20",
"vue": "^2.5.2",
"vue-router": "^3.0.1"
-----------------------------------------------------------------------------------------------------
项目使用的是较老的 Vue 2.5.2 和 Webpack 3.6.0 版本
babel-runtime 相关的错误表明 babel 的运行时依赖缺失
vue-hot-reload-api 错误与热重载功能相关
qs 模块缺失,这是用于请求参数序列化的工具
b.解决
a.第1步:修改 build/webpack.base.conf.js 添加 watchOptions 来解决文件锁定问题:
node: {
setImmediate: false,
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty'
},
watchOptions: {
ignored: ["**/DumpStack.log.tmp", "**/node_modules/**"]
}
b.第2步:安装缺失的依赖
# 先删除现有的 node_modules
rimraf node_modules
rm pnpm-lock.yaml
# 安装核心依赖
pnpm add -D [email protected]
pnpm add -D [email protected]
pnpm add [email protected]
# 安装其他必要的 babel 插件
pnpm add -D @babel/[email protected]
c.第3步:修改 .babelrc 配置,确保正确使用 runtime:
{
"presets": [
[
"env",
{
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
}
}
],
"stage-2"
],
"plugins": [
"transform-vue-jsx",
[
"transform-runtime",
{
"helpers": true,
"polyfill": true,
"regenerator": true,
"moduleName": "babel-runtime"
}
]
]
}
d.第4步:如果还有问题,可以尝试添加 pnpm 的特殊配置,创建 .npmrc 文件:
shamefully-hoist=true
strict-peer-dependencies=false
legacy-peer-deps=true
e.第5步:然后重新安装和启动
pnpm install
pnpm run dev
c.请求
curl ^"http://hostel.ehome-sum.jggroup.cn/api/hostel/repair/getRoomUserInfo^" ^
-H ^"Accept: application/json, text/plain, */*^" ^
-H ^"Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,ja;q=0.6,zh-TW;q=0.5^" ^
-H ^"Connection: keep-alive^" ^
-H ^"Content-Type: application/json^" ^
-H ^"Origin: http://hostel.ehome-sum.jggroup.cn^" ^
-H ^"Referer: http://hostel.ehome-sum.jggroup.cn/^" ^
-H ^"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36^" ^
-H ^"ticket: null^" ^
--data-raw ^"^{^}^" ^
--insecure
-----------------------------------------------------------------------------------------------------
curl ^"http://hostel.ehome-sum.jggroup.cn/api/hostel/repair/getRoomUserInfoList?roomId=481^" ^
-H ^"Accept: application/json, text/plain, */*^" ^
-H ^"Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,ja;q=0.6,zh-TW;q=0.5^" ^
-H ^"Connection: keep-alive^" ^
-H ^"Content-Type: application/json^" ^
-H ^"Origin: http://hostel.ehome-sum.jggroup.cn^" ^
-H ^"Referer: http://hostel.ehome-sum.jggroup.cn/^" ^
-H ^"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36^" ^
-H ^"ticket: null^" ^
--data-raw ^"^{^}^" ^
--insecure
d.后端:com.ruoyi.hostel.api.ApplyRepairApi
/**
* 获取用户详情
*/
@PostMapping("/getRoomUserInfo")
@Ticket
public TableDataInfo getRoomUserInfoPageD(@RequestBody SearchBaseRoomUserPO searchBaseRoomUserPO) {
try {
startPage();
// 获取用户信息
Person person = (Person) request.getAttribute("currentPerson");
searchBaseRoomUserPO.setOpenId(person.getOpenId());
List<SearchBaseRoomUserVO> list = baseRoomUserService.getRoomUserInfoPageD(searchBaseRoomUserPO);
return getDataTable(list);
} catch (CustomException e) {
return errorTable(e.getMessage());
} catch (Exception e) {
logger.error("获取房间入住信息!原因{}", Throwables.getStackTraceAsString(e));
return errorTable("获取房间入住信息");
}
e.后端:com.ruoyi.hostel.interceptor.TicketInterceptor
// 20250220:修复【未授权获取宿舍员工的信息】,原因为 后端鉴权 忽略 ticket传值为字符串"null"情况
if(StringUtils.isEmpty(ticket) || "null".equals(ticket)) {
return false;
}
3 中冠钢铁管理平台
3.1 项目配置
01.常见信息
a.说明
a.领域
设备、工程(咱们所属领域)
物料:对应负责人安谦、张海杰
原料:对应负责人李方炫
人资、保卫、盛和:对应负责人郭慧芳
成本、财务:对应负责人刘洁
b.账套
福建永硕集团:F01
山西永硕新材料:F02
煜盛废旧回收:F03
山西永硕新能源:F04
源点数智科技:F05
山西永硕新能源-2024:F06
晋钢控股集团:J01
晋钢智造实业:J02
华安焦化:J03
锐盛重工:J08
盛和物业:Q02
顺盛环保:S01
b.业务树
a.人资领域业务群
hr:【HR】人事管理系统
hd:【HD】出勤管理系统
hb:【HB】考评管理系统
ht:【HT】培训管理系统
hs:【HS】薪资管理系统
hg:【HG】劳保用品管理系统
b.成本领域业务群
ac:【AC】成本核算管理系统
am:【AM】厂务会计管理系统
ip:【IP】产品存货帐务管理系统
ae:【AE】成本分析管理系统
as:【AS】标准成本管理系统
c.IPMS领域业务群
da:(DA)应用软体发展管理系统
de:(DE)公用副程式管理
df:(DF)排程管理系统
ds:(DS)企业入口网站管理系统
du:(DU)资讯授权与安全管理
dj:(DJ)交易记录管理系统
dq:(DQ)批次作业管理
dw:(DW)工作流程讯息管理系统
dr:(DR)报表管理系统
gb:(GB)金融机构管理系统
ge:(GE)利率汇率管理系统
gp:(GP)往来公司管理系统
ub:(UB)布告栏系统
mq:(MQ)EZoMQ Server
d.销售出货领域业务群
价格管理系统
订单管理系统
发货管理
运输管理系统
出货销帐管理系统
e.销售结算领域业务群
货款管理系统
销售结算管理系统
关联交易结算管理系统
f.炼钢生产业务群
ws:【WS】炼钢排程管理系统
oj:【OJ】炼钢信息收集系统
is:【IS】板坏、矩形坏存货管理系统
ib:【IB】方坏存货管理系统
g.棒线生产业务群
pod:【POD】棒线生产订单管理
wd:【WD】棒线轧钢排程管理
od:【OD】棒线生产实绩收集
id:【ID】棒线存货及放行管理系统
h.焊管生产业务群
xxx:钢管生产订单
xxx:钢管生產排程系统
xxx:钢管生产实绩收集系统
xxx:钢卷/窄带存货管理
ihp:【IHP】钢管存货管理系统
xxx:钢管放行管理系统
xxx:系统维护
i.热冷轧生产业务群
xx:热冷轧生产订单管理
xx:热冷轧生产排程管理
xx:热冷轧生产实绩收集
xx:钢卷放行管理系统
ih:【IH】钢卷存货管理系统
xx:配料管理系统
xx:轧辊管理系统
xx:热冷轧判定管理
j.生产共用业务群
月盘计划
分厂计划
交期應答管理系统
k.存货帐务管理系统
参数设定
存货帐务管理
系统管理报表
l.工程管理领域业务群
工程资金管理
工程合同管理
m.购运储业务群
mp:【MP】采购管理系统
mr:【MR】原料管理系统
mi:【MI】物料管理系统
mf:【MF】帐务管理系统
n.设备管理系统
资产管理
循环品管理
预防保养管理
报修管理
开平板管理
打包带管理
抢修管理
故障事故管理
停机管理
费用及绩效管理
预算及指标管理
油品检测管理
计量仪器管理
特种设备管理
防雷设备管理
工器具管理
系统设定
o.报表管理中心
成本领域
人资领域
购储运领域
销售领域
质量领域
生产领域
工程领域
p.质量领域业务群
产品规范管理系统
冶金规范管理系统
生产订单建立管理系统
化物性试验记录管理系统
质保书管理系统
客户异议管理系统
询单管理系统
q.财务会计领域业务群
会计管理系统
应付帐款管理系统
应收账款管理系统
发票管理系统
票据管理系统
P信用证管理系统
固定资产管理系统
资金管理系统
统一抛帐系统
自助分析平台
02.开发手册
a.bio
a.code
da:
dd:业务树+收藏夹
de:
dj:
dr:
ds:
dt:
du:
dw:
dx:
eform:表单控件
gb:
ge:
gp:
um:
b.javadoc
da:http://localhost:9001/erp/help/javadoc/da/index.html
dd:http://localhost:9001/erp/help/javadoc/dd/index.html
de:http://localhost:9001/erp/help/javadoc/de/index.html
dj:http://localhost:9001/erp/help/javadoc/dj/index.html
dr:http://localhost:9001/erp/help/javadoc/dr/index.html
ds:http://localhost:9001/erp/help/javadoc/ds/index.html
dt:http://localhost:9001/erp/help/javadoc/dt/index.html
du:http://localhost:9001/erp/help/javadoc/du/index.html
dw:http://localhost:9001/erp/help/javadoc/dw/index.html
dx:http://localhost:9001/erp/help/javadoc/dx/index.html
eform:http://localhost:9001/erp/help/javadoc/eform/index.html
gb:http://localhost:9001/erp/help/javadoc/gb/index.html
ge:http://localhost:9001/erp/help/javadoc/ge/index.html
gp:http://localhost:9001/erp/help/javadoc/gp/index.html
um:http://localhost:9001/erp/help/javadoc/um/index.html
b.help
a.daotool
Codegen程式使用說明.doc
Codegen程式使用说明.doc
daotool+release.doc
daotool基本功能說明.doc
daotool基本功能说明.doc
DAO介紹.ppt
DAO介绍.ppt
b.di
DI2安装手册.doc
DI2安裝手冊.doc
DIClient安装手册(Linux).docx
DIClient安装手册.doc
DIClient安裝手冊(Linux).docx
DIClient安裝手冊.doc
DILog查詢.docx
DILog查询.docx
DIServer安装手册.doc
DIServer安裝手冊.doc
DI問題處理流程.docx
DI編程手冊.doc
DI编程手册.doc
DI问题处理流程.docx
丰南DIClient安装手册(Linux)微调.docx
切换说明(DI转DQ).docx
切換說明(DI轉DQ).docx
新华冶金钢铁企业应用整合系统使用者手册.doc
新華冶金鋼鐵企業應用整合系統使用者手冊.doc
豐南DIClient安裝手冊(Linux)微調.docx
c.dq
DQServer安装手册.doc
DQServer安裝手冊.doc
DQ增加伫列.doc
DQ增加佇列.doc
DQ运维说明.ppt
DQ運維說明.ppt
d.dz
copyright.html
passwd.html
readme.txt
rules.html
sample.doc
sample.ppt
sample.txt
sample.xls
version.html
e.ezomq
Agent安装手册.docx
EZoMQ_ZK操作手册.docx
EZoMQAgent安装手册.docx
EZoMQClient使用手册.docx
EzoMQClient安装手册.docx
EZoMQServer使用手册.docx
EzoMQServer安装手册.docx
EzoMQ对帐补抛功能说明.docx
系统软件暨维护管理与障碍排除手册.doc
c.javadoc
a.da
a.com.icsc.dpms.da
ant、batch、dao、ftp、func、module、rest、style、tag
package-frame.html、ackage-summary.html、ackage-tree.html、evision.html
b.exposure
allclasses-frame.html
allclasses-noframe.html
constant-values.html
dajsb1.html
dajsb2.html
dajsc1.html
dajsc2.html
dajsc3.html
dajsd1.html
dajsl1.html
dajstn.html
dajsu1.html
dajsu2.html
dajsu3.html
dajsu4.html
dajsu5.html
dajsv1.html
dajsv2.html
deprecated-list.html
help-doc.html
index.html
index-all.html
overview-frame.html
overview-summary.html
overview-tree.html
package-frame.html
package-list
package-summary.html
package-tree.html
script.js
serialized-form.html
stylesheet.css
b.dd
a.com.icsc.dpms.dd
api、locale、msg、sys、web
package-frame.html、ackage-summary.html、ackage-tree.html、evision.html
b.exposure
allclasses-frame.html
allclasses-noframe.html
constant-values.html
deprecated-list.html
help-doc.html
index.html
index-all.html
overview-frame.html
overview-summary.html
overview-tree.html
package-list
script.js
serialized-form.html
stylesheet.css
c.de
a.com.icsc.dpms.de
ajax、auth、classify、code、dao、date、filter、form、func
package-frame.html、ackage-summary.html、ackage-tree.html、evision.html
b.exposure
allclasses-frame.html
allclasses-noframe.html
constant-values.html
dejsxls.html
deprecated-list.html
help-doc.html
index.html
index-all.html
overview-frame.html
overview-summary.html
overview-tree.html
package-frame.html
package-list
package-summary.html
package-tree.html
script.js
serialized-form.html
stylesheet.css
d.dj
a.com.icsc.dpms.dj
core、dao、func、newdj、rest、tag、ui、util、web
package-frame.html、ackage-summary.html、ackage-tree.html、evision.html
b.exposure
allclasses-frame.html
allclasses-noframe.html
constant-values.html
deprecated-list.html
help-doc.html
index.html
index-all.html
overview-frame.html
overview-summary.html
overview-tree.html
package-list
script.js
serialized-form.html
stylesheet.css
e.dr
a.com.icsc.dpms.dr
client、config、core、dao、engine、exception、file、fileService、func、reportdraw、rest、server、tag、tree、util、web
package-frame.html、ackage-summary.html、ackage-tree.html、evision.html
b.exposure
allclasses-frame.html
allclasses-noframe.html
constant-values.html
deprecated-list.html
help-doc.html
index.html
index-all.html
overview-frame.html
overview-summary.html
overview-tree.html
package-list
script.js
serialized-form.html
stylesheet.css
f.ds
a.com.icsc.dpms.ds
annotation、api、bean、cache、cscgroup、dao、demo、dst、filter、func、infolet、kdp、menu
package-frame.html、ackage-summary.html、ackage-tree.html、evision.html
b.exposure
allclasses-frame.html
allclasses-noframe.html
constant-values.html
deprecated-list.html
dsjsp00.html
help-doc.html
index.html
index-all.html
overview-frame.html
overview-summary.html
overview-tree.html
package-frame.html
package-list
package-summary.html
package-tree.html
script.js
serialized-form.html
stylesheet.css
g.dt
a.com.icsc.dpms.dt
api、dao、designer、flow、form、func、generator、msg、process
package-frame.html、ackage-summary.html、ackage-tree.html、evision.html
b.exposure
allclasses-frame.html
allclasses-noframe.html
constant-values.html
deprecated-list.html
help-doc.html
index.html
index-all.html
overview-frame.html
overview-summary.html
overview-tree.html
package-list
script.js
serialized-form.html
stylesheet.css
h.du
a.com.icsc.dpms.du
batch、bean、cscgroup、dao、datax、func、log、mdm
package-frame.html、ackage-summary.html、ackage-tree.html、evision.html
b.exposure
allclasses-frame.html
allclasses-noframe.html
constant-values.html
deprecated-list.html
dujs001.html
dujs002.html
dujs003.html
dujs004.html
dujs005.html
dujs007.html
dujs008.html
dujs009.html
dujs010.html
dujs061.html
help-doc.html
index.html
index-all.html
overview-frame.html
overview-summary.html
overview-tree.html
package-frame.html
package-list
package-summary.html
package-tree.html
script.js
serialized-form.html
stylesheet.css
i.dw
a.com.icsc.dpms.dw
dao、engine、func、mobile、msg、oa、process、publish
package-frame.html、ackage-summary.html、ackage-tree.html、evision.html
b.exposure
allclasses-frame.html
allclasses-noframe.html
constant-values.html
deprecated-list.html
help-doc.html
index.html
index-all.html
overview-frame.html
overview-summary.html
overview-tree.html
package-list
script.js
serialized-form.html
stylesheet.css
j.dx
a.com.icsc.dpms.dx
core、csv、db、etl、iweboffice、merge、od
package-frame.html、ackage-summary.html、ackage-tree.html、evision.html
b.exposure
allclasses-frame.html
allclasses-noframe.html
constant-values.html
deprecated-list.html
help-doc.html
index.html
index-all.html
overview-frame.html
overview-summary.html
overview-tree.html
package-list
script.js
serialized-form.html
stylesheet.css
k.eform
a.com.icsc.dpms.eform
net/oa/eform/workitem、ackage-frame.html、ackage-summary.html、ackage-tree.html、evision.html
package-frame.html、ackage-summary.html、ackage-tree.html、evision.html
b.exposure
allclasses-frame.html
allclasses-noframe.html
constant-values.html
deprecated-list.html
help-doc.html
index.html
index-all.html
overview-frame.html
overview-summary.html
overview-tree.html
package-list
script.js
serialized-form.html
stylesheet.css
l.gb
a.com.icsc.dpms.gb
tag、web
package-frame.html、ackage-summary.html、ackage-tree.html、evision.html
b.exposure
allclasses-frame.html
allclasses-noframe.html
constant-values.html
deprecated-list.html
gbjsControl.html
help-doc.html
index.html
index-all.html
overview-frame.html
overview-summary.html
overview-tree.html
package-frame.html
package-list
package-summary.html
package-tree.html
script.js
serialized-form.html
stylesheet.css
m.ge
a.com.icsc.dpms.ge
func、qry、tag
package-frame.html、ackage-summary.html、ackage-tree.html、evision.html
b.exposure
allclasses-frame.html
allclasses-noframe.html
constant-values.html
deprecated-list.html
gejsControl.html
help-doc.html
index.html
index-all.html
overview-frame.html
overview-summary.html
overview-tree.html
package-frame.html
package-list
package-summary.html
package-tree.html
script.js
serialized-form.html
stylesheet.css
o.gp
a.com.icsc.dpms.gp
codegen、dao、datax、exception、gwt、list、tag
package-frame.html、ackage-summary.html、ackage-tree.html、evision.html
b.exposure
allclasses-frame.html
allclasses-noframe.html
constant-values.html
deprecated-list.html
help-doc.html
index.html
index-all.html
overview-frame.html
overview-summary.html
overview-tree.html
package-list
script.js
serialized-form.html
stylesheet.css
p.um
a.com.icsc.dpms.um
package-frame.html、ackage-summary.html、ackage-tree.html、evision.html
b.exposure
allclasses-frame.html
allclasses-noframe.html
constant-values.html
deprecated-list.html
help-doc.html
index.html
index-all.html
overview-tree.html
package-list
script.js
stylesheet.css
d.module
a.测试:可以运行
rootProject.name = 'sxjg'
include 'il'
include 'sb'
include 'sh'
include 'so'
include 'sr'
include 'local'
include 'ic'
include 'ih'
include 'ix'
include 'ol'
include 'po'
include 'ty'
include 'wh'
include 'wz'
/**财务**/
//include 'aa'
//include 'ap'
//include 'ar'
//include 'av'
//include 'ff'
//include 'fl'
//include 'fn'
//include 'ft'
/**购储运**/
include 'mf'
include 'mi'
include 'mp'
include 'mr'
/**质量**/
include 'qsc'
include 'sl'
include 'tc'
include 'tl'
include 'tm'
include 'tp'
include 'tq'
/**炼钢**/
include 'ib'
include 'is'
include 'oj'
include 'ws'
/**棒线**/
include 'id'
include 'od'
include 'pod'
include 'wd'
/**销售结算**/
include 'sa'
include 'sg'
include 'ss'
/**人资**/
include 'hb'
include 'hd'
include 'hg'
include 'hr'
include 'hs'
include 'ht'
b.测试:注释放开的,代表带有com.icsc.ezomq包
rootProject.name = 'sxjg'
//include 'il'
//include 'sb'
//include 'sh'
//include 'so'
//include 'sr'
include 'local'
//include 'ic'
//include 'ih'
//include 'ix'
//include 'ol'
//include 'po'
//include 'ty'
//include 'wh'
//include 'wz'
/**财务**/
//include 'aa'
//include 'ap'
//include 'ar'
//include 'av'
//include 'ff'
//include 'fl'
//include 'fn'
//include 'ft'
/**购储运**/
include 'mf'
include 'mi'
include 'mp'
include 'mr'
/**质量**/
include 'qsc'
//include 'sl'
include 'tc'
//include 'tl'
include 'tm'
//include 'tp'
//include 'tq'
/**炼钢**/
//include 'ib'
//include 'is'
//include 'oj'
//include 'ws'
/**棒线**/
//include 'id'
//include 'od'
//include 'pod'
//include 'wd'
/**销售结算**/
//include 'sa'
//include 'sg'
//include 'ss'
/**人资**/
//include 'hb'
include 'hd'
//include 'hg'
include 'hr'
//include 'hs'
//include 'ht'
c.测试:注释放开的,代表带有com.icsc.ezomq包,只剩【购储运】
rootProject.name = 'sxjg'
//include 'il'
//include 'sb'
//include 'sh'
//include 'so'
//include 'sr'
include 'local'
//include 'ic'
//include 'ih'
//include 'ix'
//include 'ol'
//include 'po'
//include 'ty'
//include 'wh'
//include 'wz'
/**财务**/
//include 'aa'
//include 'ap'
//include 'ar'
//include 'av'
//include 'ff'
//include 'fl'
//include 'fn'
//include 'ft'
/**购储运**/
include 'mf'
include 'mi'
include 'mp'
include 'mr'
/**质量**/
//include 'qsc'
//include 'sl'
//include 'tc'
//include 'tl'
//include 'tm'
//include 'tp'
//include 'tq'
/**炼钢**/
//include 'ib'
//include 'is'
//include 'oj'
//include 'ws'
/**棒线**/
//include 'id'
//include 'od'
//include 'pod'
//include 'wd'
/**销售结算**/
//include 'sa'
//include 'sg'
//include 'ss'
/**人资**/
//include 'hb'
//include 'hd'
//include 'hg'
//include 'hr'
//include 'hs'
//include 'ht'
d.测试:注释放开的,代表带有com.icsc.ezomq包,只剩【local】
rootProject.name = 'sxjg'
//include 'il'
//include 'sb'
//include 'sh'
//include 'so'
//include 'sr'
include 'local'
//include 'ic'
//include 'ih'
//include 'ix'
//include 'ol'
//include 'po'
//include 'ty'
//include 'wh'
//include 'wz'
/**财务**/
//include 'aa'
//include 'ap'
//include 'ar'
//include 'av'
//include 'ff'
//include 'fl'
//include 'fn'
//include 'ft'
/**购储运**/
//include 'mf'
//include 'mi'
//include 'mp'
//include 'mr'
/**质量**/
//include 'qsc'
//include 'sl'
//include 'tc'
//include 'tl'
//include 'tm'
//include 'tp'
//include 'tq'
/**炼钢**/
//include 'ib'
//include 'is'
//include 'oj'
//include 'ws'
/**棒线**/
//include 'id'
//include 'od'
//include 'pod'
//include 'wd'
/**销售结算**/
//include 'sa'
//include 'sg'
//include 'ss'
/**人资**/
//include 'hb'
//include 'hd'
//include 'hg'
//include 'hr'
//include 'hs'
//include 'ht'
e.测试local的API
http://localhost:9002/erp/local/ajax?_controller=localTest&_action=list
-------------------------------------------------------------------------------------------------
{
"code": 2000,
"message": "success",
"data": [
{
"no": 1,
"noName": "AAA"
},
{
"no": 2,
"noName": "BBB"
},
{
"no": 3,
"noName": "CCC"
},
{
"no": 4,
"noName": "DDD"
},
{
"no": 5,
"noName": "EEE"
}
],
"extra": {
"version": "1.0.0",
"timestamp": 1750233142629
}
}
03.模块分析
a.build文件夹
a.libs
a.sxjg-1.0-SNAPSHOT.jar
META-INF
MANIFEST.MF:Manifest-Version: 1.0
b.sxjg-1.0-SNAPSHOT.war
META-INF
MMANIFEST.MF:Manifest-Version: 1.0
b.tmp
a.jar
MANIFEST.MF 内容为 Manifest-Version: 1.0
b.war
MANIFEST.MF 内容为 Manifest-Version: 1.0
b.gradle文件夹
a.wrapper
a.gradle-wrapper.jar
META-INF
org.gradle
gradle-cli-classpath.properties
gradle-cli-parameter-names.properties
gradle-wrapper-classpath.properties
gradle-wrapper-parameter-names.properties
b.gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
c.gradle模块
a.组成
a.关系
settings.gradle 定义了项目的整体结构,告诉Gradle有哪些模块。
gradlew (或 gradlew.bat) 是执行Gradle构建的入口脚本,它确保你使用的是正确的Gradle版本。
gradle.properties 提供了全局或项目级别的配置属性。
build.gradle 是每个模块的核心构建文件,它包含了具体的构建逻辑和配置。
b.流程
当你运行gradlew build这样的命令时,
Gradle会首先读取settings.gradle来了解项目结构,
然后根据gradle.properties中的配置,
最后执行各个模块的build.gradle中定义的构建任务。
b.细节
a.build.gradle:每个模块的核心构建文件,它包含了具体的构建逻辑和配置
作用:这是Gradle构建脚本的核心。它定义了项目的构建逻辑,包括依赖管理、任务(tasks)定义、插件应用、以及各种构建配置。
内容:plugins: 声明项目使用的Gradle插件,例如Java插件、Android插件等。
dependencies: 定义项目所需的外部库和模块依赖。
tasks: 定义自定义的构建任务,例如编译代码、打包、运行测试等。
repositories: 配置依赖的来源,比如Maven Central、JCenter等。
其他配置: 针对不同插件的特定配置,比如Java项目的sourceCompatibility、Android项目的compileSdkVersion等。
b.erp.ini:元信息
# com.icsc.ds.dsjcst0 配置
# 2004年11月9日星期二 23:32:09 CST
str.prompt_day=10
str.business_no=70767857
str.html_home=html/
str.doc_url=/erp/doc/
str.temp_home=work/
str.portal_url=/erp/ds/jsp/dsjjPortal.jsp # 正式环境的URL
str.store_url=/erp/public/
str.error_time=3
str.image_home=images/
str.data_source=jdbc/dssxjg
str.html_url=/erp/html/
str.jdbc_driver=COM.ibm.db2.jdbc.app.DB2Driver
str.ERPHome=/sxjg/
[email protected]
---------------------------------------------------------------------------------------------
######################################################################
# 定义一个表格,它的CompId的值
# 没有定义的表格,就是根据登录时选的公司来作为Key值,不管登录时选哪个公司
# 这个表格的列值以下面的key为准
######################################################################
# 以下数据请不要改动!!
# 没有定义的表格,处理分公司别数据
# 有定义的表格,处理的数据不分分公司
######################################################################
# DE
######################################################################
DB.TBDE22=sxjg
DB.TBDE23=sxjg
######################################################################
# DS
######################################################################
# 授权成员
#DB.TBDSA1=sxjg
# 授权基本信息
DB.TBDSAF=sxjg
c.gradle.properties
# 设置守护进程的初始堆大小和最大堆大小
org.gradle.jvmargs=-Xms2g -Xmx4g -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# 如果你的项目特别大,可以考虑启用并行构建
org.gradle.parallel=true
# 提高缓存大小以减少内存压力
org.gradle.caching=true
---------------------------------------------------------------------------------------------
作用:这个文件用于配置Gradle的全局属性或项目特定的属性。你可以在这里定义一些在构建过程中需要用到的变量,比如JVM参数、代理设置、或者自定义的构建属性。
内容:以键值对的形式存储属性,例如org.gradle.jvmargs=-Xmx2048m(设置JVM最大内存)或者myCustomProperty=someValue。
d.gradlew
构建脚本,用于linux/mac
---------------------------------------------------------------------------------------------
这两个是Gradle Wrapper的脚本文件。
Gradle Wrapper允许你在没有预先安装Gradle的情况下运行Gradle构建。
它会检查本地是否安装了指定版本的Gradle,如果没有,它会自动下载并使用该版本。
内容:它们是可执行脚本,通常不需要手动修改。它们会调用Gradle Wrapper JAR文件来执行构建任务。
e.gradlew.bat
构建脚本,用于win
---------------------------------------------------------------------------------------------
这两个是Gradle Wrapper的脚本文件。
Gradle Wrapper允许你在没有预先安装Gradle的情况下运行Gradle构建。
它会检查本地是否安装了指定版本的Gradle,如果没有,它会自动下载并使用该版本。
内容:它们是可执行脚本,通常不需要手动修改。它们会调用Gradle Wrapper JAR文件来执行构建任务。
f.index.html
<html>
<meta http-equiv="refresh" content="0; url=/erp/ds/jsp/dsjjNeweip.jsp">
</html>
---------------------------------------------------------------------------------------------
整个项目首页,对应【测试环境】
g.settings.gradle
rootProject.name = 'sxjg'
include 'il'
include 'sb'
include 'sh'
include 'so'
include 'sr'
include 'local'
---------------------------------------------------------------------------------------------
作用: 这个文件是Gradle构建的入口,它定义了项目中包含的所有子项目(模块)。
当你有一个多模块项目时,你需要在settings.gradle中声明这些模块。
内容: 通常包含include 'module1', 'module2'这样的语句,用于告诉Gradle你的项目由哪些模块组成。对于单模块项目,这个文件可能非常简单,甚至只有一行代码。
04.模块文件
a.构建
a.gradle
a.wrapper
a.gradle-wrapper.jar
META-INF
org.gradle
gradle-cli-classpath.properties
gradle-cli-parameter-names.properties
gradle-wrapper-classpath.properties
gradle-wrapper-parameter-names.properties
b.gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
b.单文件
build.gradle:每个模块的核心构建文件,它包含了具体的构建逻辑和配置
gradlew:执行Gradle构建的入口脚本,它确保你使用的是正确的Gradle版本
gradlew.bat:执行Gradle构建的入口脚本,它确保你使用的是正确的Gradle版本
settings.gradle:定义了项目的整体结构,告诉Gradle有哪些模块
b.根模块
a.config
a.eform
a.eformLog.properties
log4j.rootLogger=ERROR,STDOUT_APPENDER,file
log4j.logger.EFORM.RUNTIME=ERROR,EFORM_RUNTIME_APPENDER
log4j.logger.EFORM.TIMEOUT=debug,EFORM_TIMEOUT_APPENDER
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=waslogs/eform/hibernate.log
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%t] %c -%m%n
b.sxjg,dr模版
a.drAjax.xml
<?xml version="1.0" encoding="BIG5"?>
<ctrls>
<ctrl controllerID="drjjRptCfg">
<controller>com.icsc.dpms.dr.func.drjcRptFunc</controller>
<action flag="QL" method="queryRptList"/>
<action flag="U" method="update"/>
<action flag="N" method="create"/>
<action flag="D" method="delete"/>
<valueObject objectID="v1"
class="com.icsc.dpms.dr.dao.drjcRptVO"
type="sequence"/>
</ctrl>
</ctrl>
<ctrl controllerID="drjcFileFunc">
<controller>com.icsc.dpms.dr.func.drjcFileFunc</controller>
<action flag="D" method="delete"/>
</ctrl>
</ctrls>
b.drcfg.ini
FTPRoot=/ftproot/
png=image/png
mid=audio/mid
jpg=image/jpeg
jpe=image/jpeg
doc=application/msword
c.drcfg.ini.desc
FTPRoot=
png=
mid=
jpg=
jpe=
doc=
txt=
d.drStructs.xml
<?xml version="1.0" encoding="BIG5"?>
<pages>
<page pageID="drjjRptCfg" path="drjjRptCfgm.jsp">
<controller>com.icsc.dpms.dr.engine.drjcRptCfg</controller>
<action flag="I" method="query" forward="drjjRptCfgm.jsp"/>
<action flag="Q" method="queryCode" forward="drjjRptCfgm.jsp"/>
<action flag="T" method="query" forward="dsjjRequestFilterSleep.jsp"/>
<action flag="N" method="create" validate="create_validate" forward="drjjRptCfgm.jsp"/>
<action flag="R" method="update" validate="update_validate" forward="drjjRptCfgm.jsp"/>
<action flag="D" method="delete" validate="delete_validate" forward="drjjRptCfgm.jsp"/>
<action flag="findPre" method="findPre" forward="drjjRptCfgm.jsp"/>
<action flag="findNext" method="findNext" forward="drjjRptCfgm.jsp"/>
<converter>
<valueObject objectID="r"
class="com.icsc.dpms.dr.dao.drjcRptVO"
type="unique"/>
<valueObject objectID="v2"
class="com.icsc.dpms.dr.dao.drjcRptParaDetailVO"
type="sequence"/>
</converter>
</page>
</pages>
c.sxjg,ws模版
a.wsStructs.xml
<?xml version="1.0" encoding="BIG5"?>
<pages>
<version>2.0</version>
<param name="database" value="DB2"/>
<param name="compId" value="bx"/>
<page pageID="wsjj001" path="wsjj001Main.jsp" uiCtrl="false">
<action flag="Q" method="query"/>
<action flag="F" method="fuzzy"/>
<action flag="N" method="create" validate="create_validate" />
<action flag="R" method="update"/>
<action flag="A" method="apply"/>
<action flag="C" method="close"/>
<action flag="CC" method="cancelClose"/>
<converter>
<valueObject objectID="v1" class="com.icsc.ws.dao.wsjctb00VO" type="sequence"/>
</converter>
</page>
</pages>
e.spring
a.ws_spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="ws_spring_gbean.xml" />
<import resource="ws_spring_menu.xml" />
</beans>
b.ws_spring_gbean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
c.ws_spring_menu.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true" xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="wsjcMenuBar" class="com.icsc.dpms.de.dez.menu.dezcGulMenuBarGenerator">
<property name="system">
<ref bean="ws.system" />
</property>
</bean>
<bean id="ws_loginInfoLoader" class="com.icsc.dpms.de.dez.menu.dezcLoginInfoLoader">
<property name="targetComponentId" value="title2">
</property>
</bean>
<bean id="ws_pageLoader" class="com.icsc.dpms.de.dez.menu.dezcPageContentLoader">
<property name="system">
<ref bean="ws.system" />
</property>
</bean>
<bean id="ws.system" class="com.icsc.dpms.de.dez.menu.dao.dezcSystemVO">
<property name="sysName" value="煉鋼排程系統"></property>
<property name="logoUrl" value="html/gwt/res/images/icsc/img2/FTsystem.gif"></property>
<property name="modules">
<list>
<bean class="com.icsc.dpms.de.dez.menu.dao.dezcInfoModuleVO">
<property name="moduleId" value="WS-JF-01"></property>
<property name="moduleName" value="基本資料設定"></property>
<property name="infoList">
<list>
<bean class="com.icsc.dpms.de.dez.menu.dao.dezcInfoVO">
<property name="infoId" value="wsjg001" />
<property name="fileName" value="ws/gul/wsjg001.gul" />
<property name="infoName" value="方矩坯澆次爐數設定作業" />
</bean>
<bean class="com.icsc.dpms.de.dez.menu.dao.dezcInfoVO">
<property name="infoId" value="wsjg002" />
<property name="fileName" value="ws/gul/wsjg002.gul" />
<property name="infoName" value="圓坯澆次爐數設定作業" />
</bean>
</list>
</property>
</bean>
</list>
</property>
</bean>
</beans>
b.dd:业务树+收藏夹
a.data
a.ddjjMsg_CD.json
{"dz,dzjjMenuHeader.dep":"部门","dz,dzjjMenuHeader.myFavorite":"收藏夹","dz,dzjjMenuHeader.language":"语言",}
b.ddjjMsg_GL.json
[
{
"select":"1",
"text":"中文",
"value":"zh_cn"
}
]
b.jsp
a.汇总
ddjj01.jsp
ddjj01ajax.jsp
ddjj01List.jsp
ddjj01ListComp.jsp
ddjj01ListTest.jsp
ddjj01Popup.jsp <Script language="JScript" src="<%=_de300.script("de","/dejtag.jss")%>"></script>
ddjj01Search.jsp
ddjj01Test.jsp
-----------------------------------------------------------------------------------------
ddjj02.jsp <form name="form1" method="post" action="/erp/dd/jsp/ddjj01List.jsp" target="ddjjMsgEdit_<%= dejcWebUtil.genUniqueId(session.getId()) %>">
-----------------------------------------------------------------------------------------
ddjjDom.jsp <de:form action="/erp/dd/do?_pageId=ddjjDom" target="ddjjDom"> action="/erp/dd/jsp/ddjjDomList.jsp"
ddjjDomCreate.jsp window.name = "ddjjDomCreate" ;
ddjjDomEdit.jsp
ddjjDomList.jsp
ddjjDomMain.jsp
-----------------------------------------------------------------------------------------
ddjjMsgConfig.jsp
ddjjMsgConfigNew.jsp
ddjjMsgDeployDownload.jsp
ddjjMsgDeployEdit.jsp
ddjjMsgDicTest.jsp
ddjjMsgDicTest2.jsp
-----------------------------------------------------------------------------------------
ddjjSysCreate.jsp <script src="<%=_de300.script("de","/dejtab08.jss")%>"></script>
ddjjSysEdit.jsp <%@ include file="../../jsp/dzjjmenu.jsp" %>
-----------------------------------------------------------------------------------------
ddjjTools.jsp <%@ page import="com.icsc.dpms.dd.msg.*" %>
<%@ page import="com.icsc.dpms.dd.msg.impl.*" %>
ddjjUnicodeTest.jsp <%!
public String stringToUnicode(String s){
char[]temp = s.toCharArray();
StringBuilder un = new StringBuilder();
for(char t:temp){
un.append(charToUnicode(t));
}
return un.toString();
}
%>
b.应用
整体控件:ddjj01.jsp、ddjj02.jsp
单个控件:ddjjDom.jsp、ddjjDomCreate.jsp、ddjjDomEdit.jsp、ddjjDomList.jsp、ddjjDomMain.jsp
单个控件:ddjjMsgConfig.jsp、ddjjMsgConfigNew.jsp、ddjjMsgDeployDownload.jsp、ddjjMsgDeployEdit.jsp、ddjjMsgDicTest.jsp、ddjjMsgDicTest2.jsp
c.dq
a.jsp
conList.jsp
dqjjAllQn.jsp
dqjjData.jsp
dqjjData2.jsp
dqjjDataCheck.jsp
dqjjDataCheck2.jsp
dqjjDataCheckNew.jsp
dqjjDataJobInfo.jsp
dqjjDataQueueInfo.jsp
dqjjFileDownload.jsp
d.ds
a.data
rtreeDef.ini
---------------------------------------------------------------------------------------------
#infoId,parent,text,type,url
ZZ,#,XX系統,Z,#
UX,#,示範系統,Z,#
UXJJ01,UX,便當示範作業,A,/erp/ux/jsp/uxjjXNF_demo.jsp
UXA,UX,測試目錄,Z,#
UXJJ02,UXA,示範作業2,A,/erp/ux/jsp/uxjjXNF_demo2.jsp
UXJJ03,UXA,示範作業3,A,/erp/ux/jsp/uxjjXNF_demo2.jsp
UXB,UX,測試目錄B,Z,#
UXJJ04,UXB,示範作業4,A,/erp/ux/jsp/uxjjXNF_demo2.jsp
UXJJ05,UXB,示範作業5,A,/erp/ux/jsp/uxjjXNF_demo2.jsp
UXC,UX,測試目錄C,Z,#
W,#,生產系統,Z,#
b.jsp
conList.jsp
conTest.jsp
dsjcac0.jsp
dsjj100.jsp
dsjjac0.jsp
dsjjac1.jsp
c.jwt
dsjjApiAdmin.jsp
dsjjApiAuthLog.jsp
dsjjApiCheck.jsp
dsjjApiPathTable.jsp
dsjjApiToken.jsp
e.dz
dzjjFile.jsp
dzjjlist.jsp
dzjjlog.jsp
dzjjMainFooter.jsp
dzjjMainHeader.jsp
f.jsp
dzjjFile.jsp
dzjjlist.jsp
dzjjlog.jsp
dzjjMainFooter.jsp
dzjjMainHeader.jsp
dzjjMenuFooter.jsp
dzjjMenuHeader.jsp
dzjjMenuHeader_demo.jsp
dzjjMenuHeader_demo_bak.jsp
dzjjSelif.jsp
dzjjSQL.jsp
dzjjSQL2.jsp
dzjjUploadQA.jsp
dzjjwarn.jsp
dzjjWaslogs.jsp
dzjjZip.jsp
c.子模块
a.config
a.isAjax.xml
<?xml version="1.0" encoding="BIG5"?>
<ctrls>
<ctrl controllerID="isjjEESvc">
<skipSignOn>true</skipSignOn>
<controller>com.icsc.is.api.isjcApiApprovalFlow</controller>
<!-- 跨法人领用审批流程 -->
<action flag="isjj30301Approve" method="isjj30301Approve"/>
<action flag="isjj30301Reject" method="isjj30301Reject"/>
</ctrl>
</ctrls>
b.ihConfig.ini
CoilDefine=com.icsc.ih.logic.ihjcamaDefine_cus
ImportDefine=com.icsc.ih.logic.ihjcamaImportDefineImpl_cus
Ihama01=com.icsc.ih.logic.ihjcama01Impl_cus
CoilIP=com.icsc.ih.logic.ihjcamaCoilIPImpl
StockTransfer=com.icsc.ih.logic.ihjcamaStockTransferImpl_cus
b.dao
a.sql:一些执行sql的脚本
db.TBHBAA06-ORACLE.sql
db.TBHBAA08-ORACLE.sql
db.TBHBAC02-ORACLE.sql
db.TBHBAC03-ORACLE.sql
db.TBHBAS11-DB2.sql
db.TBHBAS12-DB2.sql
db.TBHBAS13-DB2.sql
-------------------------------------------------------------------------------------
CREATE TABLE db.TBHBAA08 (
priKey VARCHAR2(30) DEFAULT '' NOT NULL,meritItem VARCHAR2(8) DEFAULT '',itemCode VARCHAR2(8) DEFAULT '',meritGrade NUMBER (7,3) DEFAULT 0 ,meritLevel VARCHAR2(10) DEFAULT '',forKey VARCHAR2(30) DEFAULT '', PRIMARY KEY(priKey)
) ;
GRANT ALL ON db.TBHBAA08 TO JAVAUSER ;
-------------------------------------------------------------------------------------
CREATE TABLE DB.TBHSD0 (
compId VARCHAR (20) NOT NULL DEFAULT '',
empNo VARCHAR (10) NOT NULL DEFAULT '',
procYy VARCHAR (4) NOT NULL DEFAULT '',
lvCode VARCHAR (6) NOT NULL DEFAULT '',
lretainHrs DECIMAL (10,4) ,
lretainMns INT ,
allowedHrs DECIMAL (10,4) ,
allowedMns INT ,
applyHrs DECIMAL (10,4) ,
applyMns INT ,
updateEmpNo VARCHAR (10) DEFAULT '',
updateDate VARCHAR (8),
PRIMARY KEY(compId,empNo,procYy,lvCode)
)
GRANT ALL ON DB.TBHSD0 TO JAVAUSER ;
b.dao:表结构
TBHBAA05.dao
TBHBAA06.dao
TBHBAA07.dao
TBHBAA08.dao
TBHBAB07.dao
TBHBAB08.dao
-------------------------------------------------------------------------------------
#Meta
-----------------------------
project : HB系統
table : db.TBHBAA05
class : hbjctbaa05DAO
package : com.icsc.hb.dao
entity : hbjctbaa05VO
author : 郭忠漢
descript : 考評控制檔
version : 1.0
#Field
#name dataType isKey?(y/n) description field width (db) format default
------------------------------------------------------------------------------------------------------
compId String y 公司別 20 String ""
meritYrMo String y 評核年月 8 date_ym ""
meritType String y 評核類別 4 code_hbjcMeritTypeFieldType ""
efctDate String n 考評生效日期 8 date ""
salaryDate String n 調薪生效日期 8 date ""
fromDate String n 評核起日 8 date ""
toDate String n 評核迄日 8 date ""
authId String n 權責版本 8 String ""
levelVersion String n 等第版本 8 String ""
procYyMm String n 調薪日帳年月 6 date_ym ""
fileHandle String n 安全衛生檔案 30 String ""
dayLimit BigDecimal n 天數限制 3,0 money 0
salCode String n 獎金薪資代碼 6 String ""
difReason String n 異動原因 6 String ""
updateEmpNo String n 修改人員 10 empNo ""
updateTime String n 修改時間 20 String ""
#Assoicatio n
#name className description local => foreign
----------- ------------------------------------------------------------------------------
c.html
a.locale
en_US.json
zh_CN.json
zh_TW.json
b.dx
sgImportS0300.xlsx
c.snippet
tyjtUtility.jss
d.resources
echarts.js
echarts-gl.js
wsjj50200_iframe.html
wsjt909.js
d.jsp
a.jsp
hbjjaa050.jsp
hbjjac010.jsp
hbjjac210.jsp
podj00020.jsp
b.说明
podj00020 代表 页面标号
e.images
a.资源包
图片
f.resources
a.资源包
ss_zh_TW.properties
g.work
a.dx
hsjxp04Rpt.xls
hsjxp0410Rpt.xls
hsjxp0710Rpt2.xls
hsjxRptHA0012_102.xls
hsjxRptHA0012_103.xls
hsjxRptHA0012_104.xls
hsjxRptHA0012_105.xls
b.说明
一些excel模版
3.2 本地扩展模块
01.快速开始
a.环境
a.正式
正式:https://jgerp.jggroup.cn
测试:http://erp.app.jggroup.cn
账户:J057240
密码:qwER159263
-------------------------------------------------------------------------------------------------
账号:J056918,赵仁梓
密码:001017
-------------------------------------------------------------------------------------------------
账号:J046311,郭慧芳
密码:06521
b.测试
网址:http://localhost:9001/erp/ds/jsp/dsjjNeweip.jsp
账号:J046311,郭慧芳
密码:06521
c.手册
xx:https://jgerp.jggroup.cn/erp/html/de/docs/index.html
da:http://localhost:9001/erp/help/javadoc/da/index.html
dd:http://localhost:9001/erp/help/javadoc/dd/index.html
de:http://localhost:9001/erp/help/javadoc/de/index.html
dj:http://localhost:9001/erp/help/javadoc/dj/index.html
dr:http://localhost:9001/erp/help/javadoc/dr/index.html
ds:http://localhost:9001/erp/help/javadoc/ds/index.html
dt:http://localhost:9001/erp/help/javadoc/dt/index.html
du:http://localhost:9001/erp/help/javadoc/du/index.html
dw:http://localhost:9001/erp/help/javadoc/dw/index.html
dx:http://localhost:9001/erp/help/javadoc/dx/index.html
eform:http://localhost:9001/erp/help/javadoc/eform/index.html
gb:http://localhost:9001/erp/help/javadoc/gb/index.html
ge:http://localhost:9001/erp/help/javadoc/ge/index.html
gp:http://localhost:9001/erp/help/javadoc/gp/index.html
um:http://localhost:9001/erp/help/javadoc/um/index.html
d.测试local
http://localhost:9001/erp/local/ajax?_controller=localTest&_action=list
http://localhost:9002/erp/local/ajax?_controller=localTest&_action=list
b.代理
a.WiFi / 以太网
晋钢:172.16.10.130
阿里云:223.5.5.5
阿里云:223.6.6.6
b.surge
"icscrepo1.icsc.com.tw": "8.8.8.8#DIRECT"
fake-ip-filter:
- "icscrepo1.icsc.com.tw"
rules:
- 'DOMAIN,icscrepo1.icsc.com.tw,DIRECT'
c.clash verge
skip-proxy:追加 icscrepo1.icsc.com.tw
[Rule]:追加 DOMAIN,icscrepo1.icsc.com.tw,DIRECT
[Host]:追加 icscrepo1.icsc.com.tw = server:8.8.8.8 / icscrepo1.icsc.com.tw = 198.18.3.169(废弃) / 域名+端口 / ip+端口 / HEAD与GET请求
d.镜像
buildscript {
repositories {
maven { url 'http://icscrepo1.icsc.com.tw/repository/maven-public' }
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "gradle.plugin.com.gorylenko.gradle-git-properties:gradle-git-properties:1.5.1"
}
}
e.总结
编译,需要关闭TUN模式,以及整个Surge/Clash,需访问【icscrepo1.icsc.com.tw】构建
耗时:自动将【zg-erp(外部源)】放入【本地外部Tomcat】对应的【webapps、work】文件夹,耗时【4分30秒】
经测试,【/Users/troyesivens/Documents/software/apache-tomcat-9.0.106】,可以完美运行
经测试,【/opt/homebrew/Cellar/tomcat@9/9.0.104/libexec】,brew安装的Tomcat,缺少配置,可自行补全
c.配置Tomcat
a.服务器
应用程序服务器:Tomcat 9.0.106
启动后默认浏览器:http://localhost:9001/erp/
虚拟机选项:-Dcom.icsc.compNo=sxjg -Dcom.icsc.serverName-ERPsxjg -Dcom.icsc.instanceNo=0l -Dcom.icsc.dpms.de.dejc300.j2ee=true
执行“更新”操作时:重启服务器
JRE:1.8
Tomcat服务器设置:HTTP端口(9001)、JMX端口(1098)
b.部署
在服务器启动时部署:zg-erp(外部源)
应用程序上下文:/erp
c.启动
网址:http://localhost:9001/erp/ds/jsp/dsjjNeweip.jsp
网址:http://localhost:9001/erp/
账号:J046311,郭慧芳
密码:06521
d.启动
前提:必须编译整个项目
第1步:将 local/config/localAjax.xml 更新到 ../apache-tomcat-9.0.106/bin/config/sxjg/local/localAjax.xml
第2步:将 local/build/libs/local.jar 手动放入 WEB-INF/lib/local.jar
报错:遇到RMI,1099连接有问题,请停掉全部java应用
访问:http://localhost:9001/erp/local/ajax?_controller=localTest&_action=list
c.配置Tomcat-local
a.地址
/opt/homebrew/Cellar/tomcat@9/9.0.104/libexec/bin
文件夹(config)
文件夹(dq)
文件夹(du)
文件夹(html)
文件夹(waslogs)
文件夹(WEB-INF)
文件(erp.ini)
-------------------------------------------------------------------------------------------------
/opt/homebrew/Cellar/tomcat@9/9.0.104/libexec/lib
文件(ojdbc8.jar)
-------------------------------------------------------------------------------------------------
/opt/homebrew/Cellar/tomcat@9/9.0.104/libexec/webapps
文件夹(erp -> META-INF -> MANIFEST.MF、war-tracker)
b.服务器
应用程序服务器:Tomcat 9.0.104
启动后默认浏览器:http://localhost:9002/erp/
虚拟机选项:-Dcom.icsc.compNo=sxjg -Dcom.icsc.serverName-ERPsxjg -Dcom.icsc.instanceNo=0l -Dcom.icsc.dpms.de.dejc300.j2ee=true
执行“更新”操作时:重启服务器
JRE:1.8
Tomcat服务器设置:HTTP端口(9002)、JMX端口(1099)
c.部署
在服务器启动时部署:zg-erp(外部源)
应用程序上下文:/erp
d.启动
前提:必须编译整个项目
第1步:将 local/config/localAjax.xml 更新到 ../apache-tomcat-9.0.105/bin/config/sxjg/local/localAjax.xml
第2步:将 local/build/libs/local.jar 手动放入 WEB-INF/lib/local.jar
-------------------------------------------------------------------------------------------------
说明:DQ远程生产环境的【类似,RabbitMQ中间件】
报错:遇到RMI,1099连接有问题,请停掉全部java应用
访问:http://localhost:9002/erp/local/ajax?_controller=localTest&_action=list
02.项目结构
a.源码
a.地址
https://git.jggroup.cn/server/zg-erp/
前端服务:de.jar 的 com.icsc.dpms.de 包
外部服务:config/localAjax.xml
b.汇总
销售:il、sb、sh、so、sr
焊管:ihp、ofp、pop、typ、whp
热冷轧:ic、ih、ix、ol、po、ty、wh、wz
财务:aa、ap、ar、av、ff、fl、fn、ft
购储运:mf、mi、mp、mi
质量:qsc、sl、tc、tl、tm、tp、tq
炼钢:ib、is、oj、ws
棒线:id、od、pod、wd
c.目录
local:本地扩展模块
-------------------------------------------------------------------------------------------------
dd:help -> javadoc -> dd 业务树+收藏夹
dq:help -> dq
ds:help -> javadoc -> ds
dz:help -> dz
-------------------------------------------------------------------------------------------------
help:帮助手册,daotool、di、dq、dz、ezomq、javadoc
html:html页面,his.$xpostJSON("/erp/rest/hr/a2010/queryA22?_AppId=HRJJA2010", this.hrA21, resp => {
-------------------------------------------------------------------------------------------------
images:img资源,dqwiOff.jpg、dqwiOn.jpg
-------------------------------------------------------------------------------------------------
jsp:文档(dzjjdoc.jsp)、正式(dzjjERP.jsp)、测试(dzjjERPNew.jsp)
lib:发布jar包供其他模块使用,tm.jar、tms.jar、tp.jar、tq.jar、tq-fr.jar、ty.jar、typ.jar、ub.jar
META-INF:Manifest-Version: 1.0
-------------------------------------------------------------------------------------------------
out:artifacts.sxjg_Web_exploded.out,默认Tomcat输出路径
public:excel、word、ppt、pdf
waslogs:警告日志,stdout.txt、AAJJE0030_ERPsxjg.log
-------------------------------------------------------------------------------------------------
WEB-INF:bsh(脚本)、classes(dpms语言包、eform表格标签)、lib(扩展本地包)、reportlets(脚本)、tld(标签)
WEB-INF:web.xml(servlet过滤器)、xfire.xml、xfire-customEditors.xml、xfire-servlet.xml
work:错误日志,traceSwitch.txt
d.gradle
settings.gradle 定义了项目的整体结构,告诉Gradle有哪些模块。
gradlew (或 gradlew.bat) 是执行Gradle构建的入口脚本,它确保你使用的是正确的Gradle版本。
gradle.properties 提供了全局或项目级别的配置属性。
build.gradle 是每个模块的核心构建文件,它包含了具体的构建逻辑和配置。
-------------------------------------------------------------------------------------------------
当你运行gradlew build这样的命令时,
Gradle会首先读取settings.gradle来了解项目结构,
然后根据gradle.properties中的配置,
最后执行各个模块的build.gradle中定义的构建任务。
b.编码
a.分类1
aa:财务
ap:财务
ar:财务
av:财务
-------------------------------------------------------------------------------------------------
dd:help -> javadoc -> dd 业务树+收藏夹
dq:help -> dq
ds:help -> javadoc -> ds
dz:help -> dz
-------------------------------------------------------------------------------------------------
ff:财务
fl:财务
fn:财务
ft:财务
b.分类2
hb:考评管理系统
hd:出勤管理系统
hg:劳保用品管理系统
hr:人事管理系统
hs:薪资管理系统
ht:培训管理系统
-------------------------------------------------------------------------------------------------
help:帮助手册
html:html页面,his.$xpostJSON("/erp/rest/hr/a2010/queryA22?_AppId=HRJJA2010", this.hrA21, resp => {
c.分类3
ib:方坏存货管理系统
ic:热冷轧
id:棒线存货及放行管理系统
ih:钢卷存货管理系统
il:销售
-------------------------------------------------------------------------------------------------
images:img资源,dqwiOff.jpg、dqwiOn.jpg
d.分类4
is:炼钢,板坏、矩形坏存货管理系统
ix:热冷轧
local:晋钢内部人员开发扩展模块
-------------------------------------------------------------------------------------------------
jsp:文档(dzjjdoc.jsp)、正式(dzjjERP.jsp)、测试(dzjjERPNew.jsp)
lib:发布jar包供其他模块使用,tm.jar、tms.jar、tp.jar、tq.jar、tq-fr.jar、ty.jar、typ.jar、ub.jar
META-INF:Manifest-Version: 1.0
e.分类5
mf:帐务管理系统
mi:物料管理系统
mp:采购管理系统
mr:原料管理系统
od:棒线生产实绩收集
oj:炼钢信息收集系统
ol:热冷轧
-------------------------------------------------------------------------------------------------
out:artifacts.sxjg_Web_exploded.out,默认Tomcat输出路径
f.分类6
po:热冷轧
pod:棒线生产订单管理
-------------------------------------------------------------------------------------------------
public:excel、word、ppt、pdf
-------------------------------------------------------------------------------------------------
qsc:质量
g.分类7
sa:销售
sb:销售
sg:销售
sh:销售
sl:销售
so:销售
sr:销售
ss:销售
h.分类8
tc:质量
tl:质量
tm:质量
tp:质量
tq:质量
ty:热冷轧
i.分类9
waslogs:警告日志,stdout.txt、AAJJE0030_ERPsxjg.log
-------------------------------------------------------------------------------------------------
wd:棒线轧钢排程管理
-------------------------------------------------------------------------------------------------
WEB-INF:bsh(脚本)、classes(dpms语言包、eform表格标签)、lib(扩展本地包)、reportlets(脚本)、tld(标签)
WEB-INF:web.xml(servlet过滤器)、xfire.xml、xfire-customEditors.xml、xfire-servlet.xml
-------------------------------------------------------------------------------------------------
wh:热冷轧
-------------------------------------------------------------------------------------------------
work:错误日志,traceSwitch.txt
-------------------------------------------------------------------------------------------------
ws:炼钢排程管理系统
wz:热冷轧
03.扩展开发
a.guide:开发规范
a.anno
@dsjcAuthResourceInfoId("HDJJE0610")
@dejcReqParam:post参数注解
@dejcTransactional:事务注解
@dejcPureSvc:返回图片
b.rules
api:对接三方,提供WS系統的api,hdjcApiWS
bsTable:连接Sql的对象
batch:批量操作API,对接rest、rpt、bsTable
-------------------------------------------------------------------------------------------------
bs:bussiness对象
di:sring中di对象
dao:dao对象、vo对象
entity:entity对象
report:report对象
helper:helper对象
type:字段类型转换
payroll:支付回调
-------------------------------------------------------------------------------------------------
rest:理解为三层中的控制层
rpt:理解为三层中的业务层,为rest的下层
-------------------------------------------------------------------------------------------------
ui:理解为三层中的controller层中返回的UI组件,返回内容为com.icsc.dpms.de.rest.dejcRestInfoOut组件,属性有msg、msgType、error、voContainer、uiCtrl、voCache、uuid
tag:理解为三层中的controller层中返回的tag组件
thrd:理解为三层中的controller层中返回的thrd组件
link:直接解析到html/jsp的代码片段,<%=hdjcLinkHR.getHRM0VOJSON()%>
upload:理解为三层中的controller层中返回的upload组件,返回内容为com.icsc.hb.upload.hbjiExcelUpload组件,属性有upload、setParameter、getObject、getMsg
-------------------------------------------------------------------------------------------------
model:直接解析到html/jsp的代码片段,<%=hbjcCommentSelectionDefault.getDefault("qry.commentSelect")%>
monthBonus:实际为 bs 中 hbjcBsAC020类 下面的一个属性,比如hbjcMonthBonus_calDeptBonusByLeader.java
-------------------------------------------------------------------------------------------------
util:工具包
b.local:本地扩展模块
a.分类1:配置
a.annotation
CheckSign:检查签名
b.config
.gitkeep:占位文件
c.security
.gitkeep:占位文件
d.servlet
LocalFileUploadServlet.java,继承HttpServlet,已废弃
e.enums
枚举类:C2MShopTaskStatusEnum.java
f.filter
请求包装类:CachedBodyHttpServletRequest.java
请求包装类:JgApiSignCheckFilter
---------------------------------------------------------------------------------------------
对请求参数 _controller 和 _action 进行校验,确保其有效性。
如果目标方法需要签名验证(通过 @CheckSign 注解指定),则校验请求中的签名。
如果签名验证通过,放行请求;否则返回错误响应。
g.generator
MP代码生成器:实体,mapper接口,mapper.xml
MP代码生成器-配置:/generatorConfig.xml
h.job,定时任务
mr:原料管理系统
so:销售
---------------------------------------------------------------------------------------------
test:测试
b.分类2:三层
a.controller
common:公共Controller层,CustomController.java、DashboardController.java、MapController.java、ProductController.java
core:核心Controller层,BaseController.java,公共继承父类
test:测试Controller层,风格1(TestController.java)、风格2(TestMybatisController)
---------------------------------------------------------------------------------------------
aa:财务
ap:财务
---------------------------------------------------------------------------------------------
il:销售
ix:热冷轧
mp:采购管理系统
mr:原料管理系统
---------------------------------------------------------------------------------------------
sa:销售
sb:销售
sh:销售
so:销售
sr:销售
ss:销售
---------------------------------------------------------------------------------------------
tl:质量
tp:质量
b.service
test:测试Service层,ITestService.java 包括 findByNo、findAll、save、updateByNo、deleteByNo、count、findByPage、txTest
aa:财务
ap:财务
---------------------------------------------------------------------------------------------
ix:热冷轧
mp:采购管理系统
mr:原料管理系统
---------------------------------------------------------------------------------------------
sb:销售
sh:销售
so:销售
ss:销售
---------------------------------------------------------------------------------------------
tl:质量
tp:质量
c.mapper
test:测试Mapper层,TestDao.java 包括 list、findById、insert、update、delete
---------------------------------------------------------------------------------------------
aa:财务
ap:财务
---------------------------------------------------------------------------------------------
mp:采购管理系统
mr:原料管理系统
---------------------------------------------------------------------------------------------
sb:销售
sh:销售
so:销售
tl:质量
c.分类3:4类对象
a.dao
common:公共Dao层,CustomDao.java、DashboardDao.java、MapDao.java、ProductDao.java
core:核心Dao层,BaseDao.java 包括 list、findById、insert、update、delete
test:测试Dao层,TestDao.java 包括 list、findById、insert、update、delete
---------------------------------------------------------------------------------------------
il:销售
ix:热冷轧
mp:采购管理系统
mr:原料管理系统
---------------------------------------------------------------------------------------------
sa:销售
sb:销售
sh:销售
so:销售
sr:销售
ss:销售
---------------------------------------------------------------------------------------------
tp:质量
b.dto
aa:财务
ap:财务
---------------------------------------------------------------------------------------------
sa:销售
sb:销售
sh:销售
so:销售
ss:销售
---------------------------------------------------------------------------------------------
tl:质量
---------------------------------------------------------------------------------------------
PageRecords.java:分页对象,包括records、current、pages、size、total
Result.java:响应对象,包括code、message、data、extra
c.entity
common:公共entity层,MapCity.java、MapDistrict.java、MapProvince.java
test:测试entity层,MybatisTest.java、MybatisTestExample.java、Test.java
---------------------------------------------------------------------------------------------
aa:财务
---------------------------------------------------------------------------------------------
il:销售
ix:热冷轧
---------------------------------------------------------------------------------------------
mes:MES系统
---------------------------------------------------------------------------------------------
mp:采购管理系统
mr:原料管理系统
---------------------------------------------------------------------------------------------
sb:销售
sh:销售
so:销售
sr:销售
ss:销售
---------------------------------------------------------------------------------------------
tl:质量
tp:质量
d.vo
common:公共vo层,DictionaryVO.java
aa:财务
ap:财务
---------------------------------------------------------------------------------------------
sa:销售
sb:销售
sh:销售
so:销售
sr:销售
ss:销售
---------------------------------------------------------------------------------------------
tl:质量
d.分类4:utils工具包
a.bean
Bean2SqlUtils.java:类转sql
BeanConvertUtils.java:bean转换util
b.common
PaginationUtil:分页工具类
c.constant
MRInterfaceUrl:原料调物流接口量类
d.db
JdbcUtil.java:JDBC工具类,java:comp/env/jdbc/dssxjg
JdbcUtilEp.java:JDBC工具类,连接Ep数据库,java:comp/env/jdbc/dssxjgmq
e.file
DrjcFileUtil.java:附件工具
f.http
OkHttpUtil:HTTP工具类,支持get、post
g.json
JsonUtil:JSON工具类
h.properties
PropertiesUtil:获取资源文件工具类
i.xml
XmlParserUtils:解析XML工具类
e.分类5:resources工具包
a.ds
dssxjg.xml:分页
dssxjgmq.xml:分页
dssxjgqs.xml:分页
b.log
log4j.properties:标准输出(控制台)
log4j.properties:日志文件(${user.dir}/waslogs/local/local-${com.icsc.serverName}.log)
log4j.properties:错误日志(${user.dir}/waslogs/local/local-error-${com.icsc.serverName}.log)
c.mapper
test:测试Mapper层的对应XML文件,TestDao.java 包括 list、findById、insert、update、delete
---------------------------------------------------------------------------------------------
aa:财务
ap:财务
---------------------------------------------------------------------------------------------
mp:采购管理系统
mr:原料管理系统
---------------------------------------------------------------------------------------------
sb:销售
sh:销售
so:销售
---------------------------------------------------------------------------------------------
tl:质量
d.mybatis-config.xml
a.settings标签
控制台输出sql语句
控制台输出sql语句
全局的映射器启用或禁用缓存
全局启用或禁用延迟加载
当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载
允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动)
使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动
当前oracle不支持useGeneratedKeys
指定MyBatis如何自动映射列到字段/属性。PARTIAL只会自动映射简单,没有嵌套的结果。FULL会自动映射任意复杂的结果(嵌套的或其他情况)
配置默认的执行器。SIMPLE执行器没有什么特别之处。REUSE执行器重用预处理语句。BATCH执行器重用语句和批量更新
设置超时时间,它决定驱动等待一个数据库响应的时间
驼峰映射
b.typeAliases标签
别名定义
c.mappers标签
映射文件,存放sql语句的配置文件 spring管理
e.properties
a.local.properties
#调用物流同步接口
car_url=http://172.17.8.57:9000/tms/capacitySync/syncSmCars
driver_url=http://172.17.8.57:9000/tms/capacitySync/syncSmDriver
material_big_url=http://172.17.8.57:9000/tms/catalog/save
material_small_url=http://172.17.8.57:9000/tms/material/save
material_small_detail_url=http://172.17.8.57:9000/tms/material/saveRel
supplier_url=http://172.17.8.57:9000/tms/supplier/save
contract_url=http://172.17.8.57:9000/tms/purchaseSync/syncPurchaseContract
wh_url=http://172.17.8.57:9000/tms/whCatalog/save
transport_url=http://172.17.8.57:9000/tms/erp/receiveTransportLine
trainPlan_url=http://172.17.8.57:9000/tms/erp/trainDeliverySave
b.local-test.properties
test.url=https://api.vvhan.com/api/visitor.info
f.spring
a.示例
local-test.xml:数据源、service实现类交给spring管理并注入mapper、mapper接口交给spring管理、声明式事务配置示例、切面配置cn.jggroup.service.test.*Service所有方法
b.汇总
local-aa.xml:财务,配置需要引入的数据源、注入依赖
local-ap.xml:财务,配置需要引入的数据源、注入依赖
-----------------------------------------------------------------------------------------
local-mp.xml:采购管理系统,配置需要引入的数据源、注入依赖、声明式事务、切面配置
local-mr.xml:原料管理系统,配置需要引入的数据源、注入依赖、声明式事务、切面配置
-----------------------------------------------------------------------------------------
local-sb.xml:销售,配置需要引入的数据源、注入依赖
local-sh.xml:销售,配置需要引入的数据源、注入依赖
local-so.xml:销售,配置需要引入的数据源、注入依赖
local-ss.xml:销售,配置需要引入的数据源、注入依赖
-----------------------------------------------------------------------------------------
local-tl.xml:质量,配置需要引入的数据源、注入依赖
g.generatorConfig.xml
<generatorConfiguration>
<context id="ORACLE_TABLE" targetRuntime="MyBatis3">
<jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@xxx.xx.xx.xxx:xxxx:jgdb"
userId="username"
password="password">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<javaModelGenerator targetPackage="cn.jggroup.model.entity.test" targetProject="./src/main/java">
<!-- <property name="enableSubPackages" value="true" />-->
<!-- <property name="trimStrings" value="true" />-->
</javaModelGenerator>
<sqlMapGenerator targetPackage="cn.jggroup.model.entity.test" targetProject="./src/main/java">
<!-- <property name="enableSubPackages" value="true" />-->
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="cn.jggroup.mapper.test" targetProject="./src/main/java">
<!-- <property name="enableSubPackages" value="true" />-->
</javaClientGenerator>
<table tableName="DB.TEST" domainObjectName="MybatisTest" ></table>
</context>
</generatorConfiguration>
h.local-spring.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 引入每个业务的spring配置文件 -->
<import resource="classpath:spring/*.xml"/>
<!-- 引入log4j配置文件 -->
<bean id="log4jInitializer" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="org.springframework.util.Log4jConfigurer"/>
<property name="targetMethod" value="initLogging"/>
<property name="arguments">
<list>
<value>classpath:log/log4j.properties</value>
</list>
</property>
</bean>
<!-- 文件验证器 -->
<!-- <bean id="fileValidator" class="cn.jggroup.utils.file.FileValidator">-->
<!-- <property name="allowedTypes">-->
<!-- <list>-->
<!-- <value>application/pdf</value>-->
<!-- <value>application/vnd.ms-excel</value>-->
<!-- <value>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</value>-->
<!-- <value>application/msword</value>-->
<!-- <value>application/vnd.openxmlformats-officedocument.wordprocessingml.document</value>-->
<!-- </list>-->
<!-- </property>-->
<!-- </bean>-->
</beans>
04.签名认证
a.签名使用说明
a.签名包说明
jg-sign-keystore.jar:主要存储密钥,向量等信息,是签名基础包,无论生成还是验签都需要引入这个依赖。
jg-sign-generate.jar:主要用来生成签名,依赖1号jar包。
jg-sign-verify.jar:主要用来验证签名,依赖1号jar包。
b.签名包使用示例
try {
//请求参数示例
Map<String, String> reqParams = new HashMap<>();
//erp系统固定方法调用参数
params.put("_controller", "localTest");
params.put("_action", "query");
params.put("_AppId", "LOCALAPITEST");
//参数为json格式的话,把json放入body中
params.put("body", json);
/**
* @reqParams 请求参数map
* @AlgoEnum 签名算法(目前支持HMAC,AES,RSA)
* @return 返回带有签名和签名算法以及时间戳的请求map,调用方直接使用此参数请求接口即可
*/
Map<String, String> signParams = SignGenerateUtil.generateSignedParams(reqParams, AlgoEnum.HMAC);
}catch (Exception e) {
}
-------------------------------------------------------------------------------------------------
上述代码执行结果:
{ signAlgo=HMAC,
_controller=localTest,
sign=htQfVz8z6bikGcjpWcirUxUmaRKMWZfYRoZwVcvn5QY=,
_AppId=LOCALAPITEST,
_action=query,
timestamp=1741052229073
}
-------------------------------------------------------------------------------------------------
生成了sign、signAlgo、timestamp三个参数:
sign 签名
signAlgpo 签名算法
timestamp 签名时间戳
-------------------------------------------------------------------------------------------------
生成header 格式: X-Api-Signature: sign | timestamp | signAlgo
请求添加以上header即可 X-Api-Signature: htQfVz8z6bikGcjpWcirUxUmaRKMWZfYRoZwVcvn5QY= | 1741052229073 | HMAC
c.验签包使用示例
//将带有签名参数的请求传入即可验签 通过true 反则false
boolean bool = SignVerifyUtils.verifySignature(reqParams);
b.开启接口验签功能
a.注解使用示例
//CheckSign注解加在api方法上
//@CheckSign 和 @CheckSign(value = true) 等效,需要进行签名认证
//@CheckSign(value = false) 和不加等效,不进行签名认证
@CheckSign
public void list(){
//TODO
}
@CheckSign(value = true)
public void findById() {
//TODO
}
@CheckSign(value = false)
public void insert(){
//TODO
}
public void delete(){
//TODO
}
b.验证过滤器开启示例
开启验签功能前提需要加载 JgApiSignCheckFilter,具体做法为在web.xml中配置如下:
<!-- 配置启用签名认证的过滤器,如果不启用@CheckSign注解不生效 -->
<filter>
<filter-name>JgApiSignCheckFilter</filter-name>
<filter-class>cn.jggroup.filter.JgApiSignCheckFilter</filter-class>
</filter>
<!-- 配置拦截url -->
<filter-mapping>
<filter-name>JgApiSignCheckFilter</filter-name>
<url-pattern>/local/ajax</url-pattern>
</filter-mapping>
c.综上所述
a.说明1
在您提供的代码中,加密验证规则主要涉及到签名的验证。具体来说,代码通过以下步骤进行签名验证:
获取请求参数:从请求中获取参数,并从请求头中获取签名信息,包括签名值、时间戳和签名算法。
检查签名信息:确保签名信息不为空,并且格式正确(即包含三个部分:签名值、时间戳和签名算法)。
构建参数映射:将签名信息放入参数映射中,以便后续验证使用。
b.说明2
调用签名验证工具:使用SignVerifyUtils.verifySignature(params)方法验证签名。这个方法根据签名算法(RSA、HMAC或AES)选择相应的验证方式。
RSA验证:使用公钥进行签名验证,确保数据未被篡改。
HMAC验证:使用预共享密钥进行签名验证,确保数据完整性。
AES验证:使用对称密钥进行加密验证,确保数据安全。
验证结果处理:如果签名验证失败,返回错误信息;如果验证成功,则继续处理请求。
05.签名认证(ejia)
a.需求
a.说明
薪资接口
入参:工号
出参:json信息
b.安全性
方式1:B2B,@CheckSign,因为工具类内部公布,存在信息泄露,故而不能使用
方式2;ejia -> 报文 / 请求头 -> erp
c.设计
ejia 发起 随机性 -> xxxxJ057xxxx -> 校验 随机性
说明:这个用法仅存在于【薪资】接口,不使用【RSA/HMAC/AES】这种固有加密
b.代码分析
a.dejcAbsAjaxFunctionalController.class
protected String getJSON() {
if (this.json != null && !this.json.equals("")) {
return this.json;
} else {
ByteArrayOutputStream var1 = new ByteArrayOutputStream();
byte[] var2 = new byte[1000];
try {
ServletInputStream var3 = this.getReq().getInputStream();
while(true) {
int var4 = var3.read(var2);
if (var4 < 0) {
this.json = var1.toString("UTF-8");
String var16 = this.json;
return var16;
}
var1.write(var2, 0, var4);
}
} catch (IOException var14) {
var14.printStackTrace();
} finally {
try {
var1.close();
} catch (IOException var13) {
var13.printStackTrace();
}
}
return (new JSONObject()).toString();
}
}
b.说明
这个 getJSON() 方法用于获取 HTTP 请求的 请求体(Request Body)。
-------------------------------------------------------------------------------------------------
方法中最关键的一行是:ServletInputStream var3 = this.getReq().getInputStream();
this.getReq() 返回的是一个标准的 HttpServletRequest 对象。
request.getInputStream() 是 Java Servlet API 中用来读取 HTTP 请求体内容的标准方法。它将请求体作为原始的二进制数据流返回。
-------------------------------------------------------------------------------------------------
它获取的是什么?
请求体 (Request Body):是的,这正是它获取的内容。整个方法的逻辑就是从这个输入流中读取所有的字节,然后将这些字节转换成一个 UTF-8 编码的字符串。
这通常用于接收客户端(例如浏览器中的 JavaScript)通过 POST、PUT 等方法发送的原始数据,最典型的场景就是接收一个 JSON 格式的字符串。
-------------------------------------------------------------------------------------------------
它不能获取什么?
请求头 (Request Headers):不能。请求头信息(如 Content-Type, User-Agent, Authorization 等)是通过 request.getHeader("...") 或 request.getHeaders("...") 等方法获取的。getJSON() 方法中没有调用这些方法。
报文参数 (Request Parameters):不能。这里“报文参数”通常指通过 URL 查询字符串(如 /api?id=123)或 application/x-www-form-urlencoded 格式的表单提交的键值对。这些参数是通过 request.getParameter("...") 来获取的。getJSON() 方法直接读取原始请求体,绕过了 Servlet 容器对参数的解析过程。
c.接口分析
a.接口发起
curl --location 'http://erp.app.jggroup.cn/erp/local/ajax?_controller=hrContract&_action=queryContractByEmpNo' \
--header 'Content-Type: application/json' \
--header 'Cookie: JSESSIONID=6A10ACBBE2043F49FACEFD9A903D22CA-g1.ERPsxjg' \
--data '{
"empNo": "J057240",
"oid": "6536ebc3d5de05bd3a275e56"
}'
b.接口校验oid
<!-- 操作合法性 -->
<select id="queryOperationByOid" resultType="boolean">
SELECT
COUNT(*)
FROM
DB.TBHRM1
WHERE
openid = #{oid}
</select>
3.3 人资领域业务
00.常见信息
a.基础信息
a.git分支
git clone ssh://[email protected]:9022/server/zg-erp.git 20-zg-erp
-------------------------------------------------------------------------------------------------
dev_C2M_YJC
dev_C2M_hyp
dev_CRM_hongwei.li
dev_crm
dev_zhangyu
dev_zhengyupeng
master
b.数据库
测试库:具有读写权限,但是里面是测试数据
JdbcUtil.java:JDBC工具类,java:comp/env/jdbc/dssxjg,对应【jdbc:oracle:thin:@172.17.12.202:1521:jgdb】
JdbcUtilEp.java:JDBC工具类,连接Ep数据库,java:comp/env/jdbc/dssxjgmq
c.开发local模块
前提:必须编译整个项目
第1步:将 local/config/localAjax.xml 更新到 ../apache-tomcat-9.0.106/bin/config/sxjg/local/localAjax.xml
第2步:将 local/build/libs/local.jar 手动放入 WEB-INF/lib/local.jar
访问:http://localhost:9001/erp/local/ajax?_controller=transport&_action=queryAll、cn.jggroup.controller.mr.TransportLineController
访问:http://localhost:9001/erp/local/ajax?_controller=localTest&_action=list
b.从远程 master 分支拉取最新更改,然后提交到远程的 dev_zhangyu 分支
a.切换到本地 dev_zhangyu 分支
git checkout dev_zhangyu
b.拉取远程 master 分支的更改,在本地 dev_zhangyu 分支上,将远程 master 分支的更改合并到当前分支
git pull origin master
这将把 origin 远程仓库中的 master 分支的更改拉取下来,并合并到当前的 dev_zhangyu 分支。
c.解决合并冲突(如果有)
1.打开冲突文件并手动编辑,解决冲突标记(<<<<<<, ======, >>>>>>)。
2.标记冲突已解决并更新暂存区:git add <file_with_conflicts>
3.一旦所有冲突解决,完成合并:git commit -m "Merge master into dev_zhangyu"
4.将合并后的更改推送到远程的 dev_zhangyu 分支:git push origin dev_zhangyu
01.考评管理系统:hb
a.项目结构
dao:DAO/VO对象
bs:bussiness对象
helper:helper对象
type:字段类型转换
-------------------------------------------------------------------------------------------------
rest:理解为三层中的控制层
rpt:理解为三层中的业务层,为rest的下层
-------------------------------------------------------------------------------------------------
ui:理解为三层中的controller层中返回的UI组件,返回内容为com.icsc.dpms.de.rest.dejcRestInfoOut组件,属性有msg、msgType、error、voContainer、uiCtrl、voCache、uuid
tag:理解为三层中的controller层中返回的tag组件
thrd:理解为三层中的controller层中返回的thrd组件
link:直接解析到html/jsp的代码片段,<%=hdjcLinkHR.getHRM0VOJSON()%>
upload:理解为三层中的controller层中返回的upload组件,返回内容为com.icsc.hb.upload.hbjiExcelUpload组件,属性有upload、setParameter、getObject、getMsg
-------------------------------------------------------------------------------------------------
model:直接解析到html/jsp的代码片段,<%=hbjcCommentSelectionDefault.getDefault("qry.commentSelect")%>
monthBonus:实际为 bs 中 hbjcBsAC020类 下面的一个属性,比如hbjcMonthBonus_calDeptBonusByLeader.java
-------------------------------------------------------------------------------------------------
util:工具包
b.resources
无
02.出勤管理系统:hd
a.项目结构
api:对接三方,提供WS系統的api,hdjcApiWS
bsTable:连接Sql的对象
batch:批量操作API,对接rest、rpt、bsTable
-------------------------------------------------------------------------------------------------
bs:bussiness对象
di:sring中di对象
dao:dao对象、vo对象
entity:entity对象
report:report对象
helper:helper对象
type:字段类型转换
-------------------------------------------------------------------------------------------------
rest:理解为三层中的控制层
rpt:理解为三层中的业务层,为rest的下层
-------------------------------------------------------------------------------------------------
ui:理解为三层中的controller层中返回的UI组件,返回内容为com.icsc.dpms.de.rest.dejcRestInfoOut组件,属性有msg、msgType、error、voContainer、uiCtrl、voCache、uuid
tag:理解为三层中的controller层中返回的tag组件
thrd:理解为三层中的controller层中返回的thrd组件
link:直接解析到html/jsp的代码片段,<%=hdjcLinkHR.getHRM0VOJSON()%>
upload:理解为三层中的controller层中返回的upload组件,返回内容为com.icsc.hb.upload.hbjiExcelUpload组件,属性有upload、setParameter、getObject、getMsg
-------------------------------------------------------------------------------------------------
util:工具包
b.resources
无
03.人事管理系统:hr
a.项目结构
api:对接三方,提供WS系統的api,hdjcApiWS
-------------------------------------------------------------------------------------------------
bs:bussiness对象
dao:dao对象、vo对象
di:sring中di对象
type:字段类型转换
helper:helper对象
-------------------------------------------------------------------------------------------------
rest:理解为三层中的控制层
rpt:理解为三层中的业务层,为rest的下层
-------------------------------------------------------------------------------------------------
ui:理解为三层中的controller层中返回的UI组件,返回内容为com.icsc.dpms.de.rest.dejcRestInfoOut组件,属性有msg、msgType、error、voContainer、uiCtrl、voCache、uuid
tag:理解为三层中的controller层中返回的tag组件
thrd:理解为三层中的controller层中返回的thrd组件
link:直接解析到html/jsp的代码片段,<%=hdjcLinkHR.getHRM0VOJSON()%>
upload:理解为三层中的controller层中返回的upload组件,返回内容为com.icsc.hb.upload.hbjiExcelUpload组件,属性有upload、setParameter、getObject、getMsg
-------------------------------------------------------------------------------------------------
model:直接解析到html/jsp的代码片段,<%=hbjcCommentSelectionDefault.getDefault("qry.commentSelect")%>
monthBonus:实际为 bs 中 hbjcBsAC020类 下面的一个属性,比如hbjcMonthBonus_calDeptBonusByLeader.java
-------------------------------------------------------------------------------------------------
util:工具包
b.resources
无
04.薪资管理系统:hs
a.项目结构
batch:批量操作API,对接rest、rpt、bsTable
-------------------------------------------------------------------------------------------------
bs:bussiness对象
dao:dao对象、vo对象
entity:entity对象
type:字段类型转换
helper:helper对象
payroll:支付回调
-------------------------------------------------------------------------------------------------
rest:理解为三层中的控制层
rpt:理解为三层中的业务层,为rest的下层
-------------------------------------------------------------------------------------------------
ui:理解为三层中的controller层中返回的UI组件,返回内容为com.icsc.dpms.de.rest.dejcRestInfoOut组件,属性有msg、msgType、error、voContainer、uiCtrl、voCache、uuid
tag:理解为三层中的controller层中返回的tag组件
thrd:理解为三层中的controller层中返回的thrd组件
link:直接解析到html/jsp的代码片段,<%=hdjcLinkHR.getHRM0VOJSON()%>
upload:理解为三层中的controller层中返回的upload组件,返回内容为com.icsc.hb.upload.hbjiExcelUpload组件,属性有upload、setParameter、getObject、getMsg
-------------------------------------------------------------------------------------------------
util:工具包
b.resources
无
05.培训管理系统:ht
a.项目结构
bs:bussiness对象
dao:dao对象、vo对象
df:check对象
type:字段类型转换
-------------------------------------------------------------------------------------------------
rest:理解为三层中的控制层
rpt:理解为三层中的业务层,为rest的下层
-------------------------------------------------------------------------------------------------
ui:理解为三层中的controller层中返回的UI组件,返回内容为com.icsc.dpms.de.rest.dejcRestInfoOut组件,属性有msg、msgType、error、voContainer、uiCtrl、voCache、uuid
tag:理解为三层中的controller层中返回的tag组件
thrd:理解为三层中的controller层中返回的thrd组件
link:直接解析到html/jsp的代码片段,<%=hdjcLinkHR.getHRM0VOJSON()%>
upload:理解为三层中的controller层中返回的upload组件,返回内容为com.icsc.hb.upload.hbjiExcelUpload组件,属性有upload、setParameter、getObject、getMsg
-------------------------------------------------------------------------------------------------
model:直接解析到html/jsp的代码片段,<%=hbjcCommentSelectionDefault.getDefault("qry.commentSelect")%>
monthBonus:实际为 bs 中 hbjcBsAC020类 下面的一个属性,比如hbjcMonthBonus_calDeptBonusByLeader.java
-------------------------------------------------------------------------------------------------
util:工具包
b.resources
无
3.4 人事管理系统:hr
00.人事管理系统【HR】
a.系统设定
HRJJT0010 人事规范简易代码表维护
HRJJT4010 岗位代号组成设定
b.招聘管理
HRJJRM120 履历资料维护
HRJJRM110 招聘资料维护
c.组织管理
HRJJT1010 部门基本数据维护 √ DB.TBHRT1
HRJJT2010 职称基本数据维护 √ DB.TBHRT2
HRJJT3010 职位基本数据维护 √ DB.TBHRT3
d.人事管理
HRJJM0010 员工基本数据维护 √ DB.TBHRM0
HRJJMA010 员工异动资料维护
HRJJA3010 员工内部竞聘申请
HRJJA1010 员工离职申请
HRJJM0110 员工离职数据维护
HRJJA2010 职缺申请作业
HRJJA5010 员工职务交接申请
HRJJM1010 员工个人资料维护
HRJJMF010 员工职务代理人维护
HRJJMG010 员工支援其他部门资料维护
e.合同管理
HRJJC1010 员工合同管理维护
HRJJC1020 员工合同续签作业
HRJJC1030 员工合同续签审批作业
f.保险管理
HRJJT5010 社会保险/公积金参数设定
HRJJMH010 员工社会保险/公积金数据维护
HRJJMJ010 员工社会保险/公积金基数调整
g.人力资源挑选
HRJJS0210 人力资源取资料设定
HRJJS0310 人力资源资料取作业
报表管理
01.20250702,根据工号获取合同信息
a.需求
智能审批 -> 发起审批 -> 普通员工合同签署(电子签章)
智能审批 -> 发起审批 -> 普通员工合同签署(电子签章)(干部)
b.信息
入参:工号
出参:以下信息
-----------------------------------------------------------------------------------------------------
提交人
手机号
合同编号
签订日期
甲方
注册地址
乙方
身份证号
联系电话
联系地址
紧急联系人姓名
紧急联系人电话
紧急联系人地址
岗位
工作地点
基本工资
-----------------------------------------------------------------------------------------------------
合同类型1:
固定期限起始日
固定期限终止日
共几年
试用期
试用期起始日
试用月数
试用期工资
综合年薪(万元)
-----------------------------------------------------------------------------------------------------
合同类型2:
任务期限起始日
任务期限项目
任务期限部分
试用期
试用期起始日
试用月数
试用期工资
综合年薪(万元)
-----------------------------------------------------------------------------------------------------
合同类型3:
无固定期限起始日
试用期
试用期起始日
试用月数
试用期工资
综合年薪(万元)
c.电子合同表
DB.TBHRM1
DB.TBHRM2
DB.TBHRM3
DB.TBHRM4
DB.TBHRM5
DB.TBHRM6
DB.TBHRM7
DB.TBHRM8
DB.TBHRM9
DB.TBHRM10
DB.TBHRM11
DB.TBHRM12
d.页面链路
http://erp.app.jggroup.cn/erp/hr/jsp/hrjjm0010.jsp
-> hr/jsp/hrjja2010.jsp 调用 hr/jsp/hrjjm0010.jsp
02.20250908,批量管理数据
a.需求
人员、组织、物料
主数据、人员修改、调某个接口
b.细节
3.5 薪资管理系统:hs
00.薪资管理系统【HS】
a.薪资设定
HSJJS0210 公式设定
HSJJT9010 薪资时点与薪资公式设定
HSJJT8010 薪资项目基本数据设定 √
HSJJTN010 工资级别和工资档次序列表维护
HSJJTT010 所得税速算公式数据设定
HSJJT4010 超时工作费率设定
HSJJR0010 报表基本资料维护
b.薪资作业
HSJJ02010 追补扣款资料维护 √
HSJJ02110 追补扣款申请作业 √
HSJJP0310 薪资作业
HSJJP0710 五险一金差异调整作业
HSJJP0810 个人所得税差异调整作业
HSJJP0410 薪资单打印
HSJJY0110 年度作业
HSJJR0210 报表打印与维护作业
c.薪资查询
HSJJP0510 每月薪给清单查询
HSJJP0610 年度所得查询
01.20250617
a.需求1
根据【公司】查询【每个人的基本薪资】
-----------------------------------------------------------------------------------------------------
SELECT
COMPID, -- 公司编码
DATACODE AS EMPNO, -- 员工编号
STRFIELDA AS AMOUNT, -- 一档工资
STRFIELDB AS ISINVOLVEDPERFORMANCE, -- 是否参与绩效 1 参与 0 不参与
STRFIELDC ISMETERING, -- 是否计量 1 计量 0 不计量
UPDATEDATE -- 修改时间
FROM DB.TBHRT0
WHERE TABLENO = 'HRHS0001'
AND COMPID = 'J02'
ORDER BY COMPID, DATACODE;
b.需求2
类型:社保、公积金
List<Map>:员工导入类,属性有【编号、金额(不同类型)】
-----------------------------------------------------------------------------------------------------
入参:薪资年月、薪资项目、列表(人、钱)为List<Map>
存入:薪资项目
-----------------------------------------------------------------------------------------------------
SELECT * FROM DB.TBHS021 ORDER BY formid DESC;
SELECT * FROM DB.TBHS022 WHERE formId = '202505000015'
-----------------------------------------------------------------------------------------------------
HSJJT8010_薪资项目基本数据设定
02.xxxxxxxx
a.xxx
4 晋钢综合管理平台
4.1 项目配置
01.常见信息
a.需求说明
a.文档
脚手架使用说明.doc
b.方式
第1种(直接低代码)
第2种(脚手架创建一份源码)
c.需求
轻应用:入职管理
b.晋钢一体化管理平台
a.管理平台
网址:http://172.17.8.57:81
网址:https://dp.jggroup.cn
账号:admin
密码:aaaaA123@
b.管理平台
账号:J057240
密码:aaaaA123#
密码:qwER159263.
c.管理平台
账号:J057983
密码:Ww2255456..
d.管理平台
账号:J044336
密码:aaaaA123.
c.晋钢一体化管理平台-测试
a.管理平台
网址:http://172.17.12.67:5173
网址:http://172.17.12.67:8001
账号:admin
密码:aaaaA123@
b.绕开登录
提问:用你账号,可以绕开登录吗?
回答:登录验证后端有校验,前端关闭校验也没用呀
02.常见服务
a.分类1
a.mysql
地址:172.17.8.57:3306
账号:root
密码:JinG@ng2025
b.redis
地址:172.17.8.57:6379
账号:无
密码:JinG@ng2025
c.nacos
地址:http://172.17.8.57:8848/nacos
账号:nacos
密码:JinG@ng2025
d.rocketmq
地址:http://172.17.8.57:18081
账号:admin
密码:JinG@ng2025
e.oracle
地址:jdbc:oracle:thin:@172.17.8.56:1521/jgdb
账号:JGTUSER
密码:JGTUSER#2025
---------------------------------------------
地址:jdbc:oracle:thin:@172.17.8.56:1521/jgdb
账号:PERFORMANCE
密码:PERFORMANCE
b.分类2
a.kuboard
地址:http://172.17.8.57:30080
账号:admin
密码:JinG@ng2025
服务:http://172.17.8.57:30080/kubernetes/default/namespace/micro-services
b.kibana
地址:http://172.17.8.57:5601
账号:elastic
密码:JinG@ng2025
c.elasticsearch
地址:http://172.17.8.57:9200
账号:elastic
密码:JinG@ng2025
c.分类3
a.应用
地址:http://172.17.8.57
账号:admin
密码:无
b.xxl-job
地址:http://172.17.8.57:8080/xxl-job-admin
账号:admin
密码:JinG@ng2025
c.kkfileview
地址:http://172.17.8.57:8012/preview
账号:无
密码:无
d.分类4
a.nexus
地址:172.17.8.55
账号:admin
密码:admin123,默认
密码:JinG@ng2025
n.verdaccio
地址:172.17.8.54
账号:j057240
密码:qeER159263
c.其他
ctm:10000
tms:10001
crm:10002
intelligentpark:10003
4.2 前端管理1
01.常用信息1
a.说明
a.本机
v14.16.1
v20.10.0
-------------------------------------------------------------------------------------------------
nvm alias default v14.16.1
nvm alias default v20.10.0
b.分支
jh4j-ui(默认master) 14.21.1
jh4j-ui-performance 14.21.1
b.npm
a.镜像
npm set registry http://172.17.8.54/
npm adduser --registry http://172.17.8.54/
npm profile set password --registry http://172.17.8.54/
-------------------------------------------------------------------------------------------------
npm login
j057240
qwER159263
-------------------------------------------------------------------------------------------------
npm config ls
b.命令
# 安装
npm install
# 启动
npm run dev
c.pnpm
a.镜像
pnpm set registry http://172.17.8.54/
pnpm adduser --registry http://172.17.8.54/
pnpm profile set password --registry http://172.17.8.54/
-------------------------------------------------------------------------------------------------
pnpm login
j057240
qwER159263
-------------------------------------------------------------------------------------------------
pnpm c get
b.命令
# 安装
pnpm install
# 以 dev 模式启动 Vite 开发服务器
pnpm dev
# 如果你使用的是 npm
npm run dev
02.常用信息2
a.框架说明
a.框架
组件:element-plus
位置:src/assets/styles/index.scss
位置:@jhlc/jh-ui/src/element-plus/index.scss
b.问题
提问:那这些UI,是怎么做到一致的
回答:全局样式
-------------------------------------------------------------------------------------------------
提问:都是在低代码生成的吗?然后改动的吗?
回答:不是,没有用到低代码,都是手敲
b.菜单模块
a.分类
any-report
cost 成本管理
crm CRM客户管理
ctm 电子云商平台
equipmentFacilities 企业监测预警
error
industrialParkGarden 智慧园区(安防)
ism 综合服务
licenseExpire
licenseRegister
menuNav
onboard 入职管理
performance 即时绩效
pms 工艺管理
sdm 员工大数据
tms 智慧物流
b.根页面
index.vue 都挂载到这个index.vue
login.vue 登录
03.常用信息3
a.组织架构
a.位置
用户管理:业务管理(全部应用) -> 组织架构 -> 用户管理:一键增加默认角色
角色管理:系统管理(全部应用) -> 权限设置 -> 角色管理:全部角色,如开发用-超级管理员、必备-默认角色、名片录入
-------------------------------------------------------------------------------------------------
组织架构选择器:jh4j-ui/src/views/performance/components/treeMultiple
通过组织架构获取人员选择的组件:jh4j-ui/src/views/performance/components/personSelect
使用上述2个组件:jh4j-ui/src/views/performance/meteringManagement
mixins: [ListModalMixins, ListMixins],
components: {treeMultiple, personSelect,},
-------------------------------------------------------------------------------------------------
单独的应用下,你要建立你自己的项目文件夹,这两个组件复制一份到你的项目文件下,后续可以在基础上个性化更改
b.页面
即时绩效 -> 组织管理 -> 组织档案 http://localhost:8001/basicsettings/zzglnew/zzgl
即时绩效 -> 组织管理 -> 虚拟组织 http://localhost:8001/basicsettings/zzglnew/organizationalManagement
即时绩效 -> 组织管理 -> 组织管理团队 http://localhost:8001/basicsettings/zzglnew/managementTeam
即时绩效 -> 组织管理 -> 组织系数调整 http://localhost:8001/basicsettings/zzglnew/prforgallocatecoefficient
-------------------------------------------------------------------------------------------------
即时绩效 -> 员工管理 -> 员工档案 http://localhost:8001/basicsettings/ygglnew/staffManagement
即时绩效 -> 员工管理 -> 员工绩效异动 http://localhost:8001/basicsettings/ygglnew/employeeTurnover
即时绩效 -> 员工管理 -> 绩效档案 http://localhost:8001/basicsettings/ygglnew/performanceProfile
即时绩效 -> 员工管理 -> 薪酬档案 http://localhost:8001/basicsettings/ygglnew/payFiles
c.jh4j-ui-performance/src/views/performance/basicSettings/zzgl/index.vue:8
<div
style="width: 280px; overflow-y: scroll;padding: 16px 8px;background-color: #fff;box-sizing: border-box;margin-right: 10px;border-radius: 4px;">
<el-input :clearable="true" size="small" prefix-icon="Search" v-model="filterText" placeholder="关键字搜索"
style="margin-bottom: 12px" @input="handleFilter"></el-input>
<el-tree node-key="id" :props="treeProps" :data="treeData" :filter-node-method="filterNode"
:current-node-key="currentNodeKey" :default-expanded-keys="expandedKeys" :expand-on-click-node="false"
:highlight-current="true" @node-click="handleNodeClick" ref="tree" :lazy="isLazy" :load="loadnode"></el-tree>
</div>
b.附件上传
a.问题
图片上传
GET请求,/view/**,正则匹配不一样
绕开网关可以访问,走网关不可以访问
b.SpringMvc 使用 AntPathMatcher 模式
/view/** 可以匹配 /view/ 下任意层级路径,包括多级目录和带特殊字符的文件名
* 匹配单层路径部分,** 可跨多层目录
特殊字符或中文路径一般可直接匹配,只要 Controller 方法对应
c.SpringGateway 使用断言(Predicates)和 RegExp,且处理方式更严格:
/view/** 理论上能匹配多级目录。但 Gateway 配置时还涉及 StripPrefix、RewritePath 等 Filter,如果 rewrite 或 strip 配置不合理,会造成路径解析出错,比如中文/特殊符号未 decode,或路径”提前截断”。
默认断言 Path 只按 URI 匹配,若有 RewritePath,需保证正则 `(?<segment>.*)` 能处理带编码的路径,否则特殊文件名会被 Gateway 拦截/错误处理。
Gateway 处理正则时,某些符号(如 %E5%BC%A0…)需在正则和后端 Controller 都能被 decode,否则原始/转义路径难匹配,报 500
c.图片显示
a.加入白名单
位置:系统管理 -> 权限设置 -> 接口管理
筛选框(服务名称):入职管理 / 入职管理-J057117 / 入职管理-J057240
-------------------------------------------------------------------------------------------------
查看照片文件 GET /onboard/applicant/image/view/photo/** 入职管理 默认动作
白名单:是
免登白名单:是
b.前端报文
http://172.17.8.57:81/uat-api/onboard/applicant/image/view/photo/%E9%83%91%E8%89%B3_18687654321_%E7%85%A7%E7%89%87_20251014_111839.jpg
{"code":5000,"message":"请求异常,请联系管理员","data":null}
c.67服务器日志
[root@jh-zjapp ~]# ps -ef | grep java
root 1635853 1 1 9月29 ? 03:27:21 /usr/local/jdk-1.8.0_191/bin/java -jar /home/jh4j-product-onboard-service-2.3.0.jar --spring.application.name=jh4j-product-onboard
4.3 后端管理2
01.常用信息1
a.框架说明
a.框架
SpringBoot 2.x
MyBatisPlus
b.痛点
1.枚举类
2.公共实体类,新增时间/更新时间,统一处理
3.审批流工具类:EJiaCloudFlowUtil.java
5.铺平结构处理:框架上进行铺平了,但是业务上没有做到真正铺平
4.取消Autowired:为了防止注入的bean在后面某个环节被更改了,使用final修饰+构造函数注入
b.框架使用
a.解决1
检查注解
数据库配置
注释mp配置文件
使用pieces项目
拆解pom.xml依赖关系
只开放1个接口demo,controller注解,一层一层拆开剖析
b.解决2
1.迁移一份标准的语法
2.简单拆解旧的语法,是否能启动跑通
3.实在不行,旧的语法,直接手动改造为新语法
02.常用信息2
a.迁移
a.位置
libra-boot-onboard 到 22-jh4j-product-onboard
b.修改
jh4j-product-onboard-service 注释掉 com.jhict.product.onboard.config.DateFormatConfig
jh4j-product-onboard-entity/pom.xml 注释掉 jh4j-product-common 2.3.0
c.说明
如果报错nacos、或者springfox等报错,clean -> compile -> run
b.下载
public void downloadTemplate(HttpServletResponse response, String fileName) {
try {
//参数校验
ServiceAssert.hasText(fileName, "文件名不能为空");
//检查资源是否存在
ClassPathResource resource = new ClassPathResource("excelTemplate/" + fileName);
ServiceAssert.isTrue(resource.exists(), "模板文件不存在: " + fileName);
//文件名编码处理
String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name())
.replace("+", "%20")
.replaceAll("%28", "(")
.replaceAll("%29", ")")
//.replaceAll("%5F", "_")
.replaceAll("%2D", "-");
//设置响应头
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition",
"attachment; filename=" + encodedFileName);
try (InputStream inputStream = resource.getInputStream();
OutputStream outputStream = response.getOutputStream()) {
byte[] buffer = new byte[4096]; // 使用更大的缓冲区提高性能
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
}
} catch (Exception e) {
throw new ServiceException("模板下载失败: " + e.getMessage(), e);
}
}
c.配置文件
a.分页配置
pagehelper:
# helperDialect: oracle
reasonable: true
params: count=countSql
# 默认false,当为true时,自动检验适合的数据库
auto-dialect: oracle
# 这个一定要加上,不然mysql和oracle分页两个只能用一个,另一个会报错,加上后,两中数据库分页都可以用了
auto-runtime-dialect: true
support-methods-arguments: true
b.MP配置
mybatis-plus:
# mapper-locations: classpath*:mybatis/oracle/*.xml
type-aliases-package: com.jhict.store.api.entity
configuration:
jdbc-type-for-null: varchar
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
03.常用信息3
a.控制层
@Validated
@Api(tags = "绩效申诉管理")
@RestController
@RequiredArgsConstructor
@RequestMapping("/examPerformanceAppeal")
public class ExamPerformanceAppealController {
private final ExamPerformanceAppealService examPerformanceAppealService;
@ApiOperation(value = "列表", notes = "列表")
@GetMapping(value = "list")
public ApiResult<JhPage<List<ExamPerformanceAppeal>>> list(@ApiIgnore JhPage<ExamPerformanceAppealVO> page, ExamPerformanceAppealQuery query) {
examPerformanceAppealService.list(page, query);
return ApiResult.success("查询列表成功", page);
}
@ApiOperation(value = "新增", notes = "新增")
@PostMapping("/save")
public ApiResult save(@RequestBody @Validated(ValidGroup.Crud.Create.class) ExamPerformanceAppeal examPerformanceAppeal) {
examPerformanceAppealService.save(examPerformanceAppeal);
return ApiResult.success("新增成功!");
}
@ApiOperation(value = "保存并提交审批", notes = "保存并提交审批")
@PostMapping("/saveAndInitiate")
public ApiResult saveAndInitiate(@RequestBody @Validated(ValidGroup.Crud.Create.class) ExamPerformanceAppealDTO dto) {
examPerformanceAppealService.saveAndInitiate(dto);
return ApiResult.success("新增成功!");
}
@ApiOperation(value = "编辑", notes = "编辑")
@PutMapping("/update")
public ApiResult update(@RequestBody @Validated(ValidGroup.Crud.Update.class) ExamPerformanceAppeal examPerformanceAppeal) {
examPerformanceAppealService.updateById(examPerformanceAppeal);
return ApiResult.success("编辑成功!");
}
@ApiOperation(value = "删除", notes = "删除")
@DeleteMapping("remove")
public ApiResult remove(@RequestBody List<String> ids) {
examPerformanceAppealService.removeByIds(ids);
return ApiResult.success("删除成功!");
}
}
b.服务层
@Service
@RequiredArgsConstructor
@DS("performance")
@Slf4j
public class CommonService {
// 调用mapper:方式1
baseMapper.getByEntity(param);
// 调用mapper:方式2
private final CommonMapper commonMapper;
commonMapper.uniquenessVerification(tableMap.get("tableName"), tableMap.get("id"), paramMap);
// 调用servie:本地
private final RemoteHrUserService remoteHrUserService;
remoteHrUserService.getByUserNo(AuthUtil.getLoginUserNo());
// 调用service:远程,@FeignClient
private final RemoteSysDictionaryDtlService remoteSysDictionaryDtlService;
}
-----------------------------------------------------------------------------------------------------
@Service
@DS("performance")
@RequiredArgsConstructor
public class CommonRemoveVerificationService extends JhServiceImpl<CommonRemoveVerificationMapper, CommonRemoveVerification> {
}
c.Mapper层
public interface CommonMapper extends JhBaseMapper<XXXXXX> {
List<ConstraintVO> count(@Param("tableName") String tableName, @Param("copyFromIds") List<String> copyFromIds);
Integer uniquenessVerification(@Param("tableName") String tableName, @Param("id")String id, @Param("uniquenessParam") Map<String,String> uniquenessParam);
List<ConstraintVO> removeVerification(@Param("tableName") String tableName, @Param("tableField") String tableField, @Param("ids") List<String> ids);
List<Map<String, Object>> removeVerificationDynamic(@Param("tableName") String tableName,@Param("tableField") String tableField, @Param("ids") List<String> ids);
}
d.Model层
@Data
@Accessors(chain = true)
@TableName("BIZ_FIELD_CHANGE_LOG")
@ApiModel(value="BizFieldChangeLog对象", description="业务字段变更记录")
public class BizFieldChangeLog extends CoreEntity implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "操作类型(0:新增/1:更新/2:删除)")
@TableField("OPERATION_TYPE")
private String operationType;
@ApiModelProperty(value = "操作人")
@TableField("OPERATION_NAME")
private String operationName;
}
4.4 对接三方:erp
01.常用信息1
a.依赖
<dependency>
<groupId>cn.jggroup</groupId>
<artifactId>jg-sign-generate</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>cn.jggroup</groupId>
<artifactId>jg-sign-keystore</artifactId>
<version>1.0</version>
</dependency>
b.项目结构
com.jh4j.product.common
constants
GlobalCommonConstant.class
entity
CallParameters.class
util
HMACEncryptor.class
ValidGroup.class
02.常用信息2
a.工具类
public class ErpHttpUtil {
public static void erpPost(String url,JhPage jhPage,Object paramObject) {
Map<String,Object> params = BeanUtil.beanToMap(paramObject);
params.put("size",jhPage.getSize());
params.put("current",jhPage.getCurrent());
CallParameters callParameters=new CallParameters();
callParameters.setUrl(url);
callParameters.setBody(JSON.toJSONString(params));
Map<String,String> headMap=new HashMap<>();
try {
headMap= HMACEncryptor.getToken(callParameters);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(url);
System.out.println(JSON.toJSONString(params));
String result = HttpUtil.post(url, params,headMap);
if(JSON.parseObject(result).get("code").toString().equals(GlobalCommonConstant.STRING_2000))
{
if(ObjectUtil.isNotEmpty(JSON.parseObject(result).get("data")))
{
String data = JSON.parseObject(result).get("data").toString();
JSONObject object = JSON.parseObject(data);
Integer pages = object.get("pages")==null ? 0:Integer.parseInt(object.get("pages").toString());
Integer total = object.get("total")==null ? 0:Integer.parseInt(object.get("total").toString());
jhPage.setPages(pages);
jhPage.setTotal(total);
jhPage.setRecords((List)object.get("records"));
}
}
}
public static String post(String url,Object paramObject) {
CallParameters callParameters=new CallParameters();
callParameters.setUrl(url);
callParameters.setBody(JSON.toJSONString(paramObject));
Map<String,String> headMap=new HashMap<>();
try {
headMap= HMACEncryptor.getToken(callParameters);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(url);
System.out.println(JSON.toJSONString(paramObject));
return HttpRequest.post(url)
.headerMap(headMap, true) // 设置请求头
.body(JSON.toJSONString(paramObject)) // 设置 JSON 请求体
.timeout(60000) // 设置超时时间(毫秒)
.execute()
.body();
}
}
b.调用接口
/**
* 项目名称:人员薪酬档案对接公共类
*/
@Configuration
public class PersonSalaryArchiveUtil {
// @Value("${personSalaryArchive.ip:}")
// private static String IP;
//
// @Value("${personSalaryArchive.port:9002}")
// private static String PORT;
private static final String ERP_BASE_URL = "erp.app.jggroup.cn" + "/erp/local/ajax";
private static final String SALARY_QUERY_ACTION = "?_controller=hsSalary&_action=querySalaryList";
private static final String SALARY_SAVE_ACTION = "?_controller=hsSalary&_action=saveSalaryData";
@Data
@AllArgsConstructor
@NoArgsConstructor
private static class PrfPersonSalaryArchiveDTO {
private String amount;
private String empNo;
}
/**
* 请求公共类
*
* @param action 调用地址
* @param params 请求参数
* @return JSONObject
* @throws IOException
*/
private static JSONObject postErpRequest(String action, Map<String, Object> params) throws IOException {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost httpPost = new HttpPost(ERP_BASE_URL + action);
// 设置请求头
httpPost.addHeader("Content-Type", "application/json");
// 设置请求体
StringEntity entity = new StringEntity(JSON.toJSONString(params), "UTF-8");
httpPost.setEntity(entity);
// 执行请求
HttpResponse response = httpClient.execute(httpPost);
String responseBody = EntityUtils.toString(response.getEntity());
return JSON.parseObject(responseBody);
} catch (Exception e) {
throw new ServiceException(e.getMessage());
}
}
/**
* 同步薪资数据
*
* @return 薪资列表
* @throws IOException
*/
public static JSONObject syncSalaryData() throws IOException {
try {
// 构建请求参数
Map<String, Object> params = new HashMap<>();
// 发送请求
String response = ErpHttpUtil.post(ERP_BASE_URL + SALARY_QUERY_ACTION, params);
// 解析响应
JSONObject responseObject = JSON.parseObject(response);
if (responseObject.getInteger("code") == 2000) {
return responseObject;
}
} catch (Exception e) {
throw new ServiceException("同步员工薪酬数据失败: " + e.getMessage());
}
return null;
}
}
4.5 对接三方:ejia
01.常用信息1
a.位置
https://e.jggroup.cn/opendocs/docs.html#/server-api/business/cloudflow?id=创建流程接口(提交表单)
-----------------------------------------------------------------------------------------------------
IndLibraryApplyController
IndSourceDataApplyController
-----------------------------------------------------------------------------------------------------
PrfPersonTransferAppController
PrfPersonTransferAppService
PrfPersonTransferApp
// 主键id
protected String id;
// 绩效圈组织人员id
private String prfPersonInfoId;
// 原绩效圈id
private String originalPrfOrgPartyId;
// 调整到绩效圈id
private String modifiedPrfOrgPartyId;
// 流程实例id
private String flowInstId;
// 表单实例id
private String formInstId;
// 流程状态
private ApprovalStatusEnum flowStatus;
// 表单模板codeId
data.put("formCodeId", jgeHomeTemplateType.getValue());
// 流程发起人openid
data.put("creator", eJiaCloudFlowUtil.getOpenIdByJobNo(flowInitiatorJobNo));
-----------------------------------------------------------------------------------------------------
PrfRacingCoefficientApplyController
PrfRacingCoefficientApplyService
PrfRacingCoefficient
PrfRacingCoefficientApply
// 主键id
protected String id;
// 方案ID
private String prfRacingCoefficientId;
// 流程实例id
private String flowInstId;
// 表单实例id
private String formInstId;
// 审批状态(0:未发起/1:审批中/2:审批通过/3:审批拒绝/4:已撤回)
private ApprovalStatusEnum flowStatus;
// 表单模板codeId
data.put("formCodeId", jgeHomeTemplateType.getValue());
// 流程发起人openid
data.put("creator", eJiaCloudFlowUtil.getOpenIdByJobNo(flowInitiatorJobNo));
PrfRacingCoefficientDetail
-----------------------------------------------------------------------------------------------------
ExamPerformanceAppealController
ExamPerformanceAppealService
ExamPerformanceAppeal
// 主键id
protected String id;
// 考核活动ID
private String examActivityId;
// 流程实例id
private String flowInstId;
// 表单实例id
private String formInstId;
// 审批状态(0:未发起/1:审批中/2:审批通过/3:审批拒绝/4:已撤回)
private ApprovalStatusEnum flowStatus;
// 流程发起人openid
data.put("creator", eJiaCloudFlowUtil.getOpenIdByJobNo(flowInitiatorJobNo));
ExamPerformanceAppealDetail
-----------------------------------------------------------------------------------------------------
ApprovalStatusEnum
未发起
审批中
审批通过
审批拒绝
已撤回
ApprovalTrailStatusEnum
超时自动完成
废弃
已取消
或签取消
已退回
智能退回
待审批
已审批
不同意
不同意节点的取消
撤回
-----------------------------------------------------------------------------------------------------
JGEHomeLog
// 业务id
private String businessId;
// 晋钢E家报文
private String jgEHomeLog;
-----------------------------------------------------------------------------------------------------
撤回审批
// 流程id
private String flowInstId;
// 审批人oid
private String businessId;
// 是否撤回到发起节点,非必填,默认false ,发起人撤回到发起节点这个值需填true
private String toStart;
-----------------------------------------------------------------------------------------------------
发起审批
保存或者发起审批
审批回调
撤回审批
查询审批流程痕迹
审批驳回回调
b.工具类
com/jhict/product/performance/utils/EJiaCloudFlowUtil.java
-----------------------------------------------------------------------------------------------------
createInst 发起审批
withdrawInst 撤回表单
getFlowStatus 获取审批状态
getOpenIdByJobNo 根据jobNo,获取openId
getJobNoByOpenId 根据openId,获取jobNo
c.示例:审批
com/jhict/product/performance/controller/PrfRacingCoefficientApplyController.java
approvalCallback 审批回调
approvalRejectCallback 审批驳回回调
-----------------------------------------------------------------------------------------------------
/prfRacingCoefficientApply/initiateApprovalProcess:发起审批
/prfRacingCoefficientApply/saveAndlnitiate:保存并发起审批
/prfRacingCoefficientApply/approvalCallback:审批回调
/prfRacingCoefficientApply/withdrawApproval:撤回审批
IprfRacingCoefficientApply/getFlowRecord:查询审批流程痕迹
/prfRacingCoefficientApply/approvalRejectCallback:审批驳回回调
d.断言
ServiceAssert.isNotNull(examPerformanceAppealDTO.getId(), "撤回审批时,ID不能为空");
ServiceAssert.isNotNull(examPerformanceAppealDTO.getFlowInstId(), "撤回审批时,flowInstId不能为空");
-----------------------------------------------------------------------------------------------------
底层实现,实际为抛出异常
e.多线程
com/jhict/product/performance/service/ExamPerformanceAppealService.java:90 -> initiateApprovalProcess
AtomicReference<Integer> appealTypeDict = new AtomicReference<>(0);
02.常用信息2
a.枚举:formCodeId
com/jhict/product/performance/api/enums/JGEHomeTemplateTypeEnum.java
EXAM_PERFORMANCE_APPEAL(1,"43cef8c82ce44c0084282144b66a298e"),
PRF_EXAM_BUSINESS_ITEM(2,"d971e55d707147cfbc50a43faa667a1d"),
b.状态:可更改
com/jhict/product/performance/api/enums/ApprovalStatusEnum.java
NOT_INITIATED(0, "未发起"),
UNDER_REVIEW(1, "审批中"),
APPROVED(2, "审批通过"),
REJECTED(3, "审批拒绝"),
WITHDRAWN(4, "已撤回");
c.状态:不可更改
com/jhict/product/performance/api/enums/ApprovalTrailStatusEnum.java
OT_DONE("超时自动完成"),
ABANDON("废弃"),
CANCEL("已取消"),
AGREE_CANCEL("或签取消"),
RETURNED("已退回"),
SMART_RETURNED("智能退回"),
DOING("待审批"),
DONE("已审批"),
DISAGREE("不同意"),
DISAGREE_CANCLE("不同意节点的取消"),
WITHDRAW("撤回")
d.审批模版ID:面试成功/待入职,也就是 formCodeId
com/jhict/product/performance/api/enums/JGEHomeTemplateTypeEnum.java:33
EXAM_PERFORMANCE_APPEAL(1,"43cef8c82ce44c0084282144b66a298e"),
PRF_EXAM_BUSINESS_ITEM(2,"d971e55d707147cfbc50a43faa667a1d"),
03.常用信息3
a.面试成功
a.面试成功审批
审批模板ID:44997bf0943e430d96ef82a20eb19890
开发者screct:fkOMP1JAiAeiaLIBza8rXfHaTRpaUe
开发者key:ztxih0oYpiiC1gB8
b.其他字段
creator,流程发起人openid:getOpenIdByJobNo
widgetValue,主表:[]
details,子表:[{},{}]
resubmit:默认false
b.待入职
a.待入职审批
审批模板ID:c88219d94e234612bfd8b8bf5b7bd62b
开发者screct:fkOMP1JAiAeiaLIBza8rXfHaTRpaUe
开发者key:ztxih0oYpiiC1gB8
b.其他字段
creator,流程发起人openid:getOpenIdByJobNo
widgetValue,主表:[]
details,子表:[{},{}]
resubmit:默认false
c.字段说明
a.发起请求
formCodeId String 是 表单模板codeId
creator String 是 流程发起人openid
oids Array 否 如果是自由流,则填审批人的openid组成的数组,按照顺序进行审批,否则可以不传
cc Array 否 自由流抄送人openid数组
skipWidgetAuthorityCheck boolean 否 是否跳过节点字段权限校验,true表示本次操作不会校验节点字段权限
justDraft boolean 否 是否保存为草稿,true表示本次提交操作不会创建流程,只是保存为一份草稿(注意:这个存为草稿参数不是暂存到草稿箱,只是给这个发起人暂存了一份数据,在进入发起单据填单界面时自动带出暂存的内容,每个模板每个人最多只会暂存一份数据)
useAlias boolean 否 是否使用别名,true表示使用别名,详情请参考下文对别名的解释
resubmit boolean 否 退回或撤回后是否允许再次发起,true表示允许退回以及撤回到发起节点后再次发起。默认允许退回到发起节点后再次发起
widgetValue Object 否 主表单字段赋值
details Object 否 明细表字段赋值
b.撤回审批
flowInstId 流程id
approver 审批人oid
"toStart":false 是否撤回到发起节点,非必填,默认false ,发起人撤回到发起节点这个值需填true
04.常用信息4
a.sys -> 发起审批
com/jhict/product/performance/controller/ExamPerformanceAppealController.java
---------------------------------------------------------------------------------------------
JSONObject data = new JSONObject();
// 表单模板codeId
data.put("formCodeId", jgeHomeTemplateType.getValue());
// 流程发起人openid
data.put("creator", eJiaCloudFlowUtil.getOpenIdByJobNo(flowInitiatorJobNo));
// 主表
data.put("widgetValue", new JSONObject());
// _S_TITLE 固定
JSONPath.set(dataParam, "$.widgetValue._S_TITLE", currentUser.map(HrUser::getName).orElse("") + "的绩效申诉-发起审批");
// Ra_0 自定义
JSONPath.set(dataParam, "$.widgetValue.Ra_0","AaBaCcDd");
JSONPath.set(dataParam, "$.widgetValue.Ra_1", appealType);//申述类型
// 子表
data.put("details", new JSONObject());
// Dd_0 自定义
JSONPath.set(dataParam, "$.details.Dd_0", new HashMap<>());
JSONPath.set(dataParam, "$.details.Dd_0.widgetValue", widgetValueList);
// 退回或撤回后是否允许再次发起
data.put("resubmit", false);
---------------------------------------------------------------------------------------------
jgeHomeService.initiateApprovalProcess(dataParam, (pair) -> {
// 实现业务回调逻辑
super.update(Wrappers.<ExamPerformanceAppeal>lambdaUpdate()
.set(ExamPerformanceAppeal::getFlowInstId, pair.getLeft()) --流程实例id:flowInstId
.set(ExamPerformanceAppeal::getFormInstId, pair.getRight()) --表单实例id:formInstId
.set(ExamPerformanceAppeal::getFlowStatus, ApprovalStatusEnum.UNDER_REVIEW) --流程状态:flowStatus
.eq(ExamPerformanceAppeal::getId, examPerformanceAppeal.getId())
);
flowInstId.set(pair.getLeft());
});
b.sys -> 保存并发起审批
com/jhict/product/performance/controller/PrfRacingCoefficientApplyController.java:102
---------------------------------------------------------------------------------------------
saveOrUpdate(dto);
initiateApprovalProcess(dto);
c.erp -> 审批完成回调
com/jhict/product/performance/controller/ExamPerformanceAppealController.java
---------------------------------------------------------------------------------------------
data
basicInfo
flowInstId
formInfo
examActivityId
flowInstId
examPerformanceAppealId
---------------------------------------------------------------------------------------------
data添加
formInfo.put("examActivityId",entity.getExamActivityId());
formInfo.put("flowInstId",flowInstId);
formInfo.put("examPerformanceAppealId",entity.getId());
d.sys -> 撤回审批 -> 通知 ejia 中的工作流(使用流程实例id:flowInstId)
com/jhict/product/performance/controller/ExamPerformanceAppealController.java
---------------------------------------------------------------------------------------------
重试接口,重试2天,传错了,一直重试【撤回审批】接口
---------------------------------------------------------------------------------------------
JSONObject data = new JSONObject();
// 3个字段
data.put("approver", openId);
data.put("toStart", true);
data.put("flowInstId", examPerformanceAppealDTO.getFlowInstId());
// 调用ejia,判断errorCode
JSONObject jsonObject = eJiaCloudFlowUtil.withdrawInst(data);
ServiceAssert.isTrue(jsonObject.getInteger("errorCode") == 0 && jsonObject.getBooleanValue("success"),
// 若成功,则对工作流【流程实例id】,变更状态【已撤回】,
jgeHomeService.withdrawApproval(dataParam, (result) -> {
super.update(Wrappers.<ExamPerformanceAppeal>lambdaUpdate()
.set(ExamPerformanceAppeal::getFlowStatus, ApprovalStatusEnum.WITHDRAWN) --流程状态:flowStatus
.eq(ExamPerformanceAppeal::getFlowInstId, examPerformanceAppealDTO.getFlowInstId()) --流程实例id:flowInstId
);
});
e.sys -> 查询 ejia -> 查询审批流程痕迹(当前状态)(表单实例id:formInstId)
com/jhict/product/performance/controller/ExamPerformanceAppealController.java:109
---------------------------------------------------------------------------------------------
Map<String, String> params = new HashMap<>();
params.put("formInstId", formInstId); --表单实例id:formInstId
params.put("formCodeId", templateType.getValue()); --JGEHomeTemplateTypeEnum,面试成功/待入职,也就是 formCodeId
// 查询 ejia -> 查询审批流程痕迹(当前状态)
JSONObject flowRecord = eJiaCloudFlowUtil.getFlowRecord(params);
// 保存日志:方便追朔,businessId+jgEHomeLog
JGEHomeLog log = new JGEHomeLog();
log.setBusinessId(formInstId);
log.setJgEHomeLog(flowRecord.toJSONString());
jgeHomeLogService.save(log);
// 保存审批状态:com/jhict/product/performance/api/vo/ApprovalTrailVO.java
ServiceAssert.isTrue(flowRecord.getInteger("errorCode") == 0 && flowRecord.getBooleanValue("success"), "查询审批流程痕迹失败");
List<ApprovalTrailVO> approvalTrailVOS = JSONObject.parseArray(flowRecord.getString("data"), ApprovalTrailVO.class);
approvalTrailVOS.sort(Comparator.comparing(ApprovalTrailVO::getCreateTime, Comparator.nullsLast(Long::compareTo)));
return approvalTrailVOS;
---------------------------------------------------------------------------------------------
com/jhict/product/performance/api/vo/ApprovalTrailVO.java
f.审批驳回回调
com/jhict/product/performance/controller/PrfRacingCoefficientApplyController.java:126
---------------------------------------------------------------------------------------------
// 接收消息后必须有返回,否则重发重试机制,导致数据问题
JSONObject result = new JSONObject();
result.put("success", true);
// 将 token 中的 basicInfo 进行解析为 $.flowInstId.value
jgeHomeService.approvalRejectCallback(token, (data) -> {
//审批通过 业务逻辑
String flowInstId = JSONPath.eval(data, "$.flowInstId.value").toString();
super.update(Wrappers.<PrfRacingCoefficientApply>lambdaUpdate()
.set(PrfRacingCoefficientApply::getFlowStatus, ApprovalStatusEnum.REJECTED) --审批拒绝
.eq(PrfRacingCoefficientApply::getFlowInstId, flowInstId) --流程实例id
);
});
return result;
4.6 对接权限:auth
01.Token管理体系
a.存储方式
Token 存储在 Cookie (Admin-Token)
权限列表存储在 LocalStorage (Permission)
用户信息存储在 Pinia Store (useUserStore)
b.自动注入流程
请求拦截器 → 从Cookie获取Token → 添加到请求头 → Bearer Token格式
c.核心工具
// Token操作
import { getToken, setToken, removeToken } from '@jhlc/common-core/src/util/auth'
// 用户Store
import useUserStore from '@jhlc/common-core/src/store/user'
const userStore = useUserStore()
02.权限控制三种方式
a.方式一: 指令式权限 (v-auth)
el-button v-auth="'featuremodelmanage_save'">保存</el-button>
b.方式二: 角色权限 (v-role)
<el-button v-role="['admin_role', 'hr_role']">管理功能</el-button>
c.方式三: 编程式权限
const canEdit = computed(() => {
return userStore.permissions.includes('system:user:edit') ||
userStore.permissions.includes('*:*:*')
})
03.请求架构三层封装
a.图示
业务组件
↓
API抽象层 (getAction, postAction)
↓
Axios拦截器 (自动添加Token, 统一错误处理)
↓
后端API
b.关键特性
自动Token注入: 拦截器自动添加 Authorization: Bearer
统一错误处理: 401自动跳转登录, 500统一提示
防抖机制: 2秒内多次401只弹一次窗
智能交互: 区分页面刷新和正常调用
04.用户信息获取方式
a.后端(Java)
// 获取当前用户编号
String userNo = AuthUtil.getLoginUserNo();
// 获取用户角色
Set<String> roles = AuthUtil.getRoles();
// 获取租户ID
String tenantId = AuthUtil.getTenantId();
b.前端(Vue)
const userStore = useUserStore()
// 获取用户信息
userStore.name // 用户姓名
userStore.userId // 用户ID
userStore.userNo // 用户工号
userStore.permissions // 权限列表
userStore.roles // 角色列表
05.数据权限控制 (后端)
a.注解式控制
@DataPermissions({
@DataPermission(
controlType = "in",
controlTableAlias = "t",
controlField = "ORG_ID",
bizType = BizOrganizationRelationEnum.PERFORMANCE_ACTIVITY
)
})
public JhPage<ActivityDTO> listActivities(JhPage<ActivityDTO> page, ActivityQuery query) {
// AOP会自动在SQL中注入组织权限过滤条件
return activityMapper.selectPage(page, query);
}
b.核心原理
超级管理员豁免: SUPER_ROLE跳过数据权限过滤
组织树过滤: 根据用户所属组织自动生成 WHERE EXISTS 条件
ThreadLocal传递: 通过 DataPermissionContextHolder 传递SQL片段
MyBatis拦截器: 在执行SQL前自动拼接权限条件
06.SSO单点登录流程
a.流程
// 1. URL携带ticket参数
http://app.com/?ticket=abc123
// 2. 通过ticket换取access_token
const authResponse = await postAction("auth/oauth/token", null, {
grant_type: "sso_rpc",
ticket: ticket,
client_code: encrypt(client_id + "," + client_secret)
})
// 3. 保存Token到Cookie
setToken(authResponse.access_token)
// 4. 获取用户详细信息
const userResponse = await getAction("/hrms/user/getByUserNo", {
userNo: authResponse.user_no
})
// 5. 设置用户信息到Store
useUserStore().setName(userResponse.data.name)
// 6. 跳转到目标页面
next({ path: redirect || "/home" })
07.关键安全机制
a.Token过期处理
// 响应拦截器捕获401
if (code === 4001 || code === 401) {
removeToken() // 清除Token
// 防抖处理,2秒内去重
FunctionExecUtil.debounceIm(() => {
// 区分页面刷新和正常调用
if (locationRefreshed || isNavigate) {
// 直接跳转登录
location.reload()
} else {
// 弹窗询问用户
ElMessageBox.confirm('登录状态已过期...', '系统提示')
}
}, "loginTimeOut", 2000)
}
b.Token自动刷新
// 每10分钟检测Token有效性
FunctionExecUtil.execInterval(() => {
envConfig().request({
url: "/auth/oauth/check_token",
params: { token: getToken() }
})
}, "autoLogin", 600000, true)
4.7 本地开发:local
01.问题汇总
a.说明1
a.问题
1.组织人员,无法请求
2.组织岗位,页面空白
b.解决
操作1:前端,gitlab页面合并分支
操作2:后端,打jar包,放67服务器
b.说明2
a.问题
3.走本地网关,为什么debug进不来
b.解决
操作1:前端,vite.config.ts,target: "http://10.70.33.39:9000", //晋钢测试ip
操作2:后端,只要67服务器部署的jar,与本地IDEA的代码【完全一致】,才可以【问题4】才能debug进来
注意:如果网关采用【负载均衡】,部分请求会有2部分落点【服务器+本地,导致有一部分请求落到本地】
c.说明3
a.问题
http://localhost:8001/dev-api/hrms/user/getCurUser
b.解决
描述:本地dev环境下,,Jh4jHrmsApplication是【本地】无法启动的
解决:本地dev环境下,启动【Jh4jGatewayApplication】,让它走【远程】的Jh4jHrmsApplication
d.其他
a.
02.项目创建
a.jh4j-product-onboard
a.settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups></pluginGroups>
<proxies></proxies>
<servers></servers>
<mirrors>
<mirror>
<id>jingang</id>
<mirrorOf>*</mirrorOf>
<name>jingang maven</name>
<url>http://172.17.8.55/repository/maven-public</url>
</mirror>
</mirrors>
</settings>
b.安装
mvn install:install-file \
-Dfile=/path/to/your/jh4j-cloud-archetype-service-1.3.3.jar \
-DgroupId=com.jhict \
-DartifactId=jh4j-cloud-archetype-service \
-Dversion=1.3.3 \
-Dpackaging=maven-archetype
c.创建项目
mvn archetype:generate \
-DgroupId=com.jhict \
-DartifactId=jh4j-cloud-demo \
-Dversion=1.3.3 \
-Dpackage=com.jhict.demo \
-DarchetypeGroupId=com.jhict \
-DarchetypeArtifactId=jh4j-cloud-archetype-service \
-DarchetypeVersion=1.3.3 \
-DarchetypeCatalog=local \
-DinteractiveMode=false
-------------------------------------------------------------------------------------------------
| 参数 | 说明
|-------------------------|-------------------------------
| DgroupId | 项目组织标识
| DartifactId | 项目名称(服务名规范:jh4j-cloud-{业务模块})
| Dversion | 初始版本号
| Dpackage | 基础包路径(建议:com.jhict.{业务模块})
| DarchetypeGroupId | 脚手架组织标识
| DarchetypeArtifactId | 脚手架项目标识
| DarchetypeVersion | 脚手架版本(必须与pom中版本一致)
| DarchetypeCatalog=local | 强制使用本地仓库的脚手架模板
| DinteractiveMode=false | 禁用交互模式(批量执行时必需)
d.创建项目,自定义项目名
mvn archetype:generate \
-DgroupId=com.jhict \
-DartifactId=jh4j-cloud-onboard \
-Dversion=1.3.3 \
-Dpackage=com.jhict.onboard \
-DarchetypeGroupId=com.jhict \
-DarchetypeArtifactId=jh4j-cloud-archetype-service \
-DarchetypeVersion=1.3.3 \
-DarchetypeCatalog=local \
-DinteractiveMode=false
b.jh4j-product-onboard-ui
a.注册
a.npm
npm:npm set registry http://172.17.8.54/
npm:npm adduser --registry http://172.17.8.54/
npm:npm profile set password --registry http://172.17.8.54/
b.yarn
Yarn 经典版本的配置不同于 Yarn 2+。如需了解更多,请访问 Yarn 经典版本。
yarn config set registry http://172.17.8.54/
Yarn Berry 不支持 --registry 这个参数,而是所有的配置需要定义在项目根目录下的 yarnrc.yaml 文件里。如需了解更多,请访问 Yarn Berry。
// .yarnrc.yml
npmRegistryServer: "http://172.17.8.54/"
unsafeHttpWhitelist:
- 172.17.8.54
c.pnpm
pnpm:pnpm set registry http://172.17.8.54/
pnpm:pnpm adduser --registry http://172.17.8.54/
pnpm:pnpm profile set password --registry http://172.17.8.54/
b.模块
a.@jhlc/common-core
npm install@jhlc/[email protected]
yarn add @jhlc/[email protected]
pnpm install @jhlc/[email protected]
b.@jhlc/common-resource
npm install @jhlc/[email protected]
yarn add @jhlc/[email protected]
pnpm install @jhlc/[email protected]
c.@jhlc/common-visualcode
npm install @jhlc/[email protected]
yarn add @jhlc/[email protected]
pnpm install @jhlc/[email protected]
d.@jhlc/components
npm install @jhlc/[email protected]
yarn add @jhlc/[email protected]
pnpm install @jhlc/[email protected]
e.@jhlc/jh-ui
npm install @jhlc/[email protected]
yarn add @jhlc/[email protected]
pnpm install @jhlc/[email protected]
f.@jhlc/markdown-editor
npm install @jhlc/[email protected]
yarn add @jhlc/[email protected]
pnpm install @jhlc/[email protected]
g.@jhlc/mobile-platform
npm install @jhlc/[email protected]
yarn add @jhlc/[email protected]
pnpm install @jhlc/[email protected]
h.@jhlc/platform
npm install @jhlc/[email protected]
yarn add @jhlc/[email protected]
pnpm install @jhlc/[email protected]
i.@jhlc/types
npm install @jhlc/[email protected]
yarn add @jhlc/[email protected]
pnpm install @jhlc/[email protected]
j.@jhlc/utils
npm install @jhlc/[email protected]
yarn add @jhlc/[email protected]
pnpm install @jhlc/[email protected]
-------------------------------
const utils = require('utils');
k.element-plus
npm install [email protected]
yarn add [email protected]
pnpm install [email protected]
c.使用
a.npm
npm install @jhlc/[email protected]
npm install @jhlc/[email protected]
npm install @jhlc/[email protected]
npm install @jhlc/[email protected]
npm install @jhlc/[email protected]
npm install @jhlc/[email protected]
npm install @jhlc/[email protected]
npm install @jhlc/[email protected]
npm install @jhlc/[email protected]
npm install @jhlc/[email protected]
npm install [email protected]
b.yarn
yarn install @jhlc/[email protected]
yarn install @jhlc/[email protected]
yarn install @jhlc/[email protected]
yarn install @jhlc/[email protected]
yarn install @jhlc/[email protected]
yarn install @jhlc/[email protected]
yarn install @jhlc/[email protected]
yarn install @jhlc/[email protected]
yarn install @jhlc/[email protected]
yarn install @jhlc/[email protected]
yarn install [email protected]
c.pnpm
pnpm install @jhlc/[email protected]
pnpm install @jhlc/[email protected]
pnpm install @jhlc/[email protected]
pnpm install @jhlc/[email protected]
pnpm install @jhlc/[email protected]
pnpm install @jhlc/[email protected]
pnpm install @jhlc/[email protected]
pnpm install @jhlc/[email protected]
pnpm install @jhlc/[email protected]
pnpm install @jhlc/[email protected]
pnpm install [email protected]
03.项目配置
a.晋钢信息化综合管理平台
a.数据链路
子服务(9931) -> 网关(9000) -> 晋钢信息化综合管理平台 + 通过nacos来桥接,子服务去注册,网关去发现 -> 网关(9000) -> 前端(8001)
b.第1步:注册应用
位置:系统管理 -> 菜单程序 -> 子系统管理 -> 新建
-------------------------------------------------------------------------------------------------
上级菜单:根模块
路由:onboard
系统名称:入职管理
菜单名称编码:ruzhiguanli
显示排序:15
是否隐藏:否
c.第2步:注册子服务(jh4j-product-onboard)
位置:系统管理 -> 公共配置 -> 系统字典 -> 左侧【系统词典】的【服务信息」 -> 服务列表 -> 新增服务
选中第1步中注册的应用:入职管理
-------------------------------------------------------------------------------------------------
词典类型:服务列表
strKey:jh4j-product-onboard
服务中文名:入职管理
服务中文名编码:sysDict.dtl.strValue.serviceInfo_jh4j-product-onboard_ruzhiguanli
包扫描路径:com.jhict.product.onboard
前缓:/onboard
-------------------------------------------------------------------------------------------------
词典类型:服务列表
strKey:jh4j-product-onboard-J057117
服务中文名:入职管理-J057117
服务中文名编码:sysDict.dtl.strValue.serviceInfo_jh4j-product-onboard-J057117_ruzhiguanlij057117
包扫描路径:com.jhict.product.onboard
前缓:/onboard
-------------------------------------------------------------------------------------------------
词典类型:服务列表
strKey:jh4j-product-onboard-J057240
服务中文名:入职管理-J057240
服务中文名编码:sysDict.dtl.strValue.serviceInfo_jh4j-product-onboard-J057240_ruzhiguanlij057240
包扫描路径:com.jhict.product.onboard
前缓:/onboard
d.第3步:收集后端API接口
位置:系统管理 -> 权限设置 -> 接口管理
-------------------------------------------------------------------------------------------------
筛选:服务名称 -> 入职管理 / 入职管理-J057117 / 入职管理-J057240
操作:编码接口 -> 服务名称:入职管理 -> 指定路径:/** -> 收集
-------------------------------------------------------------------------------------------------
查看照片文件 GET /onboard/applicant/image/view/photo/** 入职管理 默认动作
白名单:是
免登白名单:是
e.第4步:配置前端Page页面
查看:显示模块
新建:目录 / 菜单
位置:系统管理 -> 菜单程序 -> 菜单管理 -> 应用【入职管理】 -> 应聘管理:面试分配 + 面试评估 + 面试录用
-------------------------------------------------------------------------------------------------
上级菜单:应聘管理
菜单图标:空白
应用选择:入职管理
使用缓存:使用
页面挑选框:请选择
显示排序:1
菜单路径:onbAllocate
菜单名称:面试分配
菜单名称编码:menu:ruzhiguanli:mianshifenpei
组件路径:onboard/onbAllocate/index
权限标识:onbAllocate
是否隐藏:否
-------------------------------------------------------------------------------------------------
上级菜单:应聘管理
菜单图标:空白
应用选择:入职管理
使用缓存:使用
页面挑选框:请选择
显示排序:2
菜单路径:onbEvaluate
菜单名称:面试评估
菜单名称编码:menu:ruzhiguanli:mianshipinggu
组件路径:onboard/onbEvaluate/index
权限标识:onbEvaluate
是否隐藏:否
-------------------------------------------------------------------------------------------------
上级菜单:应聘管理
菜单图标:空白
应用选择:入职管理
使用缓存:使用
页面挑选框:请选择
显示排序:3
菜单路径:onbOffer
菜单名称:面试录用
菜单名称编码:menu:ruzhiguanli:mianshiluyong
组件路径:onboard/onbOffer/index
权限标识:onbOffer
是否隐藏:否
b.子服务:jh4j-cloud-gateway
a.使用说明
a.不同环境
本地IDEA -> 网关使用 -> jh4j-cloud-gateway-J057117-uat.yml
生产环境 -> 网关使用 -> jh4j-cloud-gateway-uat.yml
b.接口调用
前端页面 -> 调用子服务(其他人的电脑) -> 走网关
前端页面 -> 调用自己的服务(自己的电脑)-> 自己的服务器+端口
c.访问
后端直接IP+端口:http://localhost:9931/onboard/list?current=1&size=5
前端走vite.config.ts配置:http://172.17.8.57:9000/onboard/list?current=1&size=5
b.本地服务:jh4j-cloud-gateway-service 的 bootstrap.yml
spring:
application:
name: jh4j-cloud-gateway-J057117
cloud:
nacos:
config:
server-addr: 172.17.8.57:8848
file-extension: yml
group: JH4J
username: nacos
password: JinG@ng2025
shared-configs:
- dataId: application-uat.yml
group: JH4J
- dataId: jh4j-cloud-gateway-J057117-uat.yml # 使用jh4j-cloud-gateway-J057117-uat.yml
group: JH4J
namespace: uat
discovery:
server-addr: 172.17.8.57:8848
group: JH4J
namespace: uat
username: nacos
password: JinG@ng2025
profiles:
active: uat
main:
allow-bean-definition-overriding: true
web-application-type: reactive
boot:
admin:
client:
enabled: false
c.网关列表:nacos 的 jh4j-cloud-gateway-J057117-uat.yml
server:
port: 9000
spring:
cloud:
gateway:
routes:
# 招聘管理
- id: smartpark-card
uri: lb://jh-smartpark-card
predicates:
- Path=/card/**
filters:
- RewritePath=/card(?<segment>/?.*), $\{segment}
# 入职管理
- id: product_onboard
uri: lb://jh4j-product-onboard-J057117 # 对应【bootstrap.yml】的【spring.application.name】
predicates:
- Path=/onboard/**
filters:
- RewritePath=/onboard(?<segment>/?.*), $\{segment}
d.服务列表:nacos 的 jh4j-cloud-system-uat.yml
server:
port: 9001
...... 使用公共,无需再配置
jh4j:
system:
service:
relations:
- parentService: jh4j-cloud-hrms
childrenService:
- jh4j-cloud-hrms-025966
- jh4j-cloud-hrms-028114
- jh4j-cloud-hrms-409102
- jh4j-cloud-hrms-028106
- parentService: jh4j-product-onboard # 服务列表
childrenService:
- jh4j-product-onboard-J057117 # 负载均衡1,对应【bootstrap.yml】的【spring.application.name】
- jh4j-product-onboard-J057240 # 负载均衡2,对应【bootstrap.yml】的【spring.application.name】
- parentService: jh4j-product-performance
childrenService:
- jh4j-product-performance-027198
c.子服务:jh4j-product-onboard
a.本地服务:jh4j-product-onboard-service 的 bootstrap.yml
spring:
application:
name: jh4j-product-onboard-J057117
cloud:
nacos:
config:
server-addr: 172.17.8.57:8848
file-extension: yml
group: JH4J
shared-configs:
# # 主要yml配置
- dataId: application-uat.yml
group: JH4J
# # 主要yml中的sql配置
- dataId: datasource-onboard-uat.yml
group: JH4J
- dataId: seata-uat.yml
group: JH4J
namespace: uat
# 项目yml扩展配置,你设置了前缀为 jh4j-cloud-onboard,应用名是 jh4j-cloud-onboard-J057117,那么应用会自动去加载以 jh4j-cloud-onboard 开头的配置文件,比如 jh4j-cloud-onboard-J057117-uat.yml
prefix: jh4j-product-onboard
discovery:
server-addr: 172.17.8.57:8848
group: JH4J
namespace: uat
username: nacos
password: JinG@ng2025
profiles:
active: uat
main:
allow-bean-definition-overriding: true
b.主要yml配置:nacos 的 application-uat.yml
jh4j:
...... 使用公共,无需再配置
loadbalancer: # K8S中的负载均衡
classPath: com.jhict.starter.config.IpProximityLoadBalancerConfig
serviceName: jh4j-cloud-system,jh4j-cloud-gateway,jh4j-cloud-hrms,jh4j-cloud-auth,jh4j-cloud-code,jh4j-cloud-store,jh4j-cloud-oams,jh4j-cloud-flow,jh4j-cloud-jhapi,jh4j-cloud-datav,jh4j-cloud-devops-monitor,jhip-mainpage
c.主要yml中的sql配置:nacos 的 datasource-onboard-uat.yml
spring:
# ===============================================================
# Jackson JSON 序列化/反序列化配置 (Jackson JSON Serialization/Deserialization Configuration)
# ===============================================================
jackson:
# 全局设置日期类型(如 Date, LocalDateTime)序列化为JSON字符串时的格式
date-format: yyyy-MM-dd HH:mm:ss
# 设置时区,保证日期时间处理的一致性,GMT+8是中国标准时间
time-zone: GMT+8
serialization:
# 设置为false,表示将日期序列化为字符串格式(如 "2025-08-20 20:20:20"),而不是时间戳(如 1755778820000)
write-dates-as-timestamps: false
# 设置为false,当遇到空的Java对象时不抛出异常,允许序列化空对象(如只有getter没有属性的对象)
fail-on-empty-beans: false
deserialization:
# 设置为false,表示当JSON字符串中包含Java对象没有的属性时,不抛出异常,而是直接忽略
fail-on-unknown-properties: false
# 支持BigDecimal(已有,正确)- 设置为true时,JSON中的浮点数将被反序列化为BigDecimal而不是Double,提供更高的精度
use-big-decimal-for-floats: true
# 设置为true,允许将单个值作为数组处理。例如:JSON中 "items": "single" 可以反序列化到 List<String> items
accept-single-value-as-array: true
# 设置为true,将空字符串("")视为null对象,防止空字符串导致的反序列化异常
accept-empty-string-as-null-object: true
# 解析器配置,提高容错性
parser:
# 设置为true,允许JSON字符串中包含注释(// 或 /* */),提高配置文件的可读性
allow-comments: true
# 设置为true,允许JSON字符串使用单引号包围字段名和字符串值,而不仅仅是双引号
allow-single-quotes: true
# 设置为true,允许JSON字段名不使用引号包围(如 {name: "value"} 而不是 {"name": "value"})
allow-unquoted-field-names: true
# 全局属性包含策略 - NON_NULL表示序列化时忽略值为null的字段,减少JSON体积
default-property-inclusion: NON_NULL
# 映射器级别配置,用于控制Jackson ObjectMapper的行为
mapper:
# 设置为true,启用大小写不敏感的属性映射。JSON中的 "UserName" 可以映射到 Java 的 "username" 字段
accept-case-insensitive-properties: true
datasource:
dynamic:
primary: master
strict: true
datasource:
master:
# url: jdbc:oracle:thin:@172.17.8.56:1521/jgdb
# username: JGTUSER
# password: JGTUSER#2025
# driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:mysql://172.17.12.67/jh4j-product-onboard?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: K9@pR3!sT7$qL2%
driver-class-name: com.mysql.cj.jdbc.Driver
onboard: # 新增的 MySQL 数据源
url: jdbc:mysql://172.17.12.67/jh4j-product-onboard?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: K9@pR3!sT7$qL2%
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://172.17.12.67/jh4j-product-onboard?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: K9@pR3!sT7$qL2%
druid:
keepAlive: true
initial-size: 5
min-idle: 5
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 开启日志记录到info中,默认实现类DruidDataSourceStatLoggerImpl,info记录日志
#timeBetweenLogStatsMillis: 60000
# maxEvictableIdleTimeMillis: 360000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 'x' FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
logAbandoned: true
removeAbandoned: true
removeAbandonedTimeout: 1800
# 打开PSCache,并且指定每个连接上PSCache的大小
# 官方文档表示oracle下有提升,mysql下建议关闭
poolPreparedStatements: false
maxPoolPreparedStatementPerConnectionSize: -1
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,log4j2
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# aop监控
# aop-patterns: com.nisco.dms.base.service.*,com.nisco.dms.business.service.*
# 配置DruidStatFilter
web-stat-filter:
enabled: true
url-pattern: "/*"
# 不统计的url
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
# 配置DruidStatViewServlet
# ===============================================================
# MyBatis-Plus ORM 框架配置
# ===============================================================
mybatis-plus:
# 指定 Mapper XML 文件的位置。classpath: 表示从类路径下查找
mapper-locations: classpath:/mybatis/*Mapper.xml
# 实体类(Entity)所在的包路径。配置后可在 Mapper XML 中直接使用类名作为别名
type-aliases-package: com.jhict.product.onboard.api.entity
# 枚举类所在的包路径。MyBatis-Plus 会自动扫描并处理这些枚举类型与数据库字段的映射
type-enums-package: com.jhict.product.onboard.api.enums
# 自定义 TypeHandler 所在包。MyBatis-Plus 启动时会扫描此包下所有继承 BaseTypeHandler,并标注 @MappedJdbcTypes 的类,自动注册到全局配置,用于复杂类型(如 JSON 与对象)映射
type-handlers-package: com.jhict.product.onboard.api.hander
# 全局策略配置
global-config:
# ---------- 数据库相关配置 ----------
db-config:
# 主键生成策略:
# AUTO(0): 数据库自增
# INPUT(1): 用户输入
# ASSIGN_ID(2): 雪花算法
# ASSIGN_UUID(3): UUID 字符串
id-type: ASSIGN_UUID
# 字段插入和更新策略:
# IGNORED(0): 忽略判断
# NOT_NULL(1): 只对非 NULL 字段操作
# NOT_EMPTY(2): 只对非空(非 NULL 且非空串/空集合)字段操作
field-strategy: 2
# ❌ 已废弃:3.4.x版本后不再生效,功能已迁移至 configuration.map-underscore-to-camel-case
# 原因:为了与 MyBatis 原生配置保持一致,避免配置重复和混乱
# db-column-underline: true
# ❌ 已废弃:3.4.x版本后功能已内置,无需手动配置
# 原因:MyBatis-Plus 会自动监听 XML 文件变化,该配置项已无实际作用
# refresh-mapper: true
# ❌ 已废弃:3.4.x版本后配置方式发生变化
# 原因:该配置项在新版本中被重新设计,改为更细粒度的控制
# capital-mode: true
# 逻辑删除功能配置:
# 实体类属性名,对应数据库逻辑删除字段
logic-delete-field: deletedFlag
# 逻辑删除时字段值
logic-delete-value: 1
# 未删除时字段值
logic-not-delete-value: 0
# ---------- 自动填充策略(MetaObjectHandler) ----------
# 注册实现了 MetaObjectHandler 接口的 Bean 名称或类,可在插入/更新时自动填充字段
# meta-object-handler: com.jhict.product.onboard.config.MyMetaObjectHandler
# MyBatis 原生配置
configuration:
# 开启驼峰命名自动映射(替代已废弃的 db-column-underline)
map-underscore-to-camel-case: true
# 是否开启 MyBatis 二级缓存(默认关闭)
cache-enabled: false
# 查询结果为 NULL 时,是否调用实体 setter(可触发默认值)
call-setters-on-nulls: true
# 指定 MyBatis 使用的日志实现,将 SQL 输出到控制台
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 一级缓存作用域(SESSION 或 STATEMENT)
# local-cache-scope: STATEMENT
# 默认枚举类型处理器(修正为3.4.3.4版本正确路径)
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
pagehelper:
# helperDialect: oracle
reasonable: true
params: count=countSql
# 默认false,当为true时,自动检验适合的数据库
auto-dialect: mysql
# 这个一定要加上,不然mysql和oracle分页两个只能用一个,另一个会报错,加上后,两中数据库分页都可以用了
auto-runtime-dialect: true
support-methods-arguments: true
# ===============================================================
# 自定义日期格式映射配置 (DateFormatConfig.class)
# ===============================================================
date-format:
patterns:
# 仅日期格式的字段(支持通配符)
date-only:
- birthDate
- dischargeDate
- availableDate
- fillDate
- "*Date" # 通配符:以Date结尾
- "*Birth*" # 通配符:包含Birth
- "expire*" # 通配符:以expire开头
# 日期时间格式的字段
date-time:
- createTime
- updateTime
- "*Time" # 通配符:以Time结尾
- "*DateTime" # 通配符:以DateTime结尾
- "start*" # 通配符:以start开头
- "end*" # 通配符:以end开头
formats:
date-only: "yyyy-MM-dd"
date-time: "yyyy-MM-dd HH:mm:ss"
d.项目yml扩展配置:nacos 的 jh4j-product-onboard-uat.yml
server:
port: 9931
servlet:
encoding:
# 设置HTTP请求和响应的默认字符编码
charset: UTF-8
# 启用编码支持
enabled: true
# 强制对所有请求和响应使用配置的字符编码
force: true
...... 使用公共,无需再配置
# ===============================================================
# 系统配置 (System Configuration)
# upload 配置
# ❯ sudo mkdir -p /opt/upload/onboard/{default,attachments}
# ❯ sudo chown -R $USER:staff /opt/upload/onboard,如 sudo chown -R troyesivens:staff /opt/upload/onboard
# ❯ sudo chmod -R 775 /opt/upload/onboard
# ===============================================================
onboard:
upload:
base-path: /opt/upload/onboard # 根路径:所有biz的一层目录根
default-biz: default # 默认biz名称(未传biz时使用)
max-file-size: 20 # 最大文件大小 (MB)
allowed-file-types: jpg,jpeg,png,gif,webp,svg,pdf,doc,docx,xls,xlsx,ppt,pptx # 允许文件类型
ejia:
# eid
eid: 35315462
# 基础地址
base-url: https://e.jggroup.cn/
# 部门获取地址
depart-get-url: https://e.jggroup.cn/gateway/openimport/open/dept/getall?accessToken=%s
# 用户获取地址
user-get-by-depart-url: https://e.jggroup.cn/gateway/openimport/open/person/getall?accessToken=%s
# 获取 accessToken 地址
access-token-url: https://e.jggroup.cn/gateway/oauth2/token/getAccessToken
# 刷新 accessToken 地址
refresh-token-url: https://e.jggroup.cn/gateway/oauth2/token/refreshToken
d.前端:jh4j-product-onboard-ui
a.dist的index.html
npm到nginx,通过【npm run build】打包的【dist的index.html】中设置
reportURL: 'http://localhost:9974/pisces-jimu',
domianURL: 'http://localhost:9994/pisces-boot',
根据不同的url,同样需要nginx来设置类似【vite.config.ts】中的【proxy】不同前缀代理
b.vite.config.ts
server: {
hmr: true,
port: 8001,
// port: 10002,
host: "0.0.0.0",
// 规则一:处理 /dev-api/onboard/ 的请求
// 目标: http://localhost:9931
// 特点: 保留 /dev-api 路径前缀
'/dev-api/onboard/': {
target: 'http://localhost:9931',
changeOrigin: true,
// !!! 注意:这里没有 rewrite 配置 !!!
// 这将导致请求路径被完整地转发
},
// 规则二:处理所有其他的 /dev-api/ 请求(回退到网关)
// 目标: http://127.0.0.1:9000
// 特点: 去除 /dev-api 路径前缀
proxy: {
"/dev-api": {
target: "http://10.70.33.39:9000", // 晋钢测试ip,来自【npm run dev】显示的【内网IP】
// target: "http://127.0.0.1:9000", // 本地ip,进不去【DEBUG】
// target: "http://172.17.8.57:9000", // 测试服务器,发布
rewrite: (p) => p.replace(/^\/dev-api/, ""),
},
},
},
-------------------------------------------------------------------------------------------------
环境 ENV变量值 baseApi前缀 说明
dev "dev" "/dev-api" 开发调试/本地测试专用
prod "prod" "/prod-api" 线上正式环境接口,用户真实访问
uat "uat" "/uat-api" 预发布或验收测试环境,专用于上线前验证
-------------------------------------------------------------------------------------------------
环境变量通过 loadEnv(mode, process.cwd(), "ENV") 加载,接着 baseApi 被赋值为 "/" + config["ENV"] + "-api"
如果 config["ENV"](即 ENV 环境变量)为 "dev" 且执行 build 流程,则 baseApi = "/uat-api"(即特殊处理上线预发条件)
其它情况下,dev 环境的前缀就是 "/dev-api",prod 环境就是 "/prod-api"(源码拼接结果)
c.src/util/pages.ts
export const getPages = function (): { component: string; label: string }[] {
const ret = [
// ------------------------------------------入职管理--------------------------------------
{
name: "onboard/onbApplicant/index",
label: "应聘登记",
},
{
name: "onboard/onbAllocate/index",
label: "面试分配",
},
{
name: "onboard/onbEvaluate/index",
label: "面试评估",
},
{
name: "onboard/onbOffer/index",
label: "面试录用",
},
{
name: "onboard/onbEvaluateApply/index",
label: "评估审批",
},
{
name: "onboard/onbOfferApply/index",
label: "录用审批",
},
{
name: "onboard/onbOrgPersonInfo/index",
label: "组织人员",
},
{
name: "onboard/onbPostionJob/index",
label: "组织岗位",
},
]
return ret as any
}
c.示例(应聘登记):onboard/onbApplicant/index
# 文件:src/api/action.ts
import request from '@jhlc/common-core/src/util/request';
/**
* CRUD action
*/
export const getAction = (url, param) => {
return request({
url: url,
method: 'get',
params: param
});
};
-------------------------------------------------------------------------------------------------
# 文件:src/views/onboard/onbApplicant/js/index.js
export default {
name: 'onbApplicant',
data() {
const baseUrl = '/dev-api';
return {
// 请求路径:枚举
sysAttrListUrl: baseUrl + '/onboard/attr/list', // GET请求
// 请求路径:主表
applicantListUrl: baseUrl + '/onboard/applicant/person/list', // POST请求
applicantDetailUrl: baseUrl + '/onboard/applicant/person/detail', // POST请求
applicantInsertUrl: baseUrl + '/onboard/applicant/person/insert', // POST请求
applicantUpdateUrl: baseUrl + '/onboard/applicant/person/update', // POST请求
applicantDeleteUrl: baseUrl + '/onboard/applicant/person/delete', // POST请求
applicantDeleteBatchUrl: baseUrl + '/onboard/applicant/person/deleteBatch', // POST请求 批量删除/恢复
applicantExportUrl: baseUrl + '/onboard/applicant/person/export', // POST请求
};
},
};
5 入职管理平台
5.1 需求沟通
00.进度安排
a.任务阶段1
20250726,下午口头需求
20250728-20250802,6天,【2天整理口头需求,4天设计数据库】
20250804-20250809,6天,【根据数据库整改后端,剖析后端,联调前端】
20250811-20250816,5天,【12号(大致UI设计)、13号(UI细致规划)、14号(UI规划落地)、15号(整理前端API中)、16号(8点-23点)、17号(7点-12点,12点-4点20分)】
20250818-20250823,6天,【18号(重构后端逻辑)、晚上17点-24点自助加班、19号(后端逻辑+1,区别出数据流转状态)、20-23号(针对前端API,进行后端逻辑整合)】
20250825-20250828,4天,【25号(前端UI、后端API初步完成)、26-27号(针对歧义的前端业务与后端接口不匹配进行纠正)、28号(于20250828_095011左右,预部署完成)】
b.任务阶段2
20250829-20250922,25天,【审批流、审批日志表】
c.任务阶段3
20250923-20250930,8天,【修改枚举类;调整字段顺序;新增批量接口】,主要解决【前端筛选框、字段无法映射到erp问题】
20251008-20251014,7天,【新增组织岗位;批量接口】,主要解决【日志表】、【分配、导出、通知、撤回通知】多选操作,【接入erp岗位问题】
20251015-20251021,7天,【迁移到jh4j,对接erp、ejia】,主要解决【git分支切换部署】、【3个系统之间的连通性】,以及【符合jh4j的设计】
01.任务阶段1
a.20250726
a.曹晨松
测试环境:57服务器
测试数据:使用同一服务器,使用金恒的数据库,DB,新增表,保存也是新建表
-------------------------------------------------------------------------------------------------
组织人员:与安防一致
入职岗位:定时任务,获取这个岗位
-------------------------------------------------------------------------------------------------
权限控制:数据隔离 -> 根据 角色 配置字典 -> 数据只能到角色,不能到人
b.庞灿
ejia审批流:
发起审批
-> 幂等性,驳回,也要改变状态
-> 重新发起功能
-------------------------------------------------------------------------------------------------
晋钢轻云办:
集成appid,有程序代码,绑定盛和商户
c.上传下载
1.方式1:jh4j服务器,目前不能
2.方式2:ejia远程,可以上传下载文件
3.方式3:源码所在的服务器
b.20250804
a.提问
1.gitlab权限,分支名告诉我
2.oracle账号密码,新建数据库
3.后端:对接ejia、erp工具包在哪里
4.后端:对接ejia工作流怎么发起,不会
5.前端:人员+组织,能不能先分配给别人
6.小程序开发:不会
-------------------------------------------------------------------------------------------------
1.这个时间有点赶, 后端这一块我没问题,前端我是偶尔写,小程序没搞过
2.再 指配 1个 前端 一起弄吧
3.不明确下 职责,都堆我这,那 我只能按1个人的进度 来走,我也不知道 具体的完成进度的 时间
b.回复
你先把基础数据搞出来
你先搭建出后端的框架来,先做员工履历的增删改查,其他的我后续协调
c.20250805-20250806
a.提问
1.erp
获取一级部门
获取各个部门的岗位信息
-------------------------------------------------------------------------------------------------
2.ejia
需求1:每个厂务的人员,固定工号,比如李敏 J047813
需求2:李敏的一级主管(该一级主管可直接找到),是否可以在 审批流 中进行【固定指定】
由前一级审批人(李敏),来指定对应【二级主管】
b.提问
1.一级部门
2.各个部门的岗位信息
3.每个厂务的人员,固定工号,比如李敏 J047813
4.工作流的实体类,你要发送的信息,自己组装发送调试ejia
5.jh4j的上传下载机制不清楚,请整合后告诉我大概的逻辑、服务器位置
6.gitlab权限账号、新服务器 -> 网关/nginx -> gateway
c.回复
和E家相关的所有串接,你都不用管,包括和小程序串接的你也都不用管,你先做低代码平台自身的应聘登记表的增删改查
d.20250828
a.交付1
http://172.17.12.67:8001/onboard/onbAllocate
admin
aaaaA123@
-------------------------------------------------------------------------------------------------
Tips:已绕开网关,自己部署前端,重写路径到 172.17.12.67 提供的服务器
b.交付2
后端位置:/root/project/22-jh4j-product-onboard/
前端位置:/root/project/jh4j-cloud-ui-onboard/
-------------------------------------------------------------------------------------------------
网址:172.17.12.67
账号:root
密码:f5GZyc3TQk)v
-------------------------------------------------------------------------------------------------
网址:172.17.12.67:3306
账号:root
密码:K9@pR3!sT7$qL2%
-------------------------------------------------------------------------------------------------
Tips:已找 卫婷婷 沟通,部署到他们网关,正常流程 得部署到 jh4j 提供的gitlab专属的服务器,然后 接口采集,才能找 正常网关;前端,如需整合jh4j 提供的gitlab,我没权限,上传后,需要 沟通 协商 jh4j 合并到 部署分支。
Tips:上次找 jh4j 相关人员沟通,他们的意见是,没有完整写完代码,没有部署的必要,彻底写完了,可以通知他们上线。
Tips:该项目于 20250726,下午口头需求,直至目前,20250828,预览版preview已部署完成。
c.交付3
前端:https://git.jggroup.cn/zhangyu/jh4j-cloud-ui-onboard
后端:https://git.jggroup.cn/zhangyu/22-jh4j-product-onboard
git地址,已分配 huifang.guo、2720155362 管理权限,如需 仓库 移交管理员server 名下,请通知 我 转移仓库所有权
02.任务阶段2
a.20250918
a.分支
前端,jingangintegrate-ui,master,合并到master的原分支已删除
小程序,jingangintegrate-system,J057117-entry,这是远程分支,未合并到master
后端,jinGangIntegrate,已提交,分支名为onboard-J057117
b.服务器
后端,jinGangIntegrate,分支capp_dev
服务器,/root/project/capp,启动整个项目,没有走自己网关,只启动了capp这个子服务
上线情况,暂时还没有上线,只是本地调试,访问的走http://localhost:8001
c.分支
前端,jingangintegrate-ui,自己分支【dev-onborad】
b.20250922
a.新增
HRJJM0010,员工基本数据维护,【顺序,红色必填,黑色不必填】
-------------------------------------------------------------------------------------------------
姓名 身份证号 身份证号输入完成后,自动补充【性别、出生日期】
应聘岗位 联系电话
照片 性别 自动填充
照片 出生日期 自动填充
国籍 下拉,默认中国 民族 下拉,默认汉族
户口关系 下拉(01、02) 政治面貌 下拉
婚否 下拉 血型
身高 体重
视力左 视力右
职称 外语等级 【不要动,外语分数不要了】
可报道时间 是否退役军人 退役军人为是,退役时间和退役编号必填;否,则不填时间+编号
退役时间 退役编号
籍贯
户口所在地
现家庭住址
b.子表
工作经历、培训经历、学历中的【开始和结束日期】,填写到月即可
家庭情况中与【本人关系】采用下拉框,和中冠数据保持一致
学历中的【学历、院校类别】采用下拉,和中冠数据保持一致
分配时,【分配日期】,默认为今天
c.20250923
a.沟通1
第1个问题,枚举类
方案1:走 local 开发1个【枚举接口】可以动态保持一致
方案2:入职管理子系统,单独维护
你决定下,哪个方案?数据量还在统计
-------------------------------------------------------------------------------------------------
你用一张简易代码表记录你所有的枚举吧,暂时先手工填数据
b.沟通2
第2个问题:可以优化,直接一步筛选出数据管家的 【人群】,需要优化的话,可以告诉我
数据管家不用动,我会重新传数据上去,不用优化
c.20250926
a.应聘登记
查询框保持格式对齐,查询、重置、展开按钮放在查询的右边
查询条件的顺序,优先放状态、姓名、联系电话、身份证号,这4个始终展示,其他条件放在展开里面
应聘岗位、分配人、性别、最高学历
分配日期、面试日期
其他现有查询字段放在后面先保持不动
-------------------------------------------------------------------------------------------------
查询列表的顺序
姓名、身份证号、手机号、状态、(前面固定)分配人、应聘岗位、可报道日期、性别、出生日期、政治面貌、最高学历、分配时间、面试时间
-------------------------------------------------------------------------------------------------
列表右边的操作按钮只保留详情和编辑,
列表左上角做新增、删除、分配、通知的操作,可多选操作,因此分配界面无需展示应聘者和岗位
b.应聘登记-按钮
其中有的按钮功能不是你做的话,分配和通知不是你做的,你就先空开这两按钮的后台调整,先调整界面样式位置
03.任务阶段3
a.20251008
a.沟通1
面试评估审批:筛选 还是 用的旧版,庞灿说他改动
录用结果审批:筛选 还是 用的旧版,庞灿说他改动
组织人员信息:筛选 还是 用的旧版,庞灿说他改动。原页面,就没有 新增、删除 这2个功能
这3个页面,之前是 庞灿 负责,这是 假期前的情况,现在 需要 我负责吗?
获取详情失败,是因为 后端接口,我把 字段 从getOne 变成 detail了
-------------------------------------------------------------------------------------------------
庞灿我安排其他工作了
b.沟通2
你先改组织人员信息的这个界面,后面的我还没看呢
组织人员信息,把新增和删除的功能加上,然后查询条件的界面风格和应聘登记保持一致
b.2025xxxx
a.xxx
xxx
5.2 系统设计
01.逻辑外键
a.分类1
CREATE TABLE `onb_applicant` (
`id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID (UUID)',
CREATE TABLE `onb_applicant_train` (
`id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID (UUID)',
`applicant_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应聘者ID (逻辑外键)',
CREATE TABLE `onb_applicant_work` (
`id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID (UUID)',
`applicant_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应聘者ID (逻辑外键)',
b.分类2
CREATE TABLE `onb_interview_evaluation` (
`id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID (UUID)',
`applicant_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应聘者ID (逻辑外键)',
`applicant_position_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应聘岗位ID (逻辑外键)',
c.分类3
CREATE TABLE `onb_interview_evaluation_apply` (
`id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID (UUID)',
`interview_evaluation_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '面试评估id (逻辑外键)',
`flow_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '流程标题',
d.分类4
CREATE TABLE `onb_interview_evaluation_type_a` (
`id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID (UUID)',
`applicant_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应聘者ID (逻辑外键)',
`applicant_position_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应聘岗位ID (逻辑外键)',
`interview_evaluation_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '面试评估ID (逻辑外键)',
02.数据库设计
a.数据结构
主键:ID无法自动填充
主键:32位/36位,int/long/string,最终选择string(36)
标志位:open_flag/delete_flag,tinyint/string(6),最终选择string(6)
-----------------------------------------------------------------------------------------------------
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
create_user varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建人',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
update_user varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新人',
deleted_flag tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标志(0-未删除, 1-已删除)',
b.自定义结构
JsonObjectTypeHandler.java -> PastHistoryTypeHandler.java
past_history:{"infectious":true,"allergy":true,"surgery":false,"other":false}
-----------------------------------------------------------------------------------------------------
JsonObjectTypeHandler.java -> AddressTypeHandler.java
home_address,{"province":"","city":"","district":"","detail":"","police":"","village":"","street":"","number":""}
-----------------------------------------------------------------------------------------------------
JsonArrayTypeHandler.java -> ApplicationChannelsHandler.java
application_channels:["网站","校园招聘会","朋友推荐","微信","社会招聘会"]
c.枚举与字典表
枚举属于java程序逻辑,映射属于sql主数据维护
-----------------------------------------------------------------------------------------------------
枚举映射:OnbMapEnum.java、OnbStringKeyMapEnum.java,项目启动自动序列化(OnbTypeHandlerAutoConfig.java)
字典映射:sys_dict_item,包括dict_code、dict_name、item_id、item_text、sort_no
d.对接三方信息表
岗位映射:sys_position_job,包括dept_no、dept_name、position_no、position_name、open_flag
用户映射:sys_person_info,包括org_name、org_no、company_id、org_level、date_steward、date_steward_no、oepn_flag
-----------------------------------------------------------------------------------------------------
使用编码:sys_person_info、sys_position_job,在onb_applicant选择【人、岗位】使用【三方表】的编码
冗余字段:apply_position,在onb_applicant更新后,onb_interview_position也需要更新,因为这个字段2个表都在用,要保持一致性
e.对接三方审批表
1.用户登录验证 @CheckSign
2.角色权限验证(支持 OR/AND 逻辑) @CheckSign(roles = {"ROLE_HR_ADMIN", "ROLE_MANAGER"})
3.权限编码验证(支持 OR/AND 逻辑) @CheckSign(permissions = {"onboard:allocate:update"})
4.组织权限验证(两层验证:管理员 > 数据管家) @CheckSign(checkOrgAdmin = true)
-----------------------------------------------------------------------------------------------------
用户映射:sys_person_info,包括org_name、org_no、company_id、org_level、date_steward、date_steward_no、oepn_flag
02.后端设计
a.MyBatisPlus
分页
-----------------------------------------------------------------------------------------------------
b.
e.对接三方权限表
枚举序列化、
MyBatis:自动填充、分页
问题汇总:get(0)
小程序暂存:标志2、pinia
01.描述
映射:1与'1'
网关:图片正则
权限:前后端接入
序列化:枚举、Date
URL:.env与vite混用去
mybatisplus配置
版本号
封装axios、拦截器、网关(图片正则 乱码)
mini小程序,输入防抖问题 setData,光标一直回退
01.custom-class
a.问题根因
Element Plus 2.4.0 是一个破坏性变更的分水岭
custom-class prop 被完全移除
改为使用 Vue 3 的标准 class 属性继承机制
b.解决方案
2.2.6:使用 custom-class="xxx"
2.9.7:使用 class="xxx" 或专用的 *-class props
c.你的项目
当前版本 2.2.6 → custom-class ✅ 正确
如果升级到 2.9.7 → 必须改用 class
d.要点整理
版本限制:项目固定在 [email protected],此版本仍支持 custom-class 属性。
问题根因:el-dialog 使用 Teleport 挂载到 body,而页面样式文件被 <style scoped> 限制,导致 .approval-dialog 样式偶尔失效。
解决策略:保留 custom-class="approval-dialog",同时将相关样式设为全局(移除 scoped、或改用 :deep()),确保 Teleport 元素可以匹配到样式。
e.结论与建议
已确认官方文档与 Issue:custom-class 在 2.4.0 才会移除,目前版本可继续使用。
样式需要全局化:改为 <style src="./css/index.css"> 或者使用 :deep(.approval-dialog)。
可考虑把审批对话框样式集中到共享 CSS,便于维护。
<el-button
type="text"
size="small"
@click="tableActions.handleDetail(scope.row)"
>详情
</el-button>
<el-button
v-if="canPerform('notify')"
type="primary"
link
size="small"
:disabled="!canAudit(scope.row.auditStatus)"
@click="fun_audit(scope.row)"
>通知
</el-button>
primary的type有问题
5.3 任务整理
01.晋钢控股集团应聘登记A表,应聘者录入
a.开始
应聘单位:
应聘组别:
应聘岗位:
-----------------------------------------------------------------------------------------------------
附件1:身份证
附件2:学位证
附件3:毕业证
附件4:学历证书电子注册备案表
附件5:毕业证在线验证报告
b.基本信息
姓名:
照片:
性别:
出生年月:
民族:
政治面貌:党员 / 团员 / 群众
婚姻状况:已婚 / 未婚
-----------------------------------------------------------------------------------------------------
身高:XX厘米
体重:XXX公斤
视力:左:1.0、右:1.0
血型:
职称:
外语等级:
-----------------------------------------------------------------------------------------------------
联系电话:
身份证号:
可报到时间:
是否退役军人:是 / 否
退役时间:
退役证编号:
-----------------------------------------------------------------------------------------------------
籍贯:XX省 XX市 XX县(区)
现家庭住址:XX省 XX市 XX县(区) XX乡(街道) XX村(路) XX号
户口所在地:XX省 XX市 XX县(区) XX乡(街道) XXXXXXXXXXXX派出所
c.工作经历
起止时间 曾工作单位(全称) 职务 负责业务范围 证明人及联系方式
XXXX年XX月 至 XXXX年XX月
XXXX年XX月 至 XXXX年XX月
XXXX年XX月 至 XXXX年XX月
XXXX年XX月 至 XXXX年XX月
d.培训经历
培训时间 受何培训(或培训名称) 获得何资格/技能等级
XXXX年XX月 至 XXXX年XX月
XXXX年XX月 至 XXXX年XX月
XXXX年XX月 至 XXXX年XX月
XXXX年XX月 至 XXXX年XX月
e.家庭情况
姓名 与本人关系 年龄 工作单位 联系电话
XXX 父亲/母亲
XXX 哥哥/弟弟
XXX 姐姐/妹妹
f.学习经历
起止时间 学历 学校名称 专业 学校学历性质
XXXX年XX月 至 XXXX年XX月
XXXX年XX月 至 XXXX年XX月
XXXX年XX月 至 XXXX年XX月
g.疾病史别
过往史:传染病、过敏史、手术史、其它
现在史:残疾、心理病、色盲、恐高、晕高、癫痫、其它
家族史:心脏病、高血压、糖尿病、其它
职业史:耳鼻喉、肺肝腰、其它
其他史:
无病史需手写:本人无任何病史____________
h.备注
应聘途径:网站______、微信/朋友推荐/社会招聘会/校园招聘会/其他
1.是否同意担任轮班工作:是/否
2.是否需住宿:是/否,说明:因宿舍房间有限,恕无法保证均能获得分配。
i.申明
1.本人声明上述资料所填皆属真实、准确,且本人无吸毒、偷盗、赌博、扰乱公共秩序等行为,
如有查证必要时,本人授权同意山西晋城钢铁控股集团有限公司依据个人信息保护法之规定,
向相关单位、部门或公司查询本人之相关资料,如有不实,本人愿意接受(不雇佣)之处理。
2.若经贵公司录用,悉接受分发工作单位绝无异议,入职后同意缴纳社会保险,
且于报到后若有发现体检表上所未记载而属不适应工作之疾病,愿即接受(不雇用)之处理。
3.本人签字:
4.填表时间:XXXX年XX月XX日
02.晋钢控股集团应聘登记B表,文员反馈【面试结果】
a.基本信息
a.分类1
应聘人:
应聘岗位:
应聘职级:
b.分类2
定编:
缺员:
b.用人单位结构面试(Y6)
a.测试方式
笔试 / 口试 / 实际操作
b.基础素质
a.学历水平
高中 1分
中专 3分
专科 5分
本科 7分
硕士 10分
b.专业匹配
1分 / 3分 / 5分 / 7分 / 10分
c.专业深度
a.理论知识
1分 / 3分 / 5分 / 7分 / 10分
b.实务经验
1分 / 3分 / 5分 / 7分 / 10分
d.经验匹配
a.行业经验
0~2年 1分
3年 3分
4年 5分
5年 7分
6年及以上 10分
e.综合素质
a.目标管理
1分 / 3分 / 5分 / 7分 / 10分
b.计划管理
1分 / 3分 / 5分 / 7分 / 10分
c.组织管理
1分 / 3分 / 5分 / 7分 / 10分
d.绩效管理
1分 / 3分 / 5分 / 7分 / 10分
e.性格管理
1分 / 3分 / 5分 / 7分 / 10分
f.其他信息
a.是否录用
是 / 否
b.试用期
一个月 / 二个月 / 三个月 / 六个月
c.综合分
XX分
c.用人单位结构面试
a.测试方式
笔试 / 口试 / 实际操作
b.专业技能
a.专业知识
1分 / 3分 / 5分 / 7分 / 10分
b.实操技能
1分 / 3分 / 5分 / 7分 / 10分
c.基本素质
a.精神面貌
1分 / 3分 / 5分 / 7分 / 10分
b.吃苦耐劳
1分 / 3分 / 5分 / 7分 / 10分
c.沟通表达
1分 / 3分 / 5分 / 7分 / 10分
d.经验匹配
a.行业经验
0~1年 1分
2年 2分
3年 3分
4年 4分
5年 5分
b.经验分
XX分
e.其他信息
a.用工性质
一般普工 / 一般技工 / 熟练技工
b.是否录用
是 / 否
c.试用期
一个月 / 二个月 / 三个月 / 六个月
d.综合分
XX
5.4 后端设计
01.目录结构
a.人员信息
组织架构管理:与其他模块数据一致,需要每天同步
人员基础信息管理:与其他模块数据一致,需要每天同步
b.招聘管理
应聘登记 onbApplicant
-----------------------------------------------------------------------------------------------------
面试分配 onbAllocate 状态有:1-待分配、2-等待面试
面试评估 onbEvaluate 状态有:2-等待面试、3-面试审核中、4-面试通过、5-面试失败
面试录用 onbOffer 状态有:4-面试通过、6-录用审核中、7-录用通过、8-录用失败
-----------------------------------------------------------------------------------------------------
评估审批 onbEvaluateApply
录用审批 onbOfferApply
-----------------------------------------------------------------------------------------------------
组织人员 onbOrgPersonInfo
组织岗位 onbPostionJob
组织字典 onbDictItem
02.通用界面
a.字段
学历
状态
时间(倒序)
审核状态:待分配(默认)-> 面试中 -> 面试失败/面试成功 -> 待入职 / 面试违规
-----------------------------------------------------------------------------------------------------
操作:审批 / 编辑 / 删除
弹框:发起 / 保存 / 取消
b.权限
用户管理员:人力6人
普通管理员(用户):绑定Y6-李敏,J047813
c.功能1
增删改查
导出
03.审核流程
a.第1步:应聘者录入 --扫码
晋钢轻云办
-> 招聘
-> 应聘登记表
-> 表单,跟【应聘登记】界面中【新增功能】一致
b.第2步:人力资源中心(6人),进行【分配】 --用户管理员
应聘登记
-> 多选:2、3、5
-> 点击【分配】按钮
-> 弹框详情:
1.部门 W1/Y6,一级单位
2.分配人:李敏
-> 【保存/通知/取消】
1.调用【通知,并非工作流】:晋钢ejia -> 抛给Y6李敏,通知消息(人力资源已分配XX、XX参加面试)
2.回调成功:审核状态(待分配 -> 面试中),隐藏2个字段,字段1(一级分配部门),字段2(暂定)
c.第3步:面试中
1.【系统指定】分配给【李敏】,从【研发中心】带人来【管控中心】,进行Y6面试
2.【各个厂处】内部指定【面试官】,对【应聘者】进行【机试+笔试】
3.【面试官】反馈给【李敏】
d.第4步:李敏,进行【录入】 --普通管理员(用户)
1.登录 -> 没有【新增改】,只能看到【分配的3条数据】
2.点击【反馈】按钮,弹框详情如下:
2.1.面试结果:状态(录用/不录用)
2.2.面试建议:XXX
2.3.应聘岗位:XXX(下拉框,一级部门 -> 每个部门的岗位信息)
3.录用:按钮【保存/发起/取消】
3.1.保存
3.1.1.暂存数据
3.2.发起
3.2.1.审核状态:待分配 -> 面试中
3.2.2.发起ejia审批
名称(XX应聘结果审批)
发起人:李敏
审批人1:李敏(暂定)
审批人2:由前一级审批人(李敏),来指定对应【二级主管】
审批人3:李敏的一级主管(该一级主管可直接找到)
审批状态:面试中 -> 面试成功
3.2.取消
3.1.1.取消弹框
4.不录用:按钮【保存/取消】
4.1.保存
4.1.1.由人力再去决定【应聘哪个岗位】,分配人【从李敏变成NULL】
4.2.取消
4.1.1.取消弹框
e.第5步:人力资源中心(6人),进行【补录】 --用户管理员
1.登录 -> 有【新增改】,可以看到【面试成功】的【3条数据】
2.操作【张三】
3.点击【编辑】按钮,弹框详情如下:
3.1.状态:录用
3.2.试用期工资:XXX
3.3.试用期时长:1个月/2个月/3个月
3.4.转正工资:XXXX
3.5.用工性质:一般普工/一般技工/熟练技工
4.点击【审批】按钮,发起ejia审批
名称(XX录用结果审批)
发起人:HR(用户管理员)
审批人1:王海英(人资处长)
审批人2:王海英的一级主管(该一级主管可直接找到)
审批人3:詹总
审批状态:面试成功 -> 待入职
f.附:定时操作
a.待分配
说明:3天内,应聘者未到指定地点参与应聘
状态:待分配 -> 面试违规
b.待分配 -> 面试中
说明:3天内,面试失败
状态:待分配 -> 面试中 -> 面试违规
c.待入职
说明:需要同步这部分数据到【ERP】
状态:同步操作
5.5 前端设计
00.整体框架
a.风格:上中下
筛选框+多个按钮(查询、重置、新增)
表格:列1、列2、列3、列4,操作1:XX、XX、XX,操作2:XX
分页组件
b.弹框1:普通表单(单列/多列,自动根据字段多少来确定)
字段1:值1
字段2:值2
字段3:值3
c.弹框2:有多个标签页,每个标签页都有表单(单列/多列,自动根据字段多少来确定) / 表格(子表,完整的增删改查)
标签页1
字段1:值1 字段4:值1
字段2:值2 字段5:值2
字段3:值3 字段6:值2
标签页2
字段1:值1 字段4:值1
字段2:值2 字段5:值2
字段3:值3 字段6:值2
标签页3
字段1:值1 字段4:值1
字段2:值2 字段5:值2
字段3:值3 字段6:值2
01.应聘登记
a.区域1:筛选框
姓名
性别(1-男、2-女)
出生日期
联系电话
身份证号
政治面貌(1-党员、2-团员、3-群众)
外语等级(1-一般、2-四级、3-六级、4-专四、5-专八、6-托福、7-雅思)
应聘岗位
审核状态(1-待分配、2-等待面试)
分配人
报到时间
面试时间
b.区域2:表格
姓名
照片
性别
出生日期
联系电话
身份证号
应聘岗位
审核状态(1-待分配、2-等待面试)
分配人
报到时间
面试时间
-----------------------------------------------------------------------------------------------------
操作1:详情、编辑、删除
操作2:分配、审核、撤回审核
c.区域2:操作1:详情/编辑(仅仅表单共用)
标题:详情/编辑
-----------------------------------------------------------------------------------------------------
标签页1:基本情况
以下是表单(多列)
applicant_name 姓名
apply_position 应聘岗位
photo_url 照片URL
gender 性别(1-男、2-女)
birth_date 出生日期
nation 民族
political_status 政治面貌(1-党员、2-团员、3-群众)
marital_status 婚姻状况(1-已婚、2-未婚)
height 身高(厘米)
weight 体重(公斤)
vision_left 左眼视力
vision_right 右眼视力
blood_type 血型(1-A型、2-B型、3-AB型、4-O型)
professional_title 职称
foreign_language_level 外语等级(1-一般、2-四级、3-六级、4-专四、5-专八、6-托福、7-雅思)
foreign_language_score 外语分数
contact_phone 联系电话
id_card_no 身份证号
available_date 可报到时间
is_veteran 是否退役军人(0-否、1-是)
discharge_date 退役时间
discharge_cert_no 退役证编号
home_address 现家庭住址
household_register 户口所在地
native_place 籍贯
-----------------------------------------------------------------------------------------------------
标签页2:工作经历
以下是表格(多列)
start_date 开始时间
end_date 结束时间
company_name 曾工作单位全称
position 职务
business_scope 负责业务范围
reference_person 证明人
reference_contact 证明人的联系方式
操作:编辑、删除
-----------------------------------------------------------------------------------------------------
标签页3:培训经历
以下是表格(完整增删改查)
按钮:新增
start_date 培训开始时间
end_date 培训结束时间
training_name 受何培训/培训名称
qualification 获得何资格/技能等级
操作:编辑、删除
-----------------------------------------------------------------------------------------------------
标签页4:家庭情况
以下是表格(完整增删改查)
按钮:新增
name 姓名
relationship 与本人关系
age 年龄
work_unit 工作单位
contact_phone 联系电话
操作:编辑、删除
-----------------------------------------------------------------------------------------------------
标签页5:学习经历
以下是表格(完整增删改查)
按钮:新增
start_date 开始时间
end_date 结束时间
education_level 学历
school_name 学校名称
major 专业
school_nature 学校/学历类型
操作:编辑、删除
-----------------------------------------------------------------------------------------------------
标签页6:病史类别
past_history 过往史
current_history 现在史
family_history 家族史
occupational_history 职业史
other_history 其他史
no_history_statement 无病史声明
-----------------------------------------------------------------------------------------------------
标签页7:附件信息
以下是5个上传文件的组件,每个组件支持上传、删除、更换
分别有1-身份证、2-学位证、3-毕业证、4-学历证书电子注册备案表、5-毕业证在线验证报告
-----------------------------------------------------------------------------------------------------
标签页8:备注
应聘途径(多选):网站、微信、朋友推荐、社会招聘会、校园招聘会、其他
是否同意轮班工作(单选):是、否
是否需要住宿(单选):是、否
住宿说明:因宿舍房间有限,恕无法保证均能获得分配
-----------------------------------------------------------------------------------------------------
标签页9:申明
声明内容:*本人声明上述资料所填皆属真实、准确,且本人无吸毒、偷盗、赌博、扰乱公共秩序等行为,如有查证必要时,本人授权同意山西晋城钢铁控股集团有限公司依据个人信息保护法之规定,向相关单位、部门或公司查询本人之相关资料,如有不实,本人愿意接受(不雇佣)之处理。
*若经贵公司录用,悉接受分发工作单位绝无异议,入职后同意缴纳社会保险,且于报到后若有发现体检表上所未记载而属不适应工作之疾病,愿即接受(不雇用)之处理。
本人签字:
填表时间:
d.区域2:操作1:删除
标题:删除确认
-----------------------------------------------------------------------------------------------------
说明:确认删除该XXX吗?此操作不可撤销!
按钮1:取消
按钮2:确认删除
e.区域2:操作2:分配
标题:分配面试
-----------------------------------------------------------------------------------------------------
应聘者:XX applicantId
应聘岗位:XX applyPosition
分配人:XX assignedUser
分配部门:XX assignedDept
分配说明:XX assignedReason
-----------------------------------------------------------------------------------------------------
按钮1:取消
按钮2:保存
f.区域2:操作2:审核
弹出确认框,发出POST请求
g.区域2:操作2:撤回审核
弹出确认框,发出POST请求
h.区域3:分页组件
共19条 10条/页 1 2 3 ... 前往X页
02.面试评估
a.区域1:筛选框
姓名
性别(1-男、2-女)
出生日期
联系电话
身份证号
政治面貌(1-党员、2-团员、3-群众)
外语等级(1-一般、2-四级、3-六级、4-专四、5-专八、6-托福、7-雅思)
应聘岗位
审核状态(3-面试审核中、4-面试通过、5-面试失败)
分配人
报到时间
面试时间
b.区域2:表格
姓名
照片
性别
出生日期
联系电话
身份证号
应聘岗位
审核状态(3-面试审核中、4-面试通过、5-面试失败)
分配人
报到时间
面试时间
-----------------------------------------------------------------------------------------------------
操作1:详情、编辑、删除
操作2:评估、审核、撤回审核
c.区域2:操作1:详情/编辑(仅仅表单共用)
标题:详情/编辑
-----------------------------------------------------------------------------------------------------
标签页1:基本情况
以下是表单(多列)
applicant_name 姓名
apply_position 应聘岗位
photo_url 照片URL
gender 性别(1-男、2-女)
birth_date 出生日期
nation 民族
political_status 政治面貌(1-党员、2-团员、3-群众)
marital_status 婚姻状况(1-已婚、2-未婚)
height 身高(厘米)
weight 体重(公斤)
vision_left 左眼视力
vision_right 右眼视力
blood_type 血型(1-A型、2-B型、3-AB型、4-O型)
professional_title 职称
foreign_language_level 外语等级(1-一般、2-四级、3-六级、4-专四、5-专八、6-托福、7-雅思)
foreign_language_score 外语分数
contact_phone 联系电话
id_card_no 身份证号
available_date 可报到时间
is_veteran 是否退役军人(0-否、1-是)
discharge_date 退役时间
discharge_cert_no 退役证编号
home_address 现家庭住址
household_register 户口所在地
native_place 籍贯
-----------------------------------------------------------------------------------------------------
标签页2:工作经历
以下是表格(多列)
start_date 开始时间
end_date 结束时间
company_name 曾工作单位全称
position 职务
business_scope 负责业务范围
reference_person 证明人
reference_contact 证明人的联系方式
操作:编辑、删除
-----------------------------------------------------------------------------------------------------
标签页3:培训经历
以下是表格(完整增删改查)
按钮:新增
start_date 培训开始时间
end_date 培训结束时间
training_name 受何培训/培训名称
qualification 获得何资格/技能等级
操作:编辑、删除
-----------------------------------------------------------------------------------------------------
标签页4:家庭情况
以下是表格(完整增删改查)
按钮:新增
name 姓名
relationship 与本人关系
age 年龄
work_unit 工作单位
contact_phone 联系电话
操作:编辑、删除
-----------------------------------------------------------------------------------------------------
标签页5:学习经历
以下是表格(完整增删改查)
按钮:新增
start_date 开始时间
end_date 结束时间
education_level 学历
school_name 学校名称
major 专业
school_nature 学校/学历类型
操作:编辑、删除
-----------------------------------------------------------------------------------------------------
标签页6:病史类别
past_history 过往史
current_history 现在史
family_history 家族史
occupational_history 职业史
other_history 其他史
no_history_statement 无病史声明
-----------------------------------------------------------------------------------------------------
标签页7:附件信息
以下是5个上传文件的组件,每个组件支持上传、删除、更换
分别有1-身份证、2-学位证、3-毕业证、4-学历证书电子注册备案表、5-毕业证在线验证报告
-----------------------------------------------------------------------------------------------------
标签页8:备注
应聘途径(多选):网站、微信、朋友推荐、社会招聘会、校园招聘会、其他
是否同意轮班工作(单选):是、否
是否需要住宿(单选):是、否
住宿说明:因宿舍房间有限,恕无法保证均能获得分配
-----------------------------------------------------------------------------------------------------
标签页9:申明
声明内容:*本人声明上述资料所填皆属真实、准确,且本人无吸毒、偷盗、赌博、扰乱公共秩序等行为,如有查证必要时,本人授权同意山西晋城钢铁控股集团有限公司依据个人信息保护法之规定,向相关单位、部门或公司查询本人之相关资料,如有不实,本人愿意接受(不雇佣)之处理。
*若经贵公司录用,悉接受分发工作单位绝无异议,入职后同意缴纳社会保险,且于报到后若有发现体检表上所未记载而属不适应工作之疾病,愿即接受(不雇用)之处理。
本人签字:
填表时间:
d.区域2:操作1:删除
标题:删除确认
-----------------------------------------------------------------------------------------------------
说明:确认删除该XXX吗?此操作不可撤销!
按钮1:取消
按钮2:确认删除
e.区域2:操作2:评估
标题:评估
-----------------------------------------------------------------------------------------------------
以下是表单(多列)
applicant_name 姓名
gender 性别(1-男、2-女)
birth_date 出生日期
contact_phone 联系电话
id_card_no 身份证号
applyPosition 应聘岗位
请选择评估类型:A类型/B类型
-----------------------------------------------------------------------------------------------------
根据【请选择评估类型:A类型/B类型】来【显示/隐藏】,下面是 Y6结构面试评估 (A类型)
基础素质评估
学历水平 1分3分5分7分10分 高中1分,中专3分,专科5分,本科7分,硕士10分
专业匹配 1分3分5分7分10分 专业匹配度评估
专业深度评估
理论知识 1分3分5分7分10分 专业理论掌握程度
实务经验 1分3分5分7分10分 实际工作经验
经验匹配评估
行业经验 1分3分5分7分10分 0-2年1分,3年3分,4年5分,5年7分,6年以上10分
综合素质评估
目标管理 1分3分5分7分10分 目标设定和执行能力
计划管理 1分3分5分7分10分 计划制定和管理能力
组织管理 1分3分5分7分10分 组织协调能力
绩效管理 1分3分5分7分10分 绩效管理能力
性格管理 1分3分5分7分10分 性格适应性
总分
XXX
-----------------------------------------------------------------------------------------------------
根据【请选择评估类型:A类型/B类型】来【显示/隐藏】,下面是 用人单位结构面试评估 (B类型)
专业技能评估
专业知识 1分3分5分7分10分 专业知识掌握程度
实操技能 1分3分5分7分10分 实际操作技能
综合素质评估
精神状态 1分3分5分7分10分 精神面貌和状态
吃苦耐劳 1分3分5分7分10分 工作态度和耐力
沟通协调 1分3分5分7分10分 沟通协调能力
工作经验 1分3分5分7分10分 相关工作经验
用工类型
用工类型 ○正式员工 ○劳务派遣 ○临时工 ○实习生
总分
XXX
-----------------------------------------------------------------------------------------------------
测试方式: 1-笔试、2-口试、3-实际操作 test_method
用工性质: 1-一般普工、2-一般技工、3-熟练技工 employment_type
面试结果: 通过/不通过(可以更改)
面试意见: XXX(可以更改)
按钮1:取消
按钮2:保存
f.区域2:操作2:审核
弹出确认框,发出POST请求
g.区域2:操作2:撤回审核
弹出确认框,发出POST请求
h.区域3:分页组件
共19条 10条/页 1 2 3 ... 前往X页
03.录用反馈
a.区域1:筛选框
姓名
性别(1-男、2-女)
出生日期
联系电话
身份证号
政治面貌(1-党员、2-团员、3-群众)
外语等级(1-一般、2-四级、3-六级、4-专四、5-专八、6-托福、7-雅思)
应聘岗位
审核状态(3-面试审核中、4-面试通过、5-面试失败)
分配人
报到时间
面试时间
b.区域2:表格
姓名
照片
性别
出生日期
联系电话
身份证号
应聘岗位
审核状态(3-面试审核中、4-面试通过、5-面试失败)
分配人
报到时间
面试时间
-----------------------------------------------------------------------------------------------------
操作1:详情、编辑、删除
操作2:录用、审核、撤回审核
c.区域2:操作1:详情/编辑(仅仅表单共用)
标题:详情/编辑
-----------------------------------------------------------------------------------------------------
标签页1:基本情况
以下是表单(多列)
applicant_name 姓名
apply_position 应聘岗位
photo_url 照片URL
gender 性别(1-男、2-女)
birth_date 出生日期
nation 民族
political_status 政治面貌(1-党员、2-团员、3-群众)
marital_status 婚姻状况(1-已婚、2-未婚)
height 身高(厘米)
weight 体重(公斤)
vision_left 左眼视力
vision_right 右眼视力
blood_type 血型(1-A型、2-B型、3-AB型、4-O型)
professional_title 职称
foreign_language_level 外语等级(1-一般、2-四级、3-六级、4-专四、5-专八、6-托福、7-雅思)
foreign_language_score 外语分数
contact_phone 联系电话
id_card_no 身份证号
available_date 可报到时间
is_veteran 是否退役军人(0-否、1-是)
discharge_date 退役时间
discharge_cert_no 退役证编号
home_address 现家庭住址
household_register 户口所在地
native_place 籍贯
-----------------------------------------------------------------------------------------------------
标签页2:工作经历
以下是表格(多列)
start_date 开始时间
end_date 结束时间
company_name 曾工作单位全称
position 职务
business_scope 负责业务范围
reference_person 证明人
reference_contact 证明人的联系方式
操作:编辑、删除
-----------------------------------------------------------------------------------------------------
标签页3:培训经历
以下是表格(完整增删改查)
按钮:新增
start_date 培训开始时间
end_date 培训结束时间
training_name 受何培训/培训名称
qualification 获得何资格/技能等级
操作:编辑、删除
-----------------------------------------------------------------------------------------------------
标签页4:家庭情况
以下是表格(完整增删改查)
按钮:新增
name 姓名
relationship 与本人关系
age 年龄
work_unit 工作单位
contact_phone 联系电话
操作:编辑、删除
-----------------------------------------------------------------------------------------------------
标签页5:学习经历
以下是表格(完整增删改查)
按钮:新增
start_date 开始时间
end_date 结束时间
education_level 学历
school_name 学校名称
major 专业
school_nature 学校/学历类型
操作:编辑、删除
-----------------------------------------------------------------------------------------------------
标签页6:病史类别
past_history 过往史
current_history 现在史
family_history 家族史
occupational_history 职业史
other_history 其他史
no_history_statement 无病史声明
-----------------------------------------------------------------------------------------------------
标签页7:附件信息
以下是5个上传文件的组件,每个组件支持上传、删除、更换
分别有1-身份证、2-学位证、3-毕业证、4-学历证书电子注册备案表、5-毕业证在线验证报告
-----------------------------------------------------------------------------------------------------
标签页8:备注
应聘途径(多选):网站、微信、朋友推荐、社会招聘会、校园招聘会、其他
是否同意轮班工作(单选):是、否
是否需要住宿(单选):是、否
住宿说明:因宿舍房间有限,恕无法保证均能获得分配
-----------------------------------------------------------------------------------------------------
标签页9:申明
声明内容:*本人声明上述资料所填皆属真实、准确,且本人无吸毒、偷盗、赌博、扰乱公共秩序等行为,如有查证必要时,本人授权同意山西晋城钢铁控股集团有限公司依据个人信息保护法之规定,向相关单位、部门或公司查询本人之相关资料,如有不实,本人愿意接受(不雇佣)之处理。
*若经贵公司录用,悉接受分发工作单位绝无异议,入职后同意缴纳社会保险,且于报到后若有发现体检表上所未记载而属不适应工作之疾病,愿即接受(不雇用)之处理。
本人签字:
填表时间:
d.区域2:操作1:删除
标题:删除确认
-----------------------------------------------------------------------------------------------------
说明:确认删除该XXX吗?此操作不可撤销!
按钮1:取消
按钮2:确认删除
e.区域2:操作2:录用
标题:录用
-----------------------------------------------------------------------------------------------------
以下是表单(多列)
applicant_name 姓名
gender 性别(1-男、2-女)
birth_date 出生日期
contact_phone 联系电话
id_card_no 身份证号
applyPosition 应聘岗位
-----------------------------------------------------------------------------------------------------
状态 录用/不录用(可以更改)
试用期工资 XXX(可以更改)
试用期时长 1个月/2个月/3个月(可以更改)
转正工资 XXXX
-----------------------------------------------------------------------------------------------------
按钮1:取消
按钮2:保存
f.区域2:操作2:审核
弹出确认框,发出POST请求
g.区域2:操作2:撤回审核
弹出确认框,发出POST请求
h.区域3:分页组件
共19条 10条/页 1 2 3 ... 前往X页
6 设备处领域
6.1 日常维护
01.常用信息1
a.领域分类
a.领域:五个
设备、工程(咋们所属领域)
物料:对应负责人安谦、张海杰
原料:对应负责人李方炫
人资、保卫、盛和:对应负责人郭慧芳
成本、财务:对应负责人刘洁
b.职责
若遇到跨领域问题,让问题提出人联系相关领域负责人处理
只处理系统异常,不处理系统使用问题,使用问题直接联系设备处
这个系统目前没有交付源码,交付后会有维护的培训
以后这两个系统出了问题会优先找你或者我了,先熟悉熟悉系统吧
b.常见问题处理流程
a.修改数据
修改前注意是什么领域的问题,是设备、工程问题需要在E家发起“单据变更申请”,审批通过后才可修改
b.删除数据
数据一般不做删除,如若非要删除,需要问题提出人找对应部门处长签字(比如某员工需要删除ERP设备系统的数据,需要让他找设备处处长签字)
c.E家修改审批流程
如果要修改审批流程,需要审批管理部门负责人签字
简单的人员离职替换审批人无需负责人签字
d.注意事项
处理任何问题之前,要先经过管理部门同意
例:某人要新增ERP设备系统某个页面权限,需让他先联系王志成,再由王志成联系咱们添加
02.常用信息2
a.前提
联系【王志成】,询问权限情况
人员授权:点击【左上角 I】:1.页面(资讯登录查询);2.按钮(作业操作授权查询)
b.权限1
设备管理系统
-> 搜索【MOAB4】
-> 跳转页面后,点击【左上角 I】,进入【对应授权页面】
-> 右侧【授权群组】-> 【!】-> 新增成员 -> J057240
c.权限2
收藏夹
-> 使用者密码管理
-> J057643
d.请假情况
e.jggroup.cn
-> 19135308032、@Qwfqw001017
-> 管理中心 选择 业务中心
-> 智能审批 选择 流程管理 选择 流程监控,筛选表单 选择 发起人(在职) 选择 J057240
-> 智能审批 选择 流程中心 选择 已办,筛选表单 选择 发起人(在职) 选择 J057240
03.常用信息3
a.耗时统计
此模块为针对现场巡检数据耗时的一个统计报表,主要是分为站点、设备、组织机构和巡检人四个维度,
通过这四个维度,我们可以整体把控巡检的整体耗时,方便进行后续的维护和优化。
b.站点耗时
以路线下的站点为统计维度,统计每条路线下的每一站的巡检耗时
c.设备耗时
顾名思义,以路线下的设备巡检时间为统计维度统计时间,通过这个指标我们可以整体把控设备的整体巡检状态。
d.组织机构巡检
查询当前组织机构及其一下的组织机构路线的巡检时间,换句话说,只要路线创建在组织机构及其一下,都可以被统计时间。
e.巡检人耗时
这个指标主要是针对人员来说的,可以整体把控人员巡检的耗时,这个指标反馈了现场巡检人员一段时间范围内的巡检频次和耗时。
6.2 精度管理平台
00.沟通记录
a.20250926
接口,抛数据
读咱们数据库环境,表信息
抛出合格率,郭晨阳
01.基础功能
a.标准
设备区域、具体设备、精度项目、精度标准、测量手段、检测周期、责任部门
b.操作
a.精度标准维护
手动录入标准,标准就是度量衡
b.精度测量管理
手动录入 + 数字自采
c.精度数字评价
在标准值基础上,确定各项标准的功能失效值,采用如下公式对各项标准、设备、区域进行数字评价;稍微复杂,跳过
d.精度标准监控
精度标准监控模块根据固定统计周期(周、月、年)、用户指定时间段对产线、区域、设备、项目的精度检查完成率、精度检查合格率等指标进行计算,
为设备管理人员提供精度管理指标统计、趋势分析等功能,为其管理工作提供指标数据支撑。
e.精度标准报表
在标准值基础上,根据测量数据结果和特定筛选条件进行报表展示和导出
c.评价
头部辊缝(xxx毫米)
02.UI设计
a.目录
a.架构
首页
精度管控标准:序号、厂处、产线、区域、设备名称、设备编号、项目、标准值、量测手段、XXX
精度数据录入(PC、移动):XX、正常录入
精度数据记录:格式与标准相同、可按【日期、厂处、设备】等条件筛选,跳转
精度数据总览:见下方描述
异常数据:异常数据明细、缺陷处理
提示预警:如果有异常,需要推送数据;手动录入一个预警数值,需要推送;数据报警,需要推送阈值
b.特别说明
组织架构:原来点检没有厂线概念,需要单独维护,5.6W的设备,相当麻烦,这个数据维护是一次性的
厂线 -> 区域 -> 设备 -> 责任人
b.大屏设计
a.轮廓
区域6 区域2
区域4
区域8 区域7
区域5 区域1+区域3 区域9
b.设计
区域1:保持率(1)
区域2:产品合格率
区域3:异常趋势
区域4:电位分布图(主要)
区域5:保持率(1)
区域6:数量、正/负占比
区域7:保持率排名
区域8:趋势图
区域9:当月区域排名
c.设计:首页
a.精度保持率
分为2类,1个是工艺,1个是设备
b.产品合格率
日(每日更新)
c.保持率排名
按照【厂处】排名,具体到【冷轧厂,保持率100%】
d.精度点位分布
全公司有48个点位,冷轧有24个,地图占比问题
e.精度正常异常占比
全公司,没有【厂处】选项
f.逾期排名
要求【厂处,如冷轧】,按照规定日期没有完成
g.异常趋势
曲线图
h.异常点位
未处理,一直滚动播放
d.设计:精度数据总览
a.左侧树形
晋钢集团
Y5-热轧
Y8-冷轧
1#镀锌
2#镀锌
3#镀锌
b.右侧主体
日期:日期段(没有日期,废弃)
类型:工艺(自动采集)/设备(手动录入)
报警列表:异常数据,展示
对比分析:6个周期,生成机架辊辊径历史精度趋势,2023-01-15 10:19:58
最新数据:如果是自动采集,就显示实时数据;如果是手动录入,就显示最近一次;
-----------------------------------------------------------------------------------------------------
主界面UI:注释区域图
局部动作:【0.3】跳转【上述提到的-对比分析】,该界面独立,带有【日期】筛选
c.展示图
精度保持率 + 合格率
增加产品合格率
6.3 设备异常平台
01.快速开始
a.后端
a.模块
deviceCloud-accident 需要依赖 device-cloud-remote
deviceCloud-api
deviceCloud-auth
deviceCloud-common
deviceCloud-gateway nacos简单配置
deviceCloud-remote
b.服务,启动无先后顺序
DeviceCloudAccidentApplication:3000/ 业务模块:设备故障信息管理平台
DeviceCloudAuthApplication:7001/ 鉴权
DeviceCloudGatewayApplication :9999/ 网关
DeviceCloudRemoteApplication:7002/ 调my-erp
c.docker-compose启动
device-cloud-gateway 1000:1000
device-cloud-auth 2000:2000
device-cloud-accident 3000:3000 如若报400,先启动device-cloud-remote、device-cloud-accident;请更换启动顺序
device-cloud-remote 10000:10000
b.前端
a.访问
网址:http://localhost:5173/index/home/
网址:http://localhost:5173/index/trouble/
访问:Ejia -> 安全隐患排查登记
会话存储:Key(token)、Value(123456)
c.中间件
a.nacos
网址:http://172.17.8.25:8848/nacos
用户:jgapp
密码:#EDC4rfv
b.elasticsearch-head
网址:http://172.17.8.25:9200/
用户:jgapp
密码:#EDC4rfv
c.Kibana
网址:http://172.17.8.25:5601/
用户:jgapp
密码:#EDC4rfv
-------------------------------------------------------------------------------------------------
# 未来做ELK日志,20250221,暂时只放入索引名为【user_login】登录日志
GET user_login/_search
{
"query": {
"match_all": {}
}
}
02.设计结构,旧
a.结构
ydsz-module-accident
ydsz-module-api
ydsz-module-common
ydsz-module-remote
ydsz-module-gateway
ydsz-module-nacos
b.后端设计
a.目前TODO
com.jg.common.auth.config.webConfig.WebConfig
com.jg.devicecloudaccident.interceptor.EHomeAuthInterceptor
b.鉴权:com.jg.devicecloudaccident.interceptor.EHomeAuthInterceptor
@Override
public Boolean doAuth(HttpServletRequest request, HttpServletResponse response, Object handler) {
return true;
}
c.限流:com.jg.cloud.common.util.RateLimitUtils
存在问题
d.远程:Feign
com.jg.devicecloudaccident.service.impl.AnnualAnomalyServiceImpl:调用
↓
com.jg.api.remote.feign.getHiddenDangerRecords:统一远程接口
↓
com.jg.cloud.remote.feign.AnnualAnomalyFeignService:实现类
c.前端设计
a.环境
.env.dev
.env.pro
b.鉴权
http://127.0.0.1:9999/api/accident/login/getToken -> 9999网关 -> 3000(取redis做鉴权)
c.访问
网址:http://localhost:5173/index/home/
网址:http://localhost:5173/index/trouble/
访问:Ejia -> 安全隐患排查登记
会话存储:Key(token)、Value(123456)
d.服务部署
a.服务器
网址:172.17.8.25
用户:root
密码:9MZ@#b3@KAez
b.docker部署
elasticsearch:8.13.4
kibana:8.11.1
mysql:5.7
redis
nacos
nginx
-------------------------------------------------------------------------------------------------
auth
remote
accident
gateway
-------------------------------------------------------------------------------------------------
挂载目录
/home/es
/home/java:bin、device-app、device-cloud、jar、logs、my-erp(废弃)
/home/kibana
/home/logs
/home/mysql
/home/Inginx
/home/redis
c.相关脚本
/home/java/bin:app_start.sh 启动前端
/home/java/bin:cloud_start.sh 废弃
/home/java/bin:down.sh 废弃
/home/java/bin:reload_device.sh 重启后端
03.设计结构,新
a.结构
ydsz-module-accident/
├── pom.xml
├── src/main/java/cn/jggroup/accident/
├── api/ # 原 remote-api 模块的接口定义
│ ├── dto/ # DTO 对象
│ └── feign/ # Feign 接口定义
├── common/ # 原 common 模块
│ ├── cache/ # 缓存相关
│ └── core/ # 核心工具类
├── remote/ # 原 remote 模块的实现
│ └── service/ # 具体服务实现
├── controller/ # 对外 REST 接口
├── service/ # 业务服务
└── AccidentApplication.java # 启动类
b.核心代码调整
a.启动类
@SpringBootApplication
@EnableFeignClients(basePackages = "cn.jggroup.accident.api.feign")
@EnableDiscoveryClient
public class AccidentApplication {
public static void main(String[] args) {
SpringApplication.run(AccidentApplication.class, args);
}
}
b.Feign接口定义
package cn.jggroup.accident.api.feign;
@FeignClient(name = "ydsz-accident-service", path = "/feign/accident")
public interface AccidentFeignClient {
@GetMapping("/getAccidentInfo")
ServerResponseEntity<AccidentInfoVO> getAccidentInfo(@RequestBody SearchVo searchVo);
// 其他接口定义...
}
c.接口实现
package cn.jggroup.accident.remote.service;
@RestController
@RequestMapping("/feign/accident")
public class AccidentFeignService {
@Autowired
private AccidentService accidentService;
@GetMapping("/getAccidentInfo")
public ServerResponseEntity<AccidentInfoVO> getAccidentInfo(@RequestBody SearchVo searchVo) {
return accidentService.getAccidentInfo(searchVo);
}
}
d.配置文件
spring:
application:
name: ydsz-accident-service
cloud:
nacos:
discovery:
server-addr: ${NACOS_SERVER:localhost:8848}
redis:
host: ${REDIS_HOST:localhost}
port: ${REDIS_PORT:6379}
server:
port: ${SERVER_PORT:8080}
c.使用方式
a.作为独立服务运行
java -jar ydsz-module-accident.jar
b.作为依赖引入其他项目
<dependency>
<groupId>cn.jggroup</groupId>
<artifactId>ydsz-module-accident</artifactId>
<version>1.0.0</version>
</dependency>
c.在其他服务中调用
@Autowired
private AccidentFeignClient accidentFeignClient;
public void someMethod() {
SearchVo searchVo = new SearchVo();
ServerResponseEntity<AccidentInfoVO> response =
accidentFeignClient.getAccidentInfo(searchVo);
}
04.项目结项:20250601
a.汇总
a.my-erp项目
a.设备系统接口存放路径
backend/jeecg-module-erp/src/main/java/cn/jggroup/erp/mo/
b.规范
为了区分给哪个系统提供接口,mo表示设备
新项目在mo/目录下额外新建一层结构如mo/isp-web
新项目在mo/isp-web/目录下编写
b.ERP数据库
a.DB.TBMHFA
所属系统:设备履历绩效管理系统
表注释:事故(故障)记录
对应类名:mhjcFADAO
b.DB.TBMHS1
所属系统:设备履历绩效管理系统
表注释:产线停机纪录
对应类名:mhjcS1DAO
c.DB.TBMHFE
所属系统:设备履历绩效管理系统
表注释:技术通报整改措施
对应类名:mhjcFEDAO
d.DB.TBME02
所属系统:设备资产资料管理系统
表注释:设备
对应类名:mejc02DAO
e.DB.TBMEI1
所属系统:设备资产资料管理系统
表注释:工艺产线/厂处
对应类名:mejcI1DAO
f.DB.TBMZRD
所属系统:设备公用系统管理系统
表注释:简易表格内容资料
对应类名:mzjcRDDAO
g.说明
"此表主要用于将SQL查询到的 英文字母/数字 编号关联,转化为文字描述
例子:查询结果:breakDownGrade: E
关联DB.TBMZRD表后:breakDownGrade: E, breakDownGradeName:轻微"
c.财务专用
所属库名:device_cloud
表名:erp_mo_indicator(MySQL)
表注释:设备停机指标存储表
b.常见设备故障模式
a.筛选条件
a.默认
无筛选即默认展示全公司数据
b.类型
厂处 plNo = 厂(处) + 产线 W101(W1是厂,01是产线)冷轧厂-镀锌一线
产线 plNo = 厂(处) + 产线
设备故障模式 bkReason/stopReason
月份(开放式) informDate,停机起始日期
c.统计
厂(处)
日期
设备故障模式
b.查询语句
a.SQL
select stopReason,bkReason,sum(totalBreakTime),count(*)
from DB.TBmhFA
where compID = 'sxjg' and bkReason != ' '
group by stopReason,bkReason
order by sum(totalBreakTime) desc
b.bkReason不良原因编号对应名称
SELECT itemB as bkReason, DataA as bkReasonName FROM DB.TBmzRD
WHERE compID = 'sxjg' and nodeNo = '40310411' and status = 'Y'
c.stopReason不良主原因编号对应名称
SELECT itemA as stopReason, DataA as stopReasonName FROM DB.TBmzRD
WHERE compID = 'sxjg' and nodeNo = '40310410' and status = 'Y'
c.具备分析功能
a.按“产线”“日期”分析得出(参考)
炼铁厂2#高炉2024年6月机械磨损(25%)、异常表振动(45%)占比总和超80%,油脂劣化(5%)近三个月呈上升趋势
d.页面绘制
a.方案1
这是一个设备故障模式分析系统,主要功能包括:
数据筛选:用户可以通过设备号、故障模式和月份进行数据筛选
树形结构展示:左侧展示层级结构数据,可能用于分类或组织设备信息
图表可视化:右侧展示图表,用于直观展示故障模式分布情况
b.方案2
单输入框,树形列表
单输入框,弹框
双输入框,联动
树形列表
c.方案3
js版本
ts版本
html版本
resource版本
c.目标监控
a.年度指标监控
a.筛选条件
a.筛选
厂处
日期(开放式,年,月)
无筛选即默认展示全公司数据
b.SQL
select SUBSTR(plNo, 1, 2), SUBSTR(INFORMDATE, 5, 2), sum(totalbreakTime),count(*)
from DB.TBmhFA
where compID = 'sxjg' and INFORMDATE like '2024%'
group by SUBSTR(plNo, 1, 2), SUBSTR(INFORMDATE, 5, 2)
order by SUBSTR(plNo, 1, 2), SUBSTR(INFORMDATE, 5, 2)
c.plNo产线编号对应名称
SELECT PLNO, PLNAME FROM DB.TBMEI1 WHERE COMPID = 'sxjg' and status = 'A'
d.MYSQL数据库
Select id, comp_id, pl_no, total_indicators
from erp_mo_indicator
where comp_id = 'sxjg' and pl_no = 'W1' and indicator_date like '2024%' and status >= 0
b.依据筛选条件进行数据分析,例,筛选“厂处”分析得出(参考)
2025年烧结厂目前设备总停机时间为300分钟,同比2024年增加/减少20%;
停机时长是/否增长趋势;停机的主要类型:仪电故障(200min),工艺故障(100min)。
b.月度指标监控
a.筛选条件
厂(处)
日期(开放式:年 月 日)
无筛选即默认展示全公司数据
b.数据显示要求
临近指标70%,停机时长变橘黄;超指标变红色(柱状图)
c.SQL
select SUBSTR(plNo, 1, 2), SUBSTR(INFORMDATE, 5, 2), sum(totalbreakTime),count(*)
from DB.TBmhFA
where compID = 'sxjg' and INFORMDATE like '202403%' and plno like ‘%’
group by SUBSTR(plNo, 1, 2), SUBSTR(INFORMDATE, 5, 2)
order by SUBSTR(plNo, 1, 2), SUBSTR(INFORMDATE, 5, 2)
d.plNo产线编号对应名称
SELECT PLNO, PLNAME FROM DB.TBMEI1 WHERE COMPID = 'sxjg' and status = 'A'
d.各类停机类型占比
a.筛选条件
a.默认
无筛选即默认展示全公司数据
b.类型
厂(处)
类型
日期
点击数字,即可跳转至“事故闭环管理-目录”。(注:跳转暂时忽略)
c.SQL
select reasonNo,sum(totalTime),count(*)
from DB.TBmhS1
where compID = 'sxjg' and reasonNo != ' '
group by reasonNo
order by sum(totalTime) desc
d.reasonNo停机类型编号对应名称
SELECT itemA as reasonNo, DataA as reasonName FROM DB.TBmzRD
WHERE compID = 'sxjg' and nodeNo = '40310417' and status = 'Y'
b.分析结果(参考)
选择“厂处”,可以分析出该厂本年度共计**种停机类型
次数占比前三的类型分别是:工艺故障(7次)...;停机时长前三的分别是:操作延误(200min)...
e.事故闭环管理
a.目录界面
a.筛选条件
厂(处)
产线
设备名称
事故名称
停机类型
日期
b.点击事故名称
可以跳转至对应事故信息明细
c.SQL
select T1.plno, T1.equipmentNo, T2.equipmentName, T1.breakDownNo, T1.breakDownName, T1.relegation, T1.informDate
from DB.TBmhfa T1
left join DB.TBME02 T2 ON T1.equipmentNo = T2.equipmentNo
where T1.compID = 'sxjg' and T2.compID = 'sxjg' ;
d.bkReason不良原因对应名称
SELECT itemB as bkReason, DataA as bkReasonName FROM DB.TBmzRD
WHERE compID = 'sxjg' and nodeNo = '40310411' and status = 'Y'
e.plNo产线编号对应名称
SELECT PLNO, PLNAME FROM DB.TBMEI1 WHERE COMPID = 'sxjg' and status = 'A'
b.事故明细
a.SQL
select T1.breakDownNo, T1.informDate, T1.informTime, T1.arriveDate, T1.arriveTime,
T1.totalBreakTime, T1.breakDownGrade, T1.plNo, T1.bkPart,T1.bkReason,
T1.breakDownName, T1.relegation, T1.textArea2, T1.textArea3, T1.textArea4,
T2.measureName, T2.reportMemo
from DB.TBmhfa T1
left join DB.TBMHFE T2 on T1.breakDownNo = T2.breakDownNo
where T1.compID = 'sxjg' and T2.compID = 'sxjg' and T1.breakDownNo = 'Y201061303-001';
b.relegation事故归属类型对应名称
SELECT ITEMA as relegation, DataA as relegationName FROM DB.TBmzRD
WHERE compID = 'sxjg' and nodeNo = '40310421' and status = 'Y';
c.breakDownGrade事故重要度等级对应名称
SELECT ITEMA as breakDownGrade, DataA as breakDownGradeName FROM DB.TBmzRD
WHERE compID = 'sxjg' and nodeNo = '40310401' and status = 'Y'
d.bkReason不良原因对应名称
SELECT itemB as bkReason, DataA as bkReasonName FROM DB.TBmzRD
WHERE compID = 'sxjg' and nodeNo = '40310411' and status = 'Y'
e.plNo产线编号对应名称
SELECT PLNO, PLNAME FROM DB.TBMEI1 WHERE COMPID = 'sxjg' and status = 'A'
f.设备故障停机
a.筛选条件
a.默认
无筛选即默认展示全公司数据
b.类型
厂处
产线
日期
c.SQL
select SUBSTR(plNo, 1, 2) ,sum(totalTime),count(*)
from DB.TBmhS1
where compID = 'sxjg' and startDate like '2024%'
group by SUBSTR(plNo, 1, 2)
order by SUBSTR(plNo, 1, 2)
d.plNo产线编号对应名称
SELECT PLNO, PLNAME FROM DB.TBMEI1 WHERE COMPID = 'sxjg' and status = 'A'
b.分析结果(参考)
a.无选项默认分析
2025年镀锌1#(2468min)、彩涂线(2615min)停机时长总和≥公司总停机时长的80%;镀锌3#、900带钢停机时长同比前三个月呈上涨趋势;
2025年900带钢(64次)、镀锌2#(44次)、彩涂(36次)停机总次数≥公司总停机次数的80%;镀锌2#停机次数同比前三个月呈上涨趋势。
b.备注
以上数据分析划线部分为变量数据,会随着筛选条件、时间的推移而更新