add application customer permission

This commit is contained in:
Shaun Chyxion 2018-04-30 14:46:44 +08:00
parent cf0dc8c84e
commit db3b038bb3
9 changed files with 237 additions and 17 deletions

View File

@ -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 <br>
* chyxion@163.com <br>
* Apr 30, 2018 10:30:16
*/
public interface CustomerPermissionService
extends BaseCrudService<String,
CustomerPermission> {
/**
* 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);
}

View File

@ -45,5 +45,7 @@ public interface UserService
@NotNull ViewModel<User> updatePassword( @NotNull ViewModel<User> updatePassword(
@NotBlank String userId, @NotBlank String userId,
@Valid UserFormForUpdatePassword form); @Valid UserFormForUpdatePassword form);
@NotBlank String findAccount(@NotBlank String id);
} }

View File

@ -6,23 +6,22 @@ import java.util.ArrayList;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.function.Consumer;
import me.chyxion.tigon.mybatis.Search; import me.chyxion.tigon.mybatis.Search;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import me.chyxion.tigon.model.ViewModel; 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 org.springframework.stereotype.Service;
import com.pudonghot.ambition.file.DiskFileApi; import com.pudonghot.ambition.file.DiskFileApi;
import com.pudonghot.ambition.crm.model.FileInfo; import com.pudonghot.ambition.crm.service.UserService;
import com.pudonghot.ambition.crm.model.Application;
import org.springframework.web.multipart.MultipartFile; 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 com.pudonghot.ambition.crm.service.ApplicationService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import me.chyxion.tigon.service.support.BaseCrudServiceSupport; import me.chyxion.tigon.service.support.BaseCrudServiceSupport;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import com.pudonghot.ambition.crm.mapper.ApplicationImageMapper; import com.pudonghot.ambition.crm.service.CustomerPermissionService;
import com.pudonghot.ambition.crm.mapper.CustomerApplicationMapper;
import com.pudonghot.ambition.crm.form.update.ApplicationFormForUpdate; import com.pudonghot.ambition.crm.form.update.ApplicationFormForUpdate;
import com.pudonghot.ambition.crm.form.create.ApplicationFormForCreate; import com.pudonghot.ambition.crm.form.create.ApplicationFormForCreate;
import com.pudonghot.ambition.crm.form.create.ApplicationImageFormForCreate; import com.pudonghot.ambition.crm.form.create.ApplicationImageFormForCreate;
@ -44,7 +43,13 @@ public class ApplicationServiceSupport
@Autowired @Autowired
private DiskFileApi fileApi; private DiskFileApi fileApi;
@Autowired @Autowired
private CustomerMapper customerMapper;
@Autowired
private CustomerApplicationMapper customerApplicationMapper; private CustomerApplicationMapper customerApplicationMapper;
@Autowired
private UserService userService;
@Autowired
private CustomerPermissionService customerPermissionService;
/** /**
* {@inheritDoc} * {@inheritDoc}
@ -68,9 +73,40 @@ public class ApplicationServiceSupport
@Override @Override
public ViewModel<Application> update(final ApplicationFormForUpdate form) { public ViewModel<Application> update(final ApplicationFormForUpdate form) {
final String updatedBy = form.getUpdatedBy(); 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); 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); application.setOwner(updatedBy);
} }
return update(application); return update(application);
@ -223,4 +259,21 @@ public class ApplicationServiceSupport
"No permission to update application"); "No permission to update application");
return application; return application;
} }
private List<Customer> 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<String> consumer) {
scan(512, new Search().setAttr("appId", appId),
this::listCustomerOfApplication,
this::countCustomerOfApplication, customer -> {
consumer.accept(customer.getId());
return false;
});
}
} }

View File

@ -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 <br>
* chyxion@163.com <br>
* Apr 30, 2018 10:31:35
*/
@Slf4j
@Service
public class CustomerPermissionServiceSupport
extends BaseCrudServiceSupport<String,
CustomerPermission,
CustomerPermissionMapper>
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));
}
}

