From db3b038bb3a15ebaf312293737609ce868f96546 Mon Sep 17 00:00:00 2001 From: Shaun Chyxion Date: Mon, 30 Apr 2018 14:46:44 +0800 Subject: [PATCH] add application customer permission --- .../service/CustomerPermissionService.java | 30 ++++++++ .../ambition/crm/service/UserService.java | 2 + .../support/ApplicationServiceSupport.java | 71 ++++++++++++++++--- .../CustomerPermissionServiceSupport.java | 56 +++++++++++++++ .../support/CustomerServiceSupport.java | 23 +++++- .../service/support/UserServiceSupport.java | 19 +++-- .../ambition/crm/mapper/CustomerMapper.java | 26 +++++++ .../ambition/crm/mapper/CustomerMapper.xml | 19 +++++ .../crm/model/CustomerPermission.java | 8 ++- 9 files changed, 237 insertions(+), 17 deletions(-) create mode 100644 server/crm/src/main/java/com/pudonghot/ambition/crm/service/CustomerPermissionService.java create mode 100644 server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/CustomerPermissionServiceSupport.java diff --git a/server/crm/src/main/java/com/pudonghot/ambition/crm/service/CustomerPermissionService.java b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/CustomerPermissionService.java new file mode 100644 index 0000000..d73b526 --- /dev/null +++ b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/CustomerPermissionService.java @@ -0,0 +1,30 @@ +package com.pudonghot.ambition.crm.service; + +import me.chyxion.tigon.service.BaseCrudService; +import com.pudonghot.ambition.crm.model.CustomerPermission; + +/** + * @author Shaun Chyxion
+ * chyxion@163.com
+ * Apr 30, 2018 10:30:16 + */ +public interface CustomerPermissionService + extends BaseCrudService { + + /** + * create new customer permission + * @param customerId customer id + * @param account account + * @param operator operator + */ + void create(final String customerId, final String account, final String operator); + + /** + * delete customer permission + * @param customerId customer id + * @param account account + */ + void delete(final String customerId, final String account); +} + diff --git a/server/crm/src/main/java/com/pudonghot/ambition/crm/service/UserService.java b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/UserService.java index 2ec2e70..d0b709f 100644 --- a/server/crm/src/main/java/com/pudonghot/ambition/crm/service/UserService.java +++ b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/UserService.java @@ -45,5 +45,7 @@ public interface UserService @NotNull ViewModel updatePassword( @NotBlank String userId, @Valid UserFormForUpdatePassword form); + + @NotBlank String findAccount(@NotBlank String id); } diff --git a/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/ApplicationServiceSupport.java b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/ApplicationServiceSupport.java index a988dbb..ac82cfc 100644 --- a/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/ApplicationServiceSupport.java +++ b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/ApplicationServiceSupport.java @@ -6,23 +6,22 @@ import java.util.ArrayList; import java.io.IOException; import java.io.InputStream; import lombok.extern.slf4j.Slf4j; +import java.util.function.Consumer; import me.chyxion.tigon.mybatis.Search; import org.springframework.util.Assert; import me.chyxion.tigon.model.ViewModel; +import com.pudonghot.ambition.crm.model.*; +import com.pudonghot.ambition.crm.mapper.*; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import com.pudonghot.ambition.file.DiskFileApi; -import com.pudonghot.ambition.crm.model.FileInfo; -import com.pudonghot.ambition.crm.model.Application; +import com.pudonghot.ambition.crm.service.UserService; import org.springframework.web.multipart.MultipartFile; -import com.pudonghot.ambition.crm.model.ApplicationImage; -import com.pudonghot.ambition.crm.mapper.ApplicationMapper; -import com.pudonghot.ambition.crm.model.CustomerApplication; import com.pudonghot.ambition.crm.service.ApplicationService; import org.springframework.beans.factory.annotation.Autowired; import me.chyxion.tigon.service.support.BaseCrudServiceSupport; import org.springframework.transaction.annotation.Transactional; -import com.pudonghot.ambition.crm.mapper.ApplicationImageMapper; -import com.pudonghot.ambition.crm.mapper.CustomerApplicationMapper; +import com.pudonghot.ambition.crm.service.CustomerPermissionService; import com.pudonghot.ambition.crm.form.update.ApplicationFormForUpdate; import com.pudonghot.ambition.crm.form.create.ApplicationFormForCreate; import com.pudonghot.ambition.crm.form.create.ApplicationImageFormForCreate; @@ -44,7 +43,13 @@ public class ApplicationServiceSupport @Autowired private DiskFileApi fileApi; @Autowired + private CustomerMapper customerMapper; + @Autowired private CustomerApplicationMapper customerApplicationMapper; + @Autowired + private UserService userService; + @Autowired + private CustomerPermissionService customerPermissionService; /** * {@inheritDoc} @@ -68,9 +73,40 @@ public class ApplicationServiceSupport @Override public ViewModel update(final ApplicationFormForUpdate form) { final String updatedBy = form.getUpdatedBy(); - final Application application = validatePerm(form.getId(), updatedBy, form.isAdmin()); + final boolean admin = form.isAdmin(); + final Application application = validatePerm(form.getId(), updatedBy, admin); + final String oldOwner = application.getOwner(); + final String newOwner = form.getOwner(); form.copy(application); - if (!form.isAdmin()) { + + if (admin) { + final boolean hasOldOwner = StringUtils.isNotBlank(oldOwner); + final boolean hasNewOwner = StringUtils.isNotBlank(newOwner); + + if (hasOldOwner && !hasNewOwner) { + // removed + final String oldOwnerAccount = userService.findAccount(oldOwner); + iterateCustomerOfApplication(application.getId(), + customerId -> customerPermissionService.delete(customerId, oldOwnerAccount)); + } + else if (!hasOldOwner && hasNewOwner) { + // add + final String newOwnerAccount = userService.findAccount(newOwner); + iterateCustomerOfApplication(application.getId(), + customerId -> customerPermissionService.create(customerId, newOwnerAccount, updatedBy)); + } + else if (hasOldOwner && hasNewOwner && + !StringUtils.equals(oldOwner, newOwner)) { + // update + final String oldOwnerAccount = userService.findAccount(oldOwner); + final String newOwnerAccount = userService.findAccount(newOwner); + iterateCustomerOfApplication(application.getId(), customerId -> { + customerPermissionService.delete(customerId, oldOwnerAccount); + customerPermissionService.create(customerId, newOwnerAccount, updatedBy); + }); + } + } + else { application.setOwner(updatedBy); } return update(application); @@ -223,4 +259,21 @@ public class ApplicationServiceSupport "No permission to update application"); return application; } + + private List listCustomerOfApplication(final Search search) { + return customerMapper.listOfApplication(search.getAttr("appId"), search.offset(), search.limit()); + } + + private int countCustomerOfApplication(final Search search) { + return customerMapper.countOfApplication(search.getAttr("appId")); + } + + private void iterateCustomerOfApplication(final String appId, final Consumer consumer) { + scan(512, new Search().setAttr("appId", appId), + this::listCustomerOfApplication, + this::countCustomerOfApplication, customer -> { + consumer.accept(customer.getId()); + return false; + }); + } } diff --git a/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/CustomerPermissionServiceSupport.java b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/CustomerPermissionServiceSupport.java new file mode 100644 index 0000000..b2dcb18 --- /dev/null +++ b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/CustomerPermissionServiceSupport.java @@ -0,0 +1,56 @@ +package com.pudonghot.ambition.crm.service.support; + +import java.util.Date; +import lombok.extern.slf4j.Slf4j; +import me.chyxion.tigon.mybatis.Search; +import org.springframework.stereotype.Service; +import com.pudonghot.ambition.crm.model.CustomerPermission; +import me.chyxion.tigon.service.support.BaseCrudServiceSupport; +import com.pudonghot.ambition.crm.mapper.CustomerPermissionMapper; +import com.pudonghot.ambition.crm.service.CustomerPermissionService; + +/** + * @author Shaun Chyxion
+ * chyxion@163.com
+ * Apr 30, 2018 10:31:35 + */ +@Slf4j +@Service +public class CustomerPermissionServiceSupport + extends BaseCrudServiceSupport + implements CustomerPermissionService { + + /** + * {@inheritDoc} + */ + @Override + public void create(final String customerId, final String account, final String operator) { + if (mapper.find(new Search(CustomerPermission.CUSTOMER_ID, customerId) + .eq(CustomerPermission.USER_ACCOUNT, account)) == null) { + + final CustomerPermission permission = new CustomerPermission(); + permission.setId(idSeq.get()); + permission.setType(CustomerPermission.Type.APPLICATION); + permission.setCustomerId(customerId); + permission.setUserAccount(account); + permission.setEnabled(true); + permission.setCreatedBy(operator); + permission.setDateCreated(new Date()); + log.info("Insert customer permission [{}].", permission); + mapper.insert(permission); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void delete(final String customerId, final String account) { + log.info("remove customer [{}] account [{}] permission.", customerId, account); + mapper.delete(new Search(CustomerPermission.CUSTOMER_ID, customerId) + .eq(CustomerPermission.USER_ACCOUNT, account) + .eq(CustomerPermission.TYPE, CustomerPermission.Type.APPLICATION)); + } +} diff --git a/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/CustomerServiceSupport.java b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/CustomerServiceSupport.java index f6948df..b238770 100644 --- a/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/CustomerServiceSupport.java +++ b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/CustomerServiceSupport.java @@ -22,6 +22,7 @@ import com.pudonghot.ambition.crm.service.UserService; import com.pudonghot.ambition.crm.service.CustomerService; import org.springframework.beans.factory.annotation.Autowired; import com.pudonghot.ambition.crm.service.CustomerIssueService; +import com.pudonghot.ambition.crm.service.CustomerPermissionService; import com.pudonghot.ambition.crm.form.create.CustomerFormForCreate; import com.pudonghot.ambition.crm.form.update.CustomerFormForUpdate; import me.chyxion.tigon.service.support.BaseCrudByFormServiceSupport; @@ -42,6 +43,8 @@ public class CustomerServiceSupport @Autowired private UserService userService; @Autowired + private CustomerPermissionService customerPermissionService; + @Autowired private CustomerPermissionMapper customerPermissionMapper; @Autowired private CustomerIssueService customerIssueService; @@ -161,6 +164,10 @@ public class CustomerServiceSupport final String customerId = form.getId(); customerApplicationMapper.delete( new Search(CustomerApplication.CUSTOMER_ID, customerId)); + customerPermissionMapper.delete( + new Search(CustomerPermission.CUSTOMER_ID, customerId) + .eq(CustomerPermission.TYPE, CustomerPermission.Type.APPLICATION)); + final String[] applications = form.getApplications(); if (applications != null && applications.length > 0) { final String operator = form.getUpdatedBy(); @@ -172,13 +179,23 @@ public class CustomerServiceSupport "No application [" + applicationId + "] found"); Assert.state(application.isEnabled(), "Application [" + application.getName() + "] is disabled"); + final CustomerApplication customerApplication = new CustomerApplication(); customerApplication.setId(idSeq.get()); + customerApplication.setEnabled(true); customerApplication.setCustomerId(customerId); customerApplication.setApplicationId(applicationId); customerApplication.setCreatedBy(operator); customerApplication.setDateCreated(now); customerApplicationMapper.insert(customerApplication); + + final String applicationOwner = application.getOwner(); + if (StringUtils.isNotBlank(applicationOwner)) { + log.info("Add application owner [{}] customer [{}] permission.", + applicationOwner, customerId); + customerPermissionService.create(customerId, + userService.findAccount(applicationOwner), operator); + } } } return super.update(form); @@ -392,9 +409,10 @@ public class CustomerServiceSupport if (StringUtils.isNotBlank(account)) { final CustomerPermission permOld = customerPermissionMapper.find( - new Search(CustomerPermission.CUSTOMER_ID, customerId) - .eq(CustomerPermission.USER_ACCOUNT, account)); + new Search(CustomerPermission.CUSTOMER_ID, customerId) + .eq(CustomerPermission.USER_ACCOUNT, account)); if (permOld != null) { + permOld.setType(CustomerPermission.Type.SYSTEM); permOld.setUpdatedBy(operator); permOld.setDateUpdated(date); permOld.setEnabled(true); @@ -403,6 +421,7 @@ public class CustomerServiceSupport } else { permission.setId(idSeq.get()); + permission.setType(CustomerPermission.Type.SYSTEM); permission.setCustomerId(customerId); permission.setUserAccount(account); permission.setEnabled(true); diff --git a/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/UserServiceSupport.java b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/UserServiceSupport.java index 3d0a9b9..398b11d 100644 --- a/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/UserServiceSupport.java +++ b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/UserServiceSupport.java @@ -3,7 +3,6 @@ package com.pudonghot.ambition.crm.service.support; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.util.Assert; -import me.chyxion.tigon.mybatis.Search; import me.chyxion.tigon.model.ViewModel; import org.apache.commons.lang3.StringUtils; import com.pudonghot.ambition.crm.model.User; @@ -78,12 +77,12 @@ public class UserServiceSupport @Override public ViewModel updatePassword(final String userId, final UserFormForUpdatePassword form) { Assert.state(form.getPassword().equals(form.getConfirmPassword()), - "确认密码不匹配新密码"); + "Repeat password does not match"); final User user = mapper.find(userId); - Assert.state(user != null, "No User [" + userId + "] Found"); + Assert.state(user != null, "No user [" + userId + "] found"); Assert.state(hashPassword(userId, form.getOriginPassword()) - .equals((user.getPassword())), "原始密码错误"); + .equals((user.getPassword())), "Incorrect origin password"); user.setPassword(hashPassword(userId, form.getPassword())); return update(user); @@ -93,7 +92,17 @@ public class UserServiceSupport * {@inheritDoc} */ @Override - protected void beforeInsert(User model) { + public String findAccount(final String id) { + final User user = find(id); + Assert.state(user != null, "No user [" + id + "] found"); + return user.getAccount(); + } + + /** + * {@inheritDoc} + */ + @Override + protected void beforeInsert(final User model) { super.beforeInsert(model); model.setPassword(hashPassword(model.getId(), model.getPassword())); } diff --git a/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/CustomerMapper.java b/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/CustomerMapper.java index d03bf2f..baeb0ad 100644 --- a/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/CustomerMapper.java +++ b/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/CustomerMapper.java @@ -5,6 +5,8 @@ import java.util.List; import me.chyxion.tigon.mybatis.Search; import me.chyxion.tigon.mybatis.BaseMapper; import org.apache.ibatis.annotations.Param; + +import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import com.pudonghot.ambition.crm.model.Customer; import org.hibernate.validator.constraints.NotBlank; @@ -34,6 +36,30 @@ public interface CustomerMapper extends BaseMapper { @NotNull @Param("s") Search search, @Param("account") String account); + /** + * list customers of application + * @param appId app id + * @param offset offset + * @param limit limit + * @return customers + */ + List listOfApplication( + @NotBlank + @Param("appId") String appId, + @Min(0) + @Param("offset") int offset, + @Min(1) + @Param("limit") int limit); + + /** + * count customers of application + * @param appId app id + * @return customer count of application + */ + int countOfApplication( + @NotBlank + @Param("appId") String appId); + /** * count for show * @param search search diff --git a/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/CustomerMapper.xml b/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/CustomerMapper.xml index abe6796..0b68508 100644 --- a/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/CustomerMapper.xml +++ b/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/CustomerMapper.xml @@ -138,6 +138,25 @@ and (status is null or status in ('STATUS_ACTIVE', 'STATUS_OCCASIONAL')) + + + + + ${col} diff --git a/server/model/src/main/java/com/pudonghot/ambition/crm/model/CustomerPermission.java b/server/model/src/main/java/com/pudonghot/ambition/crm/model/CustomerPermission.java index bef7600..3b60a0c 100644 --- a/server/model/src/main/java/com/pudonghot/ambition/crm/model/CustomerPermission.java +++ b/server/model/src/main/java/com/pudonghot/ambition/crm/model/CustomerPermission.java @@ -20,9 +20,15 @@ public class CustomerPermission extends M3 { // Column Names public static final String USER_ACCOUNT = "user_account"; public static final String CUSTOMER_ID = "customer_id"; + public static final String TYPE = "type"; + + public enum Type { + SYSTEM, + APPLICATION + } // Properties private String customerId; private String userAccount; - + private Type type; }