Просмотр исходного кода

fix 连续抵扣金额不对;企业采购弹窗一次

zoujiajian 2 месяцев назад
Родитель
Сommit
3a6851055f

+ 3 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -134,6 +134,9 @@ public interface Constant {
 	//含生日
 	//含生日
 	String NEW_APPID_NO_COUNTRY_SECRET_DATE = "%s 朋友 %s 工作 %s 父母 %s";
 	String NEW_APPID_NO_COUNTRY_SECRET_DATE = "%s 朋友 %s 工作 %s 父母 %s";
 
 
+    //5.26
+    String APP_ID_SECRET = "朋友%s 工作%s 父母%s 出生日期%s";
+
 	String ACCOUNT_DOUBLE_VERIFY_KEY = "account_double_verify_key";
 	String ACCOUNT_DOUBLE_VERIFY_KEY = "account_double_verify_key";
 
 
 	/**
 	/**

+ 7 - 0
netflix-dao/src/main/java/com/cyksj/mapper/enterprise/EnterprisePurchaseLeadPopupRecordMapper.java

@@ -0,0 +1,7 @@
+package com.cyksj.mapper.enterprise;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.EnterprisePurchaseLeadPopupRecord;
+
+public interface EnterprisePurchaseLeadPopupRecordMapper extends BaseMapper<EnterprisePurchaseLeadPopupRecord> {
+}

+ 7 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CodexDeductRecord.java

@@ -3,6 +3,8 @@ package com.cyksj.model.entity;
 import lombok.Getter;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.Setter;
 
 
+import java.math.BigDecimal;
+
 /**
 /**
  * 项目名: yhlxj11111111
  * 项目名: yhlxj11111111
  * 文件名: CodexDeductRecord
  * 文件名: CodexDeductRecord
@@ -27,4 +29,9 @@ public class CodexDeductRecord extends BaseEntity{
 	private Boolean status;
 	private Boolean status;
 
 
     private Integer extendsDays;
     private Integer extendsDays;
+
+    /**
+     * 抵扣金额
+     */
+    private BigDecimal deductMoney;
 }
 }

+ 23 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/EnterprisePurchaseLeadPopupRecord.java

@@ -0,0 +1,23 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+@Getter
+@Setter
+@Accessors(chain = true)
+@TableName("enterprise_purchase_lead_popup_record")
+public class EnterprisePurchaseLeadPopupRecord extends BaseEntity {
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 弹窗次数
+     */
+    private Integer popupCount;
+}

+ 25 - 0
netflix-dao/src/main/java/com/cyksj/model/views/FormQuestionnaireDataHeadView.java

@@ -0,0 +1,25 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: FormQuestionnaireDataHeadView
+ *创建者: JavaZou
+ *创建时间:2026/5/26 16:20
+ */
+@Getter
+@Setter
+public class FormQuestionnaireDataHeadView {
+
+	private Long fieldsId;
+
+	private String fieldsName;
+
+	private String title;
+
+	private String dataIndex;
+
+	private String key;
+}

+ 26 - 0
netflix-dao/src/main/java/com/cyksj/model/views/FormQuestionnaireDataListView.java

@@ -0,0 +1,26 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+import java.util.Map;
+
+/*
+ *项目名: netflix
+ *文件名: FormQuestionnaireDataListView
+ *创建者: JavaZou
+ *创建时间:2026/5/26 16:00
+ */
+@Getter
+@Setter
+public class FormQuestionnaireDataListView {
+
+	private Integer totalCount;
+
+	private List<FormQuestionnaireDataHeadView> heads;
+
+	private List<FormQuestionnaireDataHeadView> fields;
+
+	private List<Map<String, Object>> rows;
+}

+ 7 - 0
netflix-service/src/main/java/com/cyksj/service/codex/impl/CodexServiceImpl.java

@@ -831,6 +831,10 @@ public class CodexServiceImpl implements CodexService {
 			} else {
 			} else {
 				totalDays += sku.getMonths() * 30;
 				totalDays += sku.getMonths() * 30;
 			}
 			}
