package com.doumee.biz.zbom.impl; 
 | 
  
 | 
import com.alibaba.fastjson.JSONObject; 
 | 
import com.auth0.jwt.JWT; 
 | 
import com.auth0.jwt.algorithms.Algorithm; 
 | 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 
 | 
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; 
 | 
import com.doumee.biz.zbom.ZbomIAMService; 
 | 
import com.doumee.biz.zbom.model.*; 
 | 
import com.doumee.core.constants.ResponseStatus; 
 | 
import com.doumee.core.exception.BusinessException; 
 | 
import com.doumee.core.utils.Constants; 
 | 
import com.doumee.core.utils.DateUtil; 
 | 
import com.doumee.dao.business.*; 
 | 
import com.doumee.dao.business.model.*; 
 | 
import org.apache.commons.lang3.StringUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.beans.factory.annotation.Value; 
 | 
import org.springframework.data.redis.core.RedisTemplate; 
 | 
import org.springframework.scheduling.annotation.Async; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
  
 | 
import java.util.*; 
 | 
  
 | 
/** 
 | 
 * 人员信息表Service实现 
 | 
 * @author 江蹄蹄 
 | 
 * @date 2023/11/30 15:33 
 | 
 */ 
 | 
@Service 
 | 
public class ZbomIAMServiceImpl implements ZbomIAMService { 
 | 
  
 | 
    @Autowired 
 | 
    private UsersMapper usersMapper; 
 | 
    @Autowired 
 | 
    private ShopMapper shopMapper; 
 | 
    @Autowired 
 | 
    private CategorySegMapper categorySegMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private RedisTemplate<String, Object> redisTemplate; 
 | 
    @Autowired 
 | 
    private IamInterfaceLogMapper iamInterfaceLogMapper; 
 | 
    @Autowired 
 | 
    private SegmentsMapper segmentsMapper; 
 | 
    /** 
 | 
     * 是否开发者 
 | 
     */ 
 | 
    @Value("${debug_model}") 
 | 
    private Boolean isDebug; 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 初始化同步用户 
 | 
     * @param params 
 | 
     */ 
 | 
    @Override 
 | 
    public void startUserInit(String params) { 
 | 
    } 
 | 
    /** 
 | 
     * 初始化同步用户 
 | 
     * @param params 
 | 
     */ 
 | 
    @Override 
 | 
    public void startOrgInit(String params) { 
 | 
    } 
 | 
    @Override 
 | 
    @Transactional(rollbackFor = {BusinessException.class,Exception.class}) 
 | 
    public void updateShopInfo(String token, String uuid, String timestamp, List<IamUpateShopModel> shopList) { 
 | 
        if(shopList == null ||shopList.size() == 0){ 
 | 
            return; 
 | 
        } 
 | 
        isValidToken(uuid,timestamp,token); 
 | 
        List<Shop> addShops = new ArrayList<>(); 
 | 
        List<Shop> updateShops = new ArrayList<>(); 
 | 
        List<String> segDelOrgIds = new ArrayList<>(); 
 | 
        List<CategorySeg> categorySegList = new ArrayList<>(); 
 | 
        List<Segments> segmentsList = new ArrayList<>(); 
 | 
        Date date  = new Date(); 
 | 
        for(IamUpateShopModel model : shopList){ 
 | 
            Shop shop = shopMapper.selectOne(new QueryWrapper<Shop>().lambda() 
 | 
                    .eq(Shop::getOrgId,model.getIdtOrgId()) 
 | 
                    .last("limit 1")); 
 | 
            if(shop == null){ 
 | 
                shop = new Shop(); 
 | 
                shop.setCreateDate(date); 
 | 
                addShops.add(initShopInfo(shop,model,date)); 
 | 
            }else { 
 | 
                segDelOrgIds.add(shop.getCode()); 
 | 
                updateShops.add(initShopInfo(shop,model,date)); 
 | 
            } 
 | 
            //处理品类数据逻辑 
 | 
            dealCategorySegData(date,shop,model.getCategory(),categorySegList,segmentsList); 
 | 
        } 
 | 
  
 | 
        if(addShops.size()>0){ 
 | 
            shopMapper.insert(addShops); 
 | 
        } 
 | 
        if(updateShops.size()>0){ 
 | 
            for (Shop shop :updateShops){ 
 | 
                shopMapper.updateById(shop); 
 | 
            } 
 | 
        } 
 | 
        if(segDelOrgIds.size()>0){ 
 | 
            categorySegMapper.delete(new UpdateWrapper<CategorySeg>().lambda() .in(CategorySeg::getOrgId,segDelOrgIds)); 
 | 
        } 
 | 
        if(categorySegList.size()>0){ 
 | 
            categorySegMapper.insert(categorySegList); 
 | 
        } 
 | 
        if(segmentsList.size()>0){ 
 | 
            segmentsMapper.insert(segmentsList); 
 | 
        } 
 | 
    } 
 | 
    private void dealSegmentData(Date date, IamCategoryModel model, Shop shop, List<Segments> segmentsList) { 
 | 
        if(StringUtils.isNotBlank(model.getSegment1())){ 
 | 
            //如果战区不为空 
 | 
            if(newSegment(model.getSegment1(),Constants.ZERO,segmentsList) 
 | 
                    && segmentsMapper.selectCount(new QueryWrapper<Segments>().lambda() 
 | 
                    .eq(Segments::getSegmentId,model.getSegment1()) 
 | 
                    .eq(Segments::getUnitCode,model.getUnitCode()) 
 | 
                    .eq(Segments::getType,Constants.ZERO)) ==0){ 
 | 
                segmentsList.add(initSegmentData(model,date,Constants.ZERO)); 
 | 
            } 
 | 
        } 
 | 
        if(StringUtils.isNotBlank(model.getSegment2())){ 
 | 
            //如果省区不为空 
 | 
            if(newSegment(model.getSegment2(),Constants.ONE,segmentsList) && segmentsMapper.selectCount(new QueryWrapper<Segments>().lambda() 
 | 
                    .eq(Segments::getSegmentId,model.getSegment2()) 
 | 
                    .eq(Segments::getParentId,model.getSegment1()) 
 | 
                    .eq(Segments::getUnitCode,model.getUnitCode()) 
 | 
                    .eq(Segments::getType,Constants.ONE)) ==0){ 
 | 
                segmentsList.add(initSegmentData(model,date,Constants.ONE)); 
 | 
            } 
 | 
        } 
 | 
        if(StringUtils.isNotBlank(model.getSegment3())){ 
 | 
            //如果片区不为空 
 | 
            if(newSegment(model.getSegment3(),Constants.TWO,segmentsList) && segmentsMapper.selectCount(new QueryWrapper<Segments>().lambda() 
 | 
                    .eq(Segments::getSegmentId,model.getSegment3()) 
 | 
                    .eq(Segments::getUnitCode,model.getUnitCode()) 
 | 
                    .eq(Segments::getParentId,model.getSegment2()) 
 | 
                    .eq(Segments::getType,Constants.TWO)) ==0){ 
 | 
                segmentsList.add(initSegmentData(model,date,Constants.TWO)); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private boolean newSegment(String segId2, int one, List<Segments> segmentsList) { 
 | 
        for(Segments s : segmentsList){ 
 | 
            if(StringUtils.equals(s.getSegmentId(),segId2) && Constants.equalsInteger(one,s.getType())){ 
 | 
                return false; 
 | 
            } 
 | 
        } 
 | 
        return true; 
 | 
    } 
 | 
  
 | 
    private Segments initSegmentData(IamCategoryModel model, Date date,  int type) { 
 | 
        Segments data = new Segments(); 
 | 
        data.setCreateDate(date); 
 | 
        data.setEditDate(date); 
 | 
        data.setIsdeleted(Constants.ZERO); 
 | 
        data.setStatus(Constants.ZERO); 
 | 
        data.setUnitCode(model.getUnitCode()); 
 | 
        data.setType(type); 
 | 
        if(type ==Constants.ZERO){ 
 | 
            data.setName(model.getMeaning1()); 
 | 
            data.setSegmentId(model.getSegment1()); 
 | 
            data.setParentId(null); 
 | 
            data.setRemark(model.getMeaning1()); 
 | 
        }else if(type ==Constants.ONE){ 
 | 
            data.setName(model.getMeaning2()); 
 | 
            data.setSegmentId(model.getSegment2()); 
 | 
            data.setParentId(model.getSegment1()); 
 | 
            data.setRemark(model.getMeaning1()+"/"+model.getMeaning2()); 
 | 
        }else{ 
 | 
            data.setName(model.getMeaning3()); 
 | 
            data.setSegmentId(model.getSegment3()); 
 | 
            data.setParentId(model.getSegment2()); 
 | 
            data.setRemark(model.getMeaning1()+"/"+model.getMeaning2()+"/"+model.getMeaning3()); 
 | 
        } 
 | 
        return data; 
 | 
    } 
 | 
    private void dealCategorySegData(Date date, Shop shop, List<IamCategoryModel> categoryModels, List<CategorySeg> categorySegList, List<Segments> segmentsList) { 
 | 
       if(categoryModels==null || categoryModels.size() ==0){ 
 | 
           return; 
 | 
       } 
 | 
       for(IamCategoryModel model :categoryModels){ 
 | 
           dealSegmentData(date,model,shop,segmentsList); 
 | 
           categorySegList.add(initInsertCategorySeg(date,model,shop)); 
 | 
       } 
 | 
    } 
 | 
    private CategorySeg initInsertCategorySeg(Date date, IamCategoryModel model, Shop shop) { 
 | 
        CategorySeg data = new CategorySeg(); 
 | 
        data.setCreateDate(date); 
 | 
        data.setEditDate(date); 
 | 
        data.setIsdeleted(Constants.ZERO); 
 | 
        data.setOrgId(shop.getCode()); 
 | 
        data.setSegId(model.getSegment1()); 
 | 
        data.setSegId2(model.getSegment2()); 
 | 
        data.setSegId3(model.getSegment3()); 
 | 
        data.setSegName(model.getMeaning1()); 
 | 
        data.setSegName2(model.getMeaning2()); 
 | 
        data.setSegName3(model.getMeaning3()); 
 | 
        data.setShipToAddress(model.getShipToAddress()); 
 | 
        data.setShipToPhone(model.getShipToPhone()); 
 | 
        data.setShipToPerson(model.getShipToPerson()); 
 | 
        data.setBrandId(model.getAccountSiteId()); 
 | 
        data.setUnitCode(model.getUnitCode()); 
 | 
        data.setSiteCode(model.getSiteCode()); 
 | 
        data.setScode(model.getRelevanceCode()); 
 | 
        if(shop.getSiteCode() ==null){ 
 | 
            shop.setSiteCode(""); 
 | 
        } 
 | 
        shop.setSiteCode(shop.getSiteCode()+model.getSiteCode()+";"); 
 | 
        return data; 
 | 
    } 
 | 
  
 | 
    private Shop initShopInfo(Shop shop, IamUpateShopModel model, Date date) { 
 | 
        shop.setEditDate(date); 
 | 
        shop.setOrgId(model.getIdtOrgId()); 
 | 
        shop.setName(model.getIdtOrgName()); 
 | 
        shop.setCode(model.getIdtOrgCode()); 
 | 
        shop.setType(model.getIdtOrgFirstLevelType()); 
 | 
  
 | 
        shop.setStatus(Constants.parseIntByStr(model.getIdtOrgStatus())); 
 | 
        shop.setSecondType(model.getIdtOrgSecondLevelType()); 
 | 
        shop.setAttribute(model.getIdtOrgAttribute()); 
 | 
        if(model.getScode()!=null){ 
 | 
            shop.setCountry(model.getScode().getCountry()); 
 | 
            shop.setProvinceName(model.getScode().getProvinceName()); 
 | 
            shop.setProvinceCode(model.getScode().getProvinceNum()); 
 | 
            shop.setCityName(model.getScode().getCityName()); 
 | 
            shop.setCityCode(model.getScode().getCityNum()); 
 | 
            shop.setAreaName(model.getScode().getCountyName()); 
 | 
            shop.setAreaCode(model.getScode().getCountyNum()); 
 | 
            shop.setTown(model.getScode().getTown()); 
 | 
            shop.setGlCode(model.getScode().getRelevanceCodeGL()); 
 | 
            shop.setGlName(model.getScode().getRelevanceNameGL()); 
 | 
            shop.setZcode(model.getScode().getRelevanceZCode()); 
 | 
        } 
 | 
        if(model.getFcode()!=null){ 
 | 
            shop.setScode(model.getFcode().getRelevanceCode()); 
 | 
            shop.setCountry(model.getFcode().getCountry()); 
 | 
            shop.setProvinceName(model.getFcode().getProvinceName()); 
 | 
            shop.setProvinceCode(model.getFcode().getProvinceNum()); 
 | 
            shop.setCityName(model.getFcode().getCityName()); 
 | 
            shop.setCityCode(model.getFcode().getCityNum()); 
 | 
            shop.setAreaName(model.getFcode().getCountyName()); 
 | 
            shop.setAreaCode(model.getFcode().getCountyNum()); 
 | 
            shop.setTown(model.getFcode().getTown()); 
 | 
            shop.setRegAddr(model.getFcode().getRegistrationAddress()); 
 | 
            shop.setLegalPhone(model.getFcode().getContactPhone()); 
 | 
            shop.setLegalName(model.getFcode().getLegalPerson()); 
 | 
            shop.setLegalIdcode(model.getFcode().getLegalIdentification()); 
 | 
        } 
 | 
        if(model.getShop()!=null){ 
 | 
            shop.setUnitCode(model.getShop().getUnitCode()); 
 | 
            shop.setScode(model.getShop().getRelevanceCode()); 
 | 
            shop.setFcode(model.getShop().getAccountNumber()); 
 | 
        } 
 | 
        if(StringUtils.equals( model.getIdtOrgStatus(),"-1")){ 
 | 
            shop.setIsdeleted(Constants.ONE); 
 | 
        }else{ 
 | 
            shop.setIsdeleted(Constants.ZERO); 
 | 
        } 
 | 
        shop.setParentIamId(model.getIdtOrgParentId()); 
 | 
        return  shop; 
 | 
    } 
 | 
  
 | 
    private void isValidToken(String uuid, String timestamp, String token) { 
 | 
        if(isDebug){ 
 | 
            return; 
 | 
        } 
 | 
        if (!StringUtils.equalsIgnoreCase( getToken( uuid, timestamp), token)) { 
 | 
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,token错误~"); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    @Transactional(rollbackFor = {BusinessException.class,Exception.class}) 
 | 
    public void updateUserInfo(String token, String uuid, String timestamp, IamUpateUserModel upateUserModel){ 
 | 
        if(upateUserModel == null ||upateUserModel.getIdtUserId() == null){ 
 | 
            return; 
 | 
        } 
 | 
        isValidToken(uuid,timestamp,token); 
 | 
  
 | 
        Users users = usersMapper.selectOne(new QueryWrapper<Users>().lambda() 
 | 
                .eq(Users::getIamId,upateUserModel.getIdtUserId()) 
 | 
                .last("limit 1")); 
 | 
        if(users == null){ 
 | 
            users = initUserModel(users,upateUserModel); 
 | 
            usersMapper.insert(users); 
 | 
        }else { 
 | 
            users = initUserModel(users,upateUserModel); 
 | 
            usersMapper.updateById(users); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private Users initUserModel(Users users, IamUpateUserModel upateUserModel) { 
 | 
        if(users == null){ 
 | 
            users = new Users(); 
 | 
            users.setCreateDate(new Date()); 
 | 
        } 
 | 
        users.setEditDate(new Date()); 
 | 
        users.setSex(upateUserModel.getIdtUserGender()); 
 | 
        users.setIamUsername(upateUserModel.getAppAccountNo()); 
 | 
        users.setCode(upateUserModel.getIdtUserWorkNo()); 
 | 
        users.setName(upateUserModel.getIdtUserName()); 
 | 
        users.setPassword(upateUserModel.getAppAccountPwd()); 
 | 
        users.setPhone(upateUserModel.getIdtUserMobile()); 
 | 
        users.setIamId(upateUserModel.getIdtUserId()); 
 | 
        users.setStatus(upateUserModel.getAppAccountStatus()); 
 | 
        users.setIsdeleted(Constants.ZERO); 
 | 
        users.setRemark(JSONObject.toJSONString(upateUserModel)); 
 | 
        users.setRoleNames(null); 
 | 
        users.setRoleCodes(null); 
 | 
        users.setCardImg("-"); 
 | 
        users.setRoleIds(null); 
 | 
        users.setUserTypes(null); 
 | 
        if( upateUserModel.getUserTypes() !=null){ 
 | 
            for(IamUserTypeModel type : upateUserModel.getUserTypes()){ 
 | 
                if(StringUtils.isBlank(users.getUserTypes())){ 
 | 
                    users.setUserTypes(""); 
 | 
                } 
 | 
                users.setUserTypes(users.getUserTypes()+"["+type.getIdtUserTypeCode()+"];"); 
 | 
            } 
 | 
        } 
 | 
        if( upateUserModel.getRoles() !=null){ 
 | 
            for(IamUserRoleModel t : upateUserModel.getRoles()){ 
 | 
                if(StringUtils.isBlank(users.getRoleIds())){ 
 | 
                    users.setRoleIds(""); 
 | 
                } 
 | 
                if(StringUtils.isBlank(users.getRoleNames())){ 
 | 
                    users.setRoleNames(""); 
 | 
                } 
 | 
                if(StringUtils.isBlank(users.getRoleCodes())){ 
 | 
                    users.setRoleCodes(""); 
 | 
                } 
 | 
                users.setRoleIds(users.getRoleIds()+"["+t.getId()+"];"); 
 | 
                users.setRoleNames(users.getRoleNames()+"["+t.getName()+"];"); 
 | 
                users.setRoleCodes(users.getRoleCodes()+"["+t.getCode()+"];"); 
 | 
            } 
 | 
        } 
 | 
        if(upateUserModel.getJobs()!=null){ 
 | 
            String orgId = null; 
 | 
            for(IamUserJobModel job : upateUserModel.getJobs()){ 
 | 
                if(StringUtils.equals(job.getFirstLevelType(),Constants.TWO+"")){ 
 | 
                    orgId = job.getOrgId(); 
 | 
                    break; 
 | 
                } 
 | 
            } 
 | 
            users.setIamOrgId(orgId); 
 | 
            if(orgId !=null){ 
 | 
                Shop shop = shopMapper.selectOne(new QueryWrapper<Shop>().lambda() 
 | 
                        .eq(Shop::getOrgId,orgId) 
 | 
                        .last("limit 1")); 
 | 
                users.setDepartmentId(shop ==null?null:shop.getId()); 
 | 
            } 
 | 
        } 
 | 
        return  users; 
 | 
    } 
 | 
  
 | 
    public  String getToken(String uuid,String time) { 
 | 
        String appid = (String) redisTemplate.opsForValue().get(Constants.RedisKeys.IAM_APPID); 
 | 
        String appKey =  (String)redisTemplate.opsForValue().get(Constants.RedisKeys.IAM_APPKEY) ; 
 | 
        String token = JWT.create().withIssuer(appid).withIssuedAt(DateUtil.getDateFromString(time)).withJWTId(uuid).sign(Algorithm.HMAC256(appKey)); 
 | 
        token = String.join(" ", "Bearer", token); 
 | 
        return  token; 
 | 
    } 
 | 
    @Override 
 | 
    @Async 
 | 
    public  void  saveInterfaceLog(String url,int type,String name, String token, String uuid, String timestamp, Object obj,Integer success,String respone){ 
 | 
            Map<String,Object> map = new HashMap<>(); 
 | 
            map.put("token",token); 
 | 
            map.put("uuid",uuid); 
 | 
            map.put("timestamp",timestamp); 
 | 
            map.put("data", obj); 
 | 
            IamInterfaceLog log = new IamInterfaceLog(); 
 | 
            log.setCreateDate(new Date()); 
 | 
            log.setUrl(url); 
 | 
            log.setEditDate(log.getCreateDate()); 
 | 
            log.setPlat(Constants.ZERO); 
 | 
            log.setName(name); 
 | 
            log.setIsdeleted(Constants.ZERO); 
 | 
            log.setRequest(JSONObject.toJSONString(map)); 
 | 
            log.setType(type); 
 | 
            log.setSuccess(success); 
 | 
            log.setRepose(respone); 
 | 
            iamInterfaceLogMapper.insert(log); 
 | 
    } 
 | 
} 
 |