Browse Source

人员分类管理,常用功能

dev
zxc 4 years ago
parent
commit
9fa6f05860
  1. 26
      epmet-module/gov-access/gov-access-client/src/main/java/com/epmet/dto/form/AddOftenUseFunctionFormDTO.java
  2. 41
      epmet-module/gov-access/gov-access-client/src/main/java/com/epmet/dto/result/OftenUseFunctionListResultDTO.java
  3. 36
      epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/controller/IcOftenUseFunctionController.java
  4. 21
      epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/dao/IcOftenUseFunctionDao.java
  5. 30
      epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/service/IcOftenUseFunctionService.java
  6. 43
      epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/service/impl/IcOftenUseFunctionServiceImpl.java
  7. 20
      epmet-module/gov-access/gov-access-server/src/main/resources/mapper/IcOftenUseFunctionDao.xml
  8. 26
      epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/EditIndividualCategoryFormDTO.java
  9. 36
      epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IndividualCategoryListResultDTO.java
  10. 36
      epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcIndividualCategoryManageController.java
  11. 21
      epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcIndividualCategoryManageDao.java
  12. 29
      epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcIndividualCategoryManageService.java
  13. 51
      epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcIndividualCategoryManageServiceImpl.java
  14. 16
      epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcIndividualCategoryManageDao.xml

26
epmet-module/gov-access/gov-access-client/src/main/java/com/epmet/dto/form/AddOftenUseFunctionFormDTO.java

@ -0,0 +1,26 @@
package com.epmet.dto.form;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @Author zxc
* @DateTime 2022/1/17 10:09 上午
* @DESC
*/
@Data
public class AddOftenUseFunctionFormDTO implements Serializable {
private static final long serialVersionUID = -8044386389656626183L;
public interface AddOftenUseFunctionForm{}
@NotBlank(message = "menuId不能为空", groups = AddOftenUseFunctionForm.class)
private String menuId;
@NotNull(message = "sort不能为空", groups = AddOftenUseFunctionForm.class)
private Integer sort;
}

41
epmet-module/gov-access/gov-access-client/src/main/java/com/epmet/dto/result/OftenUseFunctionListResultDTO.java

@ -0,0 +1,41 @@
package com.epmet.dto.result;
import lombok.Data;
import java.io.Serializable;
/**
* @Author zxc
* @DateTime 2022/1/17 9:41 上午
* @DESC
*/
@Data
public class OftenUseFunctionListResultDTO implements Serializable {
private static final long serialVersionUID = 8561818114575776804L;
/**
* 跳转url
*/
private String url;
/**
* 菜单ID
*/
private String menuId;
/**
* 菜单名字
*/
private String menuName;
/**
* 图标
*/
private String icon;
/**
* 排序
*/
private String sort;
}

36
epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/controller/IcOftenUseFunctionController.java