+            CodexDeductRecord codexDeductRecord = codexDeductRecordMapper.selectOne(Wrappers.lambdaQuery(CodexDeductRecord.class).eq(CodexDeductRecord::getOrderId, orderDon.getId()).last("limit 1"));
+            if (codexDeductRecord != null) {
+                totalOrderMoney = totalOrderMoney.add(Optional.ofNullable(codexDeductRecord.getDeductMoney()).orElse(BigDecimal.ZERO));
+            }
 			//原订单数
 			//原订单数
 			if (orderDonList.size() == 1) {
 			if (orderDonList.size() == 1) {
 				//此次订单过期时间
 				//此次订单过期时间
@@ -842,6 +846,9 @@ public class CodexServiceImpl implements CodexService {
 				}
 				}
 				//当天购买的按规格原价抵扣
 				//当天购买的按规格原价抵扣
 				if (now.toDateStr().equals(DateUtil.format(relationStartTime, "yyyy-MM-dd")) && (DateUtil.betweenDay(thisOrderExpiryTime, relationExpiryTime, true) == 0)) {
 				if (now.toDateStr().equals(DateUtil.format(relationStartTime, "yyyy-MM-dd")) && (DateUtil.betweenDay(thisOrderExpiryTime, relationExpiryTime, true) == 0)) {
+                    if (codexDeductRecord != null) {
+                        thisOrderMoney = thisOrderMoney.add(Optional.ofNullable(codexDeductRecord.getDeductMoney()).orElse(BigDecimal.ZERO));
+                    }
 					return thisOrderMoney;
 					return thisOrderMoney;
 				}
 				}
 			}
 			}

+ 5 - 0
netflix-service/src/main/java/com/cyksj/service/mange/account/CmsAccountServiceImpl.java

@@ -399,6 +399,11 @@ public class CmsAccountServiceImpl extends ServiceImpl<AccountMapper, Account> i
 										string = builder.append("生日").append(Constant.ONE_EMPTY).append(part[2]).append(Constant.ONE_EMPTY).append(string).toString();
 										string = builder.append("生日").append(Constant.ONE_EMPTY).append(part[2]).append(Constant.ONE_EMPTY).append(string).toString();
 									}
 									}
 									insert.setSecret(string);
 									insert.setSecret(string);
