From a3c56df9103146391f5f12876e54dbf72d5e8633 Mon Sep 17 00:00:00 2001 From: Kane Wang Date: Mon, 23 Oct 2023 17:46:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E8=BF=9B=E5=BA=A6=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BI部门渗透率续保率统计表.sql | 4 +- .../xim/utils/data/ImportBIExcelData.java | 87 +++++++++++------- .../controllers/fileupload/FileUpload.java | 29 ++++-- .../mapper/ImportBIArchievementDataMapper.xml | 4 +- ...续保率 .xlsx => 坐席续保率.xlsx} | Bin 数据/测试用/坐席车非渗透.xlsx | Bin 24579 -> 24579 bytes 数据/测试用/测试11.xlsx | Bin 0 -> 5990 bytes ...保率.xlsx => 部门 - 副本 (2).xlsx} | Bin 数据/测试用/部门 - 副本.xlsx | Bin 0 -> 6065 bytes 数据/测试用/部门.xlsx | Bin 0 -> 6065 bytes 10 files changed, 75 insertions(+), 49 deletions(-) rename 数据/测试用/{坐席续保率 .xlsx => 坐席续保率.xlsx} (100%) create mode 100644 数据/测试用/测试11.xlsx rename 数据/测试用/{BI部门渗透率续保率.xlsx => 部门 - 副本 (2).xlsx} (100%) create mode 100644 数据/测试用/部门 - 副本.xlsx create mode 100644 数据/测试用/部门.xlsx diff --git a/code/db/建表/BI部门渗透率续保率统计表.sql b/code/db/建表/BI部门渗透率续保率统计表.sql index f08d07c..3c14d23 100644 --- a/code/db/建表/BI部门渗透率续保率统计表.sql +++ b/code/db/建表/BI部门渗透率续保率统计表.sql @@ -4,9 +4,9 @@ create table BI varchar2(100) not null, "Ŀֵ-" number default 0 not null, Ŀ number default 0 not null, - "ձ()" number default 0 not null, + "ձ" number default 0 not null, ձռ number default 0 not null, - "dz()" number default 0 not null, + "dz" number default 0 not null, ±͸ number default 0 not null, ͸ʻ number default 0 not null, ¿ͻ͸ number default 0 not null, diff --git a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/utils/data/ImportBIExcelData.java b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/utils/data/ImportBIExcelData.java index 99d3867..4c0ecaf 100644 --- a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/utils/data/ImportBIExcelData.java +++ b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/utils/data/ImportBIExcelData.java @@ -31,14 +31,13 @@ import com.cpic.xim.utils.poi.MyPOIUtils; */ public final class ImportBIExcelData { - private static Logger logger = - LoggerFactory.getLogger( ImportBIExcelData.class ); + private static Logger logger = LoggerFactory.getLogger( ImportBIExcelData.class ); - private static String[] TelsalerAttachingRateExcelTitle = new String[] + private static String[] TelsalerAttachingRateExcelTitle = new String[] { "部门", "经办", "车险保费(万)", "车险保费占比", "非车保费(万)", "当月保费渗透率", "保费渗透率环比上月", "当月客户渗透率", "客户渗透率环比上月", "当月车非客均保费", "客均保费环比上月"}; - private static String[] TelSalerRenewalRateExcelTitle = new String[] + private static String[] TelSalerRenewalRateExcelTitle = new String[] { "责任人", "机构目标值1(%)", "到期数-全月", "序时到期数占比(%)", "个车续保率(序时)(%)", "个车续保率(全月)(%)", "环比昨日(%)", "环比上月(%)"}; @@ -56,7 +55,7 @@ public final class ImportBIExcelData * @return 返回判断结果 */ private static boolean checkExcelFormat( Sheet sheet, String caption, int captionRowIndex, - String[] title, int titleRowIndex ) throws InvalidFormatException + String[] title, int titleRowIndex ) { boolean result = true; @@ -96,6 +95,8 @@ public final class ImportBIExcelData result = false; break; } + + cellIndex++; } } catch ( NullPointerException error ) @@ -130,6 +131,12 @@ public final class ImportBIExcelData wb = WorkbookFactory.create( new File( filePath ) ); sheet = wb.getSheetAt( SheetIndex ); + // 先验证格式,不对就抛出错误 + if ( !checkExcelFormat( sheet, null, 0, TelsalerAttachingRateExcelTitle, 0 ) ) + { + throw new InvalidFormatException("Excel文件格式错误,请检查报表内容!" ); + } + for ( Row row : sheet ) { String name = ""; @@ -153,24 +160,24 @@ public final class ImportBIExcelData } // 车险保费 - double motoPremium = MyPOIUtils.getNumbericCellValue( row, 2 ); + double motoPremium = MyPOIUtils.getNumbericCellValue( row, 2 ) * 10000; // 非车险保费 - double nomotoPremium = MyPOIUtils.getNumbericCellValue( row, 4 ); + double nomotoPremium = MyPOIUtils.getNumbericCellValue( row, 4 ) * 10000; // 车险保费占比 - double motoPremiumProPortion = MyPOIUtils.getNumbericCellValue( row, 3 ); + double motoPremiumProPortion = MyPOIUtils.getNumbericCellValue( row, 3 ) * 100; // 当月保费渗透率 - double attachingRate = MyPOIUtils.getNumbericCellValue( row, 5 ); - // 保费手头率环比上月 - double attachingRateChange = MyPOIUtils.getNumbericCellValue( row, 6 ); + double attachingRate = MyPOIUtils.getNumbericCellValue( row, 5 ) * 100; + // 保费渗透率环比上月 + double attachingRateChange = MyPOIUtils.getNumbericCellValue( row, 6 ) * 100; // 当月客户渗透率 - double customerHandleRateCell = MyPOIUtils.getNumbericCellValue( row, 7 ); + double customerHandleRateCell = MyPOIUtils.getNumbericCellValue( row, 7 ) * 100; // 客户渗透率环比上月 - double customerHandleRateChangeCell = MyPOIUtils.getNumbericCellValue( row, 8 ); + double customerHandleRateChangeCell = MyPOIUtils.getNumbericCellValue( row, 8 ) * 100; // 当月车非客均保费 - double noMotoPremiumPerCustomerCell = MyPOIUtils.getNumbericCellValue( row, 9 ); + double noMotoPremiumPerCustomerCell = MyPOIUtils.getNumbericCellValue( row, 9 ) * 100; // 客均保费环比上月 double noMotoPremiumPerCustomerChangeCell = - MyPOIUtils.getNumbericCellValue( row, 10 ); + MyPOIUtils.getNumbericCellValue( row, 10 ) * 100; BITelsalerAttachingRateRecord record = new BITelsalerAttachingRateRecord( LocalDate.now(), name, motoPremium, nomotoPremium, @@ -222,7 +229,7 @@ public final class ImportBIExcelData */ public static ArrayList importBITelsalerRenewalRateFromXlsx( String filePath, int sheetIndex, int firstRow, LocalDate summaryDate ) - throws IOException + throws IOException, InvalidFormatException { ArrayList records = new ArrayList<>( 200 ); @@ -235,6 +242,11 @@ public final class ImportBIExcelData sheet = wb.getSheetAt( sheetIndex ); int rowIndex = 0; + if (!checkExcelFormat( sheet, null, 0, TelSalerRenewalRateExcelTitle, 0 )) + { + throw new InvalidFormatException("格式错误,请检查报表内容!"); + } + for ( Row row : sheet ) { rowIndex = row.getRowNum(); @@ -254,13 +266,13 @@ public final class ImportBIExcelData continue; } - double 机构目标值 = MyPOIUtils.getNumbericCellValue( row, 1 ); - double 到期数全月 = MyPOIUtils.getNumbericCellValue( row, 2 ); - double 序时到期数占比 = MyPOIUtils.getNumbericCellValue( row, 3 ); - double 个车续保率序时 = MyPOIUtils.getNumbericCellValue( row, 4 ); - double 个车续保率全月 = MyPOIUtils.getNumbericCellValue( row, 5 ); - double 环比昨日 = MyPOIUtils.getNumbericCellValue( row, 6 ); - double 环比上月 = MyPOIUtils.getNumbericCellValue( row, 7 ); + double 机构目标值 = MyPOIUtils.getNumbericCellValue( row, 1 ) * 100; + double 到期数全月 = MyPOIUtils.getNumbericCellValue( row, 2 ) * 100; + double 序时到期数占比 = MyPOIUtils.getNumbericCellValue( row, 3 ) * 100; + double 个车续保率序时 = MyPOIUtils.getNumbericCellValue( row, 4 ) * 100; + double 个车续保率全月 = MyPOIUtils.getNumbericCellValue( row, 5 ) * 100; + double 环比昨日 = MyPOIUtils.getNumbericCellValue( row, 6 ) * 100; + double 环比上月 = MyPOIUtils.getNumbericCellValue( row, 7 ) * 100; BITelsalerRenewalRateRecord record = new BITelsalerRenewalRateRecord( 责任人, 机构目标值, 到期数全月, 序时到期数占比, 个车续保率序时, 个车续保率全月, 环比昨日, 环比上月 ); @@ -294,7 +306,7 @@ public final class ImportBIExcelData } public static ArrayList importBIDepartmentArchievementRecords( - String filePath, int sheetIndex, int firstRow ) throws IOException + String filePath, int sheetIndex, int firstRow ) throws IOException, InvalidFormatException { ArrayList records = new ArrayList<>( 5 ); @@ -307,6 +319,11 @@ public final class ImportBIExcelData Sheet sheet = wb.getSheetAt( sheetIndex ); int rowIndex = 0; + if (!checkExcelFormat( sheet, null, 0, DepartmentArchievementExcelTitle, 0 )) + { + throw new InvalidFormatException("Excel文件格式错误,请检查报表内容!"); + } + for ( Row row : sheet ) { rowIndex = row.getRowNum(); @@ -326,17 +343,17 @@ public final class ImportBIExcelData continue; } - double departmentObject = MyPOIUtils.getNumbericCellValue( row, 1 ); - double objectGap = MyPOIUtils.getNumbericCellValue( row, 1 ); - double motoPremium = MyPOIUtils.getNumbericCellValue( row, 1 ); - double motoPremiumProPortion = MyPOIUtils.getNumbericCellValue( row, 1 ); - double nomotoPremium = MyPOIUtils.getNumbericCellValue( row, 1 ); - double attachingRate = MyPOIUtils.getNumbericCellValue( row, 1 ); - double attachingRateChange = MyPOIUtils.getNumbericCellValue( row, 1 ); - double customerHandleRate = MyPOIUtils.getNumbericCellValue( row, 1 ); - double customerHandleRateChange = MyPOIUtils.getNumbericCellValue( row, 1 ); - double premiumPerCustomer = MyPOIUtils.getNumbericCellValue( row, 1 ); - double premiumPerCustomerChange = MyPOIUtils.getNumbericCellValue( row, 1 ); + double departmentObject = MyPOIUtils.getNumbericCellValue( row, 1 ) * 100; + double objectGap = MyPOIUtils.getNumbericCellValue( row, 2 ) * 100; + double motoPremium = MyPOIUtils.getNumbericCellValue( row, 3 ) * 10000; + double motoPremiumProPortion = MyPOIUtils.getNumbericCellValue( row, 4 ) * 100; + double nomotoPremium = MyPOIUtils.getNumbericCellValue( row, 5 ) * 10000; + double attachingRate = MyPOIUtils.getNumbericCellValue( row, 6 ) * 100; + double attachingRateChange = MyPOIUtils.getNumbericCellValue( row, 7 ) * 100; + double customerHandleRate = MyPOIUtils.getNumbericCellValue( row, 8 ) * 100; + double customerHandleRateChange = MyPOIUtils.getNumbericCellValue( row, 9 ) * 100; + double premiumPerCustomer = MyPOIUtils.getNumbericCellValue( row, 10 ) * 100; + double premiumPerCustomerChange = MyPOIUtils.getNumbericCellValue( row, 11 ) * 100; BIDepartmentArchievementRecord record = new BIDepartmentArchievementRecord( departmentName, departmentObject, objectGap, motoPremium, diff --git a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/fileupload/FileUpload.java b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/fileupload/FileUpload.java index f032461..fabef8f 100644 --- a/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/fileupload/FileUpload.java +++ b/code/后端/desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/fileupload/FileUpload.java @@ -2,7 +2,7 @@ * @Author: Kane * @Date: 2023-01-22 23:11:26 * @LastEditors: Kane - * @LastEditTime: 2023-10-16 10:51:36 + * @LastEditTime: 2023-10-23 17:01:29 * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/fileupload/FileUpload.java * @Description: 用于接受上传文件的Controller。 * @@ -51,6 +51,15 @@ public class FileUpload result.setSuccess( true ); result.setMessage( "上传成功!" ); + + String filePath = request.getServletContext().getRealPath( "/temp/upload/" + sessionID ); + File dir = new File( filePath ); + + if ( !dir.mkdirs() ) + { + + } + // 检查文件长度,如果为0则跳过 if ( file.isEmpty() ) { @@ -60,10 +69,10 @@ public class FileUpload else { // 保存文件到临时目录 - Long milliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli(); - String filePath = - request.getServletContext().getRealPath( "/temp/upload/" + sessionID ); - String fileName = String.valueOf(milliSecond) + file.getOriginalFilename(); + Long milliSecond = + LocalDateTime.now().toInstant( ZoneOffset.of( "+8" ) ).toEpochMilli(); + String fileName = String.valueOf( milliSecond ) + file.getOriginalFilename(); + // String fileName = file.getOriginalFilename(); File destFile = new File( filePath, fileName ); try @@ -72,14 +81,14 @@ public class FileUpload // 把上传文件的绝对路径保存,返回给前端 fileNames.add( destFile.getAbsolutePath() ); - result.setSuccess(true); - result.setMessage("上传成功"); - result.setFileList(fileNames); + result.setSuccess( true ); + result.setMessage( "上传成功" ); + result.setFileList( fileNames ); } catch ( IOException error ) { - result.setSuccess(false); - result.setMessage("上传失败,原因:" + error.getMessage()); + result.setSuccess( false ); + result.setMessage( "上传失败,原因:" + error.getMessage() ); } } diff --git a/code/后端/desktop_archievement_backend/src/main/resources/mybatis/mapper/ImportBIArchievementDataMapper.xml b/code/后端/desktop_archievement_backend/src/main/resources/mybatis/mapper/ImportBIArchievementDataMapper.xml index a679ba8..48c820a 100644 --- a/code/后端/desktop_archievement_backend/src/main/resources/mybatis/mapper/ImportBIArchievementDataMapper.xml +++ b/code/后端/desktop_archievement_backend/src/main/resources/mybatis/mapper/ImportBIArchievementDataMapper.xml @@ -17,8 +17,8 @@ - insert into BI部门渗透率续保率统计表 ( 部门,"目标值-机构",目标差距,"车险保费(万)", - 车险保费占比,"非车保费(万)",当月保费渗透率,保费渗透率环比上月,当月客户渗透率, + insert into BI部门渗透率续保率统计表 ( 部门,"目标值-机构",目标差距,"车险保费", + 车险保费占比,"非车保费",当月保费渗透率,保费渗透率环比上月,当月客户渗透率, 客户渗透率环比上月,当月车非客均保费,客均保费环比上月) values (#{departmentName},#{departmentObject},#{objectGap},#{motoPremium}, #{motoPremiumProPortion},#{nomotoPremium},#{attachingRate},#{attachingRateChange}, diff --git a/数据/测试用/坐席续保率 .xlsx b/数据/测试用/坐席续保率.xlsx similarity index 100% rename from 数据/测试用/坐席续保率 .xlsx rename to 数据/测试用/坐席续保率.xlsx diff --git a/数据/测试用/坐席车非渗透.xlsx b/数据/测试用/坐席车非渗透.xlsx index e57de6c2d98a87e8b31ac4a6672df0e7969ed97d..70ae667d7166da5b4e0499eb4befe767079eb329 100644 GIT binary patch delta 187 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 Q|M0F}L08G{`IUnI0S#FhssI20 literal 0 HcmV?d00001 diff --git a/数据/测试用/BI部门渗透率续保率.xlsx b/数据/测试用/部门 - 副本 (2).xlsx similarity index 100% rename from 数据/测试用/BI部门渗透率续保率.xlsx rename to 数据/测试用/部门 - 副本 (2).xlsx diff --git a/数据/测试用/部门 - 副本.xlsx b/数据/测试用/部门 - 副本.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..16aecf1f2e231011d52a005cbc59e376e7203ca3 GIT binary patch literal 6065 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 literal 0 HcmV?d00001 diff --git a/数据/测试用/部门.xlsx b/数据/测试用/部门.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..16aecf1f2e231011d52a005cbc59e376e7203ca3 GIT binary patch literal 6065 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 literal 0 HcmV?d00001