feat: add extension defaults for fault reporting
| | |
| | | - ä½¿ç¨æ° jar éå¯å忬¡æ¥è¯¢ï¼åå¼ ä¸å¡è¡¨ä»å为 `0` è¡ï¼ç»å½æ¥å£ `200`ï¼å端é¦é¡µ `200`ã |
| | | - å½åå端 PID `21528`ï¼çå¬ `8091`ï¼æ¥å¿ï¼`.codex-run/backend-20261007-cleared.out.log`ã`.codex-run/backend-20261007-cleared.err.log`ã |
| | | - å¦ééæ°çå
¥æ¼ç¤ºä¸å¡æ°æ®ï¼å° `app.seed-demo-data` 临æ¶è®¾ä¸º `true` åéå¯ã |
| | | |
| | | ## 26. æ¶å°¾å¿«ç
§ï¼2026-10-07 å¨ä¸ï¼éæ± 28-30 æ©å±å±æ§ä¸æ°å¢æ
éé»è®¤å¼ï¼ |
| | | |
| | | **éæ±å£å¾** |
| | | - éæ± 30 ç¼å·å·²ç¡®è®¤ï¼æ°å¢æ
ééçâ责任âå°±æ¯âè´è´£äººâã |
| | | - é¨é¨æ©å±å±æ§âè´è´£rk_Tâçå¼å°±æ¯ `rk_Xå·`ï¼å¼å¿
é¡»æ¯äº§åç»ææ `side` ç±»åèç¹ï¼åéã |
| | | - æ°å¢æ
éç `rk_Xå·` é»è®¤å¼åªåç»å½ç¨æ·æå±é¨é¨çæ©å±å±æ§ï¼å³ä½¿ç¨æ·æ©å±å±æ§ä¹è®¾ç½®äºâè´è´£rk_Tâï¼ä»ä»¥é¨é¨è®¾ç½®ä¸ºåã |
| | | - ârk_TDä¸ä¸âä¸ç°æârk_Téä¸ä¸âæ¯åä¸å段ï¼ä»£ç åæ®µä¸º `teamMajor`ï¼å½åçé¢ææ¶æ²¿ç¨ârk_Téä¸ä¸âã |
| | | - å¤é¨ `CSICZB_ZB.SYS_DEPT`ã`CSICZB_ZB.SYS_USER` ç±å
¶ä»ç³»ç»ç»´æ¤ï¼æ¬é¡¹ç®åªè¯»ï¼æ©å±å±æ§ä¿åå°æ¬å°æ°è¡¨ã |
| | | |
| | | **æ¬è½®å®æå
容** |
| | | - `DatabaseBootstrap` èªå¨å建 `LX.T_SYS_DEPT_EXT`ï¼`DEPT_ID`ã`RESPONSIBLE_X_NO` åå®¡è®¡åæ®µï¼å `LX.T_SYS_USER_EXT`ï¼`USER_ID`ã`ENGINEERING_MAJOR`ã`TEAM_MAJOR`ã`RESPONSIBLE_X_NO` åå®¡è®¡åæ®µï¼ã |
| | | - ç»ç»æºæé¡µé¢å¢å âæ©å±å±æ§âæé®åå¼¹çªï¼å¯è®¾ç½®é¨é¨âè´è´£rk_Tâï¼å表æ¾ç¤ºå·²è®¾ç½®å¼ã |
| | | - ç¨æ·ç®¡ç页é¢å¢å âæ©å±å±æ§âæé®åå¼¹çªï¼å¯è®¾ç½®å·¥ç¨ä¸ä¸ãrk_Téä¸ä¸ãè´è´£rk_Tï¼å表æ¾ç¤ºæ©å±å±æ§æ¯å¦å·²è®¾ç½®ã |
| | | - æ°å¢æ
éå¼¹çªé»è®¤å¸¦åºï¼ä¸æ¥åä½ä¸ºå½åç»å½äººçåä½ãè´è´£äººä¸ºå½åç»å½äººã`rk_Xå·`为å½åé¨é¨æ©å±å±æ§ãå·¥ç¨ä¸ä¸å rk_Téä¸ä¸ä¸ºå½åç¨æ·æ©å±å±æ§ã |
| | | - ç¨æ·æ©å±å±æ§ä¸ºç©ºæ¶ï¼å·¥ç¨ä¸ä¸å rk_Téä¸ä¸ä¸åé»è®¤éæ©é
ç½®å表第ä¸é¡¹ã |
| | | |
| | | **æ¥å£ä¸æé** |
| | | - `GET/PUT /api/system/depts/{deptId}/ext`ï¼æ¥è¯¢åä¿åé¨é¨æ©å±å±æ§ã |
| | | - `GET/PUT /api/system/users/{userId}/ext`ï¼æ¥è¯¢åä¿åç¨æ·æ©å±å±æ§ã |
| | | - `/api/auth/login`ã`/api/auth/me` è¿å `userId`ã`deptId`ã`engineeringMajor`ã`teamMajor`ã`deptResponsibleXNo`ã`responsibleXNo`ã |
| | | - æé®æéæ°å¢ `system:organization:ext`ï¼æ©å±å±æ§è®¾ç½®ï¼ã`system:users:ext`ï¼æ©å±å±æ§è®¾ç½®ï¼ã |
| | | |
| | | **主è¦åæ´æä»¶** |
| | | - `emergency-repair-server/src/main/java/com/emergencyrepair/auth/AuthController.java` |
| | | - `emergency-repair-server/src/main/java/com/emergencyrepair/bootstrap/DatabaseBootstrap.java` |
| | | - `emergency-repair-server/src/main/java/com/emergencyrepair/business/dto/Requests.java` |
| | | - `emergency-repair-server/src/main/java/com/emergencyrepair/system/controller/SystemController.java` |
| | | - `emergency-repair-server/src/main/java/com/emergencyrepair/system/service/ButtonPermissionCatalog.java` |
| | | - `emergency-repair-server/src/main/java/com/emergencyrepair/system/service/SystemService.java` |
| | | - `emergency-repair-web/src/views/Login.vue` |
| | | - `emergency-repair-web/src/views/fault/FaultReport.vue` |
| | | - `emergency-repair-web/src/views/system/OrganizationManage.vue` |
| | | - `emergency-repair-web/src/views/system/UserManage.vue` |
| | | - `requirement/æ¹è¿20261003.txt`ï¼è¡¥å
éæ± 28-30ï¼ |
| | | |
| | | **éªè¯ç»æ** |
| | | - å端 `mvn -B -DskipTests clean package` éè¿ï¼å端 `npm run build` éè¿ï¼ä»
ææ¢æå
ä½ç§¯åè¦ã |
| | | - `node .codex-run/verify-req28-30.js` è¿å `pass: true`ã |
| | | - é¨é¨ `1390477009348739073 / syåºå` 设置 `rk_Xå·=201`ï¼ç¨æ· `123 / yszl` 设置工ç¨ä¸ä¸ `å¨åä¸ä¸`ãrk_Téä¸ä¸ `æ¶²åä¸ä¸`ãè´è´£ `202`ã |
| | | - æ°å¢æ
éå®é
é»è®¤å¼ä¸ºï¼ä¸æ¥åä½ `syåºå`ãè´è´£äºº `å©çç¨æ·ï¼æ¼ç¤ºï¼`ã`rk_Xå·=201`ãrk_Téä¸ä¸ `æ¶²åä¸ä¸`ãå·¥ç¨ä¸ä¸ `å¨åä¸ä¸`ã |
| | | - æªå¾ï¼`.codex-run/req28-org-ext.png`ã`.codex-run/req29-user-ext.png`ã`.codex-run/req30-fault-defaults.png`ã |
| | | - éªè¯åå·²æ¸
é¤ä¸´æ¶é¨é¨ãç¨æ·æ©å±å±æ§ï¼æ¥è¯¢ç¡®è®¤ `configured=false` ä¸å段为空ã |
| | | |
| | | **å½åè¿è¡ç¶æï¼2026-10-07ï¼** |
| | | - å端 PID `56124`ï¼çå¬ `http://127.0.0.1:8091`ï¼å端 PID `57312`ï¼çå¬ `http://localhost:8082`ã |
| | | - 为 UI éªè¯å¯å¨ç headless Edge PID `95756`ï¼CDP ç«¯å£ `9222`ï¼é
ç½®ç®å½ `.codex-run/edge-profile-req28-30`ã |
| | | - å端æ¥å¿ï¼`.codex-run/backend-20261007-req28-30-final.out.log`ã`.codex-run/backend-20261007-req28-30-final.err.log`ã |
| | | - ç»å½ `admin / admin123`ï¼æ°æ®åº `SYSDBA/SYSDBA`ï¼ä¸å¡ schema `LX`ã |
| | | |
| | | **æ¥ææ³¨æ** |
| | | - å¼åç¯å¢ææè¯é
ç½®ä¼æ `rk_T` æ¾ç¤ºä¸ºâ梯âï¼å æ¤é¡µé¢æªå¾ä¸å¯è½æ¾ç¤ºâè´è´£æ¢¯âï¼ä»£ç ååç«¯åæ®µä»æ¯ `rk_T`ã |
| | | - ä¸è¦æäº¤ `.codex-run`ãOffice éæä»¶æ `emergency-repair-web/public/æ°å»º ææ¬ææ¡£.txt`ã |
| | | - æ¬è½®ä»£ç ãéæ±æä»¶å交æ¥è®°å½ä¸å¹¶æäº¤å¹¶æ¨éå
¬å¸ Git ä»åº `main` 忝ã |
| | |
| | | data.put("realName", StringUtils.hasText(stringValue(user.get("nickName"))) |
| | | ? stringValue(user.get("nickName")) : username); |
| | | data.put("deptName", stringValue(user.get("deptName"))); |
| | | data.put("userId", String.valueOf(user.get("userId"))); |
| | | data.put("deptId", user.get("deptId") == null ? "" : String.valueOf(user.get("deptId"))); |
| | | data.put("engineeringMajor", stringValue(user.get("engineeringMajor"))); |
| | | data.put("teamMajor", stringValue(user.get("teamMajor"))); |
| | | data.put("deptResponsibleXNo", stringValue(user.get("deptResponsibleXNo"))); |
| | | data.put("responsibleXNo", stringValue(user.get("responsibleXNo"))); |
| | | data.put("roles", systemService.roleCodes(username)); |
| | | data.put("permissions", systemService.permissionCodes(username)); |
| | | return Result.ok(data); |
| | |
| | | data.put("realName", StringUtils.hasText(stringValue(user.get("nickName"))) |
| | | ? stringValue(user.get("nickName")) : username); |
| | | data.put("deptName", stringValue(user.get("deptName"))); |
| | | data.put("userId", String.valueOf(user.get("userId"))); |
| | | data.put("deptId", user.get("deptId") == null ? "" : String.valueOf(user.get("deptId"))); |
| | | data.put("engineeringMajor", stringValue(user.get("engineeringMajor"))); |
| | | data.put("teamMajor", stringValue(user.get("teamMajor"))); |
| | | data.put("deptResponsibleXNo", stringValue(user.get("deptResponsibleXNo"))); |
| | | data.put("responsibleXNo", stringValue(user.get("responsibleXNo"))); |
| | | data.put("roles", systemService.roleCodes(username)); |
| | | data.put("permissions", systemService.permissionCodes(username)); |
| | | return Result.ok(data); |
| | |
| | | } |
| | | try { |
| | | List<Map<String, Object>> rows = jdbcTemplate.query( |
| | | "SELECT u.USER_ID, u.USER_NAME, u.NICK_NAME, u.PASSWORD, u.STATUS, d.DEPT_NAME " + |
| | | "FROM LX.SYS_USER u LEFT JOIN LX.SYS_DEPT d ON d.DEPT_ID = u.DEPT_ID " + |
| | | "WHERE u.USER_NAME = ? AND (u.DEL_FLAG = '0' OR u.DEL_FLAG IS NULL)", |
| | | "SELECT u.USER_ID, u.USER_NAME, u.NICK_NAME, u.PASSWORD, u.STATUS, u.DEPT_ID, d.DEPT_NAME, " |
| | | + "ue.ENGINEERING_MAJOR, ue.TEAM_MAJOR, ue.RESPONSIBLE_X_NO AS USER_RESPONSIBLE_X_NO, " |
| | | + "de.RESPONSIBLE_X_NO AS DEPT_RESPONSIBLE_X_NO " |
| | | + "FROM LX.SYS_USER u LEFT JOIN LX.SYS_DEPT d ON d.DEPT_ID = u.DEPT_ID " |
| | | + "LEFT JOIN LX.T_SYS_USER_EXT ue ON ue.USER_ID = u.USER_ID AND (ue.DEL_FLAG = 0 OR ue.DEL_FLAG IS NULL) " |
| | | + "LEFT JOIN LX.T_SYS_DEPT_EXT de ON de.DEPT_ID = u.DEPT_ID AND (de.DEL_FLAG = 0 OR de.DEL_FLAG IS NULL) " |
| | | + "WHERE u.USER_NAME = ? AND (u.DEL_FLAG = '0' OR u.DEL_FLAG IS NULL)", |
| | | new Object[]{username}, |
| | | (rs, rowNum) -> { |
| | | Map<String, Object> row = new LinkedHashMap<>(); |
| | |
| | | row.put("nickName", rs.getString("NICK_NAME")); |
| | | row.put("password", rs.getString("PASSWORD")); |
| | | row.put("status", rs.getString("STATUS")); |
| | | Object deptId = rs.getObject("DEPT_ID"); |
| | | row.put("deptId", deptId == null ? null : rs.getLong("DEPT_ID")); |
| | | row.put("engineeringMajor", rs.getString("ENGINEERING_MAJOR")); |
| | | row.put("teamMajor", rs.getString("TEAM_MAJOR")); |
| | | row.put("responsibleXNo", rs.getString("USER_RESPONSIBLE_X_NO")); |
| | | row.put("deptResponsibleXNo", rs.getString("DEPT_RESPONSIBLE_X_NO")); |
| | | row.put("deptName", rs.getString("DEPT_NAME")); |
| | | return row; |
| | | }); |
| | |
| | | "T_BASE_EQUIPMENT", "T_PRODUCT_TREE", "T_WORK_ORDER", "T_COMPLETION_INFO", |
| | | "T_ACCEPTANCE", "T_SYS_MENU", "T_SYS_ROLE", "T_SYS_ROLE_MENU", |
| | | "T_SYS_TENANT_MENU", "T_SYS_ROLE_USER", "T_SYS_LOGIN_LOG", "T_SYS_OPERATION_LOG", |
| | | "T_SYS_ERROR_LOG" |
| | | "T_SYS_ERROR_LOG", "T_SYS_DEPT_EXT", "T_SYS_USER_EXT" |
| | | }; |
| | | private final JdbcTemplate jdbcTemplate; |
| | | |
| | |
| | | ddl.put("T_SYS_ROLE_MENU", "CREATE TABLE LX.T_SYS_ROLE_MENU (ID BIGINT NOT NULL PRIMARY KEY, ROLE_ID BIGINT, MENU_ID BIGINT, CREATE_TIME TIMESTAMP)"); |
| | | ddl.put("T_SYS_TENANT_MENU", "CREATE TABLE LX.T_SYS_TENANT_MENU (ID BIGINT NOT NULL PRIMARY KEY, TENANT_ID BIGINT, MENU_ID BIGINT, CREATE_TIME TIMESTAMP)"); |
| | | ddl.put("T_SYS_ROLE_USER", "CREATE TABLE LX.T_SYS_ROLE_USER (ID BIGINT NOT NULL PRIMARY KEY, ROLE_ID BIGINT, USER_ID BIGINT, CREATE_TIME TIMESTAMP)"); |
| | | ddl.put("T_SYS_DEPT_EXT", "CREATE TABLE LX.T_SYS_DEPT_EXT (DEPT_ID BIGINT NOT NULL PRIMARY KEY, RESPONSIBLE_X_NO VARCHAR(40), CREATE_BY VARCHAR(120), UPDATE_BY VARCHAR(120), DEL_FLAG INT DEFAULT 0, CREATE_TIME TIMESTAMP, UPDATE_TIME TIMESTAMP)"); |
| | | ddl.put("T_SYS_USER_EXT", "CREATE TABLE LX.T_SYS_USER_EXT (USER_ID BIGINT NOT NULL PRIMARY KEY, ENGINEERING_MAJOR VARCHAR(100), TEAM_MAJOR VARCHAR(100), RESPONSIBLE_X_NO VARCHAR(40), CREATE_BY VARCHAR(120), UPDATE_BY VARCHAR(120), DEL_FLAG INT DEFAULT 0, CREATE_TIME TIMESTAMP, UPDATE_TIME TIMESTAMP)"); |
| | | ddl.put("T_SYS_LOGIN_LOG", "CREATE TABLE LX.T_SYS_LOGIN_LOG (ID BIGINT NOT NULL PRIMARY KEY, USER_ID BIGINT, USER_NAME VARCHAR(120), NICK_NAME VARCHAR(120), DEPT_NAME VARCHAR(120), LOGIN_IP VARCHAR(200), STATUS VARCHAR(20), MESSAGE VARCHAR(500), LOGIN_TIME TIMESTAMP)"); |
| | | ddl.put("T_SYS_OPERATION_LOG", "CREATE TABLE LX.T_SYS_OPERATION_LOG (ID BIGINT NOT NULL PRIMARY KEY, USER_ID BIGINT, USER_NAME VARCHAR(120), NICK_NAME VARCHAR(120), MODULE VARCHAR(100), OPERATION_TYPE VARCHAR(40), TARGET_TYPE VARCHAR(100), TARGET_ID VARCHAR(80), DESCRIPTION VARCHAR(500), REQUEST_METHOD VARCHAR(10), REQUEST_URI VARCHAR(300), RESULT VARCHAR(20), CREATE_TIME TIMESTAMP)"); |
| | | ddl.put("T_SYS_ERROR_LOG", "CREATE TABLE LX.T_SYS_ERROR_LOG (ID BIGINT NOT NULL PRIMARY KEY, USER_ID BIGINT, USER_NAME VARCHAR(120), NICK_NAME VARCHAR(120), MODULE VARCHAR(100), REQUEST_METHOD VARCHAR(10), REQUEST_URI VARCHAR(500), EXCEPTION_TYPE VARCHAR(300), MESSAGE VARCHAR(2000), STACK_TRACE CLOB, ERROR_TIME TIMESTAMP)"); |
| | |
| | | } |
| | | |
| | | @Data |
| | | public static class DeptExtRequest { |
| | | private String responsibleXNo; |
| | | } |
| | | |
| | | @Data |
| | | public static class UserExtRequest { |
| | | private String engineeringMajor; |
| | | private String teamMajor; |
| | | private String responsibleXNo; |
| | | } |
| | | |
| | | @Data |
| | | public static class ButtonSyncRequest { |
| | | private Long menuId; |
| | | private List<String> codes = new ArrayList<>(); |
| | |
| | | return Result.ok(); |
| | | } |
| | | |
| | | @GetMapping("/users/{userId}/ext") |
| | | public Result<Map<String, Object>> userExt(@PathVariable Long userId) { |
| | | return Result.ok(systemService.userExt(userId)); |
| | | } |
| | | |
| | | @PutMapping("/users/{userId}/ext") |
| | | public Result<Void> saveUserExt(@PathVariable Long userId, @RequestBody Requests.UserExtRequest request) { |
| | | systemService.saveUserExt(userId, request.getEngineeringMajor(), request.getTeamMajor(), request.getResponsibleXNo()); |
| | | return Result.ok(); |
| | | } |
| | | |
| | | @PutMapping("/users/roles/batch") |
| | | public Result<Void> saveBatchUserRoles(@RequestBody Requests.BatchUserRoleRequest request) { |
| | | systemService.saveUserRolesBatch(request.getUserIds(), request.getRoleIds(), request.getMode()); |
| | |
| | | return Result.ok(systemService.depts()); |
| | | } |
| | | |
| | | @GetMapping("/depts/{deptId}/ext") |
| | | public Result<Map<String, Object>> deptExt(@PathVariable Long deptId) { |
| | | return Result.ok(systemService.deptExt(deptId)); |
| | | } |
| | | |
| | | @PutMapping("/depts/{deptId}/ext") |
| | | public Result<Void> saveDeptExt(@PathVariable Long deptId, @RequestBody Requests.DeptExtRequest request) { |
| | | systemService.saveDeptExt(deptId, request.getResponsibleXNo()); |
| | | return Result.ok(); |
| | | } |
| | | |
| | | @GetMapping("/login-logs") |
| | | public Result<Page<SysLoginLog>> loginLogs(@RequestParam(defaultValue = "1") int current, |
| | | @RequestParam(defaultValue = "20") int size, |
| | |
| | | put("/reports/contractors", def("report:common:query", "\u67e5\u8be2"), def("report:common:export", "\u5bfc\u51fa")); |
| | | put("/reports/trend", def("report:common:query", "\u67e5\u8be2"), def("report:common:export", "\u5bfc\u51fa")); |
| | | put("/system/product-tree", def("system:tree:add", "\u65b0\u589e"), def("system:tree:edit", "\u7f16\u8f91"), def("system:tree:delete", "\u5220\u9664")); |
| | | put("/system/organization", def("system:organization:query", "\u67e5\u8be2"), def("system:organization:ext", "\u6269\u5c55\u5c5e\u6027\u8bbe\u7f6e")); |
| | | put("/system/base-equipment", def("system:tree:add", "\u65b0\u589e"), def("system:tree:edit", "\u7f16\u8f91"), def("system:tree:delete", "\u5220\u9664")); |
| | | put("/system/engineering-majors", def("system:major:add", "\u65b0\u589e"), def("system:major:edit", "\u7f16\u8f91"), def("system:major:delete", "\u5220\u9664")); |
| | | put("/system/team-majors", def("system:major:add", "\u65b0\u589e"), def("system:major:edit", "\u7f16\u8f91"), def("system:major:delete", "\u5220\u9664")); |
| | | put("/system/users", def("system:users:query", "\u67e5\u8be2"), def("system:users:assign", "\u89d2\u8272\u6388\u6743")); |
| | | put("/system/users", def("system:users:query", "\u67e5\u8be2"), def("system:users:assign", "\u89d2\u8272\u6388\u6743"), def("system:users:ext", "\u6269\u5c55\u5c5e\u6027\u8bbe\u7f6e")); |
| | | put("/system/roles", def("system:roles:add", "\u65b0\u589e"), def("system:roles:edit", "\u7f16\u8f91"), def("system:roles:delete", "\u5220\u9664"), def("system:roles:assign", "\u7528\u6237\u8bbe\u7f6e"), def("system:roles:permission", "\u6743\u9650\u8bbe\u7f6e")); |
| | | put("/system/menus", def("system:menus:add", "\u65b0\u589e"), def("system:menus:edit", "\u7f16\u8f91"), def("system:menus:delete", "\u5220\u9664"), def("system:menus:buttons", "\u83dc\u5355\u6309\u94ae\u540c\u6b65")); |
| | | put("/system/login-logs", def("system:login-logs:query", "\u67e5\u8be2"), def("system:login-logs:export", "\u5bfc\u51fa")); |
| | |
| | | import com.emergencyrepair.business.mapper.ProductNodeMapper; |
| | | import com.emergencyrepair.business.mapper.TeamMajorMapper; |
| | | import com.emergencyrepair.common.BusinessException; |
| | | import com.emergencyrepair.common.audit.CurrentUserContext; |
| | | import com.emergencyrepair.system.entity.SysMenu; |
| | | import com.emergencyrepair.system.entity.SysErrorLog; |
| | | import com.emergencyrepair.system.entity.SysLoginLog; |
| | |
| | | public Map<String, Object> userPage(String keyword, Long deptId, Long roleId, int current, int size) { |
| | | List<Object> args = new ArrayList<>(); |
| | | StringBuilder sql = new StringBuilder(); |
| | | sql.append("SELECT u.USER_ID, u.USER_NAME, u.NICK_NAME, u.DEPT_ID, d.DEPT_NAME, u.PHONENUMBER, u.STATUS, u.LOGIN_DATE "); |
| | | sql.append("SELECT u.USER_ID, u.USER_NAME, u.NICK_NAME, u.DEPT_ID, d.DEPT_NAME, u.PHONENUMBER, u.STATUS, u.LOGIN_DATE, "); |
| | | sql.append("ue.ENGINEERING_MAJOR, ue.TEAM_MAJOR, ue.RESPONSIBLE_X_NO, CASE WHEN ue.USER_ID IS NULL THEN 0 ELSE 1 END AS EXT_CONFIGURED "); |
| | | sql.append("FROM CSICZB_ZB.SYS_USER u LEFT JOIN CSICZB_ZB.SYS_DEPT d ON d.DEPT_ID = u.DEPT_ID "); |
| | | sql.append("LEFT JOIN LX.T_SYS_USER_EXT ue ON ue.USER_ID = u.USER_ID AND (ue.DEL_FLAG = 0 OR ue.DEL_FLAG IS NULL) "); |
| | | sql.append("WHERE (u.DEL_FLAG = '0' OR u.DEL_FLAG IS NULL) "); |
| | | if (StringUtils.hasText(keyword)) { |
| | | sql.append("AND (u.USER_NAME LIKE ? OR u.NICK_NAME LIKE ?) "); |
| | |
| | | row.put("status", rs.getString("STATUS")); |
| | | java.sql.Timestamp loginDate = rs.getTimestamp("LOGIN_DATE"); |
| | | row.put("loginDate", loginDate == null ? null : loginDate.toLocalDateTime().toString().replace('T', ' ')); |
| | | row.put("engineeringMajor", rs.getString("ENGINEERING_MAJOR")); |
| | | row.put("teamMajor", rs.getString("TEAM_MAJOR")); |
| | | row.put("responsibleXNo", rs.getString("RESPONSIBLE_X_NO")); |
| | | row.put("extConfigured", rs.getInt("EXT_CONFIGURED") == 1); |
| | | row.put("roles", new ArrayList<Map<String, Object>>()); |
| | | return row; |
| | | }); |
| | |
| | | |
| | | public List<Map<String, Object>> depts() { |
| | | return jdbcTemplate.query( |
| | | "SELECT DEPT_ID, DEPT_NAME, PARENT_ID, ORDER_NUM, DEPT_TYPE, LEADER, PHONE, STATUS, DEPT_CODE FROM CSICZB_ZB.SYS_DEPT WHERE (DEL_FLAG = '0' OR DEL_FLAG IS NULL) ORDER BY ORDER_NUM, DEPT_ID", |
| | | "SELECT d.DEPT_ID, d.DEPT_NAME, d.PARENT_ID, d.ORDER_NUM, d.DEPT_TYPE, d.LEADER, d.PHONE, d.STATUS, d.DEPT_CODE, " |
| | | + "e.RESPONSIBLE_X_NO, CASE WHEN e.DEPT_ID IS NULL THEN 0 ELSE 1 END AS EXT_CONFIGURED " |
| | | + "FROM CSICZB_ZB.SYS_DEPT d " |
| | | + "LEFT JOIN LX.T_SYS_DEPT_EXT e ON e.DEPT_ID = d.DEPT_ID AND (e.DEL_FLAG = 0 OR e.DEL_FLAG IS NULL) " |
| | | + "WHERE (d.DEL_FLAG = '0' OR d.DEL_FLAG IS NULL) ORDER BY d.ORDER_NUM, d.DEPT_ID", |
| | | (rs, rowNum) -> { |
| | | Map<String, Object> row = new LinkedHashMap<>(); |
| | | row.put("id", String.valueOf(rs.getLong("DEPT_ID"))); |
| | |
| | | row.put("phone", rs.getString("PHONE")); |
| | | row.put("status", rs.getString("STATUS")); |
| | | row.put("deptCode", rs.getString("DEPT_CODE")); |
| | | row.put("responsibleXNo", rs.getString("RESPONSIBLE_X_NO")); |
| | | row.put("extConfigured", rs.getInt("EXT_CONFIGURED") == 1); |
| | | return row; |
| | | }); |
| | | } |
| | | |
| | | public Map<String, Object> deptExt(Long deptId) { |
| | | List<Map<String, Object>> rows = jdbcTemplate.query( |
| | | "SELECT d.DEPT_NAME, e.RESPONSIBLE_X_NO FROM CSICZB_ZB.SYS_DEPT d " |
| | | + "LEFT JOIN LX.T_SYS_DEPT_EXT e ON e.DEPT_ID = d.DEPT_ID AND (e.DEL_FLAG = 0 OR e.DEL_FLAG IS NULL) " |
| | | + "WHERE d.DEPT_ID = ? AND (d.DEL_FLAG = '0' OR d.DEL_FLAG IS NULL)", |
| | | new Object[]{deptId}, (rs, rowNum) -> { |
| | | Map<String, Object> row = new LinkedHashMap<>(); |
| | | row.put("deptId", String.valueOf(deptId)); |
| | | row.put("deptName", rs.getString("DEPT_NAME")); |
| | | row.put("responsibleXNo", rs.getString("RESPONSIBLE_X_NO")); |
| | | row.put("configured", StringUtils.hasText(rs.getString("RESPONSIBLE_X_NO"))); |
| | | return row; |
| | | }); |
| | | if (rows.isEmpty()) { |
| | | throw new BusinessException("é¨é¨ä¸åå¨"); |
| | | } |
| | | return rows.get(0); |
| | | } |
| | | |
| | | @Transactional |
| | | public void saveDeptExt(Long deptId, String responsibleXNo) { |
| | | assertExternalDept(deptId); |
| | | String xNo = normalizeExtValue(responsibleXNo); |
| | | assertKnownXNo(xNo); |
| | | String username = CurrentUserContext.get(); |
| | | LocalDateTime now = LocalDateTime.now(); |
| | | int delFlag = xNo == null ? 1 : 0; |
| | | int updated = jdbcTemplate.update( |
| | | "UPDATE LX.T_SYS_DEPT_EXT SET RESPONSIBLE_X_NO = ?, DEL_FLAG = ?, UPDATE_BY = ?, UPDATE_TIME = ? WHERE DEPT_ID = ?", |
| | | xNo, delFlag, username, now, deptId); |
| | | if (updated == 0) { |
| | | jdbcTemplate.update( |
| | | "INSERT INTO LX.T_SYS_DEPT_EXT (DEPT_ID, RESPONSIBLE_X_NO, CREATE_BY, UPDATE_BY, DEL_FLAG, CREATE_TIME, UPDATE_TIME) VALUES (?, ?, ?, ?, ?, ?, ?)", |
| | | deptId, xNo, username, username, delFlag, now, now); |
| | | } |
| | | } |
| | | |
| | | public Map<String, Object> userExt(Long userId) { |
| | | List<Map<String, Object>> rows = jdbcTemplate.query( |
| | | "SELECT u.USER_NAME, u.NICK_NAME, e.ENGINEERING_MAJOR, e.TEAM_MAJOR, e.RESPONSIBLE_X_NO " |
| | | + "FROM CSICZB_ZB.SYS_USER u " |
| | | + "LEFT JOIN LX.T_SYS_USER_EXT e ON e.USER_ID = u.USER_ID AND (e.DEL_FLAG = 0 OR e.DEL_FLAG IS NULL) " |
| | | + "WHERE u.USER_ID = ? AND (u.DEL_FLAG = '0' OR u.DEL_FLAG IS NULL)", |
| | | new Object[]{userId}, (rs, rowNum) -> { |
| | | Map<String, Object> row = new LinkedHashMap<>(); |
| | | row.put("userId", String.valueOf(userId)); |
| | | row.put("userName", rs.getString("USER_NAME")); |
| | | row.put("nickName", rs.getString("NICK_NAME")); |
| | | row.put("engineeringMajor", rs.getString("ENGINEERING_MAJOR")); |
| | | row.put("teamMajor", rs.getString("TEAM_MAJOR")); |
| | | row.put("responsibleXNo", rs.getString("RESPONSIBLE_X_NO")); |
| | | boolean configured = StringUtils.hasText(rs.getString("ENGINEERING_MAJOR")) |
| | | || StringUtils.hasText(rs.getString("TEAM_MAJOR")) |
| | | || StringUtils.hasText(rs.getString("RESPONSIBLE_X_NO")); |
| | | row.put("configured", configured); |
| | | return row; |
| | | }); |
| | | if (rows.isEmpty()) { |
| | | throw new BusinessException("ç¨æ·ä¸åå¨"); |
| | | } |
| | | return rows.get(0); |
| | | } |
| | | |
| | | @Transactional |
| | | public void saveUserExt(Long userId, String engineeringMajor, String teamMajor, String responsibleXNo) { |
| | | assertExternalUser(userId); |
| | | String engineering = normalizeExtValue(engineeringMajor); |
| | | String team = normalizeExtValue(teamMajor); |
| | | String xNo = normalizeExtValue(responsibleXNo); |
| | | assertKnownEngineeringMajor(engineering); |
| | | assertKnownTeamMajor(team); |
| | | assertKnownXNo(xNo); |
| | | boolean configured = engineering != null || team != null || xNo != null; |
| | | String username = CurrentUserContext.get(); |
| | | LocalDateTime now = LocalDateTime.now(); |
| | | int updated = jdbcTemplate.update( |
| | | "UPDATE LX.T_SYS_USER_EXT SET ENGINEERING_MAJOR = ?, TEAM_MAJOR = ?, RESPONSIBLE_X_NO = ?, DEL_FLAG = ?, UPDATE_BY = ?, UPDATE_TIME = ? WHERE USER_ID = ?", |
| | | engineering, team, xNo, configured ? 0 : 1, username, now, userId); |
| | | if (updated == 0) { |
| | | jdbcTemplate.update( |
| | | "INSERT INTO LX.T_SYS_USER_EXT (USER_ID, ENGINEERING_MAJOR, TEAM_MAJOR, RESPONSIBLE_X_NO, CREATE_BY, UPDATE_BY, DEL_FLAG, CREATE_TIME, UPDATE_TIME) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", |
| | | userId, engineering, team, xNo, username, username, configured ? 0 : 1, now, now); |
| | | } |
| | | } |
| | | |
| | | private void assertExternalDept(Long deptId) { |
| | | if (deptId == null) { |
| | | throw new BusinessException("è¯·éæ©é¨é¨"); |
| | | } |
| | | Integer count = jdbcTemplate.queryForObject( |
| | | "SELECT COUNT(*) FROM CSICZB_ZB.SYS_DEPT WHERE DEPT_ID = ? AND (DEL_FLAG = '0' OR DEL_FLAG IS NULL)", |
| | | Integer.class, deptId); |
| | | if (count == null || count == 0) { |
| | | throw new BusinessException("é¨é¨ä¸åå¨"); |
| | | } |
| | | } |
| | | |
| | | private void assertExternalUser(Long userId) { |
| | | if (userId == null) { |
| | | throw new BusinessException("è¯·éæ©ç¨æ·"); |
| | | } |
| | | Integer count = jdbcTemplate.queryForObject( |
| | | "SELECT COUNT(*) FROM CSICZB_ZB.SYS_USER WHERE USER_ID = ? AND (DEL_FLAG = '0' OR DEL_FLAG IS NULL)", |
| | | Integer.class, userId); |
| | | if (count == null || count == 0) { |
| | | throw new BusinessException("ç¨æ·ä¸åå¨"); |
| | | } |
| | | } |
| | | |
| | | private void assertKnownXNo(String xNo) { |
| | | if (xNo != null && !productXNumbers().contains(xNo)) { |
| | | throw new BusinessException("rk_Xå·å¿
é¡»ä»äº§åç»ææ çsideèç¹ä¸éæ©"); |
| | | } |
| | | } |
| | | |
| | | private void assertKnownEngineeringMajor(String value) { |
| | | if (value != null && listEngineeringMajors().stream().map(EngineeringMajor::getName) |
| | | .filter(StringUtils::hasText).noneMatch(item -> value.equals(item.trim()))) { |
| | | throw new BusinessException("å·¥ç¨ä¸ä¸ä¸å¨å¯éèå´å
"); |
| | | } |
| | | } |
| | | |
| | | private void assertKnownTeamMajor(String value) { |
| | | if (value != null && listTeamMajors().stream().map(TeamMajor::getName) |
| | | .filter(StringUtils::hasText).noneMatch(item -> value.equals(item.trim()))) { |
| | | throw new BusinessException("rk_Téä¸ä¸ä¸å¨å¯éèå´å
"); |
| | | } |
| | | } |
| | | |
| | | private String normalizeExtValue(String value) { |
| | | return StringUtils.hasText(value) ? value.trim() : null; |
| | | } |
| | | |
| | | public List<String> userRoleIds(Long userId) { |
| | | if (userId == null) { |
| | | return new ArrayList<>(); |
| | |
| | | sessionStorage.setItem('username', res.data.username) |
| | | sessionStorage.setItem('realName', res.data.realName) |
| | | sessionStorage.setItem('deptName', res.data.deptName || '') |
| | | sessionStorage.setItem('userId', res.data.userId || '') |
| | | sessionStorage.setItem('deptId', res.data.deptId || '') |
| | | sessionStorage.setItem('engineeringMajor', res.data.engineeringMajor || '') |
| | | sessionStorage.setItem('teamMajor', res.data.teamMajor || '') |
| | | sessionStorage.setItem('deptResponsibleXNo', res.data.deptResponsibleXNo || '') |
| | | sessionStorage.setItem('responsibleXNo', res.data.responsibleXNo || '') |
| | | sessionStorage.setItem('roles', JSON.stringify(res.data.roles || [])) |
| | | sessionStorage.setItem('permissions', JSON.stringify(res.data.permissions || [])) |
| | | this.$router.push('/dashboard') |
| | |
| | | taskMeta(value) { return statusMeta(taskStatuses, value) }, |
| | | yesNo(value) { return Number(value) === 1 ? '\u662f' : '\u5426' }, |
| | | loadAccountInfo() { |
| | | if (sessionStorage.getItem('deptName') !== null) return |
| | | api.get('/auth/me').then(res => { |
| | | return api.get('/auth/me').then(res => { |
| | | const info = res.data || {} |
| | | sessionStorage.setItem('realName', info.realName || sessionStorage.getItem('realName') || '') |
| | | sessionStorage.setItem('deptName', info.deptName || '') |
| | | if (this.form && !this.form.id && !this.form.reportUnit) this.form.reportUnit = info.deptName || '' |
| | | sessionStorage.setItem('userId', info.userId || '') |
| | | sessionStorage.setItem('deptId', info.deptId || '') |
| | | sessionStorage.setItem('engineeringMajor', info.engineeringMajor || '') |
| | | sessionStorage.setItem('teamMajor', info.teamMajor || '') |
| | | sessionStorage.setItem('deptResponsibleXNo', info.deptResponsibleXNo || '') |
| | | sessionStorage.setItem('responsibleXNo', info.responsibleXNo || '') |
| | | }) |
| | | }, |
| | | loadMajors() { |
| | | api.get('/system/team-majors').then(res => { |
| | | this.teamMajors = res.data || [] |
| | | if (!this.form.teamMajor && this.teamMajors.length) this.form.teamMajor = this.teamMajors[0].name |
| | | }) |
| | | api.get('/system/engineering-majors').then(res => { |
| | | this.engineeringMajors = res.data || [] |
| | | if (!this.form.engineeringMajor && this.engineeringMajors.length) this.form.engineeringMajor = this.engineeringMajors[0].name |
| | | }) |
| | | }, |
| | | loadXNumbers() { |
| | |
| | | faultCode: '', |
| | | reportUnit: sessionStorage.getItem('deptName') || '', |
| | | reportDate: today, |
| | | xNo: '', |
| | | owner: sessionStorage.getItem('realName') || 'rk_Tå', |
| | | teamMajor: (this.teamMajors[0] || {}).name || '', |
| | | engineeringMajor: (this.engineeringMajors[0] || {}).name || '', |
| | | xNo: sessionStorage.getItem('deptResponsibleXNo') || '', |
| | | owner: sessionStorage.getItem('realName') || '', |
| | | teamMajor: sessionStorage.getItem('teamMajor') || '', |
| | | engineeringMajor: sessionStorage.getItem('engineeringMajor') || '', |
| | | equipmentIds: '', |
| | | equipmentName: '', |
| | | parentSystem: '', |
| | |
| | | remark: '' |
| | | } |
| | | }, |
| | | openCreate() { |
| | | async openCreate() { |
| | | try { |
| | | await this.loadAccountInfo() |
| | | } catch (e) {} |
| | | this.form = this.blankForm() |
| | | this.dialogVisible = true |
| | | }, |
| | |
| | | </el-table-column> |
| | | <el-table-column prop="leader" label="è´è´£äºº" width="120"></el-table-column> |
| | | <el-table-column prop="phone" label="èç³»çµè¯" width="150"></el-table-column> |
| | | <el-table-column prop="responsibleXNo" label="è´è´£rk_T" width="110" align="center"> |
| | | <template slot-scope="{ row }"> |
| | | <el-tag v-if="row.responsibleXNo" size="mini" type="success">{{ row.responsibleXNo }}</el-tag> |
| | | <span v-else class="muted">æªè®¾ç½®</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="orderNum" label="æåº" width="80" align="center"></el-table-column> |
| | | <el-table-column label="ç¶æ" width="90" align="center"> |
| | | <template slot-scope="{ row }"> |
| | | <el-tag size="mini" :type="row.status === '1' ? 'info' : 'success'">{{ row.status === '1' ? 'åç¨' : 'æ£å¸¸' }}</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" width="120" align="center" fixed="right"> |
| | | <template slot-scope="{ row }"> |
| | | <el-button type="text" icon="el-icon-setting" v-permission="'system:organization:ext'" @click="openExt(row)">æ©å±å±æ§</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | |
| | | <el-dialog :title="'æ©å±å±æ§è®¾ç½® - ' + (currentDept.name || '')" :visible.sync="extVisible" width="520px" append-to-body :close-on-click-modal="false"> |
| | | <el-form label-width="105px" v-loading="extLoading"> |
| | | <el-form-item label="è´è´£rk_T"> |
| | | <el-select v-model="extForm.responsibleXNo" clearable filterable placeholder="è¯·éæ©rk_Xå·" style="width:100%"> |
| | | <el-option v-for="item in xNumbers" :key="item" :label="item" :value="item"></el-option> |
| | | </el-select> |
| | | <div class="field-tip">è¯¥å¼æ°å¢æ
éæ¶ä½ä¸ºrk_Xå·é»è®¤å¼ï¼ä»¥é¨é¨è®¾ç½®ä¸ºåã</div> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template slot="footer"> |
| | | <el-button @click="extVisible = false">åæ¶</el-button> |
| | | <el-button type="primary" :loading="extSaving" @click="saveExt">ä¿å</el-button> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | <script> |
| | |
| | | loading: false, |
| | | rows: [], |
| | | keyword: '', |
| | | deptType: '' |
| | | deptType: '', |
| | | extVisible: false, |
| | | extLoading: false, |
| | | extSaving: false, |
| | | currentDept: {}, |
| | | extForm: { responsibleXNo: '' }, |
| | | xNumbers: [] |
| | | } |
| | | }, |
| | | computed: { |
| | |
| | | return walk(this.tree) |
| | | } |
| | | }, |
| | | created() { this.load() }, |
| | | created() { this.load(); this.loadXNumbers() }, |
| | | methods: { |
| | | load() { |
| | | this.loading = true |
| | | api.get('/system/depts').then(res => { |
| | | this.rows = res.data || [] |
| | | }).finally(() => { this.loading = false }) |
| | | }, |
| | | loadXNumbers() { |
| | | api.get('/system/tree/product/x-numbers').then(res => { this.xNumbers = res.data || [] }) |
| | | }, |
| | | openExt(row) { |
| | | this.currentDept = { ...row } |
| | | this.extForm = { responsibleXNo: row.responsibleXNo || '' } |
| | | this.extVisible = true |
| | | this.extLoading = true |
| | | api.get('/system/depts/' + row.id + '/ext').then(res => { |
| | | const data = res.data || {} |
| | | this.extForm = { responsibleXNo: data.responsibleXNo || '' } |
| | | }).finally(() => { this.extLoading = false }) |
| | | }, |
| | | saveExt() { |
| | | if (!this.currentDept.id) return |
| | | this.extSaving = true |
| | | api.put('/system/depts/' + this.currentDept.id + '/ext', this.extForm).then(() => { |
| | | this.$message.success('æ©å±å±æ§è®¾ç½®æå') |
| | | this.extVisible = false |
| | | this.load() |
| | | }).finally(() => { this.extSaving = false }) |
| | | }, |
| | | buildTree(rows) { |
| | | const nodes = rows.map(row => ({ ...row, children: [] })) |
| | |
| | | </script> |
| | | <style scoped> |
| | | .summary { color: #6d7f91; font-size: 13px; } |
| | | .muted { color: #a3afbc; font-size: 12px; } |
| | | .field-tip { margin-top: 4px; color: #7b8a99; font-size: 12px; line-height: 18px; } |
| | | </style> |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="phoneNumber" label="ææºå·" width="130"></el-table-column> |
| | | <el-table-column label="æ©å±å±æ§" width="100" align="center"> |
| | | <template slot-scope="{ row }"> |
| | | <el-button type="text" v-permission="'system:users:ext'" @click="openExt(row)">{{ row.extConfigured ? 'ç¼è¾' : '设置' }}</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç¶æ" width="80" align="center"> |
| | | <template slot-scope="{ row }"> |
| | | <el-tag size="mini" :type="isDisabled(row) ? 'info' : 'success'">{{ isDisabled(row) ? 'åç¨' : 'æ£å¸¸' }}</el-tag> |
| | |
| | | <el-button type="primary" :loading="batchSaving" v-permission="'system:users:assign'" @click="saveBatchRoles">ä¿å</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | <el-dialog :title="'ç¨æ·æ©å±å±æ§è®¾ç½® - ' + ((currentExtUser.nickName || currentExtUser.userName) || '')" :visible.sync="extVisible" width="560px" append-to-body :close-on-click-modal="false"> |
| | | <el-form label-width="105px" v-loading="extLoading"> |
| | | <el-form-item label="å·¥ç¨ä¸ä¸"> |
| | | <el-select v-model="extForm.engineeringMajor" clearable filterable placeholder="è¯·éæ©å·¥ç¨ä¸ä¸" style="width:100%"> |
| | | <el-option v-for="item in engineeringMajors" :key="item.id" :label="item.name" :value="item.name"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="rk_Téä¸ä¸"> |
| | | <el-select v-model="extForm.teamMajor" clearable filterable placeholder="è¯·éæ©rk_Téä¸ä¸" style="width:100%"> |
| | | <el-option v-for="item in teamMajors" :key="item.id" :label="item.name" :value="item.name"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="è´è´£rk_T"> |
| | | <el-select v-model="extForm.responsibleXNo" clearable filterable placeholder="è¯·éæ©rk_Xå·" style="width:100%"> |
| | | <el-option v-for="item in xNumbers" :key="item" :label="item" :value="item"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template slot="footer"> |
| | | <el-button @click="extVisible = false">åæ¶</el-button> |
| | | <el-button type="primary" :loading="extSaving" @click="saveExt">ä¿å</el-button> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | <script> |
| | |
| | | roles: [], |
| | | selected: null, |
| | | checkedRoleIds: [], |
| | | extVisible: false, |
| | | extLoading: false, |
| | | extSaving: false, |
| | | currentExtUser: {}, |
| | | extForm: { engineeringMajor: '', teamMajor: '', responsibleXNo: '' }, |
| | | engineeringMajors: [], |
| | | teamMajors: [], |
| | | xNumbers: [], |
| | | filters: { keyword: '', deptId: null, roleId: null } |
| | | } |
| | | }, |
| | | created() { |
| | | this.loadRoles() |
| | | this.loadDepts() |
| | | this.loadExtOptions() |
| | | this.load() |
| | | }, |
| | | methods: { |
| | |
| | | loadDepts() { |
| | | api.get('/system/depts').then(res => { this.depts = res.data || [] }) |
| | | }, |
| | | loadExtOptions() { |
| | | api.get('/system/engineering-majors').then(res => { this.engineeringMajors = res.data || [] }) |
| | | api.get('/system/team-majors').then(res => { this.teamMajors = res.data || [] }) |
| | | api.get('/system/tree/product/x-numbers').then(res => { this.xNumbers = res.data || [] }) |
| | | }, |
| | | openExt(row) { |
| | | this.currentExtUser = { ...row } |
| | | this.extForm = { engineeringMajor: '', teamMajor: '', responsibleXNo: '' } |
| | | this.extVisible = true |
| | | this.extLoading = true |
| | | api.get('/system/users/' + row.userId + '/ext').then(res => { |
| | | const data = res.data || {} |
| | | this.extForm = { |
| | | engineeringMajor: data.engineeringMajor || '', |
| | | teamMajor: data.teamMajor || '', |
| | | responsibleXNo: data.responsibleXNo || '' |
| | | } |
| | | }).finally(() => { this.extLoading = false }) |
| | | }, |
| | | saveExt() { |
| | | if (!this.currentExtUser.userId) return |
| | | this.extSaving = true |
| | | api.put('/system/users/' + this.currentExtUser.userId + '/ext', this.extForm).then(() => { |
| | | this.$message.success('æ©å±å±æ§è®¾ç½®æå') |
| | | this.extVisible = false |
| | | this.load() |
| | | }).finally(() => { this.extSaving = false }) |
| | | }, |
| | | search() { |
| | | this.current = 1 |
| | | this.load() |
| | |
| | | - æ¸
空åï¼æ
é `23`ãæ´¾å·¥å `8`ãå®å·¥ä¿¡æ¯ `6`ãéªæ¶ `6`ï¼æ¸
空åå `0`ã |
| | | - å端 `mvn -B -DskipTests clean package` éè¿ï¼æ° jar éå¯åå表ä»å为 `0`ã |
| | | - å½åå端 PID `21528`ï¼çå¬ `8091`ï¼å端 PID `57312`ï¼çå¬ `8082`ï¼å端é误æ¥å¿ä¸ºç©ºã |
| | | |
| | | ## äºåã2026-10-07 èè°æ¶å°¾ï¼éæ± 28-30ï¼ |
| | | |
| | | | åºå· | éæ± | ç¶æ | å®ç°ä¸éªè¯ | |
| | | | --- | --- | --- | --- | |
| | | | 28 | ç»ç»æºæå¢å æ©å±å±æ§è®¾ç½®ï¼è®¾ç½®é¨é¨è´è´£rk_T | 已宿 | ç»ç»æºæå表å¢å âæ©å±å±æ§âæé®åå¼¹çªï¼ä»äº§åç»ææ `side` èç¹ä¸åé `rk_Xå·`ï¼ä¿åå° `LX.T_SYS_DEPT_EXT`ï¼ä¸ä¿®æ¹å¤é¨ `SYS_DEPT` | |
| | | | 29 | ç¨æ·ç®¡çå¢å æ©å±å±æ§è®¾ç½® | 已宿 | å¯è®¾ç½®å·¥ç¨ä¸ä¸ãrk_Téä¸ä¸ãè´è´£rk_Tï¼ä¿åå° `LX.T_SYS_USER_EXT`ï¼ä¸ä¿®æ¹å¤é¨ `SYS_USER`ï¼rk_TDä¸ä¸ä¸ç°æ `teamMajor` 为åä¸å段 | |
| | | | 30 | æ°å¢æ
éé»è®¤å¼ | 已宿 | 䏿¥åä½åç»å½ç¨æ·åä½ï¼è´è´£äººåç»å½ç¨æ·ï¼`rk_Xå·`åªåé¨é¨æ©å±å±æ§ï¼å·¥ç¨ä¸ä¸årk_Téä¸ä¸åç¨æ·æ©å±å±æ§ï¼æªé
ç½®æ¶ç空ï¼ä¸ååå表第ä¸é¡¹ | |
| | | |
| | | ### 20.1 确认å£å¾ |
| | | |
| | | - éæ± 30 ç¼å·æ£ç¡®ï¼æ°å¢æ
ééçâ责任âå°±æ¯âè´è´£äººâã |
| | | - é¨é¨æ©å±å±æ§âè´è´£rk_Tâå°±æ¯ `rk_Xå·`ï¼åéï¼æ°å¢æ
éç `rk_Xå·` åªä»¥é¨é¨è®¾ç½®ä¸ºåï¼å³ä½¿ç¨æ·ä¹è®¾ç½®äºâè´è´£rk_Tâä¹ä¸åä¸è¯¥é»è®¤å¼ã |
| | | - `rk_TDä¸ä¸`å°±æ¯ç°æé¡µé¢éçârk_Téä¸ä¸âï¼åç»æç»ä¸æ²¿ç¨ç°ææ¾ç¤ºï¼å段为 `teamMajor`ã |
| | | - å¤é¨ `CSICZB_ZB.SYS_DEPT`ã`CSICZB_ZB.SYS_USER` ç±å
¶ä»ç³»ç»ç»´æ¤ï¼æ©å±å±æ§å忬尿©å±è¡¨ã |
| | | |
| | | ### 20.2 æ¥å£ä¸æ°æ®è¡¨ |
| | | |
| | | - `LX.T_SYS_DEPT_EXT`ï¼`DEPT_ID`ã`RESPONSIBLE_X_NO`ãå®¡è®¡åæ®µã |
| | | - `LX.T_SYS_USER_EXT`ï¼`USER_ID`ã`ENGINEERING_MAJOR`ã`TEAM_MAJOR`ã`RESPONSIBLE_X_NO`ãå®¡è®¡åæ®µã |
| | | - `GET/PUT /api/system/depts/{deptId}/ext`ï¼æ¥è¯¢ãä¿åé¨é¨æ©å±å±æ§ã |
| | | - `GET/PUT /api/system/users/{userId}/ext`ï¼æ¥è¯¢ãä¿åç¨æ·æ©å±å±æ§ã |
| | | - `/api/auth/login`ã`/api/auth/me`è¿åç¨æ·ãé¨é¨åä¸ä¸æ©å±ä¿¡æ¯ï¼ä¾æ°å¢æ
éé»è®¤å¼ä½¿ç¨ã |
| | | - æ°å¢æé®æé `system:organization:ext`ã`system:users:ext`ã |
| | | |
| | | ### 20.3 主è¦åæ´æä»¶ |
| | | |
| | | - `emergency-repair-server/src/main/java/com/emergencyrepair/auth/AuthController.java` |
| | | - `emergency-repair-server/src/main/java/com/emergencyrepair/bootstrap/DatabaseBootstrap.java` |
| | | - `emergency-repair-server/src/main/java/com/emergencyrepair/business/dto/Requests.java` |
| | | - `emergency-repair-server/src/main/java/com/emergencyrepair/system/controller/SystemController.java` |
| | | - `emergency-repair-server/src/main/java/com/emergencyrepair/system/service/ButtonPermissionCatalog.java` |
| | | - `emergency-repair-server/src/main/java/com/emergencyrepair/system/service/SystemService.java` |
| | | - `emergency-repair-web/src/views/Login.vue` |
| | | - `emergency-repair-web/src/views/fault/FaultReport.vue` |
| | | - `emergency-repair-web/src/views/system/OrganizationManage.vue` |
| | | - `emergency-repair-web/src/views/system/UserManage.vue` |
| | | - `requirement/æ¹è¿20261003.txt`ã`HANDOFF.md`ï¼è¡¥å
éæ± 28-30 å交æ¥è®°å½ï¼ |
| | | |
| | | ### 20.4 éªè¯ç»æ |
| | | |
| | | - å端 `mvn -B -DskipTests clean package` éè¿ï¼å端 `npm run build` éè¿ï¼ä»
ææ¢æå
ä½ç§¯åè¦ã |
| | | - `node .codex-run/verify-req28-30.js` è¿å `pass: true`ã |
| | | - é¨é¨ `syåºå` 设置 `rk_Xå·=201`ï¼ç¨æ· `yszl` 设置工ç¨ä¸ä¸ `å¨åä¸ä¸`ãrk_Téä¸ä¸ `æ¶²åä¸ä¸`ãè´è´£ `202`ã |
| | | - æ°å¢æ
éé»è®¤å¼å®æµï¼ä¸æ¥åä½ `syåºå`ãè´è´£äºº `å©çç¨æ·ï¼æ¼ç¤ºï¼`ã`rk_Xå·=201`ãrk_Téä¸ä¸ `æ¶²åä¸ä¸`ãå·¥ç¨ä¸ä¸ `å¨åä¸ä¸`ã |
| | | - æªå¾ï¼`.codex-run/req28-org-ext.png`ã`.codex-run/req29-user-ext.png`ã`.codex-run/req30-fault-defaults.png`ã |
| | | - éªè¯åå·²æ¸
ç©ºä¸´æ¶æ©å±å±æ§ï¼æ¥è¯¢ç¡®è®¤ `configured=false` ä¸å段为空ã |
| | | |
| | | ### 20.5 æ¥ææ³¨æ |
| | | |
| | | - å½åå端 PID `56124`ï¼çå¬ `http://127.0.0.1:8091`ï¼å端 PID `57312`ï¼çå¬ `http://localhost:8082`ï¼DM8 `127.0.0.1:5236`ï¼Edge CDP `9222`ãç»å½ `admin / admin123`ã |
| | | - å¼åç¯å¢ææè¯ä¼æ `rk_T` æ¾ç¤ºæâ梯âï¼æªå¾ä¸çâè´è´£æ¢¯â对åºä»£ç /åç«¯åæ®µ `rk_T`ã |
| | | - `.codex-run`ãOffice éæä»¶å `emergency-repair-web/public/æ°å»º ææ¬ææ¡£.txt` ä»ä¸ºæ¬å°ä¸´æ¶æä»¶ï¼ä¸åºæäº¤ã |
| | | - æ¬è½®ä»£ç ãéæ±æä»¶å交æ¥è®°å½ä¸å¹¶æäº¤å¹¶æ¨éå
¬å¸ Git ä»åº `main` 忝ã |
| | |
| | | 26ãæ¥å¿ç®¡ççæ¥æç»ä»¶2ä¸ªæ¥æä¸é´é£ä¸ªâè³âæ¾ç¤ºä¸å®æ´ |
| | | 27ãæ°å¢æ
éé£ééäºrk_Xå·ï¼å¯¹åºäº§åç»ææ çsideç±»åï¼åï¼åé设å¤çæ¶åè¿æ¯æ¾ç¤ºæ´ä¸ªäº§åç»ææ ï¼åºè¯¥æ¾ç¤ºééèç¹çä¸çº§èç¹ |
| | | |
| | | 28ï¼ç»ç»æºæï¼é¨é¨æ 表ï¼ï¼å¢å æ©å±å±æ§è®¾ç½®ï¼ç®å主è¦å
æ¬è´è´£rk_T |
| | | 29ï¼ç¨æ·ç®¡çï¼å¢å æ©å±å±æ§è®¾ç½®ï¼ç®åä¸»è¦æå·¥ç¨ä¸ä¸ãrk_TDä¸ä¸ï¼è´è´£rk_T |
| | | 30ãæ°å¢æ
éï¼é»è®¤å¼ï¼æ
é䏿¥åä½é»è®¤å¡«åå½åç»å½äººçåä½ï¼è´£ä»»é»è®¤å¡«åå½åç»å½äººï¼rk_Xå·é»è®¤å¡«åå½åç»å½äººçåä½çæ©å¼ 屿§è´è´£rk_Tï¼å·¥ç¨ä¸ä¸ãrk_TDä¸ä¸åå«ä¸ºå½åç¨æ·çæ©å±å±æ§å·¥ç¨ä¸ä¸ãrk_TDä¸ä¸ |
| | | |
| | | |
| | | |
| | | ç¬¬ä¸æ¡åºè¯¥ç¼å·ä¸º 30 å§ï¼å¦å¤âè´£ä»»âæ¯å¦å°±æ¯âè´è´£äººâï¼æ¯ç |
| | | âè´è´£rk_Tâå
·ä½æ¯é rk_Xå·ï¼è¿æ¯éæä¸ªç»ç»/ä¸ä¸ï¼åéè¿æ¯å¤éï¼å¦æé¨é¨åç¨æ·é½è®¾ç½®äºï¼rk_Xå·æ¯å¦åªä»¥é¨é¨è®¾ç½®ä¸ºåï¼é rk_Xå·ï¼è¦æ±æ©å±å±æ§åæ
é表éåçä¸è´ï¼åéï¼éé¨é¨ç |
| | | ä½ è¯´çârk_TDä¸ä¸âæ¯å¦å°±æ¯ç°æé¡µé¢éçârk_Téä¸ä¸âï¼åç»ç»ä¸æ¾ç¤ºåªä¸ä¸ªåç§°ï¼æ¯ç |
| | | æ©å±å±æ§å»ºè®®æ°å»ºæ¬å°æ©å±è¡¨ä¿åï¼ä¾å¦é¨é¨æ©å±è¡¨åç¨æ·æ©å±è¡¨ï¼ä¸ç´æ¥ä¿®æ¹å¤é¨æ¥æºç SYS_DEPTãSYS_USER è¡¨ãæ¯å¦æè¿ä¸ªæ¹å¼å®ç°ï¼æ¯çï¼å 为é£2个表æ¯å«çç³»ç»ç»´æ¤ç |