package com.jcdm.main.bs.formulaChild.controller;

import java.util.List;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jcdm.main.constant.Constants;
import com.kangaroohy.milo.model.ReadWriteEntity;
import com.kangaroohy.milo.service.MiloService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.jcdm.common.annotation.Log;
import com.jcdm.common.core.controller.BaseController;
import com.jcdm.common.core.domain.AjaxResult;
import com.jcdm.common.enums.BusinessType;
import com.jcdm.main.bs.formulaChild.domain.BsFormulaChildInfo;
import com.jcdm.main.bs.formulaChild.service.IBsFormulaChildInfoService;
import com.jcdm.common.utils.poi.ExcelUtil;
import com.jcdm.common.core.page.TableDataInfo;

/**
 * 配方配置子信息Controller
 * 
 * @author ruimin
 * @date 2023-12-26
 */
@RestController
@RequestMapping("/bs/formulaChild")
public class BsFormulaChildInfoController extends BaseController
{
    @Autowired
    private IBsFormulaChildInfoService bsFormulaChildInfoService;

    @Autowired
    private MiloService miloService;

    /**
     * 未做完工序回复plc信号
     */
    @GetMapping("/unfinishedProcess")
    public AjaxResult unfinishedProcess(BsFormulaChildInfo bsFormulaChildInfo)
    {
        try {
            String str = "MOZU1."+bsFormulaChildInfo.getProcessesCode()+".RecordDataDone";
            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(str).value(bsFormulaChildInfo.getRecordDataDone()).build());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return AjaxResult.success();
    }

    /**
     * 扫码确认
     */
    @GetMapping("/initializedData")
    public AjaxResult initializedData(BsFormulaChildInfo bsFormulaChildInfo)
    {
        String productNum = "";
        try {
            String str = "MOZU1."+bsFormulaChildInfo.getLocationCode()+".ModuleCode";
            Object productNumObject = miloService.readFromOpcUa(str).getValue();
            if(ObjectUtil.isNotNull(productNumObject)){
                productNum = productNumObject.toString();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return AjaxResult.success(productNum);
    }

    /**
     * 扫码确认
     */
    @GetMapping("/fistSetpNumber")
    public AjaxResult fistSetpNumber(BsFormulaChildInfo bsFormulaChildInfo)
    {
//        try {
//            String str = "PACK."+bsFormulaChildInfo.getProcessesCode()+".MStepNumber";
//            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(str).value(1).build());
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//        }
        Integer stepNumber = 1;
        try {
            List<BsFormulaChildInfo> op260 = bsFormulaChildInfoService.list(new LambdaQueryWrapper<BsFormulaChildInfo>().eq(BsFormulaChildInfo::getProcessesCode, bsFormulaChildInfo.getProcessesCode()));
            List<BsFormulaChildInfo> filteredList = op260.stream()
                    .filter(obj -> obj.getResults() != null && !obj.getResults().isEmpty())
                    .collect(Collectors.toList());
            if(filteredList.size() > 0){
                stepNumber = Integer.valueOf(filteredList.get(filteredList.size()-1).getStepSort())+1;
            }

            String str = "PACK."+bsFormulaChildInfo.getProcessesCode()+".MStepNumber";
            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(str).value(stepNumber).build());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return AjaxResult.success(stepNumber);
    }

    /**
     * 查询配方配置子信息列表
     */
    @GetMapping("/noPageListFormulaChild")
    public TableDataInfo noPageListFormulaChild(BsFormulaChildInfo bsFormulaChildInfo)
    {

        List<BsFormulaChildInfo> list = bsFormulaChildInfoService.list(new LambdaQueryWrapper<BsFormulaChildInfo>()
                .eq(BsFormulaChildInfo::getProductCode,bsFormulaChildInfo.getProductCode())
                .eq(BsFormulaChildInfo::getProcessesCode,bsFormulaChildInfo.getProcessesCode())
                .orderByAsc(BsFormulaChildInfo::getStepSort)
        );
        if (CollUtil.isNotEmpty(list)){
            List<BsFormulaChildInfo> collect1 = list.stream().filter(x -> Constants.OK.equals(x.getResults())).collect(Collectors.toList());
            List<BsFormulaChildInfo> collect2 = list.stream().filter(x -> !Constants.OK.equals(x.getResults())).collect(Collectors.toList());
            list = collect1;
            list.addAll(collect2);
        }
        for (BsFormulaChildInfo formulaChildInfo : list) {
//            formulaChildInfo.setSort(formulaChildInfo.getStepSort());
//            formulaChildInfo.setAddress(formulaChildInfo.getTechRequirement());
//            formulaChildInfo.setImg(formulaChildInfo.getOperationSteps());
            if(formulaChildInfo.getCollectData()!=null&& !"".equals(formulaChildInfo.getCollectData())){
                if(formulaChildInfo.getCollectData().contains("[")){
                    String data = formulaChildInfo.getCollectData();
                    data = data.replace("[", "").replace("]", "").replace(" ", "");
                    String[] tightenDataParts = data.split(",");
                    formulaChildInfo.setCollectData("扭矩"+tightenDataParts[0]+"角度"+tightenDataParts[1]+"扭矩结果"+tightenDataParts[2]+"角度结果"+tightenDataParts[3]);
                }
            }
        }
        return getDataTable(list);
    }

    /**
     * 查询配方配置子信息列表
     */
    @PreAuthorize("@ss.hasPermi('bs:formulaChild:list')")
    @GetMapping("/list")
    public TableDataInfo list(BsFormulaChildInfo bsFormulaChildInfo)
    {
        startPage();
        List<BsFormulaChildInfo> list = bsFormulaChildInfoService.selectBsFormulaChildInfoList(bsFormulaChildInfo);
        for (BsFormulaChildInfo formulaChildInfo : list) {
            formulaChildInfo.setSort(formulaChildInfo.getStepSort());
            formulaChildInfo.setAddress(formulaChildInfo.getTechRequirement());
            formulaChildInfo.setImg(formulaChildInfo.getOperationSteps());
            if(formulaChildInfo.getCollectData()!=null&& !"".equals(formulaChildInfo.getCollectData())){
                if(formulaChildInfo.getCollectData().contains("[")){
                    String data = formulaChildInfo.getCollectData();
                    data = data.replace("[", "").replace("]", "").replace(" ", "");
                    String[] tightenDataParts = data.split(",");
                    formulaChildInfo.setCollectData("扭矩"+tightenDataParts[0]+"角度"+tightenDataParts[1]+"扭矩结果"+tightenDataParts[2]+"角度结果"+tightenDataParts[3]);
                }
            }
        }
        return getDataTable(list);
    }

//    /**
//     * 检查是否可以放行
//     */
//    @GetMapping("/releaseCheck")
//    public AjaxResult releaseCheck(BsFormulaChildInfo bsFormulaChildInfo)
//    {
//        List<BsFormulaChildInfo> i = bsFormulaChildInfoService.releaseCheck(bsFormulaChildInfo);
//        return AjaxResult.success(i.size());
//    }

    /**
     * 扫码确认
     */
    @GetMapping("/updateResults")
    public AjaxResult updateResults(BsFormulaChildInfo bsFormulaChildInfo)
    {
        return bsFormulaChildInfoService.updateResults(bsFormulaChildInfo);
    }

    /**
     * 扫码确认
     */
    @GetMapping("/jrmUpdateResults")
    public AjaxResult jrmUpdateResults(BsFormulaChildInfo bsFormulaChildInfo)
    {
        return bsFormulaChildInfoService.jrmUpdateResults(bsFormulaChildInfo);
    }

    /**
     * 扫码确认
     */
    @GetMapping("/yzUpdateResults")
    public AjaxResult yzUpdateResults(BsFormulaChildInfo bsFormulaChildInfo)
    {
        return bsFormulaChildInfoService.yzUpdateResults(bsFormulaChildInfo);
    }

    /**
     * 放行请空状态
     */
    @GetMapping("/workpieceRelease")
    public AjaxResult workpieceRelease(BsFormulaChildInfo bsFormulaChildInfo)
    {
        return bsFormulaChildInfoService.workpieceRelease(bsFormulaChildInfo);
    }

    /**
     * 放行请空状态
     */
    @GetMapping("/checkMaterialCode")
    public AjaxResult checkMaterialCode(BsFormulaChildInfo bsFormulaChildInfo)
    {
        return bsFormulaChildInfoService.checkMaterialCode(bsFormulaChildInfo);
    }

    /**
     * 放行请空状态
     */
    @GetMapping("/clearWorkpieceRelease")
    public AjaxResult clearWorkpieceRelease(BsFormulaChildInfo bsFormulaChildInfo)
    {
        return bsFormulaChildInfoService.clearWorkpieceRelease(bsFormulaChildInfo);
    }

    /**
     * 放行请空状态
     */
    @GetMapping("/jrmWorkpieceRelease")
    public AjaxResult jrmWorkpieceRelease(BsFormulaChildInfo bsFormulaChildInfo)
    {
        return bsFormulaChildInfoService.jrmWorkpieceRelease(bsFormulaChildInfo);
    }

    /**
     * 拧紧后更新对应数据
     */
    @GetMapping("/updateTighteningFormula")
    public AjaxResult updateTighteningFormula(BsFormulaChildInfo bsFormulaChildInfo)
    {
        return bsFormulaChildInfoService.updateTighteningFormula(bsFormulaChildInfo);
    }

    /**
     * 拧紧后更新对应数据
     */
    @GetMapping("/yzUpdateTighteningFormula")
    public AjaxResult yzUpdateTighteningFormula(BsFormulaChildInfo bsFormulaChildInfo)
    {
        return bsFormulaChildInfoService.yzUpdateTighteningFormula(bsFormulaChildInfo);
    }

    /**
     * 导出配方配置子信息列表
     */
    @PreAuthorize("@ss.hasPermi('bs:formulaChild:export')")
    @Log(title = "配方配置子信息", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, BsFormulaChildInfo bsFormulaChildInfo)
    {
        List<BsFormulaChildInfo> list = bsFormulaChildInfoService.selectBsFormulaChildInfoList(bsFormulaChildInfo);
        ExcelUtil<BsFormulaChildInfo> util = new ExcelUtil<BsFormulaChildInfo>(BsFormulaChildInfo.class);
        util.exportExcel(response, list, "配方配置子信息数据");
    }

    /**
     * 获取配方配置子信息详细信息
     */
    @PreAuthorize("@ss.hasPermi('bs:formulaChild:query')")
    @GetMapping(value = "/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id)
    {
        return success(bsFormulaChildInfoService.selectBsFormulaChildInfoById(id));
    }

    /**
     * 新增配方配置子信息
     */
    @PreAuthorize("@ss.hasPermi('bs:formulaChild:add')")
    @Log(title = "配方配置子信息", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody BsFormulaChildInfo bsFormulaChildInfo)
    {
        return toAjax(bsFormulaChildInfoService.insertBsFormulaChildInfo(bsFormulaChildInfo));
    }

    /**
     * 修改配方配置子信息
     */
    @PreAuthorize("@ss.hasPermi('bs:formulaChild:edit')")
    @Log(title = "配方配置子信息", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody BsFormulaChildInfo bsFormulaChildInfo)
    {
        return toAjax(bsFormulaChildInfoService.updateBsFormulaChildInfo(bsFormulaChildInfo));
    }

    /**
     * 删除配方配置子信息
     */
    @PreAuthorize("@ss.hasPermi('bs:formulaChild:remove')")
    @Log(title = "配方配置子信息", businessType = BusinessType.DELETE)
	@DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable Long[] ids)
    {
        return toAjax(bsFormulaChildInfoService.deleteBsFormulaChildInfoByIds(ids));
    }
}