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