fg_yida_2/YiDa_WinForm/Service/ButtonOperationService.cs
2026-02-05 14:45:33 +08:00

399 lines
18 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Data;
using System.Threading.Tasks;
using MQTT_WinformV1;
using MySql.Data.MySqlClient;
using Newtonsoft.Json;
using NPOI.SS.UserModel;
using YiDa_WinForm.Config;
using YiDa_WinForm.Model;
namespace YiDa_WinForm.Service
{
public class ButtonOperationService
{
public string _formulaValue = null; // 配方字段
// 通知UI层
public event Action<string> MessageReceived;
/// <summary>
/// 保存配方表格数据到数据库中
/// </summary>
/// <param name="dtExcel"></param>
public async Task SaveFormulaByExcel(DataTable dtExcel)
{
try
{
// 1. 定义列名映射(保持原有逻辑)
Dictionary<string, string> columnMap = new Dictionary<string, string>()
{
{ "供应商代码", "供应商代码" },
{ "供应商名称", "供应商名称" },
{ "车型", "车型" },
{ "零件号", "零件号" },
{ "零件名", "零件名" },
{ "参数名", "参数名" },
{ "下公差", "下公差" },
{ "上公差", "上公差" },
{ "整改图片", "整改图片" },
{ "零件负责人", "零件负责人" },
{ "外保负责人", "外保负责人" }
};
// 2. 准备批量插入的参数列表
List<MySqlParameter[]> parametersList = new List<MySqlParameter[]>();
string sqlInsert = @"INSERT INTO yida_formula (supplier_code, supplier_name, vehicle_model, part_number,
part_name, parameter_name, tolerance_lower, tolerance_upper, reformation_picture, leader_part, leader_out_protection)
VALUES (@supplier_code, @supplier_name, @vehicle_model, @part_number, @part_name, @parameter_name, @tolerance_lower,
@tolerance_upper, @reformation_picture, @leader_part, @leader_out_protection)";
// 3. 遍历Excel数据批量构建参数无循环插入仅构建参数
foreach (DataRow dr in dtExcel.Rows)
{
try
{
string paramName = GetExcelCellValue(dr, columnMap["参数名"]).ToString();
if (paramName == "报废图片") _formulaValue = "报废图片";
if (paramName == "连杆测试") _formulaValue = "连杆测试";
// 构建单行参数
MySqlParameter[] parameters = new MySqlParameter[]
{
new MySqlParameter("@supplier_code", GetExcelCellValue(dr, columnMap["供应商代码"])),
new MySqlParameter("@supplier_name", GetExcelCellValue(dr, columnMap["供应商名称"])),
new MySqlParameter("@vehicle_model", GetExcelCellValue(dr, columnMap["车型"])),
new MySqlParameter("@part_number", GetExcelCellValue(dr, columnMap["零件号"])),
new MySqlParameter("@part_name", GetExcelCellValue(dr, columnMap["零件名"])),
new MySqlParameter("@parameter_name", paramName),
new MySqlParameter("@tolerance_lower", GetExcelCellValue(dr, columnMap["下公差"])),
new MySqlParameter("@tolerance_upper", GetExcelCellValue(dr, columnMap["上公差"])),
new MySqlParameter("@reformation_picture", GetExcelCellValue(dr, columnMap["整改图片"])),
new MySqlParameter("@leader_part", GetExcelCellValue(dr, columnMap["零件负责人"])),
new MySqlParameter("@leader_out_protection", GetExcelCellValue(dr, columnMap["外保负责人"]))
};
parametersList.Add(parameters);
}
catch (Exception rowEx)
{
MessageReceived?.Invoke($"警告:当前行数据构建失败,跳过该行。错误:{rowEx.Message}");
continue;
}
}
// 4. 先删除原有配方(单次执行)
string sqlDel = @"DELETE FROM yida_formula;";
await DbHelper.ExecuteNonQueryAsync(sqlDel);
// 5. 批量插入新配方(核心优化:单次连接+事务,批量执行)
if (parametersList.Count > 0)
{
int insertCount = await DbHelper.ExecuteBatchInsertAsync(sqlInsert, parametersList);
MessageReceived?.Invoke($"配方数据导入数据库成功,共插入 {insertCount} 条有效数据");
}
else
{
MessageReceived?.Invoke("无有效配方数据可插入");
}
}
catch (Exception ex)
{
MessageReceived?.Invoke($"保存配方表格到数据库时出错:{ex.Message} {ex.InnerException?.Message}");
}
}
/// <summary>
/// 获取数据库配方
/// </summary>
/// <returns></returns>
public async Task<DataTable> QueryFormulaAsync()
{
try
{
string strSql = @"SELECT * FROM yida_formula";
// 调用公共查询方法返回DataTable
return await DbHelper.ExecuteQueryAsync(strSql);
}
catch (Exception ex)
{
MessageReceived?.Invoke($"查询配方数据失败:{ex.Message} {ex.InnerException?.Message}");
return new DataTable(); // 返回空DataTable避免UI层空引用
}
}
/// <summary>
/// 获取MQTT参数字典
/// </summary>
/// <returns></returns>
public async Task<DataTable> InitMqttDic()
{
try
{
string strSql = @"SELECT * from yida_upload_param";
// 调用公共查询方法
return await DbHelper.ExecuteQueryAsync(strSql);
}
catch (Exception ex)
{
MessageReceived?.Invoke($"查询MQTT参数字典失败{ex.Message} {ex.InnerException?.Message}");
return new DataTable();
}
}
/// <summary>
/// 获取MQTT数据
/// </summary>
/// <returns></returns>
public async Task<DataTable> GetLatestMqttDataAsync(string selection, string device)
{
try
{
string strSql = null;
if (selection != null && device == null)
{
if (selection.Contains("1"))
{
strSql = @"SELECT * FROM yida_mqtt_message where device_code='device1' and pv_status = 1 ORDER BY create_time DESC LIMIT 1";
}
else if (selection.Contains("2"))
{
strSql = @"SELECT * FROM yida_mqtt_message where device_code='device2' and pv_status = 1 ORDER BY create_time DESC LIMIT 1";
}
else
{
strSql=
@"SELECT * FROM yida_mqtt_message where (device_code = 'device1' or device_code = 'device2') and pv_status = 1 ORDER BY create_time DESC LIMIT 1";
}
}
else
{
if (device.Equals("device1"))
{
if (selection.Equals("1"))
{
strSql = @"SELECT * FROM yida_mqtt_message where device_code = 'device1' and pv_status = 1 and img_status1 = 1 ORDER BY create_time DESC LIMIT 1";
}
else
{
strSql = @"SELECT * FROM yida_mqtt_message where device_code = 'device1' and pv_status = 1 and img_status2 = 1 ORDER BY create_time DESC LIMIT 1";
}
}
else if (device.Equals("device2"))
{
if (selection.Equals("1"))
{
strSql = @"SELECT * FROM yida_mqtt_message where device_code = 'device2' and pv_status = 1 and img_status3 = 1 ORDER BY create_time DESC LIMIT 1";
}
else
{
strSql = @"SELECT * FROM yida_mqtt_message where device_code = 'device2' and pv_status = 1 and img_status4 = 1 ORDER BY create_time DESC LIMIT 1";
}
}
else
{
strSql= @"SELECT * FROM yida_mqtt_message where (device_code = 'device1' or device_code = 'device2') and pv_status = 1 and (img_status1 = 1 or img_status2 = 1 or img_status3 = 1 or img_status4 = 1) ORDER BY create_time DESC LIMIT 1";
}
}
// 调用公共查询方法
return await DbHelper.ExecuteQueryAsync(strSql);
}
catch (Exception ex)
{
MessageReceived?.Invoke($"查询最新MQTT数据失败{ex.Message} {ex.InnerException?.Message}");
return new DataTable();
}
}
/// <summary>
/// 保存上传至宜搭平台成功的数据到数据库中
/// </summary>
/// <param name="mqttLists"></param>
public async Task CreateSuccessLog(List<MqttModel> mqttLists)
{
try
{
DateTime time = DateTime.Now;
string sqlInsert =
@"INSERT INTO yida_success_log (supplier_code, supplier_name, vehicle_model,part_number,part_name,parameter_name,parameter_value,configuration,leader_part,time_upload_database)
VALUES (@supplier_code, @supplier_name, @vehicle_model,@part_number,@part_name,@parameter_name,@parameter_value,@configuration,@leader_part,@time_upload_database)";
foreach (MqttModel mqttItem in mqttLists)
{
// 调用批量执行方法,传入参数赋值逻辑
await DbHelper.ExecuteBatchNonQueryAsync(sqlInsert, cmd =>
{
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@supplier_code", mqttItem.SupplierCode);
cmd.Parameters.AddWithValue("@supplier_name", mqttItem.SupplierName);
cmd.Parameters.AddWithValue("@vehicle_model", mqttItem.VehicleModel);
cmd.Parameters.AddWithValue("@part_number", mqttItem.PartNumber);
cmd.Parameters.AddWithValue("@part_name", mqttItem.PartName);
cmd.Parameters.AddWithValue("@parameter_name", mqttItem.ParameterName);
cmd.Parameters.AddWithValue("@parameter_value", mqttItem.ParameterValue);
cmd.Parameters.AddWithValue("@configuration", mqttItem.Configuration);
cmd.Parameters.AddWithValue("@leader_part", mqttItem.LeaderPart);
cmd.Parameters.AddWithValue("@time_upload_database", time);
});
}
}
catch (Exception ex)
{
MessageReceived?.Invoke($"宜搭日志写入数据库失败:{ex.Message} {ex.InnerException?.Message}");
}
}
/// <summary>
/// 合并数据到Mysql数据
/// </summary>
public async Task MergeAndSaveData(string operationStatus, string deviceCode)
{
try
{
string getLatestSql;
if (deviceCode.Equals("device1"))
{
getLatestSql = @"SELECT id, receive_data FROM yida_mqtt_message
WHERE device_code = 'device1' and pv_status = 1
ORDER BY id DESC LIMIT 1";
}
else
{
getLatestSql = @"SELECT id, receive_data FROM yida_mqtt_message
WHERE device_code = 'device2' and pv_status = 1
ORDER BY id DESC LIMIT 1";
}
// 读取最新注塑机数据的receive_data
DataTable dtLatest = await DbHelper.ExecuteQueryAsync(getLatestSql);
// 无注塑机数据时直接返回
if (dtLatest.Rows.Count == 0)
{
LogHelper.AppendLog("数据库中无注塑机数据,无法合并");
return;
}
// 提取查询结果中的主键ID和JSON数据
long latestId = Convert.ToInt64(dtLatest.Rows[0]["id"]);
string latestReceiveData = dtLatest.Rows[0]["receive_data"] == DBNull.Value
? null
: dtLatest.Rows[0]["receive_data"].ToString();
if (string.IsNullOrEmpty(latestReceiveData))
{
LogHelper.AppendLog("数据库中注塑机数据无有效receive_data");
return;
}
// 3. 反序列化注塑机JSON数据
var dataModel = JsonConvert.DeserializeObject<SQLDataModel>(latestReceiveData);
if (dataModel == null || dataModel.@params == null)
{
dataModel = new SQLDataModel
{
time = DateTime.Now.Millisecond,
@params = new SQLParamModel()
};
}
if (operationStatus == "1")
{
dataModel.@params.BU = "报废图片已上传";
}
else
{
dataModel.@params.CR = "连杆强度测试图片已上传";
}
// 5. 重新序列化为JSON
string mergedData = JsonConvert.SerializeObject(dataModel);
// 6. 更新数据库调用DbHelper执行更新
string updateSql = null;
if (deviceCode.Equals("device1"))
{
if (operationStatus == "1")
{
updateSql = @"UPDATE yida_mqtt_message
SET receive_data = @mergedData, img_status1 = 1
WHERE id = @latestId and pv_status = 1 and device_code = 'device1'";
}
else
{
updateSql = @"UPDATE yida_mqtt_message
SET receive_data = @mergedData, img_status2 = 1
WHERE id = @latestId and pv_status = 1 and device_code = 'device1'";
}
}
if (deviceCode.Equals("device2"))
{
if (operationStatus == "2")
{
updateSql = @"UPDATE yida_mqtt_message
SET receive_data = @mergedData, img_status3 = 1
WHERE id = @latestId and pv_status = 1 and device_code = 'device2'";
}
else
{
updateSql = @"UPDATE yida_mqtt_message
SET receive_data = @mergedData, img_status4 = 1
WHERE id = @latestId and pv_status = 1 and device_code = 'device2'";
}
}
var updateParameters = new[]
{
new MySql.Data.MySqlClient.MySqlParameter("@mergedData", mergedData),
new MySql.Data.MySqlClient.MySqlParameter("@latestId", latestId)
};
// 调用DbHelper执行更新并获取受影响行数
int affectedRows = await DbHelper.ExecuteNonQueryAsync(updateSql, updateParameters);
if (affectedRows > 0)
{
LogHelper.AppendLog($"成功合并字段更新ID={latestId}");
}
else
{
LogHelper.AppendLog("更新失败:未找到匹配的注塑机数据");
}
}
catch (Exception ex)
{
LogHelper.AppendLog($"合并并入库失败:{ex.Message} {ex.InnerException?.Message}");
}
}
/// <summary>
/// 双参数版本安全获取Excel解析后的DataRow单元格值适配你的调用场景
/// </summary>
/// <param name="dr">Excel解析后的DataRow</param>
/// <param name="columnName">列名(如"参数名"、"供应商代码"</param>
/// <returns>处理后的字符串值,避免空引用和格式问题</returns>
private static string GetExcelCellValue(DataRow dr, string columnName)
{
// 1. 校验两个参数,避免空引用
if (dr == null)
{
return string.Empty;
}
if (string.IsNullOrEmpty(columnName) || !dr.Table.Columns.Contains(columnName))
{
return string.Empty;
}
// 2. 处理DBNull和空值
if (dr[columnName] == DBNull.Value || dr[columnName] == null)
{
return string.Empty;
}
// 3. 统一转为字符串并去空格,返回最终结果
return dr[columnName].ToString().Trim();
}
}
}