From a62e18a0861c2c08e55d3acb797e9287b6008085 Mon Sep 17 00:00:00 2001 From: bb_pan Date: Wed, 23 Apr 2025 15:27:28 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E4=BC=98=E5=8C=96+=E5=8A=A0=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sgzb-ui/package.json | 1 + sgzb-ui/src/utils/request.js | 25 +++++++ sgzb-ui/src/utils/sm.js | 70 +++++++++++++++++++ sgzb-ui/src/views/newLogin.vue | 1 + .../warehousing/newTools/index.vue | 2 +- 5 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 sgzb-ui/src/utils/sm.js diff --git a/sgzb-ui/package.json b/sgzb-ui/package.json index 6a071e28..08931ad4 100644 --- a/sgzb-ui/package.json +++ b/sgzb-ui/package.json @@ -56,6 +56,7 @@ "qrcodejs2": "0.0.2", "quill": "1.3.7", "screenfull": "5.0.2", + "sm-crypto": "^0.3.13", "sortablejs": "1.10.2", "uuid": "^9.0.1", "vue": "2.6.12", diff --git a/sgzb-ui/src/utils/request.js b/sgzb-ui/src/utils/request.js index 0c0873c6..58c6db37 100644 --- a/sgzb-ui/src/utils/request.js +++ b/sgzb-ui/src/utils/request.js @@ -6,6 +6,7 @@ import errorCode from '@/utils/errorCode' import { tansParams, blobValidate } from "@/utils/ruoyi"; import cache from '@/plugins/cache' import { saveAs } from 'file-saver' +import { decryptWithSM4, encryptWithSM4, hashWithSM3AndSalt } from '@/utils/sm' let downloadLoadingInstance; // 是否显示重新登录 @@ -22,6 +23,17 @@ const service = axios.create({ // request拦截器 service.interceptors.request.use(config => { + const encryptRequest = false + const checkIntegrity = false + const encryptResponse = false + //入参加密 + config.headers['encryptRequest'] = encryptRequest ? 'true' : 'false' + // 数据完整性校验 + config.headers['checkIntegrity'] = checkIntegrity ? 'true' : 'false' + //回参是否加密 + config.headers['encryptResponse'] = encryptResponse ? 'true' : 'false' + // console.log('🚀 ~ config:', config) + // 是否需要设置 token const isToken = (config.headers || {}).isToken === false // 是否需要防止数据重复提交 @@ -42,6 +54,15 @@ service.interceptors.request.use(config => { data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data, time: new Date().getTime() } + let contentType = config.headers['Content-Type'] + // console.log('🚀 ~ contentType:', contentType, requestObj.data) + if (contentType.includes('application/json') && typeof requestObj.data !== 'undefined') { + // 加密数据 + if (encryptRequest) { + console.log(hashWithSM3AndSalt(requestObj.data)); + config.data = encryptWithSM4(requestObj.data+"|"+hashWithSM3AndSalt(requestObj.data)) + } + } const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小 const limitSize = 5 * 1024 * 1024; // 限制存放数据5M if (requestSize >= limitSize) { @@ -73,6 +94,10 @@ service.interceptors.request.use(config => { // 响应拦截器 service.interceptors.response.use(res => { + // console.log('🚀 ~ 响应-res:', res) + if (res.headers.encryptresponse && !res.data.hasOwnProperty('code')) { + res.data = JSON.parse(decryptWithSM4(res.data)) + } // 未设置状态码则默认成功状态 const code = res.data.code || 200; // 获取错误信息 diff --git a/sgzb-ui/src/utils/sm.js b/sgzb-ui/src/utils/sm.js new file mode 100644 index 00000000..3189ebd8 --- /dev/null +++ b/sgzb-ui/src/utils/sm.js @@ -0,0 +1,70 @@ +// src/utils/encryption.js +import { sm2, sm3, sm4 } from 'sm-crypto' +import SM4 from 'sm-crypto/src/sm4' + +// 配置项,例如盐值、SM2 公私钥、SM4 密钥 +const SM_CONFIG = { + SALT: '2cc0c5f9f1749f1632efa9f63e902323', // SM3 盐值(16 字节) + SM4_KEY:"78d1295afa99449b99d6f83820e6965c", // SM4 对称加密密钥 + SM4_SALT:"f555adf6c01d0ab0761e626a2dae34a2", + SM2_PUBLIC_KEY: 'your-public-key', // SM2 公钥 + SM2_PRIVATE_KEY: 'your-private-key' // SM2 私钥 +} +// AES 配置 +const AES_CONFIG = { + AES_KEY: 'zhgd@bonus@zhgd@bonus@1234567890', // AES key值 + AES_IV: '1234567812345678' // AES 偏移量 +} + +export function generateUUID() { + // 使用当前时间戳和随机数生成一个 UUID + return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + const r = Math.random() * 16 | 0; // 生成随机数 + const v = c === 'x' ? r : (r & 0x3 | 0x8); // 根据 UUID 规范生成相应的值 + return v.toString(16); // 转换为十六进制 + }); +} + +// SM3 哈希 +export function hashSM3(text) { + // 对数据进行哈希计算 + return sm3(text) +} + +// 使用 SM3 进行哈希并加入盐值 +export function hashWithSM3AndSalt(text) { + // 将文本和盐值拼接在一起 + const textWithSalt = SM_CONFIG.SALT + text + // 使用 SM3 进行哈希 + return hashSM3(textWithSalt) +} + +// SM2 加密 +export function encryptWithSM2(text) { + // SM2 公钥加密 + return sm2.doEncrypt(text, SM_CONFIG.SM2_PUBLIC_KEY) +} + +// SM2 解密 +export function decryptWithSM2(encryptedText) { + // SM2 私钥解密 + return sm2.doDecrypt(encryptedText, SM_CONFIG.SM2_PRIVATE_KEY) +} +/** + * 加密函数 + * @param {string} plainText + * @returns {string} 加密后的密文(Hex 编码格式) + */ +export function encryptWithSM4(plainText) { + return sm4.encrypt(plainText, SM_CONFIG.SM4_KEY,{ mode: 'cbc', padding: 'pkcs#5',iv:SM_CONFIG.SM4_SALT}); +} + +/** + * 解密函数 + * @param {string} cipherText + * @returns {string} 解密后的明文 + */ +export function decryptWithSM4(cipherText){ + return SM4.decrypt(cipherText, SM_CONFIG.SM4_KEY,{ mode: 'cbc', padding: 'pkcs#5' ,iv:SM_CONFIG.SM4_SALT}); +} + diff --git a/sgzb-ui/src/views/newLogin.vue b/sgzb-ui/src/views/newLogin.vue index 3d703bb3..37c54ff6 100644 --- a/sgzb-ui/src/views/newLogin.vue +++ b/sgzb-ui/src/views/newLogin.vue @@ -520,6 +520,7 @@ export default { this.$store .dispatch('Login', this.loginForm) .then(async () => { + this.loading = false localStorage.setItem('notice', true) const username = this.loginForm.username.trim() diff --git a/sgzb-ui/src/views/warehouseManage/warehousing/newTools/index.vue b/sgzb-ui/src/views/warehouseManage/warehousing/newTools/index.vue index c0d65d0b..e9e8e893 100644 --- a/sgzb-ui/src/views/warehouseManage/warehousing/newTools/index.vue +++ b/sgzb-ui/src/views/warehouseManage/warehousing/newTools/index.vue @@ -924,7 +924,7 @@ export default { }, handleExportDialog() { this.download( - 'material/purchaseAccessory/exportWareHousingEntry', + 'material/purchaseMacode/exportWareHousingEntry', { taskId: this.query.taskId, }, From eb6eb41daed43ddc765284379fa1cb4971a4ae9a Mon Sep 17 00:00:00 2001 From: mashuai Date: Wed, 23 Apr 2025 16:14:25 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E9=9C=80=E6=B1=82=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=8F=8A=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/utils/http/HttpRequestHelper.java | 340 ++++++++++++++++++ .../common/core/utils/poi/PoiOutPage.java | 119 ++++++ .../sgzb/common/core/utils/sms/SmsConfig.java | 16 + .../sgzb/common/core/utils/sms/SmsUtils.java | 53 +++ .../sgzb/app/controller/TmTaskController.java | 6 +- .../app/service/impl/TmTaskServiceImpl.java | 222 ++++-------- .../resources/mapper/app/TmTaskMapper.xml | 12 +- .../PurchaseMacodeInfoController.java | 13 +- .../service/IPurchaseMacodeInfoService.java | 8 + .../impl/PurchaseMacodeInfoServiceImpl.java | 95 +++++ .../system/controller/SysSmsController.java | 9 +- .../sgzb/system/service/ISysSmsService.java | 2 +- .../service/impl/SysSmsServiceImpl.java | 30 +- 13 files changed, 747 insertions(+), 178 deletions(-) create mode 100644 sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/http/HttpRequestHelper.java create mode 100644 sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/sms/SmsConfig.java create mode 100644 sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/sms/SmsUtils.java diff --git a/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/http/HttpRequestHelper.java b/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/http/HttpRequestHelper.java new file mode 100644 index 00000000..a5dbf972 --- /dev/null +++ b/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/http/HttpRequestHelper.java @@ -0,0 +1,340 @@ +package com.bonus.sgzb.common.core.utils.http; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.util.Map; +import java.util.StringJoiner; + +/** + * @Author ma_sh + * @create 2025/4/22 16:30 + */ +public class HttpRequestHelper { + + // 连接超时设置:5秒 + private static final int CONNECT_TIMEOUT = 5000; + // 读取超时设置:5秒 + private static final int READ_TIMEOUT = 5000; + + /** + * 发送HTTP请求的通用方法 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param method 请求方法 (GET, POST, PUT, DELETE, PATCH) + * @param body 请求体(适用于POST、PUT、PATCH) + * @param headers 请求头 + * @return String 响应内容 + */ + private static String sendRequest(String baseUrl, String endpoint, String method, String body, Map headers) { + HttpURLConnection connection = null; + try { + // 创建URL对象并打开连接 + URL url = new URL(baseUrl + endpoint); + connection = (HttpURLConnection) url.openConnection(); + + // 设置请求方法 + connection.setRequestMethod(method); + + // 设置连接超时和读取超时时间 + connection.setConnectTimeout(CONNECT_TIMEOUT); + connection.setReadTimeout(READ_TIMEOUT); + + // 设置请求头 + if (headers != null) { + for (Map.Entry entry : headers.entrySet()) { + connection.setRequestProperty(entry.getKey(), entry.getValue()); + } + } + + // 如果请求体不为空,且方法是POST、PUT或PATCH,则写入请求体 + if (body != null && !body.isEmpty() && (method.equals("POST") || method.equals("PUT") || method.equals("PATCH"))) { + connection.setDoOutput(true); + try (OutputStream os = connection.getOutputStream()) { + os.write(body.getBytes()); + os.flush(); + } + } + + // 连接服务器并检查响应代码 + int responseCode = connection.getResponseCode(); + if (responseCode != HttpURLConnection.HTTP_OK) { + throw new RuntimeException("Request failed with response code: " + responseCode); + } + + // 获取输入流并读取响应内容 + StringBuilder response = new StringBuilder(); + try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + String inputLine; + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + } + + return response.toString(); + + } catch (Exception e) { + e.printStackTrace(); + return null; + + } finally { + if (connection != null) { + connection.disconnect(); + } + } + } + + /** + * 将表单数据转换为application/x-www-form-urlencoded格式的方法 + * + * @param formData 表单数据 + * @return String 表单数据的URL编码格式 + */ + private static String getFormBody(Map formData) { + try { + StringJoiner sj = new StringJoiner("&"); + for (Map.Entry entry : formData.entrySet()) { + sj.add(URLEncoder.encode(entry.getKey(), "UTF-8") + "=" + URLEncoder.encode(entry.getValue(), "UTF-8")); + } + return sj.toString(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 发送GET请求 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param headers 请求头 + * @return String 响应内容 + */ + public static String get(String baseUrl, String endpoint, Map headers) { + return sendRequest(baseUrl, endpoint, "GET", null, headers); + } + + /** + * 发送POST请求 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param body 请求体 + * @param headers 请求头 + * @return String 响应内容 + */ + public static String post(String baseUrl, String endpoint, String body, Map headers) { + return sendRequest(baseUrl, endpoint, "POST", body, headers); + } + + /** + * 发送POST表单请求 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param formData 表单数据 + * @param headers 请求头 + * @return String 响应内容 + */ + public static String postForm(String baseUrl, String endpoint, Map formData, Map headers) { + headers.put("Content-Type", "application/x-www-form-urlencoded"); + String formBody = getFormBody(formData); + return sendRequest(baseUrl, endpoint, "POST", formBody, headers); + } + + /** + * 发送POST JSON请求 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param jsonBody JSON格式的请求体 + * @param headers 请求头 + * @return String 响应内容 + */ + public static String postJson(String baseUrl, String endpoint, String jsonBody, Map headers) { + headers.put("Content-Type", "application/json"); + return sendRequest(baseUrl, endpoint, "POST", jsonBody, headers); + } + + /** + * 发送POST XML请求 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param xmlBody XML格式的请求体 + * @param headers 请求头 + * @return String 响应内容 + */ + public static String postXml(String baseUrl, String endpoint, String xmlBody, Map headers) { + headers.put("Content-Type", "application/xml"); + return sendRequest(baseUrl, endpoint, "POST", xmlBody, headers); + } + + /** + * 发送POST原始数据请求 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param rawBody 原始请求体 + * @param headers 请求头 + * @return String 响应内容 + */ + public static String postRaw(String baseUrl, String endpoint, String rawBody, Map headers) { + return sendRequest(baseUrl, endpoint, "POST", rawBody, headers); + } + + /** + * 发送PUT请求 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param body 请求体 + * @param headers 请求头 + * @return String 响应内容 + */ + public static String put(String baseUrl, String endpoint, String body, Map headers) { + return sendRequest(baseUrl, endpoint, "PUT", body, headers); + } + + /** + * 发送PUT表单请求 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param formData 表单数据 + * @param headers 请求头 + * @return String 响应内容 + */ + public static String putForm(String baseUrl, String endpoint, Map formData, Map headers) { + headers.put("Content-Type", "application/x-www-form-urlencoded"); + String formBody = getFormBody(formData); + return sendRequest(baseUrl, endpoint, "PUT", formBody, headers); + } + + /** + * 发送PUT JSON请求 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param jsonBody JSON格式的请求体 + * @param headers 请求头 + * @return String 响应内容 + */ + public static String putJson(String baseUrl, String endpoint, String jsonBody, Map headers) { + headers.put("Content-Type", "application/json"); + return sendRequest(baseUrl, endpoint, "PUT", jsonBody, headers); + } + + /** + * 发送PUT XML请求 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param xmlBody XML格式的请求体 + * @param headers 请求头 + * @return String 响应内容 + */ + public static String putXml(String baseUrl, String endpoint, String xmlBody, Map headers) { + headers.put("Content-Type", "application/xml"); + return sendRequest(baseUrl, endpoint, "PUT", xmlBody, headers); + } + + /** + * 发送PUT原始数据请求 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param rawBody 原始请求体 + * @param headers 请求头 + * @return String 响应内容 + */ + public static String putRaw(String baseUrl, String endpoint, String rawBody, Map headers) { + return sendRequest(baseUrl, endpoint, "PUT", rawBody, headers); + } + + /** + * 发送DELETE请求 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param headers 请求头 + * @return String 响应内容 + */ + public static String delete(String baseUrl, String endpoint, Map headers) { + return sendRequest(baseUrl, endpoint, "DELETE", null, headers); + } + + /** + * 发送PATCH请求 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param body 请求体 + * @param headers 请求头 + * @return String 响应内容 + */ + public static String patch(String baseUrl, String endpoint, String body, Map headers) { + return sendRequest(baseUrl, endpoint, "PATCH", body, headers); + } + + /** + * 发送PATCH表单请求 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param formData 表单数据 + * @param headers 请求头 + * @return String 响应内容 + */ + public static String patchForm(String baseUrl, String endpoint, Map formData, Map headers) { + headers.put("Content-Type", "application/x-www-form-urlencoded"); + String formBody = getFormBody(formData); + return sendRequest(baseUrl, endpoint, "PATCH", formBody, headers); + } + + /** + * 发送PATCH JSON请求 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param jsonBody JSON格式的请求体 + * @param headers 请求头 + * @return String 响应内容 + */ + public static String patchJson(String baseUrl, String endpoint, String jsonBody, Map headers) { + headers.put("Content-Type", "application/json"); + return sendRequest(baseUrl, endpoint, "PATCH", jsonBody, headers); + } + + /** + * 发送PATCH XML请求 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param xmlBody XML格式的请求体 + * @param headers 请求头 + * @return String 响应内容 + */ + public static String patchXml(String baseUrl, String endpoint, String xmlBody, Map headers) { + headers.put("Content-Type", "application/xml"); + return sendRequest(baseUrl, endpoint, "PATCH", xmlBody, headers); + } + + /** + * 发送PATCH原始数据请求 + * + * @param baseUrl 基URL + * @param endpoint 请求的端点 + * @param rawBody 原始请求体 + * @param headers 请求头 + * @return String 响应内容 + */ + public static String patchRaw(String baseUrl, String endpoint, String rawBody, Map headers) { + return sendRequest(baseUrl, endpoint, "PATCH", rawBody, headers); + } +} diff --git a/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/poi/PoiOutPage.java b/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/poi/PoiOutPage.java index cf834de8..d7fc9d8d 100644 --- a/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/poi/PoiOutPage.java +++ b/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/poi/PoiOutPage.java @@ -844,6 +844,125 @@ public class PoiOutPage { RegionUtil.setBorderRight(BorderStyle.THIN, cellRange8, sheet); + return rowNum; + } + + /** + * 创建入库单 + * @param result + * @param list + * @param fileName + * @return + */ + public static HSSFWorkbook excelForCheckInput(List> result, List list, String fileName) { + // 创建工作簿和工作表 + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFSheet sheet = workbook.createSheet(); + sheet.setDefaultColumnWidth(16); // 设置列宽 + + // 创建样式 + HSSFCellStyle titleStyle = createTitleStyle(workbook); + HSSFCellStyle headerStyle = createHeaderStyle(workbook); + HSSFCellStyle contentStyle = createCellStyleCost(workbook); + + // 设置工作簿名称 + workbook.setSheetName(0, fileName); + + // 填充标题行 + int rowNum = 0; + rowNum = createTitleRow(sheet, rowNum, fileName, titleStyle, list.size()); + rowNum = createProjectInfoRowInput(sheet, rowNum, titleStyle, list.size()); + + // 填充表头 + rowNum = createHeaderRow(sheet, rowNum, list, headerStyle); + + // 填充数据行 + if (result != null && !result.isEmpty()) { + rowNum = createDataRows(sheet, rowNum, result, contentStyle, list.size()); + } else { + // 如果没有数据,则仅显示表头 +// rowNum++; +// rowNum = createDataRows(sheet, rowNum, result, contentStyle, list.size()); + HSSFRow row = sheet.createRow(rowNum++); + HSSFCell cell = row.createCell(0); + cell.setCellStyle(headerStyle); + cell.setCellValue("暂无数据"); + sheet.addMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, (short) (list.size() - 1))); + CellRangeAddress cellRange = new CellRangeAddress(rowNum - 1, rowNum - 1, 0, (short) (list.size() - 1)); + // 设置边框样式 + RegionUtil.setBorderTop(BorderStyle.THIN, cellRange, sheet); + RegionUtil.setBorderBottom(BorderStyle.THIN, cellRange, sheet); + RegionUtil.setBorderLeft(BorderStyle.THIN, cellRange, sheet); + RegionUtil.setBorderRight(BorderStyle.THIN, cellRange, sheet); + } + rowNum = createTotalRowInput(sheet, rowNum, list, headerStyle); + return workbook; + } + + /** + * 创建入库单 + * @param sheet + * @param rowNum + * @param list + * @param headerStyle + * @return + */ + private static int createTotalRowInput(HSSFSheet sheet, int rowNum, List list, HSSFCellStyle headerStyle) { + HSSFRow row = sheet.createRow(rowNum++); + row.setHeightInPoints(30); + sheet.addMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, (short) (list.size() - 1))); + HSSFCell cell = row.createCell(0); + cell.setCellStyle(headerStyle); + cell.setCellValue("审核: " + " 库管员: " + " 经办人: "); + + // 添加边框 + CellRangeAddress cellRange = new CellRangeAddress(rowNum - 1, rowNum - 1, 0, (short) (list.size() - 1)); + // 设置边框样式 + RegionUtil.setBorderTop(BorderStyle.THIN, cellRange, sheet); + RegionUtil.setBorderBottom(BorderStyle.THIN, cellRange, sheet); + RegionUtil.setBorderLeft(BorderStyle.THIN, cellRange, sheet); + RegionUtil.setBorderRight(BorderStyle.THIN, cellRange, sheet); + + return rowNum; + } + + /** + * 创建入库单 + * @param sheet + * @param rowNum + * @param titleStyle + * @param nColumn + * @return + */ + private static int createProjectInfoRowInput(HSSFSheet sheet, int rowNum, HSSFCellStyle titleStyle, int nColumn) { + // 第一行:领料单位 + HSSFRow row1 = sheet.createRow(rowNum++); + row1.setHeightInPoints(30); + // bug修复:修改合并单元格区域,确保包含两个或以上单元格 + //sheet.addMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, 1)); + HSSFCell cell1 = row1.createCell(0); + cell1.setCellStyle(titleStyle); + cell1.setCellValue("日期:"); + + /*sheet.addMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 2, (short) (nColumn - 1))); + HSSFCell cell2 = row1.createCell(2); + cell2.setCellStyle(titleStyle); + cell2.setCellValue(unit);*/ + + /*// 添加边框 + CellRangeAddress cellRange1 = new CellRangeAddress(rowNum - 3, rowNum - 3, 0, 1); + CellRangeAddress cellRange2 = new CellRangeAddress(rowNum - 3, rowNum - 3, 2, (short) (nColumn - 1)); + // 设置边框样式 + RegionUtil.setBorderTop(BorderStyle.THIN, cellRange1, sheet); + RegionUtil.setBorderBottom(BorderStyle.THIN, cellRange1, sheet); + RegionUtil.setBorderLeft(BorderStyle.THIN, cellRange1, sheet); + RegionUtil.setBorderRight(BorderStyle.THIN, cellRange1, sheet); + RegionUtil.setBorderTop(BorderStyle.THIN, cellRange2, sheet); + RegionUtil.setBorderBottom(BorderStyle.THIN, cellRange2, sheet); + RegionUtil.setBorderLeft(BorderStyle.THIN, cellRange2, sheet); + RegionUtil.setBorderRight(BorderStyle.THIN, cellRange2, sheet);*/ + + return rowNum; } } diff --git a/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/sms/SmsConfig.java b/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/sms/SmsConfig.java new file mode 100644 index 00000000..5ce02a75 --- /dev/null +++ b/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/sms/SmsConfig.java @@ -0,0 +1,16 @@ +package com.bonus.sgzb.common.core.utils.sms; + +public class SmsConfig { + + public static final String DOMAIN = "http://api.ktsms.cn/"; + + public static final String DDT_KEY = "bonusyn"; + + public static final String SECRET_KEY = "IU0ypHbH"; + + public static final String SMS_SIGNATURE = "【博诺思】"; + + public static final String SMS_TOKEN = "sms_token"; + + +} diff --git a/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/sms/SmsUtils.java b/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/sms/SmsUtils.java new file mode 100644 index 00000000..e3d9280a --- /dev/null +++ b/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/sms/SmsUtils.java @@ -0,0 +1,53 @@ +package com.bonus.sgzb.common.core.utils.sms; + +import com.alibaba.fastjson2.JSON; +import com.bonus.sgzb.common.core.utils.http.HttpRequestHelper; + +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; + +/** + * @Author ma_sh + * @create 2025/4/22 16:27 + */ +public class SmsUtils { + + /** + * 发送短信验证码 + * + * @param mobile 发信发送的目的号码.多个号码之间用半角逗号隔开 + * @param content 短信的内容,内容需要UTF-8编码 + * @param sendTime 为空表示立即发送,定时发送格式:20101024090810 + * @return 是否发送成功 + */ + public static String smsToken(String mobile, String content, String sendTime) { + Map headers = new HashMap<>(); + Map mapJson = new HashMap<>(6); + mapJson.put("ddtkey", SmsConfig.DDT_KEY); + mapJson.put("secretkey", SmsConfig.SECRET_KEY); + mapJson.put("mobile", mobile); + mapJson.put("content", SmsConfig.SMS_SIGNATURE + content); + mapJson.put("sendTime", sendTime); + mapJson.put("extno", ""); + + // 将mapJson转换为URL查询参数格式 + StringBuilder urlBuilder = new StringBuilder(SmsConfig.SMS_TOKEN + "?"); + for (Map.Entry entry : mapJson.entrySet()) { + try { + String encodedKey = URLEncoder.encode(entry.getKey(), "UTF-8"); + String encodedValue = URLEncoder.encode(entry.getValue().toString(), "UTF-8"); + urlBuilder.append(encodedKey).append("=").append(encodedValue).append("&"); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + // 移除最后一个&符号 + urlBuilder.setLength(urlBuilder.length() - 1); + String urlWithParams = urlBuilder.toString(); + + String json = JSON.toJSONString(mapJson); + return HttpRequestHelper.postJson(SmsConfig.DOMAIN, urlWithParams, json, headers); + } +} diff --git a/sgzb-modules/sgzb-base/src/main/java/com/bonus/sgzb/app/controller/TmTaskController.java b/sgzb-modules/sgzb-base/src/main/java/com/bonus/sgzb/app/controller/TmTaskController.java index 0687138e..4c52ef6c 100644 --- a/sgzb-modules/sgzb-base/src/main/java/com/bonus/sgzb/app/controller/TmTaskController.java +++ b/sgzb-modules/sgzb-base/src/main/java/com/bonus/sgzb/app/controller/TmTaskController.java @@ -434,11 +434,9 @@ public class TmTaskController extends BaseController { leaseAuditList = tmTaskService.getLeaseAuditManageList(task); return AjaxResult.success(leaseAuditList); } -// startPage(); + startPage(); leaseAuditList = tmTaskService.getLeaseAuditManageList(task); - Integer pageIndex = Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1); - Integer pageSize = Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10); - return AjaxResult.success(ListPagingUtil.paging(pageIndex, pageSize, leaseAuditList)); + return AjaxResult.success(getDataTable(leaseAuditList)); } /** diff --git a/sgzb-modules/sgzb-base/src/main/java/com/bonus/sgzb/app/service/impl/TmTaskServiceImpl.java b/sgzb-modules/sgzb-base/src/main/java/com/bonus/sgzb/app/service/impl/TmTaskServiceImpl.java index fc3b9c5c..d499bca8 100644 --- a/sgzb-modules/sgzb-base/src/main/java/com/bonus/sgzb/app/service/impl/TmTaskServiceImpl.java +++ b/sgzb-modules/sgzb-base/src/main/java/com/bonus/sgzb/app/service/impl/TmTaskServiceImpl.java @@ -893,157 +893,87 @@ public class TmTaskServiceImpl implements TmTaskService { List tmTaskList = tmTaskMapper.getAuditManageListByLeaseTmTask(record); for (TmTask tmTask : tmTaskList) { - int count = 0; - if (tmTask != null) { - // 去查询任务分单表 - List collect = tmTaskMapper.getAuditManageListByLeaseInfo(tmTask); - if (collect.size() > 0) { - int deptId1 = tmTaskMapper.getDeptId(collect.get(0).getCreateBy()); - if (roles.contains("admin") || deptId == 100) { - // 对领料任务集合查询具体详情 - for (LeaseApplyInfo leaseApplyInfo : collect) { - if (leaseApplyInfo != null) { - // 去查询领料任务详情表 - List leaseApplyDetails = tmTaskMapper.getLeaseApplyManageDetails(leaseApplyInfo); - if (leaseApplyDetails.size() > 0) { - for (LeaseApplyDetails leaseApplyDetail : leaseApplyDetails) { - if (leaseApplyDetail != null && leaseApplyDetail.getPreNum() != null) { - // 统计预领数量 - count += leaseApplyDetail.getPreNum(); - } - } - // 塞入领料任务详情的集合中 - leaseApplyInfo.setLeaseApplyDetails(leaseApplyDetails); - // 存入领料任务实体集合 - tmTask.setLeaseApplyInfoList(collect); - tmTask.setDeptId(Long.parseLong(String.valueOf(deptId1))); - tmTask.setRemark(collect.get(0).getRemark()); - } - } - } - } else if (deptId == 101) { //机具经理、书记、副经理查看数据 - List auditListByLeaseInfo = collect.stream().filter(t -> t.getCompanyId() != null).filter(t -> t.getCompanyId() == 101).collect(Collectors.toList()); - if (deptId1 == 101) { - List applyInfoList = collect.stream().filter(t -> t.getCompanyId() != null).filter(t -> t.getCompanyId() == 102).collect(Collectors.toList()); - auditListByLeaseInfo.addAll(applyInfoList); - } - - if (auditListByLeaseInfo != null && !auditListByLeaseInfo.isEmpty()) { - // 对领料任务集合查询具体详情 - for (LeaseApplyInfo leaseApplyInfo : auditListByLeaseInfo) { - if (leaseApplyInfo != null) { - // 去查询领料任务详情表 - List leaseApplyDetails = tmTaskMapper.getLeaseApplyManageDetails(leaseApplyInfo); - if (leaseApplyDetails.size() > 0) { - for (LeaseApplyDetails leaseApplyDetail : leaseApplyDetails) { - if (leaseApplyDetail != null && leaseApplyDetail.getPreNum() != null) { - // 统计预领数量 - count += leaseApplyDetail.getPreNum(); - } - } - // 塞入领料任务详情的集合中 - leaseApplyInfo.setLeaseApplyDetails(leaseApplyDetails); - // 存入领料任务实体集合 - tmTask.setLeaseApplyInfoList(auditListByLeaseInfo); - tmTask.setDeptId(Long.parseLong(String.valueOf(deptId1))); - tmTask.setRemark(collect.get(0).getRemark()); - } - } - } - } - } else if (deptId == 102) { // 调试公司可以看到的数据权限 - List auditListByLeaseInfo = collect.stream().filter(t -> t.getCompanyId() != null).filter(t -> t.getCompanyId() == 102).collect(Collectors.toList()); - if (deptId1 == 102) { - List list2 = collect.stream().filter(t -> t.getCompanyId() != null).filter(t -> t.getCompanyId() == 101).collect(Collectors.toList()); - auditListByLeaseInfo.addAll(list2); - } - - if (auditListByLeaseInfo != null && !auditListByLeaseInfo.isEmpty()) { - // 对领料任务集合查询具体详情 - for (LeaseApplyInfo leaseApplyInfo : auditListByLeaseInfo) { - if (leaseApplyInfo != null) { - // 去查询领料任务详情表 - List leaseApplyDetails = tmTaskMapper.getLeaseApplyManageDetails(leaseApplyInfo); - if (leaseApplyDetails.size() > 0) { - for (LeaseApplyDetails leaseApplyDetail : leaseApplyDetails) { - if (leaseApplyDetail != null && leaseApplyDetail.getPreNum() != null) { - // 统计预领数量 - count += leaseApplyDetail.getPreNum(); - } - } - // 塞入领料任务详情的集合中 - leaseApplyInfo.setLeaseApplyDetails(leaseApplyDetails); - // 存入领料任务实体集合 - tmTask.setLeaseApplyInfoList(auditListByLeaseInfo); - tmTask.setDeptId(Long.parseLong(String.valueOf(deptId1))); - tmTask.setRemark(collect.get(0).getRemark()); - } - } - } - } - } else if (deptId == deptId1) { //其他各分公司可以看到的自己部门的数据 - // 对领料任务集合查询具体详情 - for (LeaseApplyInfo leaseApplyInfo : collect) { - if (leaseApplyInfo != null) { - // 去查询领料任务详情表 - List leaseApplyDetails = tmTaskMapper.getLeaseApplyManageDetails(leaseApplyInfo); - if (leaseApplyDetails.size() > 0) { - for (LeaseApplyDetails leaseApplyDetail : leaseApplyDetails) { - if (leaseApplyDetail != null && leaseApplyDetail.getPreNum() != null) { - // 统计预领数量 - count += leaseApplyDetail.getPreNum(); - } - } - // 塞入领料任务详情的集合中 - leaseApplyInfo.setLeaseApplyDetails(leaseApplyDetails); - // 存入领料任务实体集合 - tmTask.setLeaseApplyInfoList(collect); - tmTask.setDeptId(Long.parseLong(String.valueOf(deptId1))); - tmTask.setRemark(collect.get(0).getRemark()); - } - } - } - } else if (roles.contains("sgb")) { - // 对领料任务集合查询具体详情 - List auditListByLeaseInfo = collect.stream().filter(t -> t.getCompanyId() != null).filter(t -> t.getCompanyId() == 101).collect(Collectors.toList()); - if (deptId1 == 210) { - List list1 = collect.stream().filter(t -> t.getCompanyId() != null).filter(t -> t.getCompanyId() == 102).collect(Collectors.toList()); - auditListByLeaseInfo.addAll(list1); - } - if (auditListByLeaseInfo != null && !auditListByLeaseInfo.isEmpty()) { - // 对领料任务集合查询具体详情 - for (LeaseApplyInfo leaseApplyInfo : auditListByLeaseInfo) { - if (leaseApplyInfo != null) { - // 去查询领料任务详情表 - List leaseApplyDetails = tmTaskMapper.getLeaseApplyManageDetails(leaseApplyInfo); - if (leaseApplyDetails.size() > 0) { - for (LeaseApplyDetails leaseApplyDetail : leaseApplyDetails) { - if (leaseApplyDetail != null && leaseApplyDetail.getPreNum() != null) { - // 统计预领数量 - count += leaseApplyDetail.getPreNum(); - } - } - // 塞入领料任务详情的集合中 - leaseApplyInfo.setLeaseApplyDetails(leaseApplyDetails); - // 存入领料任务实体集合 - tmTask.setLeaseApplyInfoList(auditListByLeaseInfo); - tmTask.setDeptId(Long.parseLong(String.valueOf(deptId1))); - tmTask.setRemark(collect.get(0).getRemark()); - } - } - } - } - } - - } + if (tmTask == null) { + continue; } - tmTask.setPreCountNum(count); + List collect = tmTaskMapper.getAuditManageListByLeaseInfo(tmTask); + if (collect.isEmpty()) { + continue; + } + int deptId1 = tmTaskMapper.getDeptId(collect.get(0).getCreateBy()); + List filteredList = filterLeaseApplyInfoList(roles, deptId, deptId1, collect); + processLeaseApplyInfoList(tmTaskMapper, tmTask, filteredList, deptId1, collect.get(0).getRemark()); } - List tmTasks = tmTaskList.stream().filter(t -> t.getLeaseApplyInfoList() != null).collect(Collectors.toList()); - return tmTasks; + + return tmTaskList; } + + private static List filterLeaseApplyInfoList(Set roles, Long deptId, int deptId1, List collect) { + if (roles.contains("admin") || deptId == 100) { + return collect; + } else if (deptId == 101) { + List auditListByLeaseInfo = collect.stream() + .filter(t -> t.getCompanyId() != null && t.getCompanyId() == 101) + .collect(Collectors.toList()); + if (deptId1 == 101) { + auditListByLeaseInfo.addAll(collect.stream() + .filter(t -> t.getCompanyId() != null && t.getCompanyId() == 102) + .collect(Collectors.toList())); + } + return auditListByLeaseInfo; + } else if (deptId == 102) { + List auditListByLeaseInfo = collect.stream() + .filter(t -> t.getCompanyId() != null && t.getCompanyId() == 102) + .collect(Collectors.toList()); + if (deptId1 == 102) { + auditListByLeaseInfo.addAll(collect.stream() + .filter(t -> t.getCompanyId() != null && t.getCompanyId() == 101) + .collect(Collectors.toList())); + } + return auditListByLeaseInfo; + } else if (deptId == deptId1) { + return collect; + } else if (roles.contains("sgb")) { + List auditListByLeaseInfo = collect.stream() + .filter(t -> t.getCompanyId() != null && t.getCompanyId() == 101) + .collect(Collectors.toList()); + if (deptId1 == 210) { + auditListByLeaseInfo.addAll(collect.stream() + .filter(t -> t.getCompanyId() != null && t.getCompanyId() == 102) + .collect(Collectors.toList())); + } + return auditListByLeaseInfo; + } + return new ArrayList<>(); + } + + private static void processLeaseApplyInfoList(TmTaskMapper tmTaskMapper, TmTask tmTask, List leaseApplyInfoList, int deptId1, String remark) { + if (leaseApplyInfoList.isEmpty()) { + return; + } + int count = 0; + for (LeaseApplyInfo leaseApplyInfo : leaseApplyInfoList) { + if (leaseApplyInfo == null) { + continue; + } + List leaseApplyDetails = tmTaskMapper.getLeaseApplyManageDetails(leaseApplyInfo); + if (!leaseApplyDetails.isEmpty()) { + for (LeaseApplyDetails leaseApplyDetail : leaseApplyDetails) { + if (leaseApplyDetail != null && leaseApplyDetail.getPreNum() != null) { + count += leaseApplyDetail.getPreNum(); + } + } + leaseApplyInfo.setLeaseApplyDetails(leaseApplyDetails); + } + } + tmTask.setLeaseApplyInfoList(leaseApplyInfoList); + tmTask.setDeptId((long) deptId1); + tmTask.setRemark(remark); + tmTask.setPreCountNum(count); + } + /** * 获取审核列表 - App端 */ diff --git a/sgzb-modules/sgzb-base/src/main/resources/mapper/app/TmTaskMapper.xml b/sgzb-modules/sgzb-base/src/main/resources/mapper/app/TmTaskMapper.xml index 8cea69a2..357138e6 100644 --- a/sgzb-modules/sgzb-base/src/main/resources/mapper/app/TmTaskMapper.xml +++ b/sgzb-modules/sgzb-base/src/main/resources/mapper/app/TmTaskMapper.xml @@ -496,14 +496,14 @@ bai.agreement_code as agreementCode, tt.create_time as createTimes, tt.update_time as updateTimes FROM - tm_task tt + lease_apply_info lai + LEFT JOIN tm_task tt ON lai.task_id = tt.task_id LEFT JOIN sys_user su ON tt.create_by = su.user_id LEFT JOIN sys_dept sd ON su.dept_id = sd.dept_id LEFT JOIN tm_task_agreement tta ON tt.task_id = tta.task_id LEFT JOIN bm_agreement_info bai ON bai.agreement_id = tta.agreement_id LEFT JOIN bm_project_lot bpl ON bpl.lot_id = bai.project_id LEFT JOIN bm_unit_info bui ON bui.unit_id = bai.unit_id - LEFT JOIN lease_apply_info lai ON lai.task_id = tt.task_id LEFT JOIN sys_dic d ON d.id = tt.task_status WHERE tt.task_type = '29' and tt.status = '1' @@ -561,14 +561,14 @@ bai.agreement_code as agreementCode, tt.create_time as createTimes, tt.update_time as updateTimes FROM - tm_task tt + lease_apply_info lai + LEFT JOIN tm_task tt ON lai.task_id = tt.task_id LEFT JOIN sys_user su ON tt.create_by = su.user_id LEFT JOIN sys_dept sd ON su.dept_id = sd.dept_id LEFT JOIN tm_task_agreement tta ON tt.task_id = tta.task_id LEFT JOIN bm_agreement_info bai ON bai.agreement_id = tta.agreement_id LEFT JOIN bm_project_lot bpl ON bpl.lot_id = bai.project_id LEFT JOIN bm_unit_info bui ON bui.unit_id = bai.unit_id - LEFT JOIN lease_apply_info lai ON lai.task_id = tt.task_id LEFT JOIN sys_dic d ON d.id = tt.task_status WHERE tt.task_type = '29' and tt.status = '1' @@ -993,14 +993,14 @@ bai.agreement_code as agreementCode, tt.create_time as createTimes, tt.update_time as updateTimes FROM - tm_task tt + lease_apply_info lai + LEFT JOIN tm_task tt ON lai.task_id = tt.task_id LEFT JOIN sys_user su ON tt.create_by = su.user_id LEFT JOIN sys_dept sd ON su.dept_id = sd.dept_id LEFT JOIN tm_task_agreement tta ON tt.task_id = tta.task_id LEFT JOIN bm_agreement_info bai ON bai.agreement_id = tta.agreement_id LEFT JOIN bm_project_lot bpl ON bpl.lot_id = bai.project_id LEFT JOIN bm_unit_info bui ON bui.unit_id = bai.unit_id - LEFT JOIN lease_apply_info lai ON lai.task_id = tt.task_id LEFT JOIN sys_dic d ON d.id = tt.task_status WHERE tt.task_type = '29' and tt.status = '1' diff --git a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/material/controller/PurchaseMacodeInfoController.java b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/material/controller/PurchaseMacodeInfoController.java index 5c6e8199..491fa4bc 100644 --- a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/material/controller/PurchaseMacodeInfoController.java +++ b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/material/controller/PurchaseMacodeInfoController.java @@ -19,7 +19,6 @@ import org.springframework.web.bind.annotation.*; import com.bonus.sgzb.common.core.web.controller.BaseController; import com.bonus.sgzb.common.core.web.domain.AjaxResult; import com.bonus.sgzb.common.core.utils.poi.ExcelUtil; -import com.bonus.sgzb.common.core.web.page.TableDataInfo; import static com.bonus.sgzb.common.core.web.page.TableSupport.PAGE_NUM; import static com.bonus.sgzb.common.core.web.page.TableSupport.PAGE_SIZE; @@ -103,6 +102,18 @@ public class PurchaseMacodeInfoController extends BaseController { return success(purchaseMacodeInfoService.warehousingEntry(purchaseMacodeInfo)); } + /** + * 新购入库单导出 + * @param purchaseMacodeInfo + * @param response + */ + @Log(title = "新购入库单导出", businessType = BusinessType.EXPORT) + @PostMapping("/exportWareHousingEntry") + public void exportInfo(PurchaseMacodeInfo purchaseMacodeInfo, HttpServletResponse response) { + List details = purchaseMacodeInfoService.warehousingEntry(purchaseMacodeInfo); + purchaseMacodeInfoService.exportWareHousingEntry(details, response); + } + /** * 新增新购验收编号管理 */ diff --git a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/material/service/IPurchaseMacodeInfoService.java b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/material/service/IPurchaseMacodeInfoService.java index 219bbb2f..5f03d657 100644 --- a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/material/service/IPurchaseMacodeInfoService.java +++ b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/material/service/IPurchaseMacodeInfoService.java @@ -5,6 +5,7 @@ import com.bonus.sgzb.common.core.web.domain.AjaxResult; import com.bonus.sgzb.material.domain.PurchaseMacodeInfo; import com.bonus.sgzb.base.api.domain.MaInputVO; +import javax.servlet.http.HttpServletResponse; import java.util.List; /** @@ -111,4 +112,11 @@ public interface IPurchaseMacodeInfoService * @return List */ List warehousingEntry(PurchaseMacodeInfo purchaseMacodeInfo); + + /** + * 新购入库单导出 + * @param details + * @param response + */ + void exportWareHousingEntry(List details, HttpServletResponse response); } diff --git a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/material/service/impl/PurchaseMacodeInfoServiceImpl.java b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/material/service/impl/PurchaseMacodeInfoServiceImpl.java index ad54bb02..10f7922f 100644 --- a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/material/service/impl/PurchaseMacodeInfoServiceImpl.java +++ b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/material/service/impl/PurchaseMacodeInfoServiceImpl.java @@ -1,6 +1,8 @@ package com.bonus.sgzb.material.service.impl; +import java.io.OutputStream; import java.math.BigDecimal; +import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -9,6 +11,7 @@ import com.bonus.sgzb.base.api.domain.*; import com.bonus.sgzb.base.api.domain.MachinePart; import com.bonus.sgzb.common.core.utils.StringHelper; import com.bonus.sgzb.common.core.utils.StringUtils; +import com.bonus.sgzb.common.core.utils.poi.PoiOutPage; import com.bonus.sgzb.common.core.web.domain.AjaxResult; import com.bonus.sgzb.common.security.utils.SecurityUtils; import com.bonus.sgzb.material.domain.*; @@ -19,11 +22,13 @@ import com.bonus.sgzb.common.core.utils.DateUtils; import com.bonus.sgzb.material.vo.GlobalContants; import com.bonus.sgzb.base.api.domain.MaInputVO; import lombok.extern.slf4j.Slf4j; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; /** * 新购验收编号管理Service业务层处理 @@ -530,4 +535,94 @@ public class PurchaseMacodeInfoServiceImpl implements IPurchaseMacodeInfoService return purchaseMacodeInfoMapper.warehousingEntry(purchaseMacodeInfo); } + /** + * 导出入库清单 + * @param list + * @param response + */ + @Override + public void exportWareHousingEntry(List list, HttpServletResponse response) { + try { + String fileName = "入库单"; + expOutExcel(response, list, fileName); + } catch (Exception e) { + log.error(e.toString(), e); + } + } + + /** + * 导出excel + * @param response + * @param list + * @param fileName + */ + private void expOutExcel(HttpServletResponse response, List list, String fileName) + throws Exception { + if (list != null) { + List> results = new ArrayList<>(); + int size = list.size(); + for (int i = 0; i < size; i++) { + PurchaseMacodeInfo bean = list.get(i); + bean.setId((long) (i + 1)); + Map maps = outReceiveDetailsBeanToMap(bean); + results.add(maps); + } + List headers = receiveDetailsHeader(); + HSSFWorkbook workbook = PoiOutPage.excelForCheckInput(results, headers, fileName); + OutputStream out = null; + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.addHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xls"); + response.setHeader("Pragma", "No-cache"); + out = response.getOutputStream(); + workbook.write(out); + out.flush(); + out.close(); + }else{ + List> results = new ArrayList<>(); + List headers = receiveDetailsHeader(); + HSSFWorkbook workbook = PoiOutPage.excel(results, headers, fileName); + OutputStream out = null; + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.addHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xls"); + response.setHeader("Pragma", "No-cache"); + out = response.getOutputStream(); + workbook.write(out); + out.flush(); + out.close(); + } + } + + /** + * 入库清单导出 + * @param bean + * @return + */ + private Map outReceiveDetailsBeanToMap(PurchaseMacodeInfo bean) { + Map maps = new LinkedHashMap<>(); + maps.put("id", bean.getId()); + maps.put("typeName", bean.getTypeName()); + maps.put("specificationType", bean.getSpecificationType()); + maps.put("unitName", bean.getUnitName()); + maps.put("checkNum", bean.getCheckNum()); + maps.put("remark", bean.getRemark()); + return maps; + } + + /** + * 入库单头信息 + * @return + */ + private List receiveDetailsHeader() { + List list = new ArrayList<>(); + list.add("序号"); + list.add("类型名称"); + list.add("规格型号"); + list.add("计量单位"); + list.add("数量"); + list.add("备注"); + return list; + } + } diff --git a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/controller/SysSmsController.java b/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/controller/SysSmsController.java index fbf4bb9e..0b3194bb 100644 --- a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/controller/SysSmsController.java +++ b/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/controller/SysSmsController.java @@ -3,14 +3,13 @@ package com.bonus.sgzb.system.controller; import com.bonus.sgzb.common.core.web.controller.BaseController; import com.bonus.sgzb.common.core.web.domain.AjaxResult; import com.bonus.sgzb.system.service.ISysSmsService; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; -import java.util.Date; /** * Description: 短信控制器 @@ -22,6 +21,7 @@ import java.util.Date; @RestController @RequestMapping("/sms") +@Slf4j public class SysSmsController extends BaseController { @Resource @@ -63,11 +63,12 @@ public class SysSmsController extends BaseController { * @return */ @PostMapping("send") - public AjaxResult send(@RequestParam(value = "phone") String phone, @RequestParam(value = "msg",required = false) String msg){ + public Boolean send(@RequestParam(value = "phone") String phone, @RequestParam(value = "msg",required = false) String msg){ try { return smsService.sendSms(phone, msg); } catch (Exception e) { - return error(e.getMessage()); + log.error(e.getMessage()); + return false; } } diff --git a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/service/ISysSmsService.java b/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/service/ISysSmsService.java index 94482777..2c510373 100644 --- a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/service/ISysSmsService.java +++ b/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/service/ISysSmsService.java @@ -19,7 +19,7 @@ public interface ISysSmsService { * @param msg 内容 * @return 结果 */ - AjaxResult sendSms(String phone, String msg); + Boolean sendSms(String phone, String msg); /** * 发送短信 diff --git a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/service/impl/SysSmsServiceImpl.java b/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/service/impl/SysSmsServiceImpl.java index 6c15cbab..e8e3c081 100644 --- a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/service/impl/SysSmsServiceImpl.java +++ b/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/service/impl/SysSmsServiceImpl.java @@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject; import com.bonus.sgzb.common.core.constant.UserConstants; import com.bonus.sgzb.common.core.exception.ServiceException; import com.bonus.sgzb.common.core.utils.GlobalConstants; +import com.bonus.sgzb.common.core.utils.sms.SmsUtils; import com.bonus.sgzb.common.core.web.domain.AjaxResult; import com.bonus.sgzb.common.redis.service.RedisService; import com.bonus.sgzb.system.config.TencentSmsConfig; @@ -63,20 +64,13 @@ public class SysSmsServiceImpl implements ISysSmsService { * @return */ @Override - public AjaxResult sendSms(String phone, String msg) { + public Boolean sendSms(String phone, String msg) { if (phone == null || StringUtils.isEmpty(msg)) { - return AjaxResult.error("手机号码或短信内容不能为空"); + throw new RuntimeException("手机号码或短信内容不能为空"); } if (phone.length() != UserConstants.PHONE_DEFAULT_LENGTH_LOGIN) { - return AjaxResult.error("手机号格式不正确"); + throw new RuntimeException("手机号码或短信内容不能为空"); } - /* try { - String[] args = msg.split(","); - String body = sendMessageNew(phone,tencentSmsConfig.getTemplateId().get(0),args); - return success("发送手机号码:" + phone + ",内容:" + msg + ",返回结果:" + body); - } catch (Exception e) { - return AjaxResult.error("发送失败:" + e.getMessage()); - }*/ return sendMsgByPhone( phone, msg); } @@ -108,23 +102,27 @@ public class SysSmsServiceImpl implements ISysSmsService { * @param phone 手机号码 * @return AjaxResult对象 */ - private AjaxResult sendMsgByPhone(String phone, String msg) { + private Boolean sendMsgByPhone(String phone, String msg) { // 校验手机号码 if (phone == null || phone.length() != UserConstants.PHONE_DEFAULT_LENGTH_LOGIN) { - return AjaxResult.error("手机号码不正确"); + throw new ServiceException("手机号码不正确"); } // 发送短信 try { // String URL = "http://106.ihuyi.common/webservice/sms.php?method=Submit"; String content = URL + "&mobile=" + phone + "&content=【智慧仓储】" + msg + "。"; - String body = HttpRequest.post(content).execute(false).body(); + //String body = HttpRequest.post(content).execute(false).body(); // System.out.println("发送手机号码:" + phone + ",内容:" + msg + ",返回结果:" + body); + String body = SmsUtils.smsToken(phone, msg,""); if (body == null || !body.contains(GlobalConstants.STRING_OK)) { - return AjaxResult.error("发送失败"); + log.error("发送失败:" + body); + throw new ServiceException("发送失败"); } - return success("发送手机号码:" + phone + ",内容:" + msg + ",返回结果:" + body); + log.error("发送手机号码:" + phone + ",内容:" + msg + ",返回结果:" + body); + return true; } catch (Exception e) { - return AjaxResult.error("发送失败:" + e.getMessage()); + log.error("发送失败:" + e.getMessage()); + return false; } } From 3f21a87d7041b9099e15d4d16fade5a932ffe408 Mon Sep 17 00:00:00 2001 From: bb_pan Date: Thu, 24 Apr 2025 09:58:28 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../newPurchase/toolsAcceptance/component/home.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sgzb-ui/src/views/warehouseManage/newPurchase/toolsAcceptance/component/home.vue b/sgzb-ui/src/views/warehouseManage/newPurchase/toolsAcceptance/component/home.vue index 62c4a75c..87150cd9 100644 --- a/sgzb-ui/src/views/warehouseManage/newPurchase/toolsAcceptance/component/home.vue +++ b/sgzb-ui/src/views/warehouseManage/newPurchase/toolsAcceptance/component/home.vue @@ -717,7 +717,7 @@ export default { this.download( 'material/purchaseCheckInfo/export', { - ...this.queryParams, + ...this.queryParams, taskStatus: this.queryParams.taskState }, `新购工机具验收_${new Date().getTime()}.xlsx`, ) From 87b88642e0265a3e854deabecfa80c6a9a5f7d93 Mon Sep 17 00:00:00 2001 From: mashuai Date: Thu, 24 Apr 2025 10:17:53 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/bonus/sgzb/app/service/impl/TmTaskServiceImpl.java | 2 +- .../newPurchase/toolsAcceptance/component/home.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sgzb-modules/sgzb-base/src/main/java/com/bonus/sgzb/app/service/impl/TmTaskServiceImpl.java b/sgzb-modules/sgzb-base/src/main/java/com/bonus/sgzb/app/service/impl/TmTaskServiceImpl.java index d499bca8..1509cc77 100644 --- a/sgzb-modules/sgzb-base/src/main/java/com/bonus/sgzb/app/service/impl/TmTaskServiceImpl.java +++ b/sgzb-modules/sgzb-base/src/main/java/com/bonus/sgzb/app/service/impl/TmTaskServiceImpl.java @@ -753,7 +753,7 @@ public class TmTaskServiceImpl implements TmTaskService { String type = ""; List list = new ArrayList<>(); if (CollUtil.isNotEmpty(leaseAuditList)) { - unitName = leaseAuditList.get(0).getDeptName(); + unitName = leaseAuditList.get(0).getUnitName(); projectName = leaseAuditList.get(0).getProName(); type = leaseAuditList.get(0).getCompanyId() == 101 ? "机具设备" : "调试设备"; list = leaseAuditList.get(0).getLeaseApplyDetails(); diff --git a/sgzb-ui/src/views/warehouseManage/newPurchase/toolsAcceptance/component/home.vue b/sgzb-ui/src/views/warehouseManage/newPurchase/toolsAcceptance/component/home.vue index 87150cd9..76c5e04d 100644 --- a/sgzb-ui/src/views/warehouseManage/newPurchase/toolsAcceptance/component/home.vue +++ b/sgzb-ui/src/views/warehouseManage/newPurchase/toolsAcceptance/component/home.vue @@ -363,7 +363,7 @@ 供应商: From 298a1b771c47bfa8456aa7845d8b18ba2ce08148 Mon Sep 17 00:00:00 2001 From: mashuai Date: Thu, 24 Apr 2025 10:49:09 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/bonus/sgzb/base/api/domain/LeaseOutDetails.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sgzb-api/sgzb-api-system/src/main/java/com/bonus/sgzb/base/api/domain/LeaseOutDetails.java b/sgzb-api/sgzb-api-system/src/main/java/com/bonus/sgzb/base/api/domain/LeaseOutDetails.java index 0f1de29c..189e95ee 100644 --- a/sgzb-api/sgzb-api-system/src/main/java/com/bonus/sgzb/base/api/domain/LeaseOutDetails.java +++ b/sgzb-api/sgzb-api-system/src/main/java/com/bonus/sgzb/base/api/domain/LeaseOutDetails.java @@ -136,11 +136,11 @@ public class LeaseOutDetails implements Serializable { * 创建时间 */ @ApiModelProperty(value = "创建时间") - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; @ApiModelProperty(value = "创建时间") - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private String outTime; /** From 077c3518b4116575d6bc1968a026f81de1c8f1e8 Mon Sep 17 00:00:00 2001 From: bb_pan Date: Thu, 24 Apr 2025 14:02:12 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E5=8A=A0=E5=AF=86=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sgzb-ui/src/App.vue | 5 +++++ sgzb-ui/src/api/login.js | 7 +++++++ sgzb-ui/src/utils/config.js | 11 +++++++++++ sgzb-ui/src/utils/request.js | 19 ++++++++++++++----- 4 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 sgzb-ui/src/utils/config.js diff --git a/sgzb-ui/src/App.vue b/sgzb-ui/src/App.vue index ba8416e6..08a0b283 100644 --- a/sgzb-ui/src/App.vue +++ b/sgzb-ui/src/App.vue @@ -16,6 +16,7 @@ import ThemePicker from '@/components/ThemePicker' import Notice from '@/components/Notice' import { getHomeNoticeApi } from '@/api/system/notice.js' import { getToken } from '@/utils/auth' +import { getConfigApi } from '@/utils/config' export default { name: 'App', @@ -42,6 +43,10 @@ export default { noticeList: [], } }, + created() { + // 获取配置信息 + getConfigApi() + }, updated() { // 判断是否需要获取通知信息 if ( diff --git a/sgzb-ui/src/api/login.js b/sgzb-ui/src/api/login.js index 6fdd2799..173be249 100644 --- a/sgzb-ui/src/api/login.js +++ b/sgzb-ui/src/api/login.js @@ -121,3 +121,10 @@ export function checkPasswordStatusApi(data) { }) } +// 获取系统配置 +export const getConfig = () => { + return request({ + url: '/auth/getConfig', + method: 'get' + }) +} \ No newline at end of file diff --git a/sgzb-ui/src/utils/config.js b/sgzb-ui/src/utils/config.js new file mode 100644 index 00000000..05520025 --- /dev/null +++ b/sgzb-ui/src/utils/config.js @@ -0,0 +1,11 @@ +import { getConfig } from '@/api/login' +export function getConfigApi() { + getConfig() + .then((response) => { + console.log(response) + localStorage.setItem('systemConfig', JSON.stringify(response.data)) + }) + .catch((error) => { + console.error('Failed to fetch config:', error) + }) +} diff --git a/sgzb-ui/src/utils/request.js b/sgzb-ui/src/utils/request.js index 58c6db37..da376cca 100644 --- a/sgzb-ui/src/utils/request.js +++ b/sgzb-ui/src/utils/request.js @@ -8,6 +8,10 @@ import cache from '@/plugins/cache' import { saveAs } from 'file-saver' import { decryptWithSM4, encryptWithSM4, hashWithSM3AndSalt } from '@/utils/sm' +const systemConfig = JSON.parse(localStorage.getItem('systemConfig')) || { + requestConfig: { encryptRequest: false, checkIntegrity: false, encryptResponse: false } +}; + let downloadLoadingInstance; // 是否显示重新登录 export let isRelogin = { show: false }; @@ -27,11 +31,11 @@ service.interceptors.request.use(config => { const checkIntegrity = false const encryptResponse = false //入参加密 - config.headers['encryptRequest'] = encryptRequest ? 'true' : 'false' + config.headers['encryptRequest'] = systemConfig.requestConfig.encryptRequest && encryptRequest ? 'true' : 'false' // 数据完整性校验 - config.headers['checkIntegrity'] = checkIntegrity ? 'true' : 'false' + config.headers['checkIntegrity'] = systemConfig.requestConfig.checkIntegrity && checkIntegrity ? 'true' : 'false' //回参是否加密 - config.headers['encryptResponse'] = encryptResponse ? 'true' : 'false' + config.headers['encryptResponse'] = systemConfig.requestConfig.encryptResponse && encryptResponse ? 'true' : 'false' // console.log('🚀 ~ config:', config) // 是否需要设置 token @@ -58,8 +62,8 @@ service.interceptors.request.use(config => { // console.log('🚀 ~ contentType:', contentType, requestObj.data) if (contentType.includes('application/json') && typeof requestObj.data !== 'undefined') { // 加密数据 - if (encryptRequest) { - console.log(hashWithSM3AndSalt(requestObj.data)); + if (systemConfig.requestConfig.encryptRequest && encryptRequest) { + // console.log(hashWithSM3AndSalt(requestObj.data)); config.data = encryptWithSM4(requestObj.data+"|"+hashWithSM3AndSalt(requestObj.data)) } } @@ -108,6 +112,11 @@ service.interceptors.response.use(res => { } if (code === 401) { if (!isRelogin.show) { + // 判断当前是否已经在登录页面, 在的话阻止继续执行 + if (window.location.href.indexOf('/login') !== -1) { + isRelogin.show = false + return + } isRelogin.show = true; MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { isRelogin.show = false; From 170051e46f9cbaa1ec69f1785bf40f0d166314e1 Mon Sep 17 00:00:00 2001 From: bb_pan Date: Thu, 24 Apr 2025 14:42:03 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E5=8A=A0=E5=AF=86=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sgzb-ui/src/utils/request.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sgzb-ui/src/utils/request.js b/sgzb-ui/src/utils/request.js index da376cca..5a3a2ec2 100644 --- a/sgzb-ui/src/utils/request.js +++ b/sgzb-ui/src/utils/request.js @@ -27,9 +27,9 @@ const service = axios.create({ // request拦截器 service.interceptors.request.use(config => { - const encryptRequest = false - const checkIntegrity = false - const encryptResponse = false + const encryptRequest = true + const checkIntegrity = true + const encryptResponse = true //入参加密 config.headers['encryptRequest'] = systemConfig.requestConfig.encryptRequest && encryptRequest ? 'true' : 'false' // 数据完整性校验 @@ -52,7 +52,7 @@ service.interceptors.request.use(config => { config.params = {}; config.url = url; } - if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) { + if (config.method === 'post' || config.method === 'put') { const requestObj = { url: config.url, data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data, @@ -60,6 +60,7 @@ service.interceptors.request.use(config => { } let contentType = config.headers['Content-Type'] // console.log('🚀 ~ contentType:', contentType, requestObj.data) + console.log('🚀 ~ 要加密:', contentType.includes('application/json'), typeof requestObj.data) if (contentType.includes('application/json') && typeof requestObj.data !== 'undefined') { // 加密数据 if (systemConfig.requestConfig.encryptRequest && encryptRequest) { From 42cd4e2f55f90d9a2d07df69c25b8ab940cc1d9d Mon Sep 17 00:00:00 2001 From: mashuai Date: Thu, 24 Apr 2025 17:22:44 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/service/impl/SysUserServiceImpl.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/service/impl/SysUserServiceImpl.java b/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/service/impl/SysUserServiceImpl.java index 9a63e3b4..ffec4559 100644 --- a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/service/impl/SysUserServiceImpl.java +++ b/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/service/impl/SysUserServiceImpl.java @@ -614,9 +614,7 @@ public class SysUserServiceImpl implements ISysUserService { } // 2. 检查密码字符类型 - if (!isPasswordCharacterValid(decrypt)) { - throw new ServiceException(getCharacterRequirementErrorMessage()); - } + isPasswordCharacterValid(decrypt); // 3. 检查常见弱密码 if (containsWeakPassword(decrypt.toLowerCase())) { @@ -754,7 +752,7 @@ public class SysUserServiceImpl implements ISysUserService { * @param password * @return */ - private boolean isPasswordCharacterValid(String password) { + private void isPasswordCharacterValid(String password) { boolean hasUpperCase = false, hasLowerCase = false, hasDigit = false, hasSpecialChar = false; for (char c : password.toCharArray()) { @@ -773,15 +771,17 @@ public class SysUserServiceImpl implements ISysUserService { } if (systemConfig.getPasswordConfig().isRequireUpperCase() && !hasUpperCase) { - return false; + throw new ServiceException("新密码必须包含大写字母!"); } if (systemConfig.getPasswordConfig().isRequireLowerCase() && !hasLowerCase) { - return false; + throw new ServiceException("新密码必须包含小写字母!"); } if (systemConfig.getPasswordConfig().isRequireDigit() && !hasDigit) { - return false; + throw new ServiceException("新密码必须包含数字!"); + } + if (systemConfig.getPasswordConfig().isRequireSpecialChar() && !hasSpecialChar) { + throw new ServiceException("新密码必须包含特殊字符!"); } - return !(systemConfig.getPasswordConfig().isRequireSpecialChar() && !hasSpecialChar); } /** From 73f057edd758f791751b65a6689f65c6558600a7 Mon Sep 17 00:00:00 2001 From: bb_pan Date: Thu, 24 Apr 2025 17:31:53 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../return/apply/component/addReturn.vue | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/sgzb-ui/src/views/claimAndreturn/return/apply/component/addReturn.vue b/sgzb-ui/src/views/claimAndreturn/return/apply/component/addReturn.vue index 14d986dd..c2a69582 100644 --- a/sgzb-ui/src/views/claimAndreturn/return/apply/component/addReturn.vue +++ b/sgzb-ui/src/views/claimAndreturn/return/apply/component/addReturn.vue @@ -56,7 +56,7 @@ @change="selDeviceTypeChange" style="width: 240px" v-model="selDeviceTypeChangeValue" - :disabled="leaseApplyDetails.length > 0" + :disabled="leaseApplyDetails.length > 0 || !queryParams.unitId || !queryParams.proId" placeholder="请选择设备类型" clearable filterable @@ -518,6 +518,7 @@ export default { methods: { // 获取 来往单位 列表数据 async GetUnitData() { + this.selDeviceTypeChangeValue = '' this.leaseApplyDetails.splice(0, this.leaseApplyDetails.length) const params = { id: this.queryParams.proId /* */, @@ -529,6 +530,7 @@ export default { }, // 获取 工程名称 列表数据 async GetProData() { + this.selDeviceTypeChangeValue = '' this.leaseApplyDetails.splice(0, this.leaseApplyDetails.length) const params = { id: this.queryParams.unitId, @@ -544,10 +546,19 @@ export default { agreementId: agreementId, // this.agreementId } - - const res = await getUseTypeTreee(params) - console.log('resgetUseTypeTreee==========', res) - this.deviceTypeTree = res.data + const loading = this.$loading({ + lock: true, + text: '加载中...', + }) + try { + const res = await getUseTypeTreee(params) + // console.log('resgetUseTypeTreee==========', res) + this.deviceTypeTree = res.data + loading.close() + } catch (error) { + console.log('🚀 ~ GetDeviceTypeTreeFn ~ error:', error) + loading.close() + } }, // 获取 协议id async GetAgreementInfoById() { From ed5d08f1b15daf0420e0771375e2b90ecb779a67 Mon Sep 17 00:00:00 2001 From: bb_pan Date: Thu, 24 Apr 2025 18:03:53 +0800 Subject: [PATCH 10/10] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sgzb-ui/src/api/stquery/deviceStatusRecord.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sgzb-ui/src/api/stquery/deviceStatusRecord.js b/sgzb-ui/src/api/stquery/deviceStatusRecord.js index 16339ec2..a69c0b68 100644 --- a/sgzb-ui/src/api/stquery/deviceStatusRecord.js +++ b/sgzb-ui/src/api/stquery/deviceStatusRecord.js @@ -42,7 +42,7 @@ export function getTypeKeeper(params = {}){ return request({ url: '/base/maWarehouseKeeper/getMaUserList', method: 'get', - data: params + params: params }) }