View File

@ -22,6 +22,7 @@ import com.pudonghot.ambition.crm.service.UserService;
import com.pudonghot.ambition.crm.service.CustomerService; import com.pudonghot.ambition.crm.service.CustomerService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import com.pudonghot.ambition.crm.service.CustomerIssueService; 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.create.CustomerFormForCreate;
import com.pudonghot.ambition.crm.form.update.CustomerFormForUpdate; import com.pudonghot.ambition.crm.form.update.CustomerFormForUpdate;
import me.chyxion.tigon.service.support.BaseCrudByFormServiceSupport; import me.chyxion.tigon.service.support.BaseCrudByFormServiceSupport;
@ -42,6 +43,8 @@ public class CustomerServiceSupport
@Autowired @Autowired
private UserService userService; private UserService userService;
@Autowired @Autowired
private CustomerPermissionService customerPermissionService;
@Autowired
private CustomerPermissionMapper customerPermissionMapper; private CustomerPermissionMapper customerPermissionMapper;
@Autowired @Autowired
private CustomerIssueService customerIssueService; private CustomerIssueService customerIssueService;
@ -161,6 +164,10 @@ public class CustomerServiceSupport
final String customerId = form.getId(); final String customerId = form.getId();
customerApplicationMapper.delete( customerApplicationMapper.delete(
new Search(CustomerApplication.CUSTOMER_ID, customerId)); 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(); final String[] applications = form.getApplications();
if (applications != null && applications.length > 0) { if (applications != null && applications.length > 0) {
final String operator = form.getUpdatedBy(); final String operator = form.getUpdatedBy();
@ -172,13 +179,23 @@ public class CustomerServiceSupport
"No application [" + applicationId + "] found"); "No application [" + applicationId + "] found");
Assert.state(application.isEnabled(), Assert.state(application.isEnabled(),
"Application [" + application.getName() + "] is disabled"); "Application [" + application.getName() + "] is disabled");
final CustomerApplication customerApplication = new CustomerApplication(); final CustomerApplication customerApplication = new CustomerApplication();
customerApplication.setId(idSeq.get()); customerApplication.setId(idSeq.get());
customerApplication.setEnabled(true);
customerApplication.setCustomerId(customerId); customerApplication.setCustomerId(customerId);
customerApplication.setApplicationId(applicationId); customerApplication.setApplicationId(applicationId);
customerApplication.setCreatedBy(operator); customerApplication.setCreatedBy(operator);
customerApplication.setDateCreated(now); customerApplication.setDateCreated(now);
customerApplicationMapper.insert(customerApplication); 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); return super.update(form);
@ -395,6 +412,7 @@ public class CustomerServiceSupport
new Search(CustomerPermission.CUSTOMER_ID, customerId) new Search(CustomerPermission.CUSTOMER_ID, customerId)
.eq(CustomerPermission.USER_ACCOUNT, account)); .eq(CustomerPermission.USER_ACCOUNT, account));
if (permOld != null) { if (permOld != null) {
permOld.setType(CustomerPermission.Type.SYSTEM);
permOld.setUpdatedBy(operator); permOld.setUpdatedBy(operator);
permOld.setDateUpdated(date); permOld.setDateUpdated(date);
permOld.setEnabled(true); permOld.setEnabled(true);
@ -403,6 +421,7 @@ public class CustomerServiceSupport
} }
else { else {
permission.setId(idSeq.get()); permission.setId(idSeq.get());
permission.setType(CustomerPermission.Type.SYSTEM);
permission.setCustomerId(customerId); permission.setCustomerId(customerId);
permission.setUserAccount(account); permission.setUserAccount(account);
permission.setEnabled(true); permission.setEnabled(true);

View File

@ -3,7 +3,6 @@ package com.pudonghot.ambition.crm.service.support;
import java.util.List; import java.util.List;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import me.chyxion.tigon.mybatis.Search;
import me.chyxion.tigon.model.ViewModel; import me.chyxion.tigon.model.ViewModel;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import com.pudonghot.ambition.crm.model.User; import com.pudonghot.ambition.crm.model.User;
@ -78,12 +77,12 @@ public class UserServiceSupport
@Override @Override
public ViewModel<User> updatePassword(final String userId, final UserFormForUpdatePassword form) { public ViewModel<User> updatePassword(final String userId, final UserFormForUpdatePassword form) {
Assert.state(form.getPassword().equals(form.getConfirmPassword()), Assert.state(form.getPassword().equals(form.getConfirmPassword()),
"确认密码不匹配新密码"); "Repeat password does not match");
final User user = mapper.find(userId); 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()) Assert.state(hashPassword(userId, form.getOriginPassword())
.equals((user.getPassword())), "原始密码错误"); .equals((user.getPassword())), "Incorrect origin password");
user.setPassword(hashPassword(userId, form.getPassword())); user.setPassword(hashPassword(userId, form.getPassword()));
return update(user); return update(user);
@ -93,7 +92,17 @@ public class UserServiceSupport
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override @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); super.beforeInsert(model);
model.setPassword(hashPassword(model.getId(), model.getPassword())); model.setPassword(hashPassword(model.getId(), model.getPassword()));
} }

