This commit is contained in:
backuppc
2025-12-05 17:33:12 +09:00
parent 8e8d1f91b4
commit 77f1ddab80
92 changed files with 4878 additions and 20435 deletions

View File

@@ -0,0 +1,320 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.IO;
using System.Text;
using Newtonsoft.Json;
using FCOMMON;
namespace Project.Web
{
public partial class MachineBridge
{
/// <summary>
/// 라이선스 목록 조회
/// </summary>
public string License_GetList()
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
SELECT
idx, gcode, expire, name, Version, MeterialNo, Supply, qty,
uids, SerialNo, Remark, sdate, edate, manu, wuid, wdate
FROM EETGW_License WITH (nolock)
WHERE gcode = @gcode
ORDER BY expire DESC, name, sdate", conn);
cmd.Parameters.Add("@gcode", SqlDbType.VarChar).Value = info.Login.gcode;
var list = new List<object>();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
list.Add(new
{
idx = reader.GetInt32(0),
gcode = reader.IsDBNull(1) ? "" : reader.GetString(1),
expire = !reader.IsDBNull(2) && reader.GetBoolean(2),
name = reader.IsDBNull(3) ? "" : reader.GetString(3),
version = reader.IsDBNull(4) ? "" : reader.GetString(4),
meterialNo = reader.IsDBNull(5) ? "" : reader.GetString(5),
supply = reader.IsDBNull(6) ? "" : reader.GetString(6),
qty = reader.IsDBNull(7) ? 0 : reader.GetInt32(7),
uids = reader.IsDBNull(8) ? "" : reader.GetString(8),
serialNo = reader.IsDBNull(9) ? "" : reader.GetString(9),
remark = reader.IsDBNull(10) ? "" : reader.GetString(10),
sdate = reader.IsDBNull(11) ? "" : reader.GetString(11),
edate = reader.IsDBNull(12) ? "" : reader.GetString(12),
manu = reader.IsDBNull(13) ? "" : reader.GetString(13),
wuid = reader.IsDBNull(14) ? "" : reader.GetString(14),
wdate = reader.IsDBNull(15) ? "" : reader.GetDateTime(15).ToString("yyyy-MM-dd HH:mm:ss")
});
}
}
return JsonConvert.SerializeObject(new { Success = true, Data = list });
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = "라이선스 목록 조회 중 오류가 발생했습니다: " + ex.Message });
}
}
/// <summary>
/// 라이선스 추가
/// </summary>
public string License_Add(string name, string version, string meterialNo, string supply,
int qty, string uids, string serialNo, string remark, string sdate, string edate,
string manu, bool expire)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
INSERT INTO EETGW_License
(gcode, expire, name, manu, Supply, qty, uids, sdate, edate, Remark, wuid, wdate, Version, SerialNo, MeterialNo)
VALUES
(@gcode, @expire, @name, @manu, @Supply, @qty, @uids, @sdate, @edate, @Remark, @wuid, @wdate, @Version, @SerialNo, @MeterialNo);
SELECT SCOPE_IDENTITY();", conn);
cmd.Parameters.Add("@gcode", SqlDbType.VarChar).Value = info.Login.gcode;
cmd.Parameters.Add("@expire", SqlDbType.Bit).Value = expire;
cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = name ?? "";
cmd.Parameters.Add("@manu", SqlDbType.NVarChar).Value = manu ?? "";
cmd.Parameters.Add("@Supply", SqlDbType.NVarChar).Value = supply ?? "";
cmd.Parameters.Add("@qty", SqlDbType.Int).Value = qty;
cmd.Parameters.Add("@uids", SqlDbType.NVarChar).Value = uids ?? "";
cmd.Parameters.Add("@sdate", SqlDbType.VarChar).Value = string.IsNullOrEmpty(sdate) ? DateTime.Now.ToString("yyyy-MM-dd") : sdate;
cmd.Parameters.Add("@edate", SqlDbType.VarChar).Value = (object)edate ?? DBNull.Value;
cmd.Parameters.Add("@Remark", SqlDbType.NVarChar).Value = remark ?? "";
cmd.Parameters.Add("@wuid", SqlDbType.VarChar).Value = info.Login.no;
cmd.Parameters.Add("@wdate", SqlDbType.DateTime).Value = DateTime.Now;
cmd.Parameters.Add("@Version", SqlDbType.NVarChar).Value = version ?? "";
cmd.Parameters.Add("@SerialNo", SqlDbType.NVarChar).Value = serialNo ?? "";
cmd.Parameters.Add("@MeterialNo", SqlDbType.NVarChar).Value = meterialNo ?? "";
var idx = Convert.ToInt32(cmd.ExecuteScalar());
return JsonConvert.SerializeObject(new { Success = true, Message = "라이선스가 추가되었습니다.", Data = new { idx } });
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = "라이선스 추가 중 오류가 발생했습니다: " + ex.Message });
}
}
/// <summary>
/// 라이선스 수정
/// </summary>
public string License_Update(int idx, string name, string version, string meterialNo,
string supply, int qty, string uids, string serialNo, string remark, string sdate,
string edate, string manu, bool expire)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
UPDATE EETGW_License SET
expire = @expire, name = @name, manu = @manu, Supply = @Supply,
qty = @qty, uids = @uids, sdate = @sdate, edate = @edate,
Remark = @Remark, wuid = @wuid, wdate = @wdate,
Version = @Version, SerialNo = @SerialNo, MeterialNo = @MeterialNo
WHERE idx = @idx AND gcode = @gcode", conn);
cmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
cmd.Parameters.Add("@gcode", SqlDbType.VarChar).Value = info.Login.gcode;
cmd.Parameters.Add("@expire", SqlDbType.Bit).Value = expire;
cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = name ?? "";
cmd.Parameters.Add("@manu", SqlDbType.NVarChar).Value = manu ?? "";
cmd.Parameters.Add("@Supply", SqlDbType.NVarChar).Value = supply ?? "";
cmd.Parameters.Add("@qty", SqlDbType.Int).Value = qty;
cmd.Parameters.Add("@uids", SqlDbType.NVarChar).Value = uids ?? "";
cmd.Parameters.Add("@sdate", SqlDbType.VarChar).Value = string.IsNullOrEmpty(sdate) ? DateTime.Now.ToString("yyyy-MM-dd") : sdate;
cmd.Parameters.Add("@edate", SqlDbType.VarChar).Value = (object)edate ?? DBNull.Value;
cmd.Parameters.Add("@Remark", SqlDbType.NVarChar).Value = remark ?? "";
cmd.Parameters.Add("@wuid", SqlDbType.VarChar).Value = info.Login.no;
cmd.Parameters.Add("@wdate", SqlDbType.DateTime).Value = DateTime.Now;
cmd.Parameters.Add("@Version", SqlDbType.NVarChar).Value = version ?? "";
cmd.Parameters.Add("@SerialNo", SqlDbType.NVarChar).Value = serialNo ?? "";
cmd.Parameters.Add("@MeterialNo", SqlDbType.NVarChar).Value = meterialNo ?? "";
var cnt = cmd.ExecuteNonQuery();
return JsonConvert.SerializeObject(new { Success = true, Message = "라이선스가 수정되었습니다.", Data = new { UpdatedCount = cnt } });
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = "라이선스 수정 중 오류가 발생했습니다: " + ex.Message });
}
}
/// <summary>
/// 라이선스 삭제
/// </summary>
public string License_Delete(int idx)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
DELETE FROM EETGW_License
WHERE idx = @idx AND gcode = @gcode", conn);
cmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
cmd.Parameters.Add("@gcode", SqlDbType.VarChar).Value = info.Login.gcode;
var cnt = cmd.ExecuteNonQuery();
return JsonConvert.SerializeObject(new { Success = true, Message = "라이선스가 삭제되었습니다.", Data = new { DeletedCount = cnt } });
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = "라이선스 삭제 중 오류가 발생했습니다: " + ex.Message });
}
}
/// <summary>
/// 라이선스 폴더 열기
/// </summary>
public string License_OpenFolder(int idx)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var serverpath = DBM.getCodeSvalue("55", "01");
if (string.IsNullOrEmpty(serverpath) || !Directory.Exists(serverpath))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "프로젝트 기본경로가 존재하지 않습니다.\\n\\n공용정보->공용코드->55-01 데이터를 설정 하시기 바랍니다." });
}
var folderPath = Path.Combine(serverpath, "Data", "License", idx.ToString());
// 폴더가 없으면 생성
if (!Directory.Exists(folderPath))
{
Directory.CreateDirectory(folderPath);
}
// 탐색기로 폴더 열기
Process.Start("explorer.exe", folderPath);
return JsonConvert.SerializeObject(new { Success = true, Message = "폴더를 열었습니다.", Data = new { Path = folderPath } });
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = "폴더 열기 중 오류가 발생했습니다: " + ex.Message });
}
}
/// <summary>
/// CSV로 내보내기
/// </summary>
public string License_ExportCSV(string filePath)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
SELECT
idx, expire, name, Version, MeterialNo, Supply, qty,
uids, SerialNo, Remark, sdate, edate, manu
FROM EETGW_License WITH (nolock)
WHERE gcode = @gcode
ORDER BY expire DESC, name, sdate", conn);
cmd.Parameters.Add("@gcode", SqlDbType.VarChar).Value = info.Login.gcode;
var sb = new StringBuilder();
sb.AppendLine("idx,expire,name,Version,MeterialNo,Supply,qty,uids,SerialNo,Remark,sdate,edate,manu");
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
var values = new List<string>();
for (int i = 0; i < reader.FieldCount; i++)
{
var value = reader.IsDBNull(i) ? "" : reader.GetValue(i).ToString();
// CSV 이스케이프 처리
if (value.Contains(",") || value.Contains("\"") || value.Contains("\n"))
{
value = "\"" + value.Replace("\"", "\"\"") + "\"";
}
values.Add(value);
}
sb.AppendLine(string.Join(",", values));
}
}
File.WriteAllText(filePath, sb.ToString(), Encoding.UTF8);
return JsonConvert.SerializeObject(new { Success = true, Message = "CSV 파일이 생성되었습니다.", Data = new { Path = filePath } });
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = "CSV 내보내기 중 오류가 발생했습니다: " + ex.Message });
}
}
}
}

