Selaa lähdekoodia

看板可以选择资源点

sunyj 8 vuotta sitten
vanhempi
commit
5e5776e242

+ 119 - 106
kanban-console/src/main/java/com/uas/kanban/model/Kanban.java

@@ -1,120 +1,133 @@
 package com.uas.kanban.model;
 
-import java.util.List;
-
 import com.uas.kanban.annotation.FieldProperty;
 import com.uas.kanban.base.BaseEntity;
 import com.uas.kanban.support.SystemSession;
 
+import java.util.List;
+
 /**
  * 看板
- * 
+ *
  * @author sunyj
  * @since 2017年9月3日 下午4:20:53
  */
 public class Kanban extends BaseEntity {
 
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * 用户 code
-	 */
-	@FieldProperty(nullable = false)
-	private String userCode;
-
-	/**
-	 * 看板名称
-	 */
-	@FieldProperty(nullable = false)
-	private String name;
-
-	/**
-	 * 模版的 code
-	 */
-	@FieldProperty(nullable = false)
-	private List<String> templateCodes;
-
-	/**
-	 * 展示方式
-	 */
-	@FieldProperty(nullable = false)
-	private Display display;
-
-	/**
-	 * 看板图标样式
-	 */
-	private String iconCls;
-
-	@Override
-	public void init() {
-		User user = SystemSession.checkUser();
-		userCode = user.getCode();
-		super.init();
-	}
-
-	public String getUserCode() {
-		return userCode;
-	}
-
-	public void setUserCode(String userCode) {
-		this.userCode = userCode;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public List<String> getTemplateCodes() {
-		return templateCodes;
-	}
-
-	public void setTemplateCodes(List<String> templateCodes) {
-		this.templateCodes = templateCodes;
-	}
-
-	public Display getDisplay() {
-		return display;
-	}
-
-	public void setDisplay(Display display) {
-		this.display = display;
-	}
-
-	public String getIconCls() {
-		return iconCls;
-	}
-
-	public void setIconCls(String iconCls) {
-		this.iconCls = iconCls;
-	}
-
-	@Override
-	public String toString() {
-		return "Kanban [userCode=" + userCode + ", name=" + name + ", templateCodes=" + templateCodes + ", display="
-				+ display + ", iconCls=" + iconCls + ", id=" + id + ", createTime=" + createTime + ", lastModified="
-				+ lastModified + ", version=" + version + ", code=" + code + "]";
-	}
-
-	/**
-	 * 展示方式
-	 * 
-	 * @author sunyj
-	 * @since 2017年9月1日 下午8:01:53
-	 */
-	public enum Display {
-
-		/**
-		 * 自动切换
-		 */
-		AutoSwitch,
-
-		/**
-		 * 分屏展示
-		 */
-		SplitScreen;
-	}
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户 code
+     */
+    @FieldProperty(nullable = false)
+    private String userCode;
+
+    /**
+     * 资源点 code
+     */
+    private String resourcePointCode;
+
+    /**
+     * 看板名称
+     */
+    @FieldProperty(nullable = false)
+    private String name;
+
+    /**
+     * 模版的 code
+     */
+    @FieldProperty(nullable = false)
+    private List<String> templateCodes;
+
+    /**
+     * 展示方式
+     */
+    @FieldProperty(nullable = false)
+    private Display display;
+
+    /**
+     * 看板图标样式
+     */
+    private String iconCls;
+
+    @Override
+    public void init() {
+        User user = SystemSession.checkUser();
+        userCode = user.getCode();
+        super.init();
+    }
+
+    public String getUserCode() {
+        return userCode;
+    }
+
+    public void setUserCode(String userCode) {
+        this.userCode = userCode;
+    }
+
+    public String getResourcePointCode() {
+        return resourcePointCode;
+    }
+
+    public void setResourcePointCode(String resourcePointCode) {
+        this.resourcePointCode = resourcePointCode;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public List<String> getTemplateCodes() {
+        return templateCodes;
+    }
+
+    public void setTemplateCodes(List<String> templateCodes) {
+        this.templateCodes = templateCodes;
+    }
+
+    public Display getDisplay() {
+        return display;
+    }
+
+    public void setDisplay(Display display) {
+        this.display = display;
+    }
+
+    public String getIconCls() {
+        return iconCls;
+    }
+
+    public void setIconCls(String iconCls) {
+        this.iconCls = iconCls;
+    }
+
+    @Override
+    public String toString() {
+        return "Kanban [userCode=" + userCode + ", resourcePointCode=" + resourcePointCode + ", name=" + name + ", templateCodes=" + templateCodes + ", display="
+                + display + ", iconCls=" + iconCls + ", id=" + id + ", createTime=" + createTime + ", lastModified="
+                + lastModified + ", version=" + version + ", code=" + code + "]";
+    }
+
+    /**
+     * 展示方式
+     *
+     * @author sunyj
+     * @since 2017年9月1日 下午8:01:53
+     */
+    public enum Display {
+
+        /**
+         * 自动切换
+         */
+        AutoSwitch,
+
+        /**
+         * 分屏展示
+         */
+        SplitScreen;
+    }
 }

+ 11 - 0
kanban-console/src/main/java/com/uas/kanban/service/TemplateService.java

@@ -24,6 +24,17 @@ public interface TemplateService {
 	 */
 	public List<Template> getByResourcePointCode(@NotEmpty("resourcePointCode") String resourcePointCode);
 
+	/**
+	 * 根据资源点 code 获取模版
+	 *
+	 * @param code
+	 *            模版的 code
+	 * @param resourcePointCode
+	 *            资源点 code
+	 * @return 模版
+	 */
+	public Template getByResourcePointCode(@NotEmpty("code") String code, @NotEmpty("resourcePointCode") String resourcePointCode);
+
 	/**
 	 * 添加模版参数
 	 * 

+ 128 - 96
kanban-console/src/main/java/com/uas/kanban/service/impl/KanbanServiceImpl.java

@@ -1,121 +1,153 @@
 package com.uas.kanban.service.impl;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import com.uas.kanban.annotation.NotEmpty;
 import com.uas.kanban.base.BaseService;
 import com.uas.kanban.base.PageResult;
 import com.uas.kanban.dao.KanbanDao;
+import com.uas.kanban.dao.ResourcePointDao;
 import com.uas.kanban.dao.TemplateDao;
 import com.uas.kanban.exception.OperationException;
 import com.uas.kanban.model.Kanban;
 import com.uas.kanban.model.Kanban.Display;
+import com.uas.kanban.model.ResourcePoint;
 import com.uas.kanban.model.Template;
 import com.uas.kanban.service.KanbanInstanceService;
+import com.uas.kanban.service.TemplateService;
 import com.uas.kanban.support.SystemSession;
 import com.uas.kanban.util.CollectionUtils;
+import com.uas.kanban.util.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * 看板
- * 
+ *
  * @author sunyj
  * @since 2017年9月3日 下午4:25:43
  */
 @Service
 public class KanbanServiceImpl extends BaseService<Kanban> {
 
-	@Autowired
-	private KanbanDao kanbanDao;
-
-	@Autowired
-	private TemplateDao templateDao;
-
-	@Autowired
-	private KanbanInstanceService kanbanInstanceService;
-
-	@Override
-	public Kanban save(@NotEmpty("json") String json) {
-		Kanban kanban = kanbanDao.parse(json);
-		checkTemplates(kanban.getTemplateCodes());
-		if (kanban.getDisplay() == null) {
-			kanban.setDisplay(Display.AutoSwitch);
-		}
-		return kanbanDao.save(kanban);
-	}
-
-	@Override
-	public Kanban savePart(@NotEmpty("json") String json) {
-		return save(json);
-	}
-
-	@Override
-	public int update(@NotEmpty("json") String json) throws IllegalArgumentException, OperationException {
-		Kanban kanban = kanbanDao.parse(json);
-		checkTemplates(kanban.getTemplateCodes());
-		kanban.setUserCode(SystemSession.checkUser().getCode());
-		// 先删除有关联的看板实例
-		kanbanInstanceService.deleteByKanbanCodes(Arrays.asList(kanban.getCode()));
-		return kanbanDao.update(kanban);
-	}
-
-	@Override
-	public int updatePart(String json) throws IllegalArgumentException, OperationException {
-		return update(json);
-	}
-
-	@Override
-	public int deleteOne(@NotEmpty("code") String code) throws OperationException {
-		// 先删除有关联的看板实例
-		kanbanInstanceService.deleteByKanbanCodes(Arrays.asList(code));
-		return super.deleteOne(code);
-	}
-
-	@Override
-	public int deleteAll() {
-		// 先删除有关联的看板实例
-		int page = PageResult.PAGE_INDEX;
-		int size = 1000;
-		PageResult<Kanban> pageResult = super.get(page, size);
-		while (page <= pageResult.getTotalPage()) {
-			List<Kanban> content = pageResult.getContent();
-			List<String> kanbanCodes = new ArrayList<>();
-			for (Kanban kanban : content) {
-				kanbanCodes.add(kanban.getCode());
-			}
-			if (!CollectionUtils.isEmpty(kanbanCodes)) {
-				kanbanInstanceService.deleteByKanbanCodes(kanbanCodes);
-			}
-			page++;
-		}
-		return super.deleteAll();
-	}
-
-	/**
-	 * 检查模版是否存在
-	 * 
-	 * @param templateCodes
-	 *            模版的 code
-	 * @throws IllegalArgumentException
-	 *             模版不存在
-	 */
-	private void checkTemplates(List<String> templateCodes) throws IllegalArgumentException {
-		if (CollectionUtils.isEmpty(templateCodes)) {
-			return;
-		}
-		for (String templateCode : templateCodes) {
-			if (templateCodes.indexOf(templateCode) != templateCodes.lastIndexOf(templateCode)) {
-				throw new IllegalArgumentException("模版重复:" + templateCode);
-			}
-			Template template = templateDao.findOne(templateCode);
-			if (template == null) {
-				throw new IllegalArgumentException("模版不存在:" + templateCode);
-			}
-		}
-	}
+    @Autowired
+    private KanbanDao kanbanDao;
+
+    @Autowired
+    private TemplateDao templateDao;
+
+    @Autowired
+    private ResourcePointDao resourcePointDao;
+
+    @Autowired
+    private TemplateService templateService;
+
+    @Autowired
+    private KanbanInstanceService kanbanInstanceService;
+
+    @Override
+    public Kanban save(@NotEmpty("json") String json) {
+        Kanban kanban = kanbanDao.parse(json);
+        String resourcePointCode = kanban.getResourcePointCode();
+        checkResourcePoint(resourcePointCode);
+        checkTemplates(resourcePointCode, kanban.getTemplateCodes());
+        if (kanban.getDisplay() == null) {
+            kanban.setDisplay(Display.AutoSwitch);
+        }
+        return kanbanDao.save(kanban);
+    }
+
+    @Override
+    public Kanban savePart(@NotEmpty("json") String json) {
+        return save(json);
+    }
+
+    @Override
+    public int update(@NotEmpty("json") String json) throws IllegalArgumentException, OperationException {
+        Kanban kanban = kanbanDao.parse(json);
+        String resourcePointCode = kanban.getResourcePointCode();
+        checkResourcePoint(resourcePointCode);
+        checkTemplates(resourcePointCode, kanban.getTemplateCodes());
+        kanban.setUserCode(SystemSession.checkUser().getCode());
+        // 先删除有关联的看板实例
+        kanbanInstanceService.deleteByKanbanCodes(Arrays.asList(kanban.getCode()));
+        return kanbanDao.update(kanban);
+    }
+
+    @Override
+    public int updatePart(String json) throws IllegalArgumentException, OperationException {
+        return update(json);
+    }
+
+    @Override
+    public int deleteOne(@NotEmpty("code") String code) throws OperationException {
+        // 先删除有关联的看板实例
+        kanbanInstanceService.deleteByKanbanCodes(Arrays.asList(code));
+        return super.deleteOne(code);
+    }
+
+    @Override
+    public int deleteAll() {
+        // 先删除有关联的看板实例
+        int page = PageResult.PAGE_INDEX;
+        int size = 1000;
+        PageResult<Kanban> pageResult = super.get(page, size);
+        while (page <= pageResult.getTotalPage()) {
+            List<Kanban> content = pageResult.getContent();
+            List<String> kanbanCodes = new ArrayList<>();
+            for (Kanban kanban : content) {
+                kanbanCodes.add(kanban.getCode());
+            }
+            if (!CollectionUtils.isEmpty(kanbanCodes)) {
+                kanbanInstanceService.deleteByKanbanCodes(kanbanCodes);
+            }
+            page++;
+        }
+        return super.deleteAll();
+    }
+
+    /**
+     * 检查资源点是否存在
+     *
+     * @param resourcePointCode 资源点 code
+     * @throws IllegalArgumentException 资源点不存在
+     */
+    private void checkResourcePoint(String resourcePointCode) {
+        if (StringUtils.isEmpty(resourcePointCode)) {
+            return;
+        }
+        ResourcePoint resourcePoint = resourcePointDao.findOne(resourcePointCode);
+        if (resourcePoint == null) {
+            throw new IllegalArgumentException("资源点不存在:" + resourcePointCode);
+        }
+    }
+
+    /**
+     * 检查模版是否存在
+     *
+     * @param templateCodes 模版的 code
+     * @throws IllegalArgumentException 模版不存在
+     */
+    private void checkTemplates(String resourcePointCode, List<String> templateCodes) throws IllegalArgumentException {
+        if (CollectionUtils.isEmpty(templateCodes)) {
+            return;
+        }
+        for (String templateCode : templateCodes) {
+            if (templateCodes.indexOf(templateCode) != templateCodes.lastIndexOf(templateCode)) {
+                throw new IllegalArgumentException("模版重复:" + templateCode);
+            }
+            Template template = null;
+            if (!StringUtils.isEmpty(resourcePointCode)) {
+                template = templateService.getByResourcePointCode(templateCode, resourcePointCode);
+            } else {
+                template = templateDao.findOne(templateCode);
+            }
+            if (template == null) {
+                throw new IllegalArgumentException("模版不存在:" + templateCode);
+            }
+        }
+    }
 
 }

+ 211 - 200
kanban-console/src/main/java/com/uas/kanban/service/impl/TemplateServiceImpl.java

@@ -22,211 +22,222 @@ import java.util.Set;
 
 /**
  * 模版
- * 
+ *
  * @author sunyj
  * @since 2017年9月2日 下午6:54:58
  */
 @Service
 public class TemplateServiceImpl extends BaseService<Template> implements TemplateService {
 
-	@Autowired
-	private TemplateDao templateDao;
-
-	@Autowired
-	private DataSourceDao dataSourceDao;
-
-	@Autowired
-	private GlobalParameterDao globalParameterDao;
-
-	@Autowired
-	private ResourcePointDao resourePointDao;
-
-	@Override
-	public Template save(@NotEmpty("json") String json) {
-		Template template = templateDao.parse(json);
-		checkDataSource(template.getDataSourceCode());
-		checkGlobalParameters(template.getGlobalParameterCodes());
-		// 保存时,不允许指定参数的 code
-		List<TemplateParameter> parameters = template.getParameters();
-		if (!CollectionUtils.isEmpty(parameters)) {
-			for (TemplateParameter parameter : parameters) {
-				parameter.init();
-			}
-		}
-		return templateDao.save(template);
-	}
-
-	@Override
-	public Template savePart(String json) {
-		Template template = templateDao.parse(json);
-		// 可以不指定数据源
-		String dataSourceCode = template.getDataSourceCode();
-		if (!StringUtils.isEmpty(dataSourceCode)) {
-			checkDataSource(template.getDataSourceCode());
-		}
-		checkGlobalParameters(template.getGlobalParameterCodes());
-		// 保存时,不允许指定参数的 code
-		List<TemplateParameter> parameters = template.getParameters();
-		if (!CollectionUtils.isEmpty(parameters)) {
-			for (TemplateParameter parameter : parameters) {
-				parameter.init();
-			}
-		}
-		return templateDao.savePart(template);
-	}
-
-	@Override
-	public int update(@NotEmpty("json") String json) throws IllegalArgumentException, OperationException {
-		Template template = templateDao.parse(json);
-		String code = template.codeNotEmpty();
-		checkDataSource(template.getDataSourceCode());
-		checkGlobalParameters(template.getGlobalParameterCodes());
-		List<TemplateParameter> parameters = template.getParameters();
-		if (!CollectionUtils.isEmpty(parameters)) {
-			throw new OperationException("请单独更新模版参数");
-		}
-		Set<String> ignoreFields = new HashSet<>();
-		// 不更新模版参数
-		ignoreFields.add("parameters");
-		UpdateOperations<Template> operations = templateDao.createUpdateOperations(template, ignoreFields);
-		return templateDao.update(code, operations);
-	}
-
-	@Override
-	public int updatePart(@NotEmpty("json") String json) throws IllegalArgumentException, OperationException {
-		Template template = templateDao.parse(json);
-		// 可以不指定数据源
-		String dataSourceCode = template.getDataSourceCode();
-		if (!StringUtils.isEmpty(dataSourceCode)) {
-			checkDataSource(template.getDataSourceCode());
-		}
-		checkGlobalParameters(template.getGlobalParameterCodes());
-		List<TemplateParameter> parameters = template.getParameters();
-		if (!CollectionUtils.isEmpty(parameters)) {
-			throw new OperationException("请单独更新模版参数");
-		}
-		return templateDao.updatePart(json);
-	}
-
-	/**
-	 * 检查数据源是否存在
-	 * 
-	 * @param dataSourceCode
-	 *            数据源的 code
-	 * @throws IllegalArgumentException
-	 *             数据源不存在
-	 */
-	private void checkDataSource(@NotEmpty("dataSourceCode") String dataSourceCode) throws IllegalArgumentException {
-		DataSource dataSource = dataSourceDao.findOne(dataSourceCode);
-		if (dataSource == null) {
-			throw new IllegalArgumentException("数据源不存在:" + dataSourceCode);
-		}
-	}
-
-	/**
-	 * 检查公共参数是否存在
-	 * 
-	 * @param globalParameterCodes
-	 *            公共参数的 code
-	 * @throws IllegalArgumentException
-	 *             公共参数不存在
-	 */
-	private void checkGlobalParameters(List<String> globalParameterCodes) throws IllegalArgumentException {
-		if (!CollectionUtils.isEmpty(globalParameterCodes)) {
-			for (String globalParameterCode : globalParameterCodes) {
-				GlobalParameter globalParameter = globalParameterDao.findOne(globalParameterCode);
-				if (globalParameter == null) {
-					throw new IllegalArgumentException("公共参数不存在:" + globalParameterCode);
-				}
-			}
-		}
-	}
-
-	@Override
-	public List<Template> getByResourcePointCode(@NotEmpty("resourcePointCode") String resourcePointCode) {
-		ResourcePoint resourcePoint = resourePointDao.findOne(resourcePointCode);
-		if (resourcePoint == null) {
-			throw new IllegalStateException("资源点不存在:" + resourcePointCode);
-		}
-		// 资源点所能查看的模版
-		List<String> resourcePointCodes = resourcePoint.getTemplateCodes();
-		if(CollectionUtils.isEmpty(resourcePointCodes)){
-			return null;
-		}
-		return templateDao.findListBy("code", resourcePointCodes);
-	}
-
-	@Override
-	public int addParameter(@NotEmpty("code") String code, @NotEmpty("parameter") TemplateParameter parameter) {
-		parameter.init();
-		templateDao.checkFields(parameter);
-		UpdateOperations<Template> operations = templateDao.createUpdateOperations();
-		operations.addToSet("parameters", parameter);
-		return templateDao.update(code, operations);
-	}
-
-	@Override
-	public int deleteParameter(@NotEmpty("code") String code, @NotEmpty("parameterCode") String parameterCode)
-			throws IllegalStateException, IllegalArgumentException, OperationException {
-		// 先获取模版
-		Template template = getTemplate(code, parameterCode);
-		if (template == null) {
-			return 0;
-		}
-		List<TemplateParameter> parameters = template.getParameters();
-		// 删除获取到的模版的指定参数,再更新到数据库
-		for (int i = parameters.size() - 1; i >= 0; i--) {
-			TemplateParameter parameter = parameters.get(i);
-			if (parameterCode.equals(parameter.getCode())) {
-				parameters.remove(i);
-			}
-		}
-		return templateDao.update(template);
-	}
-
-	/**
-	 * 根据模版的 code 和模版参数的 code 获取模版
-	 * 
-	 * @param code
-	 *            模版的 code
-	 * @param parameterCode
-	 *            模版参数的 code
-	 * @return 模版
-	 * @throws IllegalStateException
-	 */
-	private Template getTemplate(@NotEmpty("code") String code, @NotEmpty("parameterCode") String parameterCode)
-			throws IllegalStateException {
-		Query<Template> query = templateDao.createQuery();
-		query.field("code").equal(code);
-		query.field("parameters.code").equal(parameterCode);
-		List<Template> templates = templateDao.find(query);
-		if (CollectionUtils.isEmpty(templates)) {
-			return null;
-		} else if (templates.size() > 1) {
-			throw new IllegalStateException("存在不止一个模版");
-		}
-		return templates.get(0);
-	}
-
-	@Override
-	public int updateParameter(@NotEmpty("code") String code, @NotEmpty("parameter") TemplateParameter parameter)
-			throws IllegalStateException, IllegalArgumentException, OperationException {
-		String parameterCode = parameter.getCode();
-		templateDao.checkFields(parameter);
-		// 先获取模版
-		Template template = getTemplate(code, parameterCode);
-		if (template == null) {
-			return 0;
-		}
-		List<TemplateParameter> parameters = template.getParameters();
-		// 删除获取到的模版的指定参数,再更新到数据库
-		for (int i = parameters.size() - 1; i >= 0; i--) {
-			TemplateParameter templateParameter = parameters.get(i);
-			if (parameterCode.equals(templateParameter.getCode())) {
-				parameters.set(i, parameter);
-			}
-		}
-		return templateDao.update(template);
-	}
+    @Autowired
+    private TemplateDao templateDao;
+
+    @Autowired
+    private DataSourceDao dataSourceDao;
+
+    @Autowired
+    private GlobalParameterDao globalParameterDao;
+
+    @Autowired
+    private ResourcePointDao resourePointDao;
+
+    @Override
+    public Template save(@NotEmpty("json") String json) {
+        Template template = templateDao.parse(json);
+        checkDataSource(template.getDataSourceCode());
+        checkGlobalParameters(template.getGlobalParameterCodes());
+        // 保存时,不允许指定参数的 code
+        List<TemplateParameter> parameters = template.getParameters();
+        if (!CollectionUtils.isEmpty(parameters)) {
+            for (TemplateParameter parameter : parameters) {
+                parameter.init();
+            }
+        }
+        return templateDao.save(template);
+    }
+
+    @Override
+    public Template savePart(String json) {
+        Template template = templateDao.parse(json);
+        // 可以不指定数据源
+        String dataSourceCode = template.getDataSourceCode();
+        if (!StringUtils.isEmpty(dataSourceCode)) {
+            checkDataSource(template.getDataSourceCode());
+        }
+        checkGlobalParameters(template.getGlobalParameterCodes());
+        // 保存时,不允许指定参数的 code
+        List<TemplateParameter> parameters = template.getParameters();
+        if (!CollectionUtils.isEmpty(parameters)) {
+            for (TemplateParameter parameter : parameters) {
+                parameter.init();
+            }
+        }
+        return templateDao.savePart(template);
+    }
+
+    @Override
+    public int update(@NotEmpty("json") String json) throws IllegalArgumentException, OperationException {
+        Template template = templateDao.parse(json);
+        String code = template.codeNotEmpty();
+        checkDataSource(template.getDataSourceCode());
+        checkGlobalParameters(template.getGlobalParameterCodes());
+        List<TemplateParameter> parameters = template.getParameters();
+        if (!CollectionUtils.isEmpty(parameters)) {
+            throw new OperationException("请单独更新模版参数");
+        }
+        Set<String> ignoreFields = new HashSet<>();
+        // 不更新模版参数
+        ignoreFields.add("parameters");
+        UpdateOperations<Template> operations = templateDao.createUpdateOperations(template, ignoreFields);
+        return templateDao.update(code, operations);
+    }
+
+    @Override
+    public int updatePart(@NotEmpty("json") String json) throws IllegalArgumentException, OperationException {
+        Template template = templateDao.parse(json);
+        // 可以不指定数据源
+        String dataSourceCode = template.getDataSourceCode();
+        if (!StringUtils.isEmpty(dataSourceCode)) {
+            checkDataSource(template.getDataSourceCode());
+        }
+        checkGlobalParameters(template.getGlobalParameterCodes());
+        List<TemplateParameter> parameters = template.getParameters();
+        if (!CollectionUtils.isEmpty(parameters)) {
+            throw new OperationException("请单独更新模版参数");
+        }
+        return templateDao.updatePart(json);
+    }
+
+    /**
+     * 检查数据源是否存在
+     *
+     * @param dataSourceCode 数据源的 code
+     * @throws IllegalArgumentException 数据源不存在
+     */
+    private void checkDataSource(@NotEmpty("dataSourceCode") String dataSourceCode) throws IllegalArgumentException {
+        DataSource dataSource = dataSourceDao.findOne(dataSourceCode);
+        if (dataSource == null) {
+            throw new IllegalArgumentException("数据源不存在:" + dataSourceCode);
+        }
+    }
+
+    /**
+     * 检查公共参数是否存在
+     *
+     * @param globalParameterCodes 公共参数的 code
+     * @throws IllegalArgumentException 公共参数不存在
+     */
+    private void checkGlobalParameters(List<String> globalParameterCodes) throws IllegalArgumentException {
+        if (!CollectionUtils.isEmpty(globalParameterCodes)) {
+            for (String globalParameterCode : globalParameterCodes) {
+                GlobalParameter globalParameter = globalParameterDao.findOne(globalParameterCode);
+                if (globalParameter == null) {
+                    throw new IllegalArgumentException("公共参数不存在:" + globalParameterCode);
+                }
+            }
+        }
+    }
+
+    @Override
+    public List<Template> getByResourcePointCode(@NotEmpty("resourcePointCode") String resourcePointCode) {
+        ResourcePoint resourcePoint = resourePointDao.findOne(resourcePointCode);
+        if (resourcePoint == null) {
+            throw new IllegalStateException("资源点不存在:" + resourcePointCode);
+        }
+        // 资源点所能查看的模版
+        List<String> resourcePointCodes = resourcePoint.getTemplateCodes();
+        if (CollectionUtils.isEmpty(resourcePointCodes)) {
+            return null;
+        }
+        return templateDao.findListBy("code", resourcePointCodes);
+    }
+
+    @Override
+    public Template getByResourcePointCode(@NotEmpty("code") String code, @NotEmpty("resourcePointCode") String resourcePointCode) {
+        ResourcePoint resourcePoint = resourePointDao.findOne(resourcePointCode);
+        if (resourcePoint == null) {
+            throw new IllegalStateException("资源点不存在:" + resourcePointCode);
+        }
+        // 资源点所能查看的模版
+        List<String> resourcePointCodes = resourcePoint.getTemplateCodes();
+        if (CollectionUtils.isEmpty(resourcePointCodes)) {
+            return null;
+        }
+        if (!resourcePointCodes.contains(code)) {
+            throw new IllegalArgumentException("该资源点 " + resourcePoint.getName() + " 未分配该模版:" + code);
+        }
+        return templateDao.findOne(code);
+    }
+
+    @Override
+    public int addParameter(@NotEmpty("code") String code, @NotEmpty("parameter") TemplateParameter parameter) {
+        parameter.init();
+        templateDao.checkFields(parameter);
+        UpdateOperations<Template> operations = templateDao.createUpdateOperations();
+        operations.addToSet("parameters", parameter);
+        return templateDao.update(code, operations);
+    }
+
+    @Override
+    public int deleteParameter(@NotEmpty("code") String code, @NotEmpty("parameterCode") String parameterCode)
+            throws IllegalStateException, IllegalArgumentException, OperationException {
+        // 先获取模版
+        Template template = getTemplate(code, parameterCode);
+        if (template == null) {
+            return 0;
+        }
+        List<TemplateParameter> parameters = template.getParameters();
+        // 删除获取到的模版的指定参数,再更新到数据库
+        for (int i = parameters.size() - 1; i >= 0; i--) {
+            TemplateParameter parameter = parameters.get(i);
+            if (parameterCode.equals(parameter.getCode())) {
+                parameters.remove(i);
+            }
+        }
+        return templateDao.update(template);
+    }
+
+    /**
+     * 根据模版的 code 和模版参数的 code 获取模版
+     *
+     * @param code          模版的 code
+     * @param parameterCode 模版参数的 code
+     * @return 模版
+     * @throws IllegalStateException
+     */
+    private Template getTemplate(@NotEmpty("code") String code, @NotEmpty("parameterCode") String parameterCode)
+            throws IllegalStateException {
+        Query<Template> query = templateDao.createQuery();
+        query.field("code").equal(code);
+        query.field("parameters.code").equal(parameterCode);
+        List<Template> templates = templateDao.find(query);
+        if (CollectionUtils.isEmpty(templates)) {
+            return null;
+        } else if (templates.size() > 1) {
+            throw new IllegalStateException("存在不止一个模版");
+        }
+        return templates.get(0);
+    }
+
+    @Override
+    public int updateParameter(@NotEmpty("code") String code, @NotEmpty("parameter") TemplateParameter parameter)
+            throws IllegalStateException, IllegalArgumentException, OperationException {
+        String parameterCode = parameter.getCode();
+        templateDao.checkFields(parameter);
+        // 先获取模版
+        Template template = getTemplate(code, parameterCode);
+        if (template == null) {
+            return 0;
+        }
+        List<TemplateParameter> parameters = template.getParameters();
+        // 删除获取到的模版的指定参数,再更新到数据库
+        for (int i = parameters.size() - 1; i >= 0; i--) {
+            TemplateParameter templateParameter = parameters.get(i);
+            if (parameterCode.equals(templateParameter.getCode())) {
+                parameters.set(i, parameter);
+            }
+        }
+        return templateDao.update(template);
+    }
 
 }

+ 1 - 1
kanban-console/src/main/webapp/WEB-INF/views/console.html

@@ -80,7 +80,7 @@
 			</ol>
 			<strong><li class="title">看版</li></strong>
 			<ol>
-				<li><a target="_blank">kanban/save?json={"name": "name","templateCodes":["500DE5D931C"],"display":"AutoSwitch", "iconCls":"grid-shortcut"}</a></li>
+				<li><a target="_blank">kanban/save?json={"name": "name","resourcePointCode":"4EC2735D343","templateCodes":["500DE5D931C"],"display":"AutoSwitch", "iconCls":"grid-shortcut"}</a></li>
 				<li><a target="_blank">kanban/savePart?json={"name": "name","templateCodes":["500DE5D931C"],"display":"AutoSwitch", "iconCls":"grid-shortcut"}</a></li>
 				<!-- "templateCodes":"4ED1EA76E16" 或 "templateCodes":["4ED1EA76E16"]-->
 				<li><a target="_blank">kanban/update?json={"code":"506C9FB0311","name": "name","templateCodes":["4FF1AD1C411","4FF1F024412"],"display":"SplitScreen", "iconCls":"grid-shortcut"}</a></li>