zjh
2024-05-15 cebb05f8d1ddbf5ac415c5471e17d2d94ea1a6de
ltkj-system/src/main/java/com/ltkj/tduck/service/impl/UserFormSettingServiceImpl.java
@@ -1,194 +1,194 @@
//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<UserFormSettingMapper, UserFormSettingEntity> implements UserFormSettingService {
//    private final UserFormService userFormService;
//    private final UserFormDataService userFormDataService;
//
//    @Override
//    public Boolean saveFormSetting(Map<String, Object> params) {
//        String formKey = params.get("formKey").toString();
//        UserFormSettingEntity entity = this.getOne(Wrappers.<UserFormSettingEntity>lambdaQuery().eq(UserFormSettingEntity::getFormKey, formKey));
//        if (ObjectUtil.isNull(entity)) {
//            UserFormSettingEntity setting = new UserFormSettingEntity();
//            setting.setFormKey(formKey);
//            setting.setSettings(params);
//            return this.save(setting);
//        }
//        Map<String, Object> settings = entity.getSettings();
//        settings.putAll(params);
//        entity.setSettings(settings);
//        return this.updateById(entity);
//    }
//
//
//    @Override
//    public UserFormSettingEntity getFormSettingByKey(String formKey) {
//        return this.getOne(Wrappers.<UserFormSettingEntity>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<Boolean> 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<UserFormDataEntity> wrapper = Wrappers.<UserFormDataEntity>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<UserFormDataEntity> wrapper = Wrappers.<UserFormDataEntity>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<UserFormDataEntity> wrapper = Wrappers.<UserFormDataEntity>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<UserFormDataEntity> wrapper = Wrappers.<UserFormDataEntity>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<String> writeInterviewDateRange = settingSchemaStruct.getWriteInterviewDateRange();
//                if (CollUtil.isEmpty(writeInterviewDateRange) || DateUtil.isIn(DateUtil.date(), DateUtil.parse(writeInterviewDateRange.get(0)), DateUtil.parse(writeInterviewDateRange.get(1)))) {
//                    // 是否在允许访问的小时内
//                    List<String> 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<String> writeInterviewDateTimeRange = settingSchemaStruct.getWriteInterviewDateTimeRange();
//                if (CollUtil.isNotEmpty(writeInterviewDateTimeRange) && !DateUtil.isIn(DateUtil.date(), DateUtil.parse(writeInterviewDateTimeRange.get(0)), DateUtil.parse(writeInterviewDateTimeRange.get(1)))) {
//                    return false;
//                }
//            }
//            // 是否是每周允许访问的周几
//            List<String> 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.<UserFormSettingEntity>lambdaQuery().eq(UserFormSettingEntity::getFormKey, formKey));
//        return true;
//    }
//
//}
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<UserFormSettingMapper, UserFormSettingEntity> implements UserFormSettingService {
    private final UserFormService userFormService;
    private final UserFormDataService userFormDataService;
    @Override
    public Boolean saveFormSetting(Map<String, Object> params) {
        String formKey = params.get("formKey").toString();
        UserFormSettingEntity entity = this.getOne(Wrappers.<UserFormSettingEntity>lambdaQuery().eq(UserFormSettingEntity::getFormKey, formKey));
        if (ObjectUtil.isNull(entity)) {
            UserFormSettingEntity setting = new UserFormSettingEntity();
            setting.setFormKey(formKey);
            setting.setSettings(params);
            return this.save(setting);
        }
        Map<String, Object> settings = entity.getSettings();
        settings.putAll(params);
        entity.setSettings(settings);
        return this.updateById(entity);
    }
    @Override
    public UserFormSettingEntity getFormSettingByKey(String formKey) {
        return this.getOne(Wrappers.<UserFormSettingEntity>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<Boolean> 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<UserFormDataEntity> wrapper = Wrappers.<UserFormDataEntity>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<UserFormDataEntity> wrapper = Wrappers.<UserFormDataEntity>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<UserFormDataEntity> wrapper = Wrappers.<UserFormDataEntity>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<UserFormDataEntity> wrapper = Wrappers.<UserFormDataEntity>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<String> writeInterviewDateRange = settingSchemaStruct.getWriteInterviewDateRange();
                if (CollUtil.isEmpty(writeInterviewDateRange) || DateUtil.isIn(DateUtil.date(), DateUtil.parse(writeInterviewDateRange.get(0)), DateUtil.parse(writeInterviewDateRange.get(1)))) {
                    // 是否在允许访问的小时内
                    List<String> 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<String> writeInterviewDateTimeRange = settingSchemaStruct.getWriteInterviewDateTimeRange();
                if (CollUtil.isNotEmpty(writeInterviewDateTimeRange) && !DateUtil.isIn(DateUtil.date(), DateUtil.parse(writeInterviewDateTimeRange.get(0)), DateUtil.parse(writeInterviewDateTimeRange.get(1)))) {
                    return false;
                }
            }
            // 是否是每周允许访问的周几
            List<String> 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.<UserFormSettingEntity>lambdaQuery().eq(UserFormSettingEntity::getFormKey, formKey));
        return true;
    }
}