新增生产-前缫看台记录,并导入车头工/挡车工看台记录历史数据
功能: - 后端新增 KtjlCtgs / KtjlDcgs 两张表、KtjlService 与 api/prod/ktjl 接口 (按日期+车间+班次查询、整组先删后建保存、整组删除、按看台排班带出默认记录、工种下拉) - 挡车数按 F9 口径自动重算(与他人接壤的边界车位各扣 0.5),机组由车位反查机组车台 - 前端新增 /prod/qianxian/ktjl 看台记录页:挡车工/车头工双页签、删除、录入(新增)、录入(指定日期) - 录入弹窗校验对齐 F9:个人时长不超标准、挡车数/看台时长匹配、车头工每机组≥2 人且时长为标准时长整数倍 - 生产-前缫菜单新增「看台记录」,权限 prod:ktjl:list 数据导入: - 新增内嵌资源 biz_prod_qs_ktjl_ctg.csv / biz_prod_qs_ktjl_dcg.csv(约 5 万行,采用紧凑 CSV) - 剔除软删除行、日期异常行、部门无法映射与职工不存在的行;日期由 Excel 序列号转换 - 车头工 12693 行、挡车工 38048 行入库,日期范围 2025-12-16 ~ 2026-09-11 - 表内已有数据则整体跳过,分批 1000 行插入 其他:同步工作进度-13 文档与开发数据库快照
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
using F9WebAiTest.Application.Common;
|
||||
using F9WebAiTest.Application.Dtos.Prod;
|
||||
using F9WebAiTest.Application.Services.Prod;
|
||||
using F9WebAiTest.Domain.Common;
|
||||
using F9WebAiTest.Domain.Enums.SYS.Employees;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace F9WebAiTest.Api.Controllers.Prod;
|
||||
|
||||
/// <summary>看台记录(生产-前缫):车头工 / 挡车工</summary>
|
||||
[ApiController]
|
||||
[Route("api/prod/ktjl")]
|
||||
[Authorize]
|
||||
public class KtjlController : ControllerBase
|
||||
{
|
||||
private readonly IKtjlService _svc;
|
||||
public KtjlController(IKtjlService svc) => _svc = svc;
|
||||
|
||||
// ---------- 查询 ----------
|
||||
|
||||
/// <summary>挡车工看台记录(某日某车间某班次)</summary>
|
||||
[HttpGet("dcg")]
|
||||
public async Task<IActionResult> GetDcg([FromQuery] DateTime date, [FromQuery] long depId,
|
||||
[FromQuery] Prod_Banci_Enum banci = Prod_Banci_Enum.甲, [FromQuery] string like = "")
|
||||
=> Ok(ApiResult<List<KtjldcgReadDto_View>>.Ok(
|
||||
await _svc.GetDcgAsync(date, depId, banci, like ?? string.Empty)));
|
||||
|
||||
/// <summary>车头工看台记录</summary>
|
||||
[HttpGet("ctg")]
|
||||
public async Task<IActionResult> GetCtg([FromQuery] DateTime date, [FromQuery] long depId,
|
||||
[FromQuery] Prod_Banci_Enum banci = Prod_Banci_Enum.甲, [FromQuery] string like = "")
|
||||
=> Ok(ApiResult<List<KtjlctgReadDto_View>>.Ok(
|
||||
await _svc.GetCtgAsync(date, depId, banci, like ?? string.Empty)));
|
||||
|
||||
// ---------- 录入(新增):按看台排班带出默认记录 ----------
|
||||
|
||||
[HttpGet("dcg/defaults")]
|
||||
public async Task<IActionResult> GetDcgDefaults([FromQuery] DateTime date, [FromQuery] long depId,
|
||||
[FromQuery] Prod_Banci_Enum banci = Prod_Banci_Enum.甲)
|
||||
{
|
||||
try { return Ok(ApiResult<List<KtjldcgReadDto_View>>.Ok(await _svc.BuildDcgDefaultsAsync(date, depId, banci))); }
|
||||
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
|
||||
}
|
||||
|
||||
[HttpGet("ctg/defaults")]
|
||||
public async Task<IActionResult> GetCtgDefaults([FromQuery] DateTime date, [FromQuery] long depId,
|
||||
[FromQuery] Prod_Banci_Enum banci = Prod_Banci_Enum.甲)
|
||||
{
|
||||
try { return Ok(ApiResult<List<KtjlctgReadDto_View>>.Ok(await _svc.BuildCtgDefaultsAsync(date, depId, banci))); }
|
||||
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
|
||||
}
|
||||
|
||||
// ---------- 整组保存 ----------
|
||||
|
||||
[HttpPost("dcg/batch")]
|
||||
public async Task<IActionResult> SaveDcg([FromBody] KtjldcgBatchDto dto)
|
||||
{
|
||||
try
|
||||
{
|
||||
var count = await _svc.SaveDcgAsync(dto);
|
||||
return Ok(ApiResult<object>.Ok(count, count > 0 ? $"已保存 {count} 条看台记录" : "已清空该班次看台记录"));
|
||||
}
|
||||
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
|
||||
}
|
||||
|
||||
[HttpPost("ctg/batch")]
|
||||
public async Task<IActionResult> SaveCtg([FromBody] KtjlctgBatchDto dto)
|
||||
{
|
||||
try
|
||||
{
|
||||
var count = await _svc.SaveCtgAsync(dto);
|
||||
return Ok(ApiResult<object>.Ok(count, count > 0 ? $"已保存 {count} 条看台记录" : "已清空该班次看台记录"));
|
||||
}
|
||||
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
|
||||
}
|
||||
|
||||
// ---------- 整组删除 ----------
|
||||
|
||||
[HttpDelete("dcg")]
|
||||
public async Task<IActionResult> DeleteDcg([FromQuery] DateTime date, [FromQuery] long depId,
|
||||
[FromQuery] Prod_Banci_Enum banci = Prod_Banci_Enum.甲)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _svc.DeleteDcgAsync(date, depId, banci);
|
||||
return Ok(ApiResult<object>.Ok(null, "删除成功"));
|
||||
}
|
||||
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
|
||||
}
|
||||
|
||||
[HttpDelete("ctg")]
|
||||
public async Task<IActionResult> DeleteCtg([FromQuery] DateTime date, [FromQuery] long depId,
|
||||
[FromQuery] Prod_Banci_Enum banci = Prod_Banci_Enum.甲)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _svc.DeleteCtgAsync(date, depId, banci);
|
||||
return Ok(ApiResult<object>.Ok(null, "删除成功"));
|
||||
}
|
||||
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
|
||||
}
|
||||
|
||||
/// <summary>工种下拉</summary>
|
||||
[HttpGet("worktypes")]
|
||||
public async Task<IActionResult> GetWorktypes()
|
||||
=> Ok(ApiResult<List<ProdWorktypeOptionDto>>.Ok(await _svc.GetWorktypeOptionsAsync()));
|
||||
}
|
||||
Binary file not shown.
Reference in New Issue
Block a user