static void SyncDept() { List <string> create_list = new List <string>(); List <string> update_list = new List <string>(); string sql = string.Empty; try { #region Step 1 : 부서 정보 조회 List <object> items = new List <object>(); DBHelper dbHelper = new DBHelper(); DBHelper_Oracle dbHelper_Oracle = new DBHelper_Oracle(); //sql => VW_PCOFF_DEPT : 구축사에서 합의해서 나한테 전달해준 View (Table) => Oracle DB // 우리쪽 DB ( ms sql ) --> 해당하는 테이블 (tb_dept) --> 컬럼이 저거 보다 많아요 // --> 그 많은 컬럼중에서 고객사가 원하는 연동 프로그램 요구사항에 따라서 컬럼을 더 추가해서 select 를 해서 program 을 만들어주던지 // 아니면 필요없는 기능은 빼야할지 --> 관건 sql = @"SELECT DEPT_ID, DEPT_NAME, PARENT_DEPT_ID FROM VW_PCOFF_DEPT"; //connectionString string connectionString_HR = ConfigurationManager.ConnectionStrings["ConnDB_HR"].ConnectionString; string connectionString = ConfigurationManager.ConnectionStrings["ConnDB"].ConnectionString; #endregion //Oracle SQL --> Execute using (DataTable dt = dbHelper_Oracle.ExecuteSQL(sql, connectionString_HR)) { //dt --> 연동테이블 if (dt == null || dt.Rows.Count <= 0) { LogManager.GetCurrentClassLogger().Info($"HR DB 데이터 없음"); return; } #region Step 2 : 부서추가 int sync_count = 0; //정렬 api ==> 처음상태에서 VW_PCOFF_DEPT View 를 영원아웃도어 쪽에서 dbvisualizer 로 select 해보면 //상위부서 --> 0 으로표기 // 중요한건 뒤죽박죽 임 (순서대로 나열되어있지않음) // 때문에 상위부서를 0으로 끌어올려서 순차적으로 정렬하기 위함 DataTable dt_sort = dt.Clone();//이부분은 datatable 을 복제를 하는겁니다. -> 우선적으로 dt 는 현재 정렬이 되어있지않은 상태에요 //테이블 하나를 복제해서 정렬을 해주기 위함 // 테이블을 복제한다음 Clear() api 를 사용해서 안에있는 정렬되지않은 데이터를 지운다음 정렬된 데이터로 넣기위한 api 를 사용한것이 Clear() dt_sort.Clear(); Dictionary <string, string> dic = new Dictionary <string, string>(); for (int rowIndex = 0; rowIndex < dt.Rows.Count; rowIndex++) { string dept_id = dt.Rows[rowIndex]["DEPT_ID"].ToString(); string parent_dept_id = dt.Rows[rowIndex]["PARENT_DEPT_ID"].ToString(); Parent_DeptSync(dt_sort, dt, dt.Rows[rowIndex], dept_id, parent_dept_id, dic);//--> 정렬하는 재귀함수 } List <string> erp_dept_id_list = new List <string>(); //정렬한 데이터를 string 에 담아서 sql (procedure) 에 사용이됨 foreach (DataRow dr in dt_sort.Rows) { //1) Oracle data 정렬 -> 추출 -> 우리쪽 DB(ms sql) 으로 전달을 해주고 있는 상황 string dept_id = Convert.ToString(dr["DEPT_ID"]); string parent_dept_id = Convert.ToString(dr["PARENT_DEPT_ID"]); string dept_name = Convert.ToString(dr["DEPT_NAME"]); sql = $@" -- Step 1 : dept_no 조회(dept_id)를 기준으로 조회 DECLARE @dept_no INT SELECT @dept_no = dept_no FROM [dbo].[tb_dept] WITH(NOLOCK) WHERE dept_id = '{dept_id}' -- Step 2 : parent_dept_no 조회(parent_dept_id)를 기준으로 조회 DECLARE @parent_dept_no INT SELECT @parent_dept_no = dept_no FROM [dbo].[tb_dept] WITH(NOLOCK) WHERE dept_id = '{parent_dept_id}' -- Step 3 : 부서 추가 / 수정 IF(@dept_no IS NULL) BEGIN IF('{parent_dept_id}' = '0') BEGIN INSERT INTO [dbo].[tb_dept] WITH(ROWLOCK) (company_no, parent_dept_no, dept_id, name) VALUES (1, '0', '{dept_id}', '{dept_name}') SELECT '{dept_id}' AS dept_id SELECT SCOPE_IDENTITY() AS dept_no END ELSE BEGIN IF(@parent_dept_no IS NOT NULL) BEGIN INSERT INTO [dbo].[tb_dept] WITH(ROWLOCK) (company_no, parent_dept_no, dept_id, name) VALUES (1, @parent_dept_no, '{dept_id}', '{dept_name}') SELECT '{dept_id}' AS dept_id SELECT SCOPE_IDENTITY() AS dept_no END END END ELSE BEGIN IF('{parent_dept_id}' = '0') BEGIN UPDATE [dbo].[tb_dept] WITH(ROWLOCK) SET name = CASE WHEN '{dept_name}' IS NULL THEN name ELSE '{dept_name}' END ,parent_dept_no = 0 WHERE dept_no = @dept_no SELECT '{dept_id}' AS dept_id SELECT @dept_no AS dept_no END ELSE BEGIN IF(@parent_dept_no IS NOT NULL) BEGIN UPDATE [dbo].[tb_dept] WITH(ROWLOCK) SET name = CASE WHEN '{dept_name}' IS NULL THEN name ELSE '{dept_name}' END ,parent_dept_no = @parent_dept_no WHERE dept_no = @dept_no SELECT '{dept_id}' AS dept_id SELECT @dept_no AS dept_no END END END"; //연동 진행 using (DataTable dt_dept = dbHelper.ExecuteSQL(sql, connectionString)) { if (dt_dept.Rows.Count > 0) { ++sync_count; LogManager.GetCurrentClassLogger().Info($"부서 추가 : {dept_id}"); } } erp_dept_id_list.Add(dept_id); } LogManager.GetCurrentClassLogger().Info($"총 부서 추가 : {sync_count}"); #endregion #region Step 3 : 타임키퍼 부서 정보 조회 sql = @"SELECT dept_id FROM [dbo].[tb_dept] WITH(NOLOCK)"; //부서정보 조회 list List <string> dept_id_list = new List <string>(); using (DataTable dt_dept = dbHelper.ExecuteSQL(sql, connectionString)) { if (dt_dept == null || dt_dept.Rows.Count <= 0) { //데이터가 없을때 LogManager.GetCurrentClassLogger().Info($"부서 데이터 없음"); return; } //데이터가 있을때 foreach (DataRow dr in dt_dept.Rows) { //list 에 담아서 조회 or 또다른 작업할때 사용이 되겠죠 string dept_id = Convert.ToString(dr["dept_id"]); dept_id_list.Add(dept_id); } } #endregion #region Step 4 : 타임키퍼 부서 삭제 --> 조회했던 데이터들을 list 에서 뽑아내서 삭제하는 방식 sync_count = 0; foreach (string dept_id in dept_id_list.Except(erp_dept_id_list)) { // 삭제 --> 기준 --> dept_id // list 에 저장되었던 dept_id 를 뽑아내서 삭제하는 방식 sql = $@"DECLARE @dept_no INT SELECT TOP 1 @dept_no = dept_no FROM [dbo].[tb_dept] WITH(NOLOCK) WHERE dept_id = '{dept_id}' DELETE FROM [dbo].[tb_dept] WITH(ROWLOCK) WHERE dept_no = @dept_no"; dbHelper.ExecuteSQL(sql, connectionString); ++sync_count; LogManager.GetCurrentClassLogger().Info($"부서 삭제 : {dept_id}"); } LogManager.GetCurrentClassLogger().Info($"총 부서 삭제 : {sync_count}"); #endregion } } catch (Exception ex) { LogManager.GetCurrentClassLogger().Info(sql); LogManager.GetCurrentClassLogger().Info($"StackTrace : {ex.StackTrace}"); LogManager.GetCurrentClassLogger().Info($"Message : {ex.Message}"); } }
static void SyncUser_Dept() { string sql = string.Empty; try { #region Step 1 : ERP 부서 정보 조회 DBHelper dbHelper = new DBHelper(); DBHelper_Oracle dbHelper_Oracle = new DBHelper_Oracle(); sql = @"SELECT USER_ID, DEPT_ID, USER_NAME, POSITION FROM VW_PCOFF_USER"; string connectionString_HR = ConfigurationManager.ConnectionStrings["ConnDB_HR"].ConnectionString; string connectionString = ConfigurationManager.ConnectionStrings["ConnDB"].ConnectionString; #endregion using (DataTable dt = dbHelper_Oracle.ExecuteSQL(sql, connectionString_HR)) { if (dt == null || dt.Rows.Count <= 0) { LogManager.GetCurrentClassLogger().Info($"사용자 부서 DB 데이터 없음"); return; } #region Step 2 : 사용자 부서 추가 int sync_count = 0; List <string> erp_user_id_list = new List <string>(); foreach (DataRow dr in dt.Rows) { string user_id = Convert.ToString(dr["USER_ID"]); string dept_id = Convert.ToString(dr["DEPT_ID"]); sql = $@" -- Step 1 :user_no 조회 DECLARE @user_no INT SELECT @user_no = user_no FROM [dbo].[tb_user] WITH(NOLOCK) WHERE user_id = '{user_id}' and retireYN = 'N' -- Step 2 : dept_no 조회 DECLARE @dept_no INT SELECT @dept_no = dept_no FROM [dbo].[tb_dept] WITH(NOLOCK) WHERE dept_id = '{dept_id}' -- Step 3 : 사용자 부서 추가 IF(@user_no IS NOT NULL AND @dept_no IS NOT NULL) BEGIN IF NOT EXISTS(SELECT user_no FROM [dbo].[tb_dept_user] WITH(NOLOCK) WHERE user_no = @user_no) BEGIN INSERT INTO [dbo].[tb_dept_user] (user_no, dept_no, main_dept_YN) VALUES (@user_no, @dept_no, 'Y') SELECT '{user_id}' AS user_id END ELSE BEGIN UPDATE [dbo].[tb_dept_user] WITH(ROWLOCK) SET dept_no = @dept_no WHERE user_no = @user_no SELECT '{user_id}' AS user_id END END"; using (DataTable dt_user = dbHelper.ExecuteSQL(sql, connectionString)) { if (dt_user.Rows.Count > 0) { ++sync_count; LogManager.GetCurrentClassLogger().Info($"사용자 부서 추가 및 수정 : {user_id}"); } } erp_user_id_list.Add(user_id); } LogManager.GetCurrentClassLogger().Info($"총 사용자 부서 추가 및 수정 : {sync_count}"); #endregion } } catch (Exception ex) { LogManager.GetCurrentClassLogger().Info(sql); LogManager.GetCurrentClassLogger().Info($"StackTrace : {ex.StackTrace}"); LogManager.GetCurrentClassLogger().Info($"Message : {ex.Message}"); } }
static void SyncUser() { List <string> create_list = new List <string>(); List <string> update_list = new List <string>(); string sql = string.Empty; try { #region Step 1 : 사용자 정보 조회 DBHelper dbHelper = new DBHelper(); DBHelper_Oracle dbHelper_Oracle = new DBHelper_Oracle(); //VW_PCOFF_USER --> 사용자 정보 view table sql = @"SELECT USER_ID, DEPT_ID, USER_NAME, POSITION FROM VW_PCOFF_USER"; string connectionString_HR = ConfigurationManager.ConnectionStrings["ConnDB_HR"].ConnectionString; string connectionString = ConfigurationManager.ConnectionStrings["ConnDB"].ConnectionString; #endregion using (DataTable dt = dbHelper_Oracle.ExecuteSQL(sql, connectionString_HR)) { if (dt == null || dt.Rows.Count <= 0) { // 데이터가 없을때 LogManager.GetCurrentClassLogger().Info($"HR DB 데이터 없음"); return; } #region Step 2 : 사용자 추가 --> 사용자 정보를 조회 , 조회한거를 담아주는거에요 //oracle (우리쪽 data 가 아님 : 고객사) //고객사 data --> 우리쪽에서 가져와서 --> Ms sql에 넣는 작업 : 연동 int sync_count = 0; List <string> erp_user_id_list = new List <string>(); //oracle 에 서 뽑은 data foreach (DataRow dr in dt.Rows) { string user_id = Convert.ToString(dr["USER_ID"]); string user_name = Convert.ToString(dr["USER_NAME"]); string position = Convert.ToString(dr["POSITION"]); //oracle data --> ms sql 에 전달해주는 작업 : sql // retireYN = 'N' == 퇴사 안한사람 // 퇴사한사람을 왜 사용자 추가를 하겠나요.. sql = $@" -- Step 1 : user_no 조회 DECLARE @user_no INT SELECT @user_no = user_no FROM [dbo].[tb_user] WITH(NOLOCK) WHERE user_id = '{user_id}' and retireYN = 'N' -- Step 2 : 디폴트 비밀번호 조회 DECLARE @default_password VARCHAR(1024) SELECT @default_password = default_password FROM [dbo].[tb_company] WITH(NOLOCK) WHERE company_no = 1 -- Step 3 : 표준 근로 시간 조회 DECLARE @work_start_time TIME(7), @work_end_time TIME(7) SELECT @work_start_time = work_start_time, @work_end_time = work_end_time FROM [dbo].[tb_company] WITH(NOLOCK) WHERE company_no = 1 -- Step 4 : 사용자 추가 IF(@user_no IS NULL) BEGIN INSERT INTO [dbo].[tb_user] WITH(ROWLOCK) (company_no, user_id, name, password, user_work_type, position) VALUES (1, '{user_id}', '{user_name}', @default_password, '사무직', '{position}') SELECT '{user_id}' AS user_id END ELSE BEGIN UPDATE [dbo].[tb_user] WITH(ROWLOCK) SET name = '{user_name}' ,position = '{position}' WHERE user_no = @user_no AND user_id <> 'admin' SELECT '{user_id}' AS user_id END"; using (DataTable dt_user = dbHelper.ExecuteSQL(sql, connectionString)) { if (dt_user.Rows.Count > 0) { ++sync_count; LogManager.GetCurrentClassLogger().Info($"사용자 추가 : {user_id}"); } } erp_user_id_list.Add(user_id); } #endregion #region Step 3 : 타임키퍼 사용자 정보 조회 //select sql = @"SELECT user_id FROM [dbo].[tb_user] U WITH(NOLOCK) WHERE user_id <> 'admin'"; List <string> user_id_list = new List <string>(); using (DataTable dt_user = dbHelper.ExecuteSQL(sql, connectionString)) { if (dt_user == null || dt_user.Rows.Count <= 0) { LogManager.GetCurrentClassLogger().Info($"DB 데이터 없음"); return; } foreach (DataRow dr in dt_user.Rows) { string user_id = Convert.ToString(dr["user_id"]); user_id_list.Add(user_id); } } #endregion #region Step 4 : 타임키퍼 사용자 삭제 sync_count = 0; foreach (string user_id in user_id_list.Except(erp_user_id_list)) { sql = $@" DECLARE @user_no INT SELECT TOP 1 @user_no = user_no FROM [dbo].[tb_user] WITH(NOLOCK) WHERE user_id = '{user_id}' -- 부속 소속정보 제거 IF EXISTS(SELECT * FROM [dbo].[tb_dept_user] WITH(NOLOCK) WHERE user_no = @user_no) BEGIN DELETE [dbo].[tb_dept_user] WITH(ROWLOCK) WHERE user_no = @user_no END --퇴사로 전환 UPDATE [dbo].[tb_user] WITH(ROWLOCK) SET retireYN = 'Y' ,retire_time = SYSDATETIME() WHERE user_no = @user_no AND retireYN = 'N'"; dbHelper.ExecuteSQL(sql, connectionString); ++sync_count; LogManager.GetCurrentClassLogger().Info($"사용자 삭제 : {user_id}"); } LogManager.GetCurrentClassLogger().Info($"총 사용자 삭제 : {sync_count}"); #endregion } } catch (Exception ex) { LogManager.GetCurrentClassLogger().Info(sql); LogManager.GetCurrentClassLogger().Info($"StackTrace : {ex.StackTrace}"); LogManager.GetCurrentClassLogger().Info($"Message : {ex.Message}"); } }