|
package com.example.erp.service.pp;
|
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.dynamic.datasource.annotation.DS;
|
import com.example.erp.common.RabbitMQUtil;
|
import com.example.erp.entity.pp.FlowCard;
|
import com.example.erp.entity.pp.OptimizeProjectMange;
|
import com.example.erp.entity.pp.PatchLog;
|
import com.example.erp.entity.userInfo.Log;
|
import com.example.erp.entity.userInfo.SysError;
|
import com.example.erp.mapper.pp.GlassOptimizeMapper;
|
import com.example.erp.service.userInfo.SysErrorService;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
|
import java.io.IOException;
|
import java.math.BigDecimal;
|
import java.sql.Date;
|
import java.text.DecimalFormat;
|
import java.util.*;
|
import java.util.concurrent.TimeoutException;
|
import java.util.stream.Collectors;
|
|
@Service
|
@Transactional(rollbackFor = Exception.class)
|
@DS("sd")
|
public class GlassOptimizeService {
|
@Autowired
|
GlassOptimizeMapper glassOptimizeMapper;
|
@Autowired
|
SysErrorService sysErrorService;
|
|
RabbitMQUtil rabbitMQUtil;
|
//模拟计算
|
|
public Map<String, Object> SimulationCalculation(Map<String,Object> message) {
|
Map<String, Object> map = new HashMap<>();
|
try {
|
rabbitMQUtil = new RabbitMQUtil();
|
// 发送消息
|
|
|
// 获取 computeData 和 cardData
|
/*Object computeData = message.get("computeData");
|
Object cardData = message.get("cardData");*/
|
|
rabbitMQUtil.sendMessage(message.toString());
|
System.out.println("send message: " + message);
|
String date = rabbitMQUtil.receiveMessages();
|
System.out.println("Received message: " + date);
|
|
// 关闭连接
|
rabbitMQUtil.close();
|
map.put("data", date);
|
|
} catch (IOException e) {
|
e.printStackTrace();
|
} catch (TimeoutException | InterruptedException e) {
|
e.printStackTrace();
|
}
|
|
return map;
|
}
|
|
|
//模拟计算保存
|
public Boolean addSimulation(Map<String, Object> object) {
|
try {
|
glassOptimizeMapper.addSimulation(object);
|
glassOptimizeMapper.addratioResult(object);
|
glassOptimizeMapper.addratioProjectResult(object);
|
|
return true;
|
} catch (Exception e) {
|
e.printStackTrace();
|
return false;
|
}
|
}
|
|
|
//优化设置保存
|
public Boolean optimizeParmsSave(Map<String, Object> object) {
|
try {
|
ObjectMapper mapper = new ObjectMapper();
|
String jsonString = mapper.writeValueAsString(object);
|
|
glassOptimizeMapper.optimizeParmsSave(jsonString);
|
return true;
|
} catch (Exception e) {
|
e.printStackTrace();
|
return false;
|
}
|
}
|
|
|
|
//优化调整结果保存
|
public Boolean saveOptimizeResult(Map<String, Object> object) {
|
try {
|
ObjectMapper mapper = new ObjectMapper();
|
String jsonString = mapper.writeValueAsString(object);
|
glassOptimizeMapper.optimizeResultSave(jsonString);
|
return true;
|
} catch (Exception e) {
|
e.printStackTrace();
|
return false;
|
}
|
}
|
|
|
public Boolean updateOptimizeResult(Map<String, Object> object,String processId){
|
try {
|
ObjectMapper mapper = new ObjectMapper();
|
String jsonString = mapper.writeValueAsString(object);
|
glassOptimizeMapper.updateOptimizeResult(jsonString,processId);
|
return true;
|
} catch (Exception e) {
|
e.printStackTrace();
|
return false;
|
}
|
}
|
|
//优化调整结果查询
|
public Map<String, Object> selectOptimizeResult(String processId) {
|
Map<String, Object> map = new HashMap<>();
|
map.put("data", glassOptimizeMapper.selectOptimizeResult(processId));
|
return map;
|
}
|
|
//工程信息
|
public Map<String, Object> projectInfoSv(String projectNo) {
|
Map<String, Object> stringObjectMap = glassOptimizeMapper.selectProjectCount(projectNo);
|
Map<String, Object> map = new HashMap<>();
|
if(Integer.parseInt(stringObjectMap.get("state").toString())<10){
|
map.put("data", glassOptimizeMapper.firstOptimization(projectNo));
|
map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming());
|
}else if(stringObjectMap.get("state").equals(10)){
|
map.put("data", glassOptimizeMapper.analogComputationOptimization(projectNo));
|
map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming());
|
}else{
|
map.put("data", glassOptimizeMapper.analogComputationOptimization(projectNo));
|
map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming());
|
}
|
return map;
|
}
|
|
|
//工程信息流程卡
|
public Map<String, Object> getProcessCardSv(String projectNo) {
|
Map<String, Object> map = new HashMap<>();
|
map.put("data", glassOptimizeMapper.getProcessCardMp(projectNo));
|
return map;
|
}
|
|
//库存信息
|
public Map<String, Object> materialStoreSv(String thickness, String model, String projectNumber,Integer type) {
|
Map<String, Object> stringObjectMap = glassOptimizeMapper.selectProjectCount(projectNumber);
|
Map<String, Object> map = new HashMap<>();
|
if(Integer.parseInt(stringObjectMap.get("state").toString())<10){
|
if(type==1){
|
map.put("data", glassOptimizeMapper.materialStoreMp(thickness,model));
|
}else if(type==2){
|
map.put("data", glassOptimizeMapper.surplusMaterialsMp(thickness,model));
|
}else{
|
map.put("data", glassOptimizeMapper.materialStoreSurplusMp(thickness,model));
|
}
|
map.put("edgeTrimming", glassOptimizeMapper.getEdgeTrimming());
|
}else if(Integer.parseInt(stringObjectMap.get("state").toString())==10){
|
if(type==1){
|
map.put("data", glassOptimizeMapper.materialStoreMp(thickness,model));
|
}else if(type==2){
|
map.put("data", glassOptimizeMapper.surplusMaterialsMp(thickness,model));
|
}else{
|
map.put("data", glassOptimizeMapper.materialStoreSurplusMp(thickness,model));
|
}
|
map.put("edgeTrimming", glassOptimizeMapper.getEdgeTrimming());
|
}else{
|
map.put("data", glassOptimizeMapper.materialStoreOptimizeUse(projectNumber));
|
map.put("edgeTrimming", null);
|
}
|
map.put("state", Integer.parseInt(stringObjectMap.get("state").toString()));
|
return map;
|
}
|
|
|
//工程查询流程卡
|
public Map<String, Object> getFlowCardList(String optionVal, Integer radio) {
|
Map<String, Object> map = new HashMap<>();
|
if(radio==1){
|
map.put("data", glassOptimizeMapper.getFlowCardListWhole(optionVal));
|
}else if(radio==2){
|
map.put("data", glassOptimizeMapper.getFlowCardListNormal(optionVal));
|
}else{
|
map.put("data", glassOptimizeMapper.getFlowCardListPatch(optionVal));
|
}
|
|
|
return map;
|
}
|
|
public Map<String, Object> getUpdateFlowCardList(String type,String thickness, Integer radio,String projectNo) {
|
Map<String, Object> map = new HashMap<>();
|
if(radio==1){
|
map.put("data", glassOptimizeMapper.getFlowCardListModify(type,thickness,projectNo));
|
}else if(radio==2){
|
map.put("data", glassOptimizeMapper.getFlowCardListNormal(type));
|
}else{
|
map.put("data", glassOptimizeMapper.getFlowCardListPatch(type));
|
}
|
|
|
return map;
|
}
|
|
//工程管理查询
|
public Map<String, Object> OptimizeProjectMange(Date startSelectTime, Date endSelectTime, OptimizeProjectMange optimizeProjectMange) {
|
Map<String, Object> map = new HashMap<>();
|
map.put("data", glassOptimizeMapper.optimizeProjectMangeMp(startSelectTime, endSelectTime , optimizeProjectMange));
|
return map;
|
}
|
|
//修改排版状态
|
public Boolean updateProjectState(String projectNumber, Integer state, Integer code) {
|
if (!projectNumber.isEmpty()) {
|
//撤销模拟计算
|
if(code==1){
|
glassOptimizeMapper.deleteOptimizeHeatDetail(projectNumber);
|
glassOptimizeMapper.deleteOptimizeHeatLayout(projectNumber);
|
glassOptimizeMapper.updateProjectStateMp(projectNumber, state);
|
}
|
//撤销优化排版
|
else if(code==2){
|
glassOptimizeMapper.deleteOptimizeHeatDetail(projectNumber);
|
glassOptimizeMapper.deleteOptimizeHeatDetail(projectNumber);
|
glassOptimizeMapper.deleteOptimizeHeatLayout(projectNumber);
|
glassOptimizeMapper.updateProjectStateMp(projectNumber, state);
|
}
|
//允许生产
|
else if(code==3){
|
glassOptimizeMapper.updateProjectStateMp(projectNumber, state);
|
}
|
//生产不可见
|
else if(code==4){
|
glassOptimizeMapper.updateProjectStateMp(projectNumber, state);
|
}
|
//初始化工程
|
else if(code==5){
|
glassOptimizeMapper.updateProjectStateMp(projectNumber, state);
|
}
|
return true;
|
} else {
|
return false;
|
}
|
}
|
|
//删除工程
|
public boolean deleteProject(String projectNumber,Integer type) {
|
Map<String, Object> stringObjectMap = glassOptimizeMapper.selectProjectCount(projectNumber);
|
if(stringObjectMap.get("state").equals(10)){
|
glassOptimizeMapper.deleteOptimizeHeatDetail(projectNumber);
|
glassOptimizeMapper.deleteOptimizeHeatLayout(projectNumber);
|
}else if(stringObjectMap.get("state").equals(20)){
|
glassOptimizeMapper.deleteOptimizeDetail(projectNumber);
|
glassOptimizeMapper.deleteOptimizeHeatDetail(projectNumber);
|
glassOptimizeMapper.deleteOptimizeHeatLayout(projectNumber);
|
}
|
List<FlowCard> flowCardList =glassOptimizeMapper.getFlowCardList(projectNumber);
|
List<PatchLog> patchLogList =glassOptimizeMapper.getPatchLogList(projectNumber);
|
if(flowCardList!=null){
|
for (FlowCard flowCard:flowCardList){
|
glassOptimizeMapper.updateFlowCardProjectReturn(flowCard.getProcessId(),flowCard.getTechnologyNumber(),projectNumber);
|
}
|
}
|
if(patchLogList!=null){
|
for (PatchLog patchLog:patchLogList){
|
glassOptimizeMapper.updatePatchLogProjectReturn(patchLog.getProcessId(),patchLog.getTechnologyNumber(),projectNumber);
|
}
|
}
|
//判断是否是修改工程
|
if(type.equals(1)){
|
glassOptimizeMapper.deleteProjectMp(projectNumber);
|
}
|
return true;
|
}
|
|
|
public Map<String, Object> getProjectListSv() {
|
Map<String, Object> map = new HashMap<>();
|
map.put("data", glassOptimizeMapper.getProjectListMp());
|
return map;
|
}
|
|
//模拟计算工程号查询
|
public Map<String, Object>selectProjectComputeSv(String projectNumber) {
|
Map<String, Object> map = new HashMap<>();
|
map.put("data", glassOptimizeMapper.selectProjectComputeMp(projectNumber));
|
//map.put("project", glassOptimizeMapper.selectProjectCount(projectNumber));
|
return map;
|
}
|
|
public Map<String, Object>selectProjectComputeAll(String projectNumber) {
|
Map<String, Object> map = new HashMap<>();
|
List<Map<String, Object>> projectComputeMpList=glassOptimizeMapper.selectProjectComputeMp(projectNumber);
|
for (Map<String, Object> stringObjectMap : projectComputeMpList) {
|
stringObjectMap.get("process_id");
|
stringObjectMap.get("technology_number");
|
}
|
map.put("data", glassOptimizeMapper.selectProjectComputeMp(projectNumber));
|
//map.put("project", glassOptimizeMapper.selectProjectCount(projectNumber));
|
return map;
|
}
|
|
//模拟计算流程卡详情
|
public Map<String, Object>selectComputeDetailSv(String processId,Integer technologyNumber,String patchState) {
|
Map<String, Object> map = new HashMap<>();
|
if(patchState.equals("0")){
|
map.put("data", glassOptimizeMapper.selectComputeDetailMp(processId,technologyNumber));
|
}else{
|
map.put("data", glassOptimizeMapper.selectComputeDetailMpPatchState(processId,technologyNumber));
|
}
|
return map;
|
}
|
|
public Map<String, Object> getProcessCardDetailSv(String processId, Integer technologyNumber) {
|
Map<String, Object> map = new HashMap<>();
|
map.put("data", glassOptimizeMapper.getProcessCardDetailmMp(processId,technologyNumber));
|
return map;
|
}
|
|
public Map<String, Object> selectGlassTypeSv() {
|
Map<String, Object> map = new HashMap<>();
|
map.put("data", glassOptimizeMapper.selectGlassTypeMp());
|
return map;
|
}
|
|
|
public Map<String, Object> getProjectIdSv() {
|
Map<String, Object> map = new HashMap<>();
|
map.put("data", glassOptimizeMapper.getProjectIdSv());
|
return map;
|
}
|
|
public String addProjectSv(String optionVal, String projectId, String projectNmae, Map<String, Object> object) {
|
String saveState = "true";
|
//设置回滚点
|
Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
|
try {
|
String userName = "";
|
if (object.get("userName") != null) {
|
userName = object.get("userName").toString();
|
}
|
String projectType = "";
|
if (object.get("projectType") != null) {
|
projectType = object.get("projectType").toString();
|
}
|
if ("null".equals(projectNmae)) {
|
projectNmae = "";
|
}
|
BigDecimal sumArea = new BigDecimal(0);
|
double area = 0;
|
Integer sumQuantity = 0;
|
Integer type = 0;
|
int state1 = 0;
|
int state2 = 0;
|
StringBuilder processId= new StringBuilder();
|
List<FlowCard> flowCardList = JSONArray.parseArray(JSONObject.toJSONString(object.get("projectdetail")), FlowCard.class);
|
if (!flowCardList.isEmpty()) {
|
if(projectType.equals("2")){
|
deleteProject(projectId,2);
|
}
|
for (FlowCard flowCard : flowCardList) {
|
if(flowCard.getPatchState().equals(0)){
|
state1=1;
|
//给流程卡表添加对应的工程号
|
Boolean a=glassOptimizeMapper.updateFlowCardProject(flowCard.getProcessId(),flowCard.getTechnologyNumber(),projectId);
|
area = glassOptimizeMapper.getSelectArea(flowCard.getProcessId(),flowCard.getTechnologyNumber()).doubleValue();
|
sumArea = sumArea.add(BigDecimal.valueOf(area));
|
sumQuantity +=flowCard.getQuantity();
|
processId.append(flowCard.getProcessId()).append("-").append(flowCard.getTechnologyNumber()).append(";");
|
}else{
|
state2=1;
|
Boolean a=glassOptimizeMapper.updatePatchLogProject(flowCard.getProcessId(),flowCard.getTechnologyNumber(),projectId);
|
area = glassOptimizeMapper.getSelectAreaPatchLog(flowCard.getProcessId(),flowCard.getTechnologyNumber()).doubleValue();
|
sumArea = sumArea.add(BigDecimal.valueOf(area));
|
sumQuantity +=flowCard.getQuantity();
|
processId.append(flowCard.getProcessId()).append("-").append(flowCard.getTechnologyNumber()).append(";");
|
}
|
|
}
|
if(state1==1&&state2==0){
|
type=1;
|
}else if(state1==1&&state2==1){
|
type=2;
|
}
|
int index = optionVal.indexOf("mm");
|
// 获取 "mm" 前面的部分
|
String glass_thickness = optionVal.substring(0, index);
|
// 获取 "mm" 后面的部分
|
String glass_type = optionVal.substring(index + 2);
|
if(projectType.equals("2")){
|
glassOptimizeMapper.updateProjectMp(projectId,projectNmae,glass_thickness,glass_type,sumQuantity,sumArea.doubleValue(),userName,
|
flowCardList.size(), String.valueOf(processId),type);
|
}else{
|
if(glassOptimizeMapper.selectProjectCount(projectId)==null){
|
glassOptimizeMapper.addProjectMp(projectId,projectNmae,glass_thickness,glass_type,sumQuantity,sumArea.doubleValue(),userName,
|
flowCardList.size(), String.valueOf(processId),type);
|
}else{
|
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
|
return "false1";
|
}
|
}
|
}else {
|
return "false2";
|
|
}
|
} catch (Exception e) {
|
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
|
//将异常传入数据库
|
SysError sysError = new SysError();
|
sysError.setError(e+Arrays.toString(e.getStackTrace()));
|
sysError.setFunc("addProjectSv");
|
sysErrorService.insert(sysError);
|
saveState = "false";
|
|
}
|
return saveState;
|
|
}
|
|
public Map<String, Object> getConfiguration(String type) {
|
Map<String, Object> map = new HashMap<>();
|
if(type.equals("钢化")){
|
map.put("data", glassOptimizeMapper.getTemperedConfiguration());
|
}else if(type.equals("磨量")){
|
map.put("data", glassOptimizeMapper.getGrindingTrimming());
|
}else if(type.equals("修边")){
|
map.put("data", glassOptimizeMapper.getEdgeTrimming());
|
}
|
|
return map;
|
}
|
|
public Boolean saveConfiguration(Map<String,Object> object,String type) {
|
String json = "";
|
if (object.get("json") != null) {
|
json = object.get("json").toString();
|
}
|
if(type.equals("钢化")){
|
glassOptimizeMapper.updateOptimizeConfig(json,1);
|
} else if (type.equals("修边")) {
|
glassOptimizeMapper.updateOptimizeConfig(json,5);
|
}else if (type.equals("磨量")) {
|
glassOptimizeMapper.updateOptimizeConfig(json,4);
|
}
|
return true;
|
|
}
|
|
|
|
public String simulatedTypesetting(Map<String, Object> object) {
|
|
String optionVal = "";
|
Integer quantity = 0;
|
Double area = 0.0;
|
if (object.get("optionVal") != null) {
|
optionVal = object.get("optionVal").toString();
|
}
|
if (object.get("quantity") != null) {
|
quantity = Integer.valueOf(object.get("quantity").toString());
|
}
|
if (object.get("area") != null) {
|
area = Double.valueOf(object.get("area").toString());
|
}
|
List<Map<String, Object>> flowCardListNormal = glassOptimizeMapper.getFlowCardListNormal(optionVal);
|
|
|
int currentQuantity = 0;
|
double currentArea = 0;
|
List<List<Map<String, Object>>> result = new ArrayList<>();
|
List<Map<String, Object>> currentGroup = new ArrayList<>();
|
|
if(area==0 && quantity>0){
|
for(Map<String, Object> flowCardNormal: flowCardListNormal){
|
if (Integer.valueOf(flowCardNormal.get("quantity").toString()) > quantity ) {
|
continue;
|
}
|
int newQuantity = currentQuantity + Integer.valueOf(flowCardNormal.get("quantity").toString());
|
double newArea = currentArea + Double.valueOf(flowCardNormal.get("area").toString());
|
if(newQuantity>quantity){
|
result.add(currentGroup);
|
currentGroup = new ArrayList<>();
|
currentQuantity = 0;
|
currentArea = 0;
|
newQuantity = Integer.valueOf(flowCardNormal.get("quantity").toString());
|
newArea = Double.valueOf(flowCardNormal.get("area").toString());
|
|
}
|
currentGroup.add(flowCardNormal);
|
currentQuantity = newQuantity;
|
currentArea = newArea;
|
|
}
|
|
if (!currentGroup.isEmpty()) {
|
result.add(currentGroup);
|
}
|
}
|
System.out.println(result);
|
|
return "";
|
|
}
|
|
public String simulatedTypesetting1(Map<String, Object> object) {
|
|
String optionVal = "";
|
int quantity;
|
Double area;
|
if (object.get("optionVal") != null) {
|
optionVal = object.get("optionVal").toString();
|
}
|
if (object.get("quantity") != null) {
|
quantity = Integer.valueOf(object.get("quantity").toString());
|
} else {
|
quantity = 0;
|
}
|
if (object.get("area") != null) {
|
area = Double.valueOf(object.get("area").toString());
|
} else {
|
area = 0.0;
|
}
|
List<Map<String, Object>> flowCardListNormal = glassOptimizeMapper.getFlowCardListNormal(optionVal);
|
|
|
Queue<Map<String, Object>> queue = flowCardListNormal.stream()
|
.filter(item -> {
|
if ((quantity>0 ? (Integer.valueOf(item.get("quantity").toString()) > quantity):false) || (area>0 ? (Double.valueOf(item.get("area").toString()) > area):false)) {
|
return false;
|
}
|
return true;
|
})
|
.collect(Collectors.toCollection(LinkedList::new));
|
|
List<Map<String, Object>> result = new ArrayList<>();
|
|
while (!queue.isEmpty()) {
|
List<Map<String, Object>> currentGroup = new ArrayList<>();
|
Map<String, Object> currentGroupMap = new HashMap<>();
|
int currentCount = 0;
|
double currentArea = 0;
|
|
// 处理当前轮次队列中的所有元素
|
int queueSize = queue.size();
|
boolean addedAny = false;
|
|
String processId="";
|
for (int i = 0; i < queueSize; i++) {
|
Map<String, Object> item = queue.poll();
|
if ((quantity>0?currentCount + Integer.valueOf(item.get("quantity").toString()) <= quantity:true)
|
&& (area>0?currentArea + Double.valueOf(item.get("area").toString()) <= area:true)) {
|
if(i+1==queueSize){
|
processId=processId+item.get("process_id").toString()+"/"+item.get("technology_number").toString();
|
}else{
|
processId=processId+item.get("process_id").toString()+"/"+item.get("technology_number").toString()+";";
|
}
|
currentGroup.add(item);
|
currentCount += Integer.valueOf(item.get("quantity").toString());
|
currentArea += Double.valueOf(item.get("area").toString());
|
addedAny = true;
|
} else {
|
queue.offer(item); // 放回队列等待下次处理
|
}
|
}
|
|
if (currentGroup.isEmpty()) {
|
throw new RuntimeException("无法继续分组,剩余数据无法放入任何分组");
|
}
|
currentGroupMap.put("processId",processId);
|
currentGroupMap.put("count",currentCount);
|
currentGroupMap.put("area",Math.round(currentArea * 100) / 100.0);
|
result.add(currentGroupMap);
|
//System.out.println("流程卡:"+processId+"数量:"+currentCount+"面积:"+Math.round(currentArea * 100) / 100.0);
|
}
|
|
for (Map<String, Object> objectMap:result){
|
Map<String,Object> map = new HashMap<>();
|
String[] substrings = objectMap.get("processId").toString().split(";");
|
List<Map<String, Object>> flowCardMap = new ArrayList<>();
|
List<String> processIdList=new ArrayList<>();
|
List<Integer> technologyNumberList=new ArrayList<>();
|
for(String substring : substrings) {
|
String processId = substring.substring(0, 14);
|
Integer technologyNumber = Integer.valueOf(substring.substring(15));
|
processIdList.add(processId);
|
technologyNumberList.add(technologyNumber);
|
}
|
map.put("data",glassOptimizeMapper.simulatedTypesettingUsingOpt(processIdList,technologyNumberList));
|
objectMap.put("cuttingRate",90);
|
}
|
System.out.println(result);
|
|
return "";
|
|
}
|
|
|
}
|