package com.mes.base.damage.service.impl;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.smallbun.screw.core.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mes.base.damage.mapper.DamageMapper;
import com.mes.base.damage.service.DamageService;
import com.mes.base.damagedetails.service.DamageDetailsService;
import com.mes.base.glassinfo.service.GlassInfoService;
import com.mes.base.work.service.WorkAssignmentService;
import com.mes.damage.Damage;
import com.mes.damage.dto.DamageDTO;
import com.mes.damage.request.DamageReportRequest;
import com.mes.damage.request.DamageRequest;
import com.mes.damagedetails.DamageDetails;
import com.mes.erp.DamageDetailsList;
import com.mes.erp.ReportingWork;
import com.mes.erp.ReportingWorkDetail;
import com.mes.feign.ErpUrlOpenFeignService;
import com.mes.glassinfo.GlassInfo;
import com.mes.reportinfo.request.ReportQueryRequest;
import com.mes.sysconst.Const;
import com.mes.work.WorkAssignment;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
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 ServiceImpl implements DamageService {
@Resource
ErpUrlOpenFeignService erpUrlOpenFeignService;
@Resource
WorkAssignmentService workAssignmentService;
@Resource
DamageDetailsService damageDetailsService;
@Resource
GlassInfoService glassInfoService;
/**
* 添加报工信息
*/
@Override
public void saveDamage(DamageDTO damageDTO) {
//判断破损数据是否已经存在,避免重复添加
if (getReportExist(damageDTO)) {
//补充破损数据中缺少的小片数据
Damage damage = new Damage();
BeanUtils.copyProperties(damageDTO, damage);
LambdaQueryWrapper glassInfoSelectWrapper = new LambdaQueryWrapper<>();
glassInfoSelectWrapper.eq(GlassInfo::getGlassId, damage.getGlassId());
GlassInfo glassInfo = glassInfoService.getOne(glassInfoSelectWrapper);
BeanUtils.copyProperties(glassInfo, damage);
damage.setProductSortNumber(glassInfo.getProductSortNumber());
damage.setCreateTime(LocalDateTime.now().toString());
damage.setReportState(Const.REPORT_STATE_COMPLETE);
//补充值班信息
WorkAssignment workAssignment = workAssignmentService.getOne(
new LambdaQueryWrapper()
.eq(WorkAssignment::getLine, damage.getLine())
.eq(WorkAssignment::getWorkProcess, damage.getWorkingProcedure())
);
if (workAssignment != null) {
damage.setTeamsGroupsName(workAssignment.getTeamsGroupsName());
damage.setDeviceName(workAssignment.getDeviceName());
}
this.save(damage);
}
}
/**
* 提交报工
*/
@Override
public void submitDamage(DamageReportRequest damageReportRequest) {
List damageList = damageReportRequest.getDamageList();
Map> firstMap = damageList.stream().collect(Collectors.groupingBy(e -> e.getFlowCardId() + ":"
+ e.getWorkingProcedure() + ":" + e.getDeviceName() + ":" + e.getTeamsGroupsName() + ":" + e.getProductSortNumber() + ":" + e.getLayer()));
//保存破损明细数据
DamageDetails newDamageDetails = new DamageDetails();
BeanUtils.copyProperties(damageReportRequest, newDamageDetails);
damageDetailsService.save(newDamageDetails);
for (Map.Entry> entry : firstMap.entrySet()) {
ReportingWork reportingWork = new ReportingWork();
List reportingWorkDetails = new ArrayList<>();
List damages = entry.getValue();
reportingWork.setOrderId(damages.get(0).getFlowCardId().substring(0, 10));
reportingWork.setProductionId(damages.get(0).getFlowCardId().substring(0, 11));
reportingWork.setProcessId(damages.get(0).getFlowCardId() + "/" + damages.get(0).getLayer());
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).getLayer());
reportingWorkDetail.setOrderNumber(damages.get(0).getProductSortNumber());
reportingWorkDetail.setCompletedQuantity(0);
reportingWorkDetail.setBreakageQuantity(0);
reportingWork.setThisWornQuantity(damages.size());
reportingWorkDetail.setBreakageQuantity(damages.size());
//破损明细数据填充
int reportState = Const.REPORT_STATE_REPORTED;
DamageDetailsList damageDetails = new DamageDetailsList();
damageDetails.setBreakageQuantity(damages.size());
damageDetails.setBreakageType(damageReportRequest.getBreakageType());
damageDetails.setBreakageReason(damageReportRequest.getBreakageReason());
damageDetails.setResponsibleProcess(damageReportRequest.getResponsibleProcess());
damageDetails.setResponsibleEquipment(damageReportRequest.getResponsibleEquipment());
damageDetails.setResponsibleTeam(damageReportRequest.getResponsibleTeam());
damageDetails.setResponsiblePersonnel(null);
if (Const.REPORT_STATE_PATCHED.equals(damages.get(0).getReportState())) {
damageDetails.setQualityInspector("auto");
damageDetails.setPatchStatus(1);
damageDetails.setQualityInsStatus(2);
reportState = Const.REPORT_STATE_SYNC;
} else {
damageDetails.setQualityInspector("");
damageDetails.setPatchStatus(0);
damageDetails.setQualityInsStatus(0);
}
reportingWorkDetail.setDamageDetails(Arrays.asList(damageDetails));
reportingWorkDetails.add(reportingWorkDetail);
// 创建 JSON 对象,报工数据添加到对象中
JSONObject result = new JSONObject();
try {
ObjectMapper objectMapper = new ObjectMapper();
JSONArray detailsJsonArray = new JSONArray(objectMapper.writeValueAsString(reportingWorkDetails));
result.set("detail", detailsJsonArray);
JSONObject reportingWorkJson = new JSONObject(objectMapper.writeValueAsString(reportingWork));
reportingWorkJson.set("reportingWorkTime", reportingWork.getReportingWorkTime().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
result.set("title", reportingWorkJson);
result.set("type", 0);
//状态为已现补的将补片状态改为1
if (reportingWorkDetails.get(0).getDamageDetails() != null) {
if (reportingWorkDetails.get(0).getDamageDetails().get(0).getPatchStatus() == 1) {
result.set("isPatch", 1);
} else {
result.set("isPatch", 0);
}
}
result.set("userId", "admin");
result.set("userName", "admin");
result.set("qualityInsStatus", 0);
} catch (Exception e) {
log.error("JSON转换失败", e);
}
if (erpUrlOpenFeignService.mesSaveReportingWorkWorn(result).getData()) {
//更新报工状态,更新关系表
for (Damage damage : damages
) {
damage.setReportState(reportState);
damage.setDamageDetailsId(newDamageDetails.getId());
}
this.updateBatchById(damages);
} else {
log.info("报破损失败,玻璃信息:{}", damages);
}
}
}
@Override
public Page queryDamage(ReportQueryRequest reportQueryRequest) {
return this.page(
new Page<>(reportQueryRequest.getPageNo(), reportQueryRequest.getPageSize()),
new LambdaQueryWrapper()
.eq(Damage::getWorkingProcedure, reportQueryRequest.getWorkingProcedure())
.eq(Damage::getReportState, reportQueryRequest.getState())
.eq(!reportQueryRequest.getGlassId().isEmpty(), Damage::getGlassId, reportQueryRequest.getGlassId())
.between(null != reportQueryRequest.getStartTime(), Damage::getCreateTime, reportQueryRequest.getStartTime(), reportQueryRequest.getEndTime())
);
}
@Override
public Boolean saveBatchDamage(DamageRequest request) {
for (String glassId : request.getGlassIdList()) {
DamageDTO damageDTO = new DamageDTO();
BeanUtils.copyProperties(request, damageDTO);
damageDTO.setGlassId(glassId);
saveDamage(damageDTO);
}
return Boolean.TRUE;
}
@Override
public Boolean saveBatchDamageByFlowCardId(DamageRequest request) {
return null;
}
private Boolean getReportExist(DamageDTO damageDTO) {
//判断破损数据是否已存在
List damages = this.list(
new LambdaQueryWrapper()
.notIn(Damage::getReportState, Const.REPORT_STATE_PATCH_ALL)
.lt(Damage::getReportState, Const.REPORT_STATE_PATCHED)
.eq(Damage::getGlassId, damageDTO.getGlassId())
);
if (CollectionUtils.isEmpty(damages)) {
return Boolean.TRUE;
} else {
log.info("破损数据已存在,玻璃号:{}", damageDTO.getGlassId());
return Boolean.FALSE;
}
}
}