UserServiceImpl.java 13 KB
package com.uccc.admin.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.uccc.admin.config.RabbitMQConfig;
import com.uccc.admin.domain.Permission;
import com.uccc.admin.exception.ApiException;
import com.uccc.admin.mapper.UserMapper;
import com.uccc.admin.service.PermissionService;
import com.uccc.admin.service.RoleService;
import com.uccc.admin.service.UserService;
import com.uccc.admin.service.WebsiteService;
import com.uccc.pretty.common.*;
import com.uccc.pretty.constants.ErrorCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;

import static com.uccc.pretty.constants.ResultEnum.RESULT_OK;


/**
 * Created by bert on 2018/12/4.
 */
@Service
public class UserServiceImpl implements UserService {

    final private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Autowired
    private RoleService roleService;

    @Autowired
    private PermissionService permissionService;

    @Autowired
    private WebsiteService websiteService;

    @Value("${zhexi.url}")
    private String url;

    final private RestTemplate restTemplate = new RestTemplate();
    private static int codeCount = 4;

    public static SimpleDateFormat sdf1 = new SimpleDateFormat("MM-dd");
    public static SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
    public static SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");


    @Override
    public void sendSystemLogToRabbitMq(String systemLog) throws NullPointerException{
        try {
           this.rabbitTemplate.convertAndSend(RabbitMQConfig.PRETTY_ADMIN, systemLog);
        }catch (AmqpException e) {
           logger.error("Send Rabbitmq message err", e.getMessage());
        }
    }

    @Override
    public User getUserByCondition(User user) {
        return userMapper.selectUserByCondition(user);
    }

    @Override
    public boolean updateUser(User user) {
        if (user.getRoleIds() != null) {
            if (user.getRoleIds().length > 0) {
                int[] roleIds = user.getRoleIds();
                AtomicBoolean delRes = new AtomicBoolean(true);
                int roleDeleteRes = roleService.deleteRoleByUser(user);
                if (!(roleDeleteRes > 0)) {
                    delRes.set(false);
                }
                Arrays.stream(roleIds).forEach(d->{
                    int roleCreateRes = roleService.createUserRoleByUserId(user.getId(), d);
                    if (!(roleCreateRes > 0)) {
                        delRes.set(false);
                    }
                });
                if (!delRes.get()) {
                    return false;
                }
            }
        }
        int res = userMapper.updateUser(user);
        if (res > 0) {
            return true;
        }else {
            return false;
        }
    }

    @Override
    public List<UserEntity> getUserListByCondition(User user) {
        List<User> users = userMapper.selectUserListByCondition(user);
        logger.info("user len:{}", users.size());
        List<UserEntity> userEntities = new ArrayList<>();
        users.forEach(d->{
            List<Permission> permissionList = permissionService.getPermissionByUserId(d.getId());
            if (permissionList.size() == 0) {
                throw new ApiException(ErrorCode.USER_PERMISSION_NOT_FOUND);
            }else {
                JSONArray jsonArray = permissionService.formatPermissions(permissionList);
                d.setPermission(jsonArray);
            }
            List<Role> roles = roleService.getRoleByUserId(d.getId());
//            if (!(roles.size() > 0)) throw new ApiException(ErrorCode.SERVER_ERROR);
            d.setRoleNames(roles);
            if (d.getStoreId() != null) {
                Store store = checkStoreByMid(Long.valueOf(d.getStoreId()));
                d.setStore(store);
            }
            String jsonString = JSONObject.toJSONString(d);
            UserEntity userEntity = JSONObject.parseObject(jsonString,UserEntity.class);
            userEntities.add(userEntity);
        });
        return userEntities;
    }

    @Override
    public int checkAccountRepeat(String account) {
        return userMapper.checkAccountRepeat(account);
    }

    @Override
    public boolean createUser(User user, int[] roles) {
        int result = userMapper.createUser(user);
        User cUser = new User();
        if (result == 1) {
            cUser.setAccount(user.getAccount());
            cUser = getUserByCondition(cUser);
        }else {
            return false;
        }
        logger.info("create user_id:{}", cUser.getId());
        AtomicBoolean roleResult = new AtomicBoolean(true);
        User finalCUser = cUser;
        Arrays.stream(roles).forEach(d->{
            long roleResultTemp = roleService.createUserRoleByUserId(finalCUser.getId(), d);
            if (!(roleResultTemp > 0)) {
                roleResult.set(false);
            }
        });
        if (roleResult.get()) {
            return true;
        }else {
            return false;
        }

    }

    @Override
    public boolean deleteUser(User user) {
        //pretend to delete
        int deleteUserCount = userMapper.deleteUserByUserId(user);
        if (!(deleteUserCount > 0)) {
            return false;
        }
        return true;
    }

    @Override
    public int getUserListCountByCondition(User user) {
        return userMapper.selectUserListCountByCondition(user);

    }

    @Override
    public Store checkStoreByMid(Long mid) {
        Store store = userMapper.checkStoreByMid(mid);
        String fileHost = websiteService.getConfigValue("file_host");
        if (store.getServiceUrl() != null) {
            store.setServiceUrl(fileHost + store.getServiceUrl());
        }
        if (store.getLogoUrl() != null) {
            store.setLogoUrl(fileHost + store.getLogoUrl());
        }
        return store;
    }

    @Override
    public int createStore(Store store) {
        return userMapper.createStore(store);
    }

    @Override
    public int checkStoreNameRepeat(String name) {
        return userMapper.checkStoreNameRepeat(name);
    }

    @Override
    public Store findStoreByName(String name) {
        return userMapper.SelectStoreByName(name);
    }

