From f7abaa9b5e8f2bb1da9f541a22c71779792cd602 Mon Sep 17 00:00:00 2001 From: 812648385 <812648385@qq.com> Date: Tue, 1 Apr 2025 12:18:27 +0800 Subject: [PATCH] no message --- .../weiyichi/controller/TransferAccount.java | 380 ++++++++---------- 1 file changed, 178 insertions(+), 202 deletions(-) diff --git a/code/springboot/newBank/src/main/java/demo/weiyichi/controller/TransferAccount.java b/code/springboot/newBank/src/main/java/demo/weiyichi/controller/TransferAccount.java index 8dec8c3d6..649eb5e75 100644 --- a/code/springboot/newBank/src/main/java/demo/weiyichi/controller/TransferAccount.java +++ b/code/springboot/newBank/src/main/java/demo/weiyichi/controller/TransferAccount.java @@ -1,202 +1,178 @@ -//package demo.weiyichi.controller; -// -// -//import demo.weiyichi.model.AccountTab; -//import demo.weiyichi.model.ApiResponse; -//import demo.weiyichi.model.RecordTable; -//import demo.weiyichi.model.WithdrawMoneyDTO; -//import demo.weiyichi.model.TransferDTO; -//import demo.weiyichi.model.QueryDTO; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.jdbc.core.JdbcTemplate; -// -//import org.springframework.util.CollectionUtils; -//import org.springframework.web.bind.annotation.*; -// -//import javax.transaction.Transactional; -//import java.time.LocalDateTime; -//import java.time.format.DateTimeFormatter; -//import java.util.HashMap; -//import java.util.List; -//import java.util.Map; -// -//@RestController -//@RequestMapping("/weiyichi") -//public class TransferAccount { -// -// // add 01 -// @Autowired -// private JdbcTemplate jdbcTemplate; -// -// //转账 -// @Transactional -// @PostMapping("/transfer") -// public ApiResponse transfer(@RequestBody TransferDTO transferDTO) { -// try { -// // 参数校验 -// if (transferDTO.getOutCardNo() == null || transferDTO.getInCardNo() == null) { -// return ApiResponse.error("INVALID_CARDNO", "卡号不能为空"); -// } -// if (transferDTO.getAmount() == null || transferDTO.getAmount() <= 0) { -// return ApiResponse.error("INVALID_AMOUNT", "转账金额必须大于0"); -// } -// -// // 验证转出账户 -// String outSql = "SELECT * FROM account_tab WHERE cardNo = ?"; -// List> outAccount = jdbcTemplate.queryForList(outSql, transferDTO.getOutCardNo()); -// if (CollectionUtils.isEmpty(outAccount)) { -// return ApiResponse.error("ACCOUNT_NOT_FOUND", "转出账户不存在"); -// } -// -//// // 验证密码 -//// if (!verifyAccountPassword(transferDTO.getOutCardNo(), transferDTO.getPassword())) { -//// return ApiResponse.error("PASSWORD_MISMATCH", "密码错误"); -//// } -// -// // 验证转入账户 -// String inSql = "SELECT * FROM account_tab WHERE cardNo = ?"; -// if (CollectionUtils.isEmpty(jdbcTemplate.queryForList(inSql, transferDTO.getInCardNo()))) { -// return ApiResponse.error("ACCOUNT_NOT_FOUND", "转入账户不存在"); -// } -// -// // 检查余额 -// double outBalance = Double.parseDouble(outAccount.get(0).get("balance").toString()); -// if (outBalance < transferDTO.getAmount()) { -// return ApiResponse.error("INSUFFICIENT_BALANCE", "余额不足"); -// } -// -// // 更新余额 -// jdbcTemplate.update("UPDATE account_tab SET balance = ? WHERE cardNo = ?", -// outBalance - transferDTO.getAmount(), transferDTO.getOutCardNo()); -// jdbcTemplate.update("UPDATE account_tab SET balance = balance + ? WHERE cardNo = ?", -// transferDTO.getAmount(), transferDTO.getInCardNo()); -// -// // 生成流水记录 -// generateTransferRecords(transferDTO, outBalance); -// logger.info("转账成功:从 {} 到 {},金额 {}", -// transferDTO.getOutCardNo(), transferDTO.getInCardNo(), transferDTO.getAmount()); -// return ApiResponse.success(null); -// } catch (Exception e) { -// logger.error("转账失败:{}", e.getMessage()); -// return ApiResponse.error("TRANSFER_FAILED", "转账失败"); -// } -// } -// -// -// -// // 账户查询 -// @GetMapping("/query") -// public ApiResponse> query( -// @RequestParam String cardNo, -// @RequestParam(required = false) String type, -// @RequestParam(required = false) String filter, -// @RequestParam(required = false) String startDate, -// @RequestParam(required = false) String endDate) { -// -// // 参数校验 -// if (cardNo == null || !cardNo.matches("\\d{16}")) { -// return ApiResponse.error("INVALID_CARDNO", "卡号格式错误"); -// } -// -// Map result = new HashMap<>(); -// -// // 余额查询 -// if (type == null || "balance".equals(type)) { -// try { -// String balanceSql = "SELECT balance FROM account_tab WHERE cardNo = ?"; -// Double balance = jdbcTemplate.queryForObject(balanceSql, Double.class, cardNo); -// result.put("balance", balance); -// } catch (Exception e) { -// return ApiResponse.error("BALANCE_QUERY_FAILED", "余额查询失败"); -// } -// } -// -// // 交易记录查询 -// if (type == null || "transactions".equals(type)) { -// try { -// String transSql = buildTransactionSql(filter, startDate, endDate); -// List> transactions = jdbcTemplate.queryForList(transSql, cardNo); -// result.put("transactions", transactions); -// } catch (Exception e) { -// return ApiResponse.error("TRANSACTION_QUERY_FAILED", "交易记录查询失败"); -// } -// } -// -// return ApiResponse.success(result); -// } -// -// //构建交易记录查询 -// private String buildTransactionSql(String filter, String startDate, String endDate) { -// String sql = "SELECT " + -// "date, cardNo, money, " + -// "CASE serviceTy " + -// "WHEN '1' THEN '存款' " + -// "WHEN '2' THEN '取款' " + -// "WHEN '3' THEN '转账' " + -// "ELSE '未知' " + -// "END AS serviceDesc, " + -// "balance, recordNo " + -// "FROM recordtable " + -// "WHERE cardNo = ?"; -// -// if ("income".equals(filter)) { -// sql += " AND serviceTy = '1'"; -// } else if ("expense".equals(filter)) { -// sql += " AND serviceTy IN ('2', '3')"; -// } -// -// if (startDate != null && endDate != null) { -// sql += " AND date BETWEEN ? AND ?"; -// } -// -// return sql; -// } -// -// //销户接口 -// @PostMapping("/closeAccount") -// public ApiResponse closeAccount( -// @RequestParam String cardNo, -// @RequestParam String password, -// @RequestParam String staffNo, -// @RequestParam String organiNm) { -// -// // 参数校验 -// if (cardNo == null || cardNo.trim().isEmpty()) { -// return ApiResponse.error("INVALID_CARDNO", "卡号不能为空"); -// } -// if (password == null || password.trim().isEmpty()) { -// return ApiResponse.error("INVALID_PASSWORD", "密码不能为空"); -// } -// -// // 验证密码 -// if (!verifyAccountPassword(cardNo, password)) { -// return ApiResponse.error("PASSWORD_MISMATCH", "密码错误"); -// } -// -// // 检查余额 -// Double balance = getBalance(cardNo).getData(); -// if (balance == null || balance != 0) { -// return ApiResponse.error("BALANCE_NOT_ZERO", "账户余额不为0,无法销户"); -// } -// -// try { -// // 更新账户状态 -// String updateSql = "UPDATE account_tab SET status = '2' WHERE cardNo = ?"; -// jdbcTemplate.update(updateSql, cardNo); -// -// // 生成销户流水记录 -// RecordTable record = new RecordTable(); -// record.setCardNo(cardNo); -// record.setServiceTy("4"); // 4-销户 -// record.setRecordNo(getRecordNo(staffNo, organiNm)); -// saveRecordTable(record); -// -// logger.info("账户 {} 已销户,操作员工:{}", cardNo, staffNo); -// return ApiResponse.success(null); -// } catch (Exception e) { -// logger.error("销户失败:{}", e.getMessage()); -// return ApiResponse.error("CLOSE_FAILED", "销户失败"); -// } -// } -// -//} \ No newline at end of file +package demo.weiyichi.controller; + + +import demo.weiyichi.model.AccountTab; +import demo.weiyichi.model.ApiResponse; +import demo.weiyichi.model.RecordTable; +import demo.weiyichi.model.WithdrawMoneyDTO; +import demo.weiyichi.model.TransferDTO; +import demo.weiyichi.model.QueryDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.math.BigDecimal; + +@RestController +@RequestMapping("/weiyichi") +public class transferAccount { + @Autowired + private JdbcTemplate jdbcTemplate; + private Boolean verifyAccountPassword(String cardNo, String password) { + String sql = "SELECT * FROM account_tab WHERE cardNo = ? AND password = ?"; + return !jdbcTemplate.queryForList(sql, cardNo, password).isEmpty(); + } + + // 查询账户信息 + private List> getAccount(String cardNo) { + String sql = "SELECT * FROM account_tab WHERE cardNo = ?"; + return jdbcTemplate.queryForList(sql, cardNo); + } + + // 生成流水号 + private String getRecordNo(String staffNo, String organiNm) { + String formattedTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); + String sql = "SELECT COUNT(*) FROM recordtable"; + int count = jdbcTemplate.queryForObject(sql, Integer.class) + 1; + String sequence = String.format("%06d", count); + return formattedTime + organiNm + staffNo + sequence; + } + + // 保存流水记录 + private void saveRecordTable(RecordTable record) { + String sql = "INSERT INTO recordtable (date, cardNo, money, serviceTy, balance, recordNo) VALUES (?, ?, ?, ?, ?, ?)"; + String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + jdbcTemplate.update(sql, date, record.getCardNo(), record.getMoney(), record.getServiceTy(), record.getBalance(), record.getRecordNo()); + } + // 转账接口 + @PostMapping("/transfer") + @Transactional + public ResponseEntity transfer(@RequestBody TransferDTO transferDTO) { + // 验证转出账户 + if (!verifyAccountPassword(transferDTO.getFromCardNo(), transferDTO.getPassword())) { + return ResponseEntity.badRequest().body("密码错误"); + } + + // 查询转出账户 + List> fromAccount = getAccount(transferDTO.getFromCardNo()); + if (CollectionUtils.isEmpty(fromAccount)) { + return ResponseEntity.badRequest().body("转出账户不存在"); + } + Double fromBalance = Double.parseDouble(fromAccount.get(0).get("balance").toString()); + + // 验证余额 + if (fromBalance < transferDTO.getMoney()) { + return ResponseEntity.badRequest().body("余额不足"); + } + + // 查询转入账户 + List> toAccount = getAccount(transferDTO.getToCardNo()); + if (CollectionUtils.isEmpty(toAccount)) { + return ResponseEntity.badRequest().body("转入账户不存在"); + } + + // 更新转出账户 + String updateFromSql = "UPDATE account_tab SET balance = balance - ? WHERE cardNo = ?"; + jdbcTemplate.update(updateFromSql, transferDTO.getMoney(), transferDTO.getFromCardNo()); + + // 更新转入账户 + String updateToSql = "UPDATE account_tab SET balance = balance + ? WHERE cardNo = ?"; + jdbcTemplate.update(updateToSql, transferDTO.getMoney(), transferDTO.getToCardNo()); + + // 生成流水记录(转出) + createTransferRecord(transferDTO.getFromCardNo(), transferDTO.getMoney(), "2", + Double.parseDouble(fromAccount.get(0).get("balance").toString()) - transferDTO.getMoney(), + transferDTO.getStaffNo(), transferDTO.getOrganiNm()); + + // 生成流水记录(转入) + createTransferRecord(transferDTO.getToCardNo(), transferDTO.getMoney(), "1", + Double.parseDouble(toAccount.get(0).get("balance").toString()) + transferDTO.getMoney(), + transferDTO.getStaffNo(), transferDTO.getOrganiNm()); + + return ResponseEntity.ok("转账成功"); + } + + private void createTransferRecord(String cardNo, Double amount, String serviceTy, + Double balance, String staffNo, String organiNm) { + RecordTable record = new RecordTable(); + record.setCardNo(cardNo); + record.setMoney(amount); + record.setServiceTy(serviceTy); + record.setBalance(balance); + record.setRecordNo(getRecordNo(staffNo, organiNm)); + saveRecordTable(record); + } + @GetMapping("/getTransactions") + public List> getTransactions( + @RequestParam String cardNo, + @RequestParam(required = false) String startDate, + @RequestParam(required = false) String endDate) { + + StringBuilder sql = new StringBuilder( + "SELECT date, money, serviceTy, balance, recordNo FROM recordtable WHERE cardNo = ?"); + + List params = new ArrayList<>(); + params.add(cardNo); + + if (StringUtils.hasText(startDate)) { + sql.append(" AND date >= ?"); + params.add(startDate + " 00:00:00"); + } + if (StringUtils.hasText(endDate)) { + sql.append(" AND date <= ?"); + params.add(endDate + " 23:59:59"); + } + sql.append(" ORDER BY date DESC"); + + return jdbcTemplate.queryForList(sql.toString(), params.toArray()); + } + + @GetMapping("/getBalance") + public ResponseEntity getBalance(@RequestParam String cardNo) { + String sql = "SELECT balance FROM account_tab WHERE cardNo = ?"; + try { + Double balance = jdbcTemplate.queryForObject(sql, Double.class, cardNo); + return ResponseEntity.ok(balance); + } catch (EmptyResultDataAccessException e) { + return ResponseEntity.notFound().build(); + } + } + @PostMapping("/closeAccount") + public ResponseEntity closeAccount( + @RequestParam String cardNo, + @RequestParam String password) { + + // 验证账户 + if (!verifyAccountPassword(cardNo, password)) { + return ResponseEntity.badRequest().body("密码错误"); + } + + // 检查余额 + Double balance = jdbcTemplate.queryForObject( + "SELECT balance FROM account_tab WHERE cardNo = ?", Double.class, cardNo); + + if (balance > 0) { + return ResponseEntity.badRequest().body("账户余额不为零,请先结清"); + } + + // 更新账户状态 + int updated = jdbcTemplate.update( + "UPDATE account_tab SET status = '2' WHERE cardNo = ?", cardNo); + + if (updated > 0) { + return ResponseEntity.ok("销户成功"); + } + return ResponseEntity.badRequest().body("销户失败"); + } +} \ No newline at end of file