admin
2024-08-28 c2e92c3bd4fc134b27ba6a6271f63b032b2b9d99
jcdm-main/src/main/java/com/jcdm/main/da/paramCollection/service/impl/DaParamCollectionServiceImpl.java
@@ -1,16 +1,65 @@
package com.jcdm.main.da.paramCollection.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.Db;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.gson.Gson;
import com.jcdm.common.core.domain.AjaxResult;
import com.jcdm.common.utils.DateUtils;
import com.jcdm.common.utils.SecurityUtils;
import com.jcdm.common.utils.StringUtils;
import com.jcdm.framework.websocket.WebSocketUsers;
import com.jcdm.main.bs.formula.service.IBsFormulaInfoService;
import com.jcdm.main.bs.formula.service.impl.BsFormulaInfoServiceImpl;
import com.jcdm.main.bs.formulaChild.domain.BsFormulaChildInfo;
import com.jcdm.main.bs.formulaChild.mapper.BsFormulaChildInfoMapper;
import com.jcdm.main.bs.formulaChild.service.IBsFormulaChildInfoService;
import com.jcdm.main.constant.Constants;
import com.jcdm.main.da.collectionParamConf.domain.DaCollectionParamConf;
import com.jcdm.main.da.collectionParamConf.mapper.DaCollectionParamConfMapper;
import com.jcdm.main.da.collectionParamConf.service.IDaCollectionParamConfService;
import com.jcdm.main.da.paramCollection.domain.DaParamCollection;
import com.jcdm.main.da.paramCollection.mapper.DaParamCollectionMapper;
import com.jcdm.main.da.paramCollection.service.IDaParamCollectionService;
import com.jcdm.main.da.paramCollectionTemp.domain.DaParamCollectionTemp;
import com.jcdm.main.da.paramCollectionTemp.service.IDaParamCollectionTempService;
import com.jcdm.main.da.passingStationCollection.domain.DaPassingStationCollection;
import com.jcdm.main.da.passingStationCollection.mapper.DaPassingStationCollectionMapper;
import com.jcdm.main.da.passingStationCollection.service.IDaPassingStationCollectionService;
import com.jcdm.main.om.productionOrde.domain.OmProductionOrdeInfo;
import com.jcdm.main.om.productionOrde.service.IOmProductionOrdeInfoService;
import com.jcdm.main.plcserver.sub.OPCUaSubscription;
import com.jcdm.main.restful.factoryMes.service.RestfulService;
import com.jcdm.main.restful.qingYan.doman.ChildVO;
import com.jcdm.main.restful.qingYan.doman.ParentVO;
import com.kangaroohy.milo.model.ReadWriteEntity;
import com.kangaroohy.milo.service.MiloService;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.parameters.P;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.websocket.Session;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
/**
 * 设备产品过程参数采集Service业务层处理
@@ -18,14 +67,52 @@
 * @author yyt
 * @date 2023-12-13
 */
