Explorar o código

增加版本号校验

liyuan hai 3 días
pai
achega
1c3b4b505b

+ 8 - 0
blade-common/src/main/java/org/springblade/common/enums/FinalMap.java

@@ -19,6 +19,14 @@ public class FinalMap {
 
 	public static final BigDecimal TWO = new BigDecimal(2);
 
+	public static final String VERSION = "version";
+
+	public static final String IS_DELETE = "isDeleted";
+
+	public static final String ID = "id";
+
+	public static final String GET_BY_ID = "getById";
+
 
 	/**
 	 * 存放国标一级汉字不同读音的起始区位码

+ 5 - 0
blade-service-api/gubersail-shop-app-api/src/main/java/com/gubersail/shop/app/api/insurance/entity/ShopAppTireInsuranceRegister.java

@@ -192,4 +192,9 @@ public class ShopAppTireInsuranceRegister implements Serializable {
 	@ApiModelProperty(value = "二维码地址")
 	private String fileUrl;
 
+	/**
+	 * 版本
+	 */
+	private Integer version;
+
 }

+ 23 - 0
blade-service/gubersail-shop-app/src/main/java/com/gubersail/shop/app/annotation/VersionControl.java

@@ -0,0 +1,23 @@
+package com.gubersail.shop.app.annotation;
+
+
+import java.lang.annotation.*;
+
+/**
+ * 版本控制
+ * 返回值必须是 R
+ * @author Rain
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface VersionControl {
+
+
+	/**
+	 * service 地址
+	 * @return 无
+	 */
+	String value() default "";
+
+}

+ 70 - 0
blade-service/gubersail-shop-app/src/main/java/com/gubersail/shop/app/aspectj/VersionControlAspectj.java

@@ -0,0 +1,70 @@
+package com.gubersail.shop.app.aspectj;
+
+import com.alibaba.fastjson.JSONObject;
+import com.gubersail.shop.app.annotation.VersionControl;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springblade.common.enums.CommonEnum;
+import org.springblade.common.enums.FinalMap;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.SpringUtil;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+
+import java.io.Serializable;
+import java.lang.reflect.Method;
+
+/**
+ * @author Rain
+ */
+@Aspect
+@Component
+public class VersionControlAspectj {
+
+
+	@Pointcut("@annotation(com.gubersail.shop.app.annotation.VersionControl)")
+	public void versionControlCut() {
+	}
+
+
+	@Around("versionControlCut()")
+	public R doAround(ProceedingJoinPoint joinPoint) throws Throwable {
+		try {
+			MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+			VersionControl customAnnotation = signature.getMethod().getAnnotation(VersionControl.class);
+			Object obj = joinPoint.getArgs()[0];
+			JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(obj));
+			String id = jsonObject.getString(FinalMap.ID);
+			String sourceVersion = jsonObject.getString(FinalMap.VERSION);
+			has: if (StringUtils.hasText(id) && StringUtils.hasText(sourceVersion)) {
+				Object objBean = SpringUtil.getBean(customAnnotation.value());
+				Method method = objBean.getClass().getDeclaredMethod(FinalMap.GET_BY_ID, Serializable.class);
+				method.setAccessible(true);
+				Object result = method.invoke(objBean, Long.valueOf(id));
+				if (ObjectUtils.isEmpty(result)) {
+					break has;
+				}
+				JSONObject entityData = JSONObject.parseObject(JSONObject.toJSONString(result));
+				if (entityData.containsKey(FinalMap.IS_DELETE)) {
+					if (CommonEnum.ONE.info.equals(entityData.getString(FinalMap.IS_DELETE))) {
+						return R.fail("该单据已被删除,请返回列表页刷新后重试");
+					}
+				}
+				if (!entityData.containsKey(FinalMap.VERSION)) {
+					break has;
+				}
+				if (!sourceVersion.equals(entityData.getString(FinalMap.VERSION))) {
+					return R.fail(601, "数据已被其他用户更新,请等待刷新后重试");
+				}
+			}
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+		return (R) joinPoint.proceed();
+	}
+
+}

+ 3 - 0
blade-service/gubersail-shop-app/src/main/java/com/gubersail/shop/app/insurance/controller/ShopAppTireInsuranceRegisterController.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.gubersail.shop.app.annotation.VersionControl;
 import com.gubersail.shop.app.api.claim.entity.ShopAppClaim;
 import com.gubersail.shop.app.api.insurance.entity.ShopAppTireInsuranceRecord;
 import com.gubersail.shop.app.api.insurance.entity.ShopAppTireInsuranceRegister;
@@ -170,6 +171,7 @@ public class ShopAppTireInsuranceRegisterController extends BladeController {
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入tireInsuranceRegister")
 	@RepeatSubmit
+	@VersionControl("shopAppTireInsuranceRegisterServiceImpl")
 	public R submit(@Valid @RequestBody ShopAppTireInsuranceRegisterVO appTireInsuranceRegister) throws IOException {
 		return tireInsuranceRegisterService.submit(appTireInsuranceRegister);
 	}
@@ -192,6 +194,7 @@ public class ShopAppTireInsuranceRegisterController extends BladeController {
 	 */
 	@PostMapping("/submitTireInsurance")
 	@RepeatSubmit
+	@VersionControl("shopAppTireInsuranceRegisterServiceImpl")
 	public R submitTireInsurance(@Valid @RequestBody ShopAppTireInsuranceRegisterVO appTireInsuranceRegister) {
 		return tireInsuranceRegisterService.submitTireInsurance(appTireInsuranceRegister);
 	}

+ 7 - 6
blade-service/gubersail-shop-app/src/main/java/com/gubersail/shop/app/insurance/mapper/ShopAppTireInsuranceRegisterMapper.xml

@@ -1,9 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--suppress ALL -->
 <mapper namespace="com.gubersail.shop.app.insurance.mapper.ShopAppTireInsuranceRegisterMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="tireInsuranceRegisterResultMap" type="com.gubersail.shop.app.api.insurance.entity.ShopAppTireInsuranceRegister">
+    <resultMap id="tireInsuranceRegisterResultMap"
+               type="com.gubersail.shop.app.api.insurance.entity.ShopAppTireInsuranceRegister">
         <id column="id" property="id"/>
         <result column="insurance_no" property="insuranceNo"/>
         <result column="consumer_name" property="consumerName"/>
@@ -20,15 +22,14 @@
         <result column="is_deleted" property="isDeleted"/>
         <result column="vehicle_number" property="vehicleNumber"/>
         <result column="tire_quantity" property="tireQuantity"/>
-        <result column="vehicle_license_url" property="vehicleLicenseUrl"/>
-        <result column="overall_vehicle_url" property="overallVehicleUrl"/>
-        <result column="tire_dot_url" property="tireDotUrl"/>
-        <result column="tire_pattern_url" property="tirePatternUrl"/>
+        <result column="version" property="version"/>
     </resultMap>
 
 
     <select id="selectTireInsuranceRegisterPage" resultMap="tireInsuranceRegisterResultMap">
-        select * from pjpf_tire_insurance_register where is_deleted = 0
+        select *
+        from pjpf_tire_insurance_register
+        where is_deleted = 0
     </select>
 
 </mapper>

+ 11 - 7
blade-service/gubersail-shop-app/src/main/java/com/gubersail/shop/app/insurance/service/impl/ShopAppTireInsuranceRegisterServiceImpl.java

@@ -37,6 +37,7 @@ import com.gubersail.shop.app.wrapper.ShopAppTireInsuranceWrapper;
 import lombok.AllArgsConstructor;
 import org.springblade.common.enums.NumberEnum;
 import org.springblade.common.utils.QRCodeTest;
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
@@ -155,6 +156,7 @@ public class ShopAppTireInsuranceRegisterServiceImpl extends ServiceImpl<ShopApp
 		if (carOwner == null) {
 			throw new RuntimeException("未查手机号:" + tireInsuranceRegister.getConsumerPhone() + "对应车主用户信息");
 		}
+		tireInsuranceRegister.setVersion(tireInsuranceRegister.getVersion() + 1);
 		//判断是否是第一次保存
 		if (tireInsuranceRegister.getId() == null) {
 			// 获取 流水号
@@ -223,6 +225,7 @@ public class ShopAppTireInsuranceRegisterServiceImpl extends ServiceImpl<ShopApp
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public R submitTireInsurance(ShopAppTireInsuranceRegisterVO appTireInsuranceRegister) {
+		BladeUser nowSubmitUser = AuthUtil.getUser();
 		// 1. 创建轮胎保险注册实体并复制属性
 		ShopAppTireInsuranceRegister tireInsuranceRegister = new ShopAppTireInsuranceRegister();
 		BeanUtil.copyProperties(appTireInsuranceRegister, tireInsuranceRegister);
@@ -248,28 +251,29 @@ public class ShopAppTireInsuranceRegisterServiceImpl extends ServiceImpl<ShopApp
 		}
 		// 2. 设置更新信息
 		// 设置更新人ID
-		tireInsuranceRegister.setUpdateUser(AuthUtil.getUserId());
+		tireInsuranceRegister.setUpdateUser(nowSubmitUser.getUserId());
 		// 设置更新时间
 		tireInsuranceRegister.setUpdateTime(new Date());
 		// 设置状态为1(已提交)
 		tireInsuranceRegister.setStatus(1);
-		tireInsuranceRegister.setSubmitterId(AuthUtil.getUserId());
-		tireInsuranceRegister.setSubmitterName(AuthUtil.getUserName());
+		tireInsuranceRegister.setSubmitterId(nowSubmitUser.getUserId());
+		tireInsuranceRegister.setSubmitterName(nowSubmitUser.getUserName());
 		tireInsuranceRegister.setSubmitterDate(new Date());
+		tireInsuranceRegister.setVersion(tireInsuranceRegister.getVersion() + 1);
 		// 3. 更新轮胎保险注册信息
 		this.updateById(tireInsuranceRegister);
 		if (ObjectUtils.isNotNull(appTireInsuranceRegister.getTireInsuranceFilesList()) &&
 			!appTireInsuranceRegister.getTireInsuranceFilesList().isEmpty()) {
 			for (ShopAppTireInsuranceFiles item : appTireInsuranceRegister.getTireInsuranceFilesList()) {
 				item.setRegisterId(tireInsuranceRegister.getId());
-				item.setTenantId(AuthUtil.getTenantId());
+				item.setTenantId(nowSubmitUser.getTenantId());
 				if (item.getId() == null) {
 					item.setCreateTime(new Date());
-					item.setCreateUser(AuthUtil.getUserId());
-					item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					item.setCreateUser(nowSubmitUser.getUserId());
+					item.setCreateDept(Long.valueOf(nowSubmitUser.getDeptId()));
 				} else {
 					item.setUpdateTime(new Date());
-					item.setUpdateUser(AuthUtil.getUserId());
+					item.setUpdateUser(nowSubmitUser.getUserId());
 				}
 			}
 			tireInsuranceFilesService.saveOrUpdateBatch(appTireInsuranceRegister.getTireInsuranceFilesList());