Browse Source

债券补录功能模块前后端开发

zhang_kun 2 days ago
parent
commit
870ee30771

+ 119 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/rwacalcconfigdataparam/action/BondAction.java

@@ -0,0 +1,119 @@
+package com.sundata.product.rwa.rwacalcconfigdataparam.action;
+
+import com.sundata.common.base.BaseAction;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.sundata.product.rwa.rwacalcconfigdataparam.model.BondModel;
+import com.sundata.product.rwa.rwacalcconfigdataparam.service.BondService;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+
+@Controller
+@RequestMapping("/product/rwa/rwacalcconfigdataparam/BondAction")
+public class BondAction extends BaseAction {
+
+    // 日志
+    static final Logger log = LoggerFactory.getLogger(BondAction.class);
+
+    @Autowired
+    BondService BondService;
+
+    @RequestMapping("/updateExistData")
+    public void updateExistData(HttpServletRequest request, HttpServletResponse response,
+                                @RequestBody BondModel model){
+    	BondService.updateExistData(model);
+    	//推送数据
+    	//BondService.kingBase2GBase("GBaseDB","RWA_BDM_BUS_ITM_FF_BONDTP_INPUT");
+    }
+
+    @RequestMapping("/kingBase2GBase")
+    public void kingBase2GBase(HttpServletRequest request, HttpServletResponse response,
+                                @RequestParam String typeOrId,@RequestParam String tableName){
+        // 改
+        BondService.kingBase2GBase(typeOrId,tableName);
+    }
+
+    @RequestMapping("/selectDataList")
+    public void selectDataList (HttpServletRequest request, HttpServletResponse response,
+                                @RequestBody BondModel model) {
+        // 初始化
+        sendData(response, BondService.selectDataList(model));
+    }
+
+    @RequestMapping("/selectDataList1")
+    public void selectDataList1 (HttpServletRequest request, HttpServletResponse response) {
+        // 初始化
+        sendData(response, BondService.selectDataList1());
+    }
+
+    // 查询当前行
+    @RequestMapping("/selectRowData")
+    public void selectRowData (HttpServletRequest request, HttpServletResponse response,
+                               @RequestBody BondModel model) {
+        sendData(response, BondService.selectRowData(model));
+    }
+
+
+    @RequestMapping("/exportExcelModel")
+    public void exportExcelModel (HttpServletRequest request, HttpServletResponse response,
+                                  @RequestParam String fileNameCode, @RequestBody List<BondModel> modelList) throws IOException {
+
+        try {
+            request.setCharacterEncoding("UTF-8");
+            response.setContentType("test/html; charset=UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(e);
+        }
+        // 导出数据
+        BondService.exportExcelModel(response,fileNameCode,modelList);
+        // sendData(response, BondService.exportExcelModel(response,fileNameCode,modelList));
+    }
+
+    @RequestMapping("/importExcelModel")
+    public void importExcelModel (HttpServletRequest request,
+                                  HttpServletResponse response, @RequestParam("rfile") MultipartFile file) {
+        // 输入流对象
+        InputStream io;
+        try {
+            // 获取前端上传文件流
+            io = file.getInputStream();
+            // 上传文件
+            BondService.importExcelModel(io,file);
+            //推送GBASE补录数据
+            //BondService.kingBase2GBase("GBaseDB","RWA_BDM_BUS_ITM_FF_BONDTP_INPUT");
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    @RequestMapping("/templateUploadModel")
+    public void templateUploadModel (HttpServletRequest request,
+                                     HttpServletResponse response,@RequestParam String fileNameCode,@RequestBody List<BondModel> modelList) throws IOException {
+
+        // 模板下载
+        BondService.templateUploadModel(response,fileNameCode,modelList);
+    }
+
+//    @RequestMapping("/isNotExist")
+//    public void isNotExist (HttpServletRequest request,
+//                            HttpServletResponse response, @RequestBody BondModel model) {
+//        // 查询当前行详细数据
+//        BondModel selectData = BondService.selectRowData(model);
+//        String rst = selectData.getCustomerName() ==  null ? "true" : "交易对手已存在";
+//        sendData(response,rst);
+//    }
+
+
+}

+ 20 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/rwacalcconfigdataparam/mapper/BondMapper.java

@@ -0,0 +1,20 @@
+package com.sundata.product.rwa.rwacalcconfigdataparam.mapper;
+
+import com.sundata.product.rwa.rwacalcconfigdataparam.model.BondModel;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface BondMapper {
+    boolean updateExistData(@Param("model") BondModel model);
+    boolean delData(@Param("model") BondModel model);
+    boolean copyData(@Param("model") BondModel model);
+    List<BondModel> selectDataList(@Param("model") BondModel model);
+
+    List<BondModel> selectDataList1();
+    Object selectRowData(@Param("model") BondModel model);
+
+    boolean deleteRows(Object o);
+
+    boolean createDetailData(@Param("model") BondModel model);
+}

+ 148 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/rwacalcconfigdataparam/model/BondModel.java

@@ -0,0 +1,148 @@
+package com.sundata.product.rwa.rwacalcconfigdataparam.model;
+
+import java.util.HashMap;
+
+public class BondModel {
+	
+	  
+    // 起始数据日期
+	private String startDate;
+    // 截止数据日期
+	private String endDate;
+    // 年月
+	private String term;
+    // 数据日期
+	private String dataDate;
+    // 债项编号
+	private String loanReferenceNo;
+    // 客户编号
+	private String custNo;
+    //客户名称
+	private String custName;
+    // 证券代码
+	private String securityCode;
+    // 证券名称
+	private String securityName;
+    // 证券类型G:一般债/S:专项债
+	private String generalSpecialFlag;
+	private String generalSpecialFlagName;	
+  
+
+    public String getStartDate() {
+		return startDate;
+	}
+
+
+	public void setStartDate(String startDate) {
+		this.startDate = startDate;
+	}
+
+
+	public String getEndDate() {
+		return endDate;
+	}
+
+
+	public void setEndDate(String endDate) {
+		this.endDate = endDate;
+	}
+
+
+	public String getTerm() {
+		return term;
+	}
+
+
+	public void setTerm(String term) {
+		this.term = term;
+	}
+
+
+	public String getDataDate() {
+		return dataDate;
+	}
+
+
+	public void setDataDate(String dataDate) {
+		this.dataDate = dataDate;
+	}
+
+
+	public String getLoanReferenceNo() {
+		return loanReferenceNo;
+	}
+
+
+	public void setLoanReferenceNo(String loanReferenceNo) {
+		this.loanReferenceNo = loanReferenceNo;
+	}
+
+
+	public String getCustNo() {
+		return custNo;
+	}
+
+
+	public void setCustNo(String custNo) {
+		this.custNo = custNo;
+	}
+
+
+	public String getCustName() {
+		return custName;
+	}
+
+
+	public void setCustName(String custName) {
+		this.custName = custName;
+	}
+
+
+	public String getSecurityCode() {
+		return securityCode;
+	}
+
+
+	public void setSecurityCode(String securityCode) {
+		this.securityCode = securityCode;
+	}
+
+
+	public String getSecurityName() {
+		return securityName;
+	}
+
+
+	public void setSecurityName(String securityName) {
+		this.securityName = securityName;
+	}
+
+
+	public String getgeneralSpecialFlag() {
+		return generalSpecialFlag;
+	}
+
+
+	public void setgeneralSpecialFlag(String generalSpecialFlag) {
+		this.generalSpecialFlag = generalSpecialFlag;
+	}
+
+
+	public String getgeneralSpecialFlagName() {
+		return generalSpecialFlagName;
+	}
+
+
+	public void setgeneralSpecialFlagName(String generalSpecialFlagName) {
+		this.generalSpecialFlagName = generalSpecialFlagName;
+	}
+    public static HashMap<String,String> getCastFileCellToJson() {
+        HashMap<String,String> map = new HashMap<String,String>();
+        map.put("债项编号","loanReferenceNo");
+        map.put("客户名称","custName");
+        map.put("债券编码","securityCode");
+        map.put("债券名称","securityName");
+        map.put("一般专项标志","generalSpecialFlagName");
+        return map;
+    }
+}

+ 130 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/rwacalcconfigdataparam/mybatis/BondMapper.xml

@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sundata.product.rwa.rwacalcconfigdataparam.mapper.BondMapper">
+
+    <!-- 初始化与按查询条件查询 -->
+    <select id="selectDataList" resultType="com.sundata.product.rwa.rwacalcconfigdataparam.model.BondModel" parameterType="com.sundata.product.rwa.rwacalcconfigdataparam.model.BondModel">
+        SELECT 
+			DATA_DATE AS dataDate,
+			DEBTITEM_NO AS loanReferenceNo,
+			CLIENT_NAME AS custName ,
+			SECURITY_CODE AS securityCode,
+			SECURITY_NAME AS securityName,
+			GENERAL_SPECIAL_FLAG AS generalSpecialFlag,
+			CASE WHEN GENERAL_SPECIAL_FLAG='G' THEN '一般债' WHEN GENERAL_SPECIAL_FLAG='S' THEN '专项债' end AS generalSpecialFlagName
+		FROM RWA_BDM_BS_FF_SEC_POSIT T1
+        <where>
+        	T1.DATA_DATE=(SELECT MAX(DATA_DATE) FROM RWA_BDM_BS_FF_SEC_POSIT) and  SECURITY_TYPE='M'
+            <if test="model.loanReferenceNo != null and '' != model.loanReferenceNo">
+                and T1.DEBTITEM_NO like concat(concat('%',#{model.loanReferenceNo}),'%')
+            </if>
+            <if test="model.custName != null and '' != model.custName">
+                and T1.CLIENT_NAME like concat(concat('%',#{model.custName}),'%')
+            </if>
+            <if test="model.securityName != null and '' != model.securityName">
+                and T1.SECURITY_NAME like concat(concat('%',#{model.securityName}),'%')
+            </if>
+        </where>
+        order by T1.SECURITY_CODE
+    </select>
+
+    <select id="selectDataList1" resultType="com.sundata.product.rwa.rwacalcconfigdataparam.model.BondModel">
+            SELECT 
+			DATA_DATE AS dataDate,
+			DEBTITEM_NO AS loanReferenceNo,
+			CLIENT_NAME AS custName ,
+			SECURITY_CODE AS securityCode,
+			SECURITY_NAME AS securityName,
+			CASE WHEN GENERAL_SPECIAL_FLAG='G' THEN '一般债' WHEN GENERAL_SPECIAL_FLAG='S' THEN '专项债' end AS generalSpecialFlagName
+		FROM RWA_BDM_BS_FF_SEC_POSIT T1
+		where T1.DATA_DATE=(SELECT MAX(DATA_DATE) FROM RWA_BDM_BS_FF_SEC_POSIT) and SECURITY_TYPE='M'
+    </select>
+
+    <!-- 修改数据 -->
+    <update id="updateExistData">
+       update RWA_BDM_BS_FF_SEC_POSIT
+        set GENERAL_SPECIAL_FLAG=coalesce((SELECT nounvalue FROM sys_noun WHERE nounitem='bondflag' AND nounname=#{model.generalSpecialFlagName}),#{model.generalSpecialFlag})
+        where
+            DEBTITEM_NO =#{model.loanReferenceNo}
+            and DATA_DATE=#{model.dataDate} and SECURITY_TYPE='M'
+    </update>
+
+
+    <!-- 新建数据 -->
+    <insert id="createDetailData" parameterType="com.sundata.product.rwa.rwacalcconfigdataparam.model.BondModel">
+        insert into RWA_BDM_BS_FF_SEC_POSIT
+        ( 
+        DATA_DATE,
+        DEBTITEM_NO,
+        CLIENT_NAME,
+        SECURITY_CODE,
+        SECURITY_NAME,
+        GENERAL_SPECIAL_FLAG
+        )
+        values(
+       	#{model.dataDate},
+        #{model.loanReferenceNo},
+        #{model.custName},
+        #{model.securityCode},
+        #{model.securityName},
+      	#{model.generalSpecialFlag}
+      	)
+    </insert>
+
+    <!-- 删除当前行 -->
+    <delete id="deleteRows"  parameterType="java.lang.String">
+        delete  from RWA_BDM_BS_FF_SEC_POSIT
+        <where>
+        	1=1 and DEBTITEM_NO = #{loanReferenceNo};
+        </where>
+    </delete>
+
+    <delete id="delData"  parameterType="com.sundata.product.rwa.rwacalcconfigdataparam.model.BondModel">
+        delete  from RWA_BDM_BUS_ITM_FF_BONDTP_INPUT
+        <where>
+        	1=1 and DATA_DATE =#{model.dataDate}
+        </where>
+    </delete>
+    <insert id="copyData" parameterType="com.sundata.product.rwa.rwacalcconfigdataparam.model.BondModel">
+        
+        insert into RWA_BDM_BUS_ITM_FF_BONDTP_INPUT
+        ( 
+        DATA_DATE,
+        DEBTITEM_NO,
+        CLIENT_NAME,
+        SECURITY_CODE,
+        SECURITY_NAME,
+        GENERAL_SPECIAL_FLAG
+        )
+        select 
+         DATA_DATE,
+        DEBTITEM_NO,
+        CLIENT_NAME,
+        SECURITY_CODE,
+        SECURITY_NAME,
+        GENERAL_SPECIAL_FLAG
+        from RWA_BDM_BS_FF_SEC_POSIT
+        where DATA_DATE=#{model.dataDate} and SECURITY_TYPE='M'
+    </insert>
+
+    <!-- 查询当前行(修改用) -->
+    <select id="selectRowData"
+            parameterType="com.sundata.product.rwa.rwacalcconfigdataparam.model.BondModel"
+            resultType="com.sundata.product.rwa.rwacalcconfigdataparam.model.BondModel">
+        SELECT 
+			DATA_DATE AS dataDate,
+			DEBTITEM_NO AS loanReferenceNo,
+			CLIENT_NAME AS custName ,
+			SECURITY_CODE AS securityCode,
+			SECURITY_NAME AS securityName,
+			GENERAL_SPECIAL_FLAG AS generalSpecialFlag
+		FROM RWA_BDM_BS_FF_SEC_POSIT T1
+        <where>
+            DEBTITEM_NO = #{model.loanReferenceNo}
+            and DATA_DATE= #{model.dataDate}
+        </where>
+    </select>
+
+</mapper>

+ 301 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/rwacalcconfigdataparam/service/BondService.java

@@ -0,0 +1,301 @@
+package com.sundata.product.rwa.rwacalcconfigdataparam.service;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.sundata.admin.excelmanage.mapper.RptDefineMapper;
+import com.sundata.admin.excelmanage.model.RptDefineModel;
+import com.sundata.common.base.BaseMapper;
+import com.sundata.common.base.BaseService;
+import com.sundata.common.exception.BusinessException;
+import com.sundata.common.util.DBExecutor;
+import com.sundata.common.util.StringUtil;
+import com.sundata.product.rwa.businessconfig.utils.FilesValueCheckUtils;
+import com.sundata.product.rwa.rwacalcconfigdataparam.mapper.BondMapper;
+import com.sundata.product.rwa.rwacalcconfigdataparam.model.BondModel;
+import com.sundata.product.taskExecute.service.KingBase2GBaseService;
+import jakarta.servlet.http.HttpServletResponse;
+
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+@Service
+public class BondService extends BaseService<RptDefineModel> {
+
+    // 日志
+    static final Logger log = LoggerFactory.getLogger(BondService.class);
+    // 定义jackson对象
+    private static final ObjectMapper json = new ObjectMapper();
+    @Autowired
+    private RptDefineMapper<RptDefineModel> rptDefineMapper;
+
+    @Autowired
+    KingBase2GBaseService kingBase2GBaseService;
+    
+    @Autowired
+    BondMapper bondMapper;
+    
+    public Object updateExistData(BondModel model) {
+    	bondMapper.updateExistData(model);
+    	bondMapper.delData(model);
+        return bondMapper.copyData(model);
+    }
+
+    public void kingBase2GBase(String typeOrId,String tableName) {
+        kingBase2GBaseService.doExecute(typeOrId,tableName);
+    }
+
+    public List<BondModel> selectDataList(BondModel model) {
+
+        return bondMapper.selectDataList(model);
+    }
+
+    public List<BondModel> selectDataList1() {
+        return bondMapper.selectDataList1();
+    }
+
+    public Object selectRowData(BondModel model) {
+        return bondMapper.selectRowData(model);
+    }
+
+    public void exportExcelModel(HttpServletResponse response, String fileNameCode, List<BondModel> modelList) throws IOException {
+        // 数据检查
+        if (null == modelList) {
+            String err = "导出数据为空!";
+            log.error(err);
+            throw new BusinessException(err);
+        }
+        // 取得文件名
+        String fileName = DBExecutor.doQuery("select RPTNAME from SYS_RPTDEFINE where RPTCODE = '"+ fileNameCode +"'");
+        // 字典里获取附件路径
+        String templatePath = DBExecutor.doQuery("select NOUNVALUE from sys_noun where NOUNITEM = 'ATTACHPATH'");
+
+        // TODO  获取菜单名
+        String menuName = DBExecutor.doQuery("select funcname from sys_funinfo where funccode='M4100000'");
+        StringBuilder pathName = new StringBuilder(templatePath+"/"+menuName);
+        // 获取数据库模板文件
+        RptDefineModel entity = (RptDefineModel)this.queryOne(fileNameCode);
+        // 判断是否获取成功
+        if (entity == null) {
+            String err = "报表代码[" + fileNameCode + "]不存在!";
+            log.error(err);
+            throw new BusinessException(err);
+        } else {
+            // 获取成功执行导出方法
+            FilesValueCheckUtils.exportExcelModel(response,modelList,pathName,fileName+"导出",entity);
+        }
+    }
+
+
+
+    public void importExcelModel(InputStream io, MultipartFile file) {
+        String fileName = file.getOriginalFilename().toLowerCase();
+        List<BondModel> modelList = new ArrayList<BondModel>();
+        // 导入文件流转换为poi对象
+        Workbook book = FilesValueCheckUtils.workBookInstance(io,file);
+        if (book == null) {
+            String err = "文件格式不正确!,请用xlsx或xls文件";
+            log.error(err);
+            throw new BusinessException(err);
+        }
+       // FilesValueCheckUtils.castFileValue(book,BondModel.class,modelList);
+        Class clazz=BondModel.class;
+        // 接收反射对象
+        Object object = null;
+        // 获取实体类内方法
+        Method method = null;
+        try {
+            method = clazz.getMethod("getCastFileCellToJson");
+
+        } catch (NoSuchMethodException e) {
+            String err = "通过反射获得实体类内getCastFileCellToJson方法发生异常,该方法无法正常获取!";
+            log.error(err, e);
+            throw new BusinessException(err, e);
+        }
+
+        // 执行方法获得返回值
+        HashMap<String,String> map =null;
+        try {
+            map =(HashMap) method.invoke(clazz);
+        } catch (IllegalAccessException | InvocationTargetException e) {
+            String err = "执行getCastFileCellToJson方法发生异常,无法获得该方法的返回值!";
+            log.error(err, e);
+            throw new BusinessException(err, e);
+        }
+        
+            // 只读取第1个sheet页
+            Sheet sheet = book.getSheetAt(0);
+            // 当前sheet页的数据总行数
+            int dataRows = sheet.getLastRowNum();
+            // 判断是否有数据
+            if (dataRows == 0) {
+                String err = "文件内容为空!,请检查导入数据是否正确";
+                log.error(err);
+                throw new BusinessException(err);
+            }
+            // 记录空值列
+            StringBuilder cellNullMessage = null;
+            // 遍历当前sheet页每一行
+            for (int rowNum=0;rowNum<=dataRows;rowNum++){
+                // 每一行数据按键值对存进map
+                HashMap<String,String> jsonMap = new HashMap<String,String>();
+                // 记录空值列对象初始化
+                cellNullMessage = new StringBuilder();
+                // 空值个数初始化
+                int nulCellSum = 0;
+
+                // 将反射对象进行实例化
+                try {
+                    object = clazz.newInstance();
+                } catch (InstantiationException | IllegalAccessException e) {
+                    throw new RuntimeException(e);
+                }
+
+                // 判断如果当前行是否为空,为空则跳过
+                if (sheet.getRow(rowNum) == null) {
+                    continue;
+                }
+
+                // 获取当前行的列数
+                int cellNums = sheet.getRow(0).getLastCellNum();
+
+                // 遍历当前行的每一列
+                for (int cellNum = 0; cellNum<=cellNums-1; cellNum++){
+                    Cell cellData = null;
+
+                    // 列名检查
+                    if (rowNum == 0) {
+                        if (!map.containsKey(sheet.getRow(rowNum).getCell(cellNum).toString().trim())) {
+                            String err = "请检查模板!,(1)列名是否正确(2)列名不可出现空格或空列(3)列与列之间要连续";
+                            log.error(err);
+                            throw new BusinessException(err);
+                        }
+                        continue;
+                    }
+
+                    // 获得当前列数据
+                    cellData = sheet.getRow(rowNum).getCell(cellNum);
+                    // 获取列名对应的英文
+                    String key = map.get(sheet.getRow(0).getCell(cellNum).toString().trim());
+
+                    // 记录空数据
+                    if (null == cellData || StringUtil.isEmpty(cellData.toString())){
+                        // 空数据个数
+                        nulCellSum++;
+                        // 记录列
+                        cellNullMessage.append(String.valueOf(cellNum+1)).append(",");
+                    } else {
+                        // 将英文名与数据存进map
+                        jsonMap.put(key,cellData.toString().trim());
+                    }
+
+                }
+                if (nulCellSum !=0 && nulCellSum < cellNums) {
+                    String err = "第"+ (rowNum+1)+"行第"+ cellNullMessage.toString() + "列导入数据为空!,请检查";
+                    log.error(err);
+                    throw new BusinessException(err);
+                }
+
+                if (nulCellSum == cellNums) {
+                    continue;
+                }
+
+                // 第一行不计入数据
+                if (rowNum != 0) {
+                    // 将文件数据内容转化为实体类对象
+                    object = json.convertValue(jsonMap,clazz);
+                    // 插入list
+                    modelList.add((BondModel)object);
+                }
+            }
+        
+    
+        if (modelList.isEmpty()) {
+            String err = "文件转换对象异常!";
+            log.error(err);
+            throw new BusinessException(err);
+        }
+
+        // 批量插入
+        // 先全量删除
+          boolean flag = true;
+//        flag = bondMapper.deleteRows(null);
+//        if (!flag) {
+//            String err = "数据库删除异常!";
+//            log.error(err);
+//            throw new BusinessException(err);
+//        }
+        String datadt=DBExecutor.doQuery("SELECT MAX(DATA_DATE) datadt FROM RWA_BDM_BS_FF_SEC_POSIT");
+
+        for (BondModel BondModel : modelList) {
+            if (null == BondModel || FilesValueCheckUtils.checkStringValue(BondModel.getgeneralSpecialFlagName())) {
+                String err = "一般专项标志不能为空!";
+                log.error(err);
+                throw new BusinessException(err);
+            }
+            BondModel.setDataDate(datadt);
+            flag = bondMapper.updateExistData(BondModel);
+            if (!flag) {
+                String err = "数据库更新异常!";
+                log.error(err);
+                throw new BusinessException(err);
+            }
+        }
+        //更更新完成后复制数据
+        BondModel model =new BondModel();
+       
+        model.setDataDate(datadt);
+        bondMapper.delData(model);
+        bondMapper.copyData(model);
+
+        // 工作流关闭
+        try {
+            book.close();
+            io.close();
+        } catch (IOException e) {
+            String err = "io流关闭异常";
+            log.error(err,e);
+            throw new BusinessException(err,e);
+        }
+      
+    }
+
+    public void templateUploadModel(HttpServletResponse response, String fileNameCode,List<BondModel> modelList) throws IOException {
+      //  List<BondModel> modelList = new ArrayList<BondModel>();
+        modelList.add(new BondModel());
+        // 取得文件名
+        String fileName = DBExecutor.doQuery("select RPTNAME from SYS_RPTDEFINE where RPTCODE = '"+ fileNameCode +"'");
+        // 字典里获取附件路径
+        String templatePath = DBExecutor.doQuery("select NOUNVALUE from sys_noun where NOUNITEM = 'ATTACHPATH'");
+
+        // TODO  获取菜单名
+        String menuName = DBExecutor.doQuery("select funcname from sys_funinfo where funccode='M412000'");
+        StringBuilder pathName = new StringBuilder(templatePath+"/"+menuName);
+        // 获取数据库模板文件
+        RptDefineModel entity = (RptDefineModel)this.queryOne(fileNameCode);
+        if (entity == null) {
+            String err = "报表代码[" + fileNameCode + "]不存在!";
+            log.error(err);
+            throw new BusinessException(err);
+        } else {
+            FilesValueCheckUtils.exportExcelModel(response,modelList,pathName,fileName+"导入",entity);
+        }
+    }
+
+    @Override
+    public BaseMapper<RptDefineModel> getMapper() {
+        return this.rptDefineMapper;
+    }
+}

+ 284 - 0
Procedure/frontend/projectb/src/pages/rwa_calc_config_dataparam/bondinput.tsx

@@ -0,0 +1,284 @@
+import React, { useEffect, useRef, useState } from "react";
+import type { ProColumns, ActionType } from '@ant-design/pro-components';
+import type {FormInstance} from 'antd'
+import  {Upload} from 'antd'
+import { SDPage,SDFormText,SDModalForm,SDTable,SDFormItem,SDButton,SDSubmitButton,EditType, SDAreaTtile, SDOperate, baseFun,SDModal, validateFun, SDFormDict, } from "@sundata/ui-frame";
+import {getDataList1, kingBase2GBase, bondModel,getDataList,selectDetailData,
+  updateExistData,exportExcelModel,uploadAction,templateUpload} from '@/services/rwa/rwa_calc_config_dataparam/bondinput';
+import { WomanOutlined } from "@ant-design/icons";
+import { ProductProps } from "@/sundataImport";
+import { useModel } from '@umijs/max';
+
+type widowRush = {
+  onCancel:  () => void;
+  onChangeVisible(visible: boolean, type: string): unknown;
+  onChangeVisdible:(visible:boolean,type ?: 'none' | 'raload' )=>void;
+}& ProductProps;
+// 债券类型补录维护
+const realestate : React.FC<widowRush> = (prop:widowRush) => {
+
+    /** 编辑方式,查看、修改、新增按钮时设置,详细信息表单中使用 */
+    const [editType, setEditType] = useState<EditType>(prop.editType || 'display');
+    /** 是否显示详细信息窗口 */
+    const [detailVisible, setDetailVisible] = useState<boolean>(false);
+    const [currentRow, setCurrentRow] = useState<bondModel>();
+    /** 表格引用对象,刷新表格使用   */
+    const actionRef = useRef<ActionType>();
+    const formRef = useRef<FormInstance<any>>();
+    const templateRef = useRef<FormInstance<any>>();
+
+    const [formDataList1,setFormDataList1] = useState<bondModel[]>();
+
+    // 页面数据
+    var formDataList = new Array<bondModel>;
+    /**上传文件 */
+    const [fileData, setFileData] = useState<File>();
+    // 导入窗口显示
+    const [importVisible, setImportVisible] = useState<boolean>(false);
+    const { fetchDict } = useModel('dict');
+ 
+    useEffect(() => {
+      //actionRef.current?.reload();
+        // init().then((data) => {
+          
+        // });
+      }, []);
+    
+    // 修改查询查询
+    const selectData = async (formdata : bondModel) => {
+      const data = await selectDetailData(formdata);
+      formRef.current?.setFieldsValue(data);
+     }
+
+    //关闭窗口刷新父页面
+    const closeAndRefresh = ()=>{
+    actionRef.current?.reloadAndRest?.();
+    }
+
+  // 插入或者更新数据
+  const handleSave = async(data: bondModel,) => {
+    
+    if (editType == 'update' ) {
+      if (currentRow?.loanReferenceNo) {
+        await updateExistData(data,currentRow?.loanReferenceNo);
+        closeAndRefresh();
+      } 
+     
+    
+    }
+    // else if (editType == 'create' ) {
+    //   await fetchDetailData(data);
+    //   closeAndRefresh();
+    // }
+    setDetailVisible(false);
+  }
+
+  // 模板下载
+  const templateUploadAction = async() => {
+    // 模板下载(模板code:ListOfPublicSector)
+    const formData1 = await getDataList1();
+  //  setFormDataList1(formData1);
+    console.log(formData1);
+    await templateUpload(formData1,"bondclassimp");
+  }
+
+
+  /**上传属性 */
+  const fileProps = {
+      onRemove: () => {
+      setFileData(undefined);
+     },
+      beforeUpload(info: any) {
+      setFileData(info);
+    },
+  };
+
+  /**上传提交 */
+  const uploadSubmit = async () => {
+      if (!fileData) {
+        baseFun.warning('未上传文件');
+        return;
+      }
+      const res = await uploadAction(fileData);
+      if ('' === res) {
+        // baseFun.info("处理完成");
+        closeAndRefresh()
+      } else {
+        baseFun.error(res);
+      }
+      setEditType('update');
+      setDetailVisible(false);
+  };
+     
+    // 页面展示元素
+    const columns: ProColumns<bondModel>[] = [
+        
+        {
+          title: '数据日期',
+          dataIndex: 'dataDate',
+          search: false,
+          hideInTable: false,
+        },
+        {
+          title: '债项编号', 
+          dataIndex: 'loanReferenceNo',
+          hideInTable: false,
+        },
+        {
+          title: '客户名称', 
+          dataIndex: 'custName',
+          hideInTable: false,
+        },
+        {
+          title: '证券代码', 
+          dataIndex: 'securityCode',
+          search: false,
+          hideInTable: false,
+        },
+        {
+          title: '证券名称', 
+          dataIndex: 'securityName',
+          hideInTable: false,
+        },
+        {
+          title: '一般专项标志', 
+          dataIndex: 'generalSpecialFlagName',
+          search: false,
+          hideInTable: false,
+        }, 
+        {
+          title: '一般专项标志', 
+          dataIndex: 'generalSpecialFlag',
+          search: false,
+          hideInTable: true,
+        }, 
+        {
+          title: '操作',
+          dataIndex: 'operate',
+          valueType: 'option',
+          render: (_, record) => [
+            <SDOperate
+              key="roleCfg"
+              icon={<WomanOutlined />}
+              successMessage=""
+              onClick={
+                ()=>{
+                selectData(record);
+                setCurrentRow(record);
+                setDetailVisible(true);
+                setEditType('update')
+               } }
+            >
+              修改
+            </SDOperate>,
+          ],
+        },
+
+      ];
+    
+    return (
+        <SDPage>
+        <SDTable
+         title=""
+         rowKey="customerName"
+         request={async (formdata:bondModel) =>{
+           const formDatas = await getDataList(formdata);
+           // 解构数组(导出用)
+           formDataList=[...formDatas];
+           return {data: formDatas}
+         }  }
+         columns={columns}
+         toolBarRender={(_, { selectedRows }) => [
+          <SDButton
+            key="export"
+            successMessage=''
+            onClick={() => {
+               baseFun.confirm('确认导出数据?',async() => { exportExcelModel(formDataList,"bondclassexp")});
+            }}
+          >
+            全部导出
+          </SDButton>,
+          <SDButton
+          key="import"
+          successMessage=''
+          onClick={() => {
+            baseFun.confirm("请注意本功能意在覆盖本表所有数据,请慎重使用!", () => {setImportVisible(true)});
+          }}
+        >
+          覆盖导入
+        </SDButton>,
+        ]}
+         actionRef={actionRef}
+         formRef={formRef}
+         setDetailVisible={() => {setDetailVisible(true)}}
+         setEditType={setEditType}
+         setCurrentRow={setCurrentRow}
+         />
+
+        {detailVisible && (
+        <SDModalForm          
+          title={'详细信息'}
+          editType={editType}
+          params={currentRow}
+          visible={detailVisible}
+          onVisibleChange={() => {setDetailVisible(false)}}
+          footer={[
+          <SDSubmitButton  editType={editType}   formRef={formRef} doSubmit={handleSave} >保存</SDSubmitButton>,
+          <SDButton
+            key="closeUpdate"
+            successMessage=''
+            onClick={() => {
+                setDetailVisible(false);
+            }}>关闭</SDButton>
+          ]}
+          tableRef={actionRef}
+          formRef={formRef}
+        >
+            <SDAreaTtile title='债券信息'/>
+             <SDFormText name="dataDate" readonlyCond="both" required={true} label="数据日期"/>
+            <SDFormText name="loanReferenceNo" readonlyCond="both" required={true} label="债项编号"/>
+            <SDFormText name="custName" readonlyCond="both" label="客户名称"/>
+            <SDFormText name="securityCode" readonlyCond="both"  label="债券编号"/>
+            <SDFormText name="securityName" readonlyCond="both" label="债券名称"/>
+         <SDFormDict name="generalSpecialFlag" dictKey="bondtype" label="一般专项标志"/>
+        </SDModalForm>
+        
+      )}
+
+      {importVisible && (
+         <SDModalForm
+        title={'上传文件窗口'}
+        visible={importVisible}
+        editType={editType}
+        onVisibleChange={() => {setImportVisible(false)}}
+        tableRef={actionRef}
+        formRef={templateRef}
+        footer={[
+        <SDSubmitButton  editType={'update'}  formRef={formRef} 
+          doSubmit={async() => {await uploadSubmit();}} >提交</SDSubmitButton>,
+          <SDButton
+          key="template"
+          onClick={() => {
+            templateUploadAction();
+          }}
+        >
+          模板下载
+        </SDButton>
+        ]
+        }
+        >
+         <SDFormItem nestType="form">
+            <Upload maxCount={1} {...fileProps} name="rfile">
+              <div style={{ paddingLeft: '5.5vw' }}>
+                选择上传文件: &nbsp;&nbsp;<SDOperate>上传</SDOperate>
+              </div>
+            </Upload>
+        </SDFormItem>
+        </SDModalForm>
+      )}
+
+        </SDPage>
+        
+    );
+}
+export default realestate;

+ 120 - 0
Procedure/frontend/projectb/src/services/rwa/rwa_calc_config_dataparam/bondinput.ts

@@ -0,0 +1,120 @@
+import type { BasePageModel, TableData } from '@sundata/ui-frame';
+import { baseFun } from '@sundata/ui-frame';
+
+export type bondModel = {
+    
+    // 起始数据日期
+    startDate?: string;
+    // 截止数据日期
+    endDate?: string;
+    // 年月
+    term?: string;
+    // 数据日期
+    dataDate?: string;
+    // 债项编号
+    loanReferenceNo?: string;
+    // 客户编号
+    custNo?: string;
+    //客户名称
+    custName?: string;
+    // 证券代码
+    securityCode?: string;
+    // 证券名称
+    securityName?: string;
+    // 证券类型G:一般债/S:专项债
+    generalSpecialFlag?: string;
+    generalSpecialFlagName?: string;
+  } & BasePageModel;
+
+  /** 获取页面初始化查询 POST*/
+export async function getDataList(body:bondModel) {
+    return baseFun.request<bondModel[]>('/api/product/rwa/rwacalcconfigdataparam/BondAction/selectDataList.do',{data: body});
+  }
+
+  export async function getDataList1() {
+    return baseFun.request<bondModel[]>('/api/product/rwa/rwacalcconfigdataparam/BondAction/selectDataList1.do',{});
+  }
+
+/** 获取页面初始化查询 POST*/
+export async function seleDictCodeName(subjectCode:string) {
+    return baseFun.request<string>('/api/product/rwa/rwacalcconfigdataparam/BondAction/getDataList.do',{data: subjectCode});
+} 
+
+  /** 新建数据 POST*/
+export async function fetchDetailData(body: bondModel) {
+    return baseFun.request<TableData<bondModel>>('/api/product/rwa/rwacalcconfigdataparam/BondAction/createDetailData.do',{data: body});
+  }
+
+  /** 更新数据 POST*/
+export async function updateExistData(body: bondModel,loanReferenceNo: string) {
+    return baseFun.request<TableData<bondModel>>('/api/product/rwa/rwacalcconfigdataparam/BondAction/updateExistData.do',
+      { data: body,
+        params:{loanReferenceNo}
+      });
+  }
+
+    /** 更新数据 POST*/
+export async function kingBase2GBase(typeOrId: string,tableName: string) {
+  return baseFun.request<TableData<bondModel>>('/api/product/rwa/rwacalcconfigdataparam/BondAction/kingBase2GBase.do',
+    { params:{typeOrId,tableName}
+    });
+}
+
+  /** 查询当前行详细数据 POST*/
+export async function selectDetailData(body: any) {
+    return baseFun.request<bondModel>('/api/product/rwa/rwacalcconfigdataparam/BondAction/selectRowData.do',{data: body});
+  }
+
+/** 全部导出 */
+export async function exportExcelModel(body:any,fileNameCode:string) {
+  const url = "/api/product/rwa/rwacalcconfigdataparam/BondAction/exportExcelModel.do?fileNameCode="+fileNameCode;
+  return baseFun.download(url,body);
+}
+
+//上传
+export async function uploadAction(file?: File) {
+  //const rptJsonStr = JSON.stringify(rpt);
+  const data = {rfile:file};
+  const url = "/api/product/rwa/rwacalcconfigdataparam/BondAction/importExcelModel.do";
+  const res = baseFun.upload(url,data,'rfile');
+  return res;
+}
+
+/** 模板下载 */
+export async function templateUpload(body:any,fileNameCode:string) {
+  // return baseFun.request('/api/product/rwa/rwacalcconfigdataparam/BondAction/templateUploadModel.do');
+    
+  // const resFileName = (  fileName + '.xlsx') as string;
+  const url = "/api/product/rwa/rwacalcconfigdataparam/BondAction/templateUploadModel.do?fileNameCode="+fileNameCode;
+  const res = baseFun.download(url,body);
+
+    // 下载方式二
+    //const file =  baseFun.request('/api/product/rwa/rwacalcconfigdataparam/BondAction/templateUploadModel.do',{params:{fileName}});
+    // const resFileName = (  fileName + '.xlsx') as string;
+    // baseFun
+    // .request('/api/product/rwa/rwacalcconfigdataparam/BondAction/templateUploadModel.do', {
+    //   method: 'POST',
+    //   params: { resFileName },
+    //   responseType: 'blob',
+    // })
+    // .then((res) => {
+    //   const content = res; // 文件流
+    //   const blob = new Blob([content], { type: 'application/octet-stream' });
+    //   // 下载处理
+    //   if ('download' in document.createElement('a')) {
+    //     // 非IE下载,通过创建a标签并触发点击事件执行下载
+    //     const link = document.createElement('a');
+    //     link.download = resFileName;
+    //     link.style.display = 'none';
+    //     link.href = URL.createObjectURL(blob);
+    //     document.body.appendChild(link);
+    //     link.click();
+    //     URL.revokeObjectURL(link.href); // 释放URL 对象
+    //     document.body.removeChild(link);
+    //   } else {
+    //     // IE10+下载 TODO报此方法不存在,待解决
+    //     // navigator.msSaveBlob(blob,fileName);
+    //   }
+    // })
+  }
+