diff --git a/golang_learn/data_office/get_hy_jctj/main.go b/golang_learn/data_office/get_hy_jctj/main.go index 1e99f0e..e46caec 100644 --- a/golang_learn/data_office/get_hy_jctj/main.go +++ b/golang_learn/data_office/get_hy_jctj/main.go @@ -7,6 +7,7 @@ package main */ import ( "database/sql" + "errors" "fmt" excelize "github.com/xuri/excelize/v2" "strings" @@ -15,9 +16,28 @@ import ( _ "github.com/go-sql-driver/mysql" ) +var SQL2Ku = ` select '公务员表统计多人' Type,'' AS A0195, m0207 Work,m0201 Name,m0203 IDNumber from m_m02 m2 inner join m_m01 m1 on m2.ouuid=m1.ouuid where m0104='1' and m1.rpt='@rpt' and m2.rpt='@rpt' and m0203 not in (select a0184 from a01 where a0163='1' and a0160='1') + +union all select '公务员表采集多人' Type,'' AS A0195,a0192a Work,a0101 Name,a0184 IDNumber from a01 where a0163='1' and a0160='1' and a0184 not in(select m0203 from m_m02 m2 inner join m_m01 m1 on m2.ouuid=m1.ouuid where m0104='1' and m1.rpt='@rpt' and m2.rpt='@rpt') + +union all select '参公群团表统计多人' Type,'' AS A0195,m0207 Work,m0201 Name,m0203 IDNumber from m_m02 m2 inner join m_m01 m1 on m2.ouuid=m1.ouuid where m0104='2' and m1.rpt='@rpt' and m2.rpt='@rpt' and m0203 not in (select a0184 from a01 where a0163='1' and a0160='5') + +union all select '参公群团表采集多人' Type,'' AS A0195,a0192a Work,a0101 Name,a0184 IDNumber from a01 where a0163='1' and a0160='5' and a0184 not in(select m0203 from m_m02 m2 inner join m_m01 m1 on m2.ouuid=m1.ouuid where m0104='2' and m1.rpt='@rpt' and m2.rpt='@rpt') + +union all select '参公事业表统计多人' Type,'' AS A0195,m0207 Work,m0201 Name,m0203 IDNumber from m_m02 m2 inner join m_m01 m1 on m2.ouuid=m1.ouuid where m0104='3' and m1.rpt='@rpt' and m2.rpt='@rpt' and m0203 not in (select a0184 from a01 where a0163='1' and a0160='6') + +union all select '参公事业表采集多人' Type,'' AS A0195,a0192a Work,a0101 Name,a0184 IDNumber from a01 where a0163='1' and a0160='6' and a0184 not in(select m0203 from m_m02 m2 inner join m_m01 m1 on m2.ouuid=m1.ouuid where m0104='3' and m1.rpt='@rpt' and m2.rpt='@rpt') + +union all select '基础库比统计库多' Type,(select b0101 from b01 where b0111=a.a0195) AS A0195,a0192a Work,a.a0101 Name,a.A0184 IDNumber from a01 a where a0163='1' and a0184 not in(select m0203 from m_m02 inner join tb_set_unit s on m_m02.unid=s.TBUNITID and rpid='@rpt' and rpt='@rpt' and TBUNITID<>'0' and ouuid in (select ouuid from m_m01)) + +union all select '基础库比统计库少' Type,(select m0101 from m_m01 where unid=m.unid and rpt='@rpt') AS A0195,m0207 Work,m.m0201 Name,m.m0203 IDNumber from m_m02 m inner join tb_set_unit s on m.unid=s.TBUNITID and rpid='@rpt' and rpt='@rpt' and TBUNITID<>'0' where m0203 not in(select a0184 from a01 where a0163='1') and ouuid in (select ouuid from m_m01) + +` + var SQLJck = ` select ifnull(A0184,'')IDNumber, ifnull(A0101,'') Name, + ifnull(A0192A,'') Work, ifnull(substr(a0107, 1, 6),'') BirthDate, IF(A0104 = 1, '男', '女') Gender, ifnull((select min(code_name) from code_value where A0117=code_value and code_type='GB3304'),'') Ethnicity, @@ -37,37 +57,39 @@ select ifnull(A0184,'')IDNumber, IF(A0197 = 1, '是', '否') Has2YearsGrassrootsExp, ifnull((select min(code_name) from A15, code_value where A1517=code_value and code_type='ZB18' and A1521='2023' and A01.A0000=A15.A0000), '') AnnualAssessment2023, ifnull((select min(code_name) from code_value where A0160=code_value and code_type='ZB125'),'') PersonCategory, - ifnull((select '是' from A99Z1 where A99Z101=1 and A99Z103=1 and A99Z102 like '2024%' and A01.A0000=A99Z1.A0000 limit 1), '否') SelectedFor2024 + ifnull((select '是' from A99Z1 where A99Z101=1 and A99Z103=1 and A99Z102 like '@rpt%' and A01.A0000=A99Z1.A0000 limit 1), '否') SelectedFor2024 from A01 where A0163 = '1' ` var SQLZjk = ` select ifnull(M0203,'') IDNumber, ifnull(M0201,'') Name, + ifnull(M0207,'') Work, ifnull(substr(M0204, 1, 6) ,'') BirthDate, IF(M0202 = 1, '男', '女') Gender, - ifnull((select min(code_name) from code_value where M0205=code_value and code_type='M_D_CM16'),'') Ethnicity, + ifnull((select min(code_name) from code_value where M0205=code_value and code_type='GB3304'),'') Ethnicity, ifnull(substr(M0216, 1, 6),'') WorkStartDate, - ifnull((select min(code_name) from code_value where M0206=code_value and code_type='M_D_CD17'),'') PoliticalStatus, + ifnull((select min(code_name) from code_value where M0206=code_value and code_type='GB4762'),'') PoliticalStatus, ifnull((select min(code_name) from code_value where M0242=code_value and code_type='M_D_C11'),'') FullTimeEducation, ifnull((select min(code_name) from code_value where M0212=code_value and code_type='M_D_C11'),'') HighestEducation, ifnull((select min(code_name) from code_value where M0213=code_value and code_type='M_D_C12'),'') HighestDegree, - ifnull((select min(code_name) from code_value where M0246=code_value and code_type='M_D_M0246_1'),'') JobCategory, - ifnull((select min(code_name) from code_value where M0208=code_value and code_type='M_D_C32_2019'),'') CurrentPositionLevel, + ifnull((select min(code_name) from code_value where M0246=code_value and code_type='XZ93'),'') JobCategory, + ifnull((select min(code_name) from code_value where M0208=code_value and code_type='ZB09'),'') CurrentPositionLevel, ifnull(substr(M0233, 1, 6),'') CurrentPositionStartDate, - ifnull((select min(code_name) from code_value where M0243=code_value and code_type='M_D_C31_2019'),'') CurrentRankLevel, + ifnull((select min(code_name) from code_value where M0243=code_value and code_type='ZB148'),'') CurrentRankLevel, ifnull(substr(M0244, 1, 6),'') CurrentRankStartDate, IF(M0215 = 1, '是', '否') Has2YearsGrassrootsExp, - ifnull((select min(code_name) from code_value where M0251=code_value and code_type='M_D_C32_2021'),'') AnnualAssessment2023, - ifnull((select case M0104 when 2 then '参照管理机关工作人员' when 3 then '参照管理事业单位人员' else '公务员' end from M_M01 where M_M01.UNID=M_M02.UNID and rpt='2024' limit 1),'') PersonCategory, - ifnull((select IF(M0525 = 1, '是', '否') from M_M05 where M0503=M0203 and rpt='2024' limit 1),'否') SelectedFor2024 + ifnull((select min(code_name) from code_value where M0251=code_value and code_type='ZB18'),'') AnnualAssessment2023, + ifnull((select case M0104 when 2 then '参照管理机关工作人员' when 3 then '参照管理事业单位人员' else '公务员' end from M_M01 where M_M01.UNID=M_M02.UNID and rpt='@rpt' limit 1),'') PersonCategory, + ifnull((select IF(M0525 = 1, '是', '否') from M_M05 where M0503=M0203 and rpt='@rpt' limit 1),'否') SelectedFor2024 from M_M02 -where rpt = '2024' +where rpt = '@rpt' ` var SQLGzk = ` select - ifnull(S0203,'') IDNumber, + ifnull(S0202,'') IDNumber, ifnull(S0201,'') Name, + ifnull(S0203,'') Work, '-' BirthDate, '-' Gender, '-' Ethnicity, @@ -77,7 +99,7 @@ select ifnull((select min(code_name) from code_value where S0225=code_value and code_type='M_D_C11'),'') HighestEducation, '-' HighestDegree, '-' JobCategory, - ifnull((select min(code_name) from code_value where S0204=code_value and code_type='M_D_S0204'),'') CurrentPositionLevel, + ifnull((select min(code_name) from code_value where S0204=code_value and code_type='ZB09'),'') CurrentPositionLevel, '-' CurrentPositionStartDate, ifnull((select min(code_name) from code_value where S0205=code_value and code_type='ZB148'),'') CurrentRankLevel, '-' CurrentRankStartDate, @@ -85,10 +107,11 @@ select '-' AnnualAssessment2023, '-' PersonCategory, '-' SelectedFor2024 -from m_s02 where rpt='2024' union all +from m_s02 where rpt='@rpt' and S0208=1 union all select - ifnull(S0403,'') IDNumber, + ifnull(S0402,'') IDNumber, ifnull(S0401,'') Name, + ifnull(S0403,'') Work, '-' BirthDate, '-' Gender, '-' Ethnicity, @@ -98,7 +121,7 @@ select ifnull((select min(code_name) from code_value where S0425=code_value and code_type='M_D_C11'),'') HighestEducation, '-' HighestDegree, '-' JobCategory, - ifnull((select min(code_name) from code_value where S0404=code_value and code_type='M_D_S0204'),'') CurrentPositionLevel, + ifnull((select min(code_name) from code_value where S0404=code_value and code_type='ZB09'),'') CurrentPositionLevel, '-' CurrentPositionStartDate, ifnull((select min(code_name) from code_value where S0405=code_value and code_type='ZB148'),'') CurrentRankLevel, '-' CurrentRankStartDate, @@ -106,7 +129,7 @@ select '-' AnnualAssessment2023, '-' PersonCategory, '-' SelectedFor2024 -from m_s04 where rpt='2024' +from m_s04 where rpt='@rpt' and S0408=1 ` var SQLCzk = ` @@ -115,7 +138,7 @@ select A0184 IDNumber, ifnull((select min(code_name) from code_value where A0221=code_value and code_type='ZB09'),'') CurrentPositionLevel, ifnull((select min(code_name) from code_value where A0192E=code_value and code_type='ZB148'),'') CurrentRankLevel, - ifnull(A0195, '') OldWork from C01 where C0105 like '2024%' + ifnull(A0195, '') OldWork from C01 where C0105 like '@rpt%' ` var SQLBhb = ` @@ -137,25 +160,45 @@ func main() { dir := time.Now().Format("2006102150405") file := fmt.Sprintf("对比结果-%s.xlsx", dir) - peoplesJck := queryBySQL(db, SQLJck) - peoplesZjk := queryBySQL(db, SQLZjk) - peoplesGzk := queryBySQL(db, SQLGzk) + var rpt string + + // 获取全局报告期 + query := "SELECT aaa005 FROM aa01 WHERE aaa001 = 'PERIOD'" + err := db.QueryRow(query).Scan(&rpt) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + fmt.Println("没有找到匹配的记录") + } else { + fmt.Println("查询失败:", err) + } + return + } + + fmt.Println("当前报告期:", rpt) + + peoplesJck := queryBySQL(db, SQLJck, rpt) + peoplesZjk := queryBySQL(db, SQLZjk, rpt) + peoplesGzk := queryBySQL(db, SQLGzk, rpt) results1 := mergeResults(peoplesJck, peoplesZjk, peoplesGzk) - peoplesCzk := queryByCzSQL(db, SQLCzk) - peoplesBhb := queryByCzSQL(db, SQLBhb) + peoplesCzk := queryByCzSQL(db, SQLCzk, rpt) + peoplesBhb := queryByCzSQL(db, SQLBhb, rpt) results2 := mergeCzResults(peoplesCzk, peoplesBhb) + results3 := queryByChaSQL(db, SQL2Ku, rpt) + // 创建一个新的 Excel 文件 f := excelize.NewFile() _ = f.NewSheet("三库对比") _ = f.NewSheet("辞职人员对比") + _ = f.NewSheet("两库人头差") saveSheet1(f, results1) saveSheet2(f, results2) + saveSheet3(f, results3) f.DeleteSheet("Sheet1") - f.SetActiveSheet(1) + f.SetActiveSheet(0) // 保存文件 if err := f.SaveAs(file); err != nil { @@ -173,7 +216,7 @@ func saveSheet1(f *excelize.File, results []Diff) { sheetName := "三库对比" // 设置表头 - headers := []string{"身份证号", "姓名", "项名称", "基础库", "中间库", "工资库"} + headers := []string{"身份证号", "姓名", "职务", "项名称", "基础库", "中间库", "工资库"} for i, header := range headers { cell := fmt.Sprintf("%c1", 'A'+i) _ = f.SetCellValue(sheetName, cell, header) @@ -184,10 +227,10 @@ func saveSheet1(f *excelize.File, results []Diff) { row := i + 2 // 数据从第二行开始 _ = f.SetCellValue(sheetName, fmt.Sprintf("A%d", row), diff.IDNumber) _ = f.SetCellValue(sheetName, fmt.Sprintf("B%d", row), diff.Name) - _ = f.SetCellValue(sheetName, fmt.Sprintf("C%d", row), diff.ColName) - _ = f.SetCellValue(sheetName, fmt.Sprintf("D%d", row), diff.Jck) - _ = f.SetCellValue(sheetName, fmt.Sprintf("E%d", row), diff.Zjk) - _ = f.SetCellValue(sheetName, fmt.Sprintf("F%d", row), diff.Gzk) + _ = f.SetCellValue(sheetName, fmt.Sprintf("C%d", row), diff.Work) + _ = f.SetCellValue(sheetName, fmt.Sprintf("D%d", row), diff.ColName) + _ = f.SetCellValue(sheetName, fmt.Sprintf("E%d", row), diff.Jck) + _ = f.SetCellValue(sheetName, fmt.Sprintf("F%d", row), diff.Zjk) } } @@ -214,11 +257,34 @@ func saveSheet2(f *excelize.File, results []Diff) { } } +/* + */ +func saveSheet3(f *excelize.File, results []Cha) { + sheetName := "两库人头差" + + // 设置表头 + headers := []string{"类型", "统计单位", "职务", "姓名", "身份证号"} + for i, header := range headers { + cell := fmt.Sprintf("%c1", 'A'+i) + _ = f.SetCellValue(sheetName, cell, header) + } + + // 写入数据 + for i, diff := range results { + row := i + 2 // 数据从第二行开始 + _ = f.SetCellValue(sheetName, fmt.Sprintf("A%d", row), diff.Type) + _ = f.SetCellValue(sheetName, fmt.Sprintf("B%d", row), diff.A0195) + _ = f.SetCellValue(sheetName, fmt.Sprintf("C%d", row), diff.Work) + _ = f.SetCellValue(sheetName, fmt.Sprintf("D%d", row), diff.Name) + _ = f.SetCellValue(sheetName, fmt.Sprintf("E%d", row), diff.IDNumber) + } +} + /* queryBySQL 按照基础脚本查询 */ -func queryBySQL(db *sql.DB, SQLJck string) []Person { - rows, err := db.Query(SQLJck) +func queryBySQL(db *sql.DB, SQL, rpt string) []Person { + rows, err := db.Query(strings.Replace(SQL, "@rpt", rpt, -1)) if err != nil { _ = fmt.Errorf("发生报错:%s", err) } @@ -235,6 +301,7 @@ func queryBySQL(db *sql.DB, SQLJck string) []Person { err := rows.Scan( &p.IDNumber, &p.Name, + &p.Work, &p.BirthDate, &p.Gender, &p.Ethnicity, @@ -268,8 +335,8 @@ func queryBySQL(db *sql.DB, SQLJck string) []Person { /* queryByCzSQL 按照辞职脚本查询 */ -func queryByCzSQL(db *sql.DB, SQLCz string) []CzPerson { - rows, err := db.Query(SQLCz) +func queryByCzSQL(db *sql.DB, SQL, rpt string) []CzPerson { + rows, err := db.Query(strings.Replace(SQL, "@rpt", rpt, -1)) if err != nil { _ = fmt.Errorf("发生报错:%s", err) } @@ -302,6 +369,43 @@ func queryByCzSQL(db *sql.DB, SQLCz string) []CzPerson { return people } +/* +queryByCzSQL 按照辞职脚本查询 +*/ +func queryByChaSQL(db *sql.DB, SQL, rpt string) []Cha { + rows, err := db.Query(strings.Replace(SQL, "@rpt", rpt, -1)) + if err != nil { + _ = fmt.Errorf("发生报错:%s", err) + } + defer func(rows *sql.Rows) { + err := rows.Close() + if err != nil { + fmt.Printf("错误") + } + }(rows) + + var people []Cha + for rows.Next() { + var p Cha + err := rows.Scan( + &p.Type, + &p.A0195, + &p.Work, + &p.Name, + &p.IDNumber, + ) + if err != nil { + _ = fmt.Errorf("发生报错:%s", err) + } + people = append(people, p) + } + + if err = rows.Err(); err != nil { + _ = fmt.Errorf("发生报错:%s", err) + } + return people +} + /* mergeResults 基础人员对比 */ @@ -330,25 +434,25 @@ func mergeResults(peoplesJck, peoplesZjk, peoplesGzk []Person) []Diff { if allKeys[key] == 1 { // 全部存在 基础 - diffs = setDiffs(gzkMap, key, nl, nl, gzkMap, idNumber, name, diffs) + diffs = setDiffs(gzkMap, key, nl, nl, gzkMap, idNumber, name, gzkMap[key]["职务"], diffs) } else if allKeys[key] == 2 { // 全部存在 中间 - diffs = setDiffs(zjkMap, key, nl, zjkMap, nl, idNumber, name, diffs) + diffs = setDiffs(zjkMap, key, nl, zjkMap, nl, idNumber, name, zjkMap[key]["职务"], diffs) } else if allKeys[key] == 3 { // 全部存在 中间 + 工资 - diffs = setDiffs(zjkMap, key, nl, zjkMap, gzkMap, idNumber, name, diffs) + diffs = setDiffs(zjkMap, key, nl, zjkMap, gzkMap, idNumber, name, zjkMap[key]["职务"], diffs) } else if allKeys[key] == 4 { // 全部存在 基础 - diffs = setDiffs(jckMap, key, jckMap, nl, nl, idNumber, name, diffs) + diffs = setDiffs(jckMap, key, jckMap, nl, nl, idNumber, name, jckMap[key]["职务"], diffs) } else if allKeys[key] == 5 { // 全部存在 基础 + 工资 - diffs = setDiffs(jckMap, key, jckMap, nl, gzkMap, idNumber, name, diffs) + diffs = setDiffs(jckMap, key, jckMap, nl, gzkMap, idNumber, name, jckMap[key]["职务"], diffs) } else if allKeys[key] == 6 { // 全部存在 基础 + 中间 - diffs = setDiffs(zjkMap, key, jckMap, zjkMap, nl, idNumber, name, diffs) + diffs = setDiffs(zjkMap, key, jckMap, zjkMap, nl, idNumber, name, zjkMap[key]["职务"], diffs) } else { // 全部存在 基础 + 中间 + 工资 - diffs = setDiffs(jckMap, key, jckMap, zjkMap, gzkMap, idNumber, name, diffs) + diffs = setDiffs(jckMap, key, jckMap, zjkMap, gzkMap, idNumber, name, jckMap[key]["职务"], diffs) } } @@ -363,6 +467,7 @@ func setDiffs( gzkMap map[string]map[string]string, idNumber string, name string, + work string, diffs []Diff) []Diff { for colName := range oneMap[key] { if colName == "身份证号" || colName == "姓名" { @@ -377,6 +482,7 @@ func setDiffs( diff = Diff{ IDNumber: idNumber, Name: name, + Work: work, ColName: colName, Jck: jckMap[key][colName], Zjk: zjkMap[key][colName], @@ -390,6 +496,7 @@ func setDiffs( diff = Diff{ IDNumber: idNumber, Name: name, + Work: work, ColName: colName, Jck: jckMap[key][colName], Zjk: zjkMap[key][colName], @@ -479,6 +586,7 @@ func mapPersonToDiff(people []Person) map[string]map[string]string { } result[key]["身份证号"] = person.IDNumber result[key]["姓名"] = person.Name + result[key]["职务"] = person.Work result[key]["出生时间"] = person.BirthDate result[key]["性别"] = person.Gender result[key]["民族"] = person.Ethnicity @@ -493,9 +601,9 @@ func mapPersonToDiff(people []Person) map[string]map[string]string { result[key]["现职级层次"] = person.CurrentRankLevel result[key]["任现职级层次时间"] = person.CurrentRankStartDate result[key]["是否具有2年以上基层经验"] = person.Has2YearsGrassrootsExp - result[key]["2023年度考核结果"] = person.AnnualAssessment2023 + result[key]["上年年度考核结果"] = person.AnnualAssessment2023 result[key]["人员类别"] = person.PersonCategory - result[key]["2024年考录选调生"] = person.SelectedFor2024 + result[key]["本年考录选调生"] = person.SelectedFor2024 } return result } @@ -532,6 +640,7 @@ func Eq(a, b *string) bool { type Person struct { IDNumber string // 身份证号 Name string // 姓名 + Work string // 职务 BirthDate string // 出生时间 Gender string // 性别 Ethnicity string // 民族 @@ -546,9 +655,9 @@ type Person struct { CurrentRankLevel string // 现职级层次 CurrentRankStartDate string // 任现职级层次时间 Has2YearsGrassrootsExp string // 是否具有2年以上基层经验 - AnnualAssessment2023 string // 2023年度考核结果 + AnnualAssessment2023 string // 上年度考核结果 PersonCategory string // 人员类别 - SelectedFor2024 string // 2024年考录选调生 + SelectedFor2024 string // 本年考录选调生 } type CzPerson struct { IDNumber string // 身份证号 @@ -561,8 +670,17 @@ type CzPerson struct { type Diff struct { IDNumber string `json:"身份证号"` // 身份证号 Name string `json:"姓名"` // 姓名 + Work string `json:"职务"` // 职务 ColName string `json:"项名称"` // 项名称 Jck string `json:"基础库"` // 基础库 Zjk string `json:"中间库"` // 中间库 Gzk string `json:"工资库"` // 工资库 } + +type Cha struct { + Type string `json:"类型"` // 类型 + A0195 string `json:"统计单位"` // 统计单位 + Work string `json:"职务"` // 职务 + Name string `json:"姓名"` // 姓名 + IDNumber string `json:"身份证号"` // 身份证号 +}