315 lines
14 KiB
C#
315 lines
14 KiB
C#
using System.Reflection.Emit;
|
||
using System.Text;
|
||
using Aop.Api.Domain;
|
||
using DbModels;
|
||
using JNPF.Common.Core.Manager;
|
||
using JNPF.Common.Enums;
|
||
using JNPF.Common.Extension;
|
||
using JNPF.Common.Security;
|
||
using JNPF.DependencyInjection;
|
||
using JNPF.DynamicApiController;
|
||
using JNPF.Extensitions.EventBus;
|
||
using JNPF.FriendlyException;
|
||
using JNPF.Logging;
|
||
using JNPF.Systems.Entitys.System;
|
||
using JNPF.Systems.Interfaces.System;
|
||
using JNPF.VisualDev;
|
||
using JNPF.VisualDev.Entitys;
|
||
using JNPF.VisualDev.Entitys.Dto.VisualDevModelData;
|
||
using JNPF.VisualDev.Interfaces;
|
||
using Mapster;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
using Microsoft.Extensions.Logging.Abstractions;
|
||
using NPOI.SS.Formula.Functions;
|
||
using Org.BouncyCastle.Crypto.Generators;
|
||
using Senparc.Weixin.Work.AdvancedAPIs.MailList;
|
||
using SqlSugar;
|
||
using Tnb.BasicData;
|
||
using Tnb.BasicData.Entities;
|
||
using Tnb.EquipMgr.Entities;
|
||
using Tnb.ProductionMgr.Entities;
|
||
using Tnb.ProductionMgr.Entities.Dto;
|
||
using Tnb.ProductionMgr.Entities.Dto.PrdManage;
|
||
using Tnb.ProductionMgr.Entities.Enums;
|
||
using Tnb.ProductionMgr.Interfaces;
|
||
|
||
namespace Tnb.ProductionMgr
|
||
{
|
||
/// <summary>
|
||
/// 生产计划管理
|
||
/// </summary>
|
||
[ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 700)]
|
||
[Route("api/[area]/[controller]/[action]")]
|
||
[OverideVisualDev(ModuleId)]
|
||
public class PrdMoService : IOverideVisualDevService, IPrdMoService, IDynamicApiController, ITransient
|
||
{
|
||
// private const string ModuleId = "25018860321301";
|
||
private const string ModuleId = "26900026924053";
|
||
private readonly ISqlSugarRepository<PrdMo> _repository;
|
||
private readonly IDataBaseManager _dataBaseManager;
|
||
private readonly IUserManager _userManager;
|
||
private readonly IDictionaryDataService _dictionaryDataService;
|
||
private readonly IRunService _runService;
|
||
private readonly IVisualDevService _visualDevService;
|
||
private readonly ISqlSugarClient _db;
|
||
|
||
public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc();
|
||
|
||
public PrdMoService(
|
||
ISqlSugarRepository<PrdMo> repository,
|
||
IDataBaseManager dataBaseManager,
|
||
IUserManager userManager,
|
||
IDictionaryDataService dictionaryDataService,
|
||
IRunService runService,
|
||
IVisualDevService visualDevService
|
||
)
|
||
{
|
||
_repository = repository;
|
||
_dataBaseManager = dataBaseManager;
|
||
_userManager = userManager;
|
||
_dictionaryDataService = dictionaryDataService;
|
||
_runService = runService;
|
||
_visualDevService = visualDevService;
|
||
_db = _repository.AsSugarClient();
|
||
OverideFuncs.GetListAsync = GetList;
|
||
}
|
||
|
||
private async Task<dynamic> GetList(VisualDevModelListQueryInput input)
|
||
{
|
||
var db = _repository.AsSugarClient();
|
||
VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleId, true);
|
||
var data = await _runService.GetListResult(templateEntity, input);
|
||
if (data?.list?.Count > 0)
|
||
{
|
||
foreach (var row in data.list)
|
||
{
|
||
var dic = row.ToDictionary(x => x.Key, x => x.Value);
|
||
var pkName = "material_id_id";
|
||
if (dic.ContainsKey(pkName))
|
||
{
|
||
var materialId = dic[pkName]?.ToString();
|
||
var material = await db.Queryable<BasMaterial>().FirstAsync(it => it.id == materialId);
|
||
if (material != null)
|
||
{
|
||
row.Add("material_name", material.name);
|
||
row.Add($"material_attribute", material.attribute);
|
||
if (dic.ContainsKey("material_id"))
|
||
{
|
||
row["material_id"] = material.code + "/" + material.name;
|
||
}
|
||
}
|
||
|
||
if (dic.ContainsKey("unit_id"))
|
||
{
|
||
string unitId = dic["unit_id"]?.ToString() ?? "";
|
||
var unit = await db.Queryable<DictionaryDataEntity>().SingleAsync(x => x.Id == unitId);
|
||
row["unit_id"] = unit?.FullName ?? "";
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return data!;
|
||
}
|
||
|
||
#region Get
|
||
|
||
|
||
/// <summary>
|
||
/// 获取自建报废记录
|
||
/// </summary>
|
||
/// <param name="icmoCode"></param>
|
||
/// <returns></returns>
|
||
[HttpGet("{icmoCode}")]
|
||
public async Task<dynamic> GetReportRecord(string icmoCode)
|
||
{
|
||
var db = _repository.AsSugarClient();
|
||
var output = new PrdMoTaskDefectOutput();
|
||
//output.mo_task_code = icmoCode;
|
||
//var scrap = (await db.Queryable<PrdScrapped>().FirstAsync(it => it.icmo_code == icmoCode));
|
||
//output.items = new List<CategoryItem>();
|
||
//var categorys = await db.Queryable<PrdScrappedDefectiveCagetory>().Where(it => it.icmo_code == icmoCode).ToListAsync();
|
||
//foreach (var category in categorys)
|
||
//{
|
||
// var categoryItem = category.Adapt<SelfTestScrappedOutputItem>();
|
||
// categoryItem.items = new List<PrdScrappedDefectiveItem>();
|
||
// var items = await db.Queryable<PrdScrappedDefectiveItem>().Where(it => it.defective_cagetory_id == category.id).ToListAsync();
|
||
// categoryItem.items.AddRange(items);
|
||
// output.categoryItems.Add(categoryItem);
|
||
//}
|
||
return output;
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region Post
|
||
|
||
/// <summary>
|
||
/// 生产工单创建-生产工单下发
|
||
/// </summary>
|
||
/// <param name="input">生产工单下发输入参数</param>
|
||
/// <returns></returns>
|
||
[HttpPut]
|
||
public async Task<dynamic> WorkOrderIssue(MoCrInput input)
|
||
{
|
||
if (input is null)
|
||
{
|
||
throw new ArgumentNullException(nameof(input));
|
||
}
|
||
if (input.Behavior.IsNullOrWhiteSpace())
|
||
{
|
||
throw new ArgumentException($"{nameof(input.Behavior)},not be null or empty");
|
||
}
|
||
|
||
var db = _repository.AsSugarClient();
|
||
//获取同组工单的Id,一起下发
|
||
var combineMoCodes = await db.Queryable<PrdMo>().Where(it => input.WorkOrderIds.Contains(it.id)).Select(it => it.combine_mo_code).ToListAsync();
|
||
if (combineMoCodes?.Count > 0)
|
||
{
|
||
var moIds = await db.Queryable<PrdMo>().Where(it => combineMoCodes.Contains(it.combine_mo_code) && !input.WorkOrderIds.Contains(it.id)).Select(it => it.id).ToListAsync();
|
||
input.WorkOrderIds = input.WorkOrderIds.Concat(moIds).ToList();
|
||
}
|
||
|
||
string getMoStatus(MoBehavior behavior)
|
||
{
|
||
string status = "";
|
||
switch (behavior)
|
||
{
|
||
case MoBehavior.Release:
|
||
status = DictConst.IssueId;
|
||
break;
|
||
case MoBehavior.Closed:
|
||
status = DictConst.MoCloseId;
|
||
break;
|
||
}
|
||
return status!;
|
||
}
|
||
var behavior = input.Behavior.ToEnum<MoBehavior>();
|
||
var status = getMoStatus(behavior);
|
||
var row = await db.Updateable<PrdMo>()
|
||
.SetColumns(it => new PrdMo { mo_status = status })
|
||
.Where(it => input.WorkOrderIds.Contains(it.id))
|
||
.ExecuteCommandAsync();
|
||
return (row > 0);
|
||
}
|
||
// /// <summary>
|
||
// /// 关联同组工单
|
||
// /// </summary>
|
||
// /// <param name="input">关联同组工单输入参数</param>
|
||
// /// <returns></returns>
|
||
// [HttpPost]
|
||
// public async Task<dynamic> RelevancySameGroupMo(MoCrInput input)
|
||
// {
|
||
// (bool executeRes, string errMsg) multi = (true, "");
|
||
// var list = await _repository.AsSugarClient().Queryable<PrdMo>()
|
||
// .InnerJoin<ToolMolds>((a, b) => a.material_id == b.material_id)
|
||
// .Where((a, b) => input.WorkOrderIds.Contains(a.id))
|
||
// .Select((a, b) => new
|
||
// {
|
||
// planDate = a.plan_start_date,
|
||
// mold_code = b.mold_code,
|
||
// }).ToListAsync();
|
||
// var planDateAll = true;
|
||
// var moldIdAll = true;
|
||
// if (list?.Count > 0)
|
||
// {
|
||
// var planDate = list.FirstOrDefault()?.planDate;
|
||
// var moldCode = list.FirstOrDefault()?.mold_code;
|
||
//
|
||
// planDateAll = list.Skip(1).All(x => x.planDate == planDate);
|
||
// moldIdAll = list.Skip(1).All(x => x.mold_code == moldCode);
|
||
// if (planDateAll && moldIdAll)
|
||
// {
|
||
// var groupId = SnowflakeIdHelper.NextId();
|
||
// multi.executeRes = await _repository.AsSugarClient().Updateable<PrdMo>()
|
||
// .SetColumns(c => new PrdMo { combine_mo_code = groupId })
|
||
// .Where(it => input.WorkOrderIds.Contains(it.id))
|
||
// .ExecuteCommandHasChangeAsync();
|
||
// }
|
||
// else
|
||
// {
|
||
// multi.executeRes = false;
|
||
// if (!planDateAll)
|
||
// {
|
||
// throw new AppFriendlyException("计划开始日期不一致", null);
|
||
// }
|
||
// if (!moldIdAll)
|
||
// {
|
||
// throw new AppFriendlyException("未关联到同一模具下", null);
|
||
// }
|
||
// }
|
||
// }
|
||
// return multi;
|
||
// }
|
||
|
||
/// <summary>
|
||
/// 关联同组工单
|
||
/// </summary>
|
||
/// <param name="input">关联同组工单输入参数</param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<dynamic> RelevancySameGroupMo(MoCrInput input)
|
||
{
|
||
(bool executeRes, string errMsg) multi = (true, "");
|
||
var list = await _repository.AsSugarClient().Queryable<PrdMo>()
|
||
.LeftJoin<ToolMoldsMaterial>((a, b) => a.material_id == b.material_id)
|
||
.LeftJoin<ToolMolds>((a,b,c)=>b.mold_id==c.id)
|
||
.Where((a, b,c) => input.WorkOrderIds.Contains(a.id))
|
||
.Select((a, b,c) => new
|
||
{
|
||
planDate = a.plan_start_date,
|
||
mold_code = c.mold_code,
|
||
}).ToListAsync();
|
||
var planDateAll = true;
|
||
var moldIdAll = true;
|
||
if (list?.Count > 0)
|
||
{
|
||
var planDate = list.FirstOrDefault()?.planDate;
|
||
var moldCode = list.FirstOrDefault()?.mold_code;
|
||
|
||
planDateAll = list.All(x => x.planDate == planDate);
|
||
moldIdAll = moldCode != null && list.All(x => x.mold_code == moldCode);
|
||
if (planDateAll && moldIdAll)
|
||
{
|
||
var groupId = SnowflakeIdHelper.NextId();
|
||
multi.executeRes = await _repository.AsSugarClient().Updateable<PrdMo>()
|
||
.SetColumns(c => new PrdMo { combine_mo_code = groupId })
|
||
.Where(it => input.WorkOrderIds.Contains(it.id))
|
||
.ExecuteCommandHasChangeAsync();
|
||
}
|
||
else
|
||
{
|
||
multi.executeRes = false;
|
||
if (!planDateAll)
|
||
{
|
||
throw Oops.Bah("计划开始日期不一致");
|
||
}
|
||
if (!moldIdAll)
|
||
{
|
||
throw Oops.Bah("未关联到同一模具下");
|
||
}
|
||
}
|
||
}
|
||
return multi;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 取消关联
|
||
/// </summary>
|
||
/// <param name="input">取消关联输入参数</param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<dynamic> CanelRelevancy(MoCrInput input)
|
||
{
|
||
return await _repository.AsSugarClient().Updateable<PrdMo>()
|
||
.SetColumns(c => new PrdMo { combine_mo_code = "" })
|
||
.Where(it => input.WorkOrderIds.Contains(it.id))
|
||
.ExecuteCommandHasChangeAsync();
|
||
}
|
||
|
||
|
||
|
||
#endregion
|
||
}
|
||
}
|
||
|