diff --git a/docs/init-v2.sql b/docs/init-v2.sql index 1818570..7a4168a 100644 --- a/docs/init-v2.sql +++ b/docs/init-v2.sql @@ -12,7 +12,7 @@ USE `jjb_saas_safety_eval`; -- 作用: 机构基本信息及认证状态(填写信息/审核中/通过) -- ------------------------------------------------------------ create table org_info ( - id bigint not null auto_increment comment '主键', + id bigint not null comment '主键', unit_name varchar(200) not null comment '生产经营单位名称', credit_code varchar(18) not null comment '统一社会信用代码', safety_industry_category_code varchar(32) default null comment '安全生产监管行业类别编码', @@ -70,7 +70,7 @@ create table org_info ( -- 关联: org_id -> org_info.id -- ------------------------------------------------------------ create table org_qualification ( - id bigint not null auto_increment comment '主键', + id bigint not null comment '主键', org_id bigint not null comment '机构id', license_type_code varchar(32) default null comment '证照类型编码', license_type_name varchar(50) default null comment '证照类型名称', @@ -104,11 +104,12 @@ create table org_qualification ( -- 关联: org_id -> org_info.id; parent_id 自关联 -- ------------------------------------------------------------ create table org_department ( - id bigint not null auto_increment comment '主键', + id bigint not null comment '主键', org_id bigint not null comment '机构id', parent_id bigint default 0 comment '上级部门id,0为根', dept_name varchar(100) not null comment '部门名称', - manager_name varchar(50) default null comment '负责人', + manager_name varchar(50) default null comment '负责人姓名', + manager_account varchar(50) default null comment '负责人账号', dept_level_code varchar(32) default null comment '部门级别编码', dept_level_name varchar(50) default null comment '部门级别名称', delete_enum varchar(32) default null comment '删除标识true false', @@ -133,7 +134,7 @@ create table org_department ( -- 关联: org_id -> org_info.id; dept_id -> org_department.id -- ------------------------------------------------------------ create table org_position ( - id bigint not null auto_increment comment '主键', + id bigint not null comment '主键', org_id bigint not null comment '机构id', dept_id bigint not null comment '部门id', position_name varchar(100) not null comment '岗位名称', @@ -160,7 +161,7 @@ create table org_position ( -- 关联: org_id -> org_info.id; dept_id -> org_department.id; post_id -> org_position.id -- ------------------------------------------------------------ create table org_personnel ( - id bigint not null auto_increment comment '主键', + id bigint not null comment '主键', org_id bigint not null comment '机构id', dept_id bigint default null comment '部门id', post_id bigint default null comment '岗位id', @@ -193,7 +194,8 @@ create table org_personnel ( key idx_org_personnel_org_id (org_id), key idx_org_personnel_dept_id (dept_id), key idx_org_personnel_post_id (post_id), - key idx_org_personnel_account (account) + key idx_org_personnel_account (account), + unique key uk_org_personnel_org_account (org_id, account) ) engine=innodb default charset=utf8mb4 collate=utf8mb4_0900_ai_ci comment='人员信息表'; -- ------------------------------------------------------------ @@ -202,7 +204,7 @@ create table org_personnel ( -- 关联: personnel_id -> org_personnel.id -- ------------------------------------------------------------ create table org_personnel_cert ( - id bigint not null auto_increment comment '主键', + id bigint not null comment '主键', org_id bigint not null comment '机构id', personnel_id bigint not null comment '人员id', cert_name varchar(200) default null comment '证照名称', @@ -240,7 +242,7 @@ create table org_personnel_cert ( -- 关联: personnel_id -> org_personnel.id -- ------------------------------------------------------------ create table org_personnel_change ( - id bigint not null auto_increment comment '主键', + id bigint not null comment '主键', org_id bigint not null comment '机构id', personnel_id bigint not null comment '人员id', change_item varchar(200) not null comment '变更事项', @@ -268,7 +270,7 @@ create table org_personnel_change ( -- 关联: personnel_id -> org_personnel.id -- ------------------------------------------------------------ create table org_resign_apply ( - id bigint not null auto_increment comment '主键', + id bigint not null comment '主键', org_id bigint not null comment '机构id', personnel_id bigint not null comment '人员id', applicant_name varchar(50) not null comment '申请人', @@ -302,7 +304,7 @@ create table org_resign_apply ( -- 关联: org_id -> org_info.id -- ------------------------------------------------------------ create table org_equipment ( - id bigint not null auto_increment comment '主键', + id bigint not null comment '主键', org_id bigint not null comment '机构id', device_name varchar(200) not null comment '设备名称', device_model varchar(100) default null comment '设备型号', @@ -342,7 +344,7 @@ create table org_equipment ( -- 关联: org_id -> org_info.id -- ------------------------------------------------------------ create table qual_filing ( - id bigint not null auto_increment comment '主键', + id bigint not null comment '主键', org_id bigint not null comment '机构id', filing_territory_code varchar(32) default null comment '备案属地编码', filing_territory_name varchar(100) default null comment '备案属地名称', @@ -392,7 +394,7 @@ create table qual_filing ( -- 关联: filing_id -> qual_filing.id -- ------------------------------------------------------------ create table qual_filing_material ( - id bigint not null auto_increment comment '主键', + id bigint not null comment '主键', filing_id bigint not null comment '备案申请id', material_content varchar(500) not null comment '材料内容', material_format varchar(20) default null comment '材料格式', @@ -420,7 +422,7 @@ create table qual_filing_material ( -- 关联: filing_id -> qual_filing.id (1:1) -- ------------------------------------------------------------ create table qual_filing_commitment ( - id bigint not null auto_increment comment '主键', + id bigint not null comment '主键', filing_id bigint not null comment '备案申请id', commitment_content text default null comment '承诺内容', legal_rep_signature_url varchar(500) default null comment '法定代表人签名图片地址', @@ -447,7 +449,7 @@ create table qual_filing_commitment ( -- 关联: filing_id -> qual_filing.id; source_personnel_id -> org_personnel.id -- ------------------------------------------------------------ create table qual_filing_personnel ( - id bigint not null auto_increment comment '主键', + id bigint not null comment '主键', filing_id bigint not null comment '备案申请id', source_personnel_id bigint default null comment '来源人员id', person_name varchar(50) not null comment '人员姓名', @@ -495,7 +497,7 @@ create table qual_filing_personnel ( -- 关联: filing_personnel_id -> qual_filing_personnel.id -- ------------------------------------------------------------ create table qual_filing_personnel_cert ( - id bigint not null auto_increment comment '主键', + id bigint not null comment '主键', filing_id bigint not null comment '备案申请id', filing_personnel_id bigint not null comment '备案人员id', cert_name varchar(200) default null comment '证照名称', @@ -534,7 +536,7 @@ create table qual_filing_personnel_cert ( -- 关联: filing_id -> qual_filing.id; source_equipment_id -> org_equipment.id -- ------------------------------------------------------------ create table qual_filing_equipment ( - id bigint not null auto_increment comment '主键', + id bigint not null comment '主键', filing_id bigint not null comment '备案申请id', source_equipment_id bigint default null comment '来源装备id', device_name varchar(200) not null comment '设备名称', @@ -575,7 +577,7 @@ create table qual_filing_equipment ( -- 关联: origin_filing_id -> qual_filing.id; org_id -> org_info.id -- ------------------------------------------------------------ create table qual_filing_change ( - id bigint not null auto_increment comment '主键', + id bigint not null comment '主键', org_id bigint not null comment '机构id', origin_filing_id bigint not null comment '原备案申请id', change_count int default 0 comment '变更次数', @@ -624,7 +626,7 @@ create table qual_filing_change ( -- 关联: change_id -> qual_filing_change.id -- ------------------------------------------------------------ create table qual_filing_change_detail ( - id bigint not null auto_increment comment '主键', + id bigint not null comment '主键', change_id bigint not null comment '备案变更id', change_field varchar(100) not null comment '变更字段', change_content varchar(1000) not null comment '变更内容', @@ -643,3 +645,168 @@ create table qual_filing_change_detail ( primary key (id), key idx_qual_filing_change_detail_change_id (change_id) ) engine=innodb default charset=utf8mb4 collate=utf8mb4_0900_ai_ci comment='备案变更明细表'; + +-- ============================================================ +-- 企业信息管理模块 - 联调测试数据(手动执行) +-- 执行前会清理本机构 org_id=1 下的旧联调数据,避免脏数据干扰 +-- ============================================================ + +SET @tenant_id = 1001; +SET @org_id = 1; +SET @now = NOW(); + +DELETE FROM org_personnel_change WHERE org_id = @org_id; +DELETE FROM org_personnel_cert WHERE org_id = @org_id; +DELETE FROM org_resign_apply WHERE org_id = @org_id; +DELETE FROM org_personnel WHERE org_id = @org_id; +DELETE FROM org_equipment WHERE org_id = @org_id; +DELETE FROM org_qualification WHERE org_id = @org_id; +DELETE FROM org_position WHERE org_id = @org_id; +DELETE FROM org_department WHERE org_id = @org_id; +DELETE FROM org_info WHERE id = @org_id; + +-- ── 1. 机构信息 ── +INSERT INTO org_info ( + id, unit_name, credit_code, safety_industry_category_name, district_name, town_street, + village_community, longitude, latitude, register_address, business_address, + ownership_type_name, legal_representative, legal_representative_phone, + principal_name, principal_phone, safety_dept_manager, safety_dept_manager_phone, + safety_deputy_phone, production_date, business_status_name, info_disclosure_url, + workplace_area, archive_room_area, fulltime_evaluator_count, registered_engineer_count, + economy_industry_code, auth_status_code, auth_status_name, + delete_enum, tenant_id, org_id, create_time, update_time +) VALUES ( + @org_id, '秦皇岛示例安全评价有限公司', '91130300MA0XXXXXX1', '安全评价', '海港区', '白塔岭街道', + '文府里社区', 119.586000, 39.942000, + '河北省秦皇岛市海港区示例路88号', '河北省秦皇岛市海港区示例路88号', + '民营企业', '张三', '0335-88880001', '李四', '13800138001', '王五', '13800138002', + '13800138003', '2018-06-01', '正常经营', 'https://example.com/disclosure', + 1200.00, 80.00, 12, 5, 'M7491', 3, '通过', + 'false', @tenant_id, @org_id, @now, @now +); + +-- ── 2. 部门(含负责人账号,便于下拉回显) ── +INSERT INTO org_department (id, org_id, parent_id, dept_name, manager_name, manager_account, dept_level_name, delete_enum, tenant_id, create_time, update_time) VALUES +(101, @org_id, 0, '综合管理部', '冯行政', '13800138014', '一级', 'false', @tenant_id, @now, @now), +(102, @org_id, 0, '评价一部', '陈评价', '13800138010', '一级', 'false', @tenant_id, @now, @now), +(103, @org_id, 0, '评价二部', '郑专项', '13800138013', '一级', 'false', @tenant_id, @now, @now), +(104, @org_id, 0, '技术质量部', '吴质量', '13800138012', '一级', 'false', @tenant_id, @now, @now), +(105, @org_id, 0, '市场开发部', '褚采样', '13800138015', '一级', 'false', @tenant_id, @now, @now), +(106, @org_id, 101, '行政组', '冯行政', '13800138014', '二级', 'false', @tenant_id, @now, @now), +(107, @org_id, 101, '人事组', '冯行政', '13800138014', '二级', 'false', @tenant_id, @now, @now), +(108, @org_id, 102, '现场评价一组', '林项目', '13800138011', '二级', 'false', @tenant_id, @now, @now), +(109, @org_id, 102, '现场评价二组', '陈评价', '13800138010', '二级', 'false', @tenant_id, @now, @now), +(110, @org_id, 102, '报告编制组', '林项目', '13800138011', '二级', 'false', @tenant_id, @now, @now), +(111, @org_id, 103, '专项评价组', '郑专项', '13800138013', '二级', 'false', @tenant_id, @now, @now), +(112, @org_id, 103, '综合评价组', '郑专项', '13800138013', '二级', 'false', @tenant_id, @now, @now), +(113, @org_id, 104, '质检组', '吴质量', '13800138012', '二级', 'false', @tenant_id, @now, @now), +(114, @org_id, 104, '档案管理组', '吴质量', '13800138012', '二级', 'false', @tenant_id, @now, @now), +(115, @org_id, 104, '设备管理组', '吴质量', '13800138012', '二级', 'false', @tenant_id, @now, @now); + +-- ── 3. 岗位(24条) ── +INSERT INTO org_position (id, org_id, dept_id, position_name, duty_desc, delete_enum, tenant_id, create_time, update_time) VALUES +(201, @org_id, 101, '部门经理', '负责综合管理部全面工作', 'false', @tenant_id, @now, @now), +(202, @org_id, 106, '行政专员', '负责日常行政事务', 'false', @tenant_id, @now, @now), +(203, @org_id, 107, '人事专员', '负责招聘与员工关系', 'false', @tenant_id, @now, @now), +(204, @org_id, 102, '部门经理', '负责评价一部项目管理', 'false', @tenant_id, @now, @now), +(205, @org_id, 108, '评价师', '负责现场安全评价', 'false', @tenant_id, @now, @now), +(206, @org_id, 108, '项目负责人', '负责评价项目统筹', 'false', @tenant_id, @now, @now), +(207, @org_id, 109, '评价师', '负责现场安全评价', 'false', @tenant_id, @now, @now), +(208, @org_id, 109, '助理评价师', '协助现场评价工作', 'false', @tenant_id, @now, @now), +(209, @org_id, 110, '报告编制员', '负责评价报告编制', 'false', @tenant_id, @now, @now), +(210, @org_id, 110, '报告审核员', '负责报告质量审核', 'false', @tenant_id, @now, @now), +(211, @org_id, 103, '部门经理', '负责评价二部全面工作', 'false', @tenant_id, @now, @now), +(212, @org_id, 111, '专项评价师', '负责专项安全评价', 'false', @tenant_id, @now, @now), +(213, @org_id, 112, '综合评价师', '负责综合安全评价', 'false', @tenant_id, @now, @now), +(214, @org_id, 104, '质量管理员', '负责质量体系运行', 'false', @tenant_id, @now, @now), +(215, @org_id, 113, '质检工程师', '负责报告与过程质检', 'false', @tenant_id, @now, @now), +(216, @org_id, 114, '档案管理员', '负责档案归档与保管', 'false', @tenant_id, @now, @now), +(217, @org_id, 115, '设备管理员', '负责仪器设备管理', 'false', @tenant_id, @now, @now), +(218, @org_id, 105, '市场经理', '负责市场开拓', 'false', @tenant_id, @now, @now), +(219, @org_id, 105, '客户经理', '负责客户关系维护', 'false', @tenant_id, @now, @now), +(220, @org_id, 102, '技术负责人', '负责评价技术把关', 'false', @tenant_id, @now, @now), +(221, @org_id, 103, '技术负责人', '负责评价技术把关', 'false', @tenant_id, @now, @now), +(222, @org_id, 108, '采样员', '负责现场样品采集', 'false', @tenant_id, @now, @now), +(223, @org_id, 109, '采样员', '负责现场样品采集', 'false', @tenant_id, @now, @now), +(224, @org_id, 110, '资料员', '负责项目资料整理', 'false', @tenant_id, @now, @now); + +-- ── 4. 机构资质证书 ── +INSERT INTO org_qualification ( + id, org_id, license_type_name, cert_name, cert_no, issue_date, issue_org, + valid_start_date, valid_end_date, enable_flag, delete_enum, tenant_id, create_time, update_time +) VALUES +(301, @org_id, '安全评价机构资质证书', '安全评价机构资质证书(甲级)', 'AQPJ-2024-001', '2024-01-15', '河北省应急管理厅', '2024-01-15', '2027-01-14', 1, 'false', @tenant_id, @now, @now), +(302, @org_id, '营业执照', '营业执照', '91130300MA0XXXXXX1', '2018-06-01', '秦皇岛市行政审批局', '2018-06-01', '2099-12-31', 1, 'false', @tenant_id, @now, @now); + +-- ── 5. 人员信息 ── +INSERT INTO org_personnel ( + id, org_id, dept_id, post_id, user_name, account, gender_code, gender_name, + birth_date, id_card_no, current_address, office_address, education_name, + graduate_school, major, employment_status_code, employment_status_name, + delete_enum, tenant_id, create_time, update_time +) VALUES +(401, @org_id, 102, 205, '陈评价', '13800138010', 1, '男', '1985-03-15', '130302198503151234', '秦皇岛市海港区', '秦皇岛市海港区示例路88号', '本科', '华北理工大学', '安全工程', 1, '在职', 'false', @tenant_id, @now, @now), +(402, @org_id, 102, 206, '林项目', '13800138011', 1, '男', '1988-07-22', '130302198807221234', '秦皇岛市海港区', '秦皇岛市海港区示例路88号', '硕士', '中国矿业大学', '安全科学与工程', 1, '在职', 'false', @tenant_id, @now, @now), +(403, @org_id, 104, 215, '吴质量', '13800138012', 2, '女', '1990-11-08', '130302199011081234', '秦皇岛市海港区', '秦皇岛市海港区示例路88号', '本科', '河北工程大学', '安全工程', 1, '在职', 'false', @tenant_id, @now, @now), +(404, @org_id, 103, 212, '郑专项', '13800138013', 1, '男', '1987-01-30', '130302198701301234', '秦皇岛市开发区', '秦皇岛市海港区示例路88号', '本科', '东北大学', '安全工程', 1, '在职', 'false', @tenant_id, @now, @now), +(405, @org_id, 101, 202, '冯行政', '13800138014', 2, '女', '1992-05-18', '130302199205181234', '秦皇岛市海港区', '秦皇岛市海港区示例路88号', '大专', '秦皇岛职业技术学院', '行政管理', 1, '在职', 'false', @tenant_id, @now, @now), +(406, @org_id, 108, 222, '褚采样', '13800138015', 1, '男', '1995-09-03', '130302199509031234', '秦皇岛市北戴河区', '秦皇岛市海港区示例路88号', '本科', '河北科技大学', '应用化学', 1, '在职', 'false', @tenant_id, @now, @now), +(407, @org_id, 101, 201, '钱离职', '13800138016', 1, '男', '1980-01-01', '130302198001011234', '秦皇岛市海港区', '秦皇岛市海港区示例路88号', '本科', '燕山大学', '安全工程', 2, '离职', 'false', @tenant_id, @now, @now), +(408, @org_id, 102, 205, '孙离职', '13800138017', 2, '女', '1986-06-12', '130302198606121234', '秦皇岛市海港区', '秦皇岛市海港区示例路88号', '本科', '河北工业大学', '安全工程', 2, '离职', 'false', @tenant_id, @now, @now), +(409, @org_id, 103, 212, '周离职', '13800138018', 1, '男', '1984-09-20', '130302198409201234', '秦皇岛市开发区', '秦皇岛市海港区示例路88号', '硕士', '天津大学', '安全科学与工程', 2, '离职', 'false', @tenant_id, @now, @now); + +-- ── 6. 人员证书 ── +INSERT INTO org_personnel_cert ( + id, org_id, personnel_id, cert_name, cert_category_name, operation_category_name, + cert_no, issue_org, valid_start_date, valid_end_date, delete_enum, tenant_id, create_time, update_time +) VALUES +(501, @org_id, 401, '注册安全工程师证', '注册安全工程师', '金属非金属矿山', 'ZCAQ-2019-001', '应急管理部', '2019-06-01', '2025-06-01', 'false', @tenant_id, @now, @now), +(502, @org_id, 402, '安全评价师证(一级)', '安全评价师', '安全评价', 'AQPJS-2020-002', '中国安全生产协会', '2020-03-01', '2026-03-01', 'false', @tenant_id, @now, @now); + +-- ── 7. 人员变更记录(原型:3/2/6 条变更) ── +INSERT INTO org_personnel_change (id, org_id, personnel_id, change_item, change_time, operator_name, delete_enum, tenant_id, create_time, update_time) VALUES +(601, @org_id, 407, '修改联系电话', DATE_SUB(@now, INTERVAL 30 DAY), '管理员', 'false', @tenant_id, @now, @now), +(602, @org_id, 407, '调整所属岗位', DATE_SUB(@now, INTERVAL 20 DAY), '管理员', 'false', @tenant_id, @now, @now), +(603, @org_id, 407, '更新学历信息', DATE_SUB(@now, INTERVAL 10 DAY), '管理员', 'false', @tenant_id, @now, @now), +(604, @org_id, 408, '修改办公地址', DATE_SUB(@now, INTERVAL 25 DAY), '管理员', 'false', @tenant_id, @now, @now), +(605, @org_id, 408, '调整部门', DATE_SUB(@now, INTERVAL 12 DAY), '管理员', 'false', @tenant_id, @now, @now), +(606, @org_id, 409, '修改姓名', DATE_SUB(@now, INTERVAL 40 DAY), '管理员', 'false', @tenant_id, @now, @now), +(607, @org_id, 409, '修改账号', DATE_SUB(@now, INTERVAL 35 DAY), '管理员', 'false', @tenant_id, @now, @now), +(608, @org_id, 409, '修改性别', DATE_SUB(@now, INTERVAL 30 DAY), '管理员', 'false', @tenant_id, @now, @now), +(609, @org_id, 409, '修改出生日期', DATE_SUB(@now, INTERVAL 25 DAY), '管理员', 'false', @tenant_id, @now, @now), +(610, @org_id, 409, '修改身份证号', DATE_SUB(@now, INTERVAL 20 DAY), '管理员', 'false', @tenant_id, @now, @now), +(611, @org_id, 409, '修改现住地址', DATE_SUB(@now, INTERVAL 15 DAY), '管理员', 'false', @tenant_id, @now, @now), +(612, @org_id, 401, '修改联系电话', DATE_SUB(@now, INTERVAL 7 DAY), '管理员', 'false', @tenant_id, @now, @now), +(613, @org_id, 403, '修改办公地址', DATE_SUB(@now, INTERVAL 5 DAY), '管理员', 'false', @tenant_id, @now, @now); + +-- ── 8. 离职申请(原型:未审核/已审核/未审核) ── +INSERT INTO org_resign_apply ( + id, org_id, personnel_id, applicant_name, apply_time, resign_reason, + expected_resign_date, audit_status_code, audit_status_name, delete_enum, tenant_id, create_time, update_time +) VALUES +(701, @org_id, 407, '钱离职', DATE_SUB(@now, INTERVAL 5 DAY), '个人原因申请离职', DATE_ADD(CURDATE(), INTERVAL 30 DAY), 0, '未审核', 'false', @tenant_id, @now, @now), +(702, @org_id, 408, '孙离职', DATE_SUB(@now, INTERVAL 60 DAY), '家庭原因', DATE_SUB(CURDATE(), INTERVAL 30 DAY), 1, '已审核', 'false', @tenant_id, @now, @now), +(703, @org_id, 409, '周离职', DATE_SUB(@now, INTERVAL 3 DAY), '工作调动', DATE_ADD(CURDATE(), INTERVAL 15 DAY), 0, '未审核', 'false', @tenant_id, @now, @now), +(704, @org_id, 403, '吴质量', DATE_SUB(@now, INTERVAL 8 DAY), '个人发展', DATE_ADD(CURDATE(), INTERVAL 20 DAY), 0, '未审核', 'false', @tenant_id, @now, @now); + +-- ── 9. 装备信息 ── +INSERT INTO org_equipment ( + id, org_id, device_name, device_model, instrument_type_code, instrument_type_name, + device_type_code, device_type_name, + manufacturer, flow_desc, min_flow, max_flow, calibration_unit, calibration_init_value, + field_calibration_type_name, dual_channel_flag, enable_flag, delete_enum, tenant_id, create_time, update_time +) VALUES +(801, @org_id, '四合一气体检测仪', 'PGM-6208', '检测仪器', '检测仪器', '便携式', '便携式', '英国ION Science', '0-100%LEL', 0.0000, 100.0000, '市计量院', '0', '定期校验', 2, 1, 'false', @tenant_id, @now, @now), +(802, @org_id, '激光粉尘仪', 'LD-5K', '检测仪器', '检测仪器', '便携式', '便携式', '青岛众瑞', '0-10mg/m3', 0.0000, 10.0000, '市计量院', '0', '定期校验', 2, 1, 'false', @tenant_id, @now, @now), +(803, @org_id, '声级计', 'AWA5688', '检测仪器', '检测仪器', '便携式', '便携式', '杭州爱华', '30-130dB', 0.0000, 130.0000, '市计量院', '0', '定期校验', 2, 1, 'false', @tenant_id, @now, @now), +(804, @org_id, '万用表', 'Fluke87V', '电工仪器', '电工仪器', '手持式', '手持式', 'Fluke', '-', 0.0000, 0.0000, '市计量院', '0', '定期校验', 2, 1, 'false', @tenant_id, @now, @now), +(805, @org_id, '风速仪', 'Testo410-2','检测仪器','检测仪器', '便携式', '便携式', '德图Testo', '0.4-20m/s', 0.4000, 20.0000, '市计量院', '0', '定期校验', 2, 1, 'false', @tenant_id, @now, @now); + +-- ============================================================ +-- 增量升级脚本(已有库按需执行) +-- ============================================================ +-- ALTER TABLE org_department ADD COLUMN manager_account varchar(50) DEFAULT NULL COMMENT '负责人账号' AFTER manager_name; +-- ALTER TABLE org_personnel ADD UNIQUE KEY uk_org_personnel_org_account (org_id, account); +-- UPDATE org_equipment SET instrument_type_code = instrument_type_name, device_type_code = device_type_name WHERE instrument_type_code IS NULL OR device_type_code IS NULL; +-- UPDATE org_resign_apply SET audit_status_code = 0, audit_status_name = '未审核', reject_reason = NULL WHERE id = 701; + diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/LocalDevUserContextConfig.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/LocalDevUserContextConfig.java new file mode 100644 index 0000000..03c4fbe --- /dev/null +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/LocalDevUserContextConfig.java @@ -0,0 +1,61 @@ +package org.qinan.safetyeval.adapter.config; + +import org.qinan.safetyeval.infrastructure.adapter.ThreadLocalUserInfoAdapter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 本地联调:为免鉴权的企业信息接口注入默认用户上下文,供 MyMetaObjectHandler 填充 org_id / tenant_id。 + */ +@Configuration +@Profile("local") +public class LocalDevUserContextConfig implements WebMvcConfigurer { + + @Value("${safety-eval.public-api.system-user-id:1}") + private Long systemUserId; + + @Value("${safety-eval.public-api.system-user-name:local-dev}") + private String systemUserName; + + @Value("${safety-eval.public-api.tenant-id:1001}") + private Long tenantId; + + @Value("${safety-eval.public-api.org-id:1}") + private Long orgId; + + private static final String[] LOCAL_DEV_PATHS = { + "/org-info/**", + "/org-department/**", + "/org-position/**", + "/org-qualification/**", + "/org-personnel/**", + "/org-personnel-cert/**", + "/org-personnel-change/**", + "/org-resign-apply/**", + "/org-equipment/**", + }; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new HandlerInterceptor() { + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + ThreadLocalUserInfoAdapter.set(systemUserId, systemUserName, tenantId, orgId); + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, + Object handler, Exception exception) { + ThreadLocalUserInfoAdapter.clear(); + } + }).addPathPatterns(LOCAL_DEV_PATHS); + } +} diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/OrgDepartmentController.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/OrgDepartmentController.java index 41fe212..dd7d3fe 100644 --- a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/OrgDepartmentController.java +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/OrgDepartmentController.java @@ -9,6 +9,9 @@ import org.qinan.safetyeval.client.co.OrgDepartmentCO; import org.qinan.safetyeval.client.dto.OrgDepartmentAddCmd; import org.qinan.safetyeval.client.dto.OrgDepartmentModifyCmd; import org.qinan.safetyeval.client.dto.OrgDepartmentPageQuery; +import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserContextAdapter; +import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserInfo; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/OrgPersonnelController.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/OrgPersonnelController.java index c8a49ef..eeb72e5 100644 --- a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/OrgPersonnelController.java +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/OrgPersonnelController.java @@ -56,4 +56,10 @@ public class OrgPersonnelController { public PageResponse page(@Validated OrgPersonnelPageQuery query) { return orgPersonnelApi.page(query); } + + @ApiOperation("重置人员密码") + @PostMapping("/reset-password") + public SingleResponse resetPassword(@RequestParam Long id) { + return orgPersonnelApi.resetPassword(id); + } } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgDepartmentExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgDepartmentExecutor.java index df9ad6b..ca2bf2a 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgDepartmentExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgDepartmentExecutor.java @@ -33,6 +33,7 @@ public class OrgDepartmentExecutor implements OrgDepartmentApi { entity.setParentId(cmd.getParentId()); entity.setDeptName(cmd.getDeptName()); entity.setManagerName(cmd.getManagerName()); + entity.setManagerAccount(cmd.getManagerAccount()); entity.setDeptLevelCode(cmd.getDeptLevelCode()); entity.setDeptLevelName(cmd.getDeptLevelName()); @@ -53,6 +54,7 @@ public class OrgDepartmentExecutor implements OrgDepartmentApi { entity.setParentId(cmd.getParentId()); entity.setDeptName(cmd.getDeptName()); entity.setManagerName(cmd.getManagerName()); + entity.setManagerAccount(cmd.getManagerAccount()); entity.setDeptLevelCode(cmd.getDeptLevelCode()); entity.setDeptLevelName(cmd.getDeptLevelName()); @@ -93,6 +95,7 @@ public class OrgDepartmentExecutor implements OrgDepartmentApi { co.setParentId(entity.getParentId()); co.setDeptName(entity.getDeptName()); co.setManagerName(entity.getManagerName()); + co.setManagerAccount(entity.getManagerAccount()); co.setDeptLevelCode(entity.getDeptLevelCode()); co.setDeptLevelName(entity.getDeptLevelName()); co.setTenantId(entity.getTenantId()); diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgEquipmentExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgEquipmentExecutor.java index bf26b30..cb9bf6c 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgEquipmentExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgEquipmentExecutor.java @@ -95,8 +95,8 @@ public class OrgEquipmentExecutor implements OrgEquipmentApi { domainQuery.setPageSize(query.getSize()); domainQuery.setOrgId(query.getOrgId()); domainQuery.setDeviceName(query.getDeviceName()); - domainQuery.setInstrumentTypeCode(query.getInstrumentTypeCode()); - domainQuery.setDeviceTypeCode(query.getDeviceTypeCode()); + domainQuery.setInstrumentType(query.getInstrumentType()); + domainQuery.setDeviceType(query.getDeviceType()); domainQuery.setEnableFlag(query.getEnableFlag()); PageResult pageResult = orgEquipmentDomainService.page(domainQuery); diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelCertExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelCertExecutor.java index f2dbce2..f426344 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelCertExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelCertExecutor.java @@ -43,6 +43,7 @@ public class OrgPersonnelCertExecutor implements OrgPersonnelCertApi { entity.setValidEndDate(cmd.getValidEndDate()); entity.setReviewDate(cmd.getReviewDate()); entity.setCertAttachmentUrl(cmd.getCertAttachmentUrl()); + entity.setPersonnelId(cmd.getPersonnelId()); OrgPersonnelCertEntity result = orgPersonnelCertDomainService.add(entity); return SingleResponse.success(toCO(result)); @@ -71,6 +72,7 @@ public class OrgPersonnelCertExecutor implements OrgPersonnelCertApi { entity.setValidEndDate(cmd.getValidEndDate()); entity.setReviewDate(cmd.getReviewDate()); entity.setCertAttachmentUrl(cmd.getCertAttachmentUrl()); + entity.setPersonnelId(cmd.getPersonnelId()); OrgPersonnelCertEntity result = orgPersonnelCertDomainService.modify(entity); return SingleResponse.success(toCO(result)); diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelExecutor.java index fd84a91..5cabd42 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelExecutor.java @@ -1,24 +1,30 @@ package org.qinan.safetyeval.app.executor; +import org.qinan.safetyeval.app.support.OrgPersonnelChangeRecorder; +import org.qinan.safetyeval.app.support.OrgPersonnelViewEnricher; import org.qinan.safetyeval.client.api.OrgPersonnelApi; -import org.qinan.safetyeval.client.dto.PageResponse; -import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.co.OrgPersonnelCO; import org.qinan.safetyeval.client.dto.OrgPersonnelAddCmd; import org.qinan.safetyeval.client.dto.OrgPersonnelModifyCmd; import org.qinan.safetyeval.client.dto.OrgPersonnelPageQuery; +import org.qinan.safetyeval.client.dto.PageResponse; +import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.domain.entity.OrgPersonnelEntity; +import org.qinan.safetyeval.domain.exception.BizException; +import org.qinan.safetyeval.domain.exception.ErrorCode; +import org.qinan.safetyeval.domain.gateway.OrgResignApplyGateway; import org.qinan.safetyeval.domain.query.OrgPersonnelQuery; import org.qinan.safetyeval.domain.query.PageResult; import org.qinan.safetyeval.domain.service.OrgPersonnelDomainService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; /** * 人员信息执行器(App层) - * - * @author safety-eval */ @Service public class OrgPersonnelExecutor implements OrgPersonnelApi { @@ -27,55 +33,43 @@ public class OrgPersonnelExecutor implements OrgPersonnelApi { @Autowired(required = false) private OrgPersonnelDomainService orgPersonnelDomainService; + @Autowired(required = false) + private OrgPersonnelViewEnricher orgPersonnelViewEnricher; + + @Autowired(required = false) + private OrgPersonnelChangeRecorder orgPersonnelChangeRecorder; + + @Autowired(required = false) + private OrgResignApplyGateway orgResignApplyGateway; + @Override public SingleResponse add(OrgPersonnelAddCmd cmd) { - OrgPersonnelEntity entity = new OrgPersonnelEntity(); - entity.setUserName(cmd.getUserName()); - entity.setAccount(cmd.getAccount()); - entity.setGenderCode(cmd.getGenderCode()); - entity.setGenderName(cmd.getGenderName()); - entity.setBirthDate(cmd.getBirthDate()); - entity.setIdCardNo(cmd.getIdCardNo()); - entity.setCurrentAddress(cmd.getCurrentAddress()); - entity.setOfficeAddress(cmd.getOfficeAddress()); - entity.setEducationCode(cmd.getEducationCode()); - entity.setEducationName(cmd.getEducationName()); - entity.setGraduateSchool(cmd.getGraduateSchool()); - entity.setMajor(cmd.getMajor()); - entity.setEmploymentStatusCode(cmd.getEmploymentStatusCode()); - entity.setEmploymentStatusName(cmd.getEmploymentStatusName()); - + OrgPersonnelEntity entity = toEntity(cmd); OrgPersonnelEntity result = orgPersonnelDomainService.add(entity); - return SingleResponse.success(toCO(result)); + OrgPersonnelCO co = toCO(result); + enrich(co); + return SingleResponse.success(co); } @Override public SingleResponse get(Long id) { OrgPersonnelEntity entity = orgPersonnelDomainService.get(id); - return SingleResponse.success(toCO(entity)); + OrgPersonnelCO co = toCO(entity); + enrich(co); + return SingleResponse.success(co); } @Override + @Transactional(rollbackFor = Exception.class) public SingleResponse modify(OrgPersonnelModifyCmd cmd) { - OrgPersonnelEntity entity = new OrgPersonnelEntity(); + OrgPersonnelEntity existing = orgPersonnelDomainService.get(cmd.getId()); + OrgPersonnelEntity entity = toEntity(cmd); entity.setId(cmd.getId()); - entity.setUserName(cmd.getUserName()); - entity.setAccount(cmd.getAccount()); - entity.setGenderCode(cmd.getGenderCode()); - entity.setGenderName(cmd.getGenderName()); - entity.setBirthDate(cmd.getBirthDate()); - entity.setIdCardNo(cmd.getIdCardNo()); - entity.setCurrentAddress(cmd.getCurrentAddress()); - entity.setOfficeAddress(cmd.getOfficeAddress()); - entity.setEducationCode(cmd.getEducationCode()); - entity.setEducationName(cmd.getEducationName()); - entity.setGraduateSchool(cmd.getGraduateSchool()); - entity.setMajor(cmd.getMajor()); - entity.setEmploymentStatusCode(cmd.getEmploymentStatusCode()); - entity.setEmploymentStatusName(cmd.getEmploymentStatusName()); - OrgPersonnelEntity result = orgPersonnelDomainService.modify(entity); - return SingleResponse.success(toCO(result)); + orgPersonnelChangeRecorder.recordChanges(existing, result); + OrgPersonnelCO co = toCO(result); + enrich(co); + return SingleResponse.success(co); } @Override @@ -84,6 +78,16 @@ public class OrgPersonnelExecutor implements OrgPersonnelApi { return SingleResponse.success(); } + @Override + public SingleResponse resetPassword(Long id) { + OrgPersonnelEntity entity = orgPersonnelDomainService.get(id); + if (entity == null) { + throw new BizException(ErrorCode.ORG_PERSONNEL_NOT_FOUND); + } + // 联调阶段:密码重置占位,后续对接统一用户中心 + return SingleResponse.success(); + } + @Override public PageResponse page(OrgPersonnelPageQuery query) { OrgPersonnelQuery domainQuery = new OrgPersonnelQuery(); @@ -94,14 +98,71 @@ public class OrgPersonnelExecutor implements OrgPersonnelApi { domainQuery.setPostId(query.getPostId()); domainQuery.setUserName(query.getUserName()); domainQuery.setAccount(query.getAccount()); + domainQuery.setEmploymentStatusCode(query.getEmploymentStatusCode()); + if (query.getResignAuditStatus() != null && orgResignApplyGateway != null) { + domainQuery.setPersonnelIds(orgResignApplyGateway.listPersonnelIdsByAuditStatus( + query.getResignAuditStatus(), query.getOrgId())); + } PageResult pageResult = orgPersonnelDomainService.page(domainQuery); - return PageResponse.of( - pageResult.getRecords().stream() - .map(this::toCO) - .collect(java.util.stream.Collectors.toList()), - pageResult.getTotal()); + List records = pageResult.getRecords().stream() + .map(entity -> { + OrgPersonnelCO co = toCO(entity); + enrich(co); + return co; + }) + .collect(java.util.stream.Collectors.toList()); + + return PageResponse.of(records, pageResult.getTotal()); + } + + private void enrich(OrgPersonnelCO co) { + if (orgPersonnelViewEnricher != null) { + orgPersonnelViewEnricher.enrichPersonnel(co); + } + } + + private OrgPersonnelEntity toEntity(OrgPersonnelAddCmd cmd) { + OrgPersonnelEntity entity = new OrgPersonnelEntity(); + entity.setUserName(cmd.getUserName()); + entity.setAccount(cmd.getAccount()); + entity.setGenderCode(cmd.getGenderCode()); + entity.setGenderName(cmd.getGenderName()); + entity.setBirthDate(cmd.getBirthDate()); + entity.setIdCardNo(cmd.getIdCardNo()); + entity.setCurrentAddress(cmd.getCurrentAddress()); + entity.setOfficeAddress(cmd.getOfficeAddress()); + entity.setEducationCode(cmd.getEducationCode()); + entity.setEducationName(cmd.getEducationName()); + entity.setGraduateSchool(cmd.getGraduateSchool()); + entity.setMajor(cmd.getMajor()); + entity.setEmploymentStatusCode(cmd.getEmploymentStatusCode()); + entity.setEmploymentStatusName(cmd.getEmploymentStatusName()); + entity.setDeptId(cmd.getDeptId()); + entity.setPostId(cmd.getPostId()); + return entity; + } + + private OrgPersonnelEntity toEntity(OrgPersonnelModifyCmd cmd) { + OrgPersonnelEntity entity = new OrgPersonnelEntity(); + entity.setUserName(cmd.getUserName()); + entity.setAccount(cmd.getAccount()); + entity.setGenderCode(cmd.getGenderCode()); + entity.setGenderName(cmd.getGenderName()); + entity.setBirthDate(cmd.getBirthDate()); + entity.setIdCardNo(cmd.getIdCardNo()); + entity.setCurrentAddress(cmd.getCurrentAddress()); + entity.setOfficeAddress(cmd.getOfficeAddress()); + entity.setEducationCode(cmd.getEducationCode()); + entity.setEducationName(cmd.getEducationName()); + entity.setGraduateSchool(cmd.getGraduateSchool()); + entity.setMajor(cmd.getMajor()); + entity.setEmploymentStatusCode(cmd.getEmploymentStatusCode()); + entity.setEmploymentStatusName(cmd.getEmploymentStatusName()); + entity.setDeptId(cmd.getDeptId()); + entity.setPostId(cmd.getPostId()); + return entity; } private OrgPersonnelCO toCO(OrgPersonnelEntity entity) { diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPositionExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPositionExecutor.java index 58d3131..8df7d5a 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPositionExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPositionExecutor.java @@ -32,6 +32,8 @@ public class OrgPositionExecutor implements OrgPositionApi { OrgPositionEntity entity = new OrgPositionEntity(); entity.setPositionName(cmd.getPositionName()); entity.setDutyDesc(cmd.getDutyDesc()); + entity.setDeptId(cmd.getDeptId()); + entity.setRemark(cmd.getRemark()); OrgPositionEntity result = orgPositionDomainService.add(entity); return SingleResponse.success(toCO(result)); @@ -49,6 +51,8 @@ public class OrgPositionExecutor implements OrgPositionApi { entity.setId(cmd.getId()); entity.setPositionName(cmd.getPositionName()); entity.setDutyDesc(cmd.getDutyDesc()); + entity.setDeptId(cmd.getDeptId()); + entity.setRemark(cmd.getRemark()); OrgPositionEntity result = orgPositionDomainService.modify(entity); return SingleResponse.success(toCO(result)); @@ -87,6 +91,7 @@ public class OrgPositionExecutor implements OrgPositionApi { co.setDeptId(entity.getDeptId()); co.setPositionName(entity.getPositionName()); co.setDutyDesc(entity.getDutyDesc()); + co.setRemark(entity.getRemark()); co.setTenantId(entity.getTenantId()); return co; } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgQualificationExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgQualificationExecutor.java index 316c2ce..ab010f8 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgQualificationExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgQualificationExecutor.java @@ -40,6 +40,7 @@ public class OrgQualificationExecutor implements OrgQualificationApi { entity.setValidEndDate(cmd.getValidEndDate()); entity.setCertImageUrl(cmd.getCertImageUrl()); entity.setEnableFlag(cmd.getEnableFlag()); + entity.setRemark(cmd.getRemark()); OrgQualificationEntity result = orgQualificationDomainService.add(entity); return SingleResponse.success(toCO(result)); @@ -65,6 +66,7 @@ public class OrgQualificationExecutor implements OrgQualificationApi { entity.setValidEndDate(cmd.getValidEndDate()); entity.setCertImageUrl(cmd.getCertImageUrl()); entity.setEnableFlag(cmd.getEnableFlag()); + entity.setRemark(cmd.getRemark()); OrgQualificationEntity result = orgQualificationDomainService.modify(entity); return SingleResponse.success(toCO(result)); @@ -111,6 +113,7 @@ public class OrgQualificationExecutor implements OrgQualificationApi { co.setValidEndDate(entity.getValidEndDate()); co.setCertImageUrl(entity.getCertImageUrl()); co.setEnableFlag(entity.getEnableFlag()); + co.setRemark(entity.getRemark()); co.setTenantId(entity.getTenantId()); return co; } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgResignApplyExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgResignApplyExecutor.java index d359f7d..733f93b 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgResignApplyExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgResignApplyExecutor.java @@ -8,12 +8,16 @@ import org.qinan.safetyeval.client.dto.OrgResignApplyAddCmd; import org.qinan.safetyeval.client.dto.OrgResignApplyModifyCmd; import org.qinan.safetyeval.client.dto.OrgResignApplyPageQuery; import org.qinan.safetyeval.domain.entity.OrgResignApplyEntity; +import org.qinan.safetyeval.domain.entity.OrgPersonnelEntity; +import org.qinan.safetyeval.domain.gateway.OrgPersonnelGateway; import org.qinan.safetyeval.domain.query.OrgResignApplyQuery; import org.qinan.safetyeval.domain.query.PageResult; import org.qinan.safetyeval.domain.service.OrgResignApplyDomainService; +import org.qinan.safetyeval.app.support.OrgPersonnelViewEnricher; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; /** * 人员离职申请执行器(App层) @@ -27,6 +31,12 @@ public class OrgResignApplyExecutor implements OrgResignApplyApi { @Autowired(required = false) private OrgResignApplyDomainService orgResignApplyDomainService; + @Autowired(required = false) + private OrgPersonnelViewEnricher orgPersonnelViewEnricher; + + @Autowired(required = false) + private OrgPersonnelGateway orgPersonnelGateway; + @Override public SingleResponse add(OrgResignApplyAddCmd cmd) { OrgResignApplyEntity entity = new OrgResignApplyEntity(); @@ -35,18 +45,24 @@ public class OrgResignApplyExecutor implements OrgResignApplyApi { entity.setResignReason(cmd.getResignReason()); entity.setExpectedResignDate(cmd.getExpectedResignDate()); entity.setReportFileUrl(cmd.getReportFileUrl()); - entity.setAuditStatusCode(cmd.getAuditStatusCode()); - entity.setAuditStatusName(cmd.getAuditStatusName()); + entity.setAuditStatusCode(cmd.getAuditStatusCode() != null ? cmd.getAuditStatusCode() : 0); + entity.setAuditStatusName(cmd.getAuditStatusName() != null ? cmd.getAuditStatusName() : "未审核"); entity.setRejectReason(cmd.getRejectReason()); + entity.setRemark(cmd.getRemark()); + entity.setPersonnelId(resolvePersonnelId(cmd.getPersonnelId(), cmd.getApplicantName())); OrgResignApplyEntity result = orgResignApplyDomainService.add(entity); - return SingleResponse.success(toCO(result)); + OrgResignApplyCO co = toCO(result); + enrich(co); + return SingleResponse.success(co); } @Override public SingleResponse get(Long id) { OrgResignApplyEntity entity = orgResignApplyDomainService.get(id); - return SingleResponse.success(toCO(entity)); + OrgResignApplyCO co = toCO(entity); + enrich(co); + return SingleResponse.success(co); } @Override @@ -61,9 +77,18 @@ public class OrgResignApplyExecutor implements OrgResignApplyApi { entity.setAuditStatusCode(cmd.getAuditStatusCode()); entity.setAuditStatusName(cmd.getAuditStatusName()); entity.setRejectReason(cmd.getRejectReason()); + entity.setRemark(cmd.getRemark()); + entity.setPersonnelId(cmd.getPersonnelId()); + + if (entity.getAuditStatusCode() != null && entity.getAuditStatusName() == null) { + entity.setAuditStatusName(resolveAuditStatusName(entity.getAuditStatusCode())); + } OrgResignApplyEntity result = orgResignApplyDomainService.modify(entity); - return SingleResponse.success(toCO(result)); + syncPersonnelEmploymentAfterAudit(result); + OrgResignApplyCO co = toCO(result); + enrich(co); + return SingleResponse.success(co); } @Override @@ -80,16 +105,70 @@ public class OrgResignApplyExecutor implements OrgResignApplyApi { domainQuery.setOrgId(query.getOrgId()); domainQuery.setPersonnelId(query.getPersonnelId()); domainQuery.setAuditStatusCode(query.getAuditStatusCode()); + domainQuery.setApplicantName(query.getApplicantName()); PageResult pageResult = orgResignApplyDomainService.page(domainQuery); return PageResponse.of( pageResult.getRecords().stream() - .map(this::toCO) + .map(entity -> { + OrgResignApplyCO co = toCO(entity); + enrich(co); + return co; + }) .collect(java.util.stream.Collectors.toList()), pageResult.getTotal()); } + private void enrich(OrgResignApplyCO co) { + if (orgPersonnelViewEnricher != null) { + orgPersonnelViewEnricher.enrichResignApply(co); + } + } + + private Long resolvePersonnelId(Long personnelId, String applicantName) { + if (personnelId != null) { + return personnelId; + } + if (orgPersonnelGateway == null || !StringUtils.hasText(applicantName)) { + return null; + } + OrgPersonnelEntity personnel = orgPersonnelGateway.findByUserName(applicantName); + if (personnel == null) { + personnel = orgPersonnelGateway.getByAccount(applicantName); + } + return personnel != null ? personnel.getId() : null; + } + + private void syncPersonnelEmploymentAfterAudit(OrgResignApplyEntity result) { + if (result == null || result.getPersonnelId() == null || orgPersonnelGateway == null) { + return; + } + if (result.getAuditStatusCode() == null || result.getAuditStatusCode() != 1) { + return; + } + OrgPersonnelEntity personnel = orgPersonnelGateway.get(result.getPersonnelId()); + if (personnel == null) { + return; + } + personnel.setEmploymentStatusCode(2); + personnel.setEmploymentStatusName("离职"); + orgPersonnelGateway.modify(personnel); + } + + private String resolveAuditStatusName(Integer auditStatusCode) { + if (auditStatusCode == null) { + return "未审核"; + } + if (auditStatusCode == 1) { + return "已审核"; + } + if (auditStatusCode == 2) { + return "已退回"; + } + return "未审核"; + } + private OrgResignApplyCO toCO(OrgResignApplyEntity entity) { if (entity == null) { return null; @@ -105,6 +184,7 @@ public class OrgResignApplyExecutor implements OrgResignApplyApi { co.setAuditStatusCode(entity.getAuditStatusCode()); co.setAuditStatusName(entity.getAuditStatusName()); co.setRejectReason(entity.getRejectReason()); + co.setRemark(entity.getRemark()); co.setTenantId(entity.getTenantId()); return co; } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/support/OrgPersonnelChangeRecorder.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/support/OrgPersonnelChangeRecorder.java new file mode 100644 index 0000000..919d5c9 --- /dev/null +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/support/OrgPersonnelChangeRecorder.java @@ -0,0 +1,83 @@ +package org.qinan.safetyeval.app.support; + +import org.qinan.safetyeval.domain.entity.OrgPersonnelChangeEntity; +import org.qinan.safetyeval.domain.entity.OrgPersonnelEntity; +import org.qinan.safetyeval.domain.gateway.OrgPersonnelChangeGateway; +import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserContextAdapter; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 人员信息修改时自动写入变更记录。 + */ +@Component +public class OrgPersonnelChangeRecorder { + + @Resource + private OrgPersonnelChangeGateway orgPersonnelChangeGateway; + + public void recordChanges(OrgPersonnelEntity before, OrgPersonnelEntity after) { + if (before == null || after == null || after.getId() == null) { + return; + } + List items = new ArrayList<>(); + if (!Objects.equals(before.getUserName(), after.getUserName())) { + items.add("姓名"); + } + if (!Objects.equals(before.getAccount(), after.getAccount())) { + items.add("账号"); + } + if (!Objects.equals(before.getDeptId(), after.getDeptId())) { + items.add("部门"); + } + if (!Objects.equals(before.getPostId(), after.getPostId())) { + items.add("岗位"); + } + if (!Objects.equals(before.getGenderCode(), after.getGenderCode())) { + items.add("性别"); + } + if (!Objects.equals(before.getBirthDate(), after.getBirthDate())) { + items.add("出生日期"); + } + if (!Objects.equals(before.getIdCardNo(), after.getIdCardNo())) { + items.add("身份证号"); + } + if (!Objects.equals(before.getCurrentAddress(), after.getCurrentAddress())) { + items.add("现住地址"); + } + if (!Objects.equals(before.getOfficeAddress(), after.getOfficeAddress())) { + items.add("办公地址"); + } + if (!Objects.equals(before.getEducationName(), after.getEducationName())) { + items.add("学历"); + } + if (!Objects.equals(before.getGraduateSchool(), after.getGraduateSchool())) { + items.add("毕业院校"); + } + if (!Objects.equals(before.getMajor(), after.getMajor())) { + items.add("专业"); + } + if (!Objects.equals(before.getEmploymentStatusCode(), after.getEmploymentStatusCode())) { + items.add("就职状态"); + } + if (items.isEmpty()) { + return; + } + LocalDateTime now = LocalDateTime.now(); + String operator = StringUtils.hasText(AuthUserContextAdapter.getCurrentUserName()) ? AuthUserContextAdapter.getCurrentUserName() : "系统"; + for (String item : items) { + OrgPersonnelChangeEntity change = new OrgPersonnelChangeEntity(); + change.setPersonnelId(after.getId()); + change.setChangeItem(item); + change.setChangeTime(now); + change.setOperatorName(operator); + orgPersonnelChangeGateway.save(change); + } + } +} diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/support/OrgPersonnelViewEnricher.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/support/OrgPersonnelViewEnricher.java new file mode 100644 index 0000000..f6729a9 --- /dev/null +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/support/OrgPersonnelViewEnricher.java @@ -0,0 +1,125 @@ +package org.qinan.safetyeval.app.support; + +import org.qinan.safetyeval.client.co.OrgPersonnelCO; +import org.qinan.safetyeval.client.co.OrgResignApplyCO; +import org.qinan.safetyeval.domain.entity.OrgDepartmentEntity; +import org.qinan.safetyeval.domain.entity.OrgPersonnelCertEntity; +import org.qinan.safetyeval.domain.entity.OrgPersonnelChangeEntity; +import org.qinan.safetyeval.domain.entity.OrgPersonnelEntity; +import org.qinan.safetyeval.domain.entity.OrgPositionEntity; +import org.qinan.safetyeval.domain.entity.OrgResignApplyEntity; +import org.qinan.safetyeval.domain.gateway.OrgDepartmentGateway; +import org.qinan.safetyeval.domain.gateway.OrgPersonnelCertGateway; +import org.qinan.safetyeval.domain.gateway.OrgPersonnelChangeGateway; +import org.qinan.safetyeval.domain.gateway.OrgPersonnelGateway; +import org.qinan.safetyeval.domain.gateway.OrgPositionGateway; +import org.qinan.safetyeval.domain.gateway.OrgResignApplyGateway; +import org.qinan.safetyeval.domain.query.OrgPersonnelCertQuery; +import org.qinan.safetyeval.domain.query.PageResult; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 人员/离职列表展示字段组装(部门名、岗位名、证书名、账号等)。 + */ +@Component +public class OrgPersonnelViewEnricher { + + @Resource + private OrgDepartmentGateway orgDepartmentGateway; + + @Resource + private OrgPositionGateway orgPositionGateway; + + @Resource + private OrgPersonnelCertGateway orgPersonnelCertGateway; + + @Resource + private OrgPersonnelGateway orgPersonnelGateway; + + @Resource + private OrgPersonnelChangeGateway orgPersonnelChangeGateway; + + @Resource + private OrgResignApplyGateway orgResignApplyGateway; + + public void enrichPersonnel(OrgPersonnelCO co) { + if (co == null) { + return; + } + if (co.getDeptId() != null) { + OrgDepartmentEntity dept = orgDepartmentGateway.get(co.getDeptId()); + if (dept != null) { + co.setDeptName(dept.getDeptName()); + } + } + if (co.getPostId() != null) { + OrgPositionEntity position = orgPositionGateway.get(co.getPostId()); + if (position != null) { + co.setPostName(position.getPositionName()); + } + } + if (co.getId() != null) { + OrgPersonnelCertQuery certQuery = new OrgPersonnelCertQuery(); + certQuery.setPersonnelId(co.getId()); + certQuery.setPageNum(1L); + certQuery.setPageSize(200L); + PageResult certPage = orgPersonnelCertGateway.page(certQuery); + String certNames = certPage.getRecords().stream() + .map(OrgPersonnelCertEntity::getCertName) + .filter(StringUtils::hasText) + .collect(Collectors.joining("、")); + co.setCertNames(certNames); + + enrichChangeSummary(co); + } + if (co.getEmploymentStatusCode() == null) { + co.setEmploymentStatusCode(1); + co.setEmploymentStatusName("在职"); + } + } + + private void enrichChangeSummary(OrgPersonnelCO co) { + List changes = orgPersonnelChangeGateway.listByPersonnelId(co.getId()); + co.setChangeCount(changes != null ? changes.size() : 0); + + List applies = orgResignApplyGateway.listByPersonnelId(co.getId()); + if (applies == null || applies.isEmpty()) { + return; + } + OrgResignApplyEntity displayApply = applies.stream() + .filter(item -> item.getAuditStatusCode() != null && item.getAuditStatusCode() == 0) + .findFirst() + .orElse(applies.get(0)); + co.setResignApplyId(displayApply.getId()); + co.setResignAuditStatus(displayApply.getAuditStatusCode() != null ? displayApply.getAuditStatusCode() : 0); + } + + public void enrichResignApply(OrgResignApplyCO co) { + if (co == null) { + return; + } + if (co.getAuditStatusCode() == null) { + co.setAuditStatusCode(0); + co.setAuditStatusName("未审核"); + } + if (co.getPersonnelId() == null) { + return; + } + OrgPersonnelEntity personnel = orgPersonnelGateway.get(co.getPersonnelId()); + if (personnel == null) { + return; + } + co.setAccount(personnel.getAccount()); + if (personnel.getDeptId() != null) { + OrgDepartmentEntity dept = orgDepartmentGateway.get(personnel.getDeptId()); + if (dept != null) { + co.setDeptName(dept.getDeptName()); + } + } + } +} diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/OrgPersonnelApi.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/OrgPersonnelApi.java index a3e6ce2..4fae302 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/OrgPersonnelApi.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/OrgPersonnelApi.java @@ -23,4 +23,6 @@ public interface OrgPersonnelApi { SingleResponse delete(Long id); PageResponse page(OrgPersonnelPageQuery query); + + SingleResponse resetPassword(Long id); } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgDepartmentCO.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgDepartmentCO.java index 28e975d..f75f51d 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgDepartmentCO.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgDepartmentCO.java @@ -22,6 +22,9 @@ public class OrgDepartmentCO { /** managerName */ private String managerName; + /** managerAccount */ + private String managerAccount; + /** deptLevelCode */ private String deptLevelCode; diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgPersonnelCO.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgPersonnelCO.java index fb534a4..71b8a9e 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgPersonnelCO.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgPersonnelCO.java @@ -62,6 +62,24 @@ public class OrgPersonnelCO { /** employmentStatusName */ private String employmentStatusName; + /** 部门名称(列表展示,非持久化) */ + private String deptName; + + /** 岗位名称(列表展示,非持久化) */ + private String postName; + + /** 证书名称汇总(列表展示,非持久化) */ + private String certNames; + + /** 信息变更次数(列表展示,非持久化) */ + private Integer changeCount; + + /** 离职申请ID(列表展示,非持久化) */ + private Long resignApplyId; + + /** 离职申请审核状态(列表展示,非持久化) */ + private Integer resignAuditStatus; + /** 租户ID */ private Long tenantId; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgPositionCO.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgPositionCO.java index d12ee7e..6fd62dd 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgPositionCO.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgPositionCO.java @@ -22,6 +22,9 @@ public class OrgPositionCO { /** dutyDesc */ private String dutyDesc; + /** 备注 */ + private String remark; + /** 租户ID */ private Long tenantId; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgQualificationCO.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgQualificationCO.java index 8184b20..e1c0c71 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgQualificationCO.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgQualificationCO.java @@ -44,6 +44,9 @@ public class OrgQualificationCO { /** enableFlag */ private Integer enableFlag; + /** 备注 */ + private String remark; + /** 租户ID */ private Long tenantId; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgResignApplyCO.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgResignApplyCO.java index 0200230..4d7f4bd 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgResignApplyCO.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgResignApplyCO.java @@ -42,6 +42,15 @@ public class OrgResignApplyCO { /** rejectReason */ private String rejectReason; + /** 申请备注 */ + private String remark; + + /** 人员账号(列表展示,非持久化) */ + private String account; + + /** 部门名称(列表展示,非持久化) */ + private String deptName; + /** 租户ID */ private Long tenantId; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgDepartmentAddCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgDepartmentAddCmd.java index f52a9f7..4e59b31 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgDepartmentAddCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgDepartmentAddCmd.java @@ -19,6 +19,9 @@ public class OrgDepartmentAddCmd { /** managerName */ private String managerName; + /** managerAccount */ + private String managerAccount; + /** deptLevelCode */ private String deptLevelCode; diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgDepartmentModifyCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgDepartmentModifyCmd.java index 7644631..4294af1 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgDepartmentModifyCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgDepartmentModifyCmd.java @@ -22,6 +22,9 @@ public class OrgDepartmentModifyCmd { /** managerName */ private String managerName; + /** managerAccount */ + private String managerAccount; + /** deptLevelCode */ private String deptLevelCode; diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgEquipmentPageQuery.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgEquipmentPageQuery.java index a6c4e35..b4082ca 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgEquipmentPageQuery.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgEquipmentPageQuery.java @@ -18,11 +18,11 @@ public class OrgEquipmentPageQuery extends BasePageQuery { /** 设备名称 */ private String deviceName; - /** 仪器类型编码 */ - private Long instrumentTypeCode; + /** 仪器类型(模糊匹配名称或编码) */ + private String instrumentType; - /** 设备类型编码 */ - private Long deviceTypeCode; + /** 设备类型(模糊匹配名称或编码) */ + private String deviceType; /** 设备状态 */ private Long enableFlag; diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelAddCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelAddCmd.java index 1ef7a67..505d6be 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelAddCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelAddCmd.java @@ -52,4 +52,10 @@ public class OrgPersonnelAddCmd { /** employmentStatusName */ private String employmentStatusName; + + /** deptId */ + private Long deptId; + + /** postId */ + private Long postId; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelCertAddCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelCertAddCmd.java index 4d464d7..94ba6eb 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelCertAddCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelCertAddCmd.java @@ -49,4 +49,7 @@ public class OrgPersonnelCertAddCmd { /** certAttachmentUrl */ private String certAttachmentUrl; + + /** personnelId */ + private Long personnelId; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelCertModifyCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelCertModifyCmd.java index d5d5dd3..0fbb53f 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelCertModifyCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelCertModifyCmd.java @@ -53,6 +53,9 @@ public class OrgPersonnelCertModifyCmd { /** certAttachmentUrl */ private String certAttachmentUrl; + /** personnelId */ + private Long personnelId; + /** 租户ID */ private Long tenantId; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelModifyCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelModifyCmd.java index 6ff5460..24a7827 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelModifyCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelModifyCmd.java @@ -56,6 +56,12 @@ public class OrgPersonnelModifyCmd { /** employmentStatusName */ private String employmentStatusName; + /** deptId */ + private Long deptId; + + /** postId */ + private Long postId; + /** 租户ID */ private Long tenantId; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelPageQuery.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelPageQuery.java index d5ac55b..58e9595 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelPageQuery.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPersonnelPageQuery.java @@ -24,6 +24,12 @@ public class OrgPersonnelPageQuery extends BasePageQuery { /** 姓名 */ private String userName; - /** 账号 */ + /** 账号(模糊) */ private String account; + + /** 就职状态编码 */ + private Integer employmentStatusCode; + + /** 离职申请审核状态(0未审核 1已审核 2已退回) */ + private Integer resignAuditStatus; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPositionAddCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPositionAddCmd.java index b5a48fc..cf117e5 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPositionAddCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPositionAddCmd.java @@ -15,4 +15,10 @@ public class OrgPositionAddCmd { /** dutyDesc */ private String dutyDesc; + + /** deptId */ + private Long deptId; + + /** 备注 */ + private String remark; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPositionModifyCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPositionModifyCmd.java index 468e5f1..8a42d94 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPositionModifyCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgPositionModifyCmd.java @@ -19,6 +19,12 @@ public class OrgPositionModifyCmd { /** dutyDesc */ private String dutyDesc; + /** deptId */ + private Long deptId; + + /** 备注 */ + private String remark; + /** 租户ID */ private Long tenantId; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgQualificationAddCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgQualificationAddCmd.java index 1472805..f120673 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgQualificationAddCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgQualificationAddCmd.java @@ -40,4 +40,7 @@ public class OrgQualificationAddCmd { /** enableFlag */ private Integer enableFlag; + + /** 备注 */ + private String remark; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgQualificationModifyCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgQualificationModifyCmd.java index 715c53e..e8b169c 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgQualificationModifyCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgQualificationModifyCmd.java @@ -44,6 +44,9 @@ public class OrgQualificationModifyCmd { /** enableFlag */ private Integer enableFlag; + /** 备注 */ + private String remark; + /** 租户ID */ private Long tenantId; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgResignApplyAddCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgResignApplyAddCmd.java index 0887efe..9812280 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgResignApplyAddCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgResignApplyAddCmd.java @@ -35,4 +35,10 @@ public class OrgResignApplyAddCmd { /** rejectReason */ private String rejectReason; + + /** personnelId */ + private Long personnelId; + + /** 申请备注 */ + private String remark; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgResignApplyModifyCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgResignApplyModifyCmd.java index 2f6b3be..daab3af 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgResignApplyModifyCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgResignApplyModifyCmd.java @@ -39,6 +39,12 @@ public class OrgResignApplyModifyCmd { /** rejectReason */ private String rejectReason; + /** 申请备注 */ + private String remark; + + /** personnelId */ + private Long personnelId; + /** 租户ID */ private Long tenantId; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgResignApplyPageQuery.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgResignApplyPageQuery.java index 9874c8f..e23078c 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgResignApplyPageQuery.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/OrgResignApplyPageQuery.java @@ -19,5 +19,8 @@ public class OrgResignApplyPageQuery extends BasePageQuery { private Long personnelId; /** 审核状态 */ - private Long auditStatusCode; + private Integer auditStatusCode; + + /** 申请人姓名(模糊) */ + private String applicantName; } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/OrgDepartmentEntity.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/OrgDepartmentEntity.java index b0c45b4..2e7a211 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/OrgDepartmentEntity.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/OrgDepartmentEntity.java @@ -22,9 +22,12 @@ public class OrgDepartmentEntity { /** 部门名称 */ private String deptName; - /** 负责人 */ + /** 负责人姓名 */ private String managerName; + /** 负责人账号 */ + private String managerAccount; + /** 部门级别编码 */ private String deptLevelCode; diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/OrgPositionEntity.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/OrgPositionEntity.java index 7f4bb46..dd00f2e 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/OrgPositionEntity.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/OrgPositionEntity.java @@ -25,6 +25,9 @@ public class OrgPositionEntity { /** 岗位职责 */ private String dutyDesc; + /** 备注 */ + private String remark; + /** 租户ID */ private Long tenantId; } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/OrgQualificationEntity.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/OrgQualificationEntity.java index 6cebf6a..e0034cf 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/OrgQualificationEntity.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/OrgQualificationEntity.java @@ -48,6 +48,9 @@ public class OrgQualificationEntity { /** 启用标识(1启用2禁用) */ private Integer enableFlag; + /** 备注 */ + private String remark; + /** 租户ID */ private Long tenantId; } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/OrgResignApplyEntity.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/OrgResignApplyEntity.java index 6df3545..6b3ac35 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/OrgResignApplyEntity.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/OrgResignApplyEntity.java @@ -46,6 +46,9 @@ public class OrgResignApplyEntity { /** 退回原因 */ private String rejectReason; + /** 申请备注 */ + private String remark; + /** 租户ID */ private Long tenantId; } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java index 22c41f9..295a5d3 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java @@ -21,6 +21,7 @@ public enum ErrorCode { // ---- 人员信息 ---- ORG_PERSONNEL_NOT_FOUND("01-05-001", "人员信息不存在"), + ORG_PERSONNEL_ACCOUNT_EXISTS("01-05-002", "账号已存在"), // ---- 人员证书 ---- ORG_PERSONNEL_CERT_NOT_FOUND("01-06-001", "人员证书不存在"), diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgPersonnelGateway.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgPersonnelGateway.java index 64a9a9f..d43d447 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgPersonnelGateway.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgPersonnelGateway.java @@ -17,6 +17,8 @@ public interface OrgPersonnelGateway { OrgPersonnelEntity getByAccount(String account); + OrgPersonnelEntity findByUserName(String userName); + OrgPersonnelEntity modify(OrgPersonnelEntity entity); void delete(Long id); diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgResignApplyGateway.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgResignApplyGateway.java index baa430e..17ade50 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgResignApplyGateway.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgResignApplyGateway.java @@ -20,4 +20,14 @@ public interface OrgResignApplyGateway { void delete(Long id); PageResult page(OrgResignApplyQuery query); + + /** + * 按人员查询离职申请,按申请时间倒序。 + */ + java.util.List listByPersonnelId(Long personnelId); + + /** + * 查询指定审核状态下有离职申请的人员 ID 列表。 + */ + java.util.List listPersonnelIdsByAuditStatus(Integer auditStatusCode, Long orgId); } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/query/OrgEquipmentQuery.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/query/OrgEquipmentQuery.java index 586a58a..89c2a7b 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/query/OrgEquipmentQuery.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/query/OrgEquipmentQuery.java @@ -22,11 +22,11 @@ public class OrgEquipmentQuery { /** 设备名称 */ private String deviceName; - /** 仪器类型编码 */ - private Long instrumentTypeCode; + /** 仪器类型(模糊匹配名称或编码) */ + private String instrumentType; - /** 设备类型编码 */ - private Long deviceTypeCode; + /** 设备类型(模糊匹配名称或编码) */ + private String deviceType; /** 设备状态 */ private Long enableFlag; diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/query/OrgPersonnelQuery.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/query/OrgPersonnelQuery.java index c41a51c..d8e5634 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/query/OrgPersonnelQuery.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/query/OrgPersonnelQuery.java @@ -28,6 +28,15 @@ public class OrgPersonnelQuery { /** 姓名 */ private String userName; - /** 账号 */ + /** 账号(模糊) */ private String account; + + /** 就职状态编码 */ + private Integer employmentStatusCode; + + /** 离职申请审核状态 */ + private Integer resignAuditStatus; + + /** 人员 ID 列表(离职审核状态筛选) */ + private java.util.List personnelIds; } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/query/OrgResignApplyQuery.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/query/OrgResignApplyQuery.java index 91c3990..0410023 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/query/OrgResignApplyQuery.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/query/OrgResignApplyQuery.java @@ -23,5 +23,8 @@ public class OrgResignApplyQuery { private Long personnelId; /** 审核状态 */ - private Long auditStatusCode; + private Integer auditStatusCode; + + /** 申请人姓名(模糊) */ + private String applicantName; } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgPersonnelDomainService.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgPersonnelDomainService.java index b24a7bf..9eb69ec 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgPersonnelDomainService.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgPersonnelDomainService.java @@ -6,14 +6,13 @@ import org.qinan.safetyeval.domain.exception.ErrorCode; import org.qinan.safetyeval.domain.gateway.OrgPersonnelGateway; import org.qinan.safetyeval.domain.query.OrgPersonnelQuery; import org.qinan.safetyeval.domain.query.PageResult; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import javax.annotation.Resource; -import org.springframework.stereotype.Service; /** * 人员信息领域服务 - * - * @author safety-eval */ @Service public class OrgPersonnelDomainService { @@ -22,6 +21,11 @@ public class OrgPersonnelDomainService { private OrgPersonnelGateway orgPersonnelGateway; public OrgPersonnelEntity add(OrgPersonnelEntity entity) { + assertAccountUnique(entity.getAccount(), null); + if (entity.getEmploymentStatusCode() == null) { + entity.setEmploymentStatusCode(1); + entity.setEmploymentStatusName("在职"); + } return orgPersonnelGateway.save(entity); } @@ -34,7 +38,54 @@ public class OrgPersonnelDomainService { if (existing == null) { throw new BizException(ErrorCode.ORG_PERSONNEL_NOT_FOUND); } - return orgPersonnelGateway.modify(entity); + assertAccountUnique(entity.getAccount(), entity.getId()); + mergeForModify(existing, entity); + return orgPersonnelGateway.modify(existing); + } + + private void mergeForModify(OrgPersonnelEntity target, OrgPersonnelEntity patch) { + if (StringUtils.hasText(patch.getUserName())) { + target.setUserName(patch.getUserName()); + } + if (StringUtils.hasText(patch.getAccount())) { + target.setAccount(patch.getAccount()); + } + if (patch.getGenderCode() != null) { + target.setGenderCode(patch.getGenderCode()); + target.setGenderName(patch.getGenderName()); + } + if (patch.getBirthDate() != null) { + target.setBirthDate(patch.getBirthDate()); + } + if (patch.getIdCardNo() != null) { + target.setIdCardNo(patch.getIdCardNo()); + } + if (patch.getCurrentAddress() != null) { + target.setCurrentAddress(patch.getCurrentAddress()); + } + if (patch.getOfficeAddress() != null) { + target.setOfficeAddress(patch.getOfficeAddress()); + } + if (patch.getEducationCode() != null) { + target.setEducationCode(patch.getEducationCode()); + target.setEducationName(patch.getEducationName()); + } + if (patch.getGraduateSchool() != null) { + target.setGraduateSchool(patch.getGraduateSchool()); + } + if (patch.getMajor() != null) { + target.setMajor(patch.getMajor()); + } + if (patch.getEmploymentStatusCode() != null) { + target.setEmploymentStatusCode(patch.getEmploymentStatusCode()); + target.setEmploymentStatusName(patch.getEmploymentStatusName()); + } + if (patch.getDeptId() != null) { + target.setDeptId(patch.getDeptId()); + } + if (patch.getPostId() != null) { + target.setPostId(patch.getPostId()); + } } public void delete(Long id) { @@ -48,4 +99,14 @@ public class OrgPersonnelDomainService { public PageResult page(OrgPersonnelQuery query) { return orgPersonnelGateway.page(query); } + + private void assertAccountUnique(String account, Long excludeId) { + if (!StringUtils.hasText(account)) { + return; + } + OrgPersonnelEntity found = orgPersonnelGateway.getByAccount(account); + if (found != null && (excludeId == null || !found.getId().equals(excludeId))) { + throw new BizException(ErrorCode.ORG_PERSONNEL_ACCOUNT_EXISTS); + } + } } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/adapter/auth/AuthUserContextAdapter.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/adapter/auth/AuthUserContextAdapter.java new file mode 100644 index 0000000..d3f90eb --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/adapter/auth/AuthUserContextAdapter.java @@ -0,0 +1,54 @@ +package org.qinan.safetyeval.infrastructure.adapter.auth; + +import com.jjb.saas.framework.auth.model.SSOUser; +import com.jjb.saas.framework.auth.utils.AuthContext; + +/** + * AuthContext 全局适配:统一从 {@link AuthContext#getCurrentUser()} 解析用户信息。 + *

+ * 业务代码通过静态方法获取用户上下文,避免 SSOUser 字段调整导致大面积改动。 + *

+ */ +public final class AuthUserContextAdapter { + + private AuthUserContextAdapter() { + } + + /** + * 获取当前登录用户;未登录返回 null。 + */ + public static AuthUserInfo getCurrentUser() { + return AuthUserInfo.from(AuthContext.getCurrentUser()); + } + + public static Long getCurrentUserId() { + AuthUserInfo user = getCurrentUser(); + return user == null ? null : user.getUserId(); + } + + public static String getCurrentUserName() { + AuthUserInfo user = getCurrentUser(); + return user == null ? null : user.getUserName(); + } + + public static Long getCurrentTenantId() { + AuthUserInfo user = getCurrentUser(); + return user == null ? null : user.getTenantId(); + } + + public static Long getCurrentOrgId() { + AuthUserInfo user = getCurrentUser(); + return user == null ? null : user.getOrgId(); + } + + public static boolean isLoggedIn() { + return getCurrentUser() != null; + } + + /** + * 透传原始 SSOUser,仅在适配类内部扩展字段时使用。 + */ + static SSOUser getRawUser() { + return AuthContext.getCurrentUser(); + } +} diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/adapter/auth/AuthUserInfo.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/adapter/auth/AuthUserInfo.java new file mode 100644 index 0000000..520d18e --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/adapter/auth/AuthUserInfo.java @@ -0,0 +1,30 @@ +package org.qinan.safetyeval.infrastructure.adapter.auth; + +import com.jjb.saas.framework.auth.model.SSOUser; +import lombok.Builder; +import lombok.Value; + +/** + * 稳定的登录用户视图,屏蔽 SSOUser 字段变更对业务代码的影响。 + */ +@Value +@Builder +public class AuthUserInfo { + + Long userId; + String userName; + Long tenantId; + Long orgId; + + public static AuthUserInfo from(SSOUser user) { + if (user == null) { + return null; + } + return AuthUserInfo.builder() + .userId(user.getUserId()) + .userName(user.getName()) + .tenantId(user.getTenantId()) + .orgId(user.getOrgId()) + .build(); + } +} diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/OrgDepartmentDO.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/OrgDepartmentDO.java index bd42913..48d315d 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/OrgDepartmentDO.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/OrgDepartmentDO.java @@ -29,6 +29,9 @@ public class OrgDepartmentDO { /** 负责人 */ private String managerName; + /** 负责人账号 */ + private String managerAccount; + /** 部门级别编码 */ private String deptLevelCode; diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgDepartmentGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgDepartmentGatewayImpl.java index 370293d..ecdc098 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgDepartmentGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgDepartmentGatewayImpl.java @@ -9,6 +9,8 @@ import org.qinan.safetyeval.domain.query.OrgDepartmentQuery; import org.qinan.safetyeval.domain.query.PageResult; import org.qinan.safetyeval.infrastructure.dataobject.OrgDepartmentDO; import org.qinan.safetyeval.infrastructure.mapper.OrgDepartmentMapper; +import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; +import org.qinan.safetyeval.infrastructure.support.OrgContextResolver; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -27,9 +29,13 @@ public class OrgDepartmentGatewayImpl implements OrgDepartmentGateway { @Resource private OrgDepartmentMapper orgDepartmentMapper; + @Resource + private OrgContextResolver orgContextResolver; + @Override public OrgDepartmentEntity save(OrgDepartmentEntity entity) { OrgDepartmentDO dataObject = toDO(entity); + InsertFieldDefaults.apply(dataObject); orgDepartmentMapper.insert(dataObject); entity.setId(dataObject.getId()); return entity; @@ -80,9 +86,11 @@ public class OrgDepartmentGatewayImpl implements OrgDepartmentGateway { private OrgDepartmentDO toDO(OrgDepartmentEntity entity) { OrgDepartmentDO dataObject = new OrgDepartmentDO(); - dataObject.setParentId(entity.getParentId()); + dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId())); + dataObject.setParentId(entity.getParentId() != null ? entity.getParentId() : 0L); dataObject.setDeptName(entity.getDeptName()); dataObject.setManagerName(entity.getManagerName()); + dataObject.setManagerAccount(entity.getManagerAccount()); dataObject.setDeptLevelCode(entity.getDeptLevelCode()); dataObject.setDeptLevelName(entity.getDeptLevelName()); dataObject.setTenantId(entity.getTenantId()); @@ -98,6 +106,7 @@ public class OrgDepartmentGatewayImpl implements OrgDepartmentGateway { entity.setParentId(dataObject.getParentId()); entity.setDeptName(dataObject.getDeptName()); entity.setManagerName(dataObject.getManagerName()); + entity.setManagerAccount(dataObject.getManagerAccount()); entity.setDeptLevelCode(dataObject.getDeptLevelCode()); entity.setDeptLevelName(dataObject.getDeptLevelName()); entity.setTenantId(dataObject.getTenantId()); diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgEquipmentGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgEquipmentGatewayImpl.java index 18c151a..97bbc38 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgEquipmentGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgEquipmentGatewayImpl.java @@ -9,6 +9,8 @@ import org.qinan.safetyeval.domain.query.OrgEquipmentQuery; import org.qinan.safetyeval.domain.query.PageResult; import org.qinan.safetyeval.infrastructure.dataobject.OrgEquipmentDO; import org.qinan.safetyeval.infrastructure.mapper.OrgEquipmentMapper; +import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; +import org.qinan.safetyeval.infrastructure.support.OrgContextResolver; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -27,9 +29,13 @@ public class OrgEquipmentGatewayImpl implements OrgEquipmentGateway { @Resource private OrgEquipmentMapper orgEquipmentMapper; + @Resource + private OrgContextResolver orgContextResolver; + @Override public OrgEquipmentEntity save(OrgEquipmentEntity entity) { OrgEquipmentDO dataObject = toDO(entity); + InsertFieldDefaults.apply(dataObject); orgEquipmentMapper.insert(dataObject); entity.setId(dataObject.getId()); return entity; @@ -64,11 +70,13 @@ public class OrgEquipmentGatewayImpl implements OrgEquipmentGateway { if (StringUtils.hasText(query.getDeviceName())) { wrapper.like(OrgEquipmentDO::getDeviceName, query.getDeviceName()); } - if (query.getInstrumentTypeCode() != null) { - wrapper.eq(OrgEquipmentDO::getInstrumentTypeCode, query.getInstrumentTypeCode()); + if (StringUtils.hasText(query.getInstrumentType())) { + wrapper.and(w -> w.like(OrgEquipmentDO::getInstrumentTypeName, query.getInstrumentType()) + .or().like(OrgEquipmentDO::getInstrumentTypeCode, query.getInstrumentType())); } - if (query.getDeviceTypeCode() != null) { - wrapper.eq(OrgEquipmentDO::getDeviceTypeCode, query.getDeviceTypeCode()); + if (StringUtils.hasText(query.getDeviceType())) { + wrapper.and(w -> w.like(OrgEquipmentDO::getDeviceTypeName, query.getDeviceType()) + .or().like(OrgEquipmentDO::getDeviceTypeCode, query.getDeviceType())); } if (query.getEnableFlag() != null) { wrapper.eq(OrgEquipmentDO::getEnableFlag, query.getEnableFlag()); @@ -86,6 +94,7 @@ public class OrgEquipmentGatewayImpl implements OrgEquipmentGateway { private OrgEquipmentDO toDO(OrgEquipmentEntity entity) { OrgEquipmentDO dataObject = new OrgEquipmentDO(); + dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId())); dataObject.setDeviceName(entity.getDeviceName()); dataObject.setDeviceModel(entity.getDeviceModel()); dataObject.setInstrumentTypeCode(entity.getInstrumentTypeCode()); diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgInfoGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgInfoGatewayImpl.java index d33e479..fd05780 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgInfoGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgInfoGatewayImpl.java @@ -7,8 +7,10 @@ import org.qinan.safetyeval.domain.entity.OrgInfoEntity; import org.qinan.safetyeval.domain.gateway.OrgInfoGateway; import org.qinan.safetyeval.domain.query.OrgInfoQuery; import org.qinan.safetyeval.domain.query.PageResult; +import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserContextAdapter; import org.qinan.safetyeval.infrastructure.dataobject.OrgInfoDO; import org.qinan.safetyeval.infrastructure.mapper.OrgInfoMapper; +import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -30,6 +32,7 @@ public class OrgInfoGatewayImpl implements OrgInfoGateway { @Override public OrgInfoEntity save(OrgInfoEntity entity) { OrgInfoDO dataObject = toDO(entity); + InsertFieldDefaults.apply(dataObject); orgInfoMapper.insert(dataObject); entity.setId(dataObject.getId()); return entity; diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPersonnelCertGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPersonnelCertGatewayImpl.java index af89608..d11867c 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPersonnelCertGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPersonnelCertGatewayImpl.java @@ -9,6 +9,8 @@ import org.qinan.safetyeval.domain.query.OrgPersonnelCertQuery; import org.qinan.safetyeval.domain.query.PageResult; import org.qinan.safetyeval.infrastructure.dataobject.OrgPersonnelCertDO; import org.qinan.safetyeval.infrastructure.mapper.OrgPersonnelCertMapper; +import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; +import org.qinan.safetyeval.infrastructure.support.OrgContextResolver; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -27,9 +29,13 @@ public class OrgPersonnelCertGatewayImpl implements OrgPersonnelCertGateway { @Resource private OrgPersonnelCertMapper orgPersonnelCertMapper; + @Resource + private OrgContextResolver orgContextResolver; + @Override public OrgPersonnelCertEntity save(OrgPersonnelCertEntity entity) { OrgPersonnelCertDO dataObject = toDO(entity); + InsertFieldDefaults.apply(dataObject); orgPersonnelCertMapper.insert(dataObject); entity.setId(dataObject.getId()); return entity; @@ -100,6 +106,7 @@ public class OrgPersonnelCertGatewayImpl implements OrgPersonnelCertGateway { private OrgPersonnelCertDO toDO(OrgPersonnelCertEntity entity) { OrgPersonnelCertDO dataObject = new OrgPersonnelCertDO(); + dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId())); dataObject.setPersonnelId(entity.getPersonnelId()); dataObject.setCertName(entity.getCertName()); dataObject.setCertTypeCode(entity.getCertTypeCode()); diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPersonnelChangeGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPersonnelChangeGatewayImpl.java index 9673c7b..afadebd 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPersonnelChangeGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPersonnelChangeGatewayImpl.java @@ -9,6 +9,8 @@ import org.qinan.safetyeval.domain.query.OrgPersonnelChangeQuery; import org.qinan.safetyeval.domain.query.PageResult; import org.qinan.safetyeval.infrastructure.dataobject.OrgPersonnelChangeDO; import org.qinan.safetyeval.infrastructure.mapper.OrgPersonnelChangeMapper; +import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; +import org.qinan.safetyeval.infrastructure.support.OrgContextResolver; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -27,9 +29,13 @@ public class OrgPersonnelChangeGatewayImpl implements OrgPersonnelChangeGateway @Resource private OrgPersonnelChangeMapper orgPersonnelChangeMapper; + @Resource + private OrgContextResolver orgContextResolver; + @Override public OrgPersonnelChangeEntity save(OrgPersonnelChangeEntity entity) { OrgPersonnelChangeDO dataObject = toDO(entity); + InsertFieldDefaults.apply(dataObject); orgPersonnelChangeMapper.insert(dataObject); entity.setId(dataObject.getId()); return entity; @@ -88,6 +94,7 @@ public class OrgPersonnelChangeGatewayImpl implements OrgPersonnelChangeGateway private OrgPersonnelChangeDO toDO(OrgPersonnelChangeEntity entity) { OrgPersonnelChangeDO dataObject = new OrgPersonnelChangeDO(); + dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId())); dataObject.setPersonnelId(entity.getPersonnelId()); dataObject.setChangeItem(entity.getChangeItem()); dataObject.setChangeTime(entity.getChangeTime()); @@ -102,6 +109,7 @@ public class OrgPersonnelChangeGatewayImpl implements OrgPersonnelChangeGateway } OrgPersonnelChangeEntity entity = new OrgPersonnelChangeEntity(); entity.setId(dataObject.getId()); + entity.setOrgId(dataObject.getOrgId()); entity.setPersonnelId(dataObject.getPersonnelId()); entity.setChangeItem(dataObject.getChangeItem()); entity.setChangeTime(dataObject.getChangeTime()); diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPersonnelGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPersonnelGatewayImpl.java index afa1d92..a4e4dd7 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPersonnelGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPersonnelGatewayImpl.java @@ -9,6 +9,8 @@ import org.qinan.safetyeval.domain.query.OrgPersonnelQuery; import org.qinan.safetyeval.domain.query.PageResult; import org.qinan.safetyeval.infrastructure.dataobject.OrgPersonnelDO; import org.qinan.safetyeval.infrastructure.mapper.OrgPersonnelMapper; +import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; +import org.qinan.safetyeval.infrastructure.support.OrgContextResolver; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -27,9 +29,13 @@ public class OrgPersonnelGatewayImpl implements OrgPersonnelGateway { @Resource private OrgPersonnelMapper orgPersonnelMapper; + @Resource + private OrgContextResolver orgContextResolver; + @Override public OrgPersonnelEntity save(OrgPersonnelEntity entity) { OrgPersonnelDO dataObject = toDO(entity); + InsertFieldDefaults.apply(dataObject); orgPersonnelMapper.insert(dataObject); entity.setId(dataObject.getId()); return entity; @@ -40,11 +46,28 @@ public class OrgPersonnelGatewayImpl implements OrgPersonnelGateway { OrgPersonnelDO dataObject = orgPersonnelMapper.selectById(id); return toEntity(dataObject); } -@Override + @Override public OrgPersonnelEntity getByAccount(String account) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(OrgPersonnelDO::getAccount, account); wrapper.eq(OrgPersonnelDO::getDeleteEnum, "false"); + Long orgId = orgContextResolver.resolveOrgId(null); + if (orgId != null) { + wrapper.eq(OrgPersonnelDO::getOrgId, orgId); + } + OrgPersonnelDO dataObject = orgPersonnelMapper.selectOne(wrapper); + return toEntity(dataObject); + } + + @Override + public OrgPersonnelEntity findByUserName(String userName) { + if (!StringUtils.hasText(userName)) { + return null; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(OrgPersonnelDO::getUserName, userName); + wrapper.eq(OrgPersonnelDO::getDeleteEnum, "false"); + wrapper.last("LIMIT 1"); OrgPersonnelDO dataObject = orgPersonnelMapper.selectOne(wrapper); return toEntity(dataObject); } @@ -79,7 +102,18 @@ public class OrgPersonnelGatewayImpl implements OrgPersonnelGateway { wrapper.like(OrgPersonnelDO::getUserName, query.getUserName()); } if (StringUtils.hasText(query.getAccount())) { - wrapper.eq(OrgPersonnelDO::getAccount, query.getAccount()); + wrapper.like(OrgPersonnelDO::getAccount, query.getAccount()); + } + if (query.getEmploymentStatusCode() != null) { + wrapper.eq(OrgPersonnelDO::getEmploymentStatusCode, query.getEmploymentStatusCode()); + } + if (query.getPersonnelIds() != null) { + if (query.getPersonnelIds().isEmpty()) { + wrapper.eq(OrgPersonnelDO::getId, -1L); + } + else { + wrapper.in(OrgPersonnelDO::getId, query.getPersonnelIds()); + } } Page page = new Page<>(query.getPageNum(), query.getPageSize()); @@ -94,6 +128,7 @@ public class OrgPersonnelGatewayImpl implements OrgPersonnelGateway { private OrgPersonnelDO toDO(OrgPersonnelEntity entity) { OrgPersonnelDO dataObject = new OrgPersonnelDO(); + dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId())); dataObject.setDeptId(entity.getDeptId()); dataObject.setPostId(entity.getPostId()); dataObject.setUserName(entity.getUserName()); diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPositionGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPositionGatewayImpl.java index 74c3e93..c74d286 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPositionGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPositionGatewayImpl.java @@ -9,6 +9,8 @@ import org.qinan.safetyeval.domain.query.OrgPositionQuery; import org.qinan.safetyeval.domain.query.PageResult; import org.qinan.safetyeval.infrastructure.dataobject.OrgPositionDO; import org.qinan.safetyeval.infrastructure.mapper.OrgPositionMapper; +import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; +import org.qinan.safetyeval.infrastructure.support.OrgContextResolver; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -27,9 +29,13 @@ public class OrgPositionGatewayImpl implements OrgPositionGateway { @Resource private OrgPositionMapper orgPositionMapper; + @Resource + private OrgContextResolver orgContextResolver; + @Override public OrgPositionEntity save(OrgPositionEntity entity) { OrgPositionDO dataObject = toDO(entity); + InsertFieldDefaults.apply(dataObject); orgPositionMapper.insert(dataObject); entity.setId(dataObject.getId()); return entity; @@ -80,9 +86,11 @@ public class OrgPositionGatewayImpl implements OrgPositionGateway { private OrgPositionDO toDO(OrgPositionEntity entity) { OrgPositionDO dataObject = new OrgPositionDO(); + dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId())); dataObject.setDeptId(entity.getDeptId()); dataObject.setPositionName(entity.getPositionName()); dataObject.setDutyDesc(entity.getDutyDesc()); + dataObject.setRemarks(entity.getRemark()); dataObject.setTenantId(entity.getTenantId()); return dataObject; } @@ -96,6 +104,7 @@ public class OrgPositionGatewayImpl implements OrgPositionGateway { entity.setDeptId(dataObject.getDeptId()); entity.setPositionName(dataObject.getPositionName()); entity.setDutyDesc(dataObject.getDutyDesc()); + entity.setRemark(dataObject.getRemarks()); entity.setTenantId(dataObject.getTenantId()); return entity; } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgQualificationGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgQualificationGatewayImpl.java index 96f5578..51897ea 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgQualificationGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgQualificationGatewayImpl.java @@ -9,6 +9,8 @@ import org.qinan.safetyeval.domain.query.OrgQualificationQuery; import org.qinan.safetyeval.domain.query.PageResult; import org.qinan.safetyeval.infrastructure.dataobject.OrgQualificationDO; import org.qinan.safetyeval.infrastructure.mapper.OrgQualificationMapper; +import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; +import org.qinan.safetyeval.infrastructure.support.OrgContextResolver; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -27,9 +29,13 @@ public class OrgQualificationGatewayImpl implements OrgQualificationGateway { @Resource private OrgQualificationMapper orgQualificationMapper; + @Resource + private OrgContextResolver orgContextResolver; + @Override public OrgQualificationEntity save(OrgQualificationEntity entity) { OrgQualificationDO dataObject = toDO(entity); + InsertFieldDefaults.apply(dataObject); orgQualificationMapper.insert(dataObject); entity.setId(dataObject.getId()); return entity; @@ -91,6 +97,7 @@ public class OrgQualificationGatewayImpl implements OrgQualificationGateway { private OrgQualificationDO toDO(OrgQualificationEntity entity) { OrgQualificationDO dataObject = new OrgQualificationDO(); + dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId())); dataObject.setLicenseTypeCode(entity.getLicenseTypeCode()); dataObject.setLicenseTypeName(entity.getLicenseTypeName()); dataObject.setCertName(entity.getCertName()); @@ -101,6 +108,7 @@ public class OrgQualificationGatewayImpl implements OrgQualificationGateway { dataObject.setValidEndDate(entity.getValidEndDate()); dataObject.setCertImageUrl(entity.getCertImageUrl()); dataObject.setEnableFlag(entity.getEnableFlag()); + dataObject.setRemarks(entity.getRemark()); dataObject.setTenantId(entity.getTenantId()); return dataObject; } @@ -121,6 +129,7 @@ public class OrgQualificationGatewayImpl implements OrgQualificationGateway { entity.setValidEndDate(dataObject.getValidEndDate()); entity.setCertImageUrl(dataObject.getCertImageUrl()); entity.setEnableFlag(dataObject.getEnableFlag()); + entity.setRemark(dataObject.getRemarks()); entity.setTenantId(dataObject.getTenantId()); return entity; } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgResignApplyGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgResignApplyGatewayImpl.java index 4910acb..ca0e179 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgResignApplyGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgResignApplyGatewayImpl.java @@ -9,11 +9,15 @@ import org.qinan.safetyeval.domain.query.OrgResignApplyQuery; import org.qinan.safetyeval.domain.query.PageResult; import org.qinan.safetyeval.infrastructure.dataobject.OrgResignApplyDO; import org.qinan.safetyeval.infrastructure.mapper.OrgResignApplyMapper; +import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; +import org.qinan.safetyeval.infrastructure.support.OrgContextResolver; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import javax.annotation.Resource; +import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -27,9 +31,13 @@ public class OrgResignApplyGatewayImpl implements OrgResignApplyGateway { @Resource private OrgResignApplyMapper orgResignApplyMapper; + @Resource + private OrgContextResolver orgContextResolver; + @Override public OrgResignApplyEntity save(OrgResignApplyEntity entity) { OrgResignApplyDO dataObject = toDO(entity); + InsertFieldDefaults.apply(dataObject); orgResignApplyMapper.insert(dataObject); entity.setId(dataObject.getId()); return entity; @@ -67,6 +75,9 @@ public class OrgResignApplyGatewayImpl implements OrgResignApplyGateway { if (query.getAuditStatusCode() != null) { wrapper.eq(OrgResignApplyDO::getAuditStatusCode, query.getAuditStatusCode()); } + if (StringUtils.hasText(query.getApplicantName())) { + wrapper.like(OrgResignApplyDO::getApplicantName, query.getApplicantName()); + } Page page = new Page<>(query.getPageNum(), query.getPageSize()); IPage result = orgResignApplyMapper.selectPage(page, wrapper); @@ -78,8 +89,44 @@ public class OrgResignApplyGatewayImpl implements OrgResignApplyGateway { return PageResult.of(entities, result.getTotal(), result.getCurrent(), result.getSize()); } + @Override + public List listByPersonnelId(Long personnelId) { + if (personnelId == null) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(OrgResignApplyDO::getPersonnelId, personnelId); + wrapper.eq(OrgResignApplyDO::getDeleteEnum, "false"); + wrapper.orderByDesc(OrgResignApplyDO::getApplyTime); + wrapper.orderByDesc(OrgResignApplyDO::getId); + return orgResignApplyMapper.selectList(wrapper).stream() + .map(this::toEntity) + .collect(Collectors.toList()); + } + + @Override + public List listPersonnelIdsByAuditStatus(Integer auditStatusCode, Long orgId) { + if (auditStatusCode == null) { + return Collections.emptyList(); + } + Long resolvedOrgId = orgContextResolver.resolveOrgId(orgId); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(OrgResignApplyDO::getDeleteEnum, "false"); + wrapper.eq(OrgResignApplyDO::getAuditStatusCode, auditStatusCode); + if (resolvedOrgId != null) { + wrapper.eq(OrgResignApplyDO::getOrgId, resolvedOrgId); + } + wrapper.select(OrgResignApplyDO::getPersonnelId); + return orgResignApplyMapper.selectList(wrapper).stream() + .map(OrgResignApplyDO::getPersonnelId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + } + private OrgResignApplyDO toDO(OrgResignApplyEntity entity) { OrgResignApplyDO dataObject = new OrgResignApplyDO(); + dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId())); dataObject.setPersonnelId(entity.getPersonnelId()); dataObject.setApplicantName(entity.getApplicantName()); dataObject.setApplyTime(entity.getApplyTime()); @@ -89,6 +136,7 @@ public class OrgResignApplyGatewayImpl implements OrgResignApplyGateway { dataObject.setAuditStatusCode(entity.getAuditStatusCode()); dataObject.setAuditStatusName(entity.getAuditStatusName()); dataObject.setRejectReason(entity.getRejectReason()); + dataObject.setRemarks(entity.getRemark()); dataObject.setTenantId(entity.getTenantId()); return dataObject; } @@ -108,6 +156,7 @@ public class OrgResignApplyGatewayImpl implements OrgResignApplyGateway { entity.setAuditStatusCode(dataObject.getAuditStatusCode()); entity.setAuditStatusName(dataObject.getAuditStatusName()); entity.setRejectReason(dataObject.getRejectReason()); + entity.setRemark(dataObject.getRemarks()); entity.setTenantId(dataObject.getTenantId()); return entity; } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/handler/MyMetaObjectHandler.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/handler/MyMetaObjectHandler.java index 3b7f38d..02ff992 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/handler/MyMetaObjectHandler.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/handler/MyMetaObjectHandler.java @@ -3,6 +3,7 @@ package org.qinan.safetyeval.infrastructure.handler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.qinan.safetyeval.domain.adapter.UserInfoAdapter; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -27,6 +28,19 @@ public class MyMetaObjectHandler implements MetaObjectHandler { @Resource private UserInfoAdapter userInfoAdapter; + /** 无登录上下文时的回退值(local 联调配置 org-id=1;生产默认 0 不生效) */ + @Value("${safety-eval.public-api.org-id:0}") + private Long fallbackOrgId; + + @Value("${safety-eval.public-api.tenant-id:0}") + private Long fallbackTenantId; + + @Value("${safety-eval.public-api.system-user-id:0}") + private Long fallbackUserId; + + @Value("${safety-eval.public-api.system-user-name:system}") + private String fallbackUserName; + @Override public void insertFill(MetaObject metaObject) { LocalDateTime now = LocalDateTime.now(); @@ -35,6 +49,19 @@ public class MyMetaObjectHandler implements MetaObjectHandler { Long tenantId = userInfoAdapter.getCurrentTenantId(); Long orgId = userInfoAdapter.getCurrentOrgId(); + if (userId == null && fallbackUserId != null && fallbackUserId > 0) { + userId = fallbackUserId; + } + if (userName == null && fallbackUserName != null) { + userName = fallbackUserName; + } + if (tenantId == null && fallbackTenantId != null && fallbackTenantId > 0) { + tenantId = fallbackTenantId; + } + if (orgId == null && fallbackOrgId != null && fallbackOrgId > 0) { + orgId = fallbackOrgId; + } + // 严格填充:仅当字段值为 null 时填充,优先级最低 this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, now); this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, now); @@ -64,6 +91,12 @@ public class MyMetaObjectHandler implements MetaObjectHandler { LocalDateTime now = LocalDateTime.now(); Long userId = userInfoAdapter.getCurrentUserId(); String userName = userInfoAdapter.getCurrentUserName(); + if (userId == null && fallbackUserId != null && fallbackUserId > 0) { + userId = fallbackUserId; + } + if (userName == null && fallbackUserName != null) { + userName = fallbackUserName; + } this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, now); if (userId != null) { diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/InsertFieldDefaults.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/InsertFieldDefaults.java new file mode 100644 index 0000000..9766ffd --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/InsertFieldDefaults.java @@ -0,0 +1,40 @@ +package org.qinan.safetyeval.infrastructure.support; + +import java.lang.reflect.Method; + +/** + * insert 前补齐 GBS 默认字段,避免逻辑删除字段为 null 导致 selectById 查不到。 + */ +public final class InsertFieldDefaults { + + private static final String DELETE_NOT_DELETED = "false"; + private static final String DEFAULT_ENV = "prod"; + + private InsertFieldDefaults() { + } + + public static void apply(Object dataObject) { + if (dataObject == null) { + return; + } + setIfNull(dataObject, "deleteEnum", DELETE_NOT_DELETED); + setIfNull(dataObject, "env", DEFAULT_ENV); + setIfNull(dataObject, "version", 0); + } + + private static void setIfNull(Object target, String property, Object value) { + try { + String getterName = "get" + Character.toUpperCase(property.charAt(0)) + property.substring(1); + Method getter = target.getClass().getMethod(getterName); + if (getter.invoke(target) != null) { + return; + } + String setterName = "set" + Character.toUpperCase(property.charAt(0)) + property.substring(1); + Method setter = target.getClass().getMethod(setterName, value.getClass()); + setter.invoke(target, value); + } + catch (ReflectiveOperationException ignored) { + // 非 GBS 标准 DO 忽略 + } + } +} diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/OrgContextResolver.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/OrgContextResolver.java new file mode 100644 index 0000000..8026e4e --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/OrgContextResolver.java @@ -0,0 +1,34 @@ +package org.qinan.safetyeval.infrastructure.support; + +import org.qinan.safetyeval.domain.adapter.UserInfoAdapter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 解析写入时的 orgId:优先实体值 → 登录上下文 → 配置回退(local 联调 org-id=1)。 + */ +@Component +public class OrgContextResolver { + + @Resource + private UserInfoAdapter userInfoAdapter; + + @Value("${safety-eval.public-api.org-id:0}") + private Long fallbackOrgId; + + public Long resolveOrgId(Long entityOrgId) { + if (entityOrgId != null) { + return entityOrgId; + } + Long orgId = userInfoAdapter.getCurrentOrgId(); + if (orgId != null) { + return orgId; + } + if (fallbackOrgId != null && fallbackOrgId > 0) { + return fallbackOrgId; + } + return null; + } +} diff --git a/safety-eval-infrastructure/src/main/resources/mapper/OrgDepartmentMapper.xml b/safety-eval-infrastructure/src/main/resources/mapper/OrgDepartmentMapper.xml index c515c22..f132c59 100644 --- a/safety-eval-infrastructure/src/main/resources/mapper/OrgDepartmentMapper.xml +++ b/safety-eval-infrastructure/src/main/resources/mapper/OrgDepartmentMapper.xml @@ -9,6 +9,7 @@ + @@ -26,7 +27,7 @@ - `id`, `org_id`, `parent_id`, `dept_name`, `manager_name`, `dept_level_code`, `dept_level_name`, `delete_enum`, `remarks`, `create_name`, `update_name`, `tenant_id`, `version`, `create_time`, `update_time`, `create_id`, `update_id`, `env` + `id`, `org_id`, `parent_id`, `dept_name`, `manager_name`, `manager_account`, `dept_level_code`, `dept_level_name`, `delete_enum`, `remarks`, `create_name`, `update_name`, `tenant_id`, `version`, `create_time`, `update_time`, `create_id`, `update_id`, `env` diff --git a/safety-eval-start/src/main/java/org/qinan/safetyeval/start/config/WebCorsConfig.java b/safety-eval-start/src/main/java/org/qinan/safetyeval/start/config/WebCorsConfig.java new file mode 100644 index 0000000..43598e0 --- /dev/null +++ b/safety-eval-start/src/main/java/org/qinan/safetyeval/start/config/WebCorsConfig.java @@ -0,0 +1,27 @@ +package org.qinan.safetyeval.start.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +/** + * 本地联调跨域配置 + */ +@Configuration +public class WebCorsConfig { + + @Bean + public CorsFilter corsFilter() { + CorsConfiguration config = new CorsConfiguration(); + config.addAllowedOriginPattern("*"); + config.addAllowedHeader("*"); + config.addAllowedMethod("*"); + config.setAllowCredentials(true); + + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } +} diff --git a/safety-eval-start/src/main/resources/application-local.yml b/safety-eval-start/src/main/resources/application-local.yml index b3abfa2..28153f4 100644 --- a/safety-eval-start/src/main/resources/application-local.yml +++ b/safety-eval-start/src/main/resources/application-local.yml @@ -54,3 +54,33 @@ mybatis-plus: logging: level: org.qinan.safetyeval: debug + +# 本地联调:企业信息管理接口免鉴权(覆盖 application.yml 中 security 配置) +safety-eval: + security: + permit-all-paths: + - /v2/api-docs + - /v3/api-docs + permit-all-prefixes: + - /swagger-ui + - /swagger-resources + - /webjars + - /public/org-personnel + - /test + - /tmp + - /mock + - /org-info + - /org-department + - /org-position + - /org-qualification + - /org-personnel + - /org-personnel-cert + - /org-personnel-change + - /org-resign-apply + - /org-equipment + # 本地联调默认用户上下文(与 init-v2.sql 测试数据 @org_id=1 @tenant_id=1001 一致) + public-api: + system-user-id: 1 + system-user-name: local-dev + tenant-id: 1001 + org-id: 1 diff --git a/safety-eval-start/src/main/resources/application.yml b/safety-eval-start/src/main/resources/application.yml index 1279445..9101e85 100644 --- a/safety-eval-start/src/main/resources/application.yml +++ b/safety-eval-start/src/main/resources/application.yml @@ -21,6 +21,7 @@ mybatis-plus: mapper-locations: classpath*:mapper/**/*.xml global-config: db-config: + id-type: assign_id logic-delete-field: deleteEnum logic-delete-value: "true" logic-not-delete-value: "false"