View File

@ -5,6 +5,8 @@ import java.util.List;
import me.chyxion.tigon.mybatis.Search; import me.chyxion.tigon.mybatis.Search;
import me.chyxion.tigon.mybatis.BaseMapper; import me.chyxion.tigon.mybatis.BaseMapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import com.pudonghot.ambition.crm.model.Customer; import com.pudonghot.ambition.crm.model.Customer;
import org.hibernate.validator.constraints.NotBlank; import org.hibernate.validator.constraints.NotBlank;
@ -34,6 +36,30 @@ public interface CustomerMapper extends BaseMapper<String, Customer> {
@NotNull @Param("s") Search search, @NotNull @Param("s") Search search,
@Param("account") String account); @Param("account") String account);
/**
* list customers of application
* @param appId app id
* @param offset offset
* @param limit limit
* @return customers
*/
List<Customer> 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 * count for show
* @param search search * @param search search

View File

@ -138,6 +138,25 @@
and (status is null or status in ('STATUS_ACTIVE', 'STATUS_OCCASIONAL')) and (status is null or status in ('STATUS_ACTIVE', 'STATUS_OCCASIONAL'))
</select> </select>
<select id="listOfApplication" resultType="com.pudonghot.ambition.crm.model.Customer">
select <include refid="cols" />
from <include refid="table" />
join (select customer_id
from crm_customer_application
where application_id = #{appId}) app
on id = app.customer_id
limit #{offset}, #{limit}
</select>
<select id="countOfApplication" resultType="int">
select count(1)
from <include refid="table" /> c
join crm_customer_application ca
on c.id = ca.customer_id
where ca.application_id = #{appId}
</select>
<sql id="showCols"> <sql id="showCols">
<foreach collection="new com.pudonghot.ambition.crm.model.Customer().cols('customer')" item="col" separator=", "> <foreach collection="new com.pudonghot.ambition.crm.model.Customer().cols('customer')" item="col" separator=", ">
${col} ${col}

View File

@ -20,9 +20,15 @@ public class CustomerPermission extends M3<String, String> {
// Column Names // Column Names
public static final String USER_ACCOUNT = "user_account"; public static final String USER_ACCOUNT = "user_account";
public static final String CUSTOMER_ID = "customer_id"; public static final String CUSTOMER_ID = "customer_id";
public static final String TYPE = "type";
public enum Type {
SYSTEM,
APPLICATION
}
// Properties // Properties
private String customerId; private String customerId;
private String userAccount; private String userAccount;
private Type type;
} }