Files
tnb.server/QcMgr/Tnb.QcMgr/QcTempControlHService.cs
2024-11-15 16:46:00 +08:00

722 lines
35 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 System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Aop.Api.Domain;
using DingTalk.Api.Request;
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.Logging;
using JNPF.Systems.Entitys.System;
using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev;
using JNPF.VisualDev.Entitys.Dto.VisualDevModelData;
using Microsoft.AspNetCore.Mvc;
using Microsoft.ClearScript.JavaScript;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;
using SqlSugar;
using Tnb.BasicData.Entities;
using Tnb.EquipMgr.Entities;
using Tnb.ProductionMgr.Entities;
using Tnb.ProductionMgr.Entities.Entity;
using Tnb.QcMgr.Entities;
using Tnb.QcMgr.Entities.Dto;
using Tnb.QcMgr.Entities.Entity;
using Tnb.QcMgr.Entities.Enums;
using Tnb.WarehouseMgr;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto;
using Tnb.WarehouseMgr.Entities.Enums;
using Tnb.WarehouseMgr.Interfaces;
namespace Tnb.QcMgr
{
[ApiDescriptionSettings(Tag = ModuleConsts.Tag, Area = ModuleConsts.Area, Order = 800)]
[Route("api/[area]/[controller]/[action]")]
public class QcTempControlHService : BaseWareHouseService, IDynamicApiController, ITransient
{
private readonly ISqlSugarRepository<QcTempControlH> _repository;
private readonly IUserManager _userManager;
private readonly IWareHouseService _wareHouseService;
private readonly IBillRullService _billRullService;
private readonly ISqlSugarClient _db;
public QcTempControlHService(ISqlSugarRepository<QcTempControlH> repository, IUserManager userManager, IWareHouseService wareHouseService,IBillRullService billRullService)
{
_db = repository.AsSugarClient();
_userManager = userManager;
_wareHouseService = wareHouseService;
_billRullService = billRullService;
}
/// <summary>
/// 获取质检暂控处理单
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<object> AllList(VisualDevModelListQueryInput input)
{
var bill_code = ""; //单据号
var pro_task_code = ""; //生产任务单号
var status = "";//状态
if (!input.queryJson.IsNullOrWhiteSpace())
{
bill_code = JObject.Parse(input.queryJson).Value<string>("bill_code");
pro_task_code = JObject.Parse(input.queryJson).Value<string>("pro_task_code");
status = JObject.Parse(input.queryJson).Value<string>("status");
}
var result = await _db.Queryable<QcTempControlH>().LeftJoin<BasWarehouse>((a, b) => a.in_warehouse_id == b.id)
.LeftJoin<BasWarehouse>((a, b, c) => a.out_warehouse_id == c.id)
.WhereIF(!string.IsNullOrEmpty(bill_code), (a, b, c) => a.bill_code.Contains(bill_code))
.WhereIF(!string.IsNullOrEmpty(pro_task_code), (a, b, c) => a.pro_task_code.Contains(pro_task_code))
.WhereIF(!string.IsNullOrEmpty(status), (a, b, c) => a.status == status)
.OrderByDescending((a, b, c) => a.create_time)
.Select((a, b, c) => new QcTempControlHOutput()
{
id = a.id,
bill_code = a.bill_code,
source_code = a.source_code,
pro_task_code = a.pro_task_code,
out_warehouse_id = a.out_warehouse_id,
out_warehouse_name = c.whname,
in_warehouse_id = a.in_warehouse_id,
in_warehouse_name = b.whname,
material_id = a.material_id,
material_code = a.material_code,
control_lx_qty = a.control_lx_qty,
control_qty = a.control_qty,
result = a.result,
loger_id = a.loger_id,
confirmer_id = a.confirmer_id,
status = a.status,
called_box_qty = a.called_box_qty,
called_qty = a.called_qty,
leave_call_box_qty = a.leave_call_box_qty,
leave_call_qty = a.leave_call_qty,
details = SqlFunc.Subqueryable<QcTempControlD>().Where(r => r.bill_id == a.id).OrderByDesc(r => r.create_time).ToList((x) => new QcTempControlDsOutput
{
id = x.id,
bill_id = x.bill_id,
carry_id = x.carry_id,
carry_code = x.carry_code,
warehouse_code = x.warehouse_code,
warehouse_id = x.warehouse_id,
location_code = x.location_code,
location_id = x.location_id,
qty = x.qty,
submiter = x.submiter,
maker_id = x.maker_id,
})
}).ToPagedListAsync(input.currentPage, input.pageSize);
return PageResult<QcTempControlHOutput>.SqlSugarPageResult(result);
}
/// <summary>
/// 确认暂控料处理单结论
/// </summary>
/// <param name="dic"></param>
/// <returns></returns>
[HttpPost]
public async Task<dynamic> ModifyResult(Dictionary<string, string> dic)
{
string id = dic["id"];
string qcRes = dic["result"];
try
{
var qcTempControlH = await _db.Queryable<QcTempControlH>().Where(r => r.id == id).FirstAsync();
if(qcTempControlH==null)
{
throw Oops.Bah("暂控处理单数据不存在");
}
await _db.Ado.BeginTranAsync();
await _db.Updateable<QcTempControlH>().SetColumns(x => x.result == qcRes).SetColumns(x=>x.status==((int)EnumTempControlStatus.).ToString()).Where(x => x.id == id).ExecuteCommandAsync();
await _db.Updateable<QcTempControlD>().SetColumns(x => x.check_status == qcRes).Where(x => x.bill_id == qcTempControlH.bill_code).ExecuteCommandAsync();
await _db.Ado.CommitTranAsync();
}
catch(Exception e)
{
await _db.Ado.RollbackTranAsync();
Log.Error(e.Message, e);
throw Oops.Bah(e.Message);
}
return "修改成功";
}
/// <summary>
/// 下发暂控料处理单
/// </summary>
/// <param name="dic"></param>
/// <returns></returns>
[HttpPost]
public async Task<string> QcTempControlIssued(Dictionary<string, string> dic)
{
string id = dic["id"];
try
{
var qcTempControlH = await _db.Queryable<QcTempControlH>().Where(r => r.id == id).FirstAsync();
if (qcTempControlH == null)
{
throw Oops.Bah("暂控处理单数据不存在");
}
//所有暂控的料箱必须都进入中储仓才能进行下发
var qcTempControlDs = await _db.Queryable<QcTempControlD>().Where(r => r.bill_id == qcTempControlH.id).ToListAsync();
if (qcTempControlDs!=null && qcTempControlDs.Count > 0)
{
var carrys = await _db.Queryable<WmsCarryCode>().Where(r => qcTempControlDs.Select(r => r.carry_id).Contains(r.carry_id)).ToListAsync();
var noInStockCarrys = carrys.Where(r => r.warehouse_id != WmsWareHouseConst.WAREHOUSE_ZC_ID);
if (noInStockCarrys.Any())
{
var carryCodes=string.Join(",", noInStockCarrys.Distinct().Select(r=>r.carry_code));
throw Oops.Bah($"{carryCodes}等料箱还没入中储仓,不能下发");
}
}
await _db.Ado.BeginTranAsync();
await _db.Updateable<QcTempControlH>().SetColumns(x => x.status == ((int)EnumTempControlStatus.).ToString()).Where(x => x.id == id).ExecuteCommandAsync();
await _db.Ado.CommitTranAsync();
}
catch (Exception e)
{
await _db.Ado.RollbackTranAsync();
Log.Error(e.Message, e);
throw Oops.Bah(e.Message);
}
return "修改成功";
}
/// <summary>
/// 获取质检单 for APP
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<object> GetQcTempControlList(PageInputBase input)
{
Dictionary<string, object> queryJson = string.IsNullOrEmpty(input.queryJson) ? new Dictionary<string, object>() : input.queryJson.ToObject<Dictionary<string, object>>();
string? bill_code = queryJson.ContainsKey("bill_code") ? queryJson["bill_code"].ToString() : "";
string? status = queryJson.ContainsKey("status") ? queryJson["status"].ToString() : "";
if (string.IsNullOrEmpty(input.sidx))
{
input.sidx = "create_time";
input.sort = "desc";
}
var result = await _db.Queryable<QcTempControlH>().LeftJoin<BasWarehouse>((a, b) => a.in_warehouse_id == b.id)
.LeftJoin<BasWarehouse>((a, b, c) => a.out_warehouse_id == c.id)
.WhereIF(!string.IsNullOrEmpty(bill_code), (a, b, c) => a.bill_code.Contains(bill_code))
.WhereIF(!string.IsNullOrEmpty(status), (a, b, c) => a.status == status)
.OrderByDescending((a, b, c) => a.create_time)
.Select((a, b, c) => new QcTempControlHAppOutput()
{
id = a.id,
bill_code = a.bill_code,
source_code = a.source_code,
pro_task_code = a.pro_task_code,
out_warehouse_id = a.out_warehouse_id,
out_warehouse_name = c.whname,
in_warehouse_id = a.in_warehouse_id,
in_warehouse_name = b.whname,
material_id = a.material_id,
material_code = a.material_code,
control_lx_qty = a.control_lx_qty,
control_qty = a.control_qty,
result = a.result,
loger_id = a.loger_id,
confirmer_id = a.confirmer_id,
status = a.status,
called_box_qty = a.called_box_qty,
called_qty = a.called_qty,
leave_call_box_qty = a.leave_call_box_qty,
leave_call_qty = a.leave_call_qty,
}).ToPagedListAsync(input.currentPage, input.pageSize);
return PageResult<QcTempControlHAppOutput>.SqlSugarPageResult(result);
}
/// <summary>
/// PDA暂控料呼叫
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<string> TempControlCall(QcTempControlCallInput input)
{
try
{
if (string.IsNullOrEmpty(input.id))
throw Oops.Bah("主键id不能为空");
if (string.IsNullOrEmpty(input.destination_location_code))
throw Oops.Bah("目标库位不能为空");
if (input.box_qty <= 0)
throw Oops.Bah("呼叫箱数不能小于1");
var qcTempControlH = await _db.Queryable<QcTempControlH>().Where(r => r.id == input.id).FirstAsync();
if (qcTempControlH == null)
throw Oops.Bah("暂控处理单数据不存在");
var basLocation=await _db.Queryable<BasLocation>().Where(r=>r.location_code==input.destination_location_code).FirstAsync();
if (basLocation == null)
throw Oops.Bah($"目标库位{input.destination_location_code}不存在");
var qcTempControlDs = await _db.Queryable<QcTempControlD>().Where(r => r.bill_id == input.id && r.call_status == "未呼叫").Take(input.box_qty).ToListAsync();
if (qcTempControlDs == null || qcTempControlDs.Count <= 0)
throw Oops.Bah("不存在未下发的料箱");
await _db.Ado.BeginTranAsync();
decimal callqty = 0;//当前呼叫物料总数量
foreach(var item in qcTempControlDs)
{
callqty += (string.IsNullOrEmpty(item.qty) ? 0 : Convert.ToDecimal(item.qty));
// 计算路径,插入预任务申请
WmsPointH sPoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id ==item.location_id);
WmsPointH ePoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == basLocation.id);
if (sPoint == null)
throw Oops.Bah($"载具编号{item.carry_code}未找到起始点位");
if (ePoint == null)
throw Oops.Bah($"载具编号{item.carry_code}未找到终点点位");
List<WmsPointH> points = new List<WmsPointH>();
if (sPoint.area_code != ePoint.area_code)
{
points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
if (points.Count <= 2)
{
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
}
else
{
points.Add(sPoint);
points.Add(ePoint);
}
if (points.Count <= 0)
throw Oops.Bah("点位不存在");
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>
{
WmsPointH? sPoint = it.FirstOrDefault();
WmsPointH? ePoint = it.LastOrDefault();
WmsPretaskH preTask = new()
{
org_id = _userManager!.User.OrganizeId,
startlocation_id = sPoint?.location_id!,
startlocation_code = sPoint?.location_code!,
endlocation_id = ePoint?.location_id!,
endlocation_code = ePoint?.location_code!,
start_floor = sPoint?.floor.ToString(),
end_floor = ePoint?.floor.ToString(),
startpoint_id = sPoint?.id!,
startpoint_code = sPoint?.point_code!,
endpoint_id = ePoint?.id!,
endpoint_code = ePoint?.point_code!,
bill_code = _billRullService!.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(),
status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID,
biz_type = WmsWareHouseConst.BIZTYPE_WMSTRANSFERINSTOCK_ID,
task_type = WmsWareHouseConst.WMS_PRETASK_TRANSFER_TYPE_ID
};
preTask.area_id = sPoint?.area_id!;
preTask.area_code = it.Key;
preTask.require_id = qcTempControlH.id;
preTask.require_code = qcTempControlH.bill_code;
preTask.create_id = _userManager.UserId;
preTask.create_time = DateTime.Now;
return preTask;
}).ToList();
bool isOk = await _wareHouseService.GenPreTask(preTasks, null!);
if (!isOk)
throw Oops.Bah($"载具编号{item.carry_code}生成预任务失败");
}
await _db.Updateable(qcTempControlDs).SetColumns(x=>x.call_status=="已呼叫").ExecuteCommandAsync();
//已呼叫料箱数量
var called_box_qty = qcTempControlDs.Count + (string.IsNullOrEmpty(qcTempControlH.called_box_qty) ? 0 : Convert.ToDecimal(qcTempControlH.called_box_qty));
//已呼叫物料数量
var called_qty = callqty + (string.IsNullOrEmpty(qcTempControlH.called_qty) ? 0 : Convert.ToDecimal(qcTempControlH.called_qty));
//剩余呼叫料箱数量
var leave_call_box_qty = (string.IsNullOrEmpty(qcTempControlH.control_lx_qty) ? 0 : Convert.ToDecimal(qcTempControlH.control_lx_qty)) - called_box_qty;
//剩余呼叫数量
var leave_call_qty = (string.IsNullOrEmpty(qcTempControlH.control_qty) ? 0 : Convert.ToDecimal(qcTempControlH.control_qty)) - called_qty;
await _db.Updateable(qcTempControlH).SetColumns(x => x.called_box_qty == called_box_qty.ToString())
.SetColumns(x => x.called_qty == called_qty.ToString())
.SetColumns(x => x.leave_call_box_qty == leave_call_box_qty.ToString())
.SetColumns(x => x.leave_call_qty == leave_call_qty.ToString())
.SetColumns(x=>x.status==((int)EnumTempControlStatus.).ToString())
.ExecuteCommandAsync();
await _db.Ado.CommitTranAsync();
}
catch (Exception e)
{
await _db.Ado.RollbackTranAsync();
Log.Error(e.Message, e);
throw Oops.Bah(e.Message);
}
return "呼叫成功";
}
/// <summary>
/// PDA扫描料箱获取暂控处理单详情
/// </summary>
/// <param name="dic"></param>
/// <returns></returns>
[HttpPost]
public async Task<object> GetQcTempControlDetail(Dictionary<string,string> dic)
{
var id = dic["id"].ToString();
var carryCode = dic["carryCode"].ToString();
if (string.IsNullOrEmpty(carryCode))
throw Oops.Bah("料箱号不能为空");
var qcTempControlH = await _db.Queryable<QcTempControlH>().Where(r => r.id == id).FirstAsync();
if (qcTempControlH == null)
throw Oops.Bah("未找到暂控料处理单数据");
var carry = await _db.Queryable<WmsCarryH>().Where(r => r.carry_code == carryCode).FirstAsync();
if (carry == null)
throw Oops.Bah($"料箱号:{carryCode}不存在");
var qcTempControlD = await _db.Queryable<QcTempControlD>().Where(r => r.bill_id == qcTempControlH.id && r.carry_id == carry.id).FirstAsync();
if (qcTempControlD == null)
throw Oops.Bah($"料箱号:{carryCode}不在此暂控料处理单的暂控料箱列表中");
var material= await _db.Queryable<BasMaterial>().Where(r => r.id == qcTempControlH.material_id).FirstAsync();
var result = new QcTempControlScanCodeOutput();
result.id = qcTempControlD.id;
result.material_code = material?.code;
result.material_name = material?.name;
result.container_no=material?.container_no;
result.material_standard = material?.material_standard;
result.material_specification = material?.material_specification;
result.unit_code = material?.unit_id;
result.code_qty = qcTempControlD.qty;
return result;
}
/// <summary>
/// 保存挑选合格数量
/// </summary>
/// <param name="dic"></param>
/// <returns></returns>
[HttpPost]
public async Task<string> SaveQualifiedQty(Dictionary<string, string> dic)
{
try
{
var id = dic["id"].ToString();
var qualifiedQty = dic["qualifiedQty"].ToString();
if (string.IsNullOrEmpty(qualifiedQty))
throw Oops.Bah("合格数量不能为空");
//先保存不合格数量修改状态为让步接收改变对应载具台账的检验状态为合格并生成对应料箱的8号线入库任务
var qcTempControlD = await _db.Queryable<QcTempControlD>().Where(r => r.id == id).FirstAsync();
if (qcTempControlD == null)
throw Oops.Bah($"数据不存在");
if (qcTempControlD.pick_status == "已挑选")
throw Oops.Bah("已挑选,不能重复挑选");
var qctempControlH=await _db.Queryable<QcTempControlH>().Where(r=>r.id==qcTempControlD.bill_id).FirstAsync();
//计算不合格数量
var unQualifiedQty = (string.IsNullOrEmpty(qcTempControlD.qty) ? 0 : Convert.ToDecimal(qcTempControlD.qty)) - (Convert.ToDecimal(qualifiedQty));
await _db.Ado.BeginTranAsync();
//修改对应暂控子表的不合格数量和挑选状态
await _db.Updateable<QcTempControlD>()
.SetColumns(r => r.qualified_qty == qualifiedQty)
.SetColumns(r=>r.unqualified_qty== unQualifiedQty.ToString())
.SetColumns(r => r.pick_status == "已挑选")
.SetColumns(r=>r.check_status=="让步接收")
.Where(r => r.id == qcTempControlD.id).ExecuteCommandAsync();
//更新对应载具台账的检验状态为合格
await _db.Updateable<WmsCarryH>().SetColumns(r => r.is_check == ((int)EnumCheckConclusion.).ToString()).Where(r => r.id == qcTempControlD.carry_id).ExecuteCommandAsync();
//更新对应载具条码表的条码数量为挑选好的合格数量
await _db.Updateable<WmsCarryCode>().SetColumns(r => r.codeqty == Convert.ToDecimal(qualifiedQty)).Where(r => r.carry_id == qcTempControlD.carry_id && r.material_id == qctempControlH.material_id).ExecuteCommandAsync();
#region 8线
//入库取终点
InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = qcTempControlD.warehouse_id, Size = 1 };
List<BasLocation> endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput);
WmsPointH? sPoint = null;
WmsPointH? ePoint = null;
sPoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == qcTempControlD.warehouse_id);
if (sPoint == null)
throw Oops.Bah($"起始库位不可用");
if (endLocations?.Count > 0)
{
WmsCarryH carry = await _db.Queryable<WmsCarryH>().SingleAsync(it => it.id == qcTempControlD.carry_id);
BasLocation loc = await _db.Queryable<BasLocation>().SingleAsync(it => it.id == endLocations[0].id);
bool isMatch = await IsCarryAndLocationMatchByCarryStd(carry, loc);
if (!isMatch)
{
throw new AppFriendlyException("库位与载具规格不匹配", 500);
}
ePoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == endLocations[0].id);
}
if (ePoint == null)
throw Oops.Bah("无可用的目标库位");
List<WmsPointH> points = new List<WmsPointH>();
if (sPoint.area_code != ePoint.area_code)
{
points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
if (points.Count <= 2)
{
throw new AppFriendlyException($"sPoint {sPoint.point_code} ePoint{ePoint.point_code}该路径不存在", 500);
}
}
else
{
points.Add(sPoint);
points.Add(ePoint);
}
//根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序)
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>
{
WmsPointH? sPoint = it.FirstOrDefault();
WmsPointH? ePoint = it.LastOrDefault();
WmsPretaskH preTask = new()
{
org_id = _userManager.User.OrganizeId,
startlocation_id = sPoint?.location_id!,
startlocation_code = sPoint?.location_code!,
endlocation_id = ePoint?.location_id!,
endlocation_code = ePoint?.location_code!,
start_floor = sPoint?.floor.ToString(),
end_floor = ePoint?.floor.ToString(),
startpoint_id = sPoint?.id!,
startpoint_code = sPoint?.point_code!,
endpoint_id = ePoint?.id!,
endpoint_code = ePoint?.point_code!,
bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(),
status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID,
biz_type = WmsWareHouseConst.BIZTYPE_TEMPCONTROLINSTOCK_ID,
task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID,
carry_id = qcTempControlD.carry_id,
carry_code = qcTempControlD.carry_code,
area_id = sPoint?.area_id!,
area_code = it.Key,
require_id = qctempControlH?.id,
require_code = qctempControlH?.bill_code,
create_id = _userManager.UserId,
create_time = DateTime.Now,
};
return preTask;
}).ToList();
bool isOk = await _wareHouseService.GenPreTask(preTasks, null!);
if (!isOk)
throw Oops.Bah($"生成暂控料入库预任务失败");
await _db.Updateable<QcTempControlD>().SetColumns(r => r.pre_task_id == preTasks.FirstOrDefault().id).Where(r => r.id == id).ExecuteCommandAsync();
#endregion
await _db.Ado.CommitTranAsync();
}
catch(Exception e)
{
await _db.Ado.RollbackTranAsync();
Log.Error(e.Message, e);
throw Oops.Bah(e.Message);
}
return "保存成功";
}
/// <summary>
/// 显示已挑选合格数量
/// </summary>
/// <param name="dic"></param>
/// <returns></returns>
[HttpPost]
public async Task<dynamic> ShowPickQualifiedQty(Dictionary<string, string> dic)
{
try
{
var id = dic["id"].ToString();
var qcTempControlH = await _db.Queryable<QcTempControlH>().Where(r => r.id == id).FirstAsync();
if (qcTempControlH == null)
throw Oops.Bah($"数据不存在");
var qcTempControlDs = await _db.Queryable<QcTempControlD>().Where(r => r.bill_id == id).ToListAsync();
QcTempControlPickQualifiedQtyOutput result = new QcTempControlPickQualifiedQtyOutput();
if (qcTempControlDs != null)
{
result.temp_control_qty = qcTempControlH.control_qty;
result.qualified_qty = qcTempControlDs.Sum(r => (string.IsNullOrEmpty(r.qualified_qty) ? 0 : Convert.ToDecimal(r.qualified_qty))).ToString();
result.unQualified_qty = ((string.IsNullOrEmpty(qcTempControlH.control_qty) ? 0 : Convert.ToDecimal(qcTempControlH.control_qty)) - Convert.ToDecimal(result.qualified_qty)).ToString();
}
else
{
result.temp_control_qty = qcTempControlH.control_qty;
result.qualified_qty = "0";
result.unQualified_qty = "0";
}
return result;
}
catch (Exception e)
{
Log.Error(e.Message, e);
throw Oops.Bah(e.Message);
}
}
/// <summary>
/// 挑选不合格数量完成
/// </summary>
/// <param name="dic"></param>
/// <returns></returns>
[HttpPost]
public async Task<string> SavePickComplete(Dictionary<string, string> dic)
{
try
{
var id = dic["id"].ToString();
//保存暂控处理单状态为挑选完成之前需要确保所有的8号线入库任务全部完成挑选完成之后对接bip(暂时不对接)把不合格总数量传给BIP
//并且生成一个其它出库(从中储仓出到次品仓),其他入库(从中储仓入到次品仓)任务
var qcTempControlH = await _db.Queryable<QcTempControlH>().Where(r => r.id == id).FirstAsync();
if (qcTempControlH == null)
throw Oops.Bah($"数据不存在");
//质检任务主表
var qcCheckExecH = await _db.Queryable<QcCheckExecH>().Where(r => r.bill_code == qcTempControlH.source_code).FirstAsync();
var qcTempControlDs = await _db.Queryable<QcTempControlD>().Where(r => r.bill_id == qcTempControlH.id).ToListAsync();
//找到所有的预任务id
var pre_task_ids = qcTempControlDs.Where(r => !string.IsNullOrEmpty(r.pre_task_id)).Select(r => r.pre_task_id).Distinct();
//查找到未完成的任务
var wmsDistasks = await _db.Queryable<WmsDistaskH>().Where(r => pre_task_ids.Contains(r.pretask_id) && r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID).ToListAsync();
if (wmsDistasks != null && wmsDistasks.Count > 0)
throw Oops.Bah($"还存在未完成的入库任务,挑选完成失败");
//计算所有合格数量
var qualifiedQty = qcTempControlDs.Sum(r => (string.IsNullOrEmpty(r.qualified_qty) ? 0 : Convert.ToDecimal(r.qualified_qty)));
#region
//新增生产报废记录
var prdTaskDefect = new PrdMoTaskDefectRecord();
//生产工单
var prdMo = await _db.Queryable<PrdMo>().LeftJoin<PrdMoTask>((a, b) => a.id == b.mo_id).Where((a, b) => b.mo_task_code == qcTempControlH.pro_task_code).FirstAsync();
var prdMoTask = await _db.Queryable<PrdMoTask>().Where(r => r.mo_task_code == qcTempControlH.pro_task_code).FirstAsync();
prdTaskDefect.mo_code=prdMo?.mo_code;
prdTaskDefect.mo_task_id = prdMoTask?.id;
prdTaskDefect.mo_task_code=qcTempControlH.pro_task_code;
prdTaskDefect.mo_task_type = prdMo?.mo_type;
var basMaterial = await _db.Queryable<BasMaterial>().Where(r => r.id == qcTempControlH.material_id).FirstAsync();
prdTaskDefect.material_code = basMaterial?.code;
prdTaskDefect.material_name=basMaterial?.name;
prdTaskDefect.estimated_start_date = prdMoTask?.estimated_start_date;
prdTaskDefect.estimated_end_date=prdMoTask?.estimated_end_date;
prdTaskDefect.plan_qty = prdMoTask?.plan_qty;
prdTaskDefect.scrap_qty = (string.IsNullOrEmpty(qcTempControlH.control_qty) ? 0 : Convert.ToDecimal(qcTempControlH.control_qty)) - qualifiedQty;//暂控数量-合格数量
prdTaskDefect.status = prdMoTask?.mo_task_status;
prdTaskDefect.eqp_code = prdMoTask == null ? "" : (await _db.Queryable<EqpEquipment>().FirstAsync(it => it.id == prdMoTask.eqp_id))?.code!;
prdTaskDefect.mold_name = prdMoTask == null ? "" : (await _db.Queryable<ToolMolds>().FirstAsync(it => it.id == prdMoTask.mold_id))?.mold_name!;
prdTaskDefect.create_time = DateTime.Now;
prdTaskDefect.create_id = _userManager.UserId;
await _db.Insertable(prdTaskDefect).ExecuteCommandAsync();
//新增生产报废记录子表
var prdMoTaskDefectRecordDs = new List<PrdMoTaskDefectRecordD>();
foreach(var item in qcTempControlDs)
{
var prdMoTaskDefectRecordD = new PrdMoTaskDefectRecordD
{
bill_id = prdTaskDefect.id,
source_id = item.id,
carry_id = item.carry_id,
carry_code = item.carry_code,
scrap_qty = ((string.IsNullOrEmpty(item.qty) ? 0 : Convert.ToDecimal(item.qty)) - (string.IsNullOrEmpty(item.qualified_qty) ? 0 : Convert.ToDecimal(item.qualified_qty))).ToString(),
submiter_id= item.submiter,
maker_id =item.maker_id,
make_time= prdTaskDefect.create_time
};
prdMoTaskDefectRecordDs.Add(prdMoTaskDefectRecordD);
}
await _db.Insertable(prdMoTaskDefectRecordDs).ExecuteCommandAsync();
#endregion
//载具台账变为空载具载具状态空闲、库位ID清空、检验状态待检、子表数据清空
foreach(var item in qcTempControlDs)
{
var wmsCarryH = await _db.Queryable<WmsCarryH>().Where(r => r.id == item.carry_id).FirstAsync();
wmsCarryH.carry_status = ((int)EnumCarryStatus.).ToString();
wmsCarryH.is_check = ((int)EnumCheckConclusion.).ToString();
wmsCarryH.location_code = "";
wmsCarryH.location_id = "";
wmsCarryH.is_lock = 0;
await _db.Updateable(wmsCarryH).ExecuteCommandAsync();
await _db.Updateable<WmsCarryH>()
.SetColumns(r => r.carry_status == ((int)EnumCarryStatus.).ToString())
.SetColumns(r => r.is_check == ((int)EnumCheckConclusion.).ToString())
.SetColumns(r => r.location_code == "")
.SetColumns(r => r.location_id == "")
.SetColumns(r => r.is_lock == 0)
.Where(r=>r.id==item.carry_id)
.ExecuteCommandAsync();
await _db.Deleteable<WmsCarryCode>().Where(r => r.carry_id == item.carry_id).ExecuteCommandAsync();
}
await _db.Ado.CommitTranAsync();
}
catch (Exception e)
{
await _db.Ado.RollbackTranAsync();
Log.Error(e.Message, e);
throw Oops.Bah(e.Message);
}
return "保存成功";
}
}
}