From 9c91f40d91c49c1f90bb756332db6937b98d6ffe Mon Sep 17 00:00:00 2001 From: han0 Date: Mon, 8 Jul 2024 10:40:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E4=BC=98=E5=85=88=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/common/property/PathProperty.java | 13 ++ .../xinke/main/constant/MaterialTaskType.java | 79 +++++----- .../main/controller/MaterialController.java | 2 +- src/test/java/mjkf/xinke/MergeCommand.java | 144 ++++++++++++++++++ src/test/java/mjkf/xinke/TableRenderTest.java | 100 ++++++++++++ .../java/mjkf/xinke/model/CompanyItem.java | 48 ++++++ src/test/java/mjkf/xinke/model/LevelItem.java | 34 +++++ .../java/mjkf/xinke/model/LevelTypeItem.java | 42 +++++ .../java/mjkf/xinke/model/ProjectItem.java | 54 +++++++ src/test/java/mjkf/xinke/model/SheetItem.java | 107 +++++++++++++ 10 files changed, 587 insertions(+), 36 deletions(-) create mode 100644 src/main/java/mjkf/xinke/main/common/property/PathProperty.java create mode 100644 src/test/java/mjkf/xinke/MergeCommand.java create mode 100644 src/test/java/mjkf/xinke/TableRenderTest.java create mode 100644 src/test/java/mjkf/xinke/model/CompanyItem.java create mode 100644 src/test/java/mjkf/xinke/model/LevelItem.java create mode 100644 src/test/java/mjkf/xinke/model/LevelTypeItem.java create mode 100644 src/test/java/mjkf/xinke/model/ProjectItem.java create mode 100644 src/test/java/mjkf/xinke/model/SheetItem.java diff --git a/src/main/java/mjkf/xinke/main/common/property/PathProperty.java b/src/main/java/mjkf/xinke/main/common/property/PathProperty.java new file mode 100644 index 0000000..2685273 --- /dev/null +++ b/src/main/java/mjkf/xinke/main/common/property/PathProperty.java @@ -0,0 +1,13 @@ +package mjkf.xinke.main.common.property; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@ConfigurationProperties(prefix = "path") +@Component +public class PathProperty { + private String historyFile; + +} diff --git a/src/main/java/mjkf/xinke/main/constant/MaterialTaskType.java b/src/main/java/mjkf/xinke/main/constant/MaterialTaskType.java index 9766d93..ca5f243 100644 --- a/src/main/java/mjkf/xinke/main/constant/MaterialTaskType.java +++ b/src/main/java/mjkf/xinke/main/constant/MaterialTaskType.java @@ -15,46 +15,46 @@ public class MaterialTaskType { // 三明钢铁 public static final Integer SANMING_STEEL = 301; // 材料信息 - public static final Integer FUZHOU_TRANSPORTATION_BUREAU = 40101; // todo 福州交通局 - public static final Integer LONGYAN_TRANSPORTATION_BUREAU = 40102; // todo 龙岩交通局 - public static final Integer NANPING_TRANSPORTATION_BUREAU = 40103; // todo 南平交通局 - public static final Integer NINGDE_TRANSPORTATION_BUREAU = 40104; // todo 宁德交通局 - public static final Integer PINTAN_TRANSPORTATION_BUREAU = 40105; // todo 平潭交通局 - public static final Integer PUTIAN_TRANSPORTATION_BUREAU = 40106; // todo 莆田交通局 - public static final Integer QUANZHOU_TRANSPORTATION_BUREAU = 40107; // todo 泉州交通局 - public static final Integer SANMING_TRANSPORTATION_BUREAU = 40108; // todo 三明交通局 - public static final Integer XIAMEN_TRANSPORTATION_BUREAU = 40109; // todo 厦门交通局 - public static final Integer ZHANGZHOU_TRANSPORTATION_BUREAU = 40110; // todo 漳州交通局 - public static final Integer ZHANGZHOUKFQ_TRANSPORTATION_BUREAU = 40111; // todo 漳州开发区交通局 + public static final Integer FUZHOU_TRANSPORTATION_BUREAU = 40101; // todo-1 福州交通局 + public static final Integer LONGYAN_TRANSPORTATION_BUREAU = 40102; // todo-1 龙岩交通局 + public static final Integer NANPING_TRANSPORTATION_BUREAU = 40103; // todo-1 南平交通局 + public static final Integer NINGDE_TRANSPORTATION_BUREAU = 40104; // todo-1 宁德交通局 + public static final Integer PINTAN_TRANSPORTATION_BUREAU = 40105; // todo-1 平潭交通局 + public static final Integer PUTIAN_TRANSPORTATION_BUREAU = 40106; // todo-1 莆田交通局 + public static final Integer QUANZHOU_TRANSPORTATION_BUREAU = 40107; // todo-1 泉州交通局 + public static final Integer SANMING_TRANSPORTATION_BUREAU = 40108; // todo-1 三明交通局 + public static final Integer XIAMEN_TRANSPORTATION_BUREAU = 40109; // todo-1 厦门交通局 + public static final Integer ZHANGZHOU_TRANSPORTATION_BUREAU = 40110; // todo-1 漳州交通局 + public static final Integer ZHANGZHOUKFQ_TRANSPORTATION_BUREAU = 40111; // todo-1 漳州开发区交通局 - public static final Integer FUZHOU_HIGHWAY_BUREAU = 40201; // todo 福州公路局 - public static final Integer LONGYAN_HIGHWAY_BUREAU = 40202; // todo 龙岩公路局 - public static final Integer NANPING_HIGHWAY_BUREAU = 40203; // todo 南平公路局 - public static final Integer NINGDE_HIGHWAY_BUREAU = 40204; // todo 宁德公路局 - public static final Integer PINTAN_HIGHWAY_BUREAU = 40205; // todo 平潭公路局 - public static final Integer PUTIAN_HIGHWAY_BUREAU = 40206; // todo 莆田公路局 - public static final Integer QUANZHOU_HIGHWAY_BUREAU = 40207; // todo 泉州公路局 - public static final Integer SANMING_HIGHWAY_BUREAU = 40208; // todo 三明公路局 - public static final Integer XIAMEN_HIGHWAY_BUREAU = 40209; // todo 厦门公路局 - public static final Integer ZHANGZHOU_HIGHWAY_BUREAU = 40210; // todo 漳州公路局 - public static final Integer ZHANGZHOUKFQ_HIGHWAY_BUREAU = 40211; // todo 漳州开发区公路局 + public static final Integer FUZHOU_HIGHWAY_BUREAU = 40201; // todo-1 福州公路局 + public static final Integer LONGYAN_HIGHWAY_BUREAU = 40202; // todo-1 龙岩公路局 + public static final Integer NANPING_HIGHWAY_BUREAU = 40203; // todo-1 南平公路局 + public static final Integer NINGDE_HIGHWAY_BUREAU = 40204; // todo-1 宁德公路局 + public static final Integer PINTAN_HIGHWAY_BUREAU = 40205; // todo-1 平潭公路局 + public static final Integer PUTIAN_HIGHWAY_BUREAU = 40206; // todo-1 莆田公路局 + public static final Integer QUANZHOU_HIGHWAY_BUREAU = 40207; // todo-1 泉州公路局 + public static final Integer SANMING_HIGHWAY_BUREAU = 40208; // todo-1 三明公路局 + public static final Integer XIAMEN_HIGHWAY_BUREAU = 40209; // todo-1 厦门公路局 + public static final Integer ZHANGZHOU_HIGHWAY_BUREAU = 40210; // todo-1 漳州公路局 + public static final Integer ZHANGZHOUKFQ_HIGHWAY_BUREAU = 40211; // todo-1 漳州开发区公路局 // 地市调查表 - public static final Integer FUZHOU_SURVEY = 501; // todo 福州调查表 - public static final Integer LONGYAN_SURVEY = 502; // todo 龙岩调查表 - public static final Integer NANPING_SURVEY = 503; // todo 南平调查表 - public static final Integer NINGDE_SURVEY = 504; // todo 宁德调查表 - public static final Integer PINTAN_SURVEY = 505; // todo 平潭调查表 - public static final Integer PUTIAN_SURVEY = 506; // todo 莆田调查表 - public static final Integer QUANZHOU_SURVEY = 507; // todo 泉州调查表 - public static final Integer SANMING_SURVEY = 508; // todo 三明调查表 - public static final Integer XIAMEN_SURVEY = 509; // todo 厦门调查表 - public static final Integer ZHANGZHOU_SURVEY = 510; // todo 漳州调查表 - public static final Integer ZHANGZHOUKFQ_SURVEY = 511; // todo 漳州开发区调查表 + public static final Integer FUZHOU_SURVEY = 501; // todo-1 福州调查表 + public static final Integer LONGYAN_SURVEY = 502; // todo-1 龙岩调查表 + public static final Integer NANPING_SURVEY = 503; // todo-1 南平调查表 + public static final Integer NINGDE_SURVEY = 504; // todo-1 宁德调查表 + public static final Integer PINTAN_SURVEY = 505; // todo-1 平潭调查表 + public static final Integer PUTIAN_SURVEY = 506; // todo-1 莆田调查表 + public static final Integer QUANZHOU_SURVEY = 507; // todo-1 泉州调查表 + public static final Integer SANMING_SURVEY = 508; // todo-1 三明调查表 + public static final Integer XIAMEN_SURVEY = 509; // todo-1 厦门调查表 + public static final Integer ZHANGZHOU_SURVEY = 510; // todo-1 漳州调查表 + public static final Integer ZHANGZHOUKFQ_SURVEY = 511; // todo-1 漳州开发区调查表 // 其他省份 public static final Integer OTHER_ZHEJIANG = 601; // 浙江 public static final Integer OTHER_GIANLZHOU = 602; // 广州 public static final Integer OTHER_YUNNAN = 603; // 云南 - public static final Integer OTHER_JIANGXI = 604; // todo 江西 + public static final Integer OTHER_JIANGXI = 604; // todo-2 江西 // 住建厅 public static final Integer FUJIAN_DEPARTMENT = 701; // 发改委 @@ -81,7 +81,7 @@ public class MaterialTaskType { public static final Integer LOCAL_ZHANGZHOU = 1108; // 漳州 // 网络价格 - public static final Integer NETWORK = 1201; // todo 网络价格 + public static final Integer NETWORK = 1201; // todo-1 网络价格 public static final List list = List.of( NETWORK, @@ -173,5 +173,14 @@ public class MaterialTaskType { ); return dataFromSpiderTypes.contains(type); } + /** + * todo-1 数据展示模块 地市暂不切换 + * todo-1 十一个地市接口 + * todo-1 采集结果“产地”改成“品牌产商” + * todo-1 传采集数据网络价格树变动 + * todo-1 趋势图一年每月打点 + * todo-1 项目材料价格预算“最高(低)总金额”携带上价格的月份 + * todo-1 项目材料价格预算计算数值没有小数点 + */ } diff --git a/src/main/java/mjkf/xinke/main/controller/MaterialController.java b/src/main/java/mjkf/xinke/main/controller/MaterialController.java index 68dd660..9393ce3 100644 --- a/src/main/java/mjkf/xinke/main/controller/MaterialController.java +++ b/src/main/java/mjkf/xinke/main/controller/MaterialController.java @@ -47,7 +47,7 @@ public class MaterialController { query.eq(Material::getType, type); List> maps = materialService.listMaps(query); maps = maps.stream().map(map -> convertKeysToLowercase(map)).collect(Collectors.toList()); - // todo 列转树改为泛型对象入参 + // todo-3 列转树改为泛型对象入参 List> result = CommonUtil.listToTree(maps, Material.Fields.id, StrUtil.toUnderlineCase(Material.Fields.parentId), "00.00.00.00"); return FuHttpResponse.Builder().dataResponse(result).build(); } diff --git a/src/test/java/mjkf/xinke/MergeCommand.java b/src/test/java/mjkf/xinke/MergeCommand.java new file mode 100644 index 0000000..8d718ab --- /dev/null +++ b/src/test/java/mjkf/xinke/MergeCommand.java @@ -0,0 +1,144 @@ +package mjkf.xinke; + +import jxl.write.WriteException; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.jxls.area.Area; +import org.jxls.command.AbstractCommand; +import org.jxls.command.Command; +import org.jxls.common.CellRef; +import org.jxls.common.Context; +import org.jxls.common.Size; +import org.jxls.transform.Transformer; +import org.jxls.transform.jexcel.JexcelTransformer; +import org.jxls.transform.poi.PoiTransformer; + +/** + * 合并单元格命令 + */ +@Data +public class MergeCommand extends AbstractCommand { + /** + * 合并的列数 + */ + private String cols; + /** + * 合并的行数 + */ + private String rows; + private Area area; + /** + * 单元格的样式 + */ + private CellStyle cellStyle; + + @Override + public String getName() { + return "merge"; + } + + @Override + public Command addArea(Area area) { + if (super.getAreaList().size() >= 1) { + throw new IllegalArgumentException("You can add only a single area to 'merge' command"); + } + this.area = area; + return super.addArea(area); + } + + @Override + public Size applyAt(CellRef cellRef, Context context) { + int rows = 1, cols = 1; + if (StringUtils.isNotBlank(this.rows)) { + Object rowsObj = getTransformationConfig().getExpressionEvaluator().evaluate(this.rows, context.toMap()); + if (rowsObj != null && NumberUtils.isDigits(rowsObj.toString())) { + rows = NumberUtils.toInt(rowsObj.toString()); + } + } + if (StringUtils.isNotBlank(this.cols)) { + Object colsObj = getTransformationConfig().getExpressionEvaluator().evaluate(this.cols, context.toMap()); + if (colsObj != null && NumberUtils.isDigits(colsObj.toString())) { + cols = NumberUtils.toInt(colsObj.toString()); + } + } + + if (rows > 1 || cols > 1) { + Transformer transformer = this.getTransformer(); + if (transformer instanceof PoiTransformer) { + return poiMerge(cellRef, context, (PoiTransformer) transformer, rows, cols); + } else if (transformer instanceof JexcelTransformer) { + return jexcelMerge(cellRef, context, (JexcelTransformer) transformer, rows, cols); + } + } + area.applyAt(cellRef, context); + return new Size(1, 1); + } + + protected Size poiMerge(CellRef cellRef, Context context, PoiTransformer transformer, int rows, int cols) { + Sheet sheet = transformer.getWorkbook().getSheet(cellRef.getSheetName()); + CellRangeAddress region = new CellRangeAddress( + cellRef.getRow(), + cellRef.getRow() + rows - 1, + cellRef.getCol(), + cellRef.getCol() + cols - 1); + sheet.addMergedRegion(region); + + area.applyAt(cellRef, context); + if (cellStyle == null) { + setPoiCellStyle(transformer); + } + setRegionStyle(cellStyle, region, sheet); + return new Size(cols, rows); + } + + protected Size jexcelMerge(CellRef cellRef, Context context, JexcelTransformer transformer, int rows, int cols) { + try { + transformer.getWritableWorkbook().getSheet(cellRef.getSheetName()) + .mergeCells( + cellRef.getRow(), + cellRef.getCol(), + cellRef.getRow() + rows - 1, + cellRef.getCol() + cols - 1); + area.applyAt(cellRef, context); + } catch (WriteException e) { + throw new IllegalArgumentException("合并单元格失败"); + } + return new Size(cols, rows); + } + + public static void setRegionStyle(CellStyle cs, CellRangeAddress region, Sheet sheet) { + for (int i = region.getFirstRow(); i <= region.getLastRow(); i++) { + Row row = sheet.getRow(i); + if (row == null) { + row = sheet.createRow(i); + } + for (int j = region.getFirstColumn(); j <= region.getLastColumn(); j++) { + Cell cell = row.getCell(j); + if (cell == null) { + cell = row.createCell(j); + } + cell.setCellStyle(cs); + } + } + } + + /** + * 设置单元格格式 + * 根据自己需求修改 + * @param transformer + * @return + */ + private void setPoiCellStyle(PoiTransformer transformer) { + cellStyle = transformer.getWorkbook().createCellStyle(); + cellStyle.setBorderRight(BorderStyle.THIN); + cellStyle.setBorderRight(BorderStyle.THIN); + cellStyle.setBorderBottom(BorderStyle.THIN); + cellStyle.setAlignment(HorizontalAlignment.CENTER_SELECTION); + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + cellStyle.setWrapText(true); + } + +} \ No newline at end of file diff --git a/src/test/java/mjkf/xinke/TableRenderTest.java b/src/test/java/mjkf/xinke/TableRenderTest.java new file mode 100644 index 0000000..4e57dd9 --- /dev/null +++ b/src/test/java/mjkf/xinke/TableRenderTest.java @@ -0,0 +1,100 @@ + +package mjkf.xinke; + +import lombok.extern.slf4j.Slf4j; +import mjkf.xinke.model.*; +import org.jxls.builder.xls.XlsCommentAreaBuilder; +import org.springframework.web.bind.annotation.RestController; +import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; + +import java.util.List; + + +@Slf4j +@EnableSwagger2WebMvc +@RestController +public class TableRenderTest { + + public static void main(String[] args) throws Exception { + XlsCommentAreaBuilder.addCommandMapping("merge", MergeCommand.class); + var srcFilePath = "c:\\jxls_template.xls"; + var destFilePath = "c:\\jxls_target.xls"; + var projectType = "高速公路"; + var year = "2021"; + var projectItem0 = new ProjectItem("中交第一航务工程局有限公司f", "911200001030d610685", + "A", 1, "AA", "A", "厦门第二东通道工程", + "A3", "203765.922", "A", List.of("89.5", "89.5", "89.5"), + "89.5", "89.5", List.of("卢磊", "12", "吴波", "12", "12"), "备注"); + var projectItem01 = new ProjectItem("中交第一航务工程局有限公司f", "911200001030d610685", + "A", 1, "AA", "A", "厦门第二东通道工程", + "A4", "203765.922", "A", List.of("89.5", "89.5", "89.5"), + "89.5", "89.5", List.of("卢磊", "12", "吴波", "12", "12"), "备注"); + var projectItem02 = new ProjectItem("中交第一航务工程局有限公司f", "911200001030d610685", + "A", 1, "AA", "A", "厦门第二东通道工程", + "A4", "203765.922", "A", List.of("89.5", "89.5", "89.5"), + "89.5", "89.5", List.of("卢磊", "12", "吴波", "12", "12"), "备注"); + var projectItem1 = new ProjectItem("中交第一航务工程局有限公司", "911200001030610685", + "A", 1, "AA", "A", "厦门第二东通道工程", + "A3", "203765.922", "A", List.of("89.5", "89.5", "89.5"), + "89.5", "89.5", List.of("卢磊", "12", "吴波", "12", "12"), "备注"); + var projectItem2 = new ProjectItem("中交第一航务工程局有限公司", "911200001030610685", + "A", 1, "AA", "A", "厦门第二东通道工程2", + "A3", "209754.922", "AA", List.of("89.5", "89.5", "89.5"), + "89.5", "89.5", List.of("卢磊", "12", "吴波", "12", "12"), "备注"); + var projectItem21 = new ProjectItem("中交第一航务工程局有限公司", "911200001030610685", + "A", 1, "AA", "A", "厦门第二东通道工程21", + "A3", "209754.922", "A", List.of("89.5", "89.5", "89.5"), + "89.5", "89.5", List.of("卢磊", "12", "吴波", "12", "12"), "备注"); + var projectItem3 = new ProjectItem("中交第一航务工程局有限公司11", "91120000103061068511", + "A", 2, "A", "A", "厦门第二东通道工程3", + "A3", "207854.922", "B", List.of("89.5", "89.5", "89.5"), + "89.5", "89.5", List.of("卢磊", "12", "吴波", "12", "12"), "备注"); + var projectItem4 = new ProjectItem("中交第一航务工程局有限公司113", "911200001030610685113", + "AA", 2, "A", "A", "厦门第二东通道工程3", + "A3", "204465.922", "C", List.of("89.5", "89.5", "89.5"), + "89.5", "89.5", List.of("卢磊", "12", "吴波", "12", "12"), "备注"); + var projectItem5 = new ProjectItem("中交第一航务工程局有限公司113", "911200001030610685113", + "AA", 2, "A", "A", "厦门第二东通道工程3", + "A3", "201238.922", "AA", List.of("89.5", "89.5", "89.5"), + "89.5", "89.5", List.of("卢磊", "12", "吴波", "12", "12"), "备注"); + var projectItem6 = new ProjectItem("中交第一航务工程局有限公司113", "911200001030610685113", + "AA", 2, "A", "A", "厦门第二东通道工程4", + "A3", "201187.922", "B", List.of("89.5", "89.5", "89.5"), + "89.5", "89.5", List.of("卢磊", "12", "吴波", "12", "12"), "备注"); + var projectItem7 = new ProjectItem("中交第一航务工程局有限公司1131", "911200001030610685123", + "B", 2, "A", "A", "厦门第二东通道工程4", + "A3", "201187.922", "B", List.of("89.5", "89.5", "89.5"), + "89.5", "89.5", List.of("卢磊", "12", "吴波", "12", "12"), "备注"); + var projectItem8 = new ProjectItem("中交第一航务工程局有限公司1131", "911200001030610685123", + "B", 2, "A", "A", "厦门第二东通道工程4", + "A3", "201187.922", "B", List.of("89.5", "89.5", "89.5"), + "89.5", "89.5", List.of("卢磊", "12", "吴波", "12", "12"), "备注"); + + var projectItem9 = new ProjectItem("福建省高速路桥建设发展有限公司", "91350203MA347QRM7Y", + "B", 1, "A", "B", "滨海东大道(沈海高速-海翔大道段)二期工程", + "A1", "201187.922", "B", List.of("89.5", "89.5", "89.5"), + "89.5", "89.5", List.of("卢磊", "12", "吴波", "12", "12"), "AA"); + var projectItem10 = new ProjectItem("福建省交通科研院", "91350203MA347QRM7Y", + "B", 1, "A", "B", "滨海东大道(沈海高速-海翔大道段)二期工程", + "A2", "201187.922", "B", List.of("89.5", "89.5", "89.5"), + "89.5", "89.5", List.of("卢磊", "12", "吴波", "12", "12"), "A"); + var projectItem11 = new ProjectItem("福建省交发信科", "91350203MA347QRM7Y", + "B", 1, "AA", "B", "滨海东大道(沈海高速-海翔大道段)二期工程", + "A3", "201187.922", "B", List.of("89.5", "89.5", "89.5"), + "89.5", "89.5", List.of("卢磊", "12", "吴波", "12", "12"), "A"); + + var projectItems = List.of( + projectItem0, projectItem01, projectItem02, projectItem1, projectItem2, projectItem21, projectItem3, + projectItem4, projectItem5, projectItem6, projectItem7, projectItem8, + projectItem9, projectItem10, projectItem11 + ); + var levelItems = LevelItem.toItems(LevelTypeItem.toItems(CompanyItem.toItems(projectItems))); + + var sheetItems = List.of( + new SheetItem("路基施工", List.of("省高指", "省交通质监局", "项目法人"), levelItems, "1-1", List.of("项目经理", "任职时间(月)", "技术负责人", "任职时间(月)", "年度考核期月")), + new SheetItem("路面施工", List.of("省高指", "省交通质监局", "项目法人"), levelItems, "1-2", List.of("项目经理", "任职时间(月)", "技术负责人", "任职时间(月)", "年度考核期月")) + ); + // 渲染 + + } +} diff --git a/src/test/java/mjkf/xinke/model/CompanyItem.java b/src/test/java/mjkf/xinke/model/CompanyItem.java new file mode 100644 index 0000000..5f2d9bb --- /dev/null +++ b/src/test/java/mjkf/xinke/model/CompanyItem.java @@ -0,0 +1,48 @@ +package mjkf.xinke.model; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Data +public class CompanyItem { + public String no; + public String name; + public String code; + public String level; + public String score; + public Integer levelType; // 1=降级,2=其他 + public String projectLevel; + public String sheetName; + public String originGrade; + public String currentGrade; + public List projectItems; + public String remark; + + static public List toItems(List projectItems) { + var no = 1; + var groupMap = projectItems.stream().collect(Collectors.groupingBy(item->List.of(item.getCompanyCode(), item.getCompanyName()), Collectors.toList())); + var result = new ArrayList(); + for (var key: groupMap.keySet()) { + var item = new CompanyItem(); + item.setProjectItems(groupMap.get(key)); + var project = groupMap.get(key).get(0); + item.setName(project.getCompanyName()); + item.setCode(project.getCompanyCode()); + item.setLevel(project.getCompanyLevel()); + item.setLevelType(project.getLevelType()); + item.setProjectLevel(project.getContractSectionFinalGrade()); + item.setSheetName(project.getSheetName()); + item.setOriginGrade(project.getOriginGrade()); + item.setCurrentGrade(project.getCurrentGrade()); + item.setNo(String.valueOf(no)); + item.setScore(project.getCompanyScore()); + item.setRemark(project.getCompanyRemark()); + no++; + result.add(item); + } + return result; + } +} diff --git a/src/test/java/mjkf/xinke/model/LevelItem.java b/src/test/java/mjkf/xinke/model/LevelItem.java new file mode 100644 index 0000000..b5006fd --- /dev/null +++ b/src/test/java/mjkf/xinke/model/LevelItem.java @@ -0,0 +1,34 @@ +package mjkf.xinke.model; + +import cn.hutool.core.convert.Convert; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Data +public class LevelItem { + public String name; + public String level; + public String sheetName; + public String no; + public List levelTypeItems; + + static public List toItems(List levelTypeItems) { + var no = 1; + var groupMap = levelTypeItems.stream().collect(Collectors.groupingBy(item->item.getLevel(), Collectors.toList())); + var result = new ArrayList(); + for (String key: groupMap.keySet()) { + var item = new LevelItem(); + item.setLevelTypeItems(groupMap.get(key)); + var company = groupMap.get(key).get(0); + item.setLevel(company.getLevel()); + item.setSheetName(company.getSheetName()); + item.setNo(Convert.numberToChinese(no, false)); + no++; + result.add(item); + } + return result; + } +} diff --git a/src/test/java/mjkf/xinke/model/LevelTypeItem.java b/src/test/java/mjkf/xinke/model/LevelTypeItem.java new file mode 100644 index 0000000..d87ef0b --- /dev/null +++ b/src/test/java/mjkf/xinke/model/LevelTypeItem.java @@ -0,0 +1,42 @@ +package mjkf.xinke.model; + +import cn.hutool.core.convert.Convert; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Data +public class LevelTypeItem { + public String no; + public Integer levelType; // 1=降级,2=其他 + public String originGrade; + public String currentGrade; + public String level; + public List companyItems; + public String sheetName; + + static public List toItems(List companyItems) { + var groupMap = companyItems.stream().collect(Collectors.groupingBy(item->List.of( + item.getLevelType(), item.getLevel(), item.getOriginGrade() + ), Collectors.toList())); + var result = new ArrayList(); + for (List key: groupMap.keySet()) { + var levelType = (Integer) key.get(0); + var level = (String) key.get(1); + var originGrade = (String) key.get(2); + var item = new LevelTypeItem(); + item.setLevelType(levelType); + item.setLevel(level); + item.setCompanyItems(groupMap.get(key)); + var company = groupMap.get(key).get(0); + item.setOriginGrade(originGrade); + item.setCurrentGrade(company.getCurrentGrade()); + item.setSheetName(company.getSheetName()); + item.setNo(Convert.numberToChinese(levelType, false)); + result.add(item); + } + return result; + } +} diff --git a/src/test/java/mjkf/xinke/model/ProjectItem.java b/src/test/java/mjkf/xinke/model/ProjectItem.java new file mode 100644 index 0000000..aa475ee --- /dev/null +++ b/src/test/java/mjkf/xinke/model/ProjectItem.java @@ -0,0 +1,54 @@ +package mjkf.xinke.model; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class ProjectItem { + + public String companyName; + public String companyCode; + public String companyLevel; + public Integer levelType; // 1=降级,2=其他 + public String sheetName; + public String OriginGrade; + public String CurrentGrade; + public String name; + public String contractSectionNo; + public String contractPrice; + public String contractSectionFinalGrade; + public String companyScore; + public String score; + public List otherField; + public List otherField2; + public String companyRemark; + + public ProjectItem() {} + + public ProjectItem( + String companyName, String companyCode, String companyLevel, Integer levelType, + String OriginGrade, String CurrentGrade, String name, String contractSectionNo, String contractPrice, + String contractSectionFinalGrade, List otherField, String score, String companyScore, + List otherField2, String companyRemark + ) { + this.companyName = companyName; + this.companyCode = companyCode; + this.companyLevel = companyLevel; + this.levelType = levelType; +// this.sheetName = sheetName; + this.OriginGrade = OriginGrade; + this.CurrentGrade = CurrentGrade; + this.name = name; + this.contractSectionNo = contractSectionNo; + this.contractPrice = contractPrice; + this.contractSectionFinalGrade = contractSectionFinalGrade; + this.otherField = new ArrayList<>(); + this.otherField.addAll(otherField); + this.score = score; + this.companyScore = companyScore; + this.otherField2 = otherField2; + this.companyRemark = companyRemark; + } +} diff --git a/src/test/java/mjkf/xinke/model/SheetItem.java b/src/test/java/mjkf/xinke/model/SheetItem.java new file mode 100644 index 0000000..cc4e264 --- /dev/null +++ b/src/test/java/mjkf/xinke/model/SheetItem.java @@ -0,0 +1,107 @@ +package mjkf.xinke.model; + +import cn.hutool.core.convert.Convert; +import lombok.Data; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Data +public class SheetItem { + + public String name; + public List headers; + public List headers2; + public List levelItems; + public String no; + + static public List toItems(List levelItems) { + var groupMap = levelItems.stream().collect(Collectors.groupingBy(item->item.getSheetName(), Collectors.toList())); + var result = new ArrayList(); + for (String key: groupMap.keySet()) { + var item = new SheetItem(); + item.setLevelItems(groupMap.get(key)); + var levelItem = groupMap.get(key).get(0); + item.setName(levelItem.getSheetName()); + result.add(item); + } + return result; + } + + public SheetItem() { + } + + public SheetItem(String name, List headers, List levelItems, String no, List headers2) { + this.name = name; + this.headers = headers; + this.headers2 = headers2; + this.levelItems = levelItems; + this.no = no; + this.sort(); + this.buildNo(); + } + + /** + * 生成序号 + */ + private void buildNo() { + var companyNo = 0; + var levelTypeNo = 1; + var levelNo = 1; + + var levelItems = this.levelItems; + for (var levelItem: levelItems) { + levelItem.setNo(Convert.numberToChinese(levelNo, false)); + levelNo++; + levelTypeNo = 1; + companyNo = 0; + var previousCompanyProjectCount = 0; + var previousCompanyScore = ""; + for (var levelTypeItem : levelItem.levelTypeItems) { + levelTypeItem.setNo(Convert.numberToChinese(levelTypeNo, false)); + levelTypeNo++; + for (var companyItem: levelTypeItem.companyItems) { + if (companyItem.projectItems.size() == previousCompanyProjectCount && companyItem.score.equals(previousCompanyScore)) { + // 项目数量相同且公司分数相同时排名并列 + } else { + companyNo++; + } + previousCompanyProjectCount = companyItem.projectItems.size(); + previousCompanyScore = companyItem.score; + companyItem.setNo(String.valueOf(companyNo)); + } + } + } + } + + private Integer gradeSortFlag(String grade) { + var map = Map.of("AA", 0, "A", 1, "B", 2, "C", 3, "D", 4); + var result = map.get(grade); + if (result == null) { + return 999999999; + } + return result; + } + + /** + * 排序 + */ + private void sort() { + var levelItems = this.levelItems; + levelItems.sort(Comparator.comparing(item -> gradeSortFlag(item.getLevel()))); + for (var levelItem: levelItems) { + levelItem.levelTypeItems.sort(Comparator.comparingInt(LevelTypeItem::getLevelType)); + for (var levelTypeItem : levelItem.levelTypeItems) { + levelTypeItem.companyItems.sort(Comparator.comparing(item -> -Float.valueOf(item.score))); + levelTypeItem.companyItems.sort(Comparator.comparing(item -> -item.projectItems.size())); + for (var companyItem: levelTypeItem.companyItems) { + companyItem.projectItems.sort(Comparator.comparing(item->-Float.valueOf(item.contractPrice))); + companyItem.projectItems.sort(Comparator.comparing(item -> gradeSortFlag(item.getContractSectionFinalGrade()))); + } + } + } + } +}