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.备注
                以上数据分析划线部分为变量数据,会随着筛选条件、时间的推移而更新