|
|
|
@ -13,8 +13,16 @@ import org.springframework.stereotype.Repository; |
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.sql.*; |
|
|
|
import java.sql.Date; |
|
|
|
import java.util.*; |
|
|
|
import java.util.logging.Logger; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.Calendar; |
|
|
|
import java.util.Collections; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.IdentityHashMap; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Set; |
|
|
|
|
|
|
|
import org.slf4j.Logger; |
|
|
|
|
|
|
|
/** |
|
|
|
* |
|
|
|
@ -27,60 +35,98 @@ import java.util.logging.Logger; |
|
|
|
@Repository |
|
|
|
public class ProcedureDaoImpl implements ProcedureDao { |
|
|
|
|
|
|
|
private static final Logger log = LoggerFactory.getLogger(ProcedureDaoImpl.class); |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private JdbcTemplate jdbcTemplate; |
|
|
|
|
|
|
|
/** |
|
|
|
* 输出 JDBC/SQL Server 异常链(含 SQLException.getNextException),便于定位库端真实报错。rqrq |
|
|
|
*/ |
|
|
|
private void logJdbcThrowableChain(String context, Throwable throwable) { |
|
|
|
if (throwable == null) { |
|
|
|
return; |
|
|
|
} |
|
|
|
Throwable t = throwable; |
|
|
|
Set<Throwable> seen = Collections.newSetFromMap(new IdentityHashMap<>()); |
|
|
|
int depth = 0; |
|
|
|
while (t != null && !seen.contains(t) && depth < 50) { |
|
|
|
seen.add(t); |
|
|
|
log.error("{} 异常链 depth={} class={} message={}", context, depth, t.getClass().getName(), t.getMessage()); |
|
|
|
if (t instanceof SQLException) { |
|
|
|
SQLException next = ((SQLException) t).getNextException(); |
|
|
|
int nx = 0; |
|
|
|
while (next != null && nx < 20) { |
|
|
|
log.error("{} SQLException.getNextException[{}] SQLState={} errorCode={} message={}", context, nx, |
|
|
|
next.getSQLState(), next.getErrorCode(), next.getMessage()); |
|
|
|
next = next.getNextException(); |
|
|
|
nx++; |
|
|
|
} |
|
|
|
} |
|
|
|
t = t.getCause(); |
|
|
|
depth++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public List<Map<String, Object>> soReceiveFgRmBackflush(String site, String orderNo, Date transDate, |
|
|
|
String transNo, float itemNo, float oldQty, float newQty, String OrderType, String userId, String receiver, |
|
|
|
String partnerId) { |
|
|
|
return jdbcTemplate.execute(new CallableStatementCreator() { |
|
|
|
|
|
|
|
@Override |
|
|
|
public CallableStatement createCallableStatement(Connection con) throws SQLException { |
|
|
|
String sql = "EXEC SO_Receive_FG_RMBackflush ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?"; |
|
|
|
CallableStatement cs = con.prepareCall(sql); |
|
|
|
cs.setString(1, site); |
|
|
|
cs.setString(2, orderNo); |
|
|
|
cs.setDate(3, transDate); |
|
|
|
cs.setString(4, transNo); |
|
|
|
cs.setFloat(5, itemNo); |
|
|
|
cs.setFloat(6, oldQty); |
|
|
|
cs.setFloat(7, newQty); |
|
|
|
cs.setString(8, OrderType); |
|
|
|
cs.setString(9, userId); |
|
|
|
cs.setString(10, receiver); |
|
|
|
cs.setString(11, partnerId); |
|
|
|
return cs; |
|
|
|
} |
|
|
|
}, new CallableStatementCallback<List<Map<String, Object>>>() { |
|
|
|
|
|
|
|
@Override |
|
|
|
public List<Map<String, Object>> doInCallableStatement(CallableStatement cs) |
|
|
|
throws SQLException, DataAccessException { |
|
|
|
List<Map<String, Object>> resultList = new ArrayList<>(); |
|
|
|
ResultSet rs = cs.executeQuery(); |
|
|
|
ResultSetMetaData rsmd = rs.getMetaData(); |
|
|
|
int columns = rsmd.getColumnCount(); |
|
|
|
//处理列名 |
|
|
|
Map<String, Object> columnMap = new HashMap<>(); |
|
|
|
for(int i = 1; i <= columns; i++){ |
|
|
|
columnMap.put(rsmd.getColumnName(i), null); |
|
|
|
final String ctx = "SO_Receive_FG_RMBackflush site=" + site + " orderNo=" + orderNo + " transNo=" + transNo; |
|
|
|
log.info( |
|
|
|
"SO_Receive_FG_RMBackflush 入参 site={} orderNo={} transDate={} transNo={} itemNo={} oldQty={} newQty={} OrderType={} userId={} receiver={} partnerId={}", |
|
|
|
site, orderNo, transDate, transNo, itemNo, oldQty, newQty, OrderType, userId, receiver, partnerId); |
|
|
|
try { |
|
|
|
return jdbcTemplate.execute(new CallableStatementCreator() { |
|
|
|
|
|
|
|
@Override |
|
|
|
public CallableStatement createCallableStatement(Connection con) throws SQLException { |
|
|
|
String sql = "EXEC SO_Receive_FG_RMBackflush ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?"; |
|
|
|
CallableStatement cs = con.prepareCall(sql); |
|
|
|
cs.setString(1, site); |
|
|
|
cs.setString(2, orderNo); |
|
|
|
cs.setDate(3, transDate); |
|
|
|
cs.setString(4, transNo); |
|
|
|
cs.setFloat(5, itemNo); |
|
|
|
cs.setFloat(6, oldQty); |
|
|
|
cs.setFloat(7, newQty); |
|
|
|
cs.setString(8, OrderType); |
|
|
|
cs.setString(9, userId); |
|
|
|
cs.setString(10, receiver); |
|
|
|
cs.setString(11, partnerId); |
|
|
|
return cs; |
|
|
|
} |
|
|
|
//循环处理数据 |
|
|
|
while(rs.next()){ |
|
|
|
Map<String, Object> resultMap = new HashMap<String, Object>(); |
|
|
|
//循环出当前行的所有数据 |
|
|
|
for(String str : columnMap.keySet()){ |
|
|
|
resultMap.put(str, rs.getObject(str)); |
|
|
|
}, new CallableStatementCallback<List<Map<String, Object>>>() { |
|
|
|
|
|
|
|
@Override |
|
|
|
public List<Map<String, Object>> doInCallableStatement(CallableStatement cs) |
|
|
|
throws SQLException, DataAccessException { |
|
|
|
List<Map<String, Object>> resultList = new ArrayList<>(); |
|
|
|
ResultSet rs = cs.executeQuery(); |
|
|
|
ResultSetMetaData rsmd = rs.getMetaData(); |
|
|
|
int columns = rsmd.getColumnCount(); |
|
|
|
//处理列名 |
|
|
|
Map<String, Object> columnMap = new HashMap<>(); |
|
|
|
for (int i = 1; i <= columns; i++) { |
|
|
|
columnMap.put(rsmd.getColumnName(i), null); |
|
|
|
} |
|
|
|
resultList.add(resultMap); |
|
|
|
//循环处理数据 |
|
|
|
while (rs.next()) { |
|
|
|
Map<String, Object> resultMap = new HashMap<String, Object>(); |
|
|
|
//循环出当前行的所有数据 |
|
|
|
for (String str : columnMap.keySet()) { |
|
|
|
resultMap.put(str, rs.getObject(str)); |
|
|
|
} |
|
|
|
resultList.add(resultMap); |
|
|
|
} |
|
|
|
return resultList; |
|
|
|
} |
|
|
|
return resultList; |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
} catch (RuntimeException ex) { |
|
|
|
log.error("{} 调用失败(即将抛出)", ctx, ex); |
|
|
|
logJdbcThrowableChain(ctx, ex); |
|
|
|
throw ex; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|