diff --git a/pom.xml b/pom.xml index 40a8e590..b1678a2d 100644 --- a/pom.xml +++ b/pom.xml @@ -153,11 +153,11 @@ 8.0.15 - - - - - + + com.microsoft.sqlserver + mssql-jdbc + 8.4.1.jre8 + org.springframework diff --git a/src/main/java/com/qs/serve/common/util/JdbcUtil.java b/src/main/java/com/qs/serve/common/util/JdbcUtil.java new file mode 100644 index 00000000..1a7251e7 --- /dev/null +++ b/src/main/java/com/qs/serve/common/util/JdbcUtil.java @@ -0,0 +1,107 @@ +package com.qs.serve.common.util; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StringUtils; + +import java.sql.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 原生JDBC工具类 + * @Author JcYen + * @Date 2021/6/4 + */ +@Slf4j +public class JdbcUtil { + + private static final String[] FILTER_WORD = new String[]{"truncate","create","alter","eval","delete","sp_password"}; + + /** + * 执行SQL(为安全,拦截delete语句) + * @param username + * @param password + * @param url + * @param driverName + * @param sql + * @return + */ + public static List> query(String username, String password, String url, String driverName, String sql) { + //检查SQL,防止SQL执行DDL语句 + doSqlFilter(sql); + List> list = new ArrayList(); + Connection conn = null; + Statement stmt = null; + ResultSet rs = null; + try { + Class.forName(driverName); + conn = DriverManager.getConnection(url, username, password); + stmt = conn.createStatement(); + log.debug("JDBC工具类 Preparing SQL: {}",url); + rs = stmt.executeQuery(sql); + ResultSetMetaData md = rs.getMetaData(); + int columnCount = md.getColumnCount(); + while (rs.next()) { + Map rowData = new HashMap<>(); + for (int i = 1; i <= columnCount; i++) { + rowData.put(md.getColumnName(i), rs.getObject(i)); + } + list.add(rowData); + } + } catch (ClassNotFoundException e) { + log.warn(e.getMessage()); + } catch (SQLException throwables) { + log.error(throwables.getMessage()); + }finally { + if(rs!=null){ + try { + rs.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + if (stmt!=null){ + try { + stmt.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + if(conn!=null){ + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + rs = null; + stmt = null; + conn = null; + } + return list; + } + + private static void doSqlFilter(String sql){ + boolean unsafe = false; + String[] parts = sql.split(" "); + for (String part : parts) { + if(unsafe){ break; } + if(StringUtils.isEmpty(part)){ + continue; + } + part = part.trim(); + for (String filterWord : FILTER_WORD) { + if(part.equalsIgnoreCase(filterWord)){ + unsafe = true; + break; + } + } + } + if(unsafe){ + //AssertUtil.("非法SQL被拦截 ==> "+sql); + } + } + +} diff --git a/src/main/java/com/qs/serve/modules/erp/controller/ErpCustomerController.java b/src/main/java/com/qs/serve/modules/erp/controller/ErpCustomerController.java new file mode 100644 index 00000000..3eab973b --- /dev/null +++ b/src/main/java/com/qs/serve/modules/erp/controller/ErpCustomerController.java @@ -0,0 +1,50 @@ +package com.qs.serve.modules.erp.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.erp.entity.dto.ErpCustomerAmountResult; +import com.qs.serve.modules.erp.service.ErpCustomerService; +import com.qs.serve.modules.goods.entity.GoodsBrand; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +/** + * ERP客户 + * @author YenHex + * @since 2023/9/5 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("erp/customer") +public class ErpCustomerController { + + private final ErpCustomerService erpCustomerService; + private final BmsSupplierService supplierService; + + /** + * 获取客户帐余 + * @param code + * @return + */ + @GetMapping("/getAmount/{code}") + public R getAmount(@PathVariable String code){ + BmsSupplier supplier = supplierService.getByCode(code,null); + if(supplier!=null){ + ErpCustomerAmountResult amountResult = erpCustomerService.getCustomerAmount(code); + return R.ok(amountResult); + } + return R.error(); + } + +} diff --git a/src/main/java/com/qs/serve/modules/erp/entity/dto/ErpCustomerAmountResult.java b/src/main/java/com/qs/serve/modules/erp/entity/dto/ErpCustomerAmountResult.java new file mode 100644 index 00000000..5b666946 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/erp/entity/dto/ErpCustomerAmountResult.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.erp.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/9/5 + */ +@Data +public class ErpCustomerAmountResult { + + /** + * 余额 + */ + BigDecimal amount; + +} diff --git a/src/main/java/com/qs/serve/modules/erp/service/ErpCustomerService.java b/src/main/java/com/qs/serve/modules/erp/service/ErpCustomerService.java new file mode 100644 index 00000000..b216c152 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/erp/service/ErpCustomerService.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.erp.service; + +import com.qs.serve.modules.erp.entity.dto.ErpCustomerAmountResult; + +/** + * @author YenHex + * @since 2023/9/5 + */ +public interface ErpCustomerService { + + /** + * 获取客户帐余额 + * @param supplierCode + * @return + */ + ErpCustomerAmountResult getCustomerAmount(String supplierCode); + +} diff --git a/src/main/java/com/qs/serve/modules/erp/service/impl/ErpCustomerServiceImpl.java b/src/main/java/com/qs/serve/modules/erp/service/impl/ErpCustomerServiceImpl.java new file mode 100644 index 00000000..2f67e4a2 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/erp/service/impl/ErpCustomerServiceImpl.java @@ -0,0 +1,86 @@ +package com.qs.serve.modules.erp.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.crypto.Mode; +import cn.hutool.crypto.Padding; +import cn.hutool.crypto.symmetric.AES; +import com.qs.serve.common.util.JdbcUtil; +import com.qs.serve.modules.erp.entity.dto.ErpCustomerAmountResult; +import com.qs.serve.modules.erp.service.ErpCustomerService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * @author YenHex + * @since 2023/9/5 + */ +@Slf4j +@Service +@AllArgsConstructor +public class ErpCustomerServiceImpl implements ErpCustomerService { + + @Override + public ErpCustomerAmountResult getCustomerAmount(String supplierCode) { + String iv = "1234567812345678"; + AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, iv.getBytes(), iv.getBytes()); + String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; + String url = "jdbc:sqlserver://59.37.164.96:14333;DatabaseName=UFDATA_001_2020"; + String username = "sa"; + String password = aes.decryptStr("h7wNWH4mf7mzmLZmkYgIdA=="); + String tmpTableName = "z_qs_cus_"+supplierCode; + ErpCustomerAmountResult amountResult = new ErpCustomerAmountResult(); + String sql = "DECLARE @return_value int " + + " EXEC @return_value = [dbo].[Sa_saleCreReport] " + + " @tmptableName = '"+tmpTableName+"'," + + " @repStytle = 1, " + + " @chrWhereDate = NULL, " + + " @chrWhereCus = \"and ccuscode = '"+supplierCode+"'\"," + + " @chrWhereDep = NULL, " + + " @chrWherePer = NULL, " + + " @chrCreSys = N'SA', " + + " @chrWhereOth = NULL " + + " SELECT 'Return Value' = @return_value"; + List> result = JdbcUtil.query(username,password,url,driverName,sql); + int rsNum = -1; + if(CollectionUtil.isNotEmpty(result)){ + for (Map objectMap : result) { + for (String key : objectMap.keySet()) { + Object obj = objectMap.get(key); + if(obj!=null&&obj.toString().equals("0")){ + rsNum = 0; + break; + } + } + } + } + if(rsNum==0){ + String sql4Data = "Select * from tempdb.."+tmpTableName+" order by '单据日期' desc"; + List> resultList = JdbcUtil.query(username,password,url,driverName,sql4Data); + if(CollectionUtil.isNotEmpty(resultList)){ + BigDecimal sumBalance = BigDecimal.ZERO; + for (Map objectMap : resultList) { + Object obj = objectMap.get("信用余额"); + if(obj!=null){ + BigDecimal objBal = new BigDecimal(obj.toString().trim()); + sumBalance = sumBalance.add(objBal); + } + } + dropTmpTable(tmpTableName,username,password,url,driverName); + amountResult.setAmount(sumBalance); + } + dropTmpTable(tmpTableName,username,password,url,driverName); + } + return amountResult; + } + + + private void dropTmpTable(String tmpTable,String username,String password,String url,String driverName){ + String sql = "drop table tempdb.."+tmpTable; + JdbcUtil.query(username,password,url,driverName,sql); + } +}