- 新增 PayRoll(工资)、Wms(仓储)、Prod(车速/缫丝/考勤/丝片检测/丝片台账/纤检日报/质量日报) 模块 - 新增对应 Domain 实体、Application DTO/Service、Api Controller 与前端页面 - 移除旧 Attendance 考勤模块(Controller/Service/Entity/DTO 及 5 个前端页面),由 Prod/Kaoqin 取代 - 调整路由、仪表盘、Lsjl 流丝记录实体与服务 - 更新业务种子数据与 DbSeeder - 补充工作进度文档 14-27
329 lines
12 KiB
C#
329 lines
12 KiB
C#
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); }
|
|
}
|
|
}
|