From fd3dd8dfbe21e0cd97f8d0b7d84265b12d69682f Mon Sep 17 00:00:00 2001 From: XuJiacheng Date: Thu, 8 Jan 2026 18:03:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=B6=E5=9B=BE=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=9A=E4=B8=8B=E8=BD=BDPDF=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/PanelSelectionController.cs | 195 +++++++++++++++++- 1 file changed, 191 insertions(+), 4 deletions(-) diff --git a/BLW_Log/Controllers/PanelSelectionController.cs b/BLW_Log/Controllers/PanelSelectionController.cs index ec4be97..0d30031 100644 --- a/BLW_Log/Controllers/PanelSelectionController.cs +++ b/BLW_Log/Controllers/PanelSelectionController.cs @@ -806,6 +806,174 @@ namespace BLW_Log.Controllers }; } } + + /// + /// 复制面板组:根据原始面板组 GUID 查询记录,创建一条新面板组记录,并将新面板组挂载到目标房型 + /// 关联方式:tbl_web_room_type.panel_group_count(JSON数组字符串) + /// + [HttpPost] + public ReturnInfo CopyPanelListWithNewFields([FromBody] CopyPanelListRequest request) + { + try + { + if (request == null) + { + return new ReturnInfo { isok = false, message = "请求参数不能为空", status = 400, response = null }; + } + + if (string.IsNullOrWhiteSpace(request.OriginalGuid)) + { + return new ReturnInfo { isok = false, message = "原始GUID不能为空", status = 400, response = null }; + } + + if (string.IsNullOrWhiteSpace(request.TargetRoomGuid)) + { + return new ReturnInfo { isok = false, message = "目标房型GUID不能为空", status = 400, response = null }; + } + + // 使用事务保证:插入面板组 + 更新目标房型的 panel_group_count 原子性 + using var conn = new MySqlConnection(ReadConfig.Instance.MySQLConnectionString); + conn.Open(); + using var tx = conn.BeginTransaction(); + + // 1) 查询原始面板组记录 + DataTable panelTable = new(); + using (var queryPanelCmd = new MySqlCommand( + "SELECT * FROM `cdr_library`.`tbl_web_panel_list` WHERE guid = @guid AND is_valid = 1", + conn, + tx)) + { + queryPanelCmd.Parameters.AddWithValue("@guid", request.OriginalGuid); + using var adapter = new MySqlDataAdapter(queryPanelCmd); + adapter.Fill(panelTable); + } + + if (panelTable.Rows.Count == 0) + { + tx.Rollback(); + return new ReturnInfo { isok = false, message = "未找到有效的原始面板组", status = 404, response = null }; + } + + // 2) 锁定读取目标房型的 panel_group_count + string roomPanelGroupCountRaw = null; + using (var queryRoomCmd = new MySqlCommand( + "SELECT panel_group_count FROM `cdr_library`.`tbl_web_room_type` WHERE guid = @guid AND is_valid = 1 FOR UPDATE", + conn, + tx)) + { + queryRoomCmd.Parameters.AddWithValue("@guid", request.TargetRoomGuid); + var scalar = queryRoomCmd.ExecuteScalar(); + if (scalar == null || scalar == DBNull.Value) + { + roomPanelGroupCountRaw = null; + } + else + { + roomPanelGroupCountRaw = scalar.ToString(); + } + } + + // 如果目标房型不存在 + // 注意:ExecuteScalar 在无行时返回 null + using (var existsCmd = new MySqlCommand( + "SELECT COUNT(1) FROM `cdr_library`.`tbl_web_room_type` WHERE guid = @guid AND is_valid = 1", + conn, + tx)) + { + existsCmd.Parameters.AddWithValue("@guid", request.TargetRoomGuid); + var cnt = Convert.ToInt32(existsCmd.ExecuteScalar() ?? 0); + if (cnt <= 0) + { + tx.Rollback(); + return new ReturnInfo { isok = false, message = "未找到有效的目标房型", status = 404, response = null }; + } + } + + var originalRow = panelTable.Rows[0]; + var newGuid = Guid.NewGuid().ToString("N"); + var currentTime = DateTime.Now; + + // 3) 插入新面板组记录 + using (var insertCmd = new MySqlCommand(@" + INSERT INTO `cdr_library`.`tbl_web_panel_list` + (panel_list_name, gang_series, model_type, gang_material_id, panel_count, + carving_quantity, position, carving_filename, design_status, panel_info_json, logo_json, cdr_filename, thumbnail_large, + thumbnail_small, erp_part_number, remarks, created_at, is_valid, guid) + VALUES (@panel_list_name, @gang_series, @model_type, @gang_material_id, @panel_count, + @carving_quantity, @position, @carving_filename, @design_status, @panel_info_json, @logo_json, @cdr_filename, @thumbnail_large, + @thumbnail_small, @erp_part_number, @remarks, @created_at, 1, @guid)", conn, tx)) + { + insertCmd.Parameters.AddWithValue("@panel_list_name", originalRow["panel_list_name"] ?? (object)DBNull.Value); + insertCmd.Parameters.AddWithValue("@gang_series", originalRow["gang_series"] ?? (object)DBNull.Value); + insertCmd.Parameters.AddWithValue("@model_type", originalRow["model_type"] ?? (object)DBNull.Value); + insertCmd.Parameters.AddWithValue("@gang_material_id", originalRow["gang_material_id"] ?? (object)DBNull.Value); + insertCmd.Parameters.AddWithValue("@panel_count", originalRow["panel_count"] ?? (object)DBNull.Value); + insertCmd.Parameters.AddWithValue("@carving_quantity", originalRow["carving_quantity"] ?? (object)DBNull.Value); + insertCmd.Parameters.AddWithValue("@position", originalRow["position"] ?? (object)DBNull.Value); + insertCmd.Parameters.AddWithValue("@carving_filename", originalRow["carving_filename"] ?? (object)DBNull.Value); + insertCmd.Parameters.AddWithValue("@design_status", originalRow["design_status"] ?? (object)DBNull.Value); + insertCmd.Parameters.AddWithValue("@panel_info_json", originalRow["panel_info_json"] ?? (object)DBNull.Value); + insertCmd.Parameters.AddWithValue("@logo_json", originalRow["logo_json"] ?? (object)DBNull.Value); + insertCmd.Parameters.AddWithValue("@cdr_filename", originalRow["cdr_filename"] ?? (object)DBNull.Value); + insertCmd.Parameters.AddWithValue("@thumbnail_large", originalRow["thumbnail_large"] ?? (object)DBNull.Value); + insertCmd.Parameters.AddWithValue("@thumbnail_small", originalRow["thumbnail_small"] ?? (object)DBNull.Value); + insertCmd.Parameters.AddWithValue("@erp_part_number", originalRow["erp_part_number"] ?? (object)DBNull.Value); + insertCmd.Parameters.AddWithValue("@remarks", originalRow["remarks"] ?? (object)DBNull.Value); + insertCmd.Parameters.AddWithValue("@created_at", currentTime); + insertCmd.Parameters.AddWithValue("@guid", newGuid); + + var affected = insertCmd.ExecuteNonQuery(); + if (affected <= 0) + { + tx.Rollback(); + return new ReturnInfo { isok = false, message = "新增面板组记录失败(未影响任何数据)", status = 500, response = null }; + } + } + + // 4) 更新目标房型的 panel_group_count + List panelGroups; + try + { + panelGroups = JsonConvert.DeserializeObject>(string.IsNullOrWhiteSpace(roomPanelGroupCountRaw) ? "[]" : roomPanelGroupCountRaw) + ?? new List(); + } + catch + { + panelGroups = new List(); + } + + if (!panelGroups.Contains(newGuid)) panelGroups.Add(newGuid); + var newPanelGroupCountJson = JsonConvert.SerializeObject(panelGroups); + + using (var updateRoomCmd = new MySqlCommand( + "UPDATE `cdr_library`.`tbl_web_room_type` SET panel_group_count=@panel_group_count WHERE guid=@guid", + conn, + tx)) + { + updateRoomCmd.Parameters.AddWithValue("@panel_group_count", newPanelGroupCountJson); + updateRoomCmd.Parameters.AddWithValue("@guid", request.TargetRoomGuid); + var affected = updateRoomCmd.ExecuteNonQuery(); + if (affected <= 0) + { + tx.Rollback(); + return new ReturnInfo { isok = false, message = "更新目标房型面板组列表失败(未影响任何数据)", status = 500, response = null }; + } + } + + tx.Commit(); + return new ReturnInfo { isok = true, message = "复制成功", status = 200, response = newGuid }; + } + catch (Exception ex) + { + return new ReturnInfo + { + isok = false, + message = $"复制面板组失败: {ex.Message}", + status = 500, + response = null + }; + } + } #endregion #region tbl_web_project 增删改查 @@ -1034,7 +1202,7 @@ namespace BLW_Log.Controllers { project = projectToken, panels = panelsToken, - RecordDate = DateTime.Now.ToString("yyyy—MM-dd"), + RecordDate = DateTime.Now.ToString("yyyy-MM-dd"), picNum }; @@ -1308,11 +1476,14 @@ namespace BLW_Log.Controllers (room_name, room_description, panel_group_count, remarks, creator, created_at, is_valid, guid) VALUES (@room_name, @room_description, @panel_group_count, @remarks, @creator, @created_at, 1, @guid)"; + // 兜底:panel_group_count 为空时用 [],避免前端 JSON.parse 报错 + var panelGroupCount = string.IsNullOrWhiteSpace(room.panel_group_count) ? "[]" : room.panel_group_count; + var parameters = new[] { new MySqlParameter("@room_name", room.room_name), new MySqlParameter("@room_description", room.room_description ?? (object)DBNull.Value), - new MySqlParameter("@panel_group_count", room.panel_group_count ?? (object)DBNull.Value), + new MySqlParameter("@panel_group_count", panelGroupCount), new MySqlParameter("@remarks", room.remarks ?? (object)DBNull.Value), new MySqlParameter("@creator", room.creator), new MySqlParameter("@created_at", room.created_at ?? DateTime.Now), @@ -1328,7 +1499,7 @@ namespace BLW_Log.Controllers string sql = @" UPDATE `cdr_library`.`tbl_web_room_type` SET room_name=@room_name, room_description=@room_description, panel_group_count=@panel_group_count, - remarks=@remarks, creator=@creator + remarks=@remarks, creator=IFNULL(@creator, creator) WHERE guid=@guid"; var parameters = new[] @@ -1337,7 +1508,7 @@ namespace BLW_Log.Controllers new MySqlParameter("@room_description", room.room_description ?? (object)DBNull.Value), new MySqlParameter("@panel_group_count", room.panel_group_count ?? (object)DBNull.Value), new MySqlParameter("@remarks", room.remarks ?? (object)DBNull.Value), - new MySqlParameter("@creator", room.creator), + new MySqlParameter("@creator", room.creator ?? (object)DBNull.Value), new MySqlParameter("@guid", room.guid ?? (object)DBNull.Value) }; @@ -1875,4 +2046,20 @@ public class CopyPanelUnitRequest /// public string NewProjectGuid { get; set; } } + +/// +/// 复制面板组请求参数 +/// +public class CopyPanelListRequest +{ + /// + /// 原始面板组的GUID + /// + public string OriginalGuid { get; set; } + + /// + /// 目标房型的GUID(同酒店/同项目下的另一房型) + /// + public string TargetRoomGuid { get; set; } +} #endregion \ No newline at end of file