From 92d5d75e5944f487f3f12a753475afba6e2a273d Mon Sep 17 00:00:00 2001 From: Kane Wang Date: Tue, 22 Jun 2021 11:41:13 +0800 Subject: [PATCH] ... --- .../cpic/telsale/DataImport/DataImport.java | 219 ++++++++++++------ .../com/cpic/telsale/TelsalePolicyRecord.java | 134 ++++++++++- .../uploadData/uploadDataProcessor.java | 56 +++-- .../项目/包/telsale_policy_check_pkg.pck | 65 ++++++ .../项目/包/telsale_policy_check_pkg.~pck | 100 ++++++++ .../项目/电销保单信息管理.dsk | 20 ++ 数据/测试数据/有空行.xls | Bin 0 -> 24576 bytes .../有空行,有保单号错误.xls | Bin 0 -> 26112 bytes 数据/测试数据/转介绍模板.xls | Bin 0 -> 25088 bytes 9 files changed, 502 insertions(+), 92 deletions(-) create mode 100644 代码/oracle/项目/包/telsale_policy_check_pkg.~pck create mode 100644 数据/测试数据/有空行.xls create mode 100644 数据/测试数据/有空行,有保单号错误.xls create mode 100644 数据/测试数据/转介绍模板.xls diff --git a/代码/jsp/telsale_import/src/com/cpic/telsale/DataImport/DataImport.java b/代码/jsp/telsale_import/src/com/cpic/telsale/DataImport/DataImport.java index 281c319..7d9b505 100644 --- a/代码/jsp/telsale_import/src/com/cpic/telsale/DataImport/DataImport.java +++ b/代码/jsp/telsale_import/src/com/cpic/telsale/DataImport/DataImport.java @@ -25,10 +25,9 @@ public class DataImport * @Author: 王炜 * @Date: 2021/6/21 */ - public static ArrayList readTelsalePolicyDataFromXlsx(String fileName, int sheetIndex) throws - IOException, - SQLException, - XlsFileFormatException + public static ArrayList readTelsalePolicyDataFromXlsx( String fileName, int sheetIndex ) + throws IOException, + XlsFileFormatException { ArrayList policyList = new ArrayList(); @@ -39,32 +38,79 @@ public class DataImport HSSFSheet sheet = null; HSSFRow row = null; - int rowIndex = 0; - int rowCount = 0; + int rowIndex = 0; + int rowCount = 0; + int errorCount = 0; + String errorMessage = "数据错误,请修正后重新上传!
\n"; - try { - xlsxFile = new FileInputStream(fileName); - workBook = new HSSFWorkbook(xlsxFile); - sheet = workBook.getSheetAt(sheetIndex); - rowIndex = sheet.getFirstRowNum() + 1; + try + { + xlsxFile = new FileInputStream( fileName ); + workBook = new HSSFWorkbook( xlsxFile ); + sheet = workBook.getSheetAt( sheetIndex ); + rowIndex = sheet.getFirstRowNum(); rowCount = sheet.getLastRowNum(); - row = sheet.getRow(rowIndex); - while (rowIndex <= rowCount) { + while ( rowIndex <= rowCount ) + { //用第一个单元格判断是不是空行,如果cell为null视为空行 - HSSFCell cell = row.getCell(0); + row = sheet.getRow( rowIndex ); + HSSFCell cell = row.getCell( 0 ); - if (cell == null) { + if ( cell == null ) + { rowIndex++; continue; } String policyNo = cell.getStringCellValue(); - String operatorCode = getStringValueFromHSSFCell(row.getCell(1)); + String operatorCode = getStringValueFromHSSFCell( row.getCell( 1 ) ); + + //判断数据是否有效 + if ( policyNo.length() != 20 || operatorCode.length() == 0 || operatorCode.length() > 6 ) + { + errorMessage += "第" + ( rowIndex + 1 ) + "行,"; + + if ( policyNo.length() != 20 ) + { + //以后再加入正则表达式判断 + errorMessage += "保单号" + policyNo + "错误!"; + } + + if ( operatorCode.length() == 0 || operatorCode.length() > 6 ) + { + errorMessage += "经办人" + operatorCode + "错误!"; + } + + errorMessage += "
\n"; + + rowIndex++; + errorCount++; + + continue; + } + + //读取数据 + record = new TelsalePolicyRecord( policyNo, operatorCode ); + + policyList.add( record ); + + rowIndex++; } + } + finally + { + if ( workBook != null ) + { + workBook.close(); + xlsxFile.close(); + } + } - } catch (IOException error) { - + //判断是否要抛出读取错误 + if ( errorCount > 0 ) + { + throw new XlsFileFormatException( errorMessage ); } return policyList; @@ -82,13 +128,13 @@ public class DataImport * @throws SQLException 数据库异常 * @throws XlsFileFormatException xls文件格式错误异常 */ - public static String importTelsalePolicyDataFromXlsx(String fileName, - String telsalePolicyOperatorListTableName, - String informixURL) throws - IOException, - ClassNotFoundException, - SQLException, - XlsFileFormatException + public static String importTelsalePolicyDataFromXlsx( String fileName, + String telsalePolicyOperatorListTableName, + String informixURL ) + throws IOException, + ClassNotFoundException, + SQLException, + XlsFileFormatException { String importResult = ""; String importMessage = null; @@ -103,23 +149,25 @@ public class DataImport HSSFSheet sheet = null; HSSFRow row = null; - try { - xlsFileIn = new FileInputStream(fileName); - xlsFile = new HSSFWorkbook(xlsFileIn); - sheet = xlsFile.getSheetAt(0); //第一个sheet + try + { + xlsFileIn = new FileInputStream( fileName ); + xlsFile = new HSSFWorkbook( xlsFileIn ); + sheet = xlsFile.getSheetAt( 0 ); //第一个sheet rowIndex = sheet.getFirstRowNum() + 1; rowCount = sheet.getLastRowNum(); - row = sheet.getRow(rowIndex); - } catch (IOException error) //有文件格式错误的可能。 + row = sheet.getRow( rowIndex ); + } + catch ( IOException error ) //有文件格式错误的可能。 { xlsFile.close(); xlsFileIn.close(); - throw new XlsFileFormatException("文件格式错误,请检查是否xls格式文件。"); + throw new XlsFileFormatException( "文件格式错误,请检查是否xls格式文件。" ); } //informix相关 - Class.forName("com.informix.jdbc.IfxDriver"); + Class.forName( "com.informix.jdbc.IfxDriver" ); String ifxSql = "INSERT INTO " + telsalePolicyOperatorListTableName + " \n" + " (bdh,\n" + @@ -153,10 +201,10 @@ public class DataImport " 1,\n" + " '800',\n" + " today)"; - Connection ifxConn = DriverManager.getConnection(informixURL); - PreparedStatement ifxStmt = ifxConn.prepareStatement(ifxSql); + Connection ifxConn = DriverManager.getConnection( informixURL ); + PreparedStatement ifxStmt = ifxConn.prepareStatement( ifxSql ); - ifxConn.setAutoCommit(false);//关闭自动提交,整个表格要么全部成写入,要么全部失败。 + ifxConn.setAutoCommit( false );//关闭自动提交,整个表格要么全部成写入,要么全部失败。 //数据相关 String policyNo = null; @@ -164,38 +212,42 @@ public class DataImport StaffInfo staff = null; boolean isSuccess = true; //标志位,用来指示在保存过程中是否出现错误。 - while (rowIndex <= rowCount) { + while ( rowIndex <= rowCount ) + { //用来判断是不是空行 - HSSFCell cell = row.getCell(0); + HSSFCell cell = row.getCell( 0 ); - if (cell == null) { + if ( cell == null ) + { rowIndex++; continue; } - policyNo = row.getCell(0).getStringCellValue().trim(); - operatorCode = getStringValueFromHSSFCell(row.getCell(1)); + policyNo = row.getCell( 0 ).getStringCellValue().trim(); + operatorCode = getStringValueFromHSSFCell( row.getCell( 1 ) ); //判断一下是不是空的单元格 - if (policyNo.length() == 0 || operatorCode.length() == 0) { + if ( policyNo.length() == 0 || operatorCode.length() == 0 ) + { importResult = importResult + "第" + rowIndex + "行数据为空。
"; //isSuccess = false; } else //不是空单元格,进行处理 { - try { + try + { //取得经办人信息 - staff = new StaffInfo(operatorCode); + staff = new StaffInfo( operatorCode ); //写入informix - ifxStmt.setString(1, policyNo); - ifxStmt.setString(2, staff.getStaffCode()); - ifxStmt.setString(3, staff.getStaffName()); - ifxStmt.setString(4, staff.getSectionOfficeCode()); - ifxStmt.setString(5, staff.getSectionOfficeName()); - ifxStmt.setString(6, staff.getDepartmentCode()); - ifxStmt.setString(7, staff.getDepartmentName()); + ifxStmt.setString( 1, policyNo ); + ifxStmt.setString( 2, staff.getStaffCode() ); + ifxStmt.setString( 3, staff.getStaffName() ); + ifxStmt.setString( 4, staff.getSectionOfficeCode() ); + ifxStmt.setString( 5, staff.getSectionOfficeName() ); + ifxStmt.setString( 6, staff.getDepartmentCode() ); + ifxStmt.setString( 7, staff.getDepartmentName() ); //ifxStmt.setString( 8, getStringValueFromHSSFCell( row.getCell( 6 ) ) ); //ifxStmt.setString( 9, getStringValueFromHSSFCell( row.getCell( 3 ) ) ); //ifxStmt.setString( 10, getStringValueFromHSSFCell( row.getCell( 2 ) ) ); @@ -206,7 +258,9 @@ public class DataImport importResult = importResult + "第" + rowIndex + "行,保单号" + policyNo + ",转介绍信息入成功!
"; successCount++; - } catch (StaffCodeNotExistException error) { + } + catch ( StaffCodeNotExistException error ) + { //经办人不存在 importResult = importResult + "第" + rowIndex + "行,保单号" + policyNo + ",经办人" + operatorCode + "不存在。
"; @@ -215,7 +269,9 @@ public class DataImport //计数 failCount++; - } catch (OracleConnectionException error) { + } + catch ( OracleConnectionException error ) + { //查询工号失败 importResult = importResult + "第" + rowIndex + "行,保单号" + policyNo + ",经办人" + operatorCode + ",查询工号失败。
"; @@ -224,10 +280,13 @@ public class DataImport //计数 failCount++; - } catch (SQLException error) { + } + catch ( SQLException error ) + { int errorCode = error.getErrorCode(); - switch (errorCode) { + switch ( errorCode ) + { case -268: //保单号重复 importResult = importResult + "第" + rowIndex + "行,保单号" + policyNo + ",已录入过转介绍信息!" + error.getCause() + "。
"; break; @@ -243,7 +302,9 @@ public class DataImport //计数 failCount++; - } catch (Exception error) { + } + catch ( Exception error ) + { //写入错误 importResult = importResult + "第" + rowIndex + "行,保单号" + policyNo + ",数据库写入错误,错误信息:" + error.getMessage() + "。
"; @@ -252,13 +313,15 @@ public class DataImport //计数 failCount++; - } finally { + } + finally + { ifxConn.commit(); } } rowIndex++; - row = sheet.getRow(rowIndex); + row = sheet.getRow( rowIndex ); } //判断标志位,如果为false,则说明在保存过程中出现了错误,放弃所有过程,进行回滚。 @@ -277,7 +340,7 @@ public class DataImport xlsFileIn.close(); //日志 - importMessage = "读取记录数量:" + (rowIndex - 1) + + importMessage = "读取记录数量:" + ( rowIndex - 1 ) + "
写入记录数量:" + successCount + "
错误记录数量:" + failCount + "
"; @@ -298,37 +361,45 @@ public class DataImport return importMessage; } - private static String getStringValueFromHSSFCell(HSSFCell cell) + private static String getStringValueFromHSSFCell( HSSFCell cell ) { String value = null; - if (cell == null) { + if ( cell == null ) + { return ""; } - switch (cell.getCellType()) { - case HSSFCell.CELL_TYPE_NUMERIC: { + switch ( cell.getCellType() ) + { + case HSSFCell.CELL_TYPE_NUMERIC: + { //判断是不是整数 double dValue = cell.getNumericCellValue(); - if (dValue == (int) dValue) { - value = String.valueOf((int) dValue); + if ( dValue == (int) dValue ) + { + value = String.valueOf( (int) dValue ); } - else { - value = String.valueOf(dValue); + else + { + value = String.valueOf( dValue ); } break; } - case HSSFCell.CELL_TYPE_STRING: { + case HSSFCell.CELL_TYPE_STRING: + { value = cell.getStringCellValue(); break; } - case HSSFCell.CELL_TYPE_BLANK: { + case HSSFCell.CELL_TYPE_BLANK: + { value = ""; break; } - default: { + default: + { value = ""; break; } @@ -336,6 +407,14 @@ public class DataImport return value; } + + public static void saveTelsalePolicyDataToOracle( String dbURL, + String userName, + String password, + ArrayList policyList ) + { + + } } diff --git a/代码/jsp/telsale_import/src/com/cpic/telsale/TelsalePolicyRecord.java b/代码/jsp/telsale_import/src/com/cpic/telsale/TelsalePolicyRecord.java index 93f40d5..a04345d 100644 --- a/代码/jsp/telsale_import/src/com/cpic/telsale/TelsalePolicyRecord.java +++ b/代码/jsp/telsale_import/src/com/cpic/telsale/TelsalePolicyRecord.java @@ -16,8 +16,140 @@ public class TelsalePolicyRecord * @Date: 2021/6/21 */ public TelsalePolicyRecord( String policyNo, String operatorCode ) { + this.policyNo = policyNo; + this.operatorCode = operatorCode; } - + + public String getPolicyNo() + { + return policyNo; + } + + public void setPolicyNo( String policyNo ) + { + this.policyNo = policyNo; + } + + public String getOperatorCode() + { + return operatorCode; + } + + public void setOperatorCode( String operatorCode ) + { + this.operatorCode = operatorCode; + } + + public String getOperatorName() + { + return operatorName; + } + + public void setOperatorName( String operatorName ) + { + this.operatorName = operatorName; + } + + public String getOperatorSectionOfficeCode() + { + return operatorSectionOfficeCode; + } + + public void setOperatorSectionOfficeCode( String operatorSectionOfficeCode ) + { + this.operatorSectionOfficeCode = operatorSectionOfficeCode; + } + + public String getOperatorSectionOfficeName() + { + return operatorSectionOfficeName; + } + + public void setOperatorSectionOfficeName( String operatorSectionOfficeName ) + { + this.operatorSectionOfficeName = operatorSectionOfficeName; + } + + public String getOperatorSectionDepartmentCode() + { + return operatorSectionDepartmentCode; + } + + public void setOperatorSectionDepartmentCode( String operatorSectionDepartmentCode ) + { + this.operatorSectionDepartmentCode = operatorSectionDepartmentCode; + } + + public String getOperatorSectionDepartmentName() + { + return operatorSectionDepartmentName; + } + + public void setOperatorSectionDepartmentName( String operatorSectionDepartmentName ) + { + this.operatorSectionDepartmentName = operatorSectionDepartmentName; + } + + public String getEntryStaffCode() + { + return entryStaffCode; + } + + public void setEntryStaffCode( String entryStaffCode ) + { + this.entryStaffCode = entryStaffCode; + } + + public String getEntryStaffName() + { + return entryStaffName; + } + + public void setEntryStaffName( String entryStaffName ) + { + this.entryStaffName = entryStaffName; + } + + public String getEntryStaffSectionOfficeCode() + { + return entryStaffSectionOfficeCode; + } + + public void setEntryStaffSectionOfficeCode( String entryStaffSectionOfficeCode ) + { + this.entryStaffSectionOfficeCode = entryStaffSectionOfficeCode; + } + + public String getEntryStaffSectionOfficeName() + { + return entryStaffSectionOfficeName; + } + + public void setEntryStaffSectionOfficeName( String entryStaffSectionOfficeName ) + { + this.entryStaffSectionOfficeName = entryStaffSectionOfficeName; + } + + public String getEntryStaffSectionDepartmentCode() + { + return entryStaffSectionDepartmentCode; + } + + public void setEntryStaffSectionDepartmentCode( String entryStaffSectionDepartmentCode ) + { + this.entryStaffSectionDepartmentCode = entryStaffSectionDepartmentCode; + } + + public String getEntryStaffSectionDepartmentName() + { + return entryStaffSectionDepartmentName; + } + + public void setEntryStaffSectionDepartmentName( String entryStaffSectionDepartmentName ) + { + this.entryStaffSectionDepartmentName = entryStaffSectionDepartmentName; + } + private String policyNo; //经办人 private String operatorCode; diff --git a/代码/jsp/telsale_import/src/com/cpic/telsale/uploadData/uploadDataProcessor.java b/代码/jsp/telsale_import/src/com/cpic/telsale/uploadData/uploadDataProcessor.java index adffedc..4215eab 100644 --- a/代码/jsp/telsale_import/src/com/cpic/telsale/uploadData/uploadDataProcessor.java +++ b/代码/jsp/telsale_import/src/com/cpic/telsale/uploadData/uploadDataProcessor.java @@ -4,6 +4,7 @@ package com.cpic.telsale.uploadData; * Created by Kane on 2017/3/27. */ +import com.cpic.telsale.TelsalePolicyRecord; import org.apache.commons.fileupload.*; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; @@ -26,23 +27,31 @@ public class uploadDataProcessor extends HttpServlet private String telsalePolicyOperatorListTableName; //informix库电销转介绍表名 @Override - public void init( ServletConfig config ) throws ServletException + public void init( ServletConfig config ) + throws + ServletException { //获取参数 - oracleURL = ( String )config.getServletContext().getInitParameter( "oracleURL" ); - oracleUserName = ( String )config.getServletContext().getInitParameter( "oracleUserName" ); - oraclePassword = ( String )config.getServletContext().getInitParameter( "oraclePassword" ); + oracleURL = (String) config.getServletContext().getInitParameter( "oracleURL" ); + oracleUserName = (String) config.getServletContext().getInitParameter( "oracleUserName" ); + oraclePassword = (String) config.getServletContext().getInitParameter( "oraclePassword" ); //informix - informixURL = ( String )config.getServletContext().getInitParameter( "informixURL" ); - telsalePolicyOperatorListTableName = (String)config.getServletContext().getInitParameter( "telsalePolicyOperatorListTableName" ); + informixURL = (String) config.getServletContext().getInitParameter( "informixURL" ); + telsalePolicyOperatorListTableName = (String) config.getServletContext() + .getInitParameter( "telsalePolicyOperatorListTableName" ); } @Override - public void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException + public void doPost( HttpServletRequest request, HttpServletResponse response ) + throws + ServletException, + IOException { - tempPathRoot = ( String )request.getSession().getAttribute( "临时文件根目录" ); - String importMessage = null; + tempPathRoot = (String) request.getSession().getAttribute( "临时文件根目录" ); + + String importMessage = null; + ArrayList policyRecordList = new ArrayList(); try { @@ -53,39 +62,42 @@ public class uploadDataProcessor extends HttpServlet ServletFileUpload upload = new ServletFileUpload( factory ); List uploadFiles = upload.parseRequest( request ); - Iterator iterFiles = uploadFiles.iterator(); + Iterator iterFiles = uploadFiles.iterator(); while ( iterFiles.hasNext() ) { - FileItem fileItem = ( FileItem )iterFiles.next(); + FileItem fileItem = (FileItem) iterFiles.next(); if ( !fileItem.isFormField() ) { //保存上传的文件,返回文件完整路径。 String upLoadedFileName = saveUploadedFile( fileItem ); - importMessage = DataImport.importTelsalePolicyDataFromXlsx( upLoadedFileName, - telsalePolicyOperatorListTableName, - informixURL ); + //测试 + policyRecordList = DataImport.readTelsalePolicyDataFromXlsx( upLoadedFileName, 0 ); + +// importMessage = DataImport.importTelsalePolicyDataFromXlsx( upLoadedFileName, +// telsalePolicyOperatorListTableName, +// informixURL ); } } } - catch( FileUploadException error ) + catch ( FileUploadException error ) { //文件上传有异常,包装一下重新抛出 throw new ServletException( error.getMessage() ); } - catch( XlsFileFormatException error ) + catch ( XlsFileFormatException error ) { //文件格式异常 importMessage = error.getMessage(); } - catch( IOException error ) + catch ( IOException error ) { //包装一下重新抛出 throw new ServletException( error.getMessage() ); } - catch( Exception error ) + catch ( Exception error ) { throw new ServletException( error.getMessage() ); } @@ -104,12 +116,14 @@ public class uploadDataProcessor extends HttpServlet * @return * @throws Exception */ - private String saveUploadedFile( FileItem item ) throws Exception + private String saveUploadedFile( FileItem item ) + throws + Exception { String fileName = item.getName(); - int fileNameIndex = 0; - long fileSize = item.getSize(); + int fileNameIndex = 0; + long fileSize = item.getSize(); //文件路径中可能有使用\和/作为目录分隔符,要分别判断 fileNameIndex = fileName.lastIndexOf( "\\" ); diff --git a/代码/oracle/项目/包/telsale_policy_check_pkg.pck b/代码/oracle/项目/包/telsale_policy_check_pkg.pck index c09aff8..041cc5e 100644 --- a/代码/oracle/项目/包/telsale_policy_check_pkg.pck +++ b/代码/oracle/项目/包/telsale_policy_check_pkg.pck @@ -4,14 +4,51 @@ CREATE OR REPLACE PACKAGE telsale_policy_check_pkg IS -- Created : 2021/6/21 10:18:01 -- Purpose : ֤ + /***************************************************************************/ + --쳣 + --Ų + POLICYNO_NOT_EXIST_EXCEPT_CODE CONSTANT INTEGER := -20000; + POLICYNO_NOT_EXIST_EXCEPT_TEXT CONSTANT VARCHAR2(100) := 'Ųڡ'; + + --˲ + OPERATOE_CODE_NOT_EXIST_EXCEPT_CODE CONSTANT INTEGER := -20001; + OPERATOE_CODE_NOT_EXIST_EXCEPT_TEXT CONSTANT VARCHAR2(100) := '˹Ųڡ'; + + --¼˲ + ENTRY_STAFF_CODE_NOT_EXIST_EXCEPT_CODE CONSTANT INTEGER := -20002; + ENTRY_STAFF_CODE_NOT_EXIST_EXCEPT_TEXT CONSTANT VARCHAR2(100) := '¼˹Ųڡ'; + + --˹ڿ뱣ƥ + OPERATOE_CODE_NOT_MATCH_EXCEPT_CODE CONSTANT INTEGER := -20003; + OPERATOE_CODE_NOT_MATCH_EXCEPT_TEXT CONSTANT VARCHAR2(100) := '˹ڿ뱣ƥ䡣'; + + /***************************************************************************/ FUNCTION policy_check(a_policy_no VARCHAR2) RETURN BOOLEAN; FUNCTION staff_check(a_stuff_code VARCHAR2) RETURN BOOLEAN; + PROCEDURE save_policy + ( + a_policy_no IN VARCHAR2, + a_operator_code IN VARCHAR2, + a_operator_name OUT VARCHAR2, + a_operator_sectionoffice_code OUT VARCHAR2, + a_operator_sectionoffice_name OUT VARCHAR2, + a_operator_department_code OUT VARCHAR2, + a_operator_department_name OUT VARCHAR2, + a_entry_staff_code IN VARCHAR2, + a_entry_staff_name OUT VARCHAR2, + a_entry_staff_sectionoffice_code OUT VARCHAR2, + a_entry_staff_sectionoffice_name OUT VARCHAR2, + a_entry_staff_department_code OUT VARCHAR2, + a_entry_staff_department_name OUT VARCHAR2 + ); + END telsale_policy_check_pkg; / CREATE OR REPLACE PACKAGE BODY telsale_policy_check_pkg IS + /*********************************************************************************/ FUNCTION staff_check(a_stuff_code VARCHAR2) RETURN BOOLEAN IS l_count INTEGER; BEGIN @@ -28,6 +65,7 @@ CREATE OR REPLACE PACKAGE BODY telsale_policy_check_pkg IS RETURN TRUE; END; + /*********************************************************************************/ FUNCTION policy_check(a_policy_no VARCHAR2) RETURN BOOLEAN IS l_count INTEGER; BEGIN @@ -43,6 +81,33 @@ CREATE OR REPLACE PACKAGE BODY telsale_policy_check_pkg IS RETURN TRUE; END; + + /*********************************************************************************/ + PROCEDURE save_policy + ( + a_policy_no IN VARCHAR2, + a_operator_code IN VARCHAR2, + a_operator_name OUT VARCHAR2, + a_operator_sectionoffice_code OUT VARCHAR2, + a_operator_sectionoffice_name OUT VARCHAR2, + a_operator_department_code OUT VARCHAR2, + a_operator_department_name OUT VARCHAR2, + a_entry_staff_code IN VARCHAR2, + a_entry_staff_name OUT VARCHAR2, + a_entry_staff_sectionoffice_code OUT VARCHAR2, + a_entry_staff_sectionoffice_name OUT VARCHAR2, + a_entry_staff_department_code OUT VARCHAR2, + a_entry_staff_department_name OUT VARCHAR2 + ) IS + l_policy_section_code VARCHAR2(6); + l_policy_department_code VARCHAR2(6); + BEGIN + NULL; + + --жϱǷڣԼŵĿҲź;Ƿͬ + + END; + BEGIN NULL; END telsale_policy_check_pkg; diff --git a/代码/oracle/项目/包/telsale_policy_check_pkg.~pck b/代码/oracle/项目/包/telsale_policy_check_pkg.~pck new file mode 100644 index 0000000..5bfcbdb --- /dev/null +++ b/代码/oracle/项目/包/telsale_policy_check_pkg.~pck @@ -0,0 +1,100 @@ +CREATE OR REPLACE PACKAGE telsale_policy_check_pkg IS + + -- Author : + -- Created : 2021/6/21 10:18:01 + -- Purpose : ֤ + + --쳣 + --Ų + POLICYNO_NOT_EXIST_EXCEPT_CODE CONSTANT INTEGER := -20000; + POLICYNO_NOT_EXIST_EXCEPT_TEXT CONSTANT VARCHAR2(100) := 'Ųڡ'; + + FUNCTION policy_check(a_policy_no VARCHAR2) RETURN BOOLEAN; + + FUNCTION staff_check(a_stuff_code VARCHAR2) RETURN BOOLEAN; + + PROCEDURE save_policy + ( + a_policy_no IN VARCHAR2, + a_operator_code IN VARCHAR2, + a_operator_name OUT VARCHAR2, + a_operator_sectionoffice_code OUT VARCHAR2, + a_operator_sectionoffice_name OUT VARCHAR2, + a_operator_department_code OUT VARCHAR2, + a_operator_department_name OUT VARCHAR2, + a_entry_staff_code IN VARCHAR2, + a_entry_staff_name OUT VARCHAR2, + a_entry_staff_sectionoffice_code OUT VARCHAR2, + a_entry_staff_sectionoffice_name OUT VARCHAR2, + a_entry_staff_department_code OUT VARCHAR2, + a_entry_staff_department_name OUT VARCHAR2 + ); + +END telsale_policy_check_pkg; +/ +CREATE OR REPLACE PACKAGE BODY telsale_policy_check_pkg IS + + /*********************************************************************************/ + FUNCTION staff_check(a_stuff_code VARCHAR2) RETURN BOOLEAN IS + l_count INTEGER; + BEGIN + SELECT COUNT(*) + INTO l_count + FROM idst0.rydm_t@xmcx1.cpicxm ry + WHERE ry.staff_code = a_stuff_code; + + IF l_count = 0 + THEN + RETURN FALSE; + END IF; + + RETURN TRUE; + END; + + /*********************************************************************************/ + FUNCTION policy_check(a_policy_no VARCHAR2) RETURN BOOLEAN IS + l_count INTEGER; + BEGIN + SELECT COUNT(*) + INTO l_count + FROM idst0.auto_agreement_t@xmcx1.cpicxm a + WHERE a.policy_no = a_policy_no; + + IF l_count = 0 + THEN + RETURN FALSE; + END IF; + + RETURN TRUE; + END; + + /*********************************************************************************/ + PROCEDURE save_policy + ( + a_policy_no IN VARCHAR2, + a_operator_code IN VARCHAR2, + a_operator_name OUT VARCHAR2, + a_operator_sectionoffice_code OUT VARCHAR2, + a_operator_sectionoffice_name OUT VARCHAR2, + a_operator_department_code OUT VARCHAR2, + a_operator_department_name OUT VARCHAR2, + a_entry_staff_code IN VARCHAR2, + a_entry_staff_name OUT VARCHAR2, + a_entry_staff_sectionoffice_code OUT VARCHAR2, + a_entry_staff_sectionoffice_name OUT VARCHAR2, + a_entry_staff_department_code OUT VARCHAR2, + a_entry_staff_department_name OUT VARCHAR2 + ) IS + l_policy_section_code VARCHAR2(6); + l_policy_department_code VARCHAR2(6); + BEGIN + NULL; + + --жϱǷڣԼŵĿҲź;Ƿͬ + + END; + +BEGIN + NULL; +END telsale_policy_check_pkg; +/ diff --git a/代码/oracle/项目/电销保单信息管理.dsk b/代码/oracle/项目/电销保单信息管理.dsk index 631d5e6..cffd86b 100644 --- a/代码/oracle/项目/电销保单信息管理.dsk +++ b/代码/oracle/项目/电销保单信息管理.dsk @@ -3,10 +3,30 @@ PL/SQL Developer Project Desktop [Desktop] SavePath=D:\develop\projects_win\2018\telsale_management_2017\\oracle\Ŀ\ +Index=1 +Filename=D:\develop\projects_win\2018\telsale_management_2017\\oracle\Ŀ\\telsale_policy_check_pkg.pck +VCSDBObject=0 +Connection=282441544404455840724370446043583456492241804558450434903180323832003290342849744968477032763302336047784788 +DPI=96 +Left=0 +Top=0 +Width=1329 +Height=719 +State=0 +Type=3 +ChildListIndex=1 +Pinned=0 + +Index=2 +Filename= +Connection=226450024772463846324866505249184048433046445054493639223676363836323754389245424568427437403734382438343844 + [Files] [MRU] +3,D:\develop\projects_win\2018\telsale_management_2017\\oracle\Ŀ\\telsale_policy_check_pkg.pck 1,D:\develop\projects_win\2018\telsale_management_2017\\oracle\Ŀ\\Ϣ.sql +1,D:\develop\projects_win\2018\telsale_management_2017\\oracle\Ŀ\\Ϣ¼־.sql [Layout] Group= diff --git a/数据/测试数据/有空行.xls b/数据/测试数据/有空行.xls new file mode 100644 index 0000000000000000000000000000000000000000..23bcce6a0a0a6140a54cdaf412016ddd221cdf76 GIT binary patch literal 24576 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 f&_fqz81jA4h|VcSA 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 literal 0 HcmV?d00001 diff --git a/数据/测试数据/转介绍模板.xls b/数据/测试数据/转介绍模板.xls new file mode 100644 index 0000000000000000000000000000000000000000..8eacf4c1a4404cf4c05689159eff2f2b6c4353dc GIT binary patch literal 25088 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 literal 0 HcmV?d00001