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