package cn.com.ty.lift.system.settings.service.impl;

import cn.com.ty.lift.common.constants.ApiConstants;
import cn.com.ty.lift.system.settings.dao.entity.GlobalSet;
import cn.com.ty.lift.system.settings.dao.mapper.GlobalSetMapper;
import cn.com.ty.lift.system.settings.service.GlobalSetService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 全局设置 服务实现类
 * </p>
 *
 * @author wang-hai-cheng
 * @since 2019-12-13
 */
@Service
public class GlobalSetServiceImpl extends ServiceImpl<GlobalSetMapper, GlobalSet> implements GlobalSetService {
    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    @Override
    public boolean teamInitSetting(Long companyId) {
        List<GlobalSet> globalSetList = new ArrayList<>();
        //初始化默认值
        /**
         * 名称:1.项目组维保工是否能查看到项目的所有电梯，并接收该项目所有维保任务
         * 类型:项目设置 值为1
         * 选项:a.(1)是
         *     b.(0)否
         *     默认值:(1)是
         */
        globalSetList.add(new GlobalSet(companyId,
                ApiConstants.GlobalSetConstants.VALUE_NO,
                ApiConstants.GlobalSetConstants.WORK_LIFT));
        /**
         * 名称:2.维保类型选项
         * 类型:电梯保养设置 值为2
         * 选项:a.(1)维保工按默认规则在APP选择保养类型
         *     b.(2)维保文员指定维保计划和维保类型，维保工无需选择
         *     默认值:2:文员选择
         */
        globalSetList.add(new GlobalSet(companyId,
                ApiConstants.GlobalSetConstants.MT_CLERK_CHOOSE,
                ApiConstants.GlobalSetConstants.MT_TYPE_OPTION));

        /**
         * 名称:3.可同时签到保养的台量
         * 类型:电梯保养设置 值为2
         * 数值:可同时签到保养的台量
         *     默认值:1
         */
        globalSetList.add(new GlobalSet(companyId,
                1,
                ApiConstants.GlobalSetConstants.MT_SAME_UNITS));

        /**
         * 名称:4.签退时，是否需要定位
         * 类型:电梯保养设置 值为2
         * 选项:a.(1)是
         *     b.(0)否
         *     默认值:(0)否
         */
        globalSetList.add(new GlobalSet(companyId,
                ApiConstants.GlobalSetConstants.VALUE_NO,
                ApiConstants.GlobalSetConstants.SIGN_OUT_LOCATE));
        /**
         * 名称:5.保养单是否显示停梯时间和恢复时间
         * 类型:电梯保养设置 值为2
         * 选项:a.(1)是
         *     b.(0)否
         *     默认值:(0)否
         */
        globalSetList.add(new GlobalSet(companyId,
                ApiConstants.GlobalSetConstants.VALUE_NO,
                ApiConstants.GlobalSetConstants.SHOW_LIFT_TIME));
        /**
         * 名称:6.默认维保间隔
         * 类型:电梯保养设置 值为2
         * 数值:默认维保间隔天数
         *     默认值:15
         */
        globalSetList.add(new GlobalSet(companyId,
                15,
                ApiConstants.GlobalSetConstants.MT_INTERVAL));
        /**
         * 名称:7.补录权限
         * 类型:电梯保养设置 值为2
         * 选项:a.(1)文员补录
         *     b.(2)文员维保工均可补录
         *     默认值:(1)文员补录
         */
        globalSetList.add(new GlobalSet(companyId,
                ApiConstants.GlobalSetConstants.CLERK_ADD,
                ApiConstants.GlobalSetConstants.ADD_AUTHORITY));

        //团队申请通过，将全局设置数据存入redis
        saveToRedis(globalSetList, companyId);
        //将全局数据存入mysql数据库
        return this.saveBatch(globalSetList);
    }

    /**
     * 团队申请通过，将全局设置数据更新进redis
     *
     * @param globalSetList
     * @param companyId
     */
    public void saveToRedis(List<GlobalSet> globalSetList, Long companyId) {
        redisTemplate.executePipelined((RedisCallback<String>) connection -> {
            for (GlobalSet globalSet : globalSetList) {
                String code = globalSet.getCode();
                connection.hSet((companyId + "_globalSet").getBytes(), code.getBytes(), globalSet.getValue().toString().getBytes());
            }
            return null;
        });
    }
}
