ソースを参照

Merge remote-tracking branch 'origin/master'

zouxuan 3 年 前
コミット
e9cdd2ad23

+ 98 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ContractTemplateController.java

@@ -0,0 +1,98 @@
+package com.yonge.cooleshow.admin.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.ContractTemplateDto;
+import com.yonge.cooleshow.biz.dal.entity.ContractTemplate;
+import com.yonge.cooleshow.biz.dal.queryInfo.ContractTemplateQueryInfo;
+import com.yonge.cooleshow.biz.dal.service.ContractTemplateService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.page.PageInfo;
+
+@RequestMapping("contractTemplate")
+@Api(tags = "机构协议模板")
+@RestController
+public class ContractTemplateController extends BaseController {
+
+	@Autowired
+	private ContractTemplateService contractTemplateService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+	@ApiOperation("分页查询")
+	@GetMapping(value = "/list")
+	@PreAuthorize("@pcs.hasPermissions('contractTemplate/list')")
+	public HttpResponseResult<PageInfo<ContractTemplateDto>> getList(ContractTemplateQueryInfo queryInfo) {
+		return succeed(contractTemplateService.queryPageList(queryInfo));
+	}
+
+	@ApiOperation("单查询")
+	@ApiImplicitParam(name = "id", value = "ID编号", required = true, dataType = "Integer", paramType = "path")
+	@GetMapping(value = "/query")
+	@PreAuthorize("@pcs.hasPermissions('contractTemplate/query')")
+	public HttpResponseResult<ContractTemplate> query(Integer id) {
+		return succeed(contractTemplateService.get(id));
+	}
+
+	@ApiOperation("查询最新启用的协议模板")
+	@GetMapping(value = "/queryLatestContractTemplate")
+	@PreAuthorize("@pcs.hasPermissions('contractTemplate/queryLatestContractTemplate')")
+	public HttpResponseResult<ContractTemplate> queryLatestContractTemplate() {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+
+		if (sysUser == null || sysUser.getId() == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		return succeed(contractTemplateService.queryLatestContractTemplate(null, null));
+	}
+
+	@ApiOperation("新增")
+	@PostMapping(value = "/add", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+	@PreAuthorize("@pcs.hasPermissions('contractTemplate/add')")
+	public Object add(ContractTemplate contractTemplate) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        
+        if(sysUser == null || sysUser.getId() == null){
+        	return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+		
+		contractTemplate.setStatus(false);
+		contractTemplate.setModifyBy(sysUser.getId());
+		contractTemplateService.createContractTemplate(contractTemplate);
+		return succeed();
+	}
+
+	@ApiOperation("更新")
+	@PostMapping(value = "/update", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+	@PreAuthorize("@pcs.hasPermissions('contractTemplate/update')")
+	public Object update(ContractTemplate tenantContractTemplate) {
+		contractTemplateService.update(tenantContractTemplate);
+		return succeed();
+	}
+
+	@ApiOperation("启用协议")
+	@PostMapping(value = "/updateStatus", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+	@PreAuthorize("@pcs.hasPermissions('contractTemplate/updateStatus')")
+	public Object enableContract(int id) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        
+		contractTemplateService.enableContract(id, sysUser.getId());
+		return succeed();
+	}
+
+}

+ 29 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ContractTemplateDao.java

@@ -0,0 +1,29 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.yonge.cooleshow.biz.dal.dto.ContractTemplateDto;
+import com.yonge.cooleshow.biz.dal.entity.ContractTemplate;
+import com.yonge.cooleshow.common.dal.BaseDAO;
+
+public interface ContractTemplateDao extends BaseDAO<Integer, ContractTemplate> {
+
+	List<ContractTemplateDto> queryPageList(Map<String, Object> params);
+	
+	/**
+	 * 获取最新协议模板
+	 * @param owner
+	 * @param type
+	 * @return
+	 */
+	ContractTemplate queryLatestContractTemplate(@Param("owner") String owner, @Param("type") String type);
+	
+	int disableContract(@Param("owner") String owner, @Param("type") String type);
+	
+	Integer queryMaxVersion();
+
+	
+}

+ 16 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ContractTemplateDto.java

@@ -0,0 +1,16 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import com.yonge.cooleshow.biz.dal.entity.ContractTemplate;
+
+public class ContractTemplateDto extends ContractTemplate {
+
+	private String latestOperator;
+
+	public String getLatestOperator() {
+		return latestOperator;
+	}
+
+	public void setLatestOperator(String latestOperator) {
+		this.latestOperator = latestOperator;
+	}
+}

+ 160 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ContractTemplate.java

@@ -0,0 +1,160 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * 对应数据库表(contract_template):
+ */
+public class ContractTemplate {
+
+	@ApiModelProperty(value = "",required = false)
+	private Integer id;
+	
+	@ApiModelProperty(value = "协议名称",required = false)
+	private String name;
+	
+	@ApiModelProperty(value = "协议类型",required = false)
+	private String type;
+	
+	@ApiModelProperty(value = "协议内容",required = false)
+	private String contractTemplateContent;
+	
+	@ApiModelProperty(value = "原始协议文件url",required = false)
+	private String origanalFileUrl;
+	
+	@ApiModelProperty(value = "协议号",required = false)
+	private String contractNo;
+	
+	@ApiModelProperty(value = "是否启用",required = false)
+	private boolean status;
+	
+	@ApiModelProperty(value = "版本号",required = false)
+	private Integer version;
+	
+	@ApiModelProperty(value = "最后修改人",required = false)
+	private Long modifyBy;
+	
+	@ApiModelProperty(value = "最后修改时间",required = false)
+	private java.util.Date updateTime;
+	
+	@ApiModelProperty(value = "创建时间",required = false)
+	private java.util.Date createTime;
+	
+	@ApiModelProperty(value = "甲方",required = false)
+	private String owner;
+	
+	public ContractTemplate setId(Integer id){
+		this.id = id;
+		return this;
+	}
+	
+	public Integer getId(){
+		return this.id;
+	}
+			
+	public ContractTemplate setName(String name){
+		this.name = name;
+		return this;
+	}
+	
+	public String getName(){
+		return this.name;
+	}
+			
+	public ContractTemplate setType(String type){
+		this.type = type;
+		return this;
+	}
+	
+	public String getType(){
+		return this.type;
+	}
+			
+	public ContractTemplate setContractTemplateContent(String contractTemplateContent){
+		this.contractTemplateContent = contractTemplateContent;
+		return this;
+	}
+	
+	public String getContractTemplateContent(){
+		return this.contractTemplateContent;
+	}
+			
+	public ContractTemplate setOriganalFileUrl(String origanalFileUrl){
+		this.origanalFileUrl = origanalFileUrl;
+		return this;
+	}
+	
+	public String getOriganalFileUrl(){
+		return this.origanalFileUrl;
+	}
+			
+	public ContractTemplate setContractNo(String contractNo){
+		this.contractNo = contractNo;
+		return this;
+	}
+	
+	public String getContractNo(){
+		return this.contractNo;
+	}
+			
+	public ContractTemplate setStatus(boolean status){
+		this.status = status;
+		return this;
+	}
+	
+	public boolean getStatus(){
+		return this.status;
+	}
+			
+	public ContractTemplate setVersion(Integer version){
+		this.version = version;
+		return this;
+	}
+	
+	public Integer getVersion(){
+		return this.version;
+	}
+			
+	public ContractTemplate setModifyBy(Long modifyBy){
+		this.modifyBy = modifyBy;
+		return this;
+	}
+	
+	public Long getModifyBy(){
+		return this.modifyBy;
+	}
+			
+	public ContractTemplate setUpdateTime(java.util.Date updateTime){
+		this.updateTime = updateTime;
+		return this;
+	}
+	
+	public java.util.Date getUpdateTime(){
+		return this.updateTime;
+	}
+			
+	public ContractTemplate setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+		return this;
+	}
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+			
+	public ContractTemplate setOwner(String owner){
+		this.owner = owner;
+		return this;
+	}
+	
+	public String getOwner(){
+		return this.owner;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 17 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/ContractTemplateQueryInfo.java

@@ -0,0 +1,17 @@
+package com.yonge.cooleshow.biz.dal.queryInfo;
+
+import com.yonge.cooleshow.common.page.QueryInfo;
+
+public class ContractTemplateQueryInfo extends QueryInfo {
+
+    private Boolean status;
+
+	public Boolean getStatus() {
+		return status;
+	}
+
+	public void setStatus(Boolean status) {
+		this.status = status;
+	}
+
+}

+ 44 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ContractTemplateService.java

@@ -0,0 +1,44 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.yonge.cooleshow.biz.dal.dto.ContractTemplateDto;
+import com.yonge.cooleshow.biz.dal.entity.ContractTemplate;
+import com.yonge.cooleshow.common.page.PageInfo;
+import com.yonge.cooleshow.common.page.QueryInfo;
+import com.yonge.cooleshow.common.service.BaseService;
+
+public interface ContractTemplateService extends BaseService<Integer, ContractTemplate> {
+	
+	/**
+	 * 分页查询
+	 * @param queryInfo
+	 * @return
+	 */
+	PageInfo<ContractTemplateDto> queryPageList(QueryInfo queryInfo);
+	
+	/**
+	 * 启用协议
+	 * @param id
+	 * @param userId 操作人
+	 * @return
+	 */
+	boolean enableContract(Integer id, Long userId);
+
+	/**
+	 * 更新协议版本
+	 * @return
+	 */
+	boolean updateContractVersion();
+	
+	/**
+	 * 查询最新协议模板
+	 * @param owner
+	 * @param type
+	 * @return
+	 */
+	ContractTemplate queryLatestContractTemplate(String owner, String type);
+	
+	boolean createContractTemplate(ContractTemplate contractTemplate);
+	
+	boolean updateContractTempalte(ContractTemplate contractTemplate);
+
+}

+ 176 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ContractTemplateServiceImpl.java

@@ -0,0 +1,176 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.yonge.cooleshow.biz.dal.dao.ContractTemplateDao;
+import com.yonge.cooleshow.biz.dal.dto.ContractTemplateDto;
+import com.yonge.cooleshow.biz.dal.entity.ContractTemplate;
+import com.yonge.cooleshow.biz.dal.service.ContractTemplateService;
+import com.yonge.cooleshow.common.dal.BaseDAO;
+import com.yonge.cooleshow.common.exception.BizException;
+import com.yonge.cooleshow.common.page.PageInfo;
+import com.yonge.cooleshow.common.page.QueryInfo;
+import com.yonge.cooleshow.common.service.impl.BaseServiceImpl;
+import com.yonge.toolset.utils.collection.MapUtil;
+
+@Service
+public class ContractTemplateServiceImpl extends BaseServiceImpl<Integer, ContractTemplate> implements ContractTemplateService {
+
+	@Autowired
+	private ContractTemplateDao contractTemplateDao;
+
+	@Autowired
+	private RedissonClient redissonClient;
+
+	private final static String LOCK_NAME = "contract_template";
+
+	@Override
+	public BaseDAO<Integer, ContractTemplate> getDAO() {
+		return contractTemplateDao;
+	}
+
+	@Override
+	public PageInfo<ContractTemplateDto> queryPageList(QueryInfo queryInfo) {
+		PageInfo<ContractTemplateDto> pageInfo = new PageInfo<ContractTemplateDto>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<ContractTemplateDto> dataList = null;
+		int count = this.findCount(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = contractTemplateDao.queryPageList(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<ContractTemplateDto>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+
+	@Override
+	@Transactional
+	public boolean enableContract(Integer id, Long userId) {
+		ContractTemplate contractTemplate = contractTemplateDao.get(id);
+
+		if (contractTemplate == null) {
+			throw new BizException("未查询到协议模板");
+		}
+
+		if (contractTemplate.getStatus()) {
+			return true;
+		}
+
+		RLock lock = redissonClient.getLock(LOCK_NAME);
+
+		try {
+			if (lock.tryLock(10, 10, TimeUnit.SECONDS)) {
+
+				Integer maxVersion = contractTemplateDao.queryMaxVersion();
+				int version = maxVersion == null ? 1 : maxVersion + 1;
+
+				contractTemplate.setVersion(version);
+
+				contractTemplateDao.disableContract(contractTemplate.getOwner(), contractTemplate.getType());
+
+				Date date = new Date();
+
+				contractTemplate.setStatus(true);
+				contractTemplate.setUpdateTime(date);
+				contractTemplate.setModifyBy(userId);
+
+				contractTemplateDao.update(contractTemplate);
+
+				return true;
+			}
+		} catch (InterruptedException e) {
+			throw new BizException("锁获取失败:{}", e.getMessage());
+		} finally {
+			lock.unlock();
+		}
+
+		return false;
+	}
+
+	@Override
+	public boolean updateContractVersion() {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public ContractTemplate queryLatestContractTemplate(String owner, String type) {
+		ContractTemplate ContractTemplate = contractTemplateDao.queryLatestContractTemplate(owner, type);
+
+		return ContractTemplate;
+	}
+
+	@Override
+	@Transactional
+	public boolean createContractTemplate(ContractTemplate ContractTemplate) {
+
+		RLock lock = redissonClient.getLock(LOCK_NAME);
+
+		try {
+			if (lock.tryLock(10, 10, TimeUnit.SECONDS)) {
+
+				Integer maxVersion = contractTemplateDao.queryMaxVersion();
+				int version = maxVersion == null ? 1 : maxVersion + 1;
+
+				ContractTemplate.setVersion(version);
+				Date date = new Date();
+				ContractTemplate.setCreateTime(date);
+				ContractTemplate.setUpdateTime(date);
+				insert(ContractTemplate);
+
+				return true;
+			}
+		} catch (InterruptedException e) {
+			throw new BizException("锁获取失败:{}", e.getMessage());
+		} finally {
+			lock.unlock();
+		}
+
+		return false;
+	}
+
+	@Override
+	@Transactional
+	public boolean updateContractTempalte(ContractTemplate ContractTemplate) {
+
+		RLock lock = redissonClient.getLock(LOCK_NAME);
+
+		try {
+			if (lock.tryLock(10, 10, TimeUnit.SECONDS)) {
+				Integer maxVersion = contractTemplateDao.queryMaxVersion();
+				int version = maxVersion == null ? 1 : maxVersion + 1;
+
+				ContractTemplate.setVersion(version);
+				Date date = new Date();
+				ContractTemplate.setUpdateTime(date);
+
+				update(ContractTemplate);
+				return true;
+			}
+		} catch (InterruptedException e) {
+			throw new BizException("锁获取失败:{}", e.getMessage());
+		} finally {
+			lock.unlock();
+		}
+
+		return false;
+	}
+
+}

+ 164 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/ContractTemplateMapper.xml

@@ -0,0 +1,164 @@
+<?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">
+<!-- 这个文件是自动生成的。 不要修改此文件。所有改动将在下次重新自动生成时丢失。 -->
+<mapper namespace="com.yonge.cooleshow.biz.dal.dao.ContractTemplateDao">
+
+	<resultMap type="com.yonge.cooleshow.biz.dal.entity.ContractTemplate"
+		id="BaseResultMap">
+		<result column="id_" property="id" />
+		<result column="name_" property="name" />
+		<result column="type_" property="type" />
+		<result column="contract_template_content_" property="contractTemplateContent" />
+		<result column="origanal_file_url_" property="origanalFileUrl" />
+		<result column="contract_no_" property="contractNo" />
+		<result column="status_" property="status" />
+		<result column="version_" property="version" />
+		<result column="modify_by_" property="modifyBy" />
+		<result column="update_time_" property="updateTime" />
+		<result column="create_time_" property="createTime" />
+		<result column="owner_" property="owner" />
+	</resultMap>
+	
+	<resultMap type="com.yonge.cooleshow.biz.dal.dto.ContractTemplateDto"
+		id="ContractTemplateDto">
+		<result column="latest_operator_" property="latestOperator" />
+	</resultMap>
+
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="BaseResultMap">
+		SELECT * FROM contract_template WHERE id_ = #{id}
+	</select>
+
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="BaseResultMap">
+		SELECT * FROM contract_template ORDER BY id_
+	</select>
+
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.yonge.cooleshow.biz.dal.entity.ContractTemplate"
+		useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO
+		contract_template
+		(id_,name_,type_,contract_template_content_,origanal_file_url_,contract_no_,status_,version_,modify_by_,update_time_,create_time_,owner_)
+		VALUES(#{id},#{name},#{type},#{contractTemplateContent},#{origanalFileUrl},#{contractNo},#{status},#{version},#{modifyBy},#{updateTime},#{createTime},#{owner})
+	</insert>
+
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.yonge.cooleshow.biz.dal.entity.ContractTemplate">
+		UPDATE contract_template
+		<set>
+			<if test="contractTemplateContent != null">
+				contract_template_content_ = #{contractTemplateContent},
+			</if>
+			<if test="status != null">
+				status_ = #{status},
+			</if>
+			<if test="origanalFileUrl != null">
+				origanal_file_url_ = #{origanalFileUrl},
+			</if>
+			<if test="id != null">
+				id_ = #{id},
+			</if>
+			<if test="owner != null">
+				owner_ = #{owner},
+			</if>
+			<if test="updateTime != null">
+				update_time_ = #{updateTime},
+			</if>
+			<if test="version != null">
+				version_ = #{version},
+			</if>
+			<if test="modifyBy != null">
+				modify_by_ = #{modifyBy},
+			</if>
+			<if test="type != null">
+				type_ = #{type},
+			</if>
+			<if test="contractNo != null">
+				contract_no_ = #{contractNo},
+			</if>
+			<if test="name != null">
+				name_ = #{name},
+			</if>
+			<if test="createTime != null">
+				create_time_ = #{createTime},
+			</if>
+		</set>
+		WHERE id_ = #{id}
+	</update>
+
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete">
+		DELETE FROM contract_template WHERE id_ = #{id}
+	</delete>
+
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="BaseResultMap" parameterType="map">
+		SELECT * FROM contract_template ORDER BY id_
+		<include refid="global.limit" />
+	</select>
+
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM contract_template
+	</select>
+
+	<!-- 分页查询 -->
+	<select id="queryPageList" resultMap="ContractTemplateDto"
+		parameterType="map">
+		SELECT tct.*,u.real_name_ latest_operator_ FROM contract_template tct left join sys_user u on tct.modify_by_ = u.id_ 
+		<where>
+			<if test="status != null">
+				and tct.status_ = #{status}
+			</if>
+			<if test="type != null">
+				and tct.type_ = #{type}
+			</if>
+			<if test="owner != null">
+				and tct.owner_ = #{owner}
+			</if>
+		</where>
+		ORDER BY id_
+		<include refid="global.limit" />
+	</select>
+
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(tct.id_) FROM contract_template tct
+		<where>
+			<if test="status != null">
+				and tct.status_ = #{status}
+			</if>
+			<if test="type != null">
+				and tct.type_ = #{type}
+			</if>
+			<if test="owner != null">
+				and tct.owner_ = #{owner}
+			</if>
+		</where>
+	</select>
+	
+	<select id="queryLatestContractTemplate" resultMap="BaseResultMap" parameterType="map">
+		SELECT * FROM contract_template where status_ = 1
+		<if test="type != null">
+			and type_ = #{type}
+		</if>
+		<if test="owner != null">
+			and owner_ = #{owner}
+		</if>
+	</select>
+	
+	<update id="disableContract" parameterType="map">
+		update contract_template set status_ = 0 where status_ = 1
+		<if test="type != null">
+			and type_ = #{type}
+		</if>
+		<if test="owner != null">
+			and owner_ = #{owner}
+		</if>
+	</update>
+	
+	<select id="queryMaxVersion" resultType="java.lang.Integer">
+		SELECT max(version_) FROM contract_template 
+	</select>
+</mapper>