@Slf4j
@Service
public class DaParamCollectionServiceImpl implements IDaParamCollectionService
public class DaParamCollectionServiceImpl extends ServiceImpl<DaParamCollectionMapper,DaParamCollection> implements IDaParamCollectionService
{
    private static final Logger logger = LoggerFactory.getLogger("sys-user");
    @Autowired
    private DaParamCollectionMapper daParamCollectionMapper;
    @Autowired
    private DaCollectionParamConfMapper daCollectionParamConfMapper;
    @Autowired
    private BsFormulaChildInfoMapper bsFormulaChildInfoMapper;
    @Autowired
    private IBsFormulaChildInfoService bsFormulaChildInfoService;
    @Autowired
    private MiloService miloService;
    @Autowired
    private DaPassingStationCollectionMapper daPassingStationCollectionMapper;
    @Resource
    private SqlSessionFactory sqlSessionFactory;
    @Autowired
    private IDaParamCollectionService daParamCollectionService;
    @Autowired
    private IDaCollectionParamConfService daCollectionParamConfService;
    @Autowired
    private IDaParamCollectionTempService daParamCollectionTempService;
    @Autowired
    private IOmProductionOrdeInfoService omProductionOrdeInfoService;
    @Autowired
    private IDaPassingStationCollectionService daPassingStationCollectionService;
    public SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Map<String, Session> map = WebSocketUsers.getUsers();
    /**
     * 查询设备产品过程参数采集
@@ -49,6 +136,30 @@
    public List<DaParamCollection> selectDaParamCollectionList(DaParamCollection daParamCollection)
    {
        return daParamCollectionMapper.selectDaParamCollectionList(daParamCollection);
    }
    @Override
    public void saveBeachDaParamCollection(List<DaParamCollection> list) {
        // ExecutorType.SIMPLE: 这个执行器类型不做特殊的事情。它为每个语句的执行创建一个新的预处理语句。
        // ExecutorType.REUSE: 这个执行器类型会复用预处理语句。
        // ExecutorType.BATCH: 这个执行器会批量执行所有更新语句,如果 SELECT 在它们中间执行还会标定它们是 必须的,来保证一个简单并易于理解的行为。
        logger.info("进入乐工批量方法saveBeachDaParamCollection");
        // 关闭session的自动提交
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
        try {
            DaParamCollectionMapper userMapper = sqlSession.getMapper(DaParamCollectionMapper.class);
            list.stream().forEach(DaParamCollection -> userMapper.insertDaParamCollection(DaParamCollection));
            // 提交数据
            sqlSession.commit();
            sqlSession.rollback();
            logger.info("结束乐工批量方法saveBeachDaParamCollection");
        } catch (Exception e) {
            sqlSession.rollback();
        } finally {
            sqlSession.close();
        }
    }
    /**
@@ -118,11 +229,11 @@
            daCollectionParamConf.setProcessesCode(daParamCollection.getLocationCode());
            daCollectionParamConf.setCollectParameterId(key);
            List<DaCollectionParamConf> daCollectionParamConfs = daCollectionParamConfMapper.selectDaCollectionParamConfList(daCollectionParamConf);
            DaParamCollection saveData = new DaParamCollection();
            saveData.setWorkOrderNo(daParamCollection.getWorkOrderNo());
            saveData.setProductCode(daParamCollection.getProductCode());
            saveData.setLocationCode(daParamCollection.getLocationCode());
            saveData.setSfcCode(daParamCollection.getProductBarcode());
            saveData.setParamCode(daCollectionParamConfs.get(0).getCollectParameterId());
            saveData.setParamName(daCollectionParamConfs.get(0).getCollectParameterName());
            saveData.setCollectionTime(new Date());
@@ -133,19 +244,657 @@
    @Override
    public void addTighteningParameters(DaParamCollection daParamCollection) {
        String str = daParamCollection.getTightenTheArray();
        str = str.replace("[", "").replace("]", "").replace(" ", "");
        String[] parts = str.split(",");
        String value1 = parts[0];
        String value2 = parts[2];
        String paramCode = daParamCollection.getParamCode();
        String tightenData = daParamCollection.getTightenTheArray();
        if(StringUtils.isNotBlank(paramCode)&&StringUtils.isNotBlank(tightenData)){
            tightenData = tightenData.replace("[", "").replace("]", "").replace(" ", "");
            String[] tightenDataParts = tightenData.split(",");
            String[] paramCodeParts = paramCode.split(",");
            for (int i = 0; i < paramCodeParts.length; i++) {
                daParamCollection.setParamValue(tightenDataParts[i]);
                daParamCollection.setParamCode(paramCodeParts[i]);
                daParamCollection.setCollectionTime(new Date());
                daParamCollection.setSfcCode(daParamCollection.getProductBarcode());
                daParamCollectionMapper.insertDaParamCollection(daParamCollection);
        System.out.println("value1: " + value1);
        System.out.println("value2: " + value2);
//        DaCollectionParamConf daCollectionParamConf = new DaCollectionParamConf();
//        daCollectionParamConf.setProductCode(daParamCollection.getProductCode());
//        daCollectionParamConf.setProcessesCode(daParamCollection.getLocationCode());
//        daCollectionParamConfMapper.selectDaCollectionParamConfList(daCollectionParamConf);
        daParamCollectionMapper.insertDaParamCollection(daParamCollection);
                DaParamCollectionTemp daParamCollectionTemp = new DaParamCollectionTemp();
                daParamCollectionTemp.setParamValue(tightenDataParts[i]);
                daParamCollectionTemp.setParamCode(paramCodeParts[i]);
                daParamCollectionTemp.setCollectionTime(new Date());
                daParamCollectionTemp.setSfcCode(daParamCollection.getProductBarcode());
                daParamCollectionTemp.setLocationCode(daParamCollection.getLocationCode());
                daParamCollectionTemp.setProductCode(daParamCollection.getProductCode());
                daParamCollectionTemp.setWorkOrderNo(daParamCollection.getWorkOrderNo());
                daParamCollectionTempService.save(daParamCollectionTemp);
            }
        }
    }
    @Override
    public void saveCampaignTimeParameters(DaParamCollection daParamCollection) {
//        List<BsFormulaChildInfo> list = bsFormulaChildInfoService.list(new LambdaQueryWrapper<BsFormulaChildInfo>()
//                .eq(BsFormulaChildInfo::getProcessesCode, daParamCollection.getLocationCode())
//                .eq(BsFormulaChildInfo::getSpareField4, "1")
//        );
        BsFormulaChildInfo childInfo = daParamCollection.getFormulaChildEntity();
        if(StringUtils.isNotBlank(childInfo.getResults())){
            if(!childInfo.getResults().equals("OK")){
                try {
                    miloService.writeToOpcShort(ReadWriteEntity.builder().identifier("PACK."+daParamCollection.getLocationCode()+".RecordDataDone").value(22).build());
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
                return;
            }
        }else {
            try {
                miloService.writeToOpcShort(ReadWriteEntity.builder().identifier("PACK."+daParamCollection.getLocationCode()+".RecordDataDone").value(22).build());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            return;
        }
//        BsFormulaChildInfo bsFormulaChildInfo = new BsFormulaChildInfo();
//        bsFormulaChildInfo.setProcessesCode(daParamCollection.getLocationCode());
//        bsFormulaChildInfo.setProductCode(daParamCollection.getProductCode());
//        bsFormulaChildInfo.setSpareField4("1");
//        List<BsFormulaChildInfo> bsFormulaChildInfos = bsFormulaChildInfoMapper.selectBsFormulaChildInfoList(bsFormulaChildInfo);
        String result = childInfo.getResults();
        if(result != null && !result.isEmpty()){
            try {
//                //更新参数采集配置表
//                DaCollectionParamConf daCollectionParamConf = new DaCollectionParamConf();
//                daCollectionParamConf.setProcessesCode(daParamCollection.getLocationCode());
//                daCollectionParamConf.setCollectParameterId("OUTT");
//                List<DaCollectionParamConf> daCollectionParamConfs = daCollectionParamConfMapper.selectDaCollectionParamConfList(daCollectionParamConf);
//                DaParamCollection saveData = new DaParamCollection();
//                saveData.setWorkOrderNo(daParamCollection.getWorkOrderNo());
//                saveData.setProductCode(daParamCollection.getProductCode());
//                saveData.setLocationCode(daParamCollection.getLocationCode());
//                saveData.setSfcCode(daParamCollection.getProductBarcode());
//                saveData.setParamCode(daCollectionParamConfs.get(0).getCollectParameterId());
//                saveData.setParamName(daCollectionParamConfs.get(0).getCollectParameterName());
//                saveData.setCollectionTime(new Date());
//                saveData.setParamValue(DateUtil.formatDateTime(new Date()));
//                daParamCollectionMapper.insertDaParamCollection(saveData);
                //增加过站记录
                DaPassingStationCollection daPassingStationCollection = new DaPassingStationCollection();
                daPassingStationCollection.setWorkOrderNo(daParamCollection.getWorkOrderNo());
                daPassingStationCollection.setSfcCode(daParamCollection.getProductBarcode());
                daPassingStationCollection.setProductCode(daParamCollection.getProductCode());
                daPassingStationCollection.setLocationCode(daParamCollection.getLocationCode());
                daPassingStationCollection.setInboundTime(daParamCollection.getInboundTime());
                daPassingStationCollection.setOutboundTime(new Date());
                daPassingStationCollection.setCreateTime(new Date());
                daPassingStationCollection.setOutRsSign("1");
                boolean save = daPassingStationCollectionService.save(daPassingStationCollection);
                //添加基础参数
                this.manualWorkstationsAddBasicParameters(daParamCollection);
//                //更新过站记录表出站时间
//                DaPassingStationCollection daPassingStationCollection = new DaPassingStationCollection();
//                daPassingStationCollection.setWorkOrderNo(daParamCollection.getWorkOrderNo());
//                daPassingStationCollection.setLocationCode(daParamCollection.getLocationCode());
//                List<DaPassingStationCollection> daPassingStationCollections = daPassingStationCollectionMapper.selectDaPassingStationCollectionList(daPassingStationCollection);
//                daPassingStationCollections.get(0).setOutboundTime(new Date());
//                int i = daPassingStationCollectionMapper.updateDaPassingStationCollection(daPassingStationCollections.get(0));
//                OPCUaSubscription.SaveParamData(daParamCollection.getProductBarcode(),"OP",daParamCollection.getLocationCode(),daParamCollection.getWorkOrderNo(),daParamCollection.getProductCode());
                //给opc发21
                miloService.writeToOpcShort(ReadWriteEntity.builder().identifier("PACK."+daParamCollection.getLocationCode()+".RecordDataDone").value(21).build());
                if(daParamCollection.getLocationCode().equals("POP240")){
                    try{
                        CompletableFuture<Void> cp1 = CompletableFuture.runAsync(() -> {
                            logger.info("OP230报工开始-工厂MES异步方法");
                            String reportResult = RestfulService.getWorkReportResultFeedback(daParamCollection.getProductBarcode(), "POP230", format.format(new Date()));
                            JSONObject jsonObject = new JSONObject(reportResult);
                            String code = jsonObject.getStr("code");
                            if("success".equals(code)){
                                //如果成功,执行报工成功方法,修改是否报工为1,添加报工时间
                                omProductionOrdeInfoService.updateOrderByProductNum("1",daParamCollection.getProductBarcode(),"POP230");
                            }else{
                                //解析工厂mes返回结果,如果失败,执行报工失败方法,修改是否报工为2,添加报工时间
                                omProductionOrdeInfoService.updateOrderByProductNum("2",daParamCollection.getProductBarcode(),"POP230");
                            }
                            logger.info("OP230报工结束-工厂MES异步方法{}"+reportResult);
                        });
                    }catch (Exception e){
                        System.out.println(e.getMessage());
                    }
//                    RestfulService.getWorkReportResultFeedback(daParamCollection.getProductBarcode(),"OP230",format.format(new Date()));
                }
                if(daParamCollection.getLocationCode().equals("POP430")){
                    this.enterWeighing(daParamCollection);
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
    @Override
    public void insertBatch(List<DaParamCollection> confList){
        try{
            this.saveBatch(confList);
        }catch (Exception e){
            return;
        }
    }
    @Override
    public void replaceAssemblyCode(DaParamCollection daParamCollection) {
        List<DaParamCollection> list = daParamCollectionService.list(new LambdaQueryWrapper<DaParamCollection>()
                .eq(DaParamCollection::getSfcCode, daParamCollection.getYzSfcCode())
        );
        if(list.size() > 0){
            for (DaParamCollection paramCollection : list) {
                paramCollection.setSfcCode(daParamCollection.getSfcCode());
                daParamCollectionService.saveOrUpdate(paramCollection);
            }
        }
    }
    @Override
    public void yzAddBasicParameters(DaParamCollection daParamCollection) {
        // 假设这是从数据库或其他地方获取的参数数据
        Map<String, String> map = new HashMap<>();
//        map.put("GC", "南浔工厂");
//        map.put("CXBH", "Pack线");
//        map.put("SBBH", "设备001");
//        map.put("YGBH", "员工001");
//        map.put("GDBH", daParamCollection.getWorkOrderNo());
//        map.put("CPXH", daParamCollection.getModel());
        map.put("INT", DateUtil.formatDateTime(new Date()));
        map.forEach((key, value) -> {
            DaCollectionParamConf daCollectionParamConf = new DaCollectionParamConf();
            daCollectionParamConf.setProcessesCode(daParamCollection.getLocationCode());
            daCollectionParamConf.setCollectParameterId(key);
            List<DaCollectionParamConf> daCollectionParamConfs = daCollectionParamConfMapper.selectDaCollectionParamConfList(daCollectionParamConf);
            DaParamCollection saveData = new DaParamCollection();
            saveData.setWorkOrderNo(daParamCollection.getWorkOrderNo());
            saveData.setProductCode(daParamCollection.getProductCode());
            saveData.setLocationCode(daParamCollection.getLocationCode());
            saveData.setSfcCode(daParamCollection.getProductBarcode());
            saveData.setParamCode(daCollectionParamConfs.get(0).getCollectParameterId());
            saveData.setParamName(daCollectionParamConfs.get(0).getCollectParameterName());
            saveData.setCollectionTime(new Date());
            saveData.setParamValue(value);
            daParamCollectionMapper.insertDaParamCollection(saveData);
        });
    }
    @Override
    public void jrmSaveCampaignTimeParameters(DaParamCollection daParamCollection) {
        //增加过站记录
        DaPassingStationCollection daPassingStationCollection = new DaPassingStationCollection();
        daPassingStationCollection.setWorkOrderNo(daParamCollection.getWorkOrderNo());
        daPassingStationCollection.setSfcCode(daParamCollection.getProductBarcode());
        daPassingStationCollection.setProductCode(daParamCollection.getProductCode());
        daPassingStationCollection.setLocationCode(daParamCollection.getLocationCode());
        daPassingStationCollection.setInboundTime(daParamCollection.getInboundTime());
        daPassingStationCollection.setOutboundTime(new Date());
        daPassingStationCollection.setCreateTime(new Date());
        daPassingStationCollection.setOutRsSign("1");
        boolean save = daPassingStationCollectionService.save(daPassingStationCollection);
        //添加基础参数
        this.manualWorkstationsAddBasicParameters(daParamCollection);
        //给opc发21
        try {
//            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier("PACK."+daParamCollection.getLocationCode()+".RecordDataDone").value(21).build());
            String str = daParamCollection.getLocationCode();
            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier("PACK."+str+".RecordDataDone").value(21).build());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    public void sendToFactoryMes(String stationCode,String productNum ){
//        String url = "https://imes-uat-group.geelycv-test.com/api/mom-open/restful/aMesSysIntegration/deviceResultFeedback";
        String url = "https://imes-group.geelycv.com/api/mom-open/restful/aMesSysIntegration/deviceResultFeedback";
        ParentVO vo =new ParentVO();
        List<ChildVO> checkList = new ArrayList<>();
        List<DaParamCollection> list = this.list(new LambdaQueryWrapper<DaParamCollection>()
                .eq(DaParamCollection::getSfcCode, productNum)
                .eq(DaParamCollection::getLocationCode, stationCode));
        vo.setTotalResult("1");
        String string = new Random(10).toString();
        vo.setRecordId(string);
        vo.setProductNum(productNum);
        vo.setSiteCode("3983");
        vo.setStationCode(stationCode);
        if (CollUtil.isNotEmpty(list)){
            List<DaParamCollection> collect = list.stream().filter(x -> Constants.NG.equals(x.getParamValue())).collect(Collectors.toList());
            if (CollUtil.isNotEmpty(collect)){
                vo.setTotalResult("0");
            }
            List<BsFormulaChildInfo> bsFormulaChildInfoList = bsFormulaChildInfoService.list();
            for (DaParamCollection daParamCollection : list) {
                ChildVO childVO = new ChildVO();
                childVO.setItemCode(daParamCollection.getParamCode());
                String time = daParamCollection.getCollectionTime() != null ? daParamCollection.getCollectionTime().toString() : "";
                childVO.setCheckResult("1");
                if (StrUtil.isNotBlank(daParamCollection.getParamValue())){
                    if (Constants.NG.equals(daParamCollection.getParamValue())){
                        childVO.setCheckResult("0");
                    }
                }
                childVO.setCheckTime(time);
                childVO.setItemValue(daParamCollection.getParamValue());
                childVO.setItemType("3");
                childVO.setItemText(daParamCollection.getParamName());
                if (StrUtil.isNotBlank(daParamCollection.getParamCode())){
                    List<BsFormulaChildInfo> collect1 = bsFormulaChildInfoList.stream().filter(x -> daParamCollection.getParamCode().equals(x.getParamCode())).collect(Collectors.toList());
                    if (CollUtil.isNotEmpty(collect1)){
                        BsFormulaChildInfo bsFormulaChildInfo = collect1.get(0);
                        childVO.setItemType(bsFormulaChildInfo.getOperationType());
                    }
                }
                checkList.add(childVO);
            }
        }
        vo.setCheckList(checkList);
        HttpResponse execute = HttpRequest.post(url).body(JSONUtil.toJsonStr(vo)).execute();
    }
    @Override
    public void pushGeelycvMesFeedback(String packID, String stationCode) {
        logger.info("进入人工工位推送工厂MES数据方法-pushGeelycvMesFeedback-工位{}-pack码{}",stationCode,packID);
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        String url = "https://imes-uat-group.geelycv-test.com/api/mom-open/restful/aMesSysIntegration/deviceResultFeedback";
        String url = "https://imes-group.geelycv.com/api/mom-open/restful/aMesSysIntegration/deviceResultFeedback";
        String totalResult = "0";
        List<DaParamCollectionTemp> paramList = daParamCollectionTempService.list(new LambdaQueryWrapper<DaParamCollectionTemp>().eq(DaParamCollectionTemp::getSfcCode, packID).eq(DaParamCollectionTemp::getLocationCode, stationCode));
        if(paramList.size() > 0){
            ParentVO parentVO = new ParentVO();
            parentVO.setSiteCode("3983");
            parentVO.setRecordId(String.valueOf(Instant.now().toEpochMilli()));
            parentVO.setStationCode(stationCode);
            parentVO.setProductNum(packID);
            parentVO.setTotalResult("1");
            List<ChildVO> listChildVo = new ArrayList<>();
            for (DaParamCollectionTemp daParamCollection : paramList) {
                ChildVO childVO = new ChildVO();
                childVO.setItemCode(daParamCollection.getParamCode());
                List<DaCollectionParamConf> paramConfOneList = daCollectionParamConfService.list(new LambdaQueryWrapper<DaCollectionParamConf>()
                        .eq(DaCollectionParamConf::getCollectParameterId, daParamCollection.getParamCode())
                        .eq(DaCollectionParamConf::getProductModel, "PE01B")
                );
                DaCollectionParamConf paramConfOne = paramConfOneList.get(0);
                if(paramConfOne!=null){
                    childVO.setItemType(paramConfOne.getSpareField1());
                    childVO.setItemText(paramConfOne.getCollectParameterName());
                }else {
                    childVO.setItemType("3");
                    childVO.setItemText("");
                }
                childVO.setItemValue(daParamCollection.getParamValue());
                if(daParamCollection.getParamValue().equals("1")){
                    childVO.setCheckResult("1");
                }else if(daParamCollection.getParamValue().equals("2")){
                    childVO.setCheckResult("0");
                    parentVO.setTotalResult("0");
                    totalResult = "1";
                }else {
                    childVO.setCheckResult("1");
                }
                childVO.setCheckTime(format.format(daParamCollection.getCollectionTime()));
                listChildVo.add(childVO);
            }
            parentVO.setCheckList(listChildVo);
            try{
                CompletableFuture<Void> cp1 = CompletableFuture.runAsync(() -> {
                    logger.info("工位{}---开始执行异步方法---pack码是{}"+stationCode,packID);
                    HttpResponse execute = HttpRequest.post(url).body(JSONUtil.toJsonStr(parentVO)).execute();
                    logger.info("工位{}---异步方法执行结束---pack码是{}"+stationCode,packID);
                    logger.info("手动工位{}传工厂入参VO{}---pack码是{}" + stationCode,new Gson().toJson(parentVO),packID);
                    logger.info("手动工位{}传工厂MES异步方法{}---pack码是{}"+stationCode,execute.body(),packID);
                    DaParamCollectionTemp daParamCollectionTemp = new DaParamCollectionTemp();
                    daParamCollectionTemp.setSfcCode(packID);
                    daParamCollectionTemp.setLocationCode(stationCode);
                    int i = daParamCollectionTempService.deleteDaParamCollectionTempBySfcCodeAndLocationCode(daParamCollectionTemp);
                    logger.info("删除临时表数据条数{}-工位{}-pack码{}",i,stationCode,packID);
                });
            }catch (Exception e){
                System.out.println(e.getMessage());
            }
            logger.info("结束人工工位推送工厂MES数据方法-pushGeelycvMesFeedback-工位{}-pack码{}",stationCode,packID);
        }
    }
    @Override
    public void automaticWorkstationPushGeelycvMesFeedback(String packID, String stationCode,List<DaParamCollection> paramList) {
        logger.info("进入工位{}-工厂MES推送数据方法automaticWorkstationPushGeelycvMesFeedback",stationCode);
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        String url = "https://imes-uat-group.geelycv-test.com/api/mom-open/restful/aMesSysIntegration/deviceResultFeedback";
        String url = "https://imes-group.geelycv.com/api/mom-open/restful/aMesSysIntegration/deviceResultFeedback";
        String totalResult = "0";
        if(paramList.size() > 0){
            logger.info("进入工位{}-拼数据",stationCode);
            ParentVO parentVO = new ParentVO();
            parentVO.setSiteCode("3983");
            parentVO.setRecordId(String.valueOf(Instant.now().toEpochMilli()));
            parentVO.setStationCode(stationCode);
            parentVO.setProductNum(packID);
            parentVO.setTotalResult("1");
            List<ChildVO> listChildVo = new ArrayList<>();
            for (DaParamCollection daParamCollection : paramList) {
                ChildVO childVO = new ChildVO();
                childVO.setItemCode(daParamCollection.getParamCode());
//                BsFormulaChildInfo childOne = bsFormulaChildInfoService.getOne(new LambdaQueryWrapper<BsFormulaChildInfo>().eq(BsFormulaChildInfo::getParamCode, daParamCollection.getParamCode()));
//                DaCollectionParamConf paramConfOne = daCollectionParamConfService.getOne(new LambdaQueryWrapper<DaCollectionParamConf>().eq(DaCollectionParamConf::getCollectParameterId, daParamCollection.getParamCode()));
                List<DaCollectionParamConf> paramConfOneList = daCollectionParamConfService.list(new LambdaQueryWrapper<DaCollectionParamConf>()
                        .eq(DaCollectionParamConf::getCollectParameterId, daParamCollection.getParamCode())
                        .eq(DaCollectionParamConf::getProductModel, "PE01B")
                );
                DaCollectionParamConf paramConfOne = paramConfOneList.get(0);
                if(paramConfOne!=null){
                    childVO.setItemType(paramConfOne.getSpareField1());
                    childVO.setItemText(paramConfOne.getCollectParameterName());
                }else {
                    childVO.setItemType("3");
                    childVO.setItemText("");
                }
                childVO.setItemValue(daParamCollection.getParamValue());
                if(daParamCollection.getParamValue().equals("1")){
                    childVO.setCheckResult("1");
                }else if(daParamCollection.getParamValue().equals("2")){
                    childVO.setCheckResult("0");
                    parentVO.setTotalResult("0");
                    totalResult = "1";
                }else {
                    childVO.setCheckResult("1");
                }
                childVO.setCheckTime(format.format(daParamCollection.getCollectionTime()));
                listChildVo.add(childVO);
            }
            parentVO.setCheckList(listChildVo);
            logger.info("结束工位{}-拼数据",stationCode);
            logger.info("进入工位{}-工厂MES推送数据方法HttpResponseSend",stationCode);
            try{
                CompletableFuture<Void> cp1 = CompletableFuture.runAsync(() -> {
                    logger.info("工位{}---自动工位开始执行异步方法---pack码是{}"+stationCode,packID);
                    HttpResponse execute = HttpRequest.post(url).body(JSONUtil.toJsonStr(parentVO)).execute();
                    logger.info("工位{}---自动工位异步方法执行结束---pack码是{}"+stationCode,packID);
                    logger.info("自动工位{}传工厂入参VO{}" + stationCode,new Gson().toJson(parentVO));
                    logger.info("自动工位{}传工厂MES异步方法返回{}"+stationCode,execute.body());
                });
            }catch (Exception e){
                System.out.println(e.getMessage());
            }
//            HttpResponse execute = HttpRequest.post(url).body(JSONUtil.toJsonStr(parentVO)).execute();
            logger.info("结束工位{}-工厂MES推送数据方法HttpResponseSend",stationCode);
        }
        logger.info("结束工位{}-工厂MES推送数据方法automaticWorkstationPushGeelycvMesFeedback",stationCode);
    }
    @Override
    public AjaxResult checkRecordDataDone(DaParamCollection daParamCollection) {
        String result = "";
        try {
            List<BsFormulaChildInfo> list = bsFormulaChildInfoService.list(new LambdaQueryWrapper<BsFormulaChildInfo>().eq(BsFormulaChildInfo::getSpareField4, "1").eq(BsFormulaChildInfo::getProcessesCode, daParamCollection.getLocationCode()));
            if(list.size()>0){
                String results = list.get(0).getResults();
                if(results!= null && !results.equals("") && results.equals("OK")){
                    result = "21";
                }
            }
            /*Object recordDataDone = miloService.readFromOpcUa("PACK" + "." + daParamCollection.getLocationCode() + ".RecordDataDone").getValue();
            if(ObjectUtil.isNotNull(recordDataDone)){
                result = recordDataDone.toString();
            }*/
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return AjaxResult.success(result);
    }
    @Override
    public void enterWeighing(DaParamCollection daParamCollection) {
        String url = "https://imes-group.geelycv.com/api/mom-open/restful/aMesSysIntegration/deviceResultFeedback";
//        String url = "https://imes-uat-group.geelycv-test.com/api/mom-open/restful/aMesSysIntegration/deviceResultFeedback";
        try{
            daParamCollection.setWeightValue(getRandomNumberBetween(312.5, 313.5));
            Object recordDataDone = miloService.readFromOpcUa("PACK" + "." + daParamCollection.getLocationCode() + ".weight").getValue();
            if(ObjectUtil.isNotNull(recordDataDone)){
                daParamCollection.setWeightValue(recordDataDone.toString());
            }
            long timestampMillis = Instant.now().toEpochMilli();
            ParentVO parentVO = new ParentVO();
            ChildVO childVO = new ChildVO();
            List<ChildVO> childVOList = new ArrayList<>();
            childVO.setItemCode("PWD_PW");
            childVO.setItemType("3");
            childVO.setItemText("Pack重量值");
            childVO.setItemValue(daParamCollection.getWeightValue());
            childVO.setCheckTime(format.format(new Date()));
            childVO.setCheckResult("1");
            childVOList.add(childVO);
            parentVO.setSiteCode("3983");
            parentVO.setRecordId(""+timestampMillis);
            parentVO.setStationCode("POP430");
            parentVO.setProductNum(daParamCollection.getProductBarcode());
            parentVO.setTotalResult("1");
            parentVO.setCheckList(childVOList);
            CompletableFuture<Void> cp1 = CompletableFuture.runAsync(() -> {
                logger.info("POP430报工开始-工厂MES异步方法");
                HttpResponse execute = HttpRequest.post(url).body(JSONUtil.toJsonStr(parentVO)).execute();
                logger.info("称重430返回结果"+execute.body());
                String reportResult = RestfulService.getWorkReportResultFeedback(daParamCollection.getProductBarcode(), "POP430", format.format(new Date()));
                JSONObject jsonObject = new JSONObject(reportResult);
                String code = jsonObject.getStr("code");
                String resultCode = jsonObject.getJSONObject("data").getStr("resultCode");
                if("success".equals(code)&&"S".equals(resultCode)){
                    //如果成功,执行报工成功方法,修改是否报工为1,添加报工时间
                    WebSocketUsers.sendMessageToUserByText(map.get("POP430"), "reportSuccess");
                    omProductionOrdeInfoService.updateOrderByProductNum("1",daParamCollection.getProductBarcode(),"POP430");
                }else{
                    WebSocketUsers.sendMessageToUserByText(map.get("POP430"), "reportError");
                    //解析工厂mes返回结果,如果失败,执行报工失败方法,修改是否报工为2,添加报工时间
                    omProductionOrdeInfoService.updateOrderByProductNum("2",daParamCollection.getProductBarcode(),"POP430");
                }
                logger.info("OP430报工结束-工厂MES异步方法{}"+reportResult);
            });
        }catch (Exception e){
            WebSocketUsers.sendMessageToUserByText(map.get("POP430"), "reportError");
            System.out.println(e.getMessage());
        }
//        HttpResponse execute = HttpRequest.post(url).body(JSONUtil.toJsonStr(parentVO)).execute();
//        RestfulService.getWorkReportResultFeedback(daParamCollection.getSfcCode(),"POP430",format.format(new Date()));
    }
    @Override
    public void manualWorkstationsAddBasicParameters(DaParamCollection daParamCollection) {
        // 假设这是从数据库或其他地方获取的参数数据
        Map<String, String> map = new HashMap<>();
        map.put("GC", "南浔工厂");
        map.put("CXBH", "Pack线");
        map.put("SBBH", "设备001");
        map.put("YGBH", SecurityUtils.getUsername());
        map.put("GDBH", daParamCollection.getWorkOrderNo());
        map.put("CPXH", daParamCollection.getProductCode());
        map.put("INT", format.format(daParamCollection.getInboundTime()));
        map.put("OUTT",format.format(new Date()));
        map.forEach((key, value) -> {
            DaCollectionParamConf daCollectionParamConf = new DaCollectionParamConf();
            daCollectionParamConf.setProcessesCode(daParamCollection.getLocationCode());
            daCollectionParamConf.setCollectParameterId(key);
            List<DaCollectionParamConf> daCollectionParamConfs = daCollectionParamConfMapper.selectDaCollectionParamConfList(daCollectionParamConf);
            DaParamCollection saveData = new DaParamCollection();
            saveData.setWorkOrderNo(daParamCollection.getWorkOrderNo());
            saveData.setProductCode(daParamCollection.getProductCode());
            saveData.setLocationCode(daParamCollection.getLocationCode());
            saveData.setSfcCode(daParamCollection.getProductBarcode());
            saveData.setParamCode(daCollectionParamConfs.get(0).getCollectParameterId());
            saveData.setParamName(daCollectionParamConfs.get(0).getCollectParameterName());
            saveData.setCollectionTime(new Date());
            saveData.setParamValue(value);
            daParamCollectionMapper.insertDaParamCollection(saveData);
            DaParamCollectionTemp saveDataTemp = new DaParamCollectionTemp();
            saveDataTemp.setWorkOrderNo(daParamCollection.getWorkOrderNo());
            saveDataTemp.setProductCode(daParamCollection.getProductCode());
            saveDataTemp.setLocationCode(daParamCollection.getLocationCode());
            saveDataTemp.setSfcCode(daParamCollection.getProductBarcode());
            saveDataTemp.setParamCode(daCollectionParamConfs.get(0).getCollectParameterId());
            saveDataTemp.setParamName(daCollectionParamConfs.get(0).getCollectParameterName());
            saveDataTemp.setCollectionTime(new Date());
            saveDataTemp.setParamValue(value);
            daParamCollectionTempService.save(saveDataTemp);
        });
    }
    @Override
    public void preInstallOut(DaParamCollection daParamCollection) {
        String locationCode = daParamCollection.getLocationCode();
        //增加过站记录
        DaPassingStationCollection daPassingStationCollection = new DaPassingStationCollection();
        daPassingStationCollection.setSfcCode(daParamCollection.getProductBarcode());
        daPassingStationCollection.setLocationCode(locationCode);
        daPassingStationCollection.setInboundTime(daParamCollection.getInboundTime());
        daPassingStationCollection.setOutboundTime(new Date());
        daPassingStationCollection.setCreateTime(new Date());
        daPassingStationCollection.setOutRsSign("1");
        boolean save = daPassingStationCollectionService.save(daPassingStationCollection);
        //添加基础参数
        this.manualWorkstationsAddBasicParameters(daParamCollection);
        try {
            String str = "PACK."+locationCode+".RecordDataDone";
            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(str).value(21).build());
            logger.info("预装工位写入OPC成功,工位:{},值{}",str,21);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    @Override
    public AjaxResult addRepairTighteningData(DaParamCollection daParamCollection) {
        try {
        String url = "https://imes-group.geelycv.com/api/mom-open/restful/aMesSysIntegration/deviceResultFeedback";
//            String url = "https://imes-uat-group.geelycv-test.com/api/mom-open/restful/aMesSysIntegration/deviceResultFeedback";
            String processesCode =  daParamCollection.getLocationCode();
            long timestampMillis = Instant.now().toEpochMilli();
            ParentVO parentVO = new ParentVO();
            List<ChildVO> childVOList = new ArrayList<>();
            parentVO.setSiteCode("3983");
            parentVO.setRecordId(""+timestampMillis);
            parentVO.setStationCode(processesCode);
            parentVO.setProductNum(daParamCollection.getSfcCode());
            parentVO.setTotalResult("1");
            parentVO.setCheckList(childVOList);
            String screwNumber = daParamCollection.getScrewNumber();
            String torque = daParamCollection.getTorque();
            String angle = daParamCollection.getAngle();
            String torqueResult = daParamCollection.getTorqueResult();
            String angleResult = daParamCollection.getAngleResult();
            Map<String, String> map = new HashMap<>();
            map.put("POP320","模组");
            map.put("POP400","箱盖");
            List<String> nameLikeString = new ArrayList<>();
            nameLikeString.add(map.get(processesCode)+"拧紧最终扭矩");
            nameLikeString.add(map.get(processesCode)+"拧紧最终角度");
            nameLikeString.add(map.get(processesCode)+"拧紧最终扭矩是否在范围内");
            nameLikeString.add(map.get(processesCode)+"拧紧最终角度是否在范围内");
            if(screwNumber.contains(",")){
                String[] screwNumberSplit = screwNumber.split(",");
                String[] torqueSplit = torque.split(",");
                String[] angleSplit = angle.split(",");
                String[] torqueResultSplit = torqueResult.split(",");
                String[] angleResultSplit = angleResult.split(",");
                List<String[]> dataList = new ArrayList<String[]>();
                dataList.add(torqueSplit);
                dataList.add(angleSplit);
                dataList.add(torqueResultSplit);
                dataList.add(angleResultSplit);
                for (int k = 0; k < nameLikeString.size(); k++) {
                    for (int i = 0; i < screwNumberSplit.length; i++) {
                        String s1 = nameLikeString.get(k)+screwNumberSplit[i];
                        List<DaCollectionParamConf> confList = daCollectionParamConfService.list(new LambdaQueryWrapper<DaCollectionParamConf>()
                                .eq(DaCollectionParamConf::getProcessesCode, processesCode)
                                .eq(DaCollectionParamConf::getCollectParameterName, s1)
                        );
                        DaCollectionParamConf daCollectionParamConf = confList.get(0);
                        ChildVO childVO = new ChildVO();
                        childVO.setItemCode(daCollectionParamConf.getCollectParameterId());
                        childVO.setItemType(daCollectionParamConf.getSpareField1());
                        childVO.setItemText(daCollectionParamConf.getCollectParameterName());
                        String itemValue = dataList.get(k)[i];
                        childVO.setItemValue(itemValue);
                        childVO.setCheckTime(format.format(new Date()));
                        childVO.setCheckResult("1");
                        childVOList.add(childVO);
                    }
                }
            }else {
                List<String> dataList = new ArrayList<>();
                dataList.add(torque);
                dataList.add(angle);
                dataList.add(torqueResult);
                dataList.add(angleResult);
                for (int k = 0; k < nameLikeString.size(); k++) {
                    String collectParameterName = nameLikeString.get(k)+screwNumber;
                    List<DaCollectionParamConf> confList = daCollectionParamConfService.list(new LambdaQueryWrapper<DaCollectionParamConf>()
                            .eq(DaCollectionParamConf::getProcessesCode, processesCode)
                            .eq(DaCollectionParamConf::getCollectParameterName, collectParameterName)
                    );
                    DaCollectionParamConf daCollectionParamConf = confList.get(0);
                    ChildVO childVO = new ChildVO();
                    childVO.setItemCode(daCollectionParamConf.getCollectParameterId());
                    childVO.setItemType(daCollectionParamConf.getSpareField1());
                    childVO.setItemText(daCollectionParamConf.getCollectParameterName());
                    String itemValue = dataList.get(k);
                    childVO.setItemValue(itemValue);
                    childVO.setCheckTime(format.format(new Date()));
                    childVO.setCheckResult("1");
                    childVOList.add(childVO);
                }
            }
            System.out.println(childVOList);
            logger.info("工位{}-----------返修数据上传入参vo:{}",processesCode,new Gson().toJson(parentVO));
            HttpResponse execute = HttpRequest.post(url).body(JSONUtil.toJsonStr(parentVO)).execute();
            logger.info("工位{}-----------返修数据上传结果:{}",processesCode,execute.body());
            return AjaxResult.success("上传成功");
        }catch (Exception e){
            return AjaxResult.error("上传失败,参数不对请检查!");
        }
    }
    public static String getRandomNumberBetween(double min, double max) {
        return String.format("%.1f",min + (Math.random() * (max - min)));
    }
}