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.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.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.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; @Override public List selectDamage(String startTime, String endTime, int type, String workingProcedure) { return null; } /** * 查询报工信息 */ @Override public List selectDamage(String startTime, String endTime, int type, int status, String workingProcedure) { LambdaQueryWrapper damageSelectWrapper = new LambdaQueryWrapper<>(); damageSelectWrapper.between(Damage::getDamageTime, startTime, endTime); if (type != 0) { damageSelectWrapper.eq(Damage::getType, type); } if (status != 0) { damageSelectWrapper.eq(Damage::getStatus, status); } if (!"0".equals(workingProcedure)) { damageSelectWrapper.eq(Damage::getWorkingProcedure, workingProcedure); } List damageList = baseMapper.selectList(damageSelectWrapper); for (Damage damage : damageList) { damage.setStatus(2); } return baseMapper.selectList(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()); 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); damageDetailses.add(damageDetails); } } reportingWorkDetails.add(reportingWorkDetail); reportingWorkDetail.setDamageDetailsList(damageDetailses); sendToERP(reportingWork, reportingWorkDetails); } } @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()); reportingWork.setDeviceName(damage.getDeviceName()); reportingWork.setThisProcess(damage.getWorkingProcedure()); // reportingWork.setNextProcess("磨边"); 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); } /** * 添加报工信息 */ @Override public void insertDamage(Damage damage) { List damage1 = baseMapper.selectList( new LambdaQueryWrapper() .ne(Damage::getType, Const.GLASS_STATE_DAMAGE) .ne(Damage::getType, 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) { if (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, Const.GLASS_STATE_TAKE) ); } @Override public Boolean sendToERP(ReportingWork reportingWork, List reportingWorkDetails) { log.info("报工数据reportingWork:{},reportingWorkDetails:{}", reportingWork, reportingWorkDetails); try { // 目标系统的API URL String url = "http://192.168.1.199:8086/reportingWork/mesSaveReportingWorkWorn"; 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 JSONObject reportingWorkJson = new JSONObject(objectMapper.writeValueAsString(reportingWork)); reportingWorkJson.put("reportingWorkTime", reportingWork.getReportingWorkTime().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); // 将 ReportingWorkDetail 列表转换为 JSONArray JSONArray detailsJsonArray = new JSONArray(objectMapper.writeValueAsString(reportingWorkDetails)); // 将 JSON 对象和数组添加到结果对象中 result.put("title", reportingWorkJson); result.put("detail", detailsJsonArray); result.put("type", 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; } } }