From 951ed3f00a5afb94f95fc641813b3706e7b5193c Mon Sep 17 00:00:00 2001 From: wanghu Date: Mon, 7 Sep 2026 09:29:47 +0800 Subject: [PATCH] FromForm --- .../Api/Common/CommonController.cs | 10 +-- .../Api/Common/ReviewprocessController.cs | 10 +-- .../Api/DocPrint/WYSHRoleController.cs | 87 +++++++++++++------ .../Api/DocPrint/WY_listController.cs | 24 ++--- 4 files changed, 82 insertions(+), 49 deletions(-) diff --git a/src/YhCore.WebApi/Controllers/Api/Common/CommonController.cs b/src/YhCore.WebApi/Controllers/Api/Common/CommonController.cs index 7ae60a4..4a1a8fa 100644 --- a/src/YhCore.WebApi/Controllers/Api/Common/CommonController.cs +++ b/src/YhCore.WebApi/Controllers/Api/Common/CommonController.cs @@ -77,7 +77,7 @@ namespace YhCore.WebApi.Controllers.Api.Common /// 添加字典。 [HttpPost("AddDic")] - public async Task AddDic([FromBody] Common_Dictionary model) + public async Task AddDic([FromForm] Common_Dictionary model) { if (model == null) throw new DException("参数错误!"); @@ -94,7 +94,7 @@ namespace YhCore.WebApi.Controllers.Api.Common /// 更新字典。 [HttpPost("UpdateDic")] - public async Task UpdateDic([FromBody] Common_Dictionary model) + public async Task UpdateDic([FromForm] Common_Dictionary model) { if (model == null) throw new DException("参数有误!"); model.Schserid = SchSerID(); @@ -103,7 +103,7 @@ namespace YhCore.WebApi.Controllers.Api.Common /// 编辑字典名称。 [HttpPost("EditDic")] - public async Task EditDic([FromBody] Common_Dictionary model) + public async Task EditDic([FromForm] Common_Dictionary model) { if (model == null) throw new DException("参数有误!"); model.Schserid = SchSerID(); @@ -112,7 +112,7 @@ namespace YhCore.WebApi.Controllers.Api.Common /// 添加发文部门。 [HttpPost("AddDeptDic")] - public async Task AddDeptDic([FromBody] Common_Dictionary model) + public async Task AddDeptDic([FromForm] Common_Dictionary model) { if (model == null) throw new DException("参数有误!"); @@ -129,7 +129,7 @@ namespace YhCore.WebApi.Controllers.Api.Common /// 更新发文部门。 [HttpPost("UpdateDeptDic")] - public async Task UpdateDeptDic([FromBody] Common_Dictionary model) + public async Task UpdateDeptDic([FromForm] Common_Dictionary model) { if (model == null) throw new DException("参数有误!"); model.Schserid = SchSerID(); diff --git a/src/YhCore.WebApi/Controllers/Api/Common/ReviewprocessController.cs b/src/YhCore.WebApi/Controllers/Api/Common/ReviewprocessController.cs index 3c0d5c2..e231747 100644 --- a/src/YhCore.WebApi/Controllers/Api/Common/ReviewprocessController.cs +++ b/src/YhCore.WebApi/Controllers/Api/Common/ReviewprocessController.cs @@ -49,7 +49,7 @@ namespace YhCore.WebApi.Controllers.Api.Common /// 添加审核流程。 [HttpPost("Create")] - public async Task Create([FromBody] Common_flowinfo model) + public async Task Create([FromForm] Common_flowinfo model) { model.schSerID = SchSerID(); await _svc.CreateAsync(model); @@ -57,7 +57,7 @@ namespace YhCore.WebApi.Controllers.Api.Common /// 修改审核流程。 [HttpPost("Edit")] - public async Task Edit([FromBody] Common_flowinfo model) + public async Task Edit([FromForm] Common_flowinfo model) { model.schSerID = SchSerID(); await _svc.EditAsync(model); @@ -65,12 +65,12 @@ namespace YhCore.WebApi.Controllers.Api.Common /// 添加步骤流程。 [HttpPost("StepCreate")] - public Task StepCreate([FromBody] Common_flowstep model) + public Task StepCreate([FromForm] Common_flowstep model) => _svc.StepCreateAsync(model); /// 修改步骤流程。 [HttpPost("StepEdit")] - public Task StepEdit([FromBody] Common_flowstep model) + public Task StepEdit([FromForm] Common_flowstep model) => _svc.StepEditAsync(model); /// 删除审核流程(ids 逗号分隔)。 @@ -80,7 +80,7 @@ namespace YhCore.WebApi.Controllers.Api.Common /// 删除步骤。 [HttpPost("StepDelete")] - public Task StepDelete([FromBody] decimal[] ids) + public Task StepDelete([FromForm] decimal[] ids) => _svc.StepDeleteAsync(ids); /// 流程绑定的步骤列表。 diff --git a/src/YhCore.WebApi/Controllers/Api/DocPrint/WYSHRoleController.cs b/src/YhCore.WebApi/Controllers/Api/DocPrint/WYSHRoleController.cs index f80ebb9..9ea390b 100644 --- a/src/YhCore.WebApi/Controllers/Api/DocPrint/WYSHRoleController.cs +++ b/src/YhCore.WebApi/Controllers/Api/DocPrint/WYSHRoleController.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; using Yh.Platform.Abstractions; using YhCore.Common; using YhCore.Common.UserContext; @@ -17,6 +18,9 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint /// 审核角色 + 流程配置控制器(对应旧 Areas/DocPrint/WYSHRoleController,路由 api/docprint/wyshrole)。 /// 45 action 中本批落地 39 个;Excel 导入导出(ExceltotalListSHRole/WYRDExceldaochu/UpfileExcelSHRole/ /// downMBOfSHRole/downUpfileSHRoleFK)与审批单 PDF(DwonWYSQD)依赖 NPOI/PdfHelper,延后迁移。 + /// POST 动作一律 [FromForm]:前端 api/index.js 固定 x-www-form-urlencoded 提交([FromForm] 会 415); + /// 老契约"表单字段塞 JSON"的动作(WYSHRole/SHTeaTxt/listXxxTxt/data/docdata/docnumdata) + /// 以 [FromForm] string 接收后手动反序列化。 /// [EnableCors("default")] [ApiController] @@ -30,6 +34,14 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint _role = role; } + /// 解析老契约"表单字段塞 JSON"的值;空串安全,非法 JSON 返回 null 由调用方判参。 + private static T ParseFormJson(string txt) where T : class + { + if (string.IsNullOrWhiteSpace(txt)) return null; + try { return JsonConvert.DeserializeObject(txt); } + catch (JsonException) { return null; } + } + #region 审核角色管理 /// 学校是否启用审核角色(旧 getIsSHRole)。 @@ -49,18 +61,20 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint public async Task UpdateSHRoleName([FromQuery] decimal serID, [FromQuery] string sHRoleName) => await _role.UpdateSHRoleNameAsync(SchSerID(), UserId(), serID, sHRoleName); - /// 新增/编辑角色(旧 EditSHRole,form: WYSHRole=JSON → [FromBody])。 + /// 新增/编辑角色(旧 EditSHRole,form: WYSHRole=JSON 字符串)。 [HttpPost("EditSHRole")] - public async Task EditSHRole([FromBody] WYSHRoleExt model) + public async Task EditSHRole([FromForm] string WYSHRole) { + var model = ParseFormJson(WYSHRole); if (model == null) throw new DException("参数错误!"); return await _role.EditSHRoleAsync(SchSerID(), UserId(), model); } - /// 编辑成员行(旧 editSHTeaRow,form: SHTeaTxt → [FromBody])。 + /// 编辑成员行(旧 editSHTeaRow,form: SHTeaTxt=JSON 字符串)。 [HttpPost("editSHTeaRow")] - public async Task EditSHTeaRow([FromBody] WY_SHRole_SHTea model) + public async Task EditSHTeaRow([FromForm] string SHTeaTxt) { + var model = ParseFormJson(SHTeaTxt); if (model == null) throw new DException("参数错误!"); return await _role.EditSHTeaRowAsync(SchSerID(), UserId(), model); } @@ -70,28 +84,34 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint public async Task DelSHTeaRow([FromQuery] decimal serID) => await _role.DelSHTeaRowAsync(SchSerID(), serID); - /// 批量保存审核人(旧 editSHTea,form: SHRoleID + listSHTeaTxt → [FromBody])。 + /// 批量保存审核人(旧 editSHTea,form: SHRoleID + listSHTeaTxt=JSON 数组字符串)。 [HttpPost("editSHTea")] - public async Task EditSHTea([FromBody] EditSHTeaDto model) + public async Task EditSHTea([FromForm] decimal SHRoleID, [FromForm] string listSHTeaTxt) { - if (model == null) throw new DException("参数错误!"); - return await _role.EditSHTeaAsync(SchSerID(), UserId(), model.SHRoleID, model.listSHTea); + var list = ParseFormJson>(listSHTeaTxt) ?? new List(); + return await _role.EditSHTeaAsync(SchSerID(), UserId(), SHRoleID, list); } - /// 批量保存被审核人(旧 editBSHTea,form: SHRoleID + listBSHTeaTxt → [FromBody])。 + /// 批量保存被审核人(旧 editBSHTea,form: SHRoleID + listBSHTeaTxt=JSON 数组字符串)。 [HttpPost("editBSHTea")] - public async Task EditBSHTea([FromBody] EditBSHTeaDto model) + public async Task EditBSHTea([FromForm] decimal SHRoleID, [FromForm] string listBSHTeaTxt) { - if (model == null) throw new DException("参数错误!"); - return await _role.EditBSHTeaAsync(SchSerID(), UserId(), model.SHRoleID, model.listBSHTea); + var list = ParseFormJson>(listBSHTeaTxt) ?? new List(); + return await _role.EditBSHTeaAsync(SchSerID(), UserId(), SHRoleID, list); } - /// 删除角色(旧 delSHRole,form: listSHRoleIDTxt → [FromBody])。 + /// 删除角色(旧 delSHRole,form: listSHRoleIDTxt=JSON 数组字符串,兼容逗号分隔)。 [HttpPost("delSHRole")] - public async Task DelSHRole([FromBody] DelSHRoleDto model) + public async Task DelSHRole([FromForm] string listSHRoleIDTxt) { - if (model == null) throw new DException("参数错误!"); - return await _role.DelSHRoleAsync(SchSerID(), model.listSHRoleID); + var list = ParseFormJson>(listSHRoleIDTxt); + if (list == null) + { + list = (listSHRoleIDTxt ?? "").Split(',') + .Where(a => !string.IsNullOrWhiteSpace(a) && decimal.TryParse(a.Trim(), out _)) + .Select(a => (decimal?)decimal.Parse(a.Trim())).ToList(); + } + return await _role.DelSHRoleAsync(SchSerID(), list); } #endregion @@ -110,7 +130,7 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint /// 新增/编辑流程(旧 EditFlow;schSerID 取当前用户)。 [HttpPost("EditFlow")] - public async Task EditFlow([FromBody] Common_flowinfo model) + public async Task EditFlow([FromForm] Common_flowinfo model) { if (model == null) throw new DException("参数错误!"); model.schSerID = SchSerID(); @@ -119,7 +139,7 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint /// 新增步骤(旧 StepCreateOfSHRole)。 [HttpPost("StepCreateOfSHRole")] - public async Task StepCreateOfSHRole([FromBody] Common_flowstep model) + public async Task StepCreateOfSHRole([FromForm] Common_flowstep model) { if (model == null) throw new DException("参数错误!"); return await _role.StepCreateOfSHRoleAsync(model); @@ -180,11 +200,22 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint public async Task> GetDicInfo([FromQuery] string typeID) => await _role.GetDicInfoAsync(SchSerID(), typeID); - /// 编辑文印(审核角色视角;旧 editDocPrint,form 三段 JSON → [FromBody])。 + /// 编辑文印(审核角色视角;旧 editDocPrint,form: isedit + data/docdata/docnumdata 三段 JSON 字符串)。 [HttpPost("editDocPrint")] - public async Task EditDocPrint([FromBody] WYSHRoleEditDocPrintDto model) + public async Task EditDocPrint( + [FromForm] int isedit, + [FromForm] string data, + [FromForm] string docdata, + [FromForm] string docnumdata) { - if (model == null) throw new DException("参数错误!"); + var model = new WYSHRoleEditDocPrintDto + { + isedit = isedit, + data = ParseFormJson(data), + docdata = ParseFormJson(docdata), + docnumdata = ParseFormJson>(docnumdata) ?? new List() + }; + if (model.data == null || model.docdata == null) throw new DException("参数错误!"); return await _role.EditDocPrintAsync(SchSerID(), UserId(), model); } @@ -259,7 +290,7 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint /// 审核确认(旧 shenheokSHRole)。 [HttpPost("shenheokSHRole")] - public async Task ShenheOkSHRole([FromBody] FlowTranctDto model) + public async Task ShenheOkSHRole([FromForm] FlowTranctDto model) { if (model == null) throw new DException("参数错误!"); model.actionuserid = UserContextHolder.Current?.Id ?? 0; @@ -273,9 +304,9 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint #region 签名 / 退回 / 金额重提 - /// 保存签名(旧 SaveSignature,form: pic → [FromBody])。 + /// 保存签名(旧 SaveSignature,form: pic → [FromForm])。 [HttpPost("SaveSignature")] - public async Task SaveSignature([FromBody] SaveSignatureDto model) + public async Task SaveSignature([FromForm] SaveSignatureDto model) { if (model == null) throw new DException("参数错误!"); return await _role.SaveSignatureAsync(SchSerID(), UserId(), model.pic); @@ -289,9 +320,9 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint [HttpGet("DelSignature")] public async Task DelSignature() => await _role.DelSignatureAsync(SchSerID(), UserId()); - /// 退回(旧 TuiHui,form: DocID + cont → [FromBody])。 + /// 退回(旧 TuiHui,form: DocID + cont → [FromForm])。 [HttpPost("TuiHui")] - public async Task TuiHui([FromBody] TuiHuiDto model) + public async Task TuiHui([FromForm] TuiHuiDto model) { if (model == null) throw new DException("参数错误!"); return await _role.TuiHuiAsync(UserId(), model.cont, model.DocID); @@ -302,9 +333,9 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint public async Task UnTuiHui([FromQuery] decimal docID) => await _role.UnTuiHuiAsync(UserId(), docID); - /// 金额重提(旧 regetJE,form: DocID 逗号分隔 + type → [FromBody])。 + /// 金额重提(旧 regetJE,form: DocID 逗号分隔 + type → [FromForm])。 [HttpPost("regetJE")] - public async Task RegetJE([FromBody] RegetJEDto model) + public async Task RegetJE([FromForm] RegetJEDto model) { if (model == null) throw new DException("参数错误!"); var ids = (model.DocID ?? "").Split(',') diff --git a/src/YhCore.WebApi/Controllers/Api/DocPrint/WY_listController.cs b/src/YhCore.WebApi/Controllers/Api/DocPrint/WY_listController.cs index 32a9747..5b74bc6 100644 --- a/src/YhCore.WebApi/Controllers/Api/DocPrint/WY_listController.cs +++ b/src/YhCore.WebApi/Controllers/Api/DocPrint/WY_listController.cs @@ -37,7 +37,7 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint /// 添加文印分类。 [HttpPost("AddDic")] - public async Task AddDic([FromBody] Common_Dictionary model) + public async Task AddDic([FromForm] Common_Dictionary model) { if (model == null) throw new DException("参数错误!"); model.Schserid = SchSerID(); @@ -51,7 +51,7 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint /// 添加印制版面。 [HttpPost("AddYZBM")] - public async Task AddYZBM([FromBody] Common_Dictionary model) + public async Task AddYZBM([FromForm] Common_Dictionary model) { if (model == null) throw new DException("参数错误!"); model.Schserid = SchSerID(); @@ -80,18 +80,20 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint [FromQuery] bool showAll = false) => await _classify.DictionaryTypeListAsync(SchSerID(), name, showAll, typeID); - /// 添加公共类别(复用字典添加逻辑)。 + /// 添加公共类别(复用字典添加逻辑)。前端 api/index.js 固定以 x-www-form-urlencoded 提交 + /// (TypeId/Name/typeName 表单字段,大小写不敏感绑定到 typeID/Name/typeName),故用 [FromForm]—— + /// [FromForm] 会因 Content-Type 不符返回 415。 [HttpPost("AddDictionaryType")] - public async Task AddDictionaryType([FromBody] Common_Dictionary model) + public async Task AddDictionaryType([FromForm] Common_Dictionary model) { if (model == null) throw new DException("参数错误!"); model.Schserid = SchSerID(); await _dict.AddDicAsync(model); } - /// 编辑公共类别(旧调 GetSysDict.EditDic)。 + /// 编辑公共类别(旧调 GetSysDict.EditDic)。同 AddDictionaryType:前端表单编码提交,[FromForm] 绑定。 [HttpPost("EditDictionaryType")] - public async Task EditDictionaryType([FromBody] Common_Dictionary model) + public async Task EditDictionaryType([FromForm] Common_Dictionary model) { if (model == null) throw new DException("参数有误!"); model.Schserid = SchSerID(); @@ -169,7 +171,7 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint /// 添加文印(旧 Create;短信/待办推送已降级为纯落库)。 [HttpPost("Create")] - public async Task Create([FromBody] WYDocPrintSaveDto model) + public async Task Create([FromForm] WYDocPrintSaveDto model) { if (model == null) throw new DException("参数错误!"); model.UserID = UserId(); @@ -179,7 +181,7 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint /// 修改文印(旧 Edit)。 [HttpPost("Edit")] - public async Task Edit([FromBody] WYDocPrintSaveDto model) + public async Task Edit([FromForm] WYDocPrintSaveDto model) { if (model == null) throw new DException("参数错误!"); model.UserID = UserId(); @@ -189,7 +191,7 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint /// 撤销(旧 Revoke)。 [HttpPost("Revoke")] - public async Task Revoke([FromBody] FlowTranctDto model) + public async Task Revoke([FromForm] FlowTranctDto model) { if (model == null) throw new DException("参数错误!"); model.actionuserid = UserContextHolder.Current?.Id; @@ -259,7 +261,7 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint /// 审核确认(旧 shenheok)。 [HttpPost("shenheok")] - public async Task ShenheOk([FromBody] FlowTranctDto model) + public async Task ShenheOk([FromForm] FlowTranctDto model) { if (model == null) throw new DException("参数错误!"); model.actionuserid = UserContextHolder.Current?.Id ?? 0; @@ -268,7 +270,7 @@ namespace YhCore.WebApi.Controllers.Api.DocPrint /// 领取确认(旧 AffirmApplyforOk)。 [HttpPost("AffirmApplyforOk")] - public async Task AffirmApplyforOk([FromBody] FlowTranctDto model) + public async Task AffirmApplyforOk([FromForm] FlowTranctDto model) { if (model == null) throw new DException("参数错误!"); model.actionuserid = UserContextHolder.Current?.Id ?? 0;