package com.mes.damage.service.impl; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.yulichang.base.MPJBaseServiceImpl; import com.github.yulichang.query.MPJQueryWrapper; import com.mes.common.config.Const; import com.mes.damage.entity.Damage; import com.mes.damage.entity.DamagePrint; import com.mes.damage.mapper.DamageMapper; import com.mes.damage.service.DamageService; import com.mes.glassinfo.entity.GlassInfo; import com.mes.glassinfo.mapper.GlassInfoMapper; import com.mes.opctask.entity.LoadGlassDeviceTaskHistory; import com.mes.pp.entity.DamageDetails; import com.mes.pp.entity.ReportingWork; import com.mes.pp.entity.ReportingWorkDetail; import com.mes.work_assignment.entity.WorkAssignment; import com.mes.work_assignment.mapper.WorkAssignmentMapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.sql.Timestamp; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author wu * @since 2024-06-13 */ @Slf4j @Service public class DamageServiceImpl extends MPJBaseServiceImpl implements DamageService { @Resource GlassInfoMapper glassInfoMapper; @Resource WorkAssignmentMapper workAssignmentMapper; private final static String ERP_URL = "http://192.168.2.100:8086"; /** * 查询报工信息 */ /** * 分页查询损坏记录 * @param startTime 开始时间(格式:yyyy-MM-dd HH:mm:ss) * @param endTime 结束时间(格式:yyyy-MM-dd HH:mm:ss) * @param type 损坏类型(0表示查询所有类型) * @param status 状态(0表示查询所有状态) * @param workingProcedure 工序("0"表示查询所有工序) * @param pageNum 页码(从1开始) * @param pageSize 每页条数 * @return 分页后的损坏记录列表 */ @Override public Page selectDamage( String startTime, String endTime, int type, int status, String workingProcedure, int pageNum, // 新增:动态页码 int pageSize // 新增:动态每页条数 ) { Page page = new Page<>(pageNum, pageSize); LambdaQueryWrapper damageSelectWrapper = new LambdaQueryWrapper<>(); damageSelectWrapper.between(Damage::getDamageTime, startTime, endTime) .eq(type != 0, Damage::getType, type) .eq(status != 0, Damage::getStatus, status) .eq(!"0".equals(workingProcedure), Damage::getWorkingProcedure, workingProcedure); return this.page(page, damageSelectWrapper); } /** * 提交报工 */ @Override public void submitDamage(List damageList) { Map> firstMap = damageList.stream().collect(Collectors.groupingBy(e -> e.getProcessId() + ":" + e.getWorkingProcedure() + ":" + e.getDeviceName() + ":" + e.getTeamsGroupsName() + ":" + e.getOrderNumber() + ":" + e.getTechnologyNumber())); for (Map.Entry> entry : firstMap.entrySet()) { ReportingWork reportingWork = new ReportingWork(); List reportingWorkDetails = new ArrayList<>(); String key = entry.getKey(); List damages = entry.getValue(); reportingWork.setOrderId(damages.get(0).getProcessId().substring(0, 10)); reportingWork.setProductionId(damages.get(0).getProcessId().substring(0, 11)); reportingWork.setProcessId(damages.get(0).getProcessId() + "/" + damages.get(0).getTechnologyNumber()); // reportingWork.setDeviceName(damages.get(0).getDeviceName()); if (StringUtils.isBlank(damages.get(0).getDeviceName())) { reportingWork.setDeviceName("auto"); } else { reportingWork.setDeviceName(damages.get(0).getDeviceName()); } reportingWork.setThisProcess(damages.get(0).getWorkingProcedure()); reportingWork.setThisCompletedQuantity(0); reportingWork.setThisWornQuantity(0); reportingWork.setClasses("早班"); reportingWork.setReportingWorkTime(LocalDateTime.now()); reportingWork.setTeamsGroupsName(damages.get(0).getTeamsGroupsName()); reportingWork.setCreator("auto"); ReportingWorkDetail reportingWorkDetail = new ReportingWorkDetail(); reportingWorkDetail.setTechnologyNumber(damages.get(0).getTechnologyNumber()); reportingWorkDetail.setOrderNumber(damages.get(0).getOrderNumber()); reportingWorkDetail.setCompletedQuantity(0); reportingWorkDetail.setBreakageQuantity(0); Map> secondMap = damages.stream().collect(Collectors.groupingBy(e -> e.getProcessId() + ":" + e.getWorkingProcedure() + ":" + e.getDeviceName() + ":" + e.getTeamsGroupsName())); List damageDetailses = new ArrayList<>(); for (Map.Entry> entrys : secondMap.entrySet()) { List damagesdetails = entrys.getValue(); if (damagesdetails.get(0).getType() != 8 && damagesdetails.get(0).getType() != 9) { reportingWorkDetail.setCompletedQuantity(damagesdetails.size()); reportingWork.setThisCompletedQuantity(damagesdetails.size() + reportingWork.getThisCompletedQuantity()); } else { reportingWork.setThisWornQuantity(damagesdetails.size() + reportingWork.getThisWornQuantity()); reportingWorkDetail.setBreakageQuantity(damagesdetails.size()); DamageDetails damageDetails = new DamageDetails(); damageDetails.setBreakageQuantity(damagesdetails.size()); damageDetails.setBreakageType(damagesdetails.get(0).getBreakageType()); damageDetails.setBreakageReason(damagesdetails.get(0).getBreakageReason()); damageDetails.setResponsibleProcess(damagesdetails.get(0).getResponsibleProcess()); damageDetails.setResponsibleEquipment(damagesdetails.get(0).getResponsibleEquipment()); damageDetails.setResponsibleTeam(damagesdetails.get(0).getResponsibleTeam()); damageDetails.setResponsiblePersonnel(null); if (damagesdetails.get(0).getStatus() == 7) { damageDetails.setQualityInspector("auto"); damageDetails.setPatchStatus(1); damageDetails.setQualityInsStatus(2); } else { damageDetails.setQualityInspector(""); damageDetails.setPatchStatus(0); damageDetails.setQualityInsStatus(0); } damageDetailses.add(damageDetails); } } reportingWorkDetails.add(reportingWorkDetail); reportingWorkDetail.setDamageDetails(damageDetailses); sendToERP(reportingWork, reportingWorkDetails, Boolean.FALSE); } } @Override public Boolean submitReport(Damage damage) { ReportingWork reportingWork = new ReportingWork(); reportingWork.setOrderId(damage.getProcessId().substring(0, 10)); reportingWork.setProductionId(damage.getProcessId().substring(0, 11)); reportingWork.setProcessId(damage.getProcessId() + "/" + damage.getTechnologyNumber()); if (StringUtils.isBlank(damage.getDeviceName())) { reportingWork.setDeviceName("auto"); } else { reportingWork.setDeviceName(damage.getDeviceName()); } reportingWork.setThisProcess(damage.getWorkingProcedure()); reportingWork.setThisCompletedQuantity(1); reportingWork.setThisWornQuantity(0); reportingWork.setClasses("早班"); reportingWork.setReportingWorkTime(LocalDateTime.now()); reportingWork.setTeamsGroupsName(damage.getTeamsGroupsName()); reportingWork.setCreator("auto"); List reportingWorkDetails = new ArrayList<>(); ReportingWorkDetail reportingWorkDetail = new ReportingWorkDetail(); reportingWorkDetail.setTechnologyNumber(damage.getTechnologyNumber()); reportingWorkDetail.setOrderNumber(damage.getOrderNumber()); reportingWorkDetail.setCompletedQuantity(1); reportingWorkDetail.setBreakageQuantity(0); reportingWorkDetails.add(reportingWorkDetail); return sendToERP(reportingWork, reportingWorkDetails, Boolean.TRUE); } @Override public void autoSubmitReport(String glassId, int deviceId, String workingProcedure, String remark, int type) { Damage damage = new Damage(); damage.setGlassId(glassId); damage.setWorkingProcedure(workingProcedure); damage.setLine(deviceId); damage.setType(type); damage.setRemark(remark); this.insertDamage(damage); } /** * 添加报工信息 */ @Override public void insertDamage(Damage damage) { List damage1 = null; if (Const.GLASS_STATE_DAMAGE.equals(damage.getType()) || Const.GLASS_STATE_TAKE.equals(damage.getType())) { damage1 = baseMapper.selectList( new LambdaQueryWrapper() .in(Damage::getType, Const.GLASS_STATE_DAMAGE, Const.GLASS_STATE_TAKE) .notIn(Damage::getStatus, 7, 8) .lt(Damage::getStatus, 7) .eq(Damage::getGlassId, damage.getGlassId()) ); } else { damage1 = baseMapper.selectList( new LambdaQueryWrapper() .notIn(Damage::getType, Const.GLASS_STATE_DAMAGE, Const.GLASS_STATE_TAKE) .eq(Damage::getLine, damage.getLine()) .eq(Damage::getWorkingProcedure, damage.getWorkingProcedure()) .eq(Damage::getGlassId, damage.getGlassId()) ); } if (damage1 == null || damage1.size() == 0) { LambdaQueryWrapper glassInfoSelectWrapper = new LambdaQueryWrapper<>(); glassInfoSelectWrapper.eq(GlassInfo::getGlassId, damage.getGlassId()); GlassInfo glassInfo = glassInfoMapper.selectOne(glassInfoSelectWrapper); BeanUtils.copyProperties(glassInfo, damage); LambdaQueryWrapper workAssignmentSelectWrapper = new LambdaQueryWrapper<>(); workAssignmentSelectWrapper .eq(WorkAssignment::getLine, damage.getLine()) .eq(WorkAssignment::getWorkProcesses, damage.getWorkingProcedure()); WorkAssignment workAssignment = workAssignmentMapper.selectOne(workAssignmentSelectWrapper); if (workAssignment != null) { damage.setTeamsGroupsName(workAssignment.getTeamsGroupsName()); damage.setDeviceName(workAssignment.getDeviceName()); } damage.setProcessId(glassInfo.getFlowCardId()); damage.setOrderNumber(glassInfo.getGlassType()); damage.setTechnologyNumber(glassInfo.getLayer()); damage.setDamageTime(Timestamp.valueOf(LocalDateTime.now())); if (damage.getType() == null) { damage.setType(1); } if (damage.getType() == 1 && submitReport(damage)) { damage.setStatus(3); } else { damage.setStatus(1); } baseMapper.insert(damage); } } /** * 添加报工信息 */ @Override public void batchInsertDamage(List damageList) { WorkAssignment workAssignment = workAssignmentMapper.selectOne(new LambdaQueryWrapper() .eq(WorkAssignment::getLine, damageList.get(0).getLine()) .eq(WorkAssignment::getWorkProcesses, damageList.get(0).getWorkingProcedure())); List glassList = damageList.stream().map(Damage::getGlassId).collect(Collectors.toList()); List glassInfoList = glassInfoMapper.selectList(new LambdaQueryWrapper().in(GlassInfo::getGlassId, glassList)); Map> listMap = glassInfoList.stream().collect(Collectors.groupingBy(GlassInfo::getGlassId)); for (Damage damage : damageList) { GlassInfo glassInfo = listMap.get(damage.getGlassId()).get(0); BeanUtils.copyProperties(glassInfo, damage); if (workAssignment != null) { damage.setTeamsGroupsName(workAssignment.getTeamsGroupsName()); damage.setDeviceName(workAssignment.getDeviceName()); } damage.setProcessId(glassInfo.getFlowCardId()); damage.setOrderNumber(glassInfo.getGlassType()); damage.setTechnologyNumber(glassInfo.getLayer()); damage.setDamageTime(Timestamp.valueOf(LocalDateTime.now())); } this.saveBatch(damageList); } /** * 拿走打印数据查询 */ @Override public List selectDamagePrint(Damage damage) { MPJQueryWrapper listDamage = new MPJQueryWrapper() .select("t.engineer_id,t.glass_id,b.tempering_layout_id,b.tempering_feed_sequence,b.width,b.height,b.thickness") .leftJoin("glass_info as b on t.glass_id=b.glass_id") .eq("t.working_procedure", damage.getWorkingProcedure()) .eq("t.type", damage.getType()); // 动态添加条件,当 id 有值时 if (damage.getEngineerId() != null) { listDamage.eq("t.engineer_id", damage.getEngineerId()); } return baseMapper.selectJoinList(DamagePrint.class, listDamage); } /** * 拿走打印打印详情查询 */ @Override public List selectDamagePrintDetails(Damage damage) { List listDamage = baseMapper.selectJoinList(DamagePrint.class, new MPJQueryWrapper() .select("b.flow_card_id,b.layer,t.engineer_id,b.tempering_layout_id,b.tempering_feed_sequence,t.glass_id,b.width,b.height,b.thickness") .leftJoin("glass_info as b on t.glass_id=b.glass_id") .eq("t.working_procedure", damage.getWorkingProcedure()) .eq("t.type", damage.getType()) .eq("t.engineer_id", damage.getEngineerId()) ); return listDamage; } @Override public void deleteByGlassId(String glassId) { baseMapper.delete( new LambdaQueryWrapper() .eq(Damage::getGlassId, glassId) .in(Damage::getType, Const.GLASS_STATE_DAMAGE_TAKE) .lt(Damage::getStatus, 7) ); } @Override public Boolean sendToERP(ReportingWork reportingWork, List reportingWorkDetails, Boolean type) { log.info("报工数据reportingWork:{},reportingWorkDetails:{}", reportingWork, reportingWorkDetails); try { // 目标系统的API URL String url1 = ERP_URL + "/reportingWork/mesReportingWork"; String url2 = ERP_URL + "/reportingWork/mesSaveReportingWorkWorn"; String url; if (type) { url = url1; } else { url = url2; } URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); // 设置请求方法和请求头 con.setRequestMethod("POST"); con.setRequestProperty("Content-Type", "application/json; utf-8"); con.setRequestProperty("Accept", "application/json"); con.setDoOutput(true); // 创建 JSON 对象 JSONObject result = new JSONObject(); ObjectMapper objectMapper = new ObjectMapper(); // 将 ReportingWork 转换为 JSONObject // 将 ReportingWorkDetail 列表转换为 JSONArray if (type) { JSONObject detailsJsonObject = new JSONObject(objectMapper.writeValueAsString(reportingWorkDetails.get(0))); result.put("detail", detailsJsonObject); reportingWork.setProcessId(reportingWork.getProcessId().substring(0, 14)); } else { JSONArray detailsJsonArray = new JSONArray(objectMapper.writeValueAsString(reportingWorkDetails)); result.put("detail", detailsJsonArray); } JSONObject reportingWorkJson = new JSONObject(objectMapper.writeValueAsString(reportingWork)); reportingWorkJson.put("reportingWorkTime", reportingWork.getReportingWorkTime().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); // 将 JSON 对象和数组添加到结果对象中 result.put("title", reportingWorkJson); result.put("type", 0); if (reportingWorkDetails.get(0).getDamageDetails() != null) { if (reportingWorkDetails.get(0).getDamageDetails().get(0).getPatchStatus() == 1) { result.put("isPatch", 1); } else { result.put("isPatch", 0); } } result.put("userId", "admin"); result.put("userName", "admin"); result.put("qualityInsStatus", 0); // 将 result 对象转换为字符串 String jsonInputString = result.toString(); System.out.println("jsonInputString : " + result); // 发送请求 try (OutputStream os = con.getOutputStream()) { byte[] input = jsonInputString.getBytes("utf-8"); os.write(input, 0, input.length); } // 获取响应码 int responseCode = con.getResponseCode(); System.out.println("Response Code : " + responseCode); // 获取响应内容 try (BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8"))) { StringBuilder response = new StringBuilder(); String inputLine; while ((inputLine = in.readLine()) != null) { response.append(inputLine); } // 解析响应内容 JSONObject jsonResponse = new JSONObject(response.toString()); // 提取 code 和 message int code = jsonResponse.getInt("code"); String message = jsonResponse.getStr("data"); log.info("报工情况:{},{}", code, message); if (code == 200 && message.equals("true")) { return true; } else { return false; } } } catch (Exception e) { e.printStackTrace(); return false; } } @Override public List queryUnTempByFlowCardId(String flowCardId){ return baseMapper.queryUnTempByFlowCardId(flowCardId); } }