+
+                                    if (sb.length() == 0) {
+                                        String secret = String.format(Constant.APP_ID_SECRET, part[2], part[3], part[4], part[5]);
+                                        insert.setSecret(secret);
+                                    }
 								} else {
 								} else {
 									//密保
 									//密保
 									if (part.length > 5) {
 									if (part.length > 5) {

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -5061,6 +5061,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			codexDeductRecord.setOrderId(orderDon.getId());
 			codexDeductRecord.setOrderId(orderDon.getId());
 			codexDeductRecord.setRelationId(relationId);
 			codexDeductRecord.setRelationId(relationId);
 			codexDeductRecord.setExtendsDays(extendsDays);
 			codexDeductRecord.setExtendsDays(extendsDays);
+            //抵扣金额
+            codexDeductRecord.setDeductMoney(deductMoney);
 			codexDeductRecordMapper.insert(codexDeductRecord);
 			codexDeductRecordMapper.insert(codexDeductRecord);
 			Long orderId = orderDon.getId();
 			Long orderId = orderDon.getId();
 			//使用银河币记录
 			//使用银河币记录

+ 33 - 0
netflix-web/src/main/java/com/cyksj/web/controller/enterprise/EnterprisePurchaseLeadFrontController.java

@@ -1,17 +1,25 @@
 package com.cyksj.web.controller.enterprise;
 package com.cyksj.web.controller.enterprise;
 
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.dto.Result;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.enterprise.EnterprisePurchaseLeadPopupRecordMapper;
+import com.cyksj.model.entity.EnterprisePurchaseLeadPopupRecord;
 import com.cyksj.model.request.EnterprisePurchaseLeadSubmitReq;
 import com.cyksj.model.request.EnterprisePurchaseLeadSubmitReq;
 import com.cyksj.service.enterprise.EnterprisePurchaseLeadService;
 import com.cyksj.service.enterprise.EnterprisePurchaseLeadService;
+import com.cyksj.service.user.UserBindRelationService;
+import com.cyksj.web.util.StpUserUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 
 
 @RestController
 @RestController
 @RequiredArgsConstructor
 @RequiredArgsConstructor
@@ -20,14 +28,39 @@ public class EnterprisePurchaseLeadFrontController {
 
 
     private final EnterprisePurchaseLeadService enterprisePurchaseLeadService;
     private final EnterprisePurchaseLeadService enterprisePurchaseLeadService;
 
 
+    private final EnterprisePurchaseLeadPopupRecordMapper enterprisePurchaseLeadPopupRecordMapper;
+
     private final HttpServletRequest request;
     private final HttpServletRequest request;
 
 
+    private final UserBindRelationService userBindRelationService;
+
     @PostMapping
     @PostMapping
     public Result<Long> submit(@RequestBody @Validated EnterprisePurchaseLeadSubmitReq req) {
     public Result<Long> submit(@RequestBody @Validated EnterprisePurchaseLeadSubmitReq req) {
         Long id = enterprisePurchaseLeadService.submit(req, getClientIp(), request.getHeader("User-Agent"));
         Long id = enterprisePurchaseLeadService.submit(req, getClientIp(), request.getHeader("User-Agent"));
         return GatewayResponse.SUCCESS.newBuilder().toResult(id);
         return GatewayResponse.SUCCESS.newBuilder().toResult(id);
     }
     }
 
 
+    /**
+     * 是否可以展示企业采购弹窗
+     */
+    @GetMapping("/popup/visible")
+    public Result<Boolean> popupVisible() {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+        Integer selectCount = enterprisePurchaseLeadPopupRecordMapper.selectCount(Wrappers.lambdaQuery(EnterprisePurchaseLeadPopupRecord.class)
+                .in(EnterprisePurchaseLeadPopupRecord::getUserId, userIdList));
+        if (selectCount == 0) {
+            EnterprisePurchaseLeadPopupRecord record = new EnterprisePurchaseLeadPopupRecord()
+                    .setUserId(userId)
+                    .setPopupCount(1);
+            try {
+                enterprisePurchaseLeadPopupRecordMapper.insert(record);
+            } catch (DuplicateKeyException e) {
+            }
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult(selectCount == 0);
+    }
+
     private String getClientIp() {
     private String getClientIp() {
         String ip = request.getHeader("X-Forwarded-For");
         String ip = request.getHeader("X-Forwarded-For");
         if (ip != null && !ip.isBlank()) {
         if (ip != null && !ip.isBlank()) {

+ 128 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/form/FormController.java

@@ -1,5 +1,6 @@
 package com.cyksj.web.controller.manage.form;
 package com.cyksj.web.controller.manage.form;
 
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
@@ -16,6 +17,9 @@ import com.cyksj.model.entity.FormFieldsDefault;
 import com.cyksj.model.entity.FormTemplate;
 import com.cyksj.model.entity.FormTemplate;
 import com.cyksj.model.entity.QuestionnairePromotion;
 import com.cyksj.model.entity.QuestionnairePromotion;
 import com.cyksj.model.views.FormFieldsDataView;
 import com.cyksj.model.views.FormFieldsDataView;
+import com.cyksj.model.views.FormQuestionnaireDataHeadView;
+import com.cyksj.model.views.FormQuestionnaireDataListView;
+import com.cyksj.model.views.FormSubmitDataView;
 import com.cyksj.service.mange.form.FormService;
 import com.cyksj.service.mange.form.FormService;
 import com.cyksj.service.mange.form.QuestionnairePromotionService;
 import com.cyksj.service.mange.form.QuestionnairePromotionService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.BeanSearcher;
@@ -27,7 +31,13 @@ import org.springframework.web.bind.annotation.*;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 
 /*
 /*
  *项目名: netflix
  *项目名: netflix
@@ -167,6 +177,109 @@ public class FormController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 	}
 
 
+	/**
+	 * 用户问卷回答横向列表
+	 */
+	@GetMapping("/get/question/resp/data/list")
+	public Result<FormQuestionnaireDataListView> getQuestionRespDataList(Long promotionId, Long startTime, Long endTime,
+																		 @RequestParam(required = false, defaultValue = "1") Integer start,
+																		 @RequestParam(required = false, defaultValue = "10") Integer limit) {
+		DateTime startDate = null;
+		DateTime endDate = null;
+		if (startTime != null) {
+			startDate = DateUtil.date(startTime);
+		}
+		if (endTime != null) {
+			endDate = DateUtil.date(endTime);
+		}
+		QuestionnairePromotion promotion = promotionService.getById(promotionId);
+		if (promotion == null) throw BusinessRuntimeException.getInstance("问卷不存在");
+		List<FormFields> formFields = formFieldsMapper.selectList(Wrappers.lambdaQuery(FormFields.class)
+				.eq(FormFields::getTemplateId, promotion.getTemplateId())
+				.eq(FormFields::getDeleted, true)
+				.eq(FormFields::getShowTable, 1)
+				.orderByAsc(FormFields::getSorted)
+				.orderByAsc(FormFields::getId));
+
+		String timeSql = StrUtil.EMPTY;
+		if (startDate != null) {
+			timeSql += String.format(" and fd.created_time >= '%s'", startDate);
+		}
+		if (endDate != null) {
+			timeSql += String.format(" and fd.created_time < '%s'", endDate);
+		}
+		MapBuilder builder = MapUtils.builder()
+				.field(FormSubmitDataView::getPromotionId, promotionId)
+				.orderBy(FormSubmitDataView::getSorted).asc()
+				.orderBy(FormSubmitDataView::getFieldsId).asc();
+		if (StrUtil.isNotBlank(timeSql)) {
+			builder.put("time_sql", timeSql);
+		}
+		List<FormSubmitDataView> formSubmitDataViews = beanSearcher.searchAll(FormSubmitDataView.class, builder.build());
+
+		FormQuestionnaireDataListView view = new FormQuestionnaireDataListView();
+		List<FormQuestionnaireDataHeadView> heads = formFields.stream().map(field -> {
+			FormQuestionnaireDataHeadView headView = new FormQuestionnaireDataHeadView();
+			headView.setFieldsId(field.getId());
+			headView.setFieldsName(field.getFieldsName());
+			headView.setTitle(field.getFieldsName());
+			headView.setDataIndex(getFieldDataIndex(field.getId()));
+			headView.setKey(getFieldDataIndex(field.getId()));
+			return headView;
+		}).collect(Collectors.toList());
+		heads.add(buildHead("用户id", "userId"));
+		heads.add(buildHead("用户名", "nickname"));
+		heads.add(buildHead("提交时间", "createdTime"));
+		view.setHeads(heads);
+		view.setFields(heads.stream().filter(head -> head.getFieldsId() != null).collect(Collectors.toList()));
+
+		List<Map<String, Object>> rows = new ArrayList<>();
+		Map<Long, List<FormSubmitDataView>> groupMap = formSubmitDataViews.stream()
+				.collect(Collectors.groupingBy(this::getSubmitGroupId, LinkedHashMap::new, Collectors.toList()));
+		List<List<FormSubmitDataView>> answerGroups = new ArrayList<>(groupMap.values());
+		List<List<FormSubmitDataView>> pageGroups = answerGroups.stream()
+				.sorted(Comparator.comparing(this::getSubmitTime, Comparator.nullsFirst(Date::compareTo)).reversed())
+				.skip((long) (Math.max(start, 1) - 1) * Math.max(limit, 1))
+				.limit(Math.max(limit, 1))
+				.collect(Collectors.toList());
+		pageGroups
+				.stream()
+				.forEach(answers -> {
+					Map<Long, List<FormSubmitDataView>> fieldsValueMap = answers.stream()
+							.filter(answer -> answer.getFieldsId() != null)
+							.collect(Collectors.groupingBy(FormSubmitDataView::getFieldsId));
+					Map<String, Object> row = new LinkedHashMap<>();
+					row.put("rowKey", getSubmitGroupId(answers.get(0)));
+					formFields.forEach(fields -> {
+						List<FormSubmitDataView> values = fieldsValueMap.get(fields.getId());
+						row.put(getFieldDataIndex(fields.getId()), CollUtil.isEmpty(values) ? StrUtil.EMPTY : values.get(0).getContent());
+					});
+					FormSubmitDataView submitInfo = answers.get(0);
+					Long userId = submitInfo.getUserId();
+					row.put("userId", userId == null ? "0" : userId.toString());
+					row.put("nickname", StrUtil.blankToDefault(submitInfo.getNickname(), "未知"));
+					Date submitTime = getSubmitTime(answers);
+					row.put("createdTime", submitTime == null ? StrUtil.EMPTY : DateUtil.format(submitTime, "yyyy-MM-dd HH:mm:ss"));
+					rows.add(row);
+				});
+		view.setTotalCount(answerGroups.size());
+		view.setRows(rows);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(view);
+	}
+
+	private FormQuestionnaireDataHeadView buildHead(String title, String dataIndex) {
+		FormQuestionnaireDataHeadView headView = new FormQuestionnaireDataHeadView();
+		headView.setFieldsName(title);
+		headView.setTitle(title);
+		headView.setDataIndex(dataIndex);
+		headView.setKey(dataIndex);
+		return headView;
+	}
+
+	private String getFieldDataIndex(Long fieldsId) {
+		return String.format("field_%s", fieldsId);
+	}
+
 	/**
 	/**
 	 * @param promotionId
 	 * @param promotionId
 	 */
 	 */
@@ -182,4 +295,19 @@ public class FormController {
 		}
 		}
 		formService.exportQuestionInfo(promotionId, startDate, endDate, response);
 		formService.exportQuestionInfo(promotionId, startDate, endDate, response);
 	}
 	}
+
+	private Long getSubmitGroupId(FormSubmitDataView dataView) {
+		if (dataView.getGroupsId() != null) {
+			return dataView.getGroupsId();
+		}
+		return dataView.getId();
+	}
+
+	private Date getSubmitTime(List<FormSubmitDataView> answers) {
+		return answers.stream()
+				.map(FormSubmitDataView::getCreatedTime)
+				.filter(date -> date != null)
+				.max(Date::compareTo)
+				.orElse(null);
+	}
 }
 }