新增生产-前缫看台排班,并导入机组车台与看台排班数据
功能: - 后端新增 KtpbCtgs / KtpbDcgs / KtpbZbzs 三张表、KtpbService 与 api/prod/ktpb 接口 (车头工、挡车工、值班长分页查询与维护,挡车工按车间+班次+机组整组替换保存) - 挡车数按 F9 口径自动重算:接壤车台各计 0.5,保存时服务端重新计算并校验车台范围 - 前端新增 /prod/qianxian/ktpb 看台排班页(三页签 + 车间/班次/机组过滤 + 批量编辑弹窗) - 新增通用职工选择弹窗 EmployeeSelect(单选/多选,按部门过滤) - 生产-前缫菜单下新增「看台排班」,权限 prod:ktpb:list 数据导入: - 重新生成 biz_prod_qs_jzct.json,新增 ktpb_ctg / ktpb_dcg / ktpb_zbz 三个内嵌资源 - F9 部门 Id 经 DeptData 映射到本系统部门;职工按原始雪花 Id 关联 - 剔除软删除/脏数据:机组车台 24 条、车头工 33 条、挡车工 202 条(34 组)、值班长 7 条 - 导入幂等:机组车台按车间+机组 upsert,排班按业务唯一键去重,已维护的组不覆盖 其他:同步工作进度-12 文档与开发数据库快照
This commit is contained in:
@@ -0,0 +1,169 @@
|
||||
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/ktpb")]
|
||||
[Authorize]
|
||||
public class KtpbController : ControllerBase
|
||||
{
|
||||
private readonly IKtpbService _svc;
|
||||
public KtpbController(IKtpbService svc) => _svc = svc;
|
||||
|
||||
// ---------- 下拉 ----------
|
||||
|
||||
/// <summary>车间下拉(职责类型=前缫)</summary>
|
||||
[HttpGet("qianxian-deps")]
|
||||
public async Task<IActionResult> GetQianxianDeps()
|
||||
=> Ok(ApiResult<List<ChejianbanciDepOptionDto>>.Ok(await _svc.GetQianxianDepsAsync()));
|
||||
|
||||
/// <summary>机组下拉(含车台范围,来源于机组车台)</summary>
|
||||
[HttpGet("jizu-options")]
|
||||
public async Task<IActionResult> GetJizuOptions([FromQuery] long depId)
|
||||
=> Ok(ApiResult<List<KtpbJizuOptionDto>>.Ok(await _svc.GetJizuOptionsAsync(depId)));
|
||||
|
||||
// ---------- 车头工 ----------
|
||||
|
||||
[HttpGet("ctg")]
|
||||
public async Task<IActionResult> GetCtgPaged([FromQuery] long depId = 0, [FromQuery] Prod_Banci_Enum? banci = null,
|
||||
[FromQuery] int? jizu = null, [FromQuery] string like = "", [FromQuery] int pageIndex = 1,
|
||||
[FromQuery] int pageSize = 20)
|
||||
=> Ok(ApiResult<PageResult<KtpbctgReadDto_View>>.Ok(
|
||||
await _svc.GetCtgPagedAsync(depId, banci, jizu, like ?? string.Empty, pageIndex, pageSize)));
|
||||
|
||||
[HttpGet("ctg/{id}")]
|
||||
public async Task<IActionResult> GetCtgById(long id)
|
||||
{
|
||||
try { return Ok(ApiResult<KtpbctgReadDto_View>.Ok(await _svc.GetCtgByIdAsync(id))); }
|
||||
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
|
||||
}
|
||||
|
||||
[HttpPost("ctg")]
|
||||
public async Task<IActionResult> CreateCtg([FromBody] KtpbctgReadDto_View dto)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _svc.CreateCtgAsync(dto);
|
||||
return Ok(ApiResult<object>.Ok(null, "新增成功"));
|
||||
}
|
||||
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
|
||||
}
|
||||
|
||||
[HttpPut("ctg/{id}")]
|
||||
public async Task<IActionResult> UpdateCtg(long id, [FromBody] KtpbctgReadDto_View dto)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _svc.UpdateCtgAsync(id, dto);
|
||||
return Ok(ApiResult<object>.Ok(null, "修改成功"));
|
||||
}
|
||||
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
|
||||
}
|
||||
|
||||
[HttpDelete("ctg/{id}")]
|
||||
public async Task<IActionResult> DeleteCtg(long id)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _svc.DeleteCtgAsync(id);
|
||||
return Ok(ApiResult<object>.Ok(null, "删除成功"));
|
||||
}
|
||||
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
|
||||
}
|
||||
|
||||
// ---------- 挡车工 ----------
|
||||
|
||||
[HttpGet("dcg")]
|
||||
public async Task<IActionResult> GetDcgPaged([FromQuery] long depId = 0, [FromQuery] Prod_Banci_Enum? banci = null,
|
||||
[FromQuery] int? jizu = null, [FromQuery] string like = "", [FromQuery] int pageIndex = 1,
|
||||
[FromQuery] int pageSize = 20)
|
||||
=> Ok(ApiResult<PageResult<KtpbdcgReadDto_View>>.Ok(
|
||||
await _svc.GetDcgPagedAsync(depId, banci, jizu, like ?? string.Empty, pageIndex, pageSize)));
|
||||
|
||||
/// <summary>某「车间+班次+机组」下的整组排班(批量编辑弹窗)</summary>
|
||||
[HttpGet("dcg/group")]
|
||||
public async Task<IActionResult> GetDcgGroup([FromQuery] long depId, [FromQuery] Prod_Banci_Enum banci,
|
||||
[FromQuery] int jizu)
|
||||
{
|
||||
try { return Ok(ApiResult<List<KtpbdcgReadDto_View>>.Ok(await _svc.GetDcgGroupAsync(depId, banci, jizu))); }
|
||||
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
|
||||
}
|
||||
|
||||
/// <summary>整组替换保存(传空集合表示清空该组)</summary>
|
||||
[HttpPost("dcg/batch")]
|
||||
public async Task<IActionResult> SaveDcgBatch([FromBody] KtpbdcgBatchDto dto)
|
||||
{
|
||||
try
|
||||
{
|
||||
var count = await _svc.SaveDcgBatchAsync(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/{id}")]
|
||||
public async Task<IActionResult> DeleteDcg(long id)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _svc.DeleteDcgAsync(id);
|
||||
return Ok(ApiResult<object>.Ok(null, "删除成功"));
|
||||
}
|
||||
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
|
||||
}
|
||||
|
||||
// ---------- 值班长 ----------
|
||||
|
||||
[HttpGet("zbz")]
|
||||
public async Task<IActionResult> GetZbzPaged([FromQuery] long depId = 0, [FromQuery] Prod_Banci_Enum? banci = null,
|
||||
[FromQuery] string like = "", [FromQuery] int pageIndex = 1, [FromQuery] int pageSize = 20)
|
||||
=> Ok(ApiResult<PageResult<KtpbzbzReadDto_View>>.Ok(
|
||||
await _svc.GetZbzPagedAsync(depId, banci, like ?? string.Empty, pageIndex, pageSize)));
|
||||
|
||||
[HttpGet("zbz/{id}")]
|
||||
public async Task<IActionResult> GetZbzById(long id)
|
||||
{
|
||||
try { return Ok(ApiResult<KtpbzbzReadDto_View>.Ok(await _svc.GetZbzByIdAsync(id))); }
|
||||
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
|
||||
}
|
||||
|
||||
[HttpPost("zbz")]
|
||||
public async Task<IActionResult> CreateZbz([FromBody] KtpbzbzReadDto_View dto)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _svc.CreateZbzAsync(dto);
|
||||
return Ok(ApiResult<object>.Ok(null, "新增成功"));
|
||||
}
|
||||
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
|
||||
}
|
||||
|
||||
[HttpPut("zbz/{id}")]
|
||||
public async Task<IActionResult> UpdateZbz(long id, [FromBody] KtpbzbzReadDto_View dto)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _svc.UpdateZbzAsync(id, dto);
|
||||
return Ok(ApiResult<object>.Ok(null, "修改成功"));
|
||||
}
|
||||
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
|
||||
}
|
||||
|
||||
[HttpDelete("zbz/{id}")]
|
||||
public async Task<IActionResult> DeleteZbz(long id)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _svc.DeleteZbzAsync(id);
|
||||
return Ok(ApiResult<object>.Ok(null, "删除成功"));
|
||||
}
|
||||
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Reference in New Issue
Block a user