View File

@@ -5,6 +5,9 @@ using System.Data;
using System.Data.SqlClient;
using System.Linq;
using FCOMMON;
using NetOffice;
using Outlook = NetOffice.OutlookApi;
using NetOffice.OutlookApi.Enums;
namespace Project.Web
{
@@ -71,5 +74,164 @@ namespace Project.Web
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
}
}
/// <summary>
/// 메일 데이터 추가 (발송 대기열)
/// </summary>
public string Mail_AddData(string cate, string subject, string fromlist, string tolist, string cc, string bcc, string body)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
INSERT INTO MailData
(gcode, cate, pdate, subject, fromlist, tolist, cc, bcc, body, SendOK, wuid, wdate)
VALUES
(@gcode, @cate, @pdate, @subject, @fromlist, @tolist, @cc, @bcc, @body, 0, @wuid, GETDATE())", conn);
cmd.Parameters.Add("@gcode", SqlDbType.VarChar).Value = info.Login.gcode;
cmd.Parameters.Add("@cate", SqlDbType.VarChar).Value = cate ?? "";
cmd.Parameters.Add("@pdate", SqlDbType.VarChar).Value = DateTime.Now.ToString("yyyy-MM-dd");
cmd.Parameters.Add("@subject", SqlDbType.VarChar).Value = subject ?? "";
cmd.Parameters.Add("@fromlist", SqlDbType.VarChar).Value = fromlist ?? "";
cmd.Parameters.Add("@tolist", SqlDbType.VarChar).Value = tolist ?? "";
cmd.Parameters.Add("@cc", SqlDbType.VarChar).Value = cc ?? "";
cmd.Parameters.Add("@bcc", SqlDbType.VarChar).Value = bcc ?? "";
cmd.Parameters.Add("@body", SqlDbType.VarChar).Value = body ?? "";
cmd.Parameters.Add("@wuid", SqlDbType.VarChar).Value = info.Login.no;
int affected = cmd.ExecuteNonQuery();
if (affected > 0)
{
return JsonConvert.SerializeObject(new { Success = true, Message = "메일이 발송 대기열에 추가되었습니다." });
}
else
{
return JsonConvert.SerializeObject(new { Success = false, Message = "메일 등록에 실패했습니다." });
}
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
}
}
/// <summary>
/// 메일 직접 발송 (SMTP)
/// </summary>
public string Mail_SendDirect(string cate, string subject, string fromlist, string tolist, string cc, string bcc, string body)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
// SMTP 직접 발송
var mailserver = info.mailserver ?? "scwa.amkor.co.kr";
var mc = new System.Net.Mail.SmtpClient(mailserver);
var msg = new System.Net.Mail.MailMessage(
string.IsNullOrEmpty(fromlist) ? "gw@amkor.co.kr" : fromlist,
tolist,
subject,
body
);
if (!string.IsNullOrEmpty(bcc)) msg.Bcc.Add(bcc);
if (!string.IsNullOrEmpty(cc)) msg.CC.Add(cc);
msg.IsBodyHtml = true;
mc.Send(msg);
// 발송 성공 시 MailData에도 저장 (SendOK=1)
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
INSERT INTO MailData
(gcode, cate, pdate, subject, fromlist, tolist, cc, bcc, body, SendOK, SendMsg, wuid, wdate, suid, sdate)
VALUES
(@gcode, @cate, @pdate, @subject, @fromlist, @tolist, @cc, @bcc, @body, 1, @SendMsg, @wuid, GETDATE(), @wuid, GETDATE())", conn);
cmd.Parameters.Add("@gcode", SqlDbType.VarChar).Value = info.Login.gcode;
cmd.Parameters.Add("@cate", SqlDbType.VarChar).Value = cate ?? "";
cmd.Parameters.Add("@pdate", SqlDbType.VarChar).Value = DateTime.Now.ToString("yyyy-MM-dd");
cmd.Parameters.Add("@subject", SqlDbType.VarChar).Value = subject ?? "";
cmd.Parameters.Add("@fromlist", SqlDbType.VarChar).Value = string.IsNullOrEmpty(fromlist) ? "gw@amkor.co.kr" : fromlist;
cmd.Parameters.Add("@tolist", SqlDbType.VarChar).Value = tolist ?? "";
cmd.Parameters.Add("@cc", SqlDbType.VarChar).Value = cc ?? "";
cmd.Parameters.Add("@bcc", SqlDbType.VarChar).Value = bcc ?? "";
cmd.Parameters.Add("@body", SqlDbType.VarChar).Value = body ?? "";
cmd.Parameters.Add("@SendMsg", SqlDbType.VarChar).Value = "Direct Send";
cmd.Parameters.Add("@wuid", SqlDbType.VarChar).Value = info.Login.no;
cmd.ExecuteNonQuery();
}
return JsonConvert.SerializeObject(new { Success = true, Message = "메일이 발송되었습니다." });
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = $"메일 발송 실패: {ex.Message}" });
}
}
/// <summary>
/// Outlook으로 메일 미리보기/발송
/// </summary>
public string Mail_SendOutlook(string subject, string _tolist, string cc, string bcc, string body)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
// Outlook COM 객체 생성
var tolist = new string[] { "Chikyun.kim@amkor.co.kr" }; //dr.tolist.Split(',');
Outlook.Application outlookApplication = new Outlook.Application();
foreach (var to in tolist)
{
if (to.isEmpty()) continue;
var newMail = outlookApplication.CreateItem(OlItemType.olMailItem) as Outlook.MailItem;
newMail.Display();
newMail.Subject = subject.Trim(); // dr.title;
newMail.To = to;
newMail.CC = cc;
newMail.BCC = bcc;
// newMail.BodyFormat = OlBodyFormat.olFormatHTML;
newMail.HTMLBody = body
.Replace("{USER}", FCOMMON.info.Login.nameK)
.Replace("{EUSER}", FCOMMON.info.Login.nameE)
.Replace("{EMAIL}", FCOMMON.info.Login.email)
.Replace("%7BEMAIL%7D", FCOMMON.info.Login.email)
.Replace("{HP}", FCOMMON.info.Login.hp)
.Replace("{TEL}", FCOMMON.info.Login.tel)
.Replace("{ITEM}", subject) + newMail.HTMLBody;
}
return JsonConvert.SerializeObject(new { Success = true, Message = "Outlook 메일 창이 열렸습니다." });
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = $"Outlook 실행 실패: {ex.Message}" });
}
}
}
}

