SnPartDetailServiceImpl.java 6.67 KB
package com.huaheng.pc.config.sn.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.huaheng.common.constant.ScheduleConstants;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.bean.BeanUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.config.address.service.AddressService;
import com.huaheng.pc.config.sn.domain.*;
import com.huaheng.pc.config.sn.mapper.SnPartDetailMapper;
import org.aspectj.weaver.loadtime.Aj;
import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


@Service
public class SnPartDetailServiceImpl extends ServiceImpl<SnPartDetailMapper, SnPartDetail> implements SnPartDetailService {

    @Resource
    private SnService snService;
    @Resource
    private SnPartService snPartService;
    @Resource
    private SnPartDetailService snPartDetailService;
    @Resource
    private SnPartDetailHistoryService snPartDetailHistoryService;

    public List<SnPartDetail> getSnPartByCode(String sn){
        LambdaQueryWrapper<SnPartDetail> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(SnPartDetail::getSnCode, sn);
        List<SnPartDetail> m = this.list(lambdaQueryWrapper);
        return m;
    }


    public SnPartDetail getSnPart(String part,String sn){
        LambdaQueryWrapper<SnPartDetail> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(SnPartDetail::getSnCode, sn);
        lambdaQueryWrapper.eq(SnPartDetail::getPart, part);
        lambdaQueryWrapper.last("limit 1");
        SnPartDetail m = this.getOne(lambdaQueryWrapper);
        return m;
    }

    public SnPartDetail partBind(String part){
        LambdaQueryWrapper<SnPartDetail> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(SnPartDetail::getPart, part);
        lambdaQueryWrapper.last("limit 1");
        SnPartDetail m = this.getOne(lambdaQueryWrapper);
        if(m!=null){
            return m;
        }
        return null;
    }

    /**
     * sn绑定部件
     * @param snPartDomain
     * @return
     */
    @Transactional
    public AjaxResult bindSnPart(SnPartDomain snPartDomain){
        Sn sn=snService.getSn(snPartDomain.getSnCode());
        if(sn==null){
//            sn=new Sn();
//            sn.setSyncIot(0);
//            sn.setCode(snPartDomain.getSnCode());
//            sn.setCreatedBy(ShiroUtils.getLoginName());
//            sn.setLastUpdatedBy(ShiroUtils.getLoginName());
//            snService.save(sn);
            return AjaxResult.error("SN不存在SN管理中,请先添加SN");
        }else{
            Sn sn1=new Sn();
            sn1.setId(sn.getId());
            sn1.setSyncIot(0);
            snService.updateById(sn1);

        }
        List<SnPartDetail> details=new ArrayList<>();
// 使用流去重,基于part字段
        Map<String, PartDomain> uniquePartsMap = snPartDomain.getPartList().stream()
                .collect(Collectors.toMap(PartDomain::getPart, part -> part, (existing, replacement) -> existing));
        // 将Map转换回List
        List<PartDomain> uniquePartDomainList = uniquePartsMap.values().stream().collect(Collectors.toList());

        for (PartDomain snPart :uniquePartDomainList) {
            if(!snPartService.isExist(snPart.getPart())){
                throw new ServiceException(snPart.getPart()+"部件不存在部件管理中,请更换一个");
            }
            SnPartDetail snPartDetail=this.partBind(snPart.getPart());
            if(snPartDetail!=null){
                if(!snPartDetail.getSnCode().equals(snPartDomain.getSnCode())){
                    throw new ServiceException(snPart.getPart()+"部件已绑定SN,不能重复绑定:"+snPartDetail.getSnCode());
                }else{
                    continue;
                }
            }
            snPartDetail = new SnPartDetail();
            snPartDetail.setSnId(sn.getId().toString());
            snPartDetail.setSnCode(snPartDomain.getSnCode());
            snPartDetail.setPart(snPart.getPart());
            snPartDetail.setCreatedBy(ShiroUtils.getLoginName());
            snPartDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
            details.add(snPartDetail);
        }
        if(details.size()>0){
            this.saveBatch(details);
        }
        List<SnPartDetail> snPartDetails=this.getSnPartByCode(sn.getCode());
        if(snPartDetails.size()>0){
            Sn sn1=new Sn();
            sn1.setId(sn.getId());
            sn1.setPartNum(snPartDetails.size());
            snService.updateById(sn1);
        }
        return AjaxResult.success("操作绑定SN成功");
    }
    /**
     * sn解绑部件
     * @param snPartDomain
     * @return
     */
    @Transactional
    public AjaxResult unbindSnPart(SnPartDomain snPartDomain){
        Sn sn=snService.getSn(snPartDomain.getSnCode());
        if(sn==null){
            return AjaxResult.error("sn解绑部件失败:sn不存在");
        }
        List<Integer> details=new ArrayList<>();
        List<SnPartDetailHistory> snPartDetailHistories=new ArrayList<>();
        for (PartDomain snPart : snPartDomain.getPartList()) {
            SnPartDetail snPartDetail = this.getSnPart(snPart.getPart(),snPartDomain.getSnCode());
            if (snPartDetail==null){
                continue;
            }
            SnPartDetailHistory snPartDetailHistory=new SnPartDetailHistory();
            BeanUtils.copyBeanProp(snPartDetailHistory, snPartDetail);
            snPartDetailHistory.setId(null);
//            snPartDetailHistory.setCreatedBy(ShiroUtils.getLoginName());
            snPartDetailHistories.add(snPartDetailHistory);
            details.add(snPartDetail.getId());
        }

        if(details.size()>0){
            if(!snPartDetailHistoryService.saveBatch(snPartDetailHistories)){
                throw new ServiceException("sn解绑部件失败:sn解绑部件历史记录保存失败");
            }
            if(!this.removeByIds(details)){
                throw new ServiceException("sn解绑部件失败");
            }
        }
        List<SnPartDetail> snPartDetails=this.getSnPartByCode(sn.getCode());
        if(snPartDetails.size()>0){
            Sn sn1=new Sn();
            sn1.setId(sn.getId());
            sn1.setPartNum(snPartDetails.size());
            snService.updateById(sn1);
        }
        return AjaxResult.success("操作解绑SN成功");
    }

}