    @Override
    public int updateStore(Store store) {
        return userMapper.updateStore(store);
    }

    @Override
    public List<StoreEntity> getStoreByCondition(Store store, Integer limit, Integer offset) {
        List<StoreEntity> storeEntities = userMapper.selectStoreByCondition(store, limit, offset);
        String fileHost = websiteService.getConfigValue("file_host");
        storeEntities.forEach(d->{
            if (d.getServiceUrl() != null) {
                d.setServiceUrl(fileHost + d.getServiceUrl());
            }
            if (d.getLogoUrl() != null) {
                d.setLogoUrl(fileHost + d.getLogoUrl());
            }

        });
        return storeEntities;
    }

    @Override
    public int getStoreCountByCondition(Store store) {
        return userMapper.selectStoreCountByCondition(store);
    }

    @Override
    public JSONArray getSoldNumberCountData() {
        JSONArray jsonArray = new JSONArray();

        for (int i=-9;i<=0;i++) {
            JSONObject jsonObject = new JSONObject();
            Date day = getBeforeOrAfterDate(new Date(),i);
            jsonObject.put("day", sdf1.format(day));
            String startTime = sdf2.format(day) + " 00:00:00";
            String endTime = sdf2.format(day) + " 23:59:59";
            Date startDate = new Date();
            Date endDate = new Date();
            try {
                startDate = sdf3.parse(startTime);
                endDate = sdf3.parse(endTime);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            logger.info("count:{}", startDate);
            int count = userMapper.selectSoldNumberByDay(startDate, endDate);
            logger.info("count:{}", count);
            jsonObject.put("count", count);
            jsonArray.add(jsonObject);
        }
        return jsonArray;
    }

    @Override
    public JSONArray getDailyAmount() {
        JSONArray jsonArray = new JSONArray();
        for (int i=-9;i<=0;i++) {
            JSONObject jsonObject = new JSONObject();
            Date day = getBeforeOrAfterDate(new Date(),i);
            jsonObject.put("day", sdf1.format(day));
            String startTime = sdf2.format(day) + " 00:00:00";
            String endTime = sdf2.format(day) + " 23:59:59";
            Date startDate = new Date();
            Date endDate = new Date();
            try {
                startDate = sdf3.parse(startTime);
                endDate = sdf3.parse(endTime);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            BigDecimal count = userMapper.selectDailyAmount(startDate, endDate);
            if (count == null) {
                jsonObject.put("amount", 0.00);
            }else {
                jsonObject.put("amount", count);
            }
            jsonArray.add(jsonObject);
        }
        return jsonArray;
    }

    @Override
    public int getPendingOrderCount() {
        return userMapper.selectPendingOrderCount();
    }

    @Override
    public int getPendingStoreCount() {
        return userMapper.selectPendingStoreCount();
    }

    @Override
    public BigDecimal getTodayTurnover() {
        Date day = getBeforeOrAfterDate(new Date(),0);
        String startTime = sdf2.format(day) + " 00:00:00";
        String endTime = sdf2.format(day) + " 23:59:59";
        Date startDate = new Date();
        Date endDate = new Date();
        try {
            startDate = sdf3.parse(startTime);
            endDate = sdf3.parse(endTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        BigDecimal count = userMapper.selectDailyAmount(startDate, endDate);
        if (count == null ){
            count = BigDecimal.ZERO;
        }
        return count;
    }

    @Override
    public String getCodeCts(String mobile) {
        return userMapper.selectCodeCts(mobile);
    }

    @Override
    public Result send(String mobile) {
        //查询是否在五分钟内
        String iscode = userMapper.selectCodeCts(mobile);
        if(!StringUtils.isEmpty(iscode)) {
            return new Result(ErrorCode.SEND_FAILED.getCode(), ErrorCode.SEND_FAILED.getMessage());
        }
        String code = getCode();
        String content = "你的验证码是" + code + ",如非本人操作,请忽略短信。【泽熙通信】";
        //获取验证码
        String url_new = String.format(url, content, mobile);
        logger.info("send sms url: {}", url_new);
        ResponseEntity<String> responseEntity = restTemplate.getForEntity(url_new, String.class);
        System.out.println(responseEntity);
        final HttpStatus statusCode = responseEntity.getStatusCode();
        if (HttpStatus.OK == statusCode) {
            logger.info("send register sms result: {}", responseEntity.getBody());
            JSONObject jsonObject = JSONObject.parseObject(responseEntity.getBody());
            if (!(0 == (int)jsonObject.get("status"))) {
                return new Result((int)jsonObject.get("status"), (String)jsonObject.get("desc"));
            }
            //保存
            int codeCount = userMapper.selectCodeCountByMobile(mobile);
            if (codeCount > 0) {//update
                userMapper.updateCode(mobile, code);
            }else { //insert
                userMapper.saveCode(mobile, code);
            }
        }
        return new Result(RESULT_OK.getCode(), RESULT_OK.getMessage());
    }

    @Override
    public int checkPhoneRepeat(String phone) {
        return userMapper.checkPhoneRepeat(phone);
    }

    public static Date getBeforeOrAfterDate(Date date, int num) {
        Calendar calendar = Calendar.getInstance();//获取日历
        calendar.setTime(date);//当date的值是当前时间,则可以不用写这段代码。
        calendar.add(Calendar.DATE, num);
        Date d = calendar.getTime();//把日历转换为Date
        return d;
    }

    private String getCode() {
        StringBuffer randomCode = new StringBuffer();
        for (int i = 0; i < codeCount; i++) {

            String code = String.valueOf(new Random().nextInt(9));
            // 将产生的四个随机数组合在一起。
            randomCode.append(code);
        }
        return randomCode.toString();
    }

}