Bläddra i källkod

Merge branch 'feat-20230906-signagreement'

lixuesong 1 år sedan
förälder
incheckning
e95ac34b92

+ 6 - 0
db/v2.0/230906.sql

@@ -0,0 +1,6 @@
+alter table sys_user
+    add sign_agreement varchar(1024) null comment '小程序签署协议信息';
+
+
+alter table sys_user
+    add age_reminder tinyint default 1 null comment '年龄超60周岁提醒';

+ 10 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/SysUser.java

@@ -286,4 +286,14 @@ public class SysUser implements Serializable {
 	@ApiModelProperty(value="税邦云协议签署")
 	private Integer taxHelperAgreementSignature;
 
+	/**
+	 * 小程序签署协议信息
+	 */
+	private String signAgreement;
+
+	/**
+	 * 是否提醒年龄超60周岁
+	 */
+	private Boolean ageReminder;
+
 }

+ 10 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/vo/UserVO.java

@@ -270,4 +270,14 @@ public class UserVO implements Serializable {
 	 */
 	private List<?> certList;
 
+	/**
+	 * 小程序签署协议信息
+	 */
+	private String signAgreement;
+
+	/**
+	 * 是否提醒年龄超60周岁
+	 */
+	private Boolean ageReminder;
+
 }

+ 96 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.copier.CopyOptions;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.lang.Assert;
@@ -12,6 +13,7 @@ import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.IdcardUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -59,6 +61,7 @@ import com.qunzhixinxi.hnqz.admin.entity.WmUserSignDetail;
 import com.qunzhixinxi.hnqz.admin.entity.WmWkAlbum;
 import com.qunzhixinxi.hnqz.admin.entity.WmWkArticle;
 import com.qunzhixinxi.hnqz.admin.entity.WmWkArticleShare;
+import com.qunzhixinxi.hnqz.admin.entity.dto.SignAgreementDTO;
 import com.qunzhixinxi.hnqz.admin.entity.input.NoticeApiInput;
 import com.qunzhixinxi.hnqz.admin.entity.input.WmScorePackageApiInput;
 import com.qunzhixinxi.hnqz.admin.entity.input.WmScorePackageApiOutput;
@@ -137,6 +140,7 @@ import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.http.ResponseEntity;
 import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.client.RestTemplate;
 import org.springframework.web.multipart.MultipartFile;
@@ -880,6 +884,29 @@ public class ApiController {
 				mapOne.put("existEidResult", false);
 			}
 
+			// 签署协议信息
+			mapOne.put("signHonestAgreement", false);
+			if (StrUtil.isNotBlank(sysU.getSignAgreement())) {
+				JSONArray agreements = JSONUtil.parseArray(sysU.getSignAgreement());
+                for (Object agreement : agreements) {
+                    SignAgreementDTO signAgreementDTO = BeanUtil.toBean(agreement, SignAgreementDTO.class);
+                    if (SignAgreementDTO.SignAgreementType.HONEST_AGREEMENT.equals(signAgreementDTO.getAgreementType())) {
+                        // 廉洁协议是否签署
+                        mapOne.put("signHonestAgreement", true);
+                        break;
+                    }
+                }
+			}
+
+			// 超60周岁是否提醒
+			Map<String, String> checkResult = sysUserService.checkSixtyYearsOld(sysU);
+			mapOne.put("ageReminder", Boolean.TRUE.equals(sysU.getAgeReminder()) && CollUtil.isNotEmpty(checkResult));
+			if (CollUtil.isNotEmpty(checkResult)) {
+				mapOne.put("ageReminderInfo", CollUtil.get(checkResult.values(), 0));
+			} else {
+				mapOne.put("ageReminderInfo", null);
+			}
+
 			// 获取发起认证的令牌
 			String randomStr;
 
@@ -2503,6 +2530,12 @@ public class ApiController {
 			return R.failed("全职学术推广员不能领取积分包");
 		}
 
+		// 校验超过60周岁,不能做任务
+		Map<String, String> checkResult = sysUserService.checkSixtyYearsOld(userVO);
+		if (CollUtil.isNotEmpty(checkResult) && checkResult.containsKey("OVER")) {
+			throw new RuntimeException(checkResult.get("OVER"));
+		}
+
 		WmScorePackageStatus wmScorePackageStatus = new WmScorePackageStatus();
 		wmScorePackageStatus.setPackageId(packageId);
 		wmScorePackageStatus.setUserId(userVO.getUserId() + "");
@@ -3788,6 +3821,12 @@ public class ApiController {
 					}
 				}
 
+				// 校验超过60周岁,不能做任务
+				Map<String, String> checkResult = sysUserService.checkSixtyYearsOld(BeanUtil.copyProperties(sysUser, UserVO.class));
+				if (CollUtil.isNotEmpty(checkResult) && checkResult.containsKey("OVER")) {
+					throw new RuntimeException(checkResult.get("OVER"));
+				}
+
 				// 查询任务类型启用状态
 				List<WmTaskSubmissionPercentRule> rules = wmTaskSubmissionPercentRuleService.list(Wrappers.<WmTaskSubmissionPercentRule>lambdaQuery()
 						.eq(WmTaskSubmissionPercentRule::getDeptId, sysUser.getDeptId())
@@ -4597,4 +4636,61 @@ public class ApiController {
 		return R.ok(Collections.emptyList());
 	}
 
+	/**
+	 * 小程序签署协议
+	 *
+	 * @param signAgreementDTO 请求参数
+	 * @return {@link R}<{@link ?}> 结果
+	 */
+	@SysLog("小程序签署协议")
+	@PostMapping("/sign-agreement")
+	public R<Boolean> signAgreement(@Validated @RequestBody SignAgreementDTO signAgreementDTO) {
+		log.info("小程序签署协议请求:{}", signAgreementDTO);
+
+		Integer userId = SecurityUtils.getUser().getId();
+		SysUser queryUser = sysUserService.getById(userId);
+
+		List<Object> signAgreementDTOList = new ArrayList<>();
+		if (StrUtil.isBlank(queryUser.getSignAgreement())) {
+			signAgreementDTOList.add(signAgreementDTO);
+		} else {
+			JSONArray agreements = JSONUtil.parseArray(queryUser.getSignAgreement());
+			signAgreementDTOList.addAll(agreements);
+			// 如果已存在该协议,则不再重复保存
+			boolean anyMatch = agreements.stream()
+					.map(o -> BeanUtil.toBean(o, SignAgreementDTO.class))
+					.anyMatch(dto -> SignAgreementDTO.SignAgreementType.HONEST_AGREEMENT.equals(dto.getAgreementType()));
+			if (anyMatch) {
+				return R.ok();
+			}
+			signAgreementDTOList.add(signAgreementDTO);
+		}
+
+
+		boolean update = sysUserService.update(Wrappers.<SysUser>lambdaUpdate()
+				.eq(SysUser::getIdCardNumber, queryUser.getIdCardNumber())
+				.set(SysUser::getSignAgreement, JSONUtil.toJsonStr(signAgreementDTOList))
+				.set(SysUser::getUpdateTime, LocalDateTime.now()));
+
+		return R.ok(update);
+	}
+
+	/**
+	 * 关闭年满60周岁提醒
+	 *
+	 * @return {@link R}<{@link Boolean}>
+	 */
+	@PostMapping("/stop-sixtyyearsold-reminder")
+	public R<Boolean> stopSixtyYearsOldReminder() {
+		Integer userId = SecurityUtils.getUser().getId();
+		SysUser queryUser = sysUserService.getById(userId);
+		log.info("关闭年满60周岁提醒:userId={},idCardNumber={}", userId, queryUser.getIdCardNumber());
+
+		boolean update = sysUserService.update(Wrappers.<SysUser>lambdaUpdate()
+				.eq(SysUser::getIdCardNumber, queryUser.getIdCardNumber())
+				.set(SysUser::getAgeReminder, Boolean.FALSE)
+				.set(SysUser::getUpdateTime, LocalDateTime.now()));
+
+		return R.ok(update);
+	}
 }

+ 54 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/SignAgreementDTO.java

@@ -0,0 +1,54 @@
+package com.qunzhixinxi.hnqz.admin.entity.dto;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.Getter;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * 签署协议请求
+ *
+ * @author lixuesong
+ * @date 2023/09/06
+ */
+@Data
+public class SignAgreementDTO implements Serializable {
+    private static final long serialVersionUID = -1590830291205177428L;
+
+    /**
+     * 协议类型
+     */
+    @NotNull(message = "协议类型必填")
+    private SignAgreementType agreementType;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 协议类型
+     *
+     * @author lixuesong
+     * @date 2023/09/06
+     */
+    @Getter
+    @AllArgsConstructor
+    public enum SignAgreementType {
+        HONEST_AGREEMENT("HONEST_AGREEMENT", "廉洁协议");
+
+        /**
+         * 类型
+         */
+        @EnumValue
+        private final String type;
+
+        /**
+         * 描述
+         */
+        private final String description;
+    }
+}

+ 8 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserService.java

@@ -154,4 +154,12 @@ public interface SysUserService extends IService<SysUser> {
 	 * @param subjectLocation 税源地
 	 */
 	void checkUserInfoToSettle(Collection<Integer> userIds, SubjectLocation subjectLocation);
+
+	/**
+	 * 校验是否超60周岁
+	 *
+	 * @param userVO 用户vo
+	 * @return 结果
+	 */
+	Map<String, String> checkSixtyYearsOld(UserVO userVO);
 }

+ 38 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserServiceImpl.java

@@ -235,6 +235,44 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
 	}
 
+	/**
+	 * 校验是否超60周岁
+	 *
+	 * @param userVO 用户vo
+	 * @return 结果
+	 */
+	@Override
+	public Map<String, String> checkSixtyYearsOld(UserVO userVO) {
+		Map<String, String> result = new HashMap<>();
+
+		String idCardNumber = userVO.getIdCardNumber();
+		if (IdcardUtil.isValidCard(idCardNumber)) {
+			// 当前日期
+			Calendar nowCal = Calendar.getInstance();
+			// 基于生日的日期,60周岁提前半年的时间
+			Calendar halfYearCal = IdcardUtil.getBirthDate(idCardNumber).toCalendar();
+			halfYearCal.add(Calendar.YEAR, 59);
+			halfYearCal.add(Calendar.MONTH, 6);
+			// 基于生日的日期,60周岁的时间
+			Calendar sixtyYearsOldYearCal = IdcardUtil.getBirthDate(idCardNumber).toCalendar();
+			sixtyYearsOldYearCal.add(Calendar.YEAR, 60);
+
+			if (sixtyYearsOldYearCal.compareTo(nowCal) > 0 && halfYearCal.compareTo(nowCal) <= 0) {
+				// 提前半年提醒,不满60周岁,但距离60周岁在半年内
+				String format = String.format("平台要求人员年龄在年满18岁未满60岁之间,您的账号将于%s年%s月%s日被停用,停用后将无法做任务或者资金结算,请知悉!",
+						sixtyYearsOldYearCal.get(Calendar.YEAR), sixtyYearsOldYearCal.get(Calendar.MONTH) + 1, sixtyYearsOldYearCal.get(Calendar.DAY_OF_MONTH));
+				result.put("HALF_YEAR", format);
+			} else if (sixtyYearsOldYearCal.compareTo(nowCal) <= 0) {
+				// 已超过60周岁
+				String format = String.format("您的账号已于%s年%s月%s日因年龄超限被停用,请知悉",
+						sixtyYearsOldYearCal.get(Calendar.YEAR), sixtyYearsOldYearCal.get(Calendar.MONTH) + 1, sixtyYearsOldYearCal.get(Calendar.DAY_OF_MONTH));
+				result.put("OVER", format);
+			}
+		}
+
+		return result;
+	}
+
 	/**
 	 * 封装错误信息
 	 *

+ 6 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskContentServiceImpl.java

@@ -540,6 +540,12 @@ public class WmTaskContentServiceImpl extends ServiceImpl<WmTaskContentMapper, W
 		HnqzUser user = SecurityUtils.getUser();
 		UserVO sysU = sysUserService.selectUserVoById(user.getId());
 
+		// 校验超过60周岁,不能做任务
+		Map<String, String> checkResult = sysUserService.checkSixtyYearsOld(sysU);
+		if (CollUtil.isNotEmpty(checkResult) && checkResult.containsKey("OVER")) {
+			throw new RuntimeException(checkResult.get("OVER"));
+		}
+
 		List<WmScorePackageStatus> statusList = checkPackageStatus(sysU.getUserId(), tWmScorePackage.getId());
 
 		// 查询任务类型启用状态

+ 6 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmUserSignServiceImpl.java

@@ -108,6 +108,12 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 		}
 		wmUserSign.setTaskTypeId(taskTypeId);
 
+		// 校验超过60周岁,不能做任务
+		Map<String, String> checkResult = sysUserService.checkSixtyYearsOld(sysU);
+		if (CollUtil.isNotEmpty(checkResult) && checkResult.containsKey("OVER")) {
+			throw new RuntimeException(checkResult.get("OVER"));
+		}
+
 		// 查询任务类型启用状态
 		List<WmTaskSubmissionPercentRule> taskTypeRules = wmTaskSubmissionPercentRuleService.list(Wrappers.<WmTaskSubmissionPercentRule>lambdaQuery()
 				.eq(WmTaskSubmissionPercentRule::getDeptId, sysU.getDeptId())

+ 5 - 1
hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/SysUserMapper.xml

@@ -102,6 +102,8 @@
 		<result column="user_type" property="userType"/>
 		<result column="bank_phone" property="bankPhone"/>
 		<result column="bank_card_number" property="bankCardNumber"/>
+		<result column="sign_agreement" property="signAgreement"/>
+		<result column="age_reminder" property="ageReminder"/>
 		<collection property="roleList" ofType="com.qunzhixinxi.hnqz.admin.api.entity.SysRole"
 					select="com.qunzhixinxi.hnqz.admin.mapper.SysRoleMapper.listRolesByUserId" column="user_id">
 		</collection>
@@ -642,7 +644,9 @@
 		u.bank_card_number,
 	  	u.bank_phone,
 	  	u.bank_name,
-		u.tax_helper_agreement_signature
+		u.tax_helper_agreement_signature,
+		u.sign_agreement,
+		u.age_reminder
 		FROM
 		sys_user  u
 		LEFT JOIN sys_dept  d ON d.dept_id = u.dept_id