package com.web.pda.lyt.lytPda.service.internal; import com.app.base.data.ApiResponseResult; import com.web.pda.lyt.lytPda.service.FQCPatrolService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.CallableStatementCallback; import org.springframework.jdbc.core.CallableStatementCreator; import org.springframework.jdbc.core.ConnectionCallback; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.sql.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Service @Transactional(rollbackFor = Exception.class) public class FQCPatrolServiceImpl implements FQCPatrolService { @Autowired private JdbcTemplate jdbcTemplate; @Override public ApiResponseResult getBillSelect(String userNo, String taskNo) throws Exception { List list = getBillSelectPrc(userNo, taskNo); if (!list.get(0).toString().equals("0")) {// 存储过程调用失败 //判断返回游标 return ApiResponseResult.failure(list.get(1).toString()); } Map map = new HashMap(); map.put("cursor1", list.get(2)); map.put("cursor2", list.get(3)); return ApiResponseResult.success().data(map); } @Override public ApiResponseResult getDetails(String userNo, String checkNo, int pid) { List list = getDetailsPrc(userNo, checkNo, pid); if (!list.get(0).toString().equals("0")) {// 存储过程调用失败 //判断返回游标 return ApiResponseResult.failure(list.get(1).toString()); } Map map = new HashMap(); map.put("cursor1", list.get(2)); map.put("cursor2", list.get(3)); return ApiResponseResult.success().data(map); } public ApiResponseResult getDetailsSJ(String userNo, String checkNo, int pid) { List list = getDetailsPrcSJ(userNo, checkNo, pid); if (!list.get(0).toString().equals("0")) {// 存储过程调用失败 //判断返回游标 return ApiResponseResult.failure(list.get(1).toString()); } Map map = new HashMap(); map.put("cursor1", list.get(2)); map.put("cursor2", list.get(3)); return ApiResponseResult.success().data(map); } public ApiResponseResult getLineSelect(String userNo, String lineNo, String taskNo) throws Exception { List list = getLineSelectPrc(userNo,lineNo,taskNo); if (!list.get(0).toString().equals("0")) {// 存储过程调用失败 //判断返回游标 return ApiResponseResult.failure(list.get(1).toString()); } return ApiResponseResult.success().data(list.get(2)); } public List getLineSelectPrc(String userNo, String lineNo, String taskNo) throws Exception { List resultList = (List) jdbcTemplate.execute(new CallableStatementCreator() { public CallableStatement createCallableStatement(Connection con) throws SQLException { String storedProc = "{call PRC_PDA_FQC_GET_JYDH(?,?,?,?,?,?)}";// 调用的sql CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, userNo); cs.setString(2, lineNo); cs.setString(3, taskNo); cs.registerOutParameter(4, java.sql.Types.INTEGER);// 输出参数 返回标识 cs.registerOutParameter(5, java.sql.Types.VARCHAR);// 输出参数 返回标识 cs.registerOutParameter(6, -10);// 输出参数 追溯数据 return cs; } }, new CallableStatementCallback() { public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { List result = new ArrayList<>(); List> l = new ArrayList(); cs.execute(); result.add(cs.getInt(4)); result.add(cs.getString(5)); if (cs.getString(4).toString().equals("0")) { // 游标处理 ResultSet rs = (ResultSet) cs.getObject(6); try { l = fitMap(rs); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } result.add(l); } System.out.println(l); return result; } }); return resultList; } public ApiResponseResult sjgetLineSelect(String userNo, String lineNo, String taskNo) throws Exception { List list = sjgetLineSelectPrc(userNo,lineNo,taskNo); if (!list.get(0).toString().equals("0")) {// 存储过程调用失败 //判断返回游标 return ApiResponseResult.failure(list.get(1).toString()); } return ApiResponseResult.success().data(list.get(2)); } public List sjgetLineSelectPrc(String userNo, String lineNo, String taskNo) throws Exception { List resultList = (List) jdbcTemplate.execute(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection con) throws SQLException { String storedProc = "{call PRC_PDA_SJ_GET_JYDH(?,?,?,?,?,?)}";// 调用的sql CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, userNo); cs.setString(2, lineNo); cs.setString(3, taskNo); cs.registerOutParameter(4, java.sql.Types.INTEGER);// 输出参数 返回标识 cs.registerOutParameter(5, java.sql.Types.VARCHAR);// 输出参数 返回标识 cs.registerOutParameter(6, -10);// 输出参数 追溯数据 return cs; } }, new CallableStatementCallback() { public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { List result = new ArrayList<>(); List> l = new ArrayList(); cs.execute(); result.add(cs.getInt(4)); result.add(cs.getString(5)); if (cs.getString(4).toString().equals("0")) { // 游标处理 ResultSet rs = (ResultSet) cs.getObject(6); try { l = fitMap(rs); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } result.add(l); } System.out.println(l); return result; } }); return resultList; } public ApiResponseResult getBillSelect2FQC(String userNo, String lineNo, String taskNo) throws Exception { List list = getBillSelectPrc2FQC(userNo,lineNo,taskNo); if (!list.get(0).toString().equals("0")) {// 存储过程调用失败 //判断返回游标 return ApiResponseResult.failure(list.get(1).toString()); } Map map = new HashMap(); map.put("cursor1", list.get(2)); map.put("cursor2", list.get(3)); return ApiResponseResult.success().data(map); } public List getBillSelectPrc2FQC(String userNo, String lineNo, String taskNo) throws Exception { List resultList = (List) jdbcTemplate.execute(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection con) throws SQLException { String storedProc = "{call PRC_PAD_FQC_BILL_SELECT2(?,?,?,?,?,?,?)}";// 调用的sql CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, userNo); cs.setString(2, lineNo); cs.setString(3, taskNo); cs.registerOutParameter(4, java.sql.Types.INTEGER);// 输出参数 返回标识 cs.registerOutParameter(5, java.sql.Types.VARCHAR);// 输出参数 返回标识 cs.registerOutParameter(6, -10);// 输出参数 追溯数据 cs.registerOutParameter(7, -10);// 输出参数 追溯数据 return cs; } }, new CallableStatementCallback() { public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { List result = new ArrayList<>(); List> l = new ArrayList(); List> l_2 = new ArrayList(); cs.execute(); result.add(cs.getInt(4)); result.add(cs.getString(5)); if (cs.getString(4).toString().equals("0")) { // 游标处理 ResultSet rs = (ResultSet) cs.getObject(6); ResultSet rs2 = (ResultSet) cs.getObject(7); try { l = fitMap(rs); l_2 = fitMap(rs2); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } result.add(l); result.add(l_2); } System.out.println(l); System.out.println(l_2); return result; } }); return resultList; } public ApiResponseResult submitDataFQC(String userNo, String checkNo, int type) throws Exception { List list = submitDataProcFQC(userNo, checkNo, type); if (!list.get(0).toString().equals("0")) {// 存储过程调用失败 //判断返回游标 return ApiResponseResult.failure(list.get(1).toString()); } Map map = new HashMap<>(); map.put("cursor1", list.get(2)); return ApiResponseResult.success().data(map); } public List submitDataProcFQC(String userNo, String checkNo, int type) throws Exception { List resultList = (List) jdbcTemplate.execute(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection con) throws SQLException { String storedProc = "{call PRC_PAD_FQC_FSUBMIT(?,?,?,?,?,?)}";// 调用的sql CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, userNo); cs.setString(2,checkNo); cs.setInt(3,type); cs.registerOutParameter(4, -10);// 输出参数 返回标识 cs.registerOutParameter(5, java.sql.Types.INTEGER);// 输出参数 返回标识 cs.registerOutParameter(6, java.sql.Types.VARCHAR);// 输出参数 返回标识 return cs; } }, new CallableStatementCallback() { public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { List result = new ArrayList<>(); List> l = new ArrayList<>(); cs.execute(); result.add(cs.getInt(5)); result.add(cs.getString(6)); if (cs.getString(5).toString().equals("0")) { // 游标处理 ResultSet rs = (ResultSet) cs.getObject(4); try { l = fitMap(rs); } catch (Exception e) { e.printStackTrace(); } result.add(l); } System.out.println(l); return result; } }); return resultList; } public ApiResponseResult submitDataSJ(String userNo, String checkNo, int type) throws Exception { List list = submitDataProcSJ(userNo, checkNo, type); if (!list.get(0).toString().equals("0")) {// 存储过程调用失败 //判断返回游标 return ApiResponseResult.failure(list.get(1).toString()); } Map map = new HashMap<>(); map.put("cursor1", list.get(2)); return ApiResponseResult.success().data(map); } public List submitDataProcSJ(String userNo, String checkNo, int type) throws Exception { List resultList = (List) jdbcTemplate.execute(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection con) throws SQLException { String storedProc = "{call PRC_PAD_SJ_FSUBMIT(?,?,?,?,?,?)}";// 调用的sql CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, userNo); cs.setString(2,checkNo); cs.setInt(3,type); cs.registerOutParameter(4, -10);// 输出参数 返回标识 cs.registerOutParameter(5, java.sql.Types.INTEGER);// 输出参数 返回标识 cs.registerOutParameter(6, java.sql.Types.VARCHAR);// 输出参数 返回标识 return cs; } }, new CallableStatementCallback() { public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { List result = new ArrayList<>(); List> l = new ArrayList<>(); cs.execute(); result.add(cs.getInt(5)); result.add(cs.getString(6)); if (cs.getString(5).toString().equals("0")) { // 游标处理 ResultSet rs = (ResultSet) cs.getObject(4); try { l = fitMap(rs); } catch (Exception e) { e.printStackTrace(); } result.add(l); } System.out.println(l); return result; } }); return resultList; } @Override public ApiResponseResult checkDetailSave(String userNo, String checkNo, int pid, String checkResult, String checkDemo, String checkNum) { List list = checkDetailSaveProc(userNo, checkNo, pid, checkResult, checkDemo, checkNum); if (!list.get(0).toString().equals("0")) {// 存储过程调用失败 //判断返回游标 return ApiResponseResult.failure(list.get(1).toString()); } return ApiResponseResult.success(); } public ApiResponseResult checkDetailSaveSJ(String userNo, String checkNo, int pid, String checkResult, String checkDemo, String checkNum) { List list = checkDetailSaveProcSJ(userNo, checkNo, pid, checkResult, checkDemo, checkNum); if (!list.get(0).toString().equals("0")) {// 存储过程调用失败 //判断返回游标 return ApiResponseResult.failure(list.get(1).toString()); } return ApiResponseResult.success(); } @Override public ApiResponseResult checkDetailSaveOQC(String userNo, String checkNo, int pid, String checkResult, String checkDemo, String checkNum) { List list = checkDetailSaveProcOQC(userNo, checkNo, pid, checkResult, checkDemo, checkNum); if (!list.get(0).toString().equals("0")) {// 存储过程调用失败 //判断返回游标 return ApiResponseResult.failure(list.get(1).toString()); } return ApiResponseResult.success(); } private List checkDetailSaveProcOQC(String userNo, String checkNo, int pid, String checkResult, String checkDemo, String checkNum) { String storedProc = "{call PRC_PAD_OQC_DETAIL_SAVE(?,?,?,?,?,?,?,?)}"; CallableStatementCreator csc = con -> { CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, userNo); cs.setString(2, checkNo); cs.setInt(3, pid); cs.setString(4, checkResult); cs.setString(5, checkDemo); cs.setString(6, checkNum); cs.registerOutParameter(7, java.sql.Types.INTEGER); cs.registerOutParameter(8, java.sql.Types.VARCHAR); return cs; }; CallableStatementCallback> cscb = cs -> { List result = new ArrayList<>(); cs.execute(); result.add(cs.getInt(7)); result.add(cs.getString(8)); return result; }; return jdbcTemplate.execute(csc, cscb); } @Override public ApiResponseResult submitData(String userNo, String checkNo, int type) { List list = submitDataProc(userNo, checkNo, type); if (!list.get(0).toString().equals("0")) {// 存储过程调用失败 //判断返回游标 return ApiResponseResult.failure(list.get(1).toString()); } Map map = new HashMap(); map.put("cursor1", list.get(2)); return ApiResponseResult.success().data(map); } @Override public ApiResponseResult getOQCBillSelect(String userNo, String taskNo) { List list = getOQCBillSelectPrc(userNo, taskNo); if (!list.get(0).toString().equals("0")) {// 存储过程调用失败 //判断返回游标 return ApiResponseResult.failure(list.get(1).toString()); } Map map = new HashMap(); map.put("cursor1", list.get(2)); map.put("cursor2", list.get(3)); return ApiResponseResult.success().data(map); } @Override public ApiResponseResult getOQCDetails(String userNo, String checkNo, int pid) { List list = getOQCDetailsPrc(userNo, checkNo, pid); if (!list.get(0).toString().equals("0")) {// 存储过程调用失败 //判断返回游标 return ApiResponseResult.failure(list.get(1).toString()); } Map map = new HashMap(); map.put("cursor1", list.get(2)); map.put("cursor2", list.get(3)); return ApiResponseResult.success().data(map); } private List getOQCBillSelectPrc(String userNo, String taskNo) { String storedProc = "{call PRC_PAD_OQC_BILL_SELECT(?,?,?,?,?,?)}"; return jdbcTemplate.execute((ConnectionCallback>) con -> { CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, userNo); cs.setString(2, taskNo); cs.registerOutParameter(3, Types.INTEGER); cs.registerOutParameter(4, Types.VARCHAR); cs.registerOutParameter(5, -10); cs.registerOutParameter(6, -10); cs.execute(); List> l = new ArrayList<>(); List> l_2 = new ArrayList<>(); if (cs.getString(3).equals("0")) { ResultSet rs = (ResultSet) cs.getObject(5); ResultSet rs2 = (ResultSet) cs.getObject(6); l = fitMap(rs); l_2 = fitMap(rs2); } List resultList = new ArrayList<>(); resultList.add(cs.getInt(3)); resultList.add(cs.getString(4)); resultList.add(l); resultList.add(l_2); return resultList; }); } private List submitDataProc(String userNo, String checkNo, int type) { String storedProc = "{call PRC_PAD_FQC_FSUBMIT(?,?,?,?,?,?)}";// 调用的sql CallableStatementCreator csc = con -> { CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, userNo); cs.setString(2, checkNo); cs.setInt(3, type); cs.registerOutParameter(4, -10);// 输出参数 返回标识 cs.registerOutParameter(5, java.sql.Types.INTEGER);// 输出参数 返回标识 cs.registerOutParameter(6, java.sql.Types.VARCHAR);// 输出参数 返回标识 return cs; }; return getObjects(csc, 5, 6, 4); } private List checkDetailSaveProc(String userNo, String checkNo, int pid, String checkResult, String checkDemo, String checkNum) { String storedProc = "{call PRC_PAD_FQC_DETAIL_SAVE(?,?,?,?,?,?,?,?)}"; CallableStatementCreator csc = con -> { CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, userNo); cs.setString(2, checkNo); cs.setInt(3, pid); cs.setString(4, checkResult); cs.setString(5, checkDemo); cs.setString(6, checkNum); cs.registerOutParameter(7, java.sql.Types.INTEGER); cs.registerOutParameter(8, java.sql.Types.VARCHAR); return cs; }; CallableStatementCallback> cscb = cs -> { List result = new ArrayList<>(); cs.execute(); result.add(cs.getInt(7)); result.add(cs.getString(8)); return result; }; return jdbcTemplate.execute(csc, cscb); } private List checkDetailSaveProcSJ(String userNo, String checkNo, int pid, String checkResult, String checkDemo, String checkNum) { String storedProc = "{call PRC_PAD_SJ_DETAIL_SAVE(?,?,?,?,?,?,?,?)}"; CallableStatementCreator csc = con -> { CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, userNo); cs.setString(2, checkNo); cs.setInt(3, pid); cs.setString(4, checkResult); cs.setString(5, checkDemo); cs.setString(6, checkNum); cs.registerOutParameter(7, java.sql.Types.INTEGER); cs.registerOutParameter(8, java.sql.Types.VARCHAR); return cs; }; CallableStatementCallback> cscb = cs -> { List result = new ArrayList<>(); cs.execute(); result.add(cs.getInt(7)); result.add(cs.getString(8)); return result; }; return jdbcTemplate.execute(csc, cscb); } private List getDetailsPrc(String userNo, String checkNo, int pid) { String storedProc = "{call PRC_PAD_FQC_DETAIL_SELECT(?,?,?,?,?,?,?)}"; CallableStatementCreator csc = con -> { CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, userNo); cs.setString(2, checkNo); cs.setInt(3, pid); cs.registerOutParameter(4, java.sql.Types.INTEGER); cs.registerOutParameter(5, java.sql.Types.VARCHAR); cs.registerOutParameter(6, -10); cs.registerOutParameter(7, -10); return cs; }; CallableStatementCallback> cscb = cs -> { List result = new ArrayList<>(); List> l = new ArrayList<>(); List> l_2 = new ArrayList<>(); cs.execute(); result.add(cs.getInt(4)); result.add(cs.getString(5)); if (cs.getString(4).equals("0")) { ResultSet rs = (ResultSet) cs.getObject(6); ResultSet rs2 = (ResultSet) cs.getObject(7); try { l = fitMap(rs); l_2 = fitMap(rs2); } catch (Exception e) { e.printStackTrace(); } result.add(l); result.add(l_2); } return result; }; return jdbcTemplate.execute(csc, cscb); } private List getDetailsPrcSJ(String userNo, String checkNo, int pid) { String storedProc = "{call PRC_PAD_SJ_DETAIL_SELECT(?,?,?,?,?,?,?)}"; CallableStatementCreator csc = con -> { CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, userNo); cs.setString(2, checkNo); cs.setInt(3, pid); cs.registerOutParameter(4, java.sql.Types.INTEGER); cs.registerOutParameter(5, java.sql.Types.VARCHAR); cs.registerOutParameter(6, -10); cs.registerOutParameter(7, -10); return cs; }; CallableStatementCallback> cscb = cs -> { List result = new ArrayList<>(); List> l = new ArrayList<>(); List> l_2 = new ArrayList<>(); cs.execute(); result.add(cs.getInt(4)); result.add(cs.getString(5)); if (cs.getString(4).equals("0")) { ResultSet rs = (ResultSet) cs.getObject(6); ResultSet rs2 = (ResultSet) cs.getObject(7); try { l = fitMap(rs); l_2 = fitMap(rs2); } catch (Exception e) { e.printStackTrace(); } result.add(l); result.add(l_2); } return result; }; return jdbcTemplate.execute(csc, cscb); } private List getOQCDetailsPrc(String userNo, String checkNo, int pid) { String storedProc = "{call PRC_PAD_OQC_DETAIL_SELECT(?,?,?,?,?,?,?)}"; CallableStatementCreator csc = con -> { CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, userNo); cs.setString(2, checkNo); cs.setInt(3, pid); cs.registerOutParameter(4, java.sql.Types.INTEGER); cs.registerOutParameter(5, java.sql.Types.VARCHAR); cs.registerOutParameter(6, -10); cs.registerOutParameter(7, -10); return cs; }; CallableStatementCallback> cscb = cs -> { List result = new ArrayList<>(); List> l = new ArrayList<>(); List> l_2 = new ArrayList<>(); cs.execute(); result.add(cs.getInt(4)); result.add(cs.getString(5)); if (cs.getString(4).equals("0")) { ResultSet rs = (ResultSet) cs.getObject(6); ResultSet rs2 = (ResultSet) cs.getObject(7); try { l = fitMap(rs); l_2 = fitMap(rs2); } catch (Exception e) { e.printStackTrace(); } result.add(l); result.add(l_2); } return result; }; return jdbcTemplate.execute(csc, cscb); } private List getBillSelectPrc(String userNo, String taskNo) { String storedProc = "{call PRC_PAD_FQC_BILL_SELECT(?,?,?,?,?,?)}"; return jdbcTemplate.execute((ConnectionCallback>) con -> { CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, userNo); cs.setString(2, taskNo); cs.registerOutParameter(3, Types.INTEGER); cs.registerOutParameter(4, Types.VARCHAR); cs.registerOutParameter(5, -10); cs.registerOutParameter(6, -10); cs.execute(); List> l = new ArrayList<>(); List> l_2 = new ArrayList<>(); if (cs.getString(3).equals("0")) { ResultSet rs = (ResultSet) cs.getObject(5); ResultSet rs2 = (ResultSet) cs.getObject(6); l = fitMap(rs); l_2 = fitMap(rs2); } List resultList = new ArrayList<>(); resultList.add(cs.getInt(3)); resultList.add(cs.getString(4)); resultList.add(l); resultList.add(l_2); return resultList; }); } private List> fitMap(ResultSet rs) throws SQLException { List> list = new ArrayList<>(); ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); while (rs.next()) { Map row = new HashMap<>(); for (int i = 1; i <= columnCount; i++) { String columnName = rsmd.getColumnName(i); Object columnValue = rs.getObject(i); row.put(columnName, columnValue); } list.add(row); } return list; } @Override public ApiResponseResult submitDataOQC(String userNo, String checkNo, int type, String conformity) { List list = submitDataOQCProc(userNo, checkNo, type, conformity); if (!list.get(0).toString().equals("0")) {// 存储过程调用失败 //判断返回游标 return ApiResponseResult.failure(list.get(1).toString()); } Map map = new HashMap(); map.put("cursor1", list.get(2)); return ApiResponseResult.success().data(map); } private List submitDataOQCProc(String userNo, String checkNo, int type, String conformity) { String storedProc = "{call PRC_PAD_OQC_FSUBMIT(?,?,?,?,?,?,?)}";// 调用的sql CallableStatementCreator csc = con -> { CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, userNo); cs.setString(2, checkNo); cs.setInt(3, type); cs.setString(4, conformity); cs.registerOutParameter(5, -10);// 输出参数 返回标识 cs.registerOutParameter(6, java.sql.Types.INTEGER);// 输出参数 返回标识 cs.registerOutParameter(7, java.sql.Types.VARCHAR);// 输出参数 返回标识 return cs; }; return getObjects(csc, 6, 7, 5); } private List getObjects(CallableStatementCreator csc, int i, int i2, int i3) { CallableStatementCallback> cscb = cs -> { List result = new ArrayList<>(); List> l = new ArrayList(); cs.execute(); result.add(cs.getInt(i)); result.add(cs.getString(i2)); if (cs.getString(i).toString().equals("0")) { // 游标处理 ResultSet rs = (ResultSet) cs.getObject(i3); try { l = fitMap(rs); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } result.add(l); } return result; }; return jdbcTemplate.execute(csc, cscb); } }