@ -1,15 +1,21 @@
package com.epmet.controller;
import com.epmet.commons.tools.annotation.LoginUser;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.validator.ValidatorUtils;
import com.epmet.commons.tools.validator.group.AddGroup;
import com.epmet.commons.tools.validator.group.UpdateGroup;
import com.epmet.commons.tools.validator.group.DefaultGroup;
import com.epmet.dto.IcOftenUseFunctionDTO;
import com.epmet.dto.form.AddOftenUseFunctionFormDTO;
import com.epmet.dto.result.OftenUseFunctionListResultDTO;
import com.epmet.service.IcOftenUseFunctionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 常用功能
*
@ -23,19 +29,27 @@ public class IcOftenUseFunctionController {
@Autowired
private IcOftenUseFunctionService icOftenUseFunctionService;
@PostMapping
public Result save(@RequestBody IcOftenUseFunctionDTO dto){
//效验数据
ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class);
icOftenUseFunctionService.save(dto);
return new Result();
/**
* @Description 社区查询常用功能查询
* @param tokenDto
* @author zxc
* @date 2022/1/17 9:47 上午
*/
@PostMapping("oftenusefunctionlist")
public Result<List<OftenUseFunctionListResultDTO>> oftenUseFunctionList(@LoginUser TokenDto tokenDto){
return new Result<List<OftenUseFunctionListResultDTO>>().ok(icOftenUseFunctionService.oftenUseFunctionList(tokenDto));
}
@PutMapping
public Result update(@RequestBody IcOftenUseFunctionDTO dto){
//效验数据
ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);
icOftenUseFunctionService.update(dto);
/**
* @Description 社区查询常用功能添加(就是修改)
* @param formDTOS
* @param tokenDto
* @author zxc
* @date 2022/1/17 10:13 上午
*/
@PostMapping("addoftenusefunction")
public Result addOftenUseFunction(@RequestBody List<AddOftenUseFunctionFormDTO> formDTOS, @LoginUser TokenDto tokenDto){
icOftenUseFunctionService.addOftenUseFunction(formDTOS, tokenDto);
return new Result();
}

21
epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/dao/IcOftenUseFunctionDao.java

@ -18,8 +18,12 @@
package com.epmet.dao;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.dto.result.OftenUseFunctionListResultDTO;
import com.epmet.entity.IcOftenUseFunctionEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 常用功能
@ -30,4 +34,21 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface IcOftenUseFunctionDao extends BaseDao<IcOftenUseFunctionEntity> {
/**
* @Description 社区查询常用功能查询
* @param userId
* @author zxc
* @date 2022/1/17 10:06 上午
*/
List<OftenUseFunctionListResultDTO> oftenUseFunctionList(@Param("userId")String userId);
/**
* @Description 删除旧数据
* @param userId
* @param customerId
* @author zxc
* @date 2022/1/17 10:25 上午
*/
void deleteOldData(@Param("userId")String userId,@Param("customerId")String customerId);
}

30
epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/service/IcOftenUseFunctionService.java

@ -18,9 +18,14 @@
package com.epmet.service;
import com.epmet.commons.mybatis.service.BaseService;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.dto.IcOftenUseFunctionDTO;
import com.epmet.dto.form.AddOftenUseFunctionFormDTO;
import com.epmet.dto.result.OftenUseFunctionListResultDTO;
import com.epmet.entity.IcOftenUseFunctionEntity;
import java.util.List;
/**
* 常用功能
*
@ -30,22 +35,19 @@ import com.epmet.entity.IcOftenUseFunctionEntity;
public interface IcOftenUseFunctionService extends BaseService<IcOftenUseFunctionEntity> {
/**
* 默认保存
*
* @param dto
* @return void
* @author generator
* @date 2022-01-17
* @Description 社区查询常用功能查询
* @param tokenDto
* @author zxc
* @date 2022/1/17 9:47 上午
*/
void save(IcOftenUseFunctionDTO dto);
List<OftenUseFunctionListResultDTO> oftenUseFunctionList(TokenDto tokenDto);
/**
* 默认更新
*
* @param dto
* @return void
* @author generator
* @date 2022-01-17
* @Description 社区查询常用功能添加(就是修改)
* @param formDTOS
* @param tokenDto
* @author zxc
* @date 2022/1/17 10:13 上午
*/
void update(IcOftenUseFunctionDTO dto);
void addOftenUseFunction(List<AddOftenUseFunctionFormDTO> formDTOS, TokenDto tokenDto);
}

43
epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/service/impl/IcOftenUseFunctionServiceImpl.java

@ -18,14 +18,21 @@
package com.epmet.service.impl;
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.dao.IcOftenUseFunctionDao;
import com.epmet.dto.IcOftenUseFunctionDTO;
import com.epmet.dto.form.AddOftenUseFunctionFormDTO;
import com.epmet.dto.result.OftenUseFunctionListResultDTO;
import com.epmet.entity.IcOftenUseFunctionEntity;
import com.epmet.service.IcOftenUseFunctionService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
* 常用功能
*
@ -35,18 +42,40 @@ import org.springframework.transaction.annotation.Transactional;
@Service
public class IcOftenUseFunctionServiceImpl extends BaseServiceImpl<IcOftenUseFunctionDao, IcOftenUseFunctionEntity> implements IcOftenUseFunctionService {
/**
* @Description 社区查询常用功能查询
* @param tokenDto
* @author zxc
* @date 2022/1/17 9:47 上午
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void save(IcOftenUseFunctionDTO dto) {
IcOftenUseFunctionEntity entity = ConvertUtils.sourceToTarget(dto, IcOftenUseFunctionEntity.class);
insert(entity);
public List<OftenUseFunctionListResultDTO> oftenUseFunctionList(TokenDto tokenDto) {
List<OftenUseFunctionListResultDTO> result = baseDao.oftenUseFunctionList(tokenDto.getUserId());
if (CollectionUtils.isNotEmpty(result)){
return result;
}
return new ArrayList<>();
}
/**
* @Description 社区查询常用功能添加(就是修改)
* @param formDTOS
* @param tokenDto
* @author zxc
* @date 2022/1/17 10:13 上午
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void update(IcOftenUseFunctionDTO dto) {
IcOftenUseFunctionEntity entity = ConvertUtils.sourceToTarget(dto, IcOftenUseFunctionEntity.class);
updateById(entity);
public void addOftenUseFunction(List<AddOftenUseFunctionFormDTO> formDTOS, TokenDto tokenDto) {
if (CollectionUtils.isNotEmpty(formDTOS)){
baseDao.deleteOldData(tokenDto.getUserId(),tokenDto.getCustomerId());
List<IcOftenUseFunctionEntity> entities = ConvertUtils.sourceToTarget(formDTOS, IcOftenUseFunctionEntity.class);
entities.forEach(e -> {
e.setCustomerId(tokenDto.getCustomerId());
e.setUserId(tokenDto.getUserId());
});
insertBatch(entities);
}
}
}

20
epmet-module/gov-access/gov-access-server/src/main/resources/mapper/IcOftenUseFunctionDao.xml

@ -3,5 +3,25 @@
<mapper namespace="com.epmet.dao.IcOftenUseFunctionDao">
<!-- 删除旧数据 -->
<delete id="deleteOldData">
DELETE FROM ic_often_use_function WHERE USER_ID = #{userId} AND CUSTOMER_ID = #{customerId}
</delete>
<!-- 【社区查询】常用功能查询 -->
<select id="oftenUseFunctionList" resultType="com.epmet.dto.result.OftenUseFunctionListResultDTO">
SELECT
ic.SORT,
ic.MENU_ID,
gm.url,
gm.icon,
gl.field_value AS menuName
FROM ic_often_use_function ic
INNER JOIN gov_customer_menu gc ON (gc.TABLE_ID = ic.MENU_ID AND gc.DEL_FLAG = '0' AND ic.CUSTOMER_ID = gc.CUSTOMER_ID)
INNER JOIN gov_menu gm ON (gc.TABLE_ID = gm.id AND gm.DEL_FLAG = 0 AND gm.SHOW_FLAG = 1)
INNER JOIN gov_language gl ON (gl.table_id = gc.TABLE_ID)
WHERE ic.DEL_FLAG = 0
AND ic.USER_ID = #{userId}
ORDER BY ic.SORT
</select>
</mapper>

26
epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/EditIndividualCategoryFormDTO.java

@ -0,0 +1,26 @@
package com.epmet.dto.form;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @Author zxc
* @DateTime 2022/1/17 10:59 上午
* @DESC
*/
@Data
public class EditIndividualCategoryFormDTO implements Serializable {
private static final long serialVersionUID = -3492393795553841513L;
public interface EditIndividualCategoryForm{}
@NotBlank(message = "columnId不能为空",groups = EditIndividualCategoryForm.class)
private String columnId;
@NotNull(message = "sort不能为空",groups = EditIndividualCategoryForm.class)
private Integer sort;
}

36
epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IndividualCategoryListResultDTO.java

@ -0,0 +1,36 @@
package com.epmet.dto.result;
import lombok.Data;
import java.io.Serializable;
/**
* @Author zxc
* @DateTime 2022/1/17 10:52 上午
* @DESC
*/
@Data
public class IndividualCategoryListResultDTO implements Serializable {
private static final long serialVersionUID = -3294223041971531203L;
/**
* 标签
*/
private String label;
/**
* 图片
*/
private String managementIcon;
/**
* 字段名
*/
private String columnName;
/**
* 排序
*/
private Integer sort;
}

36
epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcIndividualCategoryManageController.java

@ -1,15 +1,21 @@
package com.epmet.controller;
import com.epmet.commons.tools.annotation.LoginUser;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.validator.ValidatorUtils;
import com.epmet.commons.tools.validator.group.AddGroup;
import com.epmet.commons.tools.validator.group.UpdateGroup;
import com.epmet.commons.tools.validator.group.DefaultGroup;
import com.epmet.dto.IcIndividualCategoryManageDTO;
import com.epmet.dto.form.EditIndividualCategoryFormDTO;
import com.epmet.dto.result.IndividualCategoryListResultDTO;
import com.epmet.service.IcIndividualCategoryManageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 个人分类管理
*
@ -23,19 +29,27 @@ public class IcIndividualCategoryManageController {
@Autowired
private IcIndividualCategoryManageService icIndividualCategoryManageService;
@PostMapping
public Result save(@RequestBody IcIndividualCategoryManageDTO dto){
//效验数据
ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class);
icIndividualCategoryManageService.save(dto);
return new Result();
/**
* @Description 人员分类管理查询个人分类列表
* @param tokenDto
* @author zxc
* @date 2022/1/17 10:55 上午
*/
@PostMapping("individualcategorylist")
public Result<List<IndividualCategoryListResultDTO>> individualCategoryList(@LoginUser TokenDto tokenDto){
return new Result<List<IndividualCategoryListResultDTO>>().ok(icIndividualCategoryManageService.individualCategoryList(tokenDto));
}
@PutMapping
public Result update(@RequestBody IcIndividualCategoryManageDTO dto){
//效验数据
ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);
icIndividualCategoryManageService.update(dto);
/**
* @Description 人员分类管理个人分类修改(添加修改一个接口)
* @param formDTOS
* @param tokenDto
* @author zxc
* @date 2022/1/17 11:04 上午
*/
@PostMapping("editindividualcategory")
public Result editIndividualCategory(@RequestBody List<EditIndividualCategoryFormDTO> formDTOS,@LoginUser TokenDto tokenDto){
icIndividualCategoryManageService.editIndividualCategory(formDTOS,tokenDto);
return new Result();
}

21
epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcIndividualCategoryManageDao.java

@ -1,8 +1,12 @@
package com.epmet.dao;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.dto.result.IndividualCategoryListResultDTO;
import com.epmet.entity.IcIndividualCategoryManageEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 个人分类管理
@ -13,4 +17,21 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface IcIndividualCategoryManageDao extends BaseDao<IcIndividualCategoryManageEntity> {
/**
* @Description 删除旧数据
* @param userId
* @param customerId
* @author zxc
* @date 2022/1/17 11:10 上午
*/
void deleteOldData(@Param("userId")String userId,@Param("customerId")String customerId);
/**
* @Description 人员分类管理查询个人分类列表
* @param userId
* @author zxc
* @date 2022/1/17 1:25 下午
*/
List<IndividualCategoryListResultDTO> individualCategoryList(@Param("userId")String userId);
}

29
epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcIndividualCategoryManageService.java

@ -2,7 +2,10 @@ package com.epmet.service;
import com.epmet.commons.mybatis.service.BaseService;
import com.epmet.commons.tools.page.PageData;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.dto.IcIndividualCategoryManageDTO;
import com.epmet.dto.form.EditIndividualCategoryFormDTO;
import com.epmet.dto.result.IndividualCategoryListResultDTO;
import com.epmet.entity.IcIndividualCategoryManageEntity;
import java.util.List;
@ -17,22 +20,20 @@ import java.util.Map;
public interface IcIndividualCategoryManageService extends BaseService<IcIndividualCategoryManageEntity> {
/**
* 默认保存
*
* @param dto
* @return void
* @author generator
* @date 2022-01-17
* @Description 人员分类管理查询个人分类列表
* @param tokenDto
* @author zxc
* @date 2022/1/17 10:55 上午
*/
void save(IcIndividualCategoryManageDTO dto);
List<IndividualCategoryListResultDTO> individualCategoryList(TokenDto tokenDto);
/**
* 默认更新
*
* @param dto
* @return void
* @author generator
* @date 2022-01-17
* @Description 人员分类管理个人分类修改(添加修改一个接口)
* @param formDTOS
* @param tokenDto
* @author zxc
* @date 2022/1/17 11:04 上午
*/
void update(IcIndividualCategoryManageDTO dto);
void editIndividualCategory(List<EditIndividualCategoryFormDTO> formDTOS, TokenDto tokenDto);
}

51
epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcIndividualCategoryManageServiceImpl.java

@ -1,23 +1,19 @@
package com.epmet.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
import com.epmet.commons.tools.page.PageData;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.commons.tools.constant.FieldConstant;
import com.epmet.dao.IcIndividualCategoryManageDao;
import com.epmet.dto.IcIndividualCategoryManageDTO;
import com.epmet.dto.form.EditIndividualCategoryFormDTO;
import com.epmet.dto.result.IndividualCategoryListResultDTO;
import com.epmet.entity.IcIndividualCategoryManageEntity;
import com.epmet.service.IcIndividualCategoryManageService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 个人分类管理
@ -28,18 +24,39 @@ import java.util.Map;
@Service
public class IcIndividualCategoryManageServiceImpl extends BaseServiceImpl<IcIndividualCategoryManageDao, IcIndividualCategoryManageEntity> implements IcIndividualCategoryManageService {
/**
* @Description 人员分类管理查询个人分类列表
* @param tokenDto
* @author zxc
* @date 2022/1/17 10:55 上午
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void save(IcIndividualCategoryManageDTO dto) {
IcIndividualCategoryManageEntity entity = ConvertUtils.sourceToTarget(dto, IcIndividualCategoryManageEntity.class);
insert(entity);
public List<IndividualCategoryListResultDTO> individualCategoryList(TokenDto tokenDto) {
List<IndividualCategoryListResultDTO> result = baseDao.individualCategoryList(tokenDto.getUserId());
if (CollectionUtils.isNotEmpty(result)){
return result;
}
return new ArrayList<>();
}
/**
* @Description 人员分类管理个人分类修改(添加修改一个接口)
* @param formDTOS
* @param tokenDto
* @author zxc
* @date 2022/1/17 11:04 上午
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void update(IcIndividualCategoryManageDTO dto) {
IcIndividualCategoryManageEntity entity = ConvertUtils.sourceToTarget(dto, IcIndividualCategoryManageEntity.class);
updateById(entity);
public void editIndividualCategory(List<EditIndividualCategoryFormDTO> formDTOS, TokenDto tokenDto) {
if (CollectionUtils.isNotEmpty(formDTOS)){
baseDao.deleteOldData(tokenDto.getUserId(),tokenDto.getCustomerId());
List<IcIndividualCategoryManageEntity> entities = ConvertUtils.sourceToTarget(formDTOS, IcIndividualCategoryManageEntity.class);
entities.forEach(e -> {
e.setCustomerId(tokenDto.getCustomerId());
e.setUserId(tokenDto.getUserId());
});
insertBatch(entities);
}
}
}

16
epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcIndividualCategoryManageDao.xml

@ -3,5 +3,21 @@
<mapper namespace="com.epmet.dao.IcIndividualCategoryManageDao">
<!-- 删除旧数据 -->
<delete id="deleteOldData">
DELETE FROM ic_individual_category_manage WHERE USER_ID = #{userId} AND CUSTOMER_ID = #{customerId}
</delete>
<!-- 【人员分类管理】查询个人分类列表 -->
<select id="individualCategoryList" resultType="com.epmet.dto.result.IndividualCategoryListResultDTO">
SELECT
cm.SORT,
sc.LABEL,
sc.MANAGEMENT_ICON,
sc.COLUMN_NAME
FROM ic_individual_category_manage cm
INNER JOIN ic_resi_category_stats_config sc ON (sc.ID = cm.COLUMN_ID AND sc.DEL_FLAG = '0' AND `STATUS` = 'show')
WHERE cm.DEL_FLAG = 0
AND cm.USER_ID = #{userId}
</select>
</mapper>
Loading…
Cancel
Save