diff --git a/admin-hanhai-vue/src/views/assessmentCode/AssessmentCodeList.vue b/admin-hanhai-vue/src/views/assessmentCode/AssessmentCodeList.vue
index b35f35d..389e1e7 100644
--- a/admin-hanhai-vue/src/views/assessmentCode/AssessmentCodeList.vue
+++ b/admin-hanhai-vue/src/views/assessmentCode/AssessmentCodeList.vue
@@ -20,7 +20,7 @@
导入
-->
-
+
删除
diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentExamLog/entity/AssessmentExamLog.java b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentExamLog/entity/AssessmentExamLog.java
index 483780a..36af235 100644
--- a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentExamLog/entity/AssessmentExamLog.java
+++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentExamLog/entity/AssessmentExamLog.java
@@ -4,7 +4,10 @@ import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.math.BigDecimal;
+import java.util.List;
+
import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@@ -72,4 +75,8 @@ public class AssessmentExamLog implements Serializable {
@Dict(dictTable = "han_hai_member", dicText = "nick_name", dicCode = "id")
@ApiModelProperty(value = "关联用户")
private java.lang.String userId;
+
+ //附加材料列表
+ @TableField(exist = false)
+ Boolean isPay = false;
}
diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/controller/AssessmentFeedbackController.java b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/controller/AssessmentFeedbackController.java
index affe43b..6a76332 100644
--- a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/controller/AssessmentFeedbackController.java
+++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/controller/AssessmentFeedbackController.java
@@ -39,7 +39,7 @@ import org.jeecg.common.aspect.annotation.AutoLog;
/**
* @Description: 意见反馈表
* @Author: jeecg-boot
- * @Date: 2025-09-19
+ * @Date: 2025-10-27
* @Version: V1.0
*/
@Api(tags="意见反馈表")
diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/entity/AssessmentFeedback.java b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/entity/AssessmentFeedback.java
index a2a4774..dd0ae20 100644
--- a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/entity/AssessmentFeedback.java
+++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/entity/AssessmentFeedback.java
@@ -20,7 +20,7 @@ import lombok.experimental.Accessors;
/**
* @Description: 意见反馈表
* @Author: jeecg-boot
- * @Date: 2025-09-19
+ * @Date: 2025-10-27
* @Version: V1.0
*/
@Data
@@ -59,6 +59,11 @@ public class AssessmentFeedback implements Serializable {
@Excel(name = "联系电话", width = 15)
@ApiModelProperty(value = "联系电话")
private java.lang.String phone;
+ /**状态*/
+ @Excel(name = "状态", width = 15, dicCode = "status_feedback")
+ @Dict(dicCode = "status_feedback")
+ @ApiModelProperty(value = "状态")
+ private java.lang.String status;
/**关联用户*/
@Excel(name = "关联用户", width = 15, dictTable = "han_hai_member", dicText = "nick_name", dicCode = "id")
@Dict(dictTable = "han_hai_member", dicText = "nick_name", dicCode = "id")
diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/mapper/AssessmentFeedbackMapper.java b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/mapper/AssessmentFeedbackMapper.java
index 7378c35..183f044 100644
--- a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/mapper/AssessmentFeedbackMapper.java
+++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/mapper/AssessmentFeedbackMapper.java
@@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 意见反馈表
* @Author: jeecg-boot
- * @Date: 2025-09-19
+ * @Date: 2025-10-27
* @Version: V1.0
*/
public interface AssessmentFeedbackMapper extends BaseMapper {
diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/service/IAssessmentFeedbackService.java b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/service/IAssessmentFeedbackService.java
index 0581b3c..5ec4775 100644
--- a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/service/IAssessmentFeedbackService.java
+++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/service/IAssessmentFeedbackService.java
@@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: 意见反馈表
* @Author: jeecg-boot
- * @Date: 2025-09-19
+ * @Date: 2025-10-27
* @Version: V1.0
*/
public interface IAssessmentFeedbackService extends IService {
diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/service/impl/AssessmentFeedbackServiceImpl.java b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/service/impl/AssessmentFeedbackServiceImpl.java
index 1db91fb..0cec785 100644
--- a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/service/impl/AssessmentFeedbackServiceImpl.java
+++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/service/impl/AssessmentFeedbackServiceImpl.java
@@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 意见反馈表
* @Author: jeecg-boot
- * @Date: 2025-09-19
+ * @Date: 2025-10-27
* @Version: V1.0
*/
@Service
diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/vue/AssessmentFeedbackList.vue b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/vue/AssessmentFeedbackList.vue
index 5d9b1d7..ddf1030 100644
--- a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/vue/AssessmentFeedbackList.vue
+++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/vue/AssessmentFeedbackList.vue
@@ -4,6 +4,26 @@
@@ -138,6 +158,11 @@
align:"center",
dataIndex: 'phone'
},
+ {
+ title:'状态',
+ align:"center",
+ dataIndex: 'status_dictText'
+ },
{
title:'关联用户',
align:"center",
@@ -180,6 +205,7 @@
fieldList.push({type:'Text',value:'content',text:'反馈内容',dictCode:''})
fieldList.push({type:'Text',value:'image',text:'图片',dictCode:''})
fieldList.push({type:'string',value:'phone',text:'联系电话',dictCode:''})
+ fieldList.push({type:'string',value:'status',text:'状态',dictCode:'status_feedback'})
fieldList.push({type:'sel_search',value:'userId',text:'关联用户',dictTable:"han_hai_member", dictText:'nick_name', dictCode:'id'})
this.superFieldList = fieldList
}
diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/vue/modules/AssessmentFeedbackForm.vue b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/vue/modules/AssessmentFeedbackForm.vue
index e2421ce..b1dd644 100644
--- a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/vue/modules/AssessmentFeedbackForm.vue
+++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/vue/modules/AssessmentFeedbackForm.vue
@@ -18,6 +18,11 @@
+
+
+
+
+
diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/vue3/AssessmentFeedback.data.ts b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/vue3/AssessmentFeedback.data.ts
index de14de0..bfee94b 100644
--- a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/vue3/AssessmentFeedback.data.ts
+++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/assessmentFeedback/vue3/AssessmentFeedback.data.ts
@@ -20,6 +20,11 @@ export const columns: BasicColumn[] = [
align:"center",
dataIndex: 'phone'
},
+ {
+ title: '状态',
+ align:"center",
+ dataIndex: 'status_dictText'
+ },
{
title: '关联用户',
align:"center",
@@ -28,6 +33,21 @@ export const columns: BasicColumn[] = [
];
//查询数据
export const searchFormSchema: FormSchema[] = [
+ {
+ label: "联系电话",
+ field: "phone",
+ component: 'Input',
+ colProps: {span: 6},
+ },
+ {
+ label: "关联用户",
+ field: "userId",
+ component: 'JSearchSelect',
+ componentProps:{
+ dict:"han_hai_member,nick_name,id"
+ },
+ colProps: {span: 6},
+ },
];
//表单数据
export const formSchema: FormSchema[] = [
@@ -54,6 +74,14 @@ export const formSchema: FormSchema[] = [
];
},
},
+ {
+ label: '状态',
+ field: 'status',
+ component: 'JDictSelectTag',
+ componentProps:{
+ dictCode:"status_feedback"
+ },
+ },
{
label: '关联用户',
field: 'userId',
diff --git a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/assessmentController/ConfigController.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/assessmentController/ConfigController.java
index 7d26404..fb0583c 100644
--- a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/assessmentController/ConfigController.java
+++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/assessmentController/ConfigController.java
@@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
+import java.awt.image.BufferedImage;
import java.math.BigDecimal;
@Api(tags="系统配置-相关接口")
@@ -62,4 +63,18 @@ public class ConfigController {
return configService.queryCount();
}
+ //图片转base64
+ @ApiOperation(value="其他-图片转base64", notes="其他-图片转base64")
+ @RequestMapping(value = "/imageToBase64", method = {RequestMethod.GET})
+ public Result> imageToBase64(String imagePath){
+ return configService.imageToBase64(imagePath);
+ }
+
+// //base转图片
+// @ApiOperation(value="其他-base64转图片", notes="其他-base64转图片")
+// @RequestMapping(value = "/base64ToImage", method = {RequestMethod.GET})
+// public Result> base64ToImage(String base64, String savePath){
+// return configService.base64ToImage(base64, savePath);
+// }
+
}
diff --git a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/ConfigService.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/ConfigService.java
index d83c231..26f45a3 100644
--- a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/ConfigService.java
+++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/ConfigService.java
@@ -8,6 +8,7 @@ import org.jeecg.modules.assessmentBanner.entity.AssessmentBanner;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
+import java.awt.image.BufferedImage;
import java.math.BigDecimal;
public interface ConfigService {
@@ -27,4 +28,10 @@ public interface ConfigService {
//数量统计接口
public Result> queryCount();
+ //图片转base64
+ public Result> imageToBase64(String image);
+
+ //base64转图片
+ public Result> base64ToImage(String base64, String savePath);
+
}
diff --git a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/impl/ConfigServiceImpl.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/impl/ConfigServiceImpl.java
index a9a5aba..d7f1ac1 100644
--- a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/impl/ConfigServiceImpl.java
+++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/impl/ConfigServiceImpl.java
@@ -21,15 +21,18 @@ import org.jeecg.modules.assessmentReportUser.service.IAssessmentReportUserServi
import org.jeecg.modules.hanHaiMember.entity.HanHaiMember;
import org.jeecg.modules.hanHaiMember.service.IHanHaiMemberService;
import org.springframework.stereotype.Service;
+import sun.misc.BASE64Encoder;
import javax.annotation.Resource;
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
+import java.net.URL;
+import java.net.URLConnection;
import java.security.SecureRandom;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
@Service
@Slf4j
@@ -307,6 +310,122 @@ public class ConfigServiceImpl implements ConfigService {
}
}
+ /******************************************************************************************************************/
+ //图片转base64
+ @Override
+ public Result> imageToBase64(String imgPath) {
+ try {
+ byte[] imageData = readImageData(imgPath);
+ if (imageData != null && imageData.length > 0) {
+ String base64 = Base64.getEncoder().encodeToString(imageData);
+ System.out.println("转换成功: " + imageData.length + " 字节 -> " + base64.length() + " 字符");
+ return Result.OK("base64", base64);
+ }
+ return Result.error("图片转base64失败");
+ } catch (Exception e) {
+ e.printStackTrace();
+ return Result.error("图片转base64失败", e.getMessage());
+ }
+ }
+
+ /**
+ * Base64转图片文件
+ */
+ public Result> base64ToImage(String base64Str, String savePath) {
+ if (base64Str == null || base64Str.isEmpty()) {
+ return Result.error("Base64字符串为空");
+ }
+
+ try (FileOutputStream fos = new FileOutputStream(savePath)) {
+ // 清理Base64字符串
+ String cleanBase64 = cleanBase64String(base64Str);
+
+ // 解码并保存
+ byte[] imageBytes = Base64.getDecoder().decode(cleanBase64);
+ fos.write(imageBytes);
+
+ log.info("图片保存成功: " + savePath + " (" + imageBytes.length + " 字节)");
+ return Result.OK("Base64转图片成功", savePath);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ return Result.OK("Base64转图片失败", e.getMessage());
+ }
+ }
+
+
+ /**
+ * 读取图片数据
+ */
+ private static byte[] readImageData(String imgPath) throws IOException {
+ InputStream inputStream = null;
+ ByteArrayOutputStream outputStream = null;
+
+ try {
+ // 创建输入流
+ if (imgPath.startsWith("http")) {
+ URL url = new URL(imgPath);
+ URLConnection connection = url.openConnection();
+ connection.setConnectTimeout(10000);
+ connection.setReadTimeout(30000);
+ connection.setRequestProperty("User-Agent",
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
+ inputStream = connection.getInputStream();
+ } else {
+ inputStream = new FileInputStream(imgPath);
+ }
+
+ // 读取数据
+ outputStream = new ByteArrayOutputStream();
+ byte[] buffer = new byte[8192];
+ int bytesRead;
+ int totalBytes = 0;
+
+ while ((bytesRead = inputStream.read(buffer)) != -1) {
+ outputStream.write(buffer, 0, bytesRead);
+ totalBytes += bytesRead;
+ }
+
+ System.out.println("图片数据读取完成: " + totalBytes + " 字节");
+ return outputStream.toByteArray();
+
+ } finally {
+ // 关闭流
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ if (outputStream != null) {
+ try {
+ outputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+
+ /**
+ * 清理Base64字符串
+ */
+ private static String cleanBase64String(String base64Str) {
+ String[] prefixes = {
+ "data:image/png;base64,", "data:image/jpeg;base64,",
+ "data:image/jpg;base64,", "data:image/gif;base64,",
+ "data:image/bmp;base64,"
+ };
+
+ for (String prefix : prefixes) {
+ if (base64Str.startsWith(prefix)) {
+ return base64Str.substring(prefix.length());
+ }
+ }
+ return base64Str;
+ }
}
diff --git a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/impl/ExamServiceImpl.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/impl/ExamServiceImpl.java
index fdac994..d318d1d 100644
--- a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/impl/ExamServiceImpl.java
+++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/impl/ExamServiceImpl.java
@@ -294,6 +294,17 @@ public class ExamServiceImpl implements ExamService {
//获取答题列表列表信息
pageList = query.page(page);
+ //已支付但未获取报告的答题列表补充支付标志
+ List payLogList = assessmentPayLogService.lambdaQuery().eq(AssessmentPayLog::getUserId, hanHaiMember.getId()).list();
+ for (AssessmentExamLog record : pageList.getRecords()) {
+ for (AssessmentPayLog assessmentPayLog : payLogList) {
+ if(record.getBatchNo().equals(assessmentPayLog.getBatchNo())){
+ record.setIsPay(true);
+ continue;
+ }
+ }
+ }
+
log.info("答题列表查询结束");
return Result.OK("答题列表", pageList);
}catch (Exception e){
@@ -423,6 +434,27 @@ public class ExamServiceImpl implements ExamService {
assessmentPayLog.setId(payNo);
assessmentPayLog.setUserId(hanHaiMember.getId());
+ //判断支付金额是否小于等于0
+ if(assessmentPayLog.getPayAmount().compareTo(BigDecimal.ZERO) < 1){
+ assessmentPayLog.setPayAmount(BigDecimal.ZERO);
+ assessmentPayLog.setStatus("1");
+ assessmentPayLog.setPayTime(CommonUtils.getCurrentTime());//支付时间
+ //创建订单
+ assessmentPayLogService.save(assessmentPayLog);
+
+ //修改兑换码信息
+ if(StringUtils.isNotEmpty(assessmentPayLog.getCode())){
+ AssessmentCode code = assessmentCodeService.lambdaQuery().eq(AssessmentCode::getCode, assessmentPayLog.getCode()).one();
+ code.setBatchNo(assessmentPayLog.getBatchNo());
+ code.setIsUse("1");
+ code.setUseTime(CommonUtils.getCurrentTime());
+ code.setUserId(assessmentPayLog.getUserId());
+ assessmentCodeService.updateById(code);
+ }
+
+ return Result.OK("免费获取报告", null);
+ }
+
//创建订单
assessmentPayLogService.save(assessmentPayLog);