using System;
|
using System.Collections.Generic;
|
using System.Diagnostics;
|
using System.Linq;
|
using System.Text;
|
using System.Text.RegularExpressions;
|
using System.Threading.Tasks;
|
using AutoMapper;
|
using AutoMapper.Configuration.Conventions;
|
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
|
using SqlSugar;
|
using WIDESEA_ISerialPortRepository;
|
using WIDESEA_SerialPortRepository;
|
using WIDESEAWCS_Core;
|
using WIDESEAWCS_Core.BaseRepository;
|
using WIDESEAWCS_Core.BaseServices;
|
using WIDESEAWCS_DTO.SerialPort;
|
using WIDESEAWCS_ITaskInfoService;
|
using WIDESEAWCS_Model.Models;
|
|
namespace WIDESEAWCS_TaskInfoService
|
{
|
public class ProcessServer : ServiceBase<Dt_Process, IProcessRepository>, IProcessServer
|
{
|
private IPutakeRepository _putakeRepository;
|
private IUnitOfWorkManage _unitOfWorkManage;
|
private ITorqueOpRepository _torqueOpRepository;
|
private readonly IMapper _mapper;
|
|
public ProcessServer(IProcessRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IPutakeRepository putakeRepository, ITorqueOpRepository torqueOpRepository, IMapper mapper) : base(BaseDal)
|
{
|
_putakeRepository = putakeRepository;
|
_unitOfWorkManage = unitOfWorkManage;
|
_torqueOpRepository = torqueOpRepository;
|
_mapper = mapper;
|
}
|
|
public override PageGridData<Dt_Process> GetPageData(PageDataOptions options)
|
{
|
OrderByParameters = new Dictionary<string, OrderByType>
|
{
|
{ nameof(Dt_Process.SetpNum), OrderByType.Asc },//按什么字段排序
|
{ nameof(Dt_Process.CraftType), OrderByType.Asc }
|
};
|
return base.GetPageData(options);
|
}
|
|
/// <summary>
|
/// 获取套筒数量
|
/// </summary>
|
/// <returns>返回班组、总步骤、套筒数量</returns>
|
public WebResponseContent GetSleeveandStep()
|
{
|
try
|
{
|
var result = BaseDal.QueryData() // 先查出全部
|
.GroupBy(x => x.CraftType) // 按 CraftType 分组
|
.Select(g => new
|
{
|
//尽量后端数据给前端的数据,调一次接口就可以拿到,不要让前端多次调用
|
CraftType = g.Key, // 添加 CraftType
|
maxNodal = g.Max(a => a.Nodal),//最大步骤
|
sumTorqueSum = g.Sum(a => a.TorqueSum),//套筒数量
|
}).ToList();
|
|
return new WebResponseContent { Status = true, Data = result };
|
}
|
catch (Exception ex)
|
{
|
return new WebResponseContent { Status = false, Message = "查询失败:" + ex.Message };
|
}
|
}
|
|
|
#region
|
//public WebResponseContent AddOrUpdateProcess(AddProcessDTO addProcessDTO)
|
//{
|
// try
|
// {
|
// var allProcesses = BaseDal.QueryData(); // 仅查询一次所有数据
|
|
// if (addProcessDTO.id == 0) // 添加
|
// {
|
// // 检查是否已经存在相同的 setnum
|
// if (allProcesses.Any(x => x.SetpNum == addProcessDTO.setnum && x.CraftType == addProcessDTO.craftstype))
|
// {
|
// return new WebResponseContent { Status = false, Message = $"步骤 {addProcessDTO.setnum} 已存在,不能重复添加!" };
|
// }
|
|
// // 创建新工艺步骤
|
// var proces = new Dt_Process
|
// {
|
// SetpNum = addProcessDTO.setnum,
|
// CraftType = addProcessDTO.craftstype,
|
// CraftsStep = addProcessDTO.craftsstep,
|
// CraftContent = addProcessDTO.craftcontent,
|
// Tools = addProcessDTO.tools,
|
// Material = addProcessDTO.material,
|
// ArticleOneid = addProcessDTO.aritcleoneid,
|
// ArticleOne = addProcessDTO.articleone,
|
// ArticleTowid = addProcessDTO.aritcletowid,
|
// ArticleTwo = addProcessDTO.articletwo,
|
// CreateDate = DateTime.Now
|
// };
|
|
// BaseDal.AddData(proces);
|
// return new WebResponseContent { Status = true, Data = proces };
|
// }
|
// else // 更新
|
// {
|
// var existingProcess = allProcesses.FirstOrDefault(x => x.CraftID == addProcessDTO.id);
|
// if (existingProcess == null)
|
// {
|
// return new WebResponseContent { Status = false, Message = "未找到该工艺步骤,无法更新!" };
|
// }
|
|
// // 只有当 setnum 发生变化时,才进行重复性检查
|
// if (existingProcess.SetpNum != addProcessDTO.setnum && allProcesses.Any(x => x.SetpNum == addProcessDTO.setnum && x.CraftType == addProcessDTO.craftstype && x.CraftID != addProcessDTO.id))
|
// {
|
// return new WebResponseContent { Status = false, Message = $"步骤 {addProcessDTO.setnum} 已存在,不能重复!" };
|
// }
|
|
// // 更新数据
|
// existingProcess.Nodal = addProcessDTO.Nodal;
|
// existingProcess.SetpNum = addProcessDTO.setnum;
|
// existingProcess.CraftType = addProcessDTO.craftstype;
|
// existingProcess.CraftsStep = addProcessDTO.craftsstep;
|
// existingProcess.CraftContent = addProcessDTO.craftcontent;
|
// existingProcess.Tools = addProcessDTO.tools;
|
// existingProcess.Material = addProcessDTO.material;
|
// existingProcess.ArticleOneid = addProcessDTO.aritcleoneid;
|
// existingProcess.ArticleOne = addProcessDTO.articleone;
|
// existingProcess.ArticleTowid = addProcessDTO.aritcletowid;
|
// existingProcess.ArticleTwo = addProcessDTO.articletwo;
|
// existingProcess.CreateDate = DateTime.Now;
|
|
// BaseDal.UpdateData(existingProcess);
|
// return new WebResponseContent { Status = true, Data = existingProcess };
|
// }
|
// }
|
// catch (Exception ex)
|
// {
|
// return new WebResponseContent { Status = false, Message = "操作失败:" + ex.Message };
|
// }
|
//}
|
|
|
|
|
//获取当前任务工作步骤
|
#endregion
|
|
/// <summary>
|
/// 根据id来判断,有id就更新没有就添加
|
/// </summary>
|
/// <param name="addProcessDTO"></param>
|
/// <returns></returns>
|
public WebResponseContent AddOrUpdateProcess(AddProcessDTO addProcessDTO)
|
{
|
try
|
{
|
var allProcesses = BaseDal.QueryData().OrderBy(x => x.SetpNum).ToList(); // 按 SetpNum 排序
|
Dt_Process proces = _mapper.Map<Dt_Process>(addProcessDTO);
|
|
#region 添加
|
if (addProcessDTO.CraftID == 0) // 添加
|
{
|
//// 检查是否已经存在相同的 SetpNum
|
//if (allProcesses.Any(x => x.SetpNum == addProcessDTO.setpNum && x.CraftType == addProcessDTO.craftstype))
|
//{
|
// return new WebResponseContent { Status = false, Message = $"步骤 {addProcessDTO.setpNum} 已存在,不能重复添加!" };
|
//}
|
|
//// 需要调整后续步骤的序号
|
//foreach (var process in allProcesses.Where(x => x.SetpNum >= addProcessDTO.setpNum))
|
//{
|
// process.SetpNum++; // 后移一位
|
// BaseDal.UpdateData(process);
|
//}
|
|
// 需要调整后续步骤的序号
|
var processList = allProcesses.Where(x => x.SetpNum >= addProcessDTO.SetpNum).ToList();
|
|
if (processList != null)
|
{
|
for (int i = 0; i < processList.Count; i++)
|
{
|
processList[i].SetpNum += 1;
|
}
|
}
|
|
// 创建新工艺步骤
|
|
proces.TorqueSum = (string.IsNullOrEmpty(addProcessDTO.ArticleOne) ? 0 : 1) + (string.IsNullOrEmpty(addProcessDTO.ArticleTwo) ? 0 : 1);
|
proces.CreateDate = DateTime.Now;
|
|
//var proces = new Dt_Process
|
//{
|
// Nodal = addProcessDTO.Nodal,
|
// SetpNum = addProcessDTO.setpNum,
|
// CraftType = addProcessDTO.craftstype,
|
// CraftsStep = addProcessDTO.craftsstep,
|
// CraftContent = addProcessDTO.craftcontent,
|
// Tools = addProcessDTO.tools,
|
// Material = addProcessDTO.material,
|
// ArticleOneid = addProcessDTO.aritcleoneid,
|
// ArticleOne = addProcessDTO.articleone,
|
// ArticleTowid = addProcessDTO.aritcletowid,
|
// ArticleTwo = addProcessDTO.articletwo,
|
// CreateDate = DateTime.Now,
|
// PointAxisXYZ = addProcessDTO.PointAxisXYZ,
|
// PointAxisHPB = addProcessDTO.PointAxisHPB,
|
// //为空就是0,不为空就是1
|
// TorqueSum = (string.IsNullOrEmpty(addProcessDTO.articleone) ? 0 : 1) + (string.IsNullOrEmpty(addProcessDTO.articletwo) ? 0 : 1)
|
//};
|
|
_unitOfWorkManage.BeginTran();
|
BaseDal.AddData(proces);
|
BaseDal.UpdateData(processList);
|
_unitOfWorkManage.CommitTran();
|
return new WebResponseContent { Status = true, Data = proces };
|
}
|
#endregion
|
#region 修改
|
else // 更新
|
{
|
var existingProcess = allProcesses.FirstOrDefault(x => x.CraftID == addProcessDTO.CraftID);
|
if (existingProcess == null)
|
{
|
return new WebResponseContent { Status = false, Message = "未找到该工艺步骤,无法更新!" };
|
}
|
|
int oldSetNum = existingProcess.SetpNum;
|
int newSetNum = addProcessDTO.SetpNum;
|
|
if (existingProcess.SetpNum == addProcessDTO.SetpNum) // 如果没改顺序,直接更新其他内容
|
{
|
proces.TorqueSum = (string.IsNullOrEmpty(addProcessDTO.ArticleOne) ? 0 : 1) + (string.IsNullOrEmpty(addProcessDTO.ArticleTwo) ? 0 : 1);
|
proces.ModifyDate = DateTime.Now;
|
|
//existingProcess.Nodal = addProcessDTO.Nodal;
|
//existingProcess.CraftType = addProcessDTO.craftstype;
|
//existingProcess.CraftsStep = addProcessDTO.craftsstep;
|
//existingProcess.CraftContent = addProcessDTO.craftcontent;
|
//existingProcess.Tools = addProcessDTO.tools;
|
//existingProcess.Material = addProcessDTO.material;
|
//existingProcess.ArticleOneid = addProcessDTO.aritcleoneid;
|
//existingProcess.ArticleOne = addProcessDTO.articleone;
|
//existingProcess.ArticleTowid = addProcessDTO.aritcletowid;
|
//existingProcess.ArticleTwo = addProcessDTO.articletwo;
|
//existingProcess.CreateDate = DateTime.Now;
|
//existingProcess.TorqueSum = (string.IsNullOrEmpty(addProcessDTO.articleone) ? 0 : 1) + (string.IsNullOrEmpty(addProcessDTO.articletwo) ? 0 : 1);
|
|
BaseDal.UpdateData(proces);
|
return new WebResponseContent { Status = true, Data = proces };
|
}
|
// 更新 TorqueSum
|
|
// 调整顺序
|
if (newSetNum < oldSetNum) // 向前移动,后续数据往后移
|
{
|
var processList = allProcesses.Where(x => x.SetpNum >= newSetNum && x.SetpNum < oldSetNum).ToList();
|
|
for (int i = 0; i < processList.Count; i++)
|
{
|
processList[i].SetpNum += 1;
|
}
|
|
BaseDal.UpdateData(processList);
|
//foreach (var process in allProcesses.Where(x => x.SetpNum >= newSetNum && x.SetpNum < oldSetNum))
|
//{
|
// process.SetpNum++; // 后移一位
|
// BaseDal.UpdateData(process);
|
//}
|
}
|
else if (newSetNum > oldSetNum) // 向后移动,前面数据往前移
|
{
|
var processList = allProcesses.Where(x => x.SetpNum > oldSetNum && x.SetpNum <= newSetNum).ToList();
|
|
for (int i = 0; i < processList.Count; i++)
|
{
|
processList[i].SetpNum -= 1;
|
}
|
|
BaseDal.UpdateData(processList);
|
|
//foreach (var process in allProcesses.Where(x => x.SetpNum > oldSetNum && x.SetpNum <= newSetNum))
|
//{
|
// process.SetpNum--; // 前移一位
|
// BaseDal.UpdateData(process);
|
//}
|
}
|
|
proces.SetpNum = newSetNum;
|
proces.TorqueSum = (string.IsNullOrEmpty(addProcessDTO.ArticleOne) ? 0 : 1) + (string.IsNullOrEmpty(addProcessDTO.ArticleTwo) ? 0 : 1);
|
proces.ModifyDate = DateTime.Now;
|
|
//// 更新当前步骤的新序号
|
//existingProcess.SetpNum = newSetNum;
|
//existingProcess.Nodal = addProcessDTO.Nodal;
|
//existingProcess.CraftType = addProcessDTO.craftstype;
|
//existingProcess.CraftsStep = addProcessDTO.craftsstep;
|
//existingProcess.CraftContent = addProcessDTO.craftcontent;
|
//existingProcess.Tools = addProcessDTO.tools;
|
//existingProcess.Material = addProcessDTO.material;
|
//existingProcess.ArticleOneid = addProcessDTO.aritcleoneid;
|
//existingProcess.ArticleOne = addProcessDTO.articleone;
|
//existingProcess.ArticleTowid = addProcessDTO.aritcletowid;
|
//existingProcess.ArticleTwo = addProcessDTO.articletwo;
|
//existingProcess.CreateDate = DateTime.Now;
|
|
BaseDal.UpdateData(proces);
|
return new WebResponseContent { Status = true, Data = proces };
|
}
|
#endregion
|
}
|
catch (Exception ex)
|
{
|
return new WebResponseContent { Status = false, Message = "操作失败:" + ex.Message };
|
}
|
}
|
|
|
public WebResponseContent Getcircuit(string group, string takeid)
|
{
|
try
|
{
|
Dt_Process proNow = new Dt_Process();
|
//根据组和任务号获得torqueOp表全部数据
|
var torp = _torqueOpRepository.QueryData(x => x.GroupOp == group && x.TakeId == takeid);
|
|
|
//获取Modifier ="true" 表示是强制执行
|
//var Mod = torp.Select(x => x.Modifier).FirstOrDefault();
|
|
//查出工艺表
|
var process = BaseDal.QueryData(x => x.CraftType == group);
|
|
//返回当前工艺的最大步骤
|
var maxproce = process.Max(x => x.SetpNum);
|
|
|
//拿到工艺表中步骤为1的
|
//var proNoe = process.Where(x => x.SetpNum == 1);//获得工艺表中的第一步
|
if (torp.Count == 0)
|
{
|
proNow = process.Where(x => x.SetpNum == 1).First();
|
return new WebResponseContent { Status = true, Message = "返回工艺表中的第一条", Data = new { proNow, maxproce } };
|
}
|
|
var nowNum = torp.Max(x => x.ProcessSte);//获得当前最大步骤
|
var flag = torp.Where(a => a.ProcessSte == nowNum && a.Modifier == "true").FirstOrDefault();
|
//op.Modifier="true" 表示是强制执行,就不需要判断应扭的次数,直接返回 op.ProcessSte+1
|
//if (Mod == "true")
|
//{
|
// var now = maxproce + 1;
|
// return new WebResponseContent { Status = true, Data = new { proNoe, maxproce, now } };
|
//}
|
if (flag != null)
|
{
|
var now = maxproce + 1;
|
proNow = process.Where(x => x.SetpNum == now).First();
|
var finish= process.Where(x => x.SetpNum > now);
|
return new WebResponseContent { Status = true, Data = new { proNow, maxproce, now, finish } };
|
}
|
|
//如果存值表中有数据就返回给他当前工艺步骤
|
var maxpro = process.Where(x => x.SetpNum == nowNum).FirstOrDefault();
|
if (maxpro != null)
|
{
|
if (maxpro.TorqueOneQuantity + maxpro.TorqueTwoQuantity > torp.Where(a => a.ProcessSte == nowNum).Count())
|
{
|
proNow = maxpro;
|
var finish = process.Where(x => x.SetpNum < nowNum);
|
return new WebResponseContent { Status = true, Message = "返回当前任务做到的大步骤", Data = new { proNow, maxproce, finish } };
|
}
|
else
|
{
|
var now = nowNum + 1;
|
proNow = process.Where(x => x.SetpNum == now).First();
|
var finish = process.Where(x => x.SetpNum < now);
|
return new WebResponseContent { Status = true, Message = "返回当前任务做到的大步骤", Data = new { proNow, maxproce, finish } };
|
}
|
}
|
else
|
{
|
return new WebResponseContent { Status = false, Message = "工艺数据有误"};
|
}
|
|
//判断当前步骤的扭力次数是否完成,没完成返回当前步骤,完成返回op.ProcessSte+1,状态值给false
|
|
//return new WebResponseContent { Status = true, Message = "返回当前任务做到的大步骤", Data = new { maxpro, maxproce } };
|
|
}
|
catch (Exception ex)
|
{
|
return new WebResponseContent { Status = false, Message = "查询失败:" + ex.Message };
|
}
|
}
|
|
/// <summary>
|
/// 工艺下一步跳转
|
/// </summary>
|
/// <param name="setpDTO">当前班组的任务当前步骤</param>
|
/// <param name="flag">是否强制执行;是true,否false</param>
|
/// <returns>返回1、当前步骤;2、最大步骤;3、已完成的工艺</returns>
|
public WebResponseContent Nextprocess(SetpDTO setpDTO, bool flag)//强制执行给我true
|
{
|
try
|
{
|
Dt_TorqueOp op = new Dt_TorqueOp();
|
//查出工艺表
|
var process = BaseDal.QueryData(x => x.CraftType == setpDTO.group);
|
|
// 查询当前步骤的 TorqueOp 记录,匹配 ProcessSte和组,任务号,检查是否达到要求(实际数量)
|
int practiceCount = _torqueOpRepository.QueryData(x => x.ProcessSte == setpDTO.setnum && x.GroupOp == setpDTO.group && x.TakeId == setpDTO.takeid).Count();
|
|
//查到有该条数据了(更具分组和步骤找到该条数据)
|
var nowdate = process.Where(x => x.CraftType == setpDTO.group && x.SetpNum == setpDTO.setnum);
|
|
//返回当前工艺的最大步骤
|
var maxproce = process.Max(x => x.SetpNum);
|
|
var TorqueOneQuantity = nowdate.Select(x => x.TorqueOneQuantity).FirstOrDefault();
|
var TorqueTwoQuantity = nowdate.Select(x => x.TorqueTwoQuantity).FirstOrDefault();
|
|
//判断存值表的数据是否满足该步骤需要几条数据的条数
|
int TargetCount = TorqueOneQuantity + TorqueTwoQuantity;//一共要有多少条数据(目标数量)
|
|
if (practiceCount < TargetCount && !flag)
|
{
|
return new WebResponseContent { Status = true, Message = "没有完成当前步骤", Data = new { nowdate, maxproce } };
|
}
|
else if ((practiceCount == TargetCount && TargetCount == 0) || (practiceCount != TargetCount && flag))//强制执行 前端给我一个flag=ture时
|
{
|
//强制跳转下一步,插入op表当前步骤
|
op.TakeId = setpDTO.takeid;
|
op.GroupOp = setpDTO.group;
|
op.ProcessSte = setpDTO.setnum;
|
op.CreateDate = DateTime.Now;
|
op.Creater = "admin";
|
op.Modifier = "true";
|
}
|
|
if (maxproce == setpDTO.setnum)
|
{
|
return new WebResponseContent { Status = false, Message = "你完成了当前作业" };
|
}
|
int num = setpDTO.setnum + 1;
|
|
//返回下一步步骤
|
var nex = process.Where(x => x.SetpNum == num).FirstOrDefault();
|
var finish = process.Where(x => x.SetpNum < num).ToList();
|
|
_torqueOpRepository.AddData(op);
|
return new WebResponseContent { Status = true, Message = $"你已完成当前第{setpDTO.setnum},准备第{num}步任务", Data = new { nex, maxproce, finish } };
|
}
|
catch (Exception ex)
|
{
|
return new WebResponseContent { Status = false, Message = "查询失败:" + ex.Message };
|
}
|
}
|
|
|
public WebResponseContent PreviousProcess(SetpDTO setpDTO)
|
{
|
try
|
{
|
//查出工艺表
|
var process = BaseDal.QueryData(x => x.CraftType == setpDTO.group);
|
|
// 查询当前步骤的 TorqueOp 记录,匹配 ProcessSte和组,任务号,检查是否达到要求(实际数量)
|
int practiceCount = _torqueOpRepository.QueryData(x => x.ProcessSte == setpDTO.setnum && x.GroupOp == setpDTO.group && x.TakeId == setpDTO.takeid).Count();
|
//查到有该条数据了(更具分组和步骤找到该条数据)
|
var nowdate = process.Where(x => x.CraftType == setpDTO.group && x.SetpNum == setpDTO.setnum);
|
|
//返回当前工艺的最大步骤
|
var maxproce = process.Max(x => x.SetpNum);
|
int num = setpDTO.setnum - 1;
|
var nex = process.Where(x => x.CraftType == setpDTO.group && x.SetpNum == num).FirstOrDefault();
|
var finish = process.Where(x => x.SetpNum < num).ToList();
|
return new WebResponseContent { Status = true, Message = $"上一步{setpDTO.setnum}", Data = new { nex, maxproce, finish } };
|
}
|
catch (Exception ex)
|
{
|
return new WebResponseContent { Status = false, Message = "查询失败:" + ex.Message };
|
}
|
}
|
|
/// <summary>
|
/// 读取当前工艺步骤的扭力值与次数
|
/// </summary>
|
/// <param name="grop"></param>
|
/// <param name="setnum"></param>
|
/// <returns></returns>
|
/// <exception cref="NotImplementedException"></exception>
|
public WebResponseContent GetValueandNumber(string grop, int setnum)
|
{
|
try
|
{
|
var result = BaseDal.QueryData(x => x.CraftType == grop && x.SetpNum == setnum)
|
.Select(g => new
|
{
|
g.TorqueOne,
|
g.TorqueOneQuantity,
|
g.TorqueTwo,
|
g.TorqueTwoQuantity
|
});
|
return new WebResponseContent { Status = true, Data = result };
|
|
}
|
catch (Exception ex)
|
{
|
return new WebResponseContent { Status = false,Message="错误:"+ex }; throw;
|
}
|
}
|
}
|
|
|
}
|