Files
tnb.server/ProductionMgr/Tnb.ProductionMgr/PrdMoService.cs

363 lines
17 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using JNPF.Common.Core.Manager;
using JNPF.Common.Extension;
using JNPF.Common.Filter;
using JNPF.Common.Security;
using JNPF.DependencyInjection;
using JNPF.DynamicApiController;
using JNPF.FriendlyException;
using JNPF.Systems.Entitys.System;
using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev;
using JNPF.VisualDev.Entitys.Dto.VisualDevModelData;
using JNPF.VisualDev.Interfaces;
using Microsoft.AspNetCore.Mvc;
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!;
// }
private async Task<dynamic> GetList(VisualDevModelListQueryInput input)
{
var db = _repository.AsSugarClient();
Dictionary<string, string> queryJson = !string.IsNullOrEmpty(input.queryJson) ? Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(input.queryJson) : new Dictionary<string, string>();
string moCode = queryJson.ContainsKey("mo_code") ? queryJson["mo_code"].ToString() : "";
string moStatus = queryJson.ContainsKey("mo_status") ? queryJson["mo_status"].ToString() : "";
string combineMoCode = queryJson.ContainsKey("combine_mo_code") ? queryJson["combine_mo_code"].ToString() : "";
var result = await db.Queryable<PrdMo>()
.LeftJoin<BasMaterial>((a, b) => a.material_id == b.id)
.LeftJoin<DictionaryTypeEntity>((a, b, c) => c.EnCode == DictConst.MeasurementUnit)
.LeftJoin<DictionaryDataEntity>((a, b, c, d) => c.Id == d.DictionaryTypeId && a.unit_id == d.Id)
.LeftJoin<DictionaryDataEntity>((a, b, c, d, e) => a.mo_status == e.Id)
.LeftJoin<DictionaryDataEntity>((a, b, c, d, e,f) => a.mo_type==f.Id)
.WhereIF(!string.IsNullOrEmpty(moCode), (a, b, c, d, e) => a.mo_code.Contains(moCode))
.WhereIF(!string.IsNullOrEmpty(combineMoCode),
(a, b, c, d, e) => a.combine_mo_code.Contains(combineMoCode))
.WhereIF(!string.IsNullOrEmpty(moStatus), (a, b, c, d, e) => a.mo_status == moStatus)
.Where(a=>SqlFunc.IsNullOrEmpty(a.parent_id))
.OrderByDescending(a=>a.create_time)
.Select((a, b, c, d, e,f) => new PrdMoListOuput
{
id = a.id,
mo_type = f.FullName,
mo_source = a.mo_source=="1" ? "ERP同步" : "新建/导入",
mo_code = a.mo_code,
plan_start_date = a.plan_start_date==null ? "" : a.plan_start_date.Value.ToString("yyyy-MM-dd"),
plan_end_date = a.plan_end_date==null ? "" : a.plan_end_date.Value.ToString("yyyy-MM-dd"),
material_id = b.code+"/"+b.name,
material_id_id = b.id,
plan_qty = a.plan_qty,
unit_id = d.FullName,
mo_status = e.FullName,
remark = a.remark,
children = SqlFunc.Subqueryable<PrdMo>()
.LeftJoin<BasMaterial>((aa, bb) => aa.material_id == bb.id)
.LeftJoin<DictionaryTypeEntity>((aa, bb, cc) => cc.EnCode == DictConst.MeasurementUnit)
.LeftJoin<DictionaryDataEntity>((aa, bb, cc, dd) => cc.Id == dd.DictionaryTypeId && aa.unit_id == dd.Id)
.LeftJoin<DictionaryDataEntity>((aa, bb, cc, dd, ee) => aa.mo_status == ee.Id)
.LeftJoin<DictionaryDataEntity>((aa, bb, cc, dd, ee,ff) => aa.mo_type==ff.Id)
.Where(aa=>aa.parent_id==a.id)
.ToList((aa,bb,cc,dd,ee,ff)=>new PrdMoListOuput
{
id = aa.id,
mo_type = ff.FullName,
mo_source = aa.mo_source=="1" ? "ERP同步" : "新建/导入",
mo_code = aa.mo_code,
plan_start_date = aa.plan_start_date==null ? "" : aa.plan_start_date.Value.ToString("yyyy-MM-dd"),
plan_end_date = aa.plan_end_date==null ? "" : aa.plan_end_date.Value.ToString("yyyy-MM-dd"),
material_id = bb.code+"/"+bb.name,
material_id_id = bb.id,
plan_qty = aa.plan_qty,
unit_id = dd.FullName,
mo_status = ee.FullName,
remark = aa.remark,
})
}).ToPagedListAsync(input.currentPage, int.MaxValue);
return PageResult<PrdMoListOuput>.SqlSugarPageResult(result);
}
#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
}
}