新增工资/仓储/生产日报等模块,移除旧考勤模块

- 新增 PayRoll(工资)、Wms(仓储)、Prod(车速/缫丝/考勤/丝片检测/丝片台账/纤检日报/质量日报) 模块
- 新增对应 Domain 实体、Application DTO/Service、Api Controller 与前端页面
- 移除旧 Attendance 考勤模块(Controller/Service/Entity/DTO 及 5 个前端页面),由 Prod/Kaoqin 取代
- 调整路由、仪表盘、Lsjl 流丝记录实体与服务
- 更新业务种子数据与 DbSeeder
- 补充工作进度文档 14-27
This commit is contained in:
yanpeng200212
2026-10-27 09:09:57 +08:00
parent 69c4052a64
commit 1f1b184411
119 changed files with 21576 additions and 1668 deletions
@@ -1,103 +0,0 @@
using F9WebAiTest.Application.Common;
using F9WebAiTest.Application.Dtos;
using F9WebAiTest.Application.Dtos.Attendance;
using F9WebAiTest.Application.Services;
using F9WebAiTest.Application.Services.Attendance;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace F9WebAiTest.Api.Controllers.Attendance;
[ApiController]
[Route("api/attendance")]
[Authorize]
public class AttendanceController : ControllerBase
{
private readonly IAttendanceService _service;
public AttendanceController(IAttendanceService service)
{
_service = service;
}
// POST /api/attendance/punch 打卡
[HttpPost("punch")]
public async Task<IActionResult> Punch()
{
var result = await _service.PunchAsync(GetUserId());
return Ok(ApiResult<PunchResultDto>.Ok(result));
}
// GET /api/attendance/my 我的考勤记录
[HttpGet("my")]
public async Task<IActionResult> GetMy([FromQuery] int pageIndex = 1, [FromQuery] int pageSize = 10)
{
var result = await _service.GetMyRecordsAsync(GetUserId(), pageIndex, pageSize);
return Ok(ApiResult<PageResult<AttendanceDto>>.Ok(result));
}
// GET /api/attendance/my/summary 我的考勤统计
[HttpGet("my/summary")]
public async Task<IActionResult> GetMySummary([FromQuery] string month)
{
var result = await _service.GetMySummaryAsync(GetUserId(), month);
return Ok(ApiResult<AttendanceSummaryDto>.Ok(result));
}
// GET /api/attendance 全部考勤(管理员)
[HttpGet]
public async Task<IActionResult> GetAll([FromQuery] AttendanceQueryDto query)
{
var result = await _service.GetAllRecordsAsync(query);
return Ok(ApiResult<PageResult<AttendanceDto>>.Ok(result));
}
// POST /api/attendance/leave 申请请假
[HttpPost("leave")]
public async Task<IActionResult> ApplyLeave([FromBody] CreateLeaveDto dto)
{
try
{
var result = await _service.ApplyLeaveAsync(GetUserId(), dto);
return Ok(ApiResult<LeaveRequestDto>.Ok(result, "申请已提交"));
}
catch (ServiceException ex)
{
return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code));
}
}
// GET /api/attendance/leave/my 我的请假
[HttpGet("leave/my")]
public async Task<IActionResult> GetMyLeaves()
{
var result = await _service.GetMyLeavesAsync(GetUserId());
return Ok(ApiResult<List<LeaveRequestDto>>.Ok(result));
}
// GET /api/attendance/leave 全部请假(管理员)
[HttpGet("leave")]
public async Task<IActionResult> GetAllLeaves([FromQuery] string status)
{
var result = await _service.GetAllLeavesAsync(status);
return Ok(ApiResult<List<LeaveRequestDto>>.Ok(result));
}
// PUT /api/attendance/leave/{id}/approve 审批请假
[HttpPut("leave/{id}/approve")]
public async Task<IActionResult> ApproveLeave(long id, [FromBody] ApproveLeaveDto dto)
{
try
{
var approverName = User.FindFirst("realName")?.Value ?? "管理员";
var result = await _service.ApproveLeaveAsync(id, GetUserId(), approverName, dto);
return Ok(ApiResult<LeaveRequestDto>.Ok(result, "审批完成"));
}
catch (ServiceException ex)
{
return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code));
}
}
private long GetUserId() => long.Parse(User.FindFirst("id")!.Value);
}
@@ -0,0 +1,66 @@
using F9WebAiTest.Application.Common;
using F9WebAiTest.Application.Dtos.PayRoll;
using F9WebAiTest.Application.Services.PayRoll;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace F9WebAiTest.Api.Controllers.PayRoll;
/// <summary>薪资计算-挡车/车头产量计算(对应 F9 薪资-挡车车头产量计算 CALCLDCCT)</summary>
[ApiController]
[Route("api/payroll/calcldcct")]
[Authorize]
public class CalcLdcctController : ControllerBase
{
private readonly ICalcLdcctService _svc;
public CalcLdcctController(ICalcLdcctService svc) => _svc = svc;
/// <summary>列表(账期起止 + 部门 + 工种 + 姓名/庄口关键字)</summary>
[HttpGet("list")]
public async Task<IActionResult> GetPaged([FromQuery] DateTime start, [FromQuery] DateTime end,
[FromQuery] long? depId = null, [FromQuery] long? worktypeId = null,
[FromQuery] string like = "", [FromQuery] int pageIndex = 1, [FromQuery] int pageSize = 50)
=> Ok(ApiResult<PageResult<CalcLdcctListItemDto>>.Ok(
await _svc.GetPagedAsync(pageIndex, pageSize, start, end, depId, worktypeId, like ?? string.Empty)));
/// <summary>一键计算(挡车工):整账期 + 部门 + 工种全量覆盖</summary>
[HttpPost("calc-dcg")]
public async Task<IActionResult> CalcDcg([FromBody] CalcLdcctCalcDto dto)
{
try { return Ok(ApiResult<CalcLdcctResultDto>.Ok(await _svc.CalcDcgAsync(dto), "计算完成")); }
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
/// <summary>一键计算(车头工):依赖已存的挡车工产量</summary>
[HttpPost("calc-ctg")]
public async Task<IActionResult> CalcCtg([FromBody] CalcLdcctCalcDto dto)
{
try { return Ok(ApiResult<CalcLdcctResultDto>.Ok(await _svc.CalcCtgAsync(dto), "计算完成")); }
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
/// <summary>保存人工微调结果(整账期 + 部门 + 工种全量覆盖)</summary>
[HttpPost("save")]
public async Task<IActionResult> Save([FromBody] CalcLdcctSaveDto dto)
{
try
{
var count = await _svc.SaveAsync(dto);
return Ok(ApiResult<object>.Ok(new { count }, "保存成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
/// <summary>删除整账期 + 部门 + 工种的计算结果</summary>
[HttpDelete]
public async Task<IActionResult> Delete([FromQuery] DateTime start, [FromQuery] DateTime end,
[FromQuery] long depId, [FromQuery] long worktypeId)
{
try
{
await _svc.DeleteAsync(start, end, depId, worktypeId);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
}
@@ -0,0 +1,101 @@
using F9WebAiTest.Application.Common;
using F9WebAiTest.Application.Dtos.PayRoll;
using F9WebAiTest.Application.Services.PayRoll;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace F9WebAiTest.Api.Controllers.PayRoll;
/// <summary>薪资配置-账期(CONFZQ):考勤统计的「前缫出勤天数」</summary>
[ApiController]
[Route("api/payroll/confzq")]
[Authorize]
public class ConfZqController : ControllerBase
{
private readonly IConfZqService _svc;
public ConfZqController(IConfZqService svc) => _svc = svc;
private IActionResult Fail(ServiceException ex) => StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code));
[HttpGet("")]
public async Task<IActionResult> List([FromQuery] int? year = null)
=> Ok(ApiResult<List<ConfZqDto>>.Ok(await _svc.GetListAsync(year)));
[HttpGet("{year:int}/{month:int}")]
public async Task<IActionResult> Get(int year, int month)
=> Ok(ApiResult<ConfZqDto>.Ok(await _svc.GetByYearMonthAsync(year, month)));
[HttpPost("")]
public async Task<IActionResult> Save([FromBody] ConfZqDto dto)
{
try { return Ok(ApiResult<object>.Ok(new { id = await _svc.SaveAsync(dto) }, "保存成功")); }
catch (ServiceException ex) { return Fail(ex); }
}
[HttpDelete("{id:long}")]
public async Task<IActionResult> Delete(long id)
{
try { await _svc.DeleteAsync(id); return Ok(ApiResult<object>.Ok(null, "删除成功")); }
catch (ServiceException ex) { return Fail(ex); }
}
}
/// <summary>薪资配置-职工(CONFEMPLOYEE):法定假小时数 / 是否学工</summary>
[ApiController]
[Route("api/payroll/confemployee")]
[Authorize]
public class ConfEmployeeController : ControllerBase
{
private readonly IConfEmployeeService _svc;
public ConfEmployeeController(IConfEmployeeService svc) => _svc = svc;
private IActionResult Fail(ServiceException ex) => StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code));
[HttpGet("")]
public async Task<IActionResult> List([FromQuery] long? employeeId = null, [FromQuery] long? worktypeId = null)
=> Ok(ApiResult<List<ConfEmployeeDto>>.Ok(await _svc.GetListAsync(employeeId, worktypeId)));
[HttpPost("")]
public async Task<IActionResult> Save([FromBody] ConfEmployeeDto dto)
{
try { return Ok(ApiResult<object>.Ok(new { id = await _svc.SaveAsync(dto) }, "保存成功")); }
catch (ServiceException ex) { return Fail(ex); }
}
[HttpDelete("{id:long}")]
public async Task<IActionResult> Delete(long id)
{
try { await _svc.DeleteAsync(id); return Ok(ApiResult<object>.Ok(null, "删除成功")); }
catch (ServiceException ex) { return Fail(ex); }
}
}
/// <summary>岗位胜任考核:考核结果决定加班费单价档位</summary>
[ApiController]
[Route("api/payroll/gwsrkh")]
[Authorize]
public class GwsrkhController : ControllerBase
{
private readonly IGwsrkhService _svc;
public GwsrkhController(IGwsrkhService svc) => _svc = svc;
private IActionResult Fail(ServiceException ex) => StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code));
[HttpGet("")]
public async Task<IActionResult> List([FromQuery] int year, [FromQuery] int month, [FromQuery] long depId = 0)
=> Ok(ApiResult<List<GwsrkhDto>>.Ok(await _svc.GetListAsync(year, month, depId)));
[HttpPost("")]
public async Task<IActionResult> Save([FromBody] GwsrkhDto dto)
{
try { return Ok(ApiResult<object>.Ok(new { id = await _svc.SaveAsync(dto) }, "保存成功")); }
catch (ServiceException ex) { return Fail(ex); }
}
[HttpDelete("{id:long}")]
public async Task<IActionResult> Delete(long id)
{
try { await _svc.DeleteAsync(id); return Ok(ApiResult<object>.Ok(null, "删除成功")); }
catch (ServiceException ex) { return Fail(ex); }
}
}
@@ -0,0 +1,230 @@
using F9WebAiTest.Application.Common;
using F9WebAiTest.Application.Dtos.PayRoll;
using F9WebAiTest.Application.Services.PayRoll;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace F9WebAiTest.Api.Controllers.PayRoll;
// ==================== 薪资配置-工艺庄口 ====================
/// <summary>薪资配置-工艺庄口(挡车车头产量计算的丝量/单价/系数基准)</summary>
[ApiController]
[Route("api/payroll/confgyzk")]
[Authorize]
public class ConfGyzkController : ControllerBase
{
private readonly IConfGyzkService _svc;
public ConfGyzkController(IConfGyzkService svc) => _svc = svc;
[HttpGet("list")]
public async Task<IActionResult> GetList([FromQuery] int? year = null, [FromQuery] int? month = null)
=> Ok(ApiResult<List<ConfGyzkListItemDto>>.Ok(await _svc.GetListAsync(year, month)));
[HttpGet("{id}")]
public async Task<IActionResult> GetForEdit(long id)
{
try { return Ok(ApiResult<ConfGyzkSaveDto>.Ok(await _svc.GetForEditAsync(id))); }
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
[HttpPost("save")]
public async Task<IActionResult> Save([FromBody] ConfGyzkSaveDto dto)
{
try
{
var id = await _svc.SaveAsync(dto);
return Ok(ApiResult<object>.Ok(new { id }, "保存成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(long id)
{
try
{
await _svc.DeleteAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
}
// ==================== 薪资配置-工种 ====================
/// <summary>薪资配置-工种/岗位(标准上班时长、标准出勤天数及各项金额)</summary>
[ApiController]
[Route("api/payroll/confgz")]
[Authorize]
public class ConfGzController : ControllerBase
{
private readonly IConfGzService _svc;
public ConfGzController(IConfGzService svc) => _svc = svc;
[HttpGet("list")]
public async Task<IActionResult> GetList() => Ok(ApiResult<List<ConfGzListItemDto>>.Ok(await _svc.GetListAsync()));
[HttpGet("{id}")]
public async Task<IActionResult> GetForEdit(long id)
{
try { return Ok(ApiResult<ConfGzSaveDto>.Ok(await _svc.GetForEditAsync(id))); }
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
[HttpPost("save")]
public async Task<IActionResult> Save([FromBody] ConfGzSaveDto dto)
{
try
{
var id = await _svc.SaveAsync(dto);
return Ok(ApiResult<object>.Ok(new { id }, "保存成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(long id)
{
try
{
await _svc.DeleteAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
}
// ==================== 薪资配置-挡车/车头岗位 ====================
/// <summary>薪资配置-挡车/车头岗位(按绪数档的岗位基数金额、车头工金额)</summary>
[ApiController]
[Route("api/payroll/confdcg")]
[Authorize]
public class ConfDcgController : ControllerBase
{
private readonly IConfDcgService _svc;
public ConfDcgController(IConfDcgService svc) => _svc = svc;
[HttpGet("list")]
public async Task<IActionResult> GetList() => Ok(ApiResult<List<ConfDcgListItemDto>>.Ok(await _svc.GetListAsync()));
[HttpGet("{id}")]
public async Task<IActionResult> GetForEdit(long id)
{
try { return Ok(ApiResult<ConfDcgSaveDto>.Ok(await _svc.GetForEditAsync(id))); }
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
[HttpPost("save")]
public async Task<IActionResult> Save([FromBody] ConfDcgSaveDto dto)
{
try
{
var id = await _svc.SaveAsync(dto);
return Ok(ApiResult<object>.Ok(new { id }, "保存成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(long id)
{
try
{
await _svc.DeleteAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
}
// ==================== 挡车纤度奖扣 ====================
/// <summary>挡车纤度奖扣(按规格 + 纤度配置野纤的奖励/扣款)</summary>
[ApiController]
[Route("api/payroll/dcxdjk")]
[Authorize]
public class DcxdjkController : ControllerBase
{
private readonly IDcxdjkService _svc;
public DcxdjkController(IDcxdjkService svc) => _svc = svc;
[HttpGet("list")]
public async Task<IActionResult> GetList([FromQuery] string guige = "")
=> Ok(ApiResult<List<DcxdjkListItemDto>>.Ok(await _svc.GetListAsync(guige ?? string.Empty)));
[HttpGet("{id}")]
public async Task<IActionResult> GetForEdit(long id)
{
try { return Ok(ApiResult<DcxdjkSaveDto>.Ok(await _svc.GetForEditAsync(id))); }
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
[HttpPost("save")]
public async Task<IActionResult> Save([FromBody] DcxdjkSaveDto dto)
{
try
{
var id = await _svc.SaveAsync(dto);
return Ok(ApiResult<object>.Ok(new { id }, "保存成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(long id)
{
try
{
await _svc.DeleteAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
}
// ==================== 薪资价格配置 ====================
/// <summary>薪资价格配置(如「薪资.前缫」下的挡车工/车头工计件等级奖扣单价)</summary>
[ApiController]
[Route("api/payroll/xzjg")]
[Authorize]
public class XzjgController : ControllerBase
{
private readonly IXzjgService _svc;
public XzjgController(IXzjgService svc) => _svc = svc;
[HttpGet("list")]
public async Task<IActionResult> GetList([FromQuery] string group = "")
=> Ok(ApiResult<List<XzjgListItemDto>>.Ok(await _svc.GetListAsync(group ?? string.Empty)));
[HttpGet("{id}")]
public async Task<IActionResult> GetForEdit(long id)
{
try { return Ok(ApiResult<XzjgSaveDto>.Ok(await _svc.GetForEditAsync(id))); }
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
[HttpPost("save")]
public async Task<IActionResult> Save([FromBody] XzjgSaveDto dto)
{
try
{
var id = await _svc.SaveAsync(dto);
return Ok(ApiResult<object>.Ok(new { id }, "保存成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(long id)
{
try
{
await _svc.DeleteAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
}
@@ -0,0 +1,55 @@
using F9WebAiTest.Application.Common;
using F9WebAiTest.Application.Dtos.Prod;
using F9WebAiTest.Application.Services.Prod;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace F9WebAiTest.Api.Controllers.Prod;
/// <summary>秤大丝(生产-后缫):以落丝记录为主表,按车台录入丝量</summary>
[ApiController]
[Route("api/prod/cds")]
[Authorize]
public class CdsController : ControllerBase
{
private readonly ICdsService _svc;
public CdsController(ICdsService svc) => _svc = svc;
/// <summary>秤大丝列表(落丝记录 + 秤丝汇总)</summary>
[HttpGet("list")]
public async Task<IActionResult> GetPaged([FromQuery] int pageIndex = 1, [FromQuery] int pageSize = 20,
[FromQuery] DateTime? date = null, [FromQuery] long? deptId = null)
=> Ok(ApiResult<PageResult<CdsListItemDto>>.Ok(await _svc.GetPagedAsync(pageIndex, pageSize, date, deptId)));
/// <summary>称重弹窗数据(车台明细;首次称重按车台范围初始化)</summary>
[HttpGet("{lsjlId}")]
public async Task<IActionResult> GetEdit(long lsjlId)
{
try { return Ok(ApiResult<CdsEditDto>.Ok(await _svc.GetEditAsync(lsjlId))); }
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
/// <summary>保存秤大丝(车台明细先删后建 + 汇总指标)</summary>
[HttpPost("save")]
public async Task<IActionResult> Save([FromBody] CdsSaveDto dto)
{
try
{
await _svc.SaveAsync(dto);
return Ok(ApiResult<object>.Ok(null, "保存成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
/// <summary>清除称重数据(汇总 + 车台明细)</summary>
[HttpDelete("{lsjlId}")]
public async Task<IActionResult> Delete(long lsjlId)
{
try
{
await _svc.DeleteAsync(lsjlId);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
}
@@ -0,0 +1,34 @@
using F9WebAiTest.Application.Common;
using F9WebAiTest.Application.Dtos.Prod;
using F9WebAiTest.Application.Services.Prod;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace F9WebAiTest.Api.Controllers.Prod;
/// <summary>公量纤度(生产-后缫):按「日期 + 车间」整日批量录入</summary>
[ApiController]
[Route("api/prod/glxd")]
[Authorize]
public class GlxdController : ControllerBase
{
private readonly IGlxdService _svc;
public GlxdController(IGlxdService svc) => _svc = svc;
/// <summary>公量纤度列表(落丝记录 + 纤度检验平均纤度 + 公量纤度)</summary>
[HttpGet("list")]
public async Task<IActionResult> GetList([FromQuery] DateTime? date = null, [FromQuery] long? deptId = null)
=> Ok(ApiResult<List<GlxdListItemDto>>.Ok(await _svc.GetListAsync(date, deptId)));
/// <summary>批量保存公量纤度</summary>
[HttpPost("save")]
public async Task<IActionResult> Save([FromBody] GlxdSaveDto dto)
{
try
{
await _svc.SaveAsync(dto);
return Ok(ApiResult<object>.Ok(null, "保存成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
}
@@ -0,0 +1,100 @@
using F9WebAiTest.Application.Common;
using F9WebAiTest.Application.Dtos.Prod;
using F9WebAiTest.Application.Services.Prod;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace F9WebAiTest.Api.Controllers.Prod;
/// <summary>
/// 生产-考勤:考勤登记(CQDJ)。
/// 对应 F9 WinClient\F9.Business.Prod\KQ\CQDJ。
/// </summary>
[ApiController]
[Route("api/prod/kaoqin")]
[Authorize]
public class KaoqinController : ControllerBase
{
private readonly IKaoqinService _svc;
public KaoqinController(IKaoqinService svc) => _svc = svc;
private IActionResult Fail(ServiceException ex) => StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code));
/// <summary>整组登记查询(日期 + 部门 + 工种 + 班次)</summary>
[HttpGet("cqdj")]
public async Task<IActionResult> GetRegister([FromQuery] DateTime date, [FromQuery] long depId,
[FromQuery] long worktypeId = 0, [FromQuery] int banci = 1, [FromQuery] string keyword = "")
{
try { return Ok(ApiResult<CqdjViewDto>.Ok(await _svc.GetRegisterAsync(date, depId, worktypeId, banci, keyword ?? ""))); }
catch (ServiceException ex) { return Fail(ex); }
}
/// <summary>整组覆盖保存</summary>
[HttpPost("cqdj")]
public async Task<IActionResult> SaveRegister([FromBody] CqdjSaveDto dto)
{
try { return Ok(ApiResult<object>.Ok(new { count = await _svc.SaveRegisterAsync(dto) }, "保存成功")); }
catch (ServiceException ex) { return Fail(ex); }
}
/// <summary>删除整组登记</summary>
[HttpDelete("cqdj")]
public async Task<IActionResult> DeleteRegister([FromQuery] DateTime date, [FromQuery] long depId,
[FromQuery] long worktypeId = 0, [FromQuery] int banci = 1)
{
try { return Ok(ApiResult<object>.Ok(new { count = await _svc.DeleteRegisterAsync(date, depId, worktypeId, banci) }, "删除成功")); }
catch (ServiceException ex) { return Fail(ex); }
}
/// <summary>「添加职工」可选职工</summary>
[HttpGet("cqdj/employees")]
public async Task<IActionResult> Employees([FromQuery] long depId, [FromQuery] long worktypeId = 0, [FromQuery] int banci = 1)
=> Ok(ApiResult<List<CqdjEmpOptionDto>>.Ok(await _svc.GetEmployeesAsync(depId, worktypeId, banci)));
// ==================== 考勤统计(CQTJ) ====================
/// <summary>统计分页(库中的月快照)</summary>
[HttpGet("cqtj")]
public async Task<IActionResult> CqtjList([FromQuery] int year, [FromQuery] int month, [FromQuery] long depId = 0,
[FromQuery] long worktypeId = 0, [FromQuery] string like = "", [FromQuery] int pageIndex = 1, [FromQuery] int pageSize = 20)
=> Ok(ApiResult<PageResult<CqtjRowDto>>.Ok(
await _svc.GetCqtjPagedAsync(year, month, depId, worktypeId, like ?? "", pageIndex, pageSize)));
/// <summary>录入:已有快照取库,否则按账期实时汇总</summary>
[HttpGet("cqtj/edit")]
public async Task<IActionResult> CqtjEdit([FromQuery] int year, [FromQuery] int month, [FromQuery] long depId)
{
try { return Ok(ApiResult<CqtjViewDto>.Ok(await _svc.GetCqtjForEditAsync(year, month, depId))); }
catch (ServiceException ex) { return Fail(ex); }
}
/// <summary>保存(整组覆盖)</summary>
[HttpPost("cqtj")]
public async Task<IActionResult> CqtjSave([FromBody] CqtjSaveDto dto)
{
try { return Ok(ApiResult<object>.Ok(new { count = await _svc.SaveCqtjAsync(dto) }, "保存成功")); }
catch (ServiceException ex) { return Fail(ex); }
}
/// <summary>删除该年月的统计快照(depId=0 表示全部部门)</summary>
[HttpDelete("cqtj")]
public async Task<IActionResult> CqtjDelete([FromQuery] int year, [FromQuery] int month, [FromQuery] long depId = 0)
{
try
{
var count = depId > 0
? await _svc.DeleteCqtjAsync(year, month, depId)
: await _svc.DeleteCqtjAllAsync(year, month);
return Ok(ApiResult<object>.Ok(new { count }, "删除成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
/// <summary>一键生成:遍历全部车间,缺的才生成</summary>
[HttpPost("cqtj/generate")]
public async Task<IActionResult> CqtjGenerate([FromBody] CqtjGenerateDto dto)
{
try { return Ok(ApiResult<object>.Ok(new { count = await _svc.GenerateCqtjAllAsync(dto.Year, dto.Month) }, "生成完成")); }
catch (ServiceException ex) { return Fail(ex); }
}
}
@@ -0,0 +1,54 @@
using F9WebAiTest.Application.Common;
using F9WebAiTest.Application.Dtos.Prod;
using F9WebAiTest.Application.Services.Prod;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace F9WebAiTest.Api.Controllers.Prod;
/// <summary>丝片检查(生产-后缫):按「日期 + 车间 + 工艺庄口 + 规格」录入疵点片数</summary>
[ApiController]
[Route("api/prod/spjc")]
[Authorize]
public class SpjcController : ControllerBase
{
private readonly ISpjcService _svc;
public SpjcController(ISpjcService svc) => _svc = svc;
/// <summary>丝片检查列表(日期 + 车间 + 关键字)</summary>
[HttpGet("list")]
public async Task<IActionResult> GetPaged([FromQuery] int pageIndex = 1, [FromQuery] int pageSize = 20,
[FromQuery] DateTime? date = null, [FromQuery] long? deptId = null, [FromQuery] string like = "")
=> Ok(ApiResult<PageResult<SpjcListItemDto>>.Ok(
await _svc.GetPagedAsync(pageIndex, pageSize, date, deptId, like ?? string.Empty)));
/// <summary>修改回填</summary>
[HttpGet("{id}")]
public async Task<IActionResult> GetForEdit(long id)
{
try { return Ok(ApiResult<SpjcSaveDto>.Ok(await _svc.GetForEditAsync(id))); }
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
[HttpPost("save")]
public async Task<IActionResult> Save([FromBody] SpjcSaveDto dto)
{
try
{
var id = await _svc.SaveAsync(dto);
return Ok(ApiResult<object>.Ok(new { id }, "保存成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(long id)
{
try
{
await _svc.DeleteAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
}
@@ -0,0 +1,58 @@
using F9WebAiTest.Application.Common;
using F9WebAiTest.Application.Dtos.Prod;
using F9WebAiTest.Application.Services.Prod;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace F9WebAiTest.Api.Controllers.Prod;
/// <summary>丝片台帐(生产-后缫):每日一条,按账期区间查询</summary>
[ApiController]
[Route("api/prod/sptz")]
[Authorize]
public class SptzController : ControllerBase
{
private readonly ISptzService _svc;
public SptzController(ISptzService svc) => _svc = svc;
/// <summary>丝片台帐列表(账期起止)</summary>
[HttpGet("list")]
public async Task<IActionResult> GetPaged([FromQuery] DateTime dateFrom, [FromQuery] DateTime dateTo,
[FromQuery] int pageIndex = 1, [FromQuery] int pageSize = 31)
=> Ok(ApiResult<PageResult<SptzListItemDto>>.Ok(await _svc.GetPagedAsync(pageIndex, pageSize, dateFrom, dateTo)));
/// <summary>修改回填</summary>
[HttpGet("{id}")]
public async Task<IActionResult> GetForEdit(long id)
{
try { return Ok(ApiResult<SptzSaveDto>.Ok(await _svc.GetForEditAsync(id))); }
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
/// <summary>新增默认值:上一本台账 + 上存,并按当日「丝片检查」带出整理片数</summary>
[HttpGet("defaults")]
public async Task<IActionResult> GetDefaults([FromQuery] DateTime date)
=> Ok(ApiResult<SptzDefaultsDto>.Ok(await _svc.GetDefaultsAsync(date)));
[HttpPost("save")]
public async Task<IActionResult> Save([FromBody] SptzSaveDto dto)
{
try
{
var id = await _svc.SaveAsync(dto);
return Ok(ApiResult<object>.Ok(new { id }, "保存成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(long id)
{
try
{
await _svc.DeleteAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
}
@@ -0,0 +1,143 @@
using F9WebAiTest.Application.Common;
using F9WebAiTest.Application.Dtos.Prod;
using F9WebAiTest.Application.Services.Prod;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace F9WebAiTest.Api.Controllers.Prod;
/// <summary>
/// 生产-选剥茧(对应 F9 WinClient\F9.Business.Prod\XBJ):
/// 选茧日报(含盈亏 / 联统率)、选茧计划及其明细、选茧班组与班组职工。
/// </summary>
[ApiController]
[Route("api/prod/xjrb")]
[Authorize]
public class XjrbController : ControllerBase
{
private readonly IXjrbService _svc;
public XjrbController(IXjrbService svc) => _svc = svc;
private IActionResult Fail(ServiceException ex) => StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code));
// ==================== 选茧日报 ====================
[HttpGet("")]
public async Task<IActionResult> List([FromQuery] DateTime? start = null, [FromQuery] DateTime? end = null,
[FromQuery] string like = "", [FromQuery] int pageIndex = 1, [FromQuery] int pageSize = 20)
=> Ok(ApiResult<PageResult<XjrbListDto>>.Ok(await _svc.GetPagedAsync(start, end, like ?? "", pageIndex, pageSize)));
[HttpGet("{id:long}")]
public async Task<IActionResult> Get(long id)
=> Ok(ApiResult<XjrbSaveDto>.Ok(await _svc.GetByIdAsync(id)));
[HttpPost("")]
public async Task<IActionResult> Save([FromBody] XjrbSaveDto dto)
{
try { return Ok(ApiResult<object>.Ok(new { id = await _svc.SaveAsync(dto) }, "保存成功")); }
catch (ServiceException ex) { return Fail(ex); }
}
[HttpDelete("{id:long}")]
public async Task<IActionResult> Delete(long id)
{
try
{
await _svc.DeleteAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
/// <summary>计算盈亏 / 联统率(前端保存前调用,把结果写入表单)</summary>
[HttpPost("count-yingkui")]
public async Task<IActionResult> CountYingkui([FromBody] XjrbSaveDto dto)
{
try { return Ok(ApiResult<XjrbYingkuiDto>.Ok(await _svc.CountYingkuiAsync(dto))); }
catch (ServiceException ex) { return Fail(ex); }
}
// ==================== 选茧计划 ====================
[HttpGet("plan")]
public async Task<IActionResult> PlanList([FromQuery] DateTime? start = null, [FromQuery] DateTime? end = null,
[FromQuery] string like = "", [FromQuery] int pageIndex = 1, [FromQuery] int pageSize = 20)
=> Ok(ApiResult<PageResult<XjrbPlanListDto>>.Ok(await _svc.GetPlanPagedAsync(start, end, like ?? "", pageIndex, pageSize)));
[HttpGet("plan/{id:long}")]
public async Task<IActionResult> PlanGet(long id)
=> Ok(ApiResult<XjrbPlanSaveDto>.Ok(await _svc.GetPlanByIdAsync(id)));
[HttpPost("plan")]
public async Task<IActionResult> PlanSave([FromBody] XjrbPlanSaveDto dto)
{
try { return Ok(ApiResult<object>.Ok(new { id = await _svc.SavePlanAsync(dto) }, "保存成功")); }
catch (ServiceException ex) { return Fail(ex); }
}
[HttpDelete("plan/{id:long}")]
public async Task<IActionResult> PlanDelete(long id)
{
try
{
await _svc.DeletePlanAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
// ==================== 选茧计划明细 ====================
[HttpGet("plan/{planId:long}/items")]
public async Task<IActionResult> PlanItems(long planId)
=> Ok(ApiResult<List<XjrbItemDto>>.Ok(await _svc.GetPlanItemsAsync(planId)));
[HttpPost("plan/item")]
public async Task<IActionResult> PlanItemSave([FromBody] XjrbItemSaveDto dto)
{
try { return Ok(ApiResult<object>.Ok(new { id = await _svc.SavePlanItemAsync(dto) }, "保存成功")); }
catch (ServiceException ex) { return Fail(ex); }
}
[HttpDelete("plan/item/{id:long}")]
public async Task<IActionResult> PlanItemDelete(long id)
{
try
{
await _svc.DeletePlanItemAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
/// <summary>计划维度盈亏(联统率按包数口径)</summary>
[HttpPost("plan/count-yingkui")]
public async Task<IActionResult> PlanCountYingkui([FromBody] XjrbItemSaveDto dto)
{
try { return Ok(ApiResult<XjrbYingkuiDto>.Ok(await _svc.CountPlanYingkuiAsync(dto))); }
catch (ServiceException ex) { return Fail(ex); }
}
// ==================== 选茧班组 ====================
[HttpGet("banzu")]
public async Task<IActionResult> BanzuList([FromQuery] string banci = "", [FromQuery] int? zu = null,
[FromQuery] int pageIndex = 1, [FromQuery] int pageSize = 20)
=> Ok(ApiResult<PageResult<XjpbBanzuDto>>.Ok(await _svc.GetBanzuPagedAsync(banci ?? "", zu, pageIndex, pageSize)));
[HttpGet("banzu/{id:long}/zhigong")]
public async Task<IActionResult> BanzuZhigong(long id)
=> Ok(ApiResult<List<XjpbBanzuZhigongDto>>.Ok(await _svc.GetBanzuZhigongAsync(id)));
/// <summary>班组「编辑录入」:按班次整体覆盖保存职工与组别</summary>
[HttpPost("banzu/zhigong")]
public async Task<IActionResult> BanzuZhigongSave([FromBody] List<XjpbBanzuZhigongSaveDto> dtos)
{
try
{
await _svc.SaveBanzuZhigongAsync(dtos ?? new List<XjpbBanzuZhigongSaveDto>());
return Ok(ApiResult<object>.Ok(null, "保存成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
}
@@ -0,0 +1,90 @@
using F9WebAiTest.Application.Common;
using F9WebAiTest.Application.Dtos.Prod;
using F9WebAiTest.Application.Services.Prod;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace F9WebAiTest.Api.Controllers.Prod;
/// <summary>煮茧日报(生产-前缫):主表 + 机组 / 班次 / 机组班次</summary>
[ApiController]
[Route("api/prod/zjrb")]
[Authorize]
public class ZjrbController : ControllerBase
{
private readonly IZjrbService _svc;
public ZjrbController(IZjrbService svc) => _svc = svc;
// ---------- 查询 ----------
/// <summary>日报列表(账期起止 + 车间 + 庄口/规格关键字)</summary>
[HttpGet("list")]
public async Task<IActionResult> GetPaged([FromQuery] DateTime dateFrom, [FromQuery] DateTime dateTo,
[FromQuery] long depId = 0, [FromQuery] string like = "", [FromQuery] int pageIndex = 1,
[FromQuery] int pageSize = 20)
=> Ok(ApiResult<PageResult<ZjrbReadDto_View>>.Ok(
await _svc.GetPagedAsync(dateFrom, dateTo, depId, like ?? string.Empty, pageIndex, pageSize)));
/// <summary>某条日报的机组明细</summary>
[HttpGet("{id}/jizus")]
public async Task<IActionResult> GetJizus(long id)
{
try { return Ok(ApiResult<List<ZjrbJizuDto>>.Ok(await _svc.GetJizuListAsync(id))); }
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
/// <summary>修改回填(主表 + 班次 + 机组 + 机组班次)</summary>
[HttpGet("{id}")]
public async Task<IActionResult> GetForEdit(long id)
{
try { return Ok(ApiResult<ZjrbSaveDto>.Ok(await _svc.GetForEditAsync(id))); }
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
/// <summary>新增默认值:按上一日结存带出上存、每桶茧量、工艺落丝桶数,并按机组车台生成机组行</summary>
[HttpGet("defaults")]
public async Task<IActionResult> GetDefaults([FromQuery] DateTime date, [FromQuery] long depId,
[FromQuery] long gyzkId, [FromQuery] string guige = "")
{
try { return Ok(ApiResult<ZjrbSaveDto>.Ok(await _svc.BuildDefaultsAsync(date, depId, gyzkId, guige))); }
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
// ---------- 保存 / 删除 ----------
[HttpPost("save")]
public async Task<IActionResult> Save([FromBody] ZjrbSaveDto dto)
{
try
{
var id = await _svc.SaveAsync(dto);
return Ok(ApiResult<object>.Ok(new { id }, "保存成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(long id)
{
try
{
await _svc.DeleteAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
// ---------- 计算缫丝时长 ----------
/// <summary>按「日期 + 车间」整日重算机组缫丝时长(单班 9 小时 / 双班 18 小时,按茧量比例分配)</summary>
[HttpPost("calculate-saosi-hours")]
public async Task<IActionResult> CalculateSaosiHours([FromQuery] DateTime date, [FromQuery] long depId)
{
try
{
var changed = await _svc.CalculateJizuSaosiHoursAsync(date, depId);
return Ok(ApiResult<object>.Ok(changed, changed > 0 ? $"已更新 {changed} 条机组缫丝时长" : "缫丝时长无变化"));
}
catch (ServiceException ex) { return StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code)); }
}
}
@@ -0,0 +1,328 @@
using F9WebAiTest.Application.Common;
using F9WebAiTest.Application.Dtos.Wms;
using F9WebAiTest.Application.Services.Wms;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace F9WebAiTest.Api.Controllers.Wms;
/// <summary>
/// 仓储(WMS):原料(1) / 副产品(2) / 中间品(3) / 生丝(4) / 物资(5)
/// 对应 F9 WinClient\F9.Business.WMS 五个模块的入库 / 出库 / 库存台账及其扩展功能。
/// </summary>
[ApiController]
[Route("api/wms")]
[Authorize]
public class WmsController : ControllerBase
{
private readonly IWmsService _svc;
public WmsController(IWmsService svc) => _svc = svc;
private IActionResult Fail(ServiceException ex) => StatusCode(ex.Code, ApiResult<object>.Fail(ex.Message, ex.Code));
/// <summary>下拉选项:单据类型 / 物资 / 原料庄口 / 工艺庄口 / 部门 / 往来单位</summary>
[HttpGet("options")]
public async Task<IActionResult> Options([FromQuery] int module)
=> Ok(ApiResult<WmsOptionsDto>.Ok(await _svc.GetOptionsAsync(module)));
// ==================== 入库 ====================
[HttpGet("ruku")]
public async Task<IActionResult> RukuList([FromQuery] int module, [FromQuery] DateTime? start = null,
[FromQuery] DateTime? end = null, [FromQuery] int? type = null, [FromQuery] string like = "",
[FromQuery] int pageIndex = 1, [FromQuery] int pageSize = 20)
=> Ok(ApiResult<PageResult<WmsRukuListDto>>.Ok(
await _svc.GetRukuPagedAsync(module, start, end, type, like ?? "", pageIndex, pageSize)));
[HttpGet("ruku/{id:long}")]
public async Task<IActionResult> RukuGet(long id)
{
try { return Ok(ApiResult<WmsRukuEditDto>.Ok(await _svc.GetRukuAsync(id))); }
catch (ServiceException ex) { return Fail(ex); }
}
[HttpPost("ruku")]
public async Task<IActionResult> RukuSave([FromBody] WmsRukuSaveDto dto)
{
try
{
var id = await _svc.SaveRukuAsync(dto);
return Ok(ApiResult<object>.Ok(new { id }, "保存成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
[HttpDelete("ruku/{id:long}")]
public async Task<IActionResult> RukuDelete(long id)
{
try
{
await _svc.DeleteRukuAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
/// <summary>采购报销(物资入库单置为已报销)</summary>
[HttpPost("ruku/baoxiao")]
public async Task<IActionResult> Baoxiao([FromBody] List<long> ids)
{
try
{
var count = await _svc.BaoxiaoAsync(ids ?? new List<long>());
return Ok(ApiResult<object>.Ok(new { count }, "报销成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
// ==================== 出库 ====================
[HttpGet("chuku")]
public async Task<IActionResult> ChukuList([FromQuery] int module, [FromQuery] DateTime? start = null,
[FromQuery] DateTime? end = null, [FromQuery] int? type = null, [FromQuery] string like = "",
[FromQuery] int pageIndex = 1, [FromQuery] int pageSize = 20)
=> Ok(ApiResult<PageResult<WmsChukuListDto>>.Ok(
await _svc.GetChukuPagedAsync(module, start, end, type, like ?? "", pageIndex, pageSize)));
[HttpGet("chuku/{id:long}")]
public async Task<IActionResult> ChukuGet(long id)
{
try { return Ok(ApiResult<WmsChukuEditDto>.Ok(await _svc.GetChukuAsync(id))); }
catch (ServiceException ex) { return Fail(ex); }
}
[HttpPost("chuku")]
public async Task<IActionResult> ChukuSave([FromBody] WmsChukuSaveDto dto)
{
try
{
var id = await _svc.SaveChukuAsync(dto);
return Ok(ApiResult<object>.Ok(new { id }, "保存成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
[HttpDelete("chuku/{id:long}")]
public async Task<IActionResult> ChukuDelete(long id)
{
try
{
await _svc.DeleteChukuAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
// ==================== 库存台账 ====================
[HttpGet("taizhang/dates")]
public async Task<IActionResult> TaizhangDates([FromQuery] int module, [FromQuery] int kind = 0)
=> Ok(ApiResult<List<WmsTzDateDto>>.Ok(await _svc.GetTzDatesAsync(module, kind)));
[HttpGet("taizhang")]
public async Task<IActionResult> Taizhang([FromQuery] int module, [FromQuery] DateTime date, [FromQuery] int kind = 0,
[FromQuery] bool regenerate = false)
{
try { return Ok(ApiResult<WmsTzEditDto>.Ok(await _svc.GetTaizhangAsync(module, kind, date, regenerate))); }
catch (ServiceException ex) { return Fail(ex); }
}
[HttpPost("taizhang")]
public async Task<IActionResult> TaizhangSave([FromBody] WmsTzSaveDto dto)
{
try
{
var id = await _svc.SaveTaizhangAsync(dto);
return Ok(ApiResult<object>.Ok(new { id }, "保存成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
[HttpDelete("taizhang/{id:long}")]
public async Task<IActionResult> TaizhangDelete(long id)
{
try
{
await _svc.DeleteTaizhangAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
// ==================== 库存 / 出入库流水 ====================
[HttpGet("kucun")]
public async Task<IActionResult> Kucun([FromQuery] int module, [FromQuery] string like = "")
=> Ok(ApiResult<List<WmsKucunDto>>.Ok(await _svc.GetKucunAsync(module, like ?? "")));
[HttpGet("crk")]
public async Task<IActionResult> Crk([FromQuery] int module, [FromQuery] DateTime start, [FromQuery] DateTime end,
[FromQuery] long? wzmlId = null)
=> Ok(ApiResult<List<WmsCrkDto>>.Ok(await _svc.GetCrkAsync(module, start, end, wzmlId)));
// ==================== 生丝批次 / 包件 ====================
[HttpGet("pici")]
public async Task<IActionResult> PiciList([FromQuery] DateTime? start = null, [FromQuery] DateTime? end = null,
[FromQuery] int kcStatus = 0, [FromQuery] string like = "",
[FromQuery] int pageIndex = 1, [FromQuery] int pageSize = 20)
=> Ok(ApiResult<PageResult<WmsPiciListDto>>.Ok(
await _svc.GetPiciPagedAsync(start, end, kcStatus, like ?? "", pageIndex, pageSize)));
[HttpGet("pici/{id:long}")]
public async Task<IActionResult> PiciGet(long id)
{
try { return Ok(ApiResult<WmsPiciSaveDto>.Ok(await _svc.GetPiciAsync(id))); }
catch (ServiceException ex) { return Fail(ex); }
}
[HttpPost("pici")]
public async Task<IActionResult> PiciSave([FromBody] WmsPiciSaveDto dto)
{
try
{
var id = await _svc.SavePiciAsync(dto);
return Ok(ApiResult<object>.Ok(new { id }, "保存成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
[HttpDelete("pici/{id:long}")]
public async Task<IActionResult> PiciDelete(long id)
{
try
{
await _svc.DeletePiciAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
/// <summary>生丝出库选批次(批次 + 未出库包件)</summary>
[HttpGet("pici/chuku-select")]
public async Task<IActionResult> PiciChukuSelect([FromQuery] long wzmlId = 0, [FromQuery] string excludePiciIds = "")
=> Ok(ApiResult<List<WmsPiciChukuSelectDto>>.Ok(await _svc.GetPiciChukuSelectAsync(wzmlId, excludePiciIds ?? "")));
/// <summary>批次质检</summary>
[HttpGet("pici/qc/{piciId:long}")]
public async Task<IActionResult> PiciQcGet(long piciId)
=> Ok(ApiResult<WmsPiciQcDto>.Ok(await _svc.GetPiciQcAsync(piciId)));
[HttpPost("pici/qc")]
public async Task<IActionResult> PiciQcSave([FromBody] WmsPiciQcDto dto)
{
try
{
await _svc.SavePiciQcAsync(dto);
return Ok(ApiResult<object>.Ok(null, "保存成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
/// <summary>批次纤度检验</summary>
[HttpGet("pici/xdjy/{piciId:long}")]
public async Task<IActionResult> PiciQcXdjyGet(long piciId)
=> Ok(ApiResult<List<WmsPiciQcXdjyDto>>.Ok(await _svc.GetPiciQcXdjyAsync(piciId)));
[HttpPost("pici/xdjy")]
public async Task<IActionResult> PiciQcXdjySave([FromBody] List<WmsPiciQcXdjyDto> items)
{
try
{
await _svc.SavePiciQcXdjyAsync(items ?? new List<WmsPiciQcXdjyDto>());
return Ok(ApiResult<object>.Ok(null, "保存成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
// ==================== 原料采购 ====================
[HttpGet("caigou")]
public async Task<IActionResult> CaigouList([FromQuery] DateTime? start = null, [FromQuery] DateTime? end = null)
=> Ok(ApiResult<List<WmsCaigouDto>>.Ok(await _svc.GetCaigouAsync(start, end)));
[HttpPost("caigou")]
public async Task<IActionResult> CaigouSave([FromBody] WmsCaigouDto dto)
{
try
{
var id = await _svc.SaveCaigouAsync(dto);
return Ok(ApiResult<object>.Ok(new { id }, "保存成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
[HttpDelete("caigou/{id:long}")]
public async Task<IActionResult> CaigouDelete(long id)
{
try
{
await _svc.DeleteCaigouAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
// ==================== 原料翻包计划 ====================
[HttpGet("fbplan")]
public async Task<IActionResult> FbplanList([FromQuery] DateTime? start = null, [FromQuery] DateTime? end = null)
=> Ok(ApiResult<List<WmsFbplanDto>>.Ok(await _svc.GetFbplanAsync(start, end)));
[HttpPost("fbplan")]
public async Task<IActionResult> FbplanSave([FromBody] WmsFbplanDto dto)
{
try
{
var id = await _svc.SaveFbplanAsync(dto);
return Ok(ApiResult<object>.Ok(new { id }, "保存成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
[HttpDelete("fbplan/{id:long}")]
public async Task<IActionResult> FbplanDelete(long id)
{
try
{
await _svc.DeleteFbplanAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
// ==================== 物资采购计划 ====================
[HttpGet("cgplan")]
public async Task<IActionResult> CgplanList([FromQuery] DateTime? start = null, [FromQuery] DateTime? end = null)
=> Ok(ApiResult<List<WmsCgplanListDto>>.Ok(await _svc.GetCgplanAsync(start, end)));
[HttpGet("cgplan/{id:long}")]
public async Task<IActionResult> CgplanGet(long id)
{
try { return Ok(ApiResult<WmsCgplanSaveDto>.Ok(await _svc.GetCgplanAsync(id))); }
catch (ServiceException ex) { return Fail(ex); }
}
[HttpPost("cgplan")]
public async Task<IActionResult> CgplanSave([FromBody] WmsCgplanSaveDto dto)
{
try
{
var id = await _svc.SaveCgplanAsync(dto);
return Ok(ApiResult<object>.Ok(new { id }, "保存成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
[HttpDelete("cgplan/{id:long}")]
public async Task<IActionResult> CgplanDelete(long id)
{
try
{
await _svc.DeleteCgplanAsync(id);
return Ok(ApiResult<object>.Ok(null, "删除成功"));
}
catch (ServiceException ex) { return Fail(ex); }
}
}