package com.ltkj.tduck.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ltkj.common.utils.SecurityUtils; import com.ltkj.tduck.constant.CommonConstants; import com.ltkj.tduck.domain.UserFormDataEntity; import com.ltkj.tduck.domain.UserFormEntity; import com.ltkj.tduck.domain.UserFormSettingEntity; import com.ltkj.tduck.enums.FormStatusEnum; import com.ltkj.tduck.mapper.UserFormSettingMapper; import com.ltkj.tduck.service.UserFormDataService; import com.ltkj.tduck.service.UserFormService; import com.ltkj.tduck.service.UserFormSettingService; import com.ltkj.tduck.struct.FormSettingSchemaStruct; import com.ltkj.tduck.utils.Result; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalTime; import java.util.List; import java.util.Map; import java.util.Objects; /** * 表单表单项(UserFormSetting)表服务实现类 * * @author smalljop * @since 2020-11-30 14:00:53 */ @Service @RequiredArgsConstructor public class UserFormSettingServiceImpl extends ServiceImpl implements UserFormSettingService { private final UserFormService userFormService; private final UserFormDataService userFormDataService; @Override public Boolean saveFormSetting(Map params) { String formKey = params.get("formKey").toString(); UserFormSettingEntity entity = this.getOne(Wrappers.lambdaQuery().eq(UserFormSettingEntity::getFormKey, formKey)); if (ObjectUtil.isNull(entity)) { UserFormSettingEntity setting = new UserFormSettingEntity(); setting.setFormKey(formKey); setting.setSettings(params); return this.save(setting); } Map settings = entity.getSettings(); settings.putAll(params); entity.setSettings(settings); return this.updateById(entity); } @Override public UserFormSettingEntity getFormSettingByKey(String formKey) { return this.getOne(Wrappers.lambdaQuery().eq(UserFormSettingEntity::getFormKey, formKey)); } @Override public FormSettingSchemaStruct getFormSettingSchema(String formKey) { UserFormSettingEntity settingEntity = getFormSettingByKey(formKey); if (ObjectUtil.isNull(settingEntity)) { return null; } return BeanUtil.toBean(settingEntity.getSettings(), FormSettingSchemaStruct.class); } @Override public Result getUserFormWriteSettingStatus(String formKey, String requestIp, String wxOpenId, Integer type) { UserFormEntity userFormEntity = userFormService.getByKey(formKey); boolean checkPublish = Objects.equals(type, CommonConstants.ConstantNumber.ONE) && (ObjectUtil.isNull(userFormEntity) || userFormEntity.getStatus() != 2); // 非公开填写 不校验发布状态 if (checkPublish) { return Result.success(null, "表单暂时无法填写"); } UserFormSettingEntity settingEntity = getFormSettingByKey(formKey); if (ObjectUtil.isNull(settingEntity)) { return Result.success(true); } FormSettingSchemaStruct settingSchemaStruct = BeanUtil.toBean(settingEntity.getSettings(), FormSettingSchemaStruct.class); // 填写时间限制 boolean writeInterviewTime = isWriteInterviewTime(settingSchemaStruct); if (!writeInterviewTime) { return Result.success(null, StrUtil.blankToDefault(settingSchemaStruct.getWriteInterviewTimeText(), "不在答题时间范围内,有问题请与表单发布者联系")); } // 每个微信答题次数限制 if (settingSchemaStruct.isWxWriteCountLimitStatus()) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery().eq(UserFormDataEntity::getFormKey, formKey).eq(UserFormDataEntity::getWxOpenId, wxOpenId); String rangeTypeSql = FormSettingSchemaStruct.DateRangeType.getDateSql(settingSchemaStruct.getWxWriteCountLimitDateType()); wrapper.apply(StrUtil.isNotBlank(rangeTypeSql), rangeTypeSql); long writeCount = userFormDataService.count(wrapper); if (writeCount >= settingSchemaStruct.getWxWriteCountLimit()) { return Result.success(null, StrUtil.blankToDefault(settingSchemaStruct.getWxWriteCountLimitText(), "该微信已经提交过数据,不可重复提交,有问题请与表单发布者联系")); } } // 每个IP答题次数限制 if (settingSchemaStruct.isIpWriteCountLimitStatus()) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery().eq(UserFormDataEntity::getFormKey, formKey).eq(UserFormDataEntity::getSubmitRequestIp, requestIp); String rangeTypeSql = FormSettingSchemaStruct.DateRangeType.getDateSql(settingSchemaStruct.getIpWriteCountLimitDateType()); wrapper.apply(StrUtil.isNotBlank(rangeTypeSql), rangeTypeSql); long writeCount = userFormDataService.count(wrapper); if (writeCount >= settingSchemaStruct.getIpWriteCountLimit()) { return Result.success(null, StrUtil.blankToDefault(settingSchemaStruct.getIpWriteCountLimitText(), "该IP已经提交过数据,不可重复提交,有问题请与表单发布者联系")); } } // 总答题次数限制 if (settingSchemaStruct.isTotalWriteCountLimitStatus()) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery().eq(UserFormDataEntity::getFormKey, formKey); String rangeTypeSql = FormSettingSchemaStruct.DateRangeType.getDateSql(settingSchemaStruct.getTotalWriteCountLimitDateType()); wrapper.apply(StrUtil.isNotBlank(rangeTypeSql), rangeTypeSql); long writeCount = userFormDataService.count(wrapper); if (writeCount >= settingSchemaStruct.getTotalWriteCountLimit()) { return Result.success(null, StrUtil.blankToDefault(settingSchemaStruct.getTotalWriteCountLimitText(), "该表单收集数据已经达到上限,有问题请与表单发布者联系")); } } // 每个账号答题次数限制 if (settingSchemaStruct.isAccountWriteCountLimitStatus()) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery().eq(UserFormDataEntity::getFormKey, formKey) .eq(UserFormDataEntity::getCreateBy, SecurityUtils.getUserId()); String rangeTypeSql = FormSettingSchemaStruct.DateRangeType.getDateSql(settingSchemaStruct.getAccountWriteCountLimitDateType()); wrapper.apply(StrUtil.isNotBlank(rangeTypeSql), rangeTypeSql); long writeCount = userFormDataService.count(wrapper); if (writeCount >= settingSchemaStruct.getAccountWriteCountLimit()) { return Result.success(null, StrUtil.blankToDefault(settingSchemaStruct.getAccountWriteCountLimitText(), "该账号已经提交过数据,不可重复提交,有问题请与表单发布者联系")); } } return Result.success(true); } /** * 是否在设置的答题时间内 * * @return true 在答题时间内 */ private boolean isWriteInterviewTime(FormSettingSchemaStruct settingSchemaStruct) { // 答题时间限制 if (settingSchemaStruct.isWriteInterviewTimeStatus()) { // 是否每天时间范围限制 if (settingSchemaStruct.isWriteInterviewDayTimeStatus()) { // 是否在允许访问的天内 List writeInterviewDateRange = settingSchemaStruct.getWriteInterviewDateRange(); if (CollUtil.isEmpty(writeInterviewDateRange) || DateUtil.isIn(DateUtil.date(), DateUtil.parse(writeInterviewDateRange.get(0)), DateUtil.parse(writeInterviewDateRange.get(1)))) { // 是否在允许访问的小时内 List writeInterviewTimeRange = settingSchemaStruct.getWriteInterviewTimeRange(); LocalTime now = LocalTime.now(); boolean isRange = CollUtil.isNotEmpty(writeInterviewDateRange) && now.isBefore(LocalTime.parse(writeInterviewTimeRange.get(0))) || now.isAfter(LocalTime.parse(writeInterviewTimeRange.get(1))); if (isRange) { return false; } } else { return false; } } else { // 是否在允许访问的天内 List writeInterviewDateTimeRange = settingSchemaStruct.getWriteInterviewDateTimeRange(); if (CollUtil.isNotEmpty(writeInterviewDateTimeRange) && !DateUtil.isIn(DateUtil.date(), DateUtil.parse(writeInterviewDateTimeRange.get(0)), DateUtil.parse(writeInterviewDateTimeRange.get(1)))) { return false; } } // 是否是每周允许访问的周几 List writeInterviewTimeWhichDays = settingSchemaStruct.getWriteInterviewTimeWhichDays(); if (CollUtil.isNotEmpty(writeInterviewTimeWhichDays)) { // 获取今天是每周的第几天 int day = DateUtil.dayOfWeek(DateUtil.date()); return writeInterviewTimeWhichDays.contains(String.valueOf(day)); } } return true; } /** * 删除全部的表单数据 * * @param formKey 表单key * @return 删除结果 */ @Override @Transactional(rollbackFor = {Exception.class}) public Boolean deleteAllSetting(String formKey) { this.remove(Wrappers.lambdaQuery().eq(UserFormSettingEntity::getFormKey, formKey)); return true; } }