View File

@@ -0,0 +1,247 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using Newtonsoft.Json;
using FCOMMON;
namespace Project.Web
{
public partial class MachineBridge
{
/// <summary>
/// 프로젝트별 파트리스트 조회
/// </summary>
public string PartList_GetList(int projectIdx)
{
try
{
var connStr = Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
SELECT
idx, no, Project, ItemGroup, ItemModel, ItemUnit, ItemName,
ItemSid, ItemSupply, ItemSupplyidx, ItemManu, Item,
option1, qty, qtyn, price, amt, remark, qtybuy
FROM ProjectsPart
WHERE Project = @ProjectIdx
ORDER BY ItemGroup, option1, no, ItemName
", conn);
cmd.Parameters.Add("@ProjectIdx", SqlDbType.Int).Value = projectIdx;
var list = new List<object>();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
list.Add(new
{
idx = reader.GetInt32(0),
no = reader.IsDBNull(1) ? 0 : reader.GetInt32(1),
Project = reader.GetInt32(2),
itemgroup = reader.IsDBNull(3) ? "" : reader.GetString(3),
itemmodel = reader.IsDBNull(4) ? "" : reader.GetString(4),
itemunit = reader.IsDBNull(5) ? "" : reader.GetString(5),
itemname = reader.IsDBNull(6) ? "" : reader.GetString(6),
itemsid = reader.IsDBNull(7) ? "" : reader.GetString(7),
itemsupply = reader.IsDBNull(8) ? "" : reader.GetString(8),
itemsupplyidx = reader.IsDBNull(9) ? 0 : reader.GetInt32(9),
itemmanu = reader.IsDBNull(10) ? "" : reader.GetString(10),
item = reader.IsDBNull(11) ? "" : reader.GetInt32(11).ToString(),
option1 = reader.IsDBNull(12) ? "" : reader.GetString(12),
qty = reader.IsDBNull(13) ? 0 : reader.GetInt32(13),
qtyn = reader.IsDBNull(14) ? 0 : reader.GetInt32(14),
price = reader.IsDBNull(15) ? 0.0 : (double)reader.GetDecimal(15),
amt = reader.IsDBNull(16) ? 0.0 : (double)reader.GetDecimal(16),
remark = reader.IsDBNull(17) ? "" : reader.GetString(17),
qtybuy = reader.IsDBNull(18) ? 0 : reader.GetInt32(18)
});
}
} var result = new
{
Success = true,
Data = list
};
return JsonConvert.SerializeObject(result);
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new
{
Success = false,
Message = "파트리스트 조회 실패: " + ex.Message
});
}
}
/// <summary>
/// 파트리스트 항목 저장 (추가/수정)
/// </summary>
public string PartList_Save(
int idx,
int projectIdx,
string itemgroup,
string itemname,
string item,
string itemmodel,
string itemscale,
string itemunit,
double qty,
double price,
string itemsupply,
int itemsupplyidx,
string itemmanu,
string itemsid,
string option1,
string remark,
int no,
double qtybuy)
{
try
{
var connStr = Properties.Settings.Default.CS;
using (var con = new SqlConnection(connStr))
{
con.Open();
if (idx == 0 || idx == -1) // 새로 추가
{
using (var cmd = new SqlCommand(@"
INSERT INTO ProjectsPart (
Project, ItemGroup, ItemName, Item, ItemModel,
ItemUnit, Qty, Price, ItemSupply,
ItemSupplyIdx, ItemManu, ItemSid, option1,
remark, no, qtybuy, wuid, wdate
) VALUES (
@Project, @ItemGroup, @ItemName, @Item, @ItemModel,
@ItemUnit, @Qty, @Price, @ItemSupply,
@ItemSupplyIdx, @ItemManu, @ItemSid, @option1,
@remark, @no, @qtybuy, @wuid, @wdate
)
", con))
{
cmd.Parameters.AddWithValue("@Project", projectIdx);
cmd.Parameters.AddWithValue("@ItemGroup", itemgroup ?? "");
cmd.Parameters.AddWithValue("@ItemName", itemname ?? "");
cmd.Parameters.AddWithValue("@Item", item ?? "");
cmd.Parameters.AddWithValue("@ItemModel", itemmodel ?? "");
cmd.Parameters.AddWithValue("@ItemUnit", itemunit ?? "");
cmd.Parameters.AddWithValue("@Qty", qty);
cmd.Parameters.AddWithValue("@Price", price);
cmd.Parameters.AddWithValue("@ItemSupply", itemsupply ?? "");
cmd.Parameters.AddWithValue("@ItemSupplyIdx", itemsupplyidx);
cmd.Parameters.AddWithValue("@ItemManu", itemmanu ?? "");
cmd.Parameters.AddWithValue("@ItemSid", itemsid ?? "");
cmd.Parameters.AddWithValue("@option1", option1 ?? "");
cmd.Parameters.AddWithValue("@remark", remark ?? "");
cmd.Parameters.AddWithValue("@no", no);
cmd.Parameters.AddWithValue("@qtybuy", qtybuy);
cmd.Parameters.AddWithValue("@wuid", info.Login.no);
cmd.Parameters.AddWithValue("@wdate", DateTime.Now);
cmd.ExecuteNonQuery();
}
}
else // 수정
{
using (var cmd = new SqlCommand(@"
UPDATE ProjectsPart SET
ItemGroup = @ItemGroup,
ItemName = @ItemName,
Item = @Item,
ItemModel = @ItemModel,
ItemUnit = @ItemUnit,
Qty = @Qty,
Price = @Price,
ItemSupply = @ItemSupply,
ItemSupplyIdx = @ItemSupplyIdx,
ItemManu = @ItemManu,
ItemSid = @ItemSid,
option1 = @option1,
remark = @remark,
no = @no,
qtybuy = @qtybuy
WHERE idx = @idx
", con))
{
cmd.Parameters.AddWithValue("@idx", idx);
cmd.Parameters.AddWithValue("@ItemGroup", itemgroup ?? "");
cmd.Parameters.AddWithValue("@ItemName", itemname ?? "");
cmd.Parameters.AddWithValue("@Item", item ?? "");
cmd.Parameters.AddWithValue("@ItemModel", itemmodel ?? "");
cmd.Parameters.AddWithValue("@ItemUnit", itemunit ?? "");
cmd.Parameters.AddWithValue("@Qty", qty);
cmd.Parameters.AddWithValue("@Price", price);
cmd.Parameters.AddWithValue("@ItemSupply", itemsupply ?? "");
cmd.Parameters.AddWithValue("@ItemSupplyIdx", itemsupplyidx);
cmd.Parameters.AddWithValue("@ItemManu", itemmanu ?? "");
cmd.Parameters.AddWithValue("@ItemSid", itemsid ?? "");
cmd.Parameters.AddWithValue("@option1", option1 ?? "");
cmd.Parameters.AddWithValue("@remark", remark ?? "");
cmd.Parameters.AddWithValue("@no", no);
cmd.Parameters.AddWithValue("@qtybuy", qtybuy);
cmd.ExecuteNonQuery();
}
}
return JsonConvert.SerializeObject(new
{
Success = true,
Message = "저장되었습니다."
});
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new
{
Success = false,
Message = "저장 실패: " + ex.Message
});
}
}
/// <summary>
/// 파트리스트 항목 삭제
/// </summary>
public string PartList_Delete(int idx)
{
try
{
var connStr = Properties.Settings.Default.CS;
using (var con = new SqlConnection(connStr))
{
con.Open();
var cmd = new SqlCommand(@"
DELETE FROM ProjectsPart WHERE idx = @idx
", con);
cmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
cmd.ExecuteNonQuery();
return JsonConvert.SerializeObject(new
{
Success = true,
Message = "삭제되었습니다."
});
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new
{
Success = false,
Message = "삭제 실패: " + ex.Message
});
}
}
}
}

View File

@@ -606,6 +606,64 @@ namespace Project.Web
}
}
/// <summary>
/// 프로젝트 히스토리 저장
/// </summary>
public string Project_SaveHistory(int idx, int pidx, string pdate, int progress, string remark)
{
try
{
var cs = Properties.Settings.Default.gwcs;
using (var cn = new SqlConnection(cs))
{
cn.Open();
string sql;
if (idx > 0)
{
// 수정
sql = @"UPDATE ProjectsHistory
SET remark = @remark, progress = @progress, wdate = GETDATE(), wuid = @wuid
WHERE idx = @idx";
}
else
{
// 신규 등록
sql = @"INSERT INTO ProjectsHistory (pidx, pdate, progress, remark, wuid, wdate)
VALUES (@pidx, @pdate, @progress, @remark, @wuid, GETDATE())";
}
using (var cmd = new SqlCommand(sql, cn))
{
if (idx > 0)
{
cmd.Parameters.AddWithValue("@idx", idx);
}
cmd.Parameters.AddWithValue("@pidx", pidx);
cmd.Parameters.AddWithValue("@pdate", pdate);
cmd.Parameters.AddWithValue("@progress", progress);
cmd.Parameters.AddWithValue("@remark", remark ?? "");
cmd.Parameters.AddWithValue("@wuid", info.Login.no);
int affected = cmd.ExecuteNonQuery();
if (affected > 0)
{
return JsonConvert.SerializeObject(new { Success = true, Message = "저장되었습니다." });
}
else
{
return JsonConvert.SerializeObject(new { Success = false, Message = "저장에 실패했습니다." });
}
}
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
}
}
/// <summary>
/// 프로젝트 일일 메모 조회
/// </summary>

View File

@@ -101,12 +101,27 @@ namespace Project.Web
{
try
{
var productVersion = Application.ProductVersion;
var maxVersion = DBM.GetMaxVersion();
var hasNewVersion = false;
if (!string.IsNullOrEmpty(maxVersion))
{
var verchk = productVersion.CompareTo(maxVersion);
if (verchk < 0)
{
hasNewVersion = true;
}
}
return JsonConvert.SerializeObject(new
{
Success = true,
ProductName = Application.ProductName,
ProductVersion = Application.ProductVersion,
DisplayVersion = $"{Application.ProductName} v{Application.ProductVersion}"
ProductVersion = productVersion,
DisplayVersion = $"{Application.ProductName} v{productVersion}",
MaxVersion = maxVersion,
HasNewVersion = hasNewVersion
});
}
catch (Exception ex)

View File

@@ -986,6 +986,171 @@ namespace Project.Web
}
break;
case "MAIL_ADD_DATA":
{
string cate = json.cate ?? "";
string subject = json.subject ?? "";
string fromlist = json.fromlist ?? "";
string tolist = json.tolist ?? "";
string cc = json.cc ?? "";
string bcc = json.bcc ?? "";
string body = json.body ?? "";
string result = _bridge.Mail_AddData(cate, subject, fromlist, tolist, cc, bcc, body);
var response = new { type = "MAIL_ADD_DATA_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "MAIL_SEND_DIRECT":
{
string cate = json.cate ?? "";
string subject = json.subject ?? "";
string fromlist = json.fromlist ?? "";
string tolist = json.tolist ?? "";
string cc = json.cc ?? "";
string bcc = json.bcc ?? "";
string body = json.body ?? "";
string result = _bridge.Mail_SendDirect(cate, subject, fromlist, tolist, cc, bcc, body);
var response = new { type = "MAIL_SEND_DIRECT_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "MAIL_SEND_OUTLOOK":
{
string subject = json.subject ?? "";
string tolist = json.tolist ?? "";
string cc = json.cc ?? "";
string bcc = json.bcc ?? "";
string body = json.body ?? "";
string result = _bridge.Mail_SendOutlook(subject, tolist, cc, bcc, body);
var response = new { type = "MAIL_SEND_OUTLOOK_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
// ===== License API (라이선스 관리) =====
case "LICENSE_GET_LIST":
{
string result = _bridge.License_GetList();
var response = new { type = "LICENSE_LIST_DATA", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "LICENSE_ADD":
{
string name = json.name ?? "";
string version = json.version ?? "";
string meterialNo = json.meterialNo ?? "";
string supply = json.supply ?? "";
int qty = json.qty ?? 0;
string uids = json.uids ?? "";
string serialNo = json.serialNo ?? "";
string remark = json.remark ?? "";
string sdate = json.sdate ?? "";
string edate = json.edate ?? "";
string manu = json.manu ?? "";
bool expire = json.expire ?? false;
string result = _bridge.License_Add(name, version, meterialNo, supply, qty, uids, serialNo, remark, sdate, edate, manu, expire);
var response = new { type = "LICENSE_ADD_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "LICENSE_UPDATE":
{
int idx = json.idx ?? 0;
string name = json.name ?? "";
string version = json.version ?? "";
string meterialNo = json.meterialNo ?? "";
string supply = json.supply ?? "";
int qty = json.qty ?? 0;
string uids = json.uids ?? "";
string serialNo = json.serialNo ?? "";
string remark = json.remark ?? "";
string sdate = json.sdate ?? "";
string edate = json.edate ?? "";
string manu = json.manu ?? "";
bool expire = json.expire ?? false;
string result = _bridge.License_Update(idx, name, version, meterialNo, supply, qty, uids, serialNo, remark, sdate, edate, manu, expire);
var response = new { type = "LICENSE_UPDATE_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "LICENSE_DELETE":
{
int idx = json.idx ?? 0;
string result = _bridge.License_Delete(idx);
var response = new { type = "LICENSE_DELETE_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "LICENSE_OPEN_FOLDER":
{
int idx = json.idx ?? 0;
string result = _bridge.License_OpenFolder(idx);
var response = new { type = "LICENSE_OPEN_FOLDER_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "LICENSE_EXPORT_CSV":
{
string filePath = json.filePath ?? "";
string result = _bridge.License_ExportCSV(filePath);
var response = new { type = "LICENSE_EXPORT_CSV_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
// ===== PartList API (파트리스트) =====
case "PARTLIST_GET_LIST":
{
int projectIdx = json.projectIdx ?? 0;
string result = _bridge.PartList_GetList(projectIdx);
var response = new { type = "PARTLIST_LIST_DATA", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "PARTLIST_SAVE":
{
int idx = json.idx ?? 0;
int projectIdx = json.projectIdx ?? 0;
string itemgroup = json.itemgroup ?? "";
string itemname = json.itemname ?? "";
string item = json.item ?? "";
string itemmodel = json.itemmodel ?? "";
string itemscale = json.itemscale ?? "";
string itemunit = json.itemunit ?? "";
double qty = json.qty ?? 0.0;
double price = json.price ?? 0.0;
string itemsupply = json.itemsupply ?? "";
int itemsupplyidx = json.itemsupplyidx ?? 0;
string itemmanu = json.itemmanu ?? "";
string itemsid = json.itemsid ?? "";
string option1 = json.option1 ?? "";
string remark = json.remark ?? "";
int no = json.no ?? 0;
double qtybuy = json.qtybuy ?? 0.0;
string result = _bridge.PartList_Save(idx, projectIdx, itemgroup, itemname, item, itemmodel, itemscale, itemunit, qty, price, itemsupply, itemsupplyidx, itemmanu, itemsid, option1, remark, no, qtybuy);
var response = new { type = "PARTLIST_SAVE_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "PARTLIST_DELETE":
{
int idx = json.idx ?? 0;
string result = _bridge.PartList_Delete(idx);
var response = new { type = "PARTLIST_DELETE_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
// ===== Customs API (업체정보) =====
case "CUSTOMS_GET_LIST":
{
@@ -1295,6 +1460,19 @@ namespace Project.Web
}
break;
case "PROJECT_SAVE_HISTORY":
{
int idx = json.idx ?? 0;
int pidx = json.pidx ?? 0;
string pdate = json.pdate ?? "";
int progress = json.progress ?? 0;
string remark = json.remark ?? "";
string result = _bridge.Project_SaveHistory(idx, pidx, pdate, progress, remark);
var response = new { type = "PROJECT_SAVE_HISTORY_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "PROJECT_GET_DAILY_MEMO":
{
int projectIdx = json.projectIdx ?? 0;