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;
}
}
}