Compare commits
10 Commits
b21b17fb7a
...
116af44965
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
116af44965 | ||
|
|
b1c3bbac42 | ||
|
|
ab46ccb924 | ||
|
|
890e6edab4 | ||
|
|
77f1ddab80 | ||
|
|
8e8d1f91b4 | ||
|
|
c1c615fe1b | ||
|
|
3d53a5c42f | ||
|
|
40abcde0a9 | ||
|
|
bb66af89ae |
327
DBMigration/Scripts/20251203_Add_Board_Reply_Structure.sql
Normal file
327
DBMigration/Scripts/20251203_Add_Board_Reply_Structure.sql
Normal file
@@ -0,0 +1,327 @@
|
||||
-- =============================================
|
||||
-- EETGW_Board 테이블 구조 변경: 댓글/답글 시스템 추가
|
||||
-- 작성일: 2025-12-03
|
||||
-- 설명: 계층형 댓글/답글을 효율적으로 관리하기 위한 컬럼 추가
|
||||
-- =============================================
|
||||
|
||||
USE [EETGW]
|
||||
GO
|
||||
|
||||
PRINT '=== Starting EETGW_Board structure update ===';
|
||||
PRINT 'Timestamp: ' + CONVERT(VARCHAR(20), GETDATE(), 120);
|
||||
GO
|
||||
|
||||
-- 1. 기존 테이블 백업
|
||||
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'EETGW_Board_Backup_20251203')
|
||||
BEGIN
|
||||
SELECT * INTO EETGW_Board_Backup_20251203 FROM EETGW_Board;
|
||||
PRINT '✓ Backup created: EETGW_Board_Backup_20251203';
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
PRINT '⚠ Backup already exists: EETGW_Board_Backup_20251203';
|
||||
END
|
||||
GO
|
||||
|
||||
-- 2. 새로운 컬럼 추가
|
||||
PRINT '';
|
||||
PRINT '--- Adding new columns ---';
|
||||
|
||||
-- root_idx: 최상위 원글의 idx (답글/댓글이 어느 글에 속하는지)
|
||||
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('EETGW_Board') AND name = 'root_idx')
|
||||
BEGIN
|
||||
ALTER TABLE EETGW_Board ADD root_idx INT NULL;
|
||||
PRINT '✓ Added column: root_idx (최상위 원글 idx)';
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
PRINT '⊙ Column already exists: root_idx';
|
||||
END
|
||||
GO
|
||||
|
||||
-- depth: 댓글 깊이 (0=원글, 1=1차댓글, 2=2차댓글...)
|
||||
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('EETGW_Board') AND name = 'depth')
|
||||
BEGIN
|
||||
ALTER TABLE EETGW_Board ADD depth INT NOT NULL DEFAULT 0;
|
||||
PRINT '✓ Added column: depth (댓글 깊이)';
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
PRINT '⊙ Column already exists: depth';
|
||||
END
|
||||
GO
|
||||
|
||||
-- sort_order: 같은 레벨에서의 정렬 순서
|
||||
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('EETGW_Board') AND name = 'sort_order')
|
||||
BEGIN
|
||||
ALTER TABLE EETGW_Board ADD sort_order INT NOT NULL DEFAULT 0;
|
||||
PRINT '✓ Added column: sort_order (정렬 순서)';
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
PRINT '⊙ Column already exists: sort_order';
|
||||
END
|
||||
GO
|
||||
|
||||
-- thread_path: 계층 경로 (예: "1/5/12" - 빠른 정렬과 조회용)
|
||||
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('EETGW_Board') AND name = 'thread_path')
|
||||
BEGIN
|
||||
ALTER TABLE EETGW_Board ADD thread_path VARCHAR(1000) NULL;
|
||||
PRINT '✓ Added column: thread_path (계층 경로)';
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
PRINT '⊙ Column already exists: thread_path';
|
||||
END
|
||||
GO
|
||||
|
||||
-- is_comment: 댓글 여부 (true=댓글형식, false=답글형식)
|
||||
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('EETGW_Board') AND name = 'is_comment')
|
||||
BEGIN
|
||||
ALTER TABLE EETGW_Board ADD is_comment BIT NOT NULL DEFAULT 0;
|
||||
PRINT '✓ Added column: is_comment (댓글/답글 구분)';
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
PRINT '⊙ Column already exists: is_comment';
|
||||
END
|
||||
GO
|
||||
|
||||
-- reply_count: 하위 댓글/답글 개수 (캐시용)
|
||||
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('EETGW_Board') AND name = 'reply_count')
|
||||
BEGIN
|
||||
ALTER TABLE EETGW_Board ADD reply_count INT NOT NULL DEFAULT 0;
|
||||
PRINT '✓ Added column: reply_count (댓글 개수 캐시)';
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
PRINT '⊙ Column already exists: reply_count';
|
||||
END
|
||||
GO
|
||||
|
||||
-- 3. 기존 데이터 마이그레이션
|
||||
PRINT '';
|
||||
PRINT '--- Migrating existing data ---';
|
||||
|
||||
-- 원글(pidx가 0이거나 NULL인 경우)
|
||||
UPDATE EETGW_Board
|
||||
SET
|
||||
root_idx = idx,
|
||||
depth = 0,
|
||||
thread_path = CAST(idx AS VARCHAR(20)),
|
||||
sort_order = 0,
|
||||
is_comment = 0
|
||||
WHERE ISNULL(pidx, 0) = 0 AND (root_idx IS NULL OR thread_path IS NULL);
|
||||
|
||||
DECLARE @originalCount INT = @@ROWCOUNT;
|
||||
PRINT '✓ Updated ' + CAST(@originalCount AS VARCHAR(10)) + ' original posts (depth=0)';
|
||||
|
||||
-- 답글(pidx가 있는 경우) - 1depth만 처리
|
||||
UPDATE b
|
||||
SET
|
||||
root_idx = ISNULL(p.root_idx, b.pidx),
|
||||
depth = CASE WHEN p.depth IS NULL THEN 1 ELSE p.depth + 1 END,
|
||||
thread_path = ISNULL(p.thread_path, CAST(b.pidx AS VARCHAR(20))) + '/' + CAST(b.idx AS VARCHAR(20)),
|
||||
sort_order = 0,
|
||||
is_comment = 0
|
||||
FROM EETGW_Board b
|
||||
LEFT JOIN EETGW_Board p ON b.pidx = p.idx
|
||||
WHERE ISNULL(b.pidx, 0) > 0 AND (b.root_idx IS NULL OR b.thread_path IS NULL);
|
||||
|
||||
DECLARE @replyCount INT = @@ROWCOUNT;
|
||||
PRINT '✓ Updated ' + CAST(@replyCount AS VARCHAR(10)) + ' reply posts';
|
||||
GO
|
||||
|
||||
-- 4. 인덱스 추가 (성능 최적화)
|
||||
PRINT '';
|
||||
PRINT '--- Creating indexes ---';
|
||||
|
||||
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_EETGW_Board_root_idx_thread_path')
|
||||
BEGIN
|
||||
CREATE INDEX IX_EETGW_Board_root_idx_thread_path
|
||||
ON EETGW_Board(root_idx, thread_path);
|
||||
PRINT '✓ Created index: IX_EETGW_Board_root_idx_thread_path';
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
PRINT '⊙ Index already exists: IX_EETGW_Board_root_idx_thread_path';
|
||||
END
|
||||
GO
|
||||
|
||||
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_EETGW_Board_pidx')
|
||||
BEGIN
|
||||
CREATE INDEX IX_EETGW_Board_pidx
|
||||
ON EETGW_Board(pidx);
|
||||
PRINT '✓ Created index: IX_EETGW_Board_pidx';
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
PRINT '⊙ Index already exists: IX_EETGW_Board_pidx';
|
||||
END
|
||||
GO
|
||||
|
||||
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_EETGW_Board_bidx_wdate')
|
||||
BEGIN
|
||||
CREATE INDEX IX_EETGW_Board_bidx_wdate
|
||||
ON EETGW_Board(bidx, wdate DESC);
|
||||
PRINT '✓ Created index: IX_EETGW_Board_bidx_wdate';
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
PRINT '⊙ Index already exists: IX_EETGW_Board_bidx_wdate';
|
||||
END
|
||||
GO
|
||||
|
||||
-- 5. reply_count 업데이트 (기존 데이터 기준)
|
||||
PRINT '';
|
||||
PRINT '--- Updating reply counts ---';
|
||||
|
||||
UPDATE p
|
||||
SET reply_count = (
|
||||
SELECT COUNT(*)
|
||||
FROM EETGW_Board c
|
||||
WHERE c.root_idx = p.idx AND c.depth > 0
|
||||
)
|
||||
FROM EETGW_Board p
|
||||
WHERE p.depth = 0;
|
||||
|
||||
DECLARE @updatedRootPosts INT = @@ROWCOUNT;
|
||||
PRINT '✓ Updated reply_count for ' + CAST(@updatedRootPosts AS VARCHAR(10)) + ' root posts';
|
||||
GO
|
||||
|
||||
-- 6. 트리거 생성 (reply_count 자동 업데이트)
|
||||
PRINT '';
|
||||
PRINT '--- Creating triggers ---';
|
||||
|
||||
IF EXISTS (SELECT * FROM sys.triggers WHERE name = 'TR_EETGW_Board_AfterInsert')
|
||||
BEGIN
|
||||
DROP TRIGGER TR_EETGW_Board_AfterInsert;
|
||||
PRINT '⊙ Dropped existing trigger: TR_EETGW_Board_AfterInsert';
|
||||
END
|
||||
GO
|
||||
|
||||
CREATE TRIGGER TR_EETGW_Board_AfterInsert
|
||||
ON EETGW_Board
|
||||
AFTER INSERT
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
|
||||
-- 댓글/답글이 추가된 경우 root_idx의 reply_count 증가
|
||||
UPDATE b
|
||||
SET b.reply_count = b.reply_count + 1
|
||||
FROM EETGW_Board b
|
||||
INNER JOIN inserted i ON b.idx = i.root_idx
|
||||
WHERE i.root_idx IS NOT NULL AND i.depth > 0;
|
||||
END
|
||||
GO
|
||||
|
||||
PRINT '✓ Created trigger: TR_EETGW_Board_AfterInsert';
|
||||
GO
|
||||
|
||||
IF EXISTS (SELECT * FROM sys.triggers WHERE name = 'TR_EETGW_Board_AfterDelete')
|
||||
BEGIN
|
||||
DROP TRIGGER TR_EETGW_Board_AfterDelete;
|
||||
PRINT '⊙ Dropped existing trigger: TR_EETGW_Board_AfterDelete';
|
||||
END
|
||||
GO
|
||||
|
||||
CREATE TRIGGER TR_EETGW_Board_AfterDelete
|
||||
ON EETGW_Board
|
||||
AFTER DELETE
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
|
||||
-- 댓글/답글이 삭제된 경우 root_idx의 reply_count 감소
|
||||
UPDATE b
|
||||
SET b.reply_count = b.reply_count - 1
|
||||
FROM EETGW_Board b
|
||||
INNER JOIN deleted d ON b.idx = d.root_idx
|
||||
WHERE d.root_idx IS NOT NULL AND d.depth > 0 AND b.reply_count > 0;
|
||||
END
|
||||
GO
|
||||
|
||||
PRINT '✓ Created trigger: TR_EETGW_Board_AfterDelete';
|
||||
GO
|
||||
|
||||
-- 7. 조회용 뷰 생성 (옵션)
|
||||
PRINT '';
|
||||
PRINT '--- Creating views ---';
|
||||
|
||||
IF EXISTS (SELECT * FROM sys.views WHERE name = 'vEETGW_Board_WithReplies')
|
||||
BEGIN
|
||||
DROP VIEW vEETGW_Board_WithReplies;
|
||||
PRINT '⊙ Dropped existing view: vEETGW_Board_WithReplies';
|
||||
END
|
||||
GO
|
||||
|
||||
CREATE VIEW vEETGW_Board_WithReplies
|
||||
AS
|
||||
SELECT
|
||||
b.idx,
|
||||
b.bidx,
|
||||
b.header,
|
||||
b.cate,
|
||||
b.title,
|
||||
b.contents,
|
||||
b.[file],
|
||||
b.guid,
|
||||
b.url,
|
||||
b.wuid,
|
||||
b.wdate,
|
||||
b.project,
|
||||
b.pidx,
|
||||
b.gcode,
|
||||
b.[close],
|
||||
b.remark,
|
||||
b.root_idx,
|
||||
b.depth,
|
||||
b.sort_order,
|
||||
b.thread_path,
|
||||
b.is_comment,
|
||||
b.reply_count,
|
||||
dbo.getUserName(b.wuid) AS wuid_name,
|
||||
CASE WHEN b.depth = 0 THEN b.idx ELSE b.root_idx END AS display_root_idx
|
||||
FROM EETGW_Board b;
|
||||
GO
|
||||
|
||||
PRINT '✓ Created view: vEETGW_Board_WithReplies';
|
||||
GO
|
||||
|
||||
-- 8. 검증 쿼리
|
||||
PRINT '';
|
||||
PRINT '--- Verification ---';
|
||||
|
||||
DECLARE @totalPosts INT = (SELECT COUNT(*) FROM EETGW_Board);
|
||||
DECLARE @rootPosts INT = (SELECT COUNT(*) FROM EETGW_Board WHERE depth = 0);
|
||||
DECLARE @replyPosts INT = (SELECT COUNT(*) FROM EETGW_Board WHERE depth > 0);
|
||||
|
||||
PRINT 'Total posts: ' + CAST(@totalPosts AS VARCHAR(10));
|
||||
PRINT 'Root posts (depth=0): ' + CAST(@rootPosts AS VARCHAR(10));
|
||||
PRINT 'Reply posts (depth>0): ' + CAST(@replyPosts AS VARCHAR(10));
|
||||
GO
|
||||
|
||||
PRINT '';
|
||||
PRINT '=== EETGW_Board structure update completed successfully ===';
|
||||
PRINT '';
|
||||
PRINT '📋 New columns added:';
|
||||
PRINT ' • root_idx: 최상위 원글 idx';
|
||||
PRINT ' • depth: 댓글 깊이 (0=원글, 1=1차댓글, 2=2차댓글...)';
|
||||
PRINT ' • sort_order: 같은 레벨에서 정렬 순서';
|
||||
PRINT ' • thread_path: 계층 경로 (빠른 정렬용)';
|
||||
PRINT ' • is_comment: 댓글 타입 (0=답글, 1=댓글)';
|
||||
PRINT ' • reply_count: 하위 댓글 개수';
|
||||
PRINT '';
|
||||
PRINT '📝 Usage examples:';
|
||||
PRINT ' -- 원글 목록 (댓글 개수 포함)';
|
||||
PRINT ' SELECT * FROM EETGW_Board WHERE bidx = 5 AND depth = 0 ORDER BY wdate DESC;';
|
||||
PRINT '';
|
||||
PRINT ' -- 특정 글의 전체 댓글 (계층 구조 유지)';
|
||||
PRINT ' SELECT * FROM EETGW_Board WHERE root_idx = 123 ORDER BY thread_path, wdate;';
|
||||
PRINT '';
|
||||
PRINT ' -- 1depth 댓글만 조회';
|
||||
PRINT ' SELECT * FROM EETGW_Board WHERE root_idx = 123 AND depth = 1 ORDER BY wdate;';
|
||||
PRINT '';
|
||||
PRINT '✅ Migration completed at: ' + CONVERT(VARCHAR(20), GETDATE(), 120);
|
||||
GO
|
||||
@@ -85,8 +85,8 @@ namespace Project.Dialog
|
||||
{
|
||||
DateTime dt = DateTime.Now;
|
||||
|
||||
//if(tbID.Text != "dev" && (dt.ToShortDateString() == "2025-04-05" ||
|
||||
// dt.ToShortDateString() == "2025-04-06"))
|
||||
//if(tbID.Text != "dev" && (dt.ToString("yyyy-MM-dd") == "2025-04-05" ||
|
||||
// dt.ToString("yyyy-MM-dd") == "2025-04-06"))
|
||||
//{
|
||||
// Util.MsgE("4월 5일~6일은 데이터베이스 마이그레이션 기간이므로 프로그램 사용이 중단 됩니다\n문의 010-9155-9051 (EEDP:김치균)");
|
||||
// return;
|
||||
|
||||
@@ -173,9 +173,21 @@
|
||||
<Reference Include="Microsoft.Web.WebView2.Wpf, Version=1.0.2210.55, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Microsoft.Web.WebView2.1.0.2210.55\lib\net45\Microsoft.Web.WebView2.Wpf.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NetOffice, Version=1.8.1.0, Culture=neutral, PublicKeyToken=297f57b43ae7c1de, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NetOfficeFw.Core.1.8.1\lib\net40\NetOffice.dll</HintPath>
|
||||
<EmbedInteropTypes>False</EmbedInteropTypes>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="OfficeApi, Version=1.8.1.0, Culture=neutral, PublicKeyToken=a39beb0835c43c8e, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NetOfficeFw.Core.1.8.1\lib\net40\OfficeApi.dll</HintPath>
|
||||
<EmbedInteropTypes>False</EmbedInteropTypes>
|
||||
</Reference>
|
||||
<Reference Include="OutlookApi, Version=1.8.1.0, Culture=neutral, PublicKeyToken=b118031aaa1097f3, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NetOfficeFw.Outlook.1.8.1\lib\net40\OutlookApi.dll</HintPath>
|
||||
<EmbedInteropTypes>False</EmbedInteropTypes>
|
||||
</Reference>
|
||||
<Reference Include="System">
|
||||
<HintPath>..\..\..\..\..\..\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\System.dll</HintPath>
|
||||
</Reference>
|
||||
@@ -214,6 +226,10 @@
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="VBIDEApi, Version=1.8.1.0, Culture=neutral, PublicKeyToken=931cec8882205047, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NetOfficeFw.Core.1.8.1\lib\net40\VBIDEApi.dll</HintPath>
|
||||
<EmbedInteropTypes>False</EmbedInteropTypes>
|
||||
</Reference>
|
||||
<Reference Include="WindowsBase" />
|
||||
<Reference Include="Winsock Orcas">
|
||||
<HintPath>..\DLL\Winsock Orcas.dll</HintPath>
|
||||
@@ -351,6 +367,7 @@
|
||||
<Compile Include="MessageWindow.cs" />
|
||||
<Compile Include="MethodExtentions.cs" />
|
||||
<Compile Include="Web\MachineBridge\MachineBridge.cs" />
|
||||
<Compile Include="Web\MachineBridge\MachineBridge.HolidayRequest.cs" />
|
||||
<Compile Include="Web\MachineBridge\MachineBridge.Login.cs" />
|
||||
<Compile Include="Web\MachineBridge\MachineBridge.Dashboard.cs" />
|
||||
<Compile Include="Web\MachineBridge\MachineBridge.Todo.cs" />
|
||||
@@ -369,6 +386,8 @@
|
||||
<Compile Include="Web\MachineBridge\MachineBridge.Customs.cs" />
|
||||
<Compile Include="Web\MachineBridge\MachineBridge.UserGroup.cs" />
|
||||
<Compile Include="Web\MachineBridge\MachineBridge.UserAuth.cs" />
|
||||
<Compile Include="Web\MachineBridge\MachineBridge.License.cs" />
|
||||
<Compile Include="Web\MachineBridge\MachineBridge.PartList.cs" />
|
||||
<Compile Include="Web\MachineBridge\WebSocketServer.cs" />
|
||||
<Compile Include="Web\Model\PageModel.cs" />
|
||||
<Compile Include="Web\Model\ProjectModel.cs" />
|
||||
@@ -744,7 +763,7 @@
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="..\packages\Microsoft.Web.WebView2.1.0.2210.55\build\Microsoft.Web.WebView2.targets" Condition="Exists('..\packages\Microsoft.Web.WebView2.1.0.2210.55\build\Microsoft.Web.WebView2.targets')" />
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>xcopy /E /I /Y "$(ProjectDir)frontend\dist\*" "$(TargetDir)Web\Dist\"</PostBuildEvent>
|
||||
<PostBuildEvent>rem xcopy /E /I /Y "$(ProjectDir)frontend\dist\*" "$(TargetDir)Web\Dist\"</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
|
||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호가 자동으로
|
||||
// 지정되도록 할 수 있습니다.
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("25.11.11.1030")]
|
||||
[assembly: AssemblyFileVersion("25.11.11.1030")]
|
||||
[assembly: AssemblyVersion("25.12.12.1050")]
|
||||
[assembly: AssemblyFileVersion("25.12.12.1050")]
|
||||
|
||||
@@ -42,7 +42,7 @@ namespace Project
|
||||
var dbJR = new dsMSSQLTableAdapters.JobReportTableAdapter();
|
||||
var taQuery = new DSQueryTableAdapters.QueriesTableAdapter();
|
||||
|
||||
var nd = DateTime.Now.ToShortDateString();
|
||||
var nd = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
|
||||
//이 날짜가 휴일인지 체크한다.
|
||||
var Holyinfo = dbHL.GetData(nd).FirstOrDefault();// db.HolidayLIst.Where(t => t.pdate == nd).FirstOrDefault();
|
||||
@@ -104,7 +104,7 @@ namespace Project
|
||||
{
|
||||
//자동로그인 업무일지 기록 기능 추가 = 210220
|
||||
//select* from EETGW_JobReport_AutoInput where gcode = 'EET1P' and pdate <= '2021-02-20' and(edate is null or edate > '2021-02-20') and autoinput = 'L'
|
||||
var nd = DateTime.Now.ToShortDateString();
|
||||
var nd = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
|
||||
var taQ = new DSQueryTableAdapters.QueriesTableAdapter();
|
||||
var exist = taQ.ExistAutoInputData(FCOMMON.info.Login.gcode, FCOMMON.info.Login.no, nd) > 0;
|
||||
|
||||
@@ -29,21 +29,27 @@ namespace Project.Web
|
||||
|
||||
var sql = @"
|
||||
SELECT idx, bidx, header, cate, title, contents, [file], guid, url, wuid, wdate, project, pidx, gcode, [close], remark,
|
||||
root_idx, depth, sort_order, thread_path, is_comment, reply_count,
|
||||
dbo.getUserName(wuid) AS wuid_name
|
||||
FROM Board WITH (nolock)
|
||||
WHERE gcode = @gcode AND bidx = @bidx
|
||||
FROM EETGW_Board WITH (nolock)
|
||||
WHERE gcode = @gcode AND bidx = @bidx AND (is_comment IS NULL OR is_comment = 0)
|
||||
AND (ISNULL(title,'') LIKE @search OR ISNULL(contents,'') LIKE @search OR ISNULL(wuid,'') LIKE @search)
|
||||
ORDER BY wdate DESC";
|
||||
ORDER BY
|
||||
CASE WHEN root_idx IS NULL THEN idx ELSE root_idx END DESC,
|
||||
thread_path ASC";
|
||||
|
||||
if(bidx == 5) //패치내역은 모두가 다 확인할 수있도록 그룹코드를 제한하지 않는다
|
||||
{
|
||||
sql = @"
|
||||
SELECT idx, bidx, header, cate, title, contents, [file], guid, url, wuid, wdate, project, pidx, gcode, [close], remark,
|
||||
root_idx, depth, sort_order, thread_path, is_comment, reply_count,
|
||||
dbo.getUserName(wuid) AS wuid_name
|
||||
FROM Board WITH (nolock)
|
||||
WHERE bidx = @bidx
|
||||
FROM EETGW_Board WITH (nolock)
|
||||
WHERE bidx = @bidx AND (is_comment IS NULL OR is_comment = 0)
|
||||
AND (ISNULL(title,'') LIKE @search OR ISNULL(contents,'') LIKE @search OR ISNULL(wuid,'') LIKE @search)
|
||||
ORDER BY wdate DESC";
|
||||
ORDER BY
|
||||
CASE WHEN root_idx IS NULL THEN idx ELSE root_idx END DESC,
|
||||
thread_path ASC";
|
||||
}
|
||||
|
||||
var cmd = new SqlCommand(sql, conn);
|
||||
@@ -75,7 +81,13 @@ namespace Project.Web
|
||||
gcode = reader.IsDBNull(13) ? "" : reader.GetString(13),
|
||||
close = reader.IsDBNull(14) ? false : reader.GetBoolean(14),
|
||||
remark = reader.IsDBNull(15) ? "" : reader.GetString(15),
|
||||
wuid_name = reader.IsDBNull(16) ? "" : reader.GetString(16)
|
||||
root_idx = reader.IsDBNull(16) ? (int?)null : reader.GetInt32(16),
|
||||
depth = reader.IsDBNull(17) ? 0 : reader.GetInt32(17),
|
||||
sort_order = reader.IsDBNull(18) ? 0 : reader.GetInt32(18),
|
||||
thread_path = reader.IsDBNull(19) ? "" : reader.GetString(19),
|
||||
is_comment = reader.IsDBNull(20) ? false : reader.GetBoolean(20),
|
||||
reply_count = reader.IsDBNull(21) ? 0 : reader.GetInt32(21),
|
||||
wuid_name = reader.IsDBNull(22) ? "" : reader.GetString(22)
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -108,8 +120,9 @@ namespace Project.Web
|
||||
|
||||
var cmd = new SqlCommand(@"
|
||||
SELECT idx, bidx, header, cate, title, contents, [file], guid, url, wuid, wdate, project, pidx, gcode, [close], remark,
|
||||
root_idx, depth, sort_order, thread_path, is_comment, reply_count,
|
||||
dbo.getUserName(wuid) AS wuid_name
|
||||
FROM Board WITH (nolock)
|
||||
FROM EETGW_Board WITH (nolock)
|
||||
WHERE idx = @idx AND gcode = @gcode", conn);
|
||||
|
||||
cmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
|
||||
@@ -137,7 +150,13 @@ namespace Project.Web
|
||||
gcode = reader.IsDBNull(13) ? "" : reader.GetString(13),
|
||||
close = reader.IsDBNull(14) ? false : reader.GetBoolean(14),
|
||||
remark = reader.IsDBNull(15) ? "" : reader.GetString(15),
|
||||
wuid_name = reader.IsDBNull(16) ? "" : reader.GetString(16)
|
||||
root_idx = reader.IsDBNull(16) ? (int?)null : reader.GetInt32(16),
|
||||
depth = reader.IsDBNull(17) ? 0 : reader.GetInt32(17),
|
||||
sort_order = reader.IsDBNull(18) ? 0 : reader.GetInt32(18),
|
||||
thread_path = reader.IsDBNull(19) ? "" : reader.GetString(19),
|
||||
is_comment = reader.IsDBNull(20) ? false : reader.GetBoolean(20),
|
||||
reply_count = reader.IsDBNull(21) ? 0 : reader.GetInt32(21),
|
||||
wuid_name = reader.IsDBNull(22) ? "" : reader.GetString(22)
|
||||
};
|
||||
|
||||
return JsonConvert.SerializeObject(new { Success = true, Data = data });
|
||||
@@ -173,9 +192,12 @@ namespace Project.Web
|
||||
conn.Open();
|
||||
|
||||
var cmd = new SqlCommand(@"
|
||||
INSERT INTO Board (bidx, header, cate, title, contents, wuid, wdate, gcode)
|
||||
VALUES (@bidx, @header, @cate, @title, @contents, @wuid, GETDATE(), @gcode);
|
||||
SELECT SCOPE_IDENTITY();", conn);
|
||||
DECLARE @newIdx INT;
|
||||
INSERT INTO EETGW_Board (bidx, header, cate, title, contents, wuid, wdate, gcode, depth, root_idx, thread_path, is_comment)
|
||||
VALUES (@bidx, @header, @cate, @title, @contents, @wuid, GETDATE(), @gcode, 0, NULL, NULL, 0);
|
||||
SET @newIdx = SCOPE_IDENTITY();
|
||||
UPDATE EETGW_Board SET root_idx = @newIdx, thread_path = CAST(@newIdx AS VARCHAR(20)) WHERE idx = @newIdx;
|
||||
SELECT @newIdx;", conn);
|
||||
|
||||
cmd.Parameters.Add("@bidx", SqlDbType.Int).Value = bidx;
|
||||
cmd.Parameters.Add("@header", SqlDbType.NVarChar).Value = string.IsNullOrEmpty(header) ? (object)DBNull.Value : header;
|
||||
@@ -214,7 +236,7 @@ namespace Project.Web
|
||||
conn.Open();
|
||||
|
||||
// 권한 확인: 작성자 본인이거나 레벨 9 이상만 수정 가능
|
||||
var checkCmd = new SqlCommand("SELECT wuid FROM Board WHERE idx = @idx", conn);
|
||||
var checkCmd = new SqlCommand("SELECT wuid FROM EETGW_Board WHERE idx = @idx", conn);
|
||||
checkCmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
|
||||
var originalWuid = checkCmd.ExecuteScalar()?.ToString();
|
||||
|
||||
@@ -224,7 +246,7 @@ namespace Project.Web
|
||||
}
|
||||
|
||||
var cmd = new SqlCommand(@"
|
||||
UPDATE Board
|
||||
UPDATE EETGW_Board
|
||||
SET header = @header, cate = @cate, title = @title, contents = @contents
|
||||
WHERE idx = @idx", conn);
|
||||
|
||||
@@ -270,7 +292,7 @@ namespace Project.Web
|
||||
conn.Open();
|
||||
|
||||
// 권한 확인: 작성자 본인이거나 레벨 9 이상만 삭제 가능
|
||||
var checkCmd = new SqlCommand("SELECT wuid FROM Board WHERE idx = @idx", conn);
|
||||
var checkCmd = new SqlCommand("SELECT wuid FROM EETGW_Board WHERE idx = @idx", conn);
|
||||
checkCmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
|
||||
var originalWuid = checkCmd.ExecuteScalar()?.ToString();
|
||||
|
||||
@@ -279,7 +301,20 @@ namespace Project.Web
|
||||
return JsonConvert.SerializeObject(new { Success = false, Message = "삭제 권한이 없습니다." });
|
||||
}
|
||||
|
||||
var cmd = new SqlCommand("DELETE FROM Board WHERE idx = @idx", conn);
|
||||
// 답글 존재 여부 확인 (is_comment=false인 답글만)
|
||||
var replyCheckCmd = new SqlCommand(@"
|
||||
SELECT COUNT(*)
|
||||
FROM EETGW_Board
|
||||
WHERE root_idx = @idx AND depth > 0 AND (is_comment IS NULL OR is_comment = 0)", conn);
|
||||
replyCheckCmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
|
||||
var replyCount = (int)replyCheckCmd.ExecuteScalar();
|
||||
|
||||
if (replyCount > 0)
|
||||
{
|
||||
return JsonConvert.SerializeObject(new { Success = false, Message = "답글이 있는 게시글은 삭제할 수 없습니다. 답글을 먼저 삭제해주세요." });
|
||||
}
|
||||
|
||||
var cmd = new SqlCommand("DELETE FROM EETGW_Board WHERE idx = @idx", conn);
|
||||
cmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
|
||||
|
||||
var affected = cmd.ExecuteNonQuery();
|
||||
@@ -299,5 +334,150 @@ namespace Project.Web
|
||||
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 댓글 목록 조회 (is_comment=true만)
|
||||
/// </summary>
|
||||
public string Board_GetReplies(int rootIdx)
|
||||
{
|
||||
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, bidx, header, cate, title, contents, [file], guid, url, wuid, wdate, project, pidx, gcode, [close], remark,
|
||||
root_idx, depth, sort_order, thread_path, is_comment, reply_count,
|
||||
dbo.getUserName(wuid) AS wuid_name
|
||||
FROM EETGW_Board WITH (nolock)
|
||||
WHERE root_idx = @rootIdx AND depth > 0 AND is_comment = 1
|
||||
ORDER BY thread_path, wdate", conn);
|
||||
|
||||
cmd.Parameters.Add("@rootIdx", SqlDbType.Int).Value = rootIdx;
|
||||
|
||||
var list = new List<object>();
|
||||
using (var reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
list.Add(new
|
||||
{
|
||||
idx = reader.GetInt32(0),
|
||||
bidx = reader.GetInt32(1),
|
||||
header = reader.IsDBNull(2) ? "" : (reader.GetBoolean(2) ? "공지" : ""),
|
||||
cate = reader.IsDBNull(3) ? "" : reader.GetString(3),
|
||||
title = reader.IsDBNull(4) ? "" : reader.GetString(4),
|
||||
contents = reader.IsDBNull(5) ? "" : reader.GetString(5),
|
||||
file = reader.IsDBNull(6) ? "" : reader.GetString(6),
|
||||
guid = reader.IsDBNull(7) ? "" : reader.GetString(7),
|
||||
url = reader.IsDBNull(8) ? "" : reader.GetString(8),
|
||||
wuid = reader.IsDBNull(9) ? "" : reader.GetString(9),
|
||||
wdate = reader.IsDBNull(10) ? (DateTime?)null : reader.GetDateTime(10),
|
||||
project = reader.IsDBNull(11) ? "" : reader.GetInt32(11).ToString(),
|
||||
pidx = reader.IsDBNull(12) ? -1 : reader.GetInt32(12),
|
||||
gcode = reader.IsDBNull(13) ? "" : reader.GetString(13),
|
||||
close = reader.IsDBNull(14) ? false : reader.GetBoolean(14),
|
||||
remark = reader.IsDBNull(15) ? "" : reader.GetString(15),
|
||||
root_idx = reader.IsDBNull(16) ? (int?)null : reader.GetInt32(16),
|
||||
depth = reader.IsDBNull(17) ? 0 : reader.GetInt32(17),
|
||||
sort_order = reader.IsDBNull(18) ? 0 : reader.GetInt32(18),
|
||||
thread_path = reader.IsDBNull(19) ? "" : reader.GetString(19),
|
||||
is_comment = reader.IsDBNull(20) ? false : reader.GetBoolean(20),
|
||||
reply_count = reader.IsDBNull(21) ? 0 : reader.GetInt32(21),
|
||||
wuid_name = reader.IsDBNull(22) ? "" : reader.GetString(22)
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return JsonConvert.SerializeObject(new { Success = true, Data = list });
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 댓글/답글 추가
|
||||
/// </summary>
|
||||
public string Board_AddReply(int rootIdx, int pidx, string title, string contents, bool isComment)
|
||||
{
|
||||
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 parentCmd = new SqlCommand(@"
|
||||
SELECT bidx, gcode, depth, thread_path
|
||||
FROM EETGW_Board
|
||||
WHERE idx = @pidx", conn);
|
||||
parentCmd.Parameters.Add("@pidx", SqlDbType.Int).Value = pidx;
|
||||
|
||||
int bidx = 0;
|
||||
string gcode = "";
|
||||
int parentDepth = 0;
|
||||
string parentThreadPath = "";
|
||||
|
||||
using (var reader = parentCmd.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
bidx = reader.GetInt32(0);
|
||||
gcode = reader.IsDBNull(1) ? "" : reader.GetString(1);
|
||||
parentDepth = reader.IsDBNull(2) ? 0 : reader.GetInt32(2);
|
||||
parentThreadPath = reader.IsDBNull(3) ? "" : reader.GetString(3);
|
||||
}
|
||||
else
|
||||
{
|
||||
return JsonConvert.SerializeObject(new { Success = false, Message = "부모 글을 찾을 수 없습니다." });
|
||||
}
|
||||
}
|
||||
|
||||
// 댓글/답글 삽입
|
||||
var cmd = new SqlCommand(@"
|
||||
DECLARE @newIdx INT;
|
||||
INSERT INTO EETGW_Board (bidx, cate, title, contents, wuid, wdate, gcode, pidx, root_idx, depth, is_comment)
|
||||
VALUES (@bidx, NULL, @title, @contents, @wuid, GETDATE(), @gcode, @pidx, @rootIdx, @depth, @isComment);
|
||||
SET @newIdx = SCOPE_IDENTITY();
|
||||
UPDATE EETGW_Board SET thread_path = @parentThreadPath + '/' + CAST(@newIdx AS VARCHAR(20)) WHERE idx = @newIdx;
|
||||
SELECT @newIdx;", conn);
|
||||
|
||||
cmd.Parameters.Add("@bidx", SqlDbType.Int).Value = bidx;
|
||||
cmd.Parameters.Add("@title", SqlDbType.NVarChar).Value = string.IsNullOrEmpty(title) ? (object)DBNull.Value : title;
|
||||
cmd.Parameters.Add("@contents", SqlDbType.NVarChar).Value = contents;
|
||||
cmd.Parameters.Add("@wuid", SqlDbType.VarChar).Value = info.Login.no;
|
||||
cmd.Parameters.Add("@gcode", SqlDbType.VarChar).Value = string.IsNullOrEmpty(gcode) ? info.Login.gcode : gcode;
|
||||
cmd.Parameters.Add("@pidx", SqlDbType.Int).Value = pidx;
|
||||
cmd.Parameters.Add("@rootIdx", SqlDbType.Int).Value = rootIdx;
|
||||
cmd.Parameters.Add("@depth", SqlDbType.Int).Value = parentDepth + 1;
|
||||
cmd.Parameters.Add("@isComment", SqlDbType.Bit).Value = isComment;
|
||||
cmd.Parameters.Add("@parentThreadPath", SqlDbType.VarChar).Value = parentThreadPath;
|
||||
|
||||
var newIdx = Convert.ToInt32(cmd.ExecuteScalar());
|
||||
|
||||
return JsonConvert.SerializeObject(new { Success = true, Message = "댓글이 등록되었습니다.", Data = new { idx = newIdx } });
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
166
Project/Web/MachineBridge/MachineBridge.HolidayRequest.cs
Normal file
166
Project/Web/MachineBridge/MachineBridge.HolidayRequest.cs
Normal file
@@ -0,0 +1,166 @@
|
||||
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
|
||||
{
|
||||
#region HolidayRequest API (휴가/외출 신청)
|
||||
|
||||
/// <summary>
|
||||
/// 휴가/외출 신청 목록 조회
|
||||
/// </summary>
|
||||
public string HolidayRequest_GetList(string startDate, string endDate, string userId, int userLevel)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 권한에 따른 uid 필터링
|
||||
// userLevel < 5: 본인만 조회
|
||||
// userLevel >= 5: userId가 '%'이면 전체, 특정 uid면 해당 사용자만
|
||||
var uidFilter = userLevel < 5 ? info.Login.no : (string.IsNullOrEmpty(userId) || userId == "%" ? "%" : userId);
|
||||
|
||||
var sql = @"
|
||||
SELECT
|
||||
hr.idx, hr.gcode, hr.uid, hr.cate, hr.sdate, hr.edate, hr.Remark, hr.wuid, hr.wdate,
|
||||
u.dept, u.name, u.grade, u.tel, u.processs,
|
||||
hr.Response, hr.conf, hr.HolyReason, hr.HolyBackup, hr.HolyLocation,
|
||||
hr.HolyDays, hr.HolyTimes, hr.sendmail, hr.stime, hr.etime, hr.conf_id, hr.conf_time
|
||||
FROM EETGW_HolydayRequest hr WITH (nolock)
|
||||
LEFT OUTER JOIN vGroupUser u ON hr.uid = u.id AND hr.gcode = u.gcode
|
||||
WHERE hr.gcode = @gcode
|
||||
AND hr.sdate >= @startDate
|
||||
AND hr.sdate <= @endDate
|
||||
AND hr.uid LIKE @uid
|
||||
ORDER BY hr.conf, hr.sdate DESC";
|
||||
|
||||
var cs = Properties.Settings.Default.gwcs;
|
||||
using (var cn = new SqlConnection(cs))
|
||||
using (var cmd = new SqlCommand(sql, cn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@gcode", info.Login.gcode);
|
||||
cmd.Parameters.AddWithValue("@startDate", startDate);
|
||||
cmd.Parameters.AddWithValue("@endDate", endDate);
|
||||
cmd.Parameters.AddWithValue("@uid", uidFilter);
|
||||
|
||||
using (var da = new SqlDataAdapter(cmd))
|
||||
{
|
||||
var dt = new DataTable();
|
||||
da.Fill(dt);
|
||||
|
||||
// 승인/미승인 합계 계산
|
||||
decimal sumApprovedDays = 0;
|
||||
decimal sumApprovedTimes = 0;
|
||||
decimal sumPendingDays = 0;
|
||||
decimal sumPendingTimes = 0;
|
||||
|
||||
foreach (DataRow row in dt.Rows)
|
||||
{
|
||||
var conf = Convert.ToInt32(row["conf"]);
|
||||
var days = row["HolyDays"] != DBNull.Value ? Convert.ToDecimal(row["HolyDays"]) : 0;
|
||||
var times = row["HolyTimes"] != DBNull.Value ? Convert.ToDecimal(row["HolyTimes"]) : 0;
|
||||
|
||||
if (conf == 1)
|
||||
{
|
||||
sumApprovedDays += days;
|
||||
sumApprovedTimes += times;
|
||||
}
|
||||
else
|
||||
{
|
||||
sumPendingDays += days;
|
||||
sumPendingTimes += times;
|
||||
}
|
||||
}
|
||||
|
||||
return JsonConvert.SerializeObject(new
|
||||
{
|
||||
Success = true,
|
||||
Data = dt,
|
||||
Summary = new
|
||||
{
|
||||
ApprovedDays = sumApprovedDays,
|
||||
ApprovedTimes = sumApprovedTimes,
|
||||
PendingDays = sumPendingDays,
|
||||
PendingTimes = sumPendingTimes
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 휴가/외출 신청 저장
|
||||
/// </summary>
|
||||
public string HolidayRequest_Save(int idx, string uid, string cate, string sdate, string edate,
|
||||
string remark, string response, int conf, string holyReason, string holyBackup,
|
||||
string holyLocation, decimal holyDays, decimal holyTimes, string stime, string etime)
|
||||
{
|
||||
try
|
||||
{
|
||||
var cs = Properties.Settings.Default.gwcs;
|
||||
using (var cn = new SqlConnection(cs))
|
||||
{
|
||||
cn.Open();
|
||||
var sql = "";
|
||||
|
||||
if (idx == 0) // INSERT
|
||||
{
|
||||
sql = @"INSERT INTO EETGW_HolydayRequest
|
||||
(gcode, uid, cate, sdate, edate, conf, Remark, wuid, wdate, Response,
|
||||
HolyReason, HolyBackup, HolyLocation, HolyDays, HolyTimes, stime, etime)
|
||||
VALUES
|
||||
(@gcode, @uid, @cate, @sdate, @edate, @conf, @remark, @wuid, GETDATE(), @response,
|
||||
@holyReason, @holyBackup, @holyLocation, @holyDays, @holyTimes, @stime, @etime)";
|
||||
}
|
||||
else // UPDATE
|
||||
{
|
||||
sql = @"UPDATE EETGW_HolydayRequest
|
||||
SET uid = @uid, cate = @cate, sdate = @sdate, edate = @edate, conf = @conf,
|
||||
Remark = @remark, Response = @response, HolyReason = @holyReason,
|
||||
HolyBackup = @holyBackup, HolyLocation = @holyLocation,
|
||||
HolyDays = @holyDays, HolyTimes = @holyTimes, stime = @stime, etime = @etime
|
||||
WHERE idx = @idx AND gcode = @gcode";
|
||||
}
|
||||
|
||||
using (var cmd = new SqlCommand(sql, cn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@idx", idx);
|
||||
cmd.Parameters.AddWithValue("@gcode", info.Login.gcode);
|
||||
cmd.Parameters.AddWithValue("@uid", uid);
|
||||
cmd.Parameters.AddWithValue("@cate", cate);
|
||||
cmd.Parameters.AddWithValue("@sdate", sdate);
|
||||
cmd.Parameters.AddWithValue("@edate", edate);
|
||||
cmd.Parameters.AddWithValue("@conf", conf);
|
||||
cmd.Parameters.AddWithValue("@remark", remark ?? "");
|
||||
cmd.Parameters.AddWithValue("@wuid", info.Login.no); // 작성자
|
||||
cmd.Parameters.AddWithValue("@response", response ?? "");
|
||||
cmd.Parameters.AddWithValue("@holyReason", holyReason ?? "");
|
||||
cmd.Parameters.AddWithValue("@holyBackup", holyBackup ?? "");
|
||||
cmd.Parameters.AddWithValue("@holyLocation", holyLocation ?? "");
|
||||
cmd.Parameters.AddWithValue("@holyDays", holyDays);
|
||||
cmd.Parameters.AddWithValue("@holyTimes", holyTimes);
|
||||
cmd.Parameters.AddWithValue("@stime", stime ?? "");
|
||||
cmd.Parameters.AddWithValue("@etime", etime ?? "");
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
return JsonConvert.SerializeObject(new { Success = true, Message = "저장되었습니다." });
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
320
Project/Web/MachineBridge/MachineBridge.License.cs
Normal file
320
Project/Web/MachineBridge/MachineBridge.License.cs
Normal 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 });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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}" });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
247
Project/Web/MachineBridge/MachineBridge.PartList.cs
Normal file
247
Project/Web/MachineBridge/MachineBridge.PartList.cs
Normal 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
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -227,8 +227,15 @@ namespace Project.Web
|
||||
FROM Projects WITH (nolock)
|
||||
WHERE gcode = @gcode
|
||||
AND (name LIKE @keyword OR CAST(idx AS VARCHAR) LIKE @keyword)
|
||||
AND status NOT IN ('보류', '취소', '완료(보고)')
|
||||
ORDER BY status DESC, pdate DESC, name";
|
||||
AND status NOT IN ('보류', '취소')
|
||||
ORDER BY
|
||||
CASE
|
||||
WHEN status = '진행' THEN 1
|
||||
WHEN status = '준비' THEN 2
|
||||
WHEN status = '완료(보고)' THEN 3
|
||||
ELSE 4
|
||||
END,
|
||||
pdate DESC, name";
|
||||
|
||||
using (var cn = new SqlConnection(cs))
|
||||
using (var cmd = new SqlCommand(sqlProjects, cn))
|
||||
@@ -599,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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -599,6 +599,7 @@ namespace Project.Web
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
// ===== JobReport API (JobReport 뷰/테이블) =====
|
||||
case "JOBREPORT_GET_LIST":
|
||||
{
|
||||
@@ -607,9 +608,10 @@ namespace Project.Web
|
||||
string uid = json.uid ?? "";
|
||||
string cate = json.cate ?? ""; // 사용안함 (호환성)
|
||||
string searchKey = json.searchKey ?? "";
|
||||
string requestId = json.requestId;
|
||||
Console.WriteLine($"[WS] JOBREPORT_GET_LIST: sd={sd}, ed={ed}, uid={uid}, searchKey={searchKey}");
|
||||
string result = _bridge.Jobreport_GetList(sd, ed, uid, cate, searchKey);
|
||||
var response = new { type = "JOBREPORT_LIST_DATA", data = JsonConvert.DeserializeObject(result) };
|
||||
var response = new { type = "JOBREPORT_LIST_DATA", data = JsonConvert.DeserializeObject(result), requestId = requestId };
|
||||
await Send(socket, JsonConvert.SerializeObject(response));
|
||||
}
|
||||
break;
|
||||
@@ -952,6 +954,28 @@ namespace Project.Web
|
||||
}
|
||||
break;
|
||||
|
||||
case "BOARD_GET_REPLIES":
|
||||
{
|
||||
int rootIdx = json.rootIdx ?? 0;
|
||||
string result = _bridge.Board_GetReplies(rootIdx);
|
||||
var response = new { type = "BOARD_REPLIES_DATA", data = JsonConvert.DeserializeObject(result) };
|
||||
await Send(socket, JsonConvert.SerializeObject(response));
|
||||
}
|
||||
break;
|
||||
|
||||
case "BOARD_ADD_REPLY":
|
||||
{
|
||||
int rootIdx = json.rootIdx ?? 0;
|
||||
int pidx = json.pidx ?? 0;
|
||||
string title = json.title ?? "";
|
||||
string contents = json.contents ?? "";
|
||||
bool isComment = json.isComment ?? false;
|
||||
string result = _bridge.Board_AddReply(rootIdx, pidx, title, contents, isComment);
|
||||
var response = new { type = "BOARD_REPLY_ADDED", data = JsonConvert.DeserializeObject(result) };
|
||||
await Send(socket, JsonConvert.SerializeObject(response));
|
||||
}
|
||||
break;
|
||||
|
||||
// ===== Mail API (메일 발신 내역) =====
|
||||
case "MAIL_GET_LIST":
|
||||
{
|
||||
@@ -964,6 +988,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":
|
||||
{
|
||||
@@ -1012,6 +1201,43 @@ namespace Project.Web
|
||||
}
|
||||
break;
|
||||
|
||||
// ===== HolidayRequest API (휴가/외출 신청) =====
|
||||
case "HOLIDAY_REQUEST_GET_LIST":
|
||||
{
|
||||
string startDate = json.startDate ?? "";
|
||||
string endDate = json.endDate ?? "";
|
||||
string userId = json.userId ?? "";
|
||||
int userLevel = json.userLevel ?? 0;
|
||||
string result = _bridge.HolidayRequest_GetList(startDate, endDate, userId, userLevel);
|
||||
var response = new { type = "HOLIDAY_REQUEST_LIST_DATA", data = JsonConvert.DeserializeObject(result) };
|
||||
await Send(socket, JsonConvert.SerializeObject(response));
|
||||
}
|
||||
break;
|
||||
|
||||
case "HOLIDAY_REQUEST_SAVE":
|
||||
{
|
||||
int idx = json.idx ?? 0;
|
||||
string uid = json.uid ?? "";
|
||||
string cate = json.cate ?? "";
|
||||
string sdate = json.sdate ?? "";
|
||||
string edate = json.edate ?? "";
|
||||
string remark = json.remark ?? "";
|
||||
string responseMsg = json.response ?? "";
|
||||
int conf = json.conf ?? 0;
|
||||
string holyReason = json.holyReason ?? "";
|
||||
string holyBackup = json.holyBackup ?? "";
|
||||
string holyLocation = json.holyLocation ?? "";
|
||||
decimal holyDays = json.holyDays ?? 0;
|
||||
decimal holyTimes = json.holyTimes ?? 0;
|
||||
string stime = json.stime ?? "";
|
||||
string etime = json.etime ?? "";
|
||||
|
||||
string result = _bridge.HolidayRequest_Save(idx, uid, cate, sdate, edate, remark, responseMsg, conf, holyReason, holyBackup, holyLocation, holyDays, holyTimes, stime, etime);
|
||||
var response = new { type = "HOLIDAY_REQUEST_SAVED", data = JsonConvert.DeserializeObject(result) };
|
||||
await Send(socket, JsonConvert.SerializeObject(response));
|
||||
}
|
||||
break;
|
||||
|
||||
// ===== MailForm API (메일양식) =====
|
||||
case "MAILFORM_GET_LIST":
|
||||
{
|
||||
@@ -1273,6 +1499,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;
|
||||
|
||||
@@ -3,26 +3,16 @@
|
||||
<configSections>
|
||||
</configSections>
|
||||
<connectionStrings>
|
||||
<add name="Project.Properties.Settings.gwcs" connectionString="Data Source=K4FASQL.kr.ds.amkor.com,50150;Initial Catalog=EE;Persist Security Info=True;User ID=eeadm;Password=uJnU8a8q&DJ+ug-D;Encrypt=False;TrustServerCertificate=True"
|
||||
providerName="System.Data.SqlClient" />
|
||||
<add name="EEEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string="data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework"TrustServerCertificate=True"
|
||||
providerName="System.Data.EntityClient" />
|
||||
<add name="EEEntities1" connectionString="metadata=res://*/ModelMain.csdl|res://*/ModelMain.ssdl|res://*/ModelMain.msl;provider=System.Data.SqlClient;provider connection string="data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;user id=eeadm;password=uJnU8a8q&DJ+ug-D!;connect timeout=30;encrypt=False;trustservercertificate=True;MultipleActiveResultSets=True;App=EntityFramework""
|
||||
providerName="System.Data.EntityClient" />
|
||||
<add name="EEEntitiesMain" connectionString="metadata=res://*/AdoNetEFMain.csdl|res://*/AdoNetEFMain.ssdl|res://*/AdoNetEFMain.msl;provider=System.Data.SqlClient;provider connection string="data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;user id=eeadm;password=uJnU8a8q&DJ+ug-D!;connect timeout=30;encrypt=False;trustservercertificate=True;MultipleActiveResultSets=True;App=EntityFramework""
|
||||
providerName="System.Data.EntityClient" />
|
||||
<add name="S1ACCESS300Entities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string="data source=10.141.18.50;initial catalog=S1ACCESS300;persist security info=True;user id=amkoruser;password=AmkorUser!;MultipleActiveResultSets=True;App=EntityFramework"TrustServerCertificate=True"
|
||||
providerName="System.Data.EntityClient" />
|
||||
<add name="EEEntitiesPurchase" connectionString="metadata=res://*/ModelPurchase.csdl|res://*/ModelPurchase.ssdl|res://*/ModelPurchase.msl;provider=System.Data.SqlClient;provider connection string="data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework"TrustServerCertificate=True"
|
||||
providerName="System.Data.EntityClient" />
|
||||
<add name="EEEntitiesCommon" connectionString="metadata=res://*/ModelCommon.csdl|res://*/ModelCommon.ssdl|res://*/ModelCommon.msl;provider=System.Data.SqlClient;provider connection string="data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework"TrustServerCertificate=True"
|
||||
providerName="System.Data.EntityClient" />
|
||||
<add name="EEEntitiesJobreport" connectionString="metadata=res://*/ModelJobreport.csdl|res://*/ModelJobreport.ssdl|res://*/ModelJobreport.msl;provider=System.Data.SqlClient;provider connection string="data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework"TrustServerCertificate=True"
|
||||
providerName="System.Data.EntityClient" />
|
||||
<add name="EEEntitiesProject" connectionString="metadata=res://*/ModelProject.csdl|res://*/ModelProject.ssdl|res://*/ModelProject.msl;provider=System.Data.SqlClient;provider connection string="data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework"TrustServerCertificate=True"
|
||||
providerName="System.Data.EntityClient" />
|
||||
<add name="Project.Properties.Settings.CS" connectionString="Data Source=K4FASQL.kr.ds.amkor.com,50150;Initial Catalog=EE;Persist Security Info=True;User ID=eeadm;Password=uJnU8a8q&DJ+ug-D;Encrypt=False;TrustServerCertificate=True"
|
||||
providerName="System.Data.SqlClient" />
|
||||
<add name="Project.Properties.Settings.gwcs" connectionString="Data Source=K4FASQL.kr.ds.amkor.com,50150;Initial Catalog=EE;Persist Security Info=True;User ID=eeadm;Password=uJnU8a8q&DJ+ug-D;Encrypt=False;TrustServerCertificate=True" providerName="System.Data.SqlClient" />
|
||||
<add name="EEEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string="data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework"TrustServerCertificate=True" providerName="System.Data.EntityClient" />
|
||||
<add name="EEEntities1" connectionString="metadata=res://*/ModelMain.csdl|res://*/ModelMain.ssdl|res://*/ModelMain.msl;provider=System.Data.SqlClient;provider connection string="data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;user id=eeadm;password=uJnU8a8q&DJ+ug-D!;connect timeout=30;encrypt=False;trustservercertificate=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
|
||||
<add name="EEEntitiesMain" connectionString="metadata=res://*/AdoNetEFMain.csdl|res://*/AdoNetEFMain.ssdl|res://*/AdoNetEFMain.msl;provider=System.Data.SqlClient;provider connection string="data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;user id=eeadm;password=uJnU8a8q&DJ+ug-D!;connect timeout=30;encrypt=False;trustservercertificate=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
|
||||
<add name="S1ACCESS300Entities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string="data source=10.141.18.50;initial catalog=S1ACCESS300;persist security info=True;user id=amkoruser;password=AmkorUser!;MultipleActiveResultSets=True;App=EntityFramework"TrustServerCertificate=True" providerName="System.Data.EntityClient" />
|
||||
<add name="EEEntitiesPurchase" connectionString="metadata=res://*/ModelPurchase.csdl|res://*/ModelPurchase.ssdl|res://*/ModelPurchase.msl;provider=System.Data.SqlClient;provider connection string="data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework"TrustServerCertificate=True" providerName="System.Data.EntityClient" />
|
||||
<add name="EEEntitiesCommon" connectionString="metadata=res://*/ModelCommon.csdl|res://*/ModelCommon.ssdl|res://*/ModelCommon.msl;provider=System.Data.SqlClient;provider connection string="data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework"TrustServerCertificate=True" providerName="System.Data.EntityClient" />
|
||||
<add name="EEEntitiesJobreport" connectionString="metadata=res://*/ModelJobreport.csdl|res://*/ModelJobreport.ssdl|res://*/ModelJobreport.msl;provider=System.Data.SqlClient;provider connection string="data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework"TrustServerCertificate=True" providerName="System.Data.EntityClient" />
|
||||
<add name="EEEntitiesProject" connectionString="metadata=res://*/ModelProject.csdl|res://*/ModelProject.ssdl|res://*/ModelProject.msl;provider=System.Data.SqlClient;provider connection string="data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework"TrustServerCertificate=True" providerName="System.Data.EntityClient" />
|
||||
<add name="Project.Properties.Settings.CS" connectionString="Data Source=K4FASQL.kr.ds.amkor.com,50150;Initial Catalog=EE;Persist Security Info=True;User ID=eeadm;Password=uJnU8a8q&DJ+ug-D;Encrypt=False;TrustServerCertificate=True" providerName="System.Data.SqlClient" />
|
||||
</connectionStrings>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
|
||||
6451
Project/dsMSSQL.Designer.cs
generated
6451
Project/dsMSSQL.Designer.cs
generated
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -4,29 +4,28 @@
|
||||
Changes to this file may cause incorrect behavior and will be lost if
|
||||
the code is regenerated.
|
||||
</autogenerated>-->
|
||||
<DiagramLayout xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ex:showrelationlabel="False" ViewPortX="137" ViewPortY="22" xmlns:ex="urn:schemas-microsoft-com:xml-msdatasource-layout-extended" xmlns="urn:schemas-microsoft-com:xml-msdatasource-layout">
|
||||
<DiagramLayout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ex:showrelationlabel="False" ViewPortX="137" ViewPortY="32" xmlns:ex="urn:schemas-microsoft-com:xml-msdatasource-layout-extended" xmlns="urn:schemas-microsoft-com:xml-msdatasource-layout">
|
||||
<Shapes>
|
||||
<Shape ID="DesignTable:Users" ZOrder="13" X="997" Y="61" Height="381" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:Projects" ZOrder="11" X="208" Y="1" Height="286" Width="191" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="235" />
|
||||
<Shape ID="DesignTable:Items" ZOrder="12" X="74" Y="218" Height="267" Width="177" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="216" />
|
||||
<Shape ID="DesignTable:Users" ZOrder="12" X="997" Y="61" Height="381" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:Projects" ZOrder="10" X="208" Y="1" Height="286" Width="191" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="235" />
|
||||
<Shape ID="DesignTable:Items" ZOrder="11" X="74" Y="218" Height="267" Width="177" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="216" />
|
||||
<Shape ID="DesignTable:Inventory" ZOrder="2" X="643" Y="66" Height="324" Width="234" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:LineCode" ZOrder="3" X="586" Y="429" Height="267" Width="199" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="216" />
|
||||
<Shape ID="DesignTable:UserGroup" ZOrder="4" X="430" Y="385" Height="229" Width="208" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="178" />
|
||||
<Shape ID="DesignTable:EETGW_GroupUser" ZOrder="8" X="12" Y="283" Height="324" Width="255" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="235" />
|
||||
<Shape ID="DesignTable:vGroupUser" ZOrder="14" X="938" Y="-5" Height="343" Width="227" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:JobReport" ZOrder="9" X="1243" Y="724" Height="400" Width="292" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:MailData" ZOrder="6" X="434" Y="28" Height="381" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:MailAuto" ZOrder="7" X="799" Y="334" Height="324" Width="208" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="140" />
|
||||
<Shape ID="DesignTable:BoardFAQ" ZOrder="5" X="403" Y="247" Height="305" Width="204" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:EETGW_LoginInfo" ZOrder="15" X="1152" Y="566" Height="210" Width="248" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="159" />
|
||||
<Shape ID="DesignTable:EETGW_GroupUser" ZOrder="7" X="12" Y="283" Height="324" Width="255" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="235" />
|
||||
<Shape ID="DesignTable:vGroupUser" ZOrder="13" X="938" Y="-5" Height="343" Width="227" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:JobReport" ZOrder="8" X="1243" Y="724" Height="400" Width="292" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:MailData" ZOrder="5" X="434" Y="28" Height="381" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:MailAuto" ZOrder="6" X="799" Y="334" Height="324" Width="208" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="140" />
|
||||
<Shape ID="DesignTable:EETGW_LoginInfo" ZOrder="14" X="1152" Y="566" Height="210" Width="248" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="159" />
|
||||
<Shape ID="DesignTable:EETGW_JobReport_AutoInput" ZOrder="1" X="1184" Y="520" Height="324" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:Purchase" ZOrder="16" X="1327" Y="944" Height="305" Width="197" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:vPurchase" ZOrder="21" X="1237" Y="1036" Height="324" Width="204" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:HolidayLIst" ZOrder="20" X="1218" Y="991" Height="191" Width="210" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="140" />
|
||||
<Shape ID="DesignTable:vFindSID" ZOrder="19" X="1538" Y="959" Height="305" Width="196" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:vJobReportForUser" ZOrder="18" X="1531" Y="972" Height="343" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:Customs" ZOrder="17" X="1362" Y="291" Height="305" Width="195" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignSources:QueriesTableAdapter" ZOrder="10" X="673" Y="84" Height="68" Width="218" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="64" />
|
||||
<Shape ID="DesignTable:Purchase" ZOrder="15" X="1327" Y="944" Height="305" Width="197" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:vPurchase" ZOrder="20" X="1237" Y="1036" Height="324" Width="204" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:HolidayLIst" ZOrder="19" X="1218" Y="991" Height="191" Width="210" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="140" />
|
||||
<Shape ID="DesignTable:vFindSID" ZOrder="18" X="1538" Y="959" Height="305" Width="196" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:vJobReportForUser" ZOrder="17" X="1531" Y="972" Height="343" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:Customs" ZOrder="16" X="1362" Y="291" Height="305" Width="195" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignSources:QueriesTableAdapter" ZOrder="9" X="673" Y="84" Height="68" Width="218" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="64" />
|
||||
</Shapes>
|
||||
<Connectors />
|
||||
</DiagramLayout>
|
||||
1438
Project/dsProjects.Designer.cs
generated
1438
Project/dsProjects.Designer.cs
generated
File diff suppressed because it is too large
Load Diff
284
Project/fMain.Designer.cs
generated
284
Project/fMain.Designer.cs
generated
@@ -78,9 +78,6 @@
|
||||
this.업무분류및형태설정ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.자동입력ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.업무현황전자실ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.교육목록ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.비용절감ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.라이선스ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.mn_jago = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.관리ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
@@ -103,23 +100,6 @@
|
||||
this.근태마감ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.대체시간이월ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.personalInventoryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.mn_docu = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.메모장ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.패치내역ToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.메일내역ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.minutesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.requestITemToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.freeBoardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.bugReportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.todoListToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.메일전송ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.기타ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.품목검색ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.대쉬보드ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolStripMenuItem17 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.webview2TestToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.즐겨찾기ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.btDev = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.purchaseImportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
@@ -133,17 +113,11 @@
|
||||
this.addSIdDataToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.계정목록ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.그룹정보ToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.임의테이블조작ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.mailBackupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.메일자동발신테스트ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.아이템비활성화하기ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.sPR설정ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolStripMenuItem13 = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.프로젝트스케쥴담당자사번업데이트ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.버젼확인ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.설명서ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.tabControl1 = new System.Windows.Forms.TabControl();
|
||||
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
|
||||
this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripMenuItem();
|
||||
@@ -246,12 +220,8 @@
|
||||
this.btSetting,
|
||||
this.commonToolStripMenuItem,
|
||||
this.managementToolStripMenuItem,
|
||||
this.mn_docu,
|
||||
this.기타ToolStripMenuItem,
|
||||
this.즐겨찾기ToolStripMenuItem,
|
||||
this.btDev,
|
||||
this.버젼확인ToolStripMenuItem,
|
||||
this.설명서ToolStripMenuItem});
|
||||
this.btDev});
|
||||
this.menuStrip1.Location = new System.Drawing.Point(1, 1);
|
||||
this.menuStrip1.Name = "menuStrip1";
|
||||
this.menuStrip1.Size = new System.Drawing.Size(1094, 27);
|
||||
@@ -315,7 +285,7 @@
|
||||
//
|
||||
this.userAccountToolStripMenuItem.ForeColor = System.Drawing.Color.Blue;
|
||||
this.userAccountToolStripMenuItem.Name = "userAccountToolStripMenuItem";
|
||||
this.userAccountToolStripMenuItem.Size = new System.Drawing.Size(152, 24);
|
||||
this.userAccountToolStripMenuItem.Size = new System.Drawing.Size(134, 24);
|
||||
this.userAccountToolStripMenuItem.Text = "계정정보";
|
||||
this.userAccountToolStripMenuItem.Click += new System.EventHandler(this.userAccountToolStripMenuItem_Click);
|
||||
//
|
||||
@@ -323,7 +293,7 @@
|
||||
//
|
||||
this.myAccouserToolStripMenuItem.ForeColor = System.Drawing.Color.Blue;
|
||||
this.myAccouserToolStripMenuItem.Name = "myAccouserToolStripMenuItem";
|
||||
this.myAccouserToolStripMenuItem.Size = new System.Drawing.Size(152, 24);
|
||||
this.myAccouserToolStripMenuItem.Size = new System.Drawing.Size(134, 24);
|
||||
this.myAccouserToolStripMenuItem.Text = "계정목록";
|
||||
this.myAccouserToolStripMenuItem.Click += new System.EventHandler(this.myAccouserToolStripMenuItem_Click);
|
||||
//
|
||||
@@ -331,7 +301,7 @@
|
||||
//
|
||||
this.권한설정ToolStripMenuItem.ForeColor = System.Drawing.Color.Blue;
|
||||
this.권한설정ToolStripMenuItem.Name = "권한설정ToolStripMenuItem";
|
||||
this.권한설정ToolStripMenuItem.Size = new System.Drawing.Size(152, 24);
|
||||
this.권한설정ToolStripMenuItem.Size = new System.Drawing.Size(134, 24);
|
||||
this.권한설정ToolStripMenuItem.Text = "권한설정";
|
||||
this.권한설정ToolStripMenuItem.Click += new System.EventHandler(this.권한설정ToolStripMenuItem_Click);
|
||||
//
|
||||
@@ -339,13 +309,13 @@
|
||||
//
|
||||
this.toolStripMenuItem12.ForeColor = System.Drawing.Color.Blue;
|
||||
this.toolStripMenuItem12.Name = "toolStripMenuItem12";
|
||||
this.toolStripMenuItem12.Size = new System.Drawing.Size(149, 6);
|
||||
this.toolStripMenuItem12.Size = new System.Drawing.Size(131, 6);
|
||||
//
|
||||
// 그룹정보ToolStripMenuItem
|
||||
//
|
||||
this.그룹정보ToolStripMenuItem.ForeColor = System.Drawing.Color.Blue;
|
||||
this.그룹정보ToolStripMenuItem.Name = "그룹정보ToolStripMenuItem";
|
||||
this.그룹정보ToolStripMenuItem.Size = new System.Drawing.Size(152, 24);
|
||||
this.그룹정보ToolStripMenuItem.Size = new System.Drawing.Size(134, 24);
|
||||
this.그룹정보ToolStripMenuItem.Text = "그룹정보";
|
||||
this.그룹정보ToolStripMenuItem.Click += new System.EventHandler(this.그룹정보ToolStripMenuItem_Click);
|
||||
//
|
||||
@@ -378,9 +348,6 @@
|
||||
this.mn_purchase,
|
||||
this.mn_project,
|
||||
this.mn_dailyhistory,
|
||||
this.업무현황전자실ToolStripMenuItem,
|
||||
this.교육목록ToolStripMenuItem,
|
||||
this.비용절감ToolStripMenuItem,
|
||||
this.라이선스ToolStripMenuItem,
|
||||
this.mn_jago,
|
||||
this.휴가관리ToolStripMenuItem,
|
||||
@@ -519,7 +486,6 @@
|
||||
this.mn_dailyhistory.Name = "mn_dailyhistory";
|
||||
this.mn_dailyhistory.Size = new System.Drawing.Size(203, 24);
|
||||
this.mn_dailyhistory.Text = "업무관리";
|
||||
this.mn_dailyhistory.Click += new System.EventHandler(this.업무일지ToolStripMenuItem1_Click);
|
||||
//
|
||||
// 목록ToolStripMenuItem1
|
||||
//
|
||||
@@ -559,31 +525,6 @@
|
||||
this.toolStripMenuItem2.Name = "toolStripMenuItem2";
|
||||
this.toolStripMenuItem2.Size = new System.Drawing.Size(231, 6);
|
||||
//
|
||||
// 업무현황전자실ToolStripMenuItem
|
||||
//
|
||||
this.업무현황전자실ToolStripMenuItem.ForeColor = System.Drawing.Color.Red;
|
||||
this.업무현황전자실ToolStripMenuItem.Name = "업무현황전자실ToolStripMenuItem";
|
||||
this.업무현황전자실ToolStripMenuItem.Size = new System.Drawing.Size(203, 24);
|
||||
this.업무현황전자실ToolStripMenuItem.Text = "업무현황(전자실)";
|
||||
this.업무현황전자실ToolStripMenuItem.Visible = false;
|
||||
this.업무현황전자실ToolStripMenuItem.Click += new System.EventHandler(this.업무현황전자실ToolStripMenuItem_Click);
|
||||
//
|
||||
// 교육목록ToolStripMenuItem
|
||||
//
|
||||
this.교육목록ToolStripMenuItem.Name = "교육목록ToolStripMenuItem";
|
||||
this.교육목록ToolStripMenuItem.Size = new System.Drawing.Size(203, 24);
|
||||
this.교육목록ToolStripMenuItem.Text = "교육목록";
|
||||
this.교육목록ToolStripMenuItem.Click += new System.EventHandler(this.교육목록ToolStripMenuItem_Click);
|
||||
//
|
||||
// 비용절감ToolStripMenuItem
|
||||
//
|
||||
this.비용절감ToolStripMenuItem.ForeColor = System.Drawing.Color.Black;
|
||||
this.비용절감ToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("비용절감ToolStripMenuItem.Image")));
|
||||
this.비용절감ToolStripMenuItem.Name = "비용절감ToolStripMenuItem";
|
||||
this.비용절감ToolStripMenuItem.Size = new System.Drawing.Size(203, 24);
|
||||
this.비용절감ToolStripMenuItem.Text = "비용절감";
|
||||
this.비용절감ToolStripMenuItem.Click += new System.EventHandler(this.비용절감ToolStripMenuItem_Click);
|
||||
//
|
||||
// 라이선스ToolStripMenuItem
|
||||
//
|
||||
this.라이선스ToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("라이선스ToolStripMenuItem.Image")));
|
||||
@@ -760,146 +701,6 @@
|
||||
this.personalInventoryToolStripMenuItem.Visible = false;
|
||||
this.personalInventoryToolStripMenuItem.Click += new System.EventHandler(this.personalInventoryToolStripMenuItem_Click);
|
||||
//
|
||||
// mn_docu
|
||||
//
|
||||
this.mn_docu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.메모장ToolStripMenuItem,
|
||||
this.toolStripMenuItem4,
|
||||
this.패치내역ToolStripMenuItem1,
|
||||
this.메일내역ToolStripMenuItem,
|
||||
this.toolStripMenuItem3,
|
||||
this.minutesToolStripMenuItem,
|
||||
this.requestITemToolStripMenuItem,
|
||||
this.freeBoardToolStripMenuItem,
|
||||
this.bugReportToolStripMenuItem,
|
||||
this.todoListToolStripMenuItem,
|
||||
this.메일전송ToolStripMenuItem});
|
||||
this.mn_docu.Image = ((System.Drawing.Image)(resources.GetObject("mn_docu.Image")));
|
||||
this.mn_docu.Name = "mn_docu";
|
||||
this.mn_docu.Size = new System.Drawing.Size(65, 23);
|
||||
this.mn_docu.Text = "문서";
|
||||
//
|
||||
// 메모장ToolStripMenuItem
|
||||
//
|
||||
this.메모장ToolStripMenuItem.Name = "메모장ToolStripMenuItem";
|
||||
this.메모장ToolStripMenuItem.Size = new System.Drawing.Size(149, 24);
|
||||
this.메모장ToolStripMenuItem.Text = "메모장";
|
||||
this.메모장ToolStripMenuItem.Click += new System.EventHandler(this.메모장ToolStripMenuItem_Click);
|
||||
//
|
||||
// toolStripMenuItem4
|
||||
//
|
||||
this.toolStripMenuItem4.Name = "toolStripMenuItem4";
|
||||
this.toolStripMenuItem4.Size = new System.Drawing.Size(146, 6);
|
||||
//
|
||||
// 패치내역ToolStripMenuItem1
|
||||
//
|
||||
this.패치내역ToolStripMenuItem1.Name = "패치내역ToolStripMenuItem1";
|
||||
this.패치내역ToolStripMenuItem1.Size = new System.Drawing.Size(149, 24);
|
||||
this.패치내역ToolStripMenuItem1.Text = "패치 내역";
|
||||
this.패치내역ToolStripMenuItem1.Click += new System.EventHandler(this.패치내역ToolStripMenuItem1_Click);
|
||||
//
|
||||
// 메일내역ToolStripMenuItem
|
||||
//
|
||||
this.메일내역ToolStripMenuItem.Name = "메일내역ToolStripMenuItem";
|
||||
this.메일내역ToolStripMenuItem.Size = new System.Drawing.Size(149, 24);
|
||||
this.메일내역ToolStripMenuItem.Text = "메일 내역";
|
||||
this.메일내역ToolStripMenuItem.Click += new System.EventHandler(this.메일내역ToolStripMenuItem_Click);
|
||||
//
|
||||
// toolStripMenuItem3
|
||||
//
|
||||
this.toolStripMenuItem3.Name = "toolStripMenuItem3";
|
||||
this.toolStripMenuItem3.Size = new System.Drawing.Size(146, 6);
|
||||
//
|
||||
// minutesToolStripMenuItem
|
||||
//
|
||||
this.minutesToolStripMenuItem.ForeColor = System.Drawing.Color.HotPink;
|
||||
this.minutesToolStripMenuItem.Name = "minutesToolStripMenuItem";
|
||||
this.minutesToolStripMenuItem.Size = new System.Drawing.Size(149, 24);
|
||||
this.minutesToolStripMenuItem.Text = "회의록";
|
||||
this.minutesToolStripMenuItem.Visible = false;
|
||||
this.minutesToolStripMenuItem.Click += new System.EventHandler(this.minutesToolStripMenuItem_Click);
|
||||
//
|
||||
// requestITemToolStripMenuItem
|
||||
//
|
||||
this.requestITemToolStripMenuItem.ForeColor = System.Drawing.Color.HotPink;
|
||||
this.requestITemToolStripMenuItem.Name = "requestITemToolStripMenuItem";
|
||||
this.requestITemToolStripMenuItem.Size = new System.Drawing.Size(149, 24);
|
||||
this.requestITemToolStripMenuItem.Text = "견적요청";
|
||||
this.requestITemToolStripMenuItem.Visible = false;
|
||||
this.requestITemToolStripMenuItem.Click += new System.EventHandler(this.requestITemToolStripMenuItem_Click);
|
||||
//
|
||||
// freeBoardToolStripMenuItem
|
||||
//
|
||||
this.freeBoardToolStripMenuItem.Enabled = false;
|
||||
this.freeBoardToolStripMenuItem.Name = "freeBoardToolStripMenuItem";
|
||||
this.freeBoardToolStripMenuItem.Size = new System.Drawing.Size(149, 24);
|
||||
this.freeBoardToolStripMenuItem.Text = "Free Board";
|
||||
this.freeBoardToolStripMenuItem.Visible = false;
|
||||
//
|
||||
// bugReportToolStripMenuItem
|
||||
//
|
||||
this.bugReportToolStripMenuItem.Enabled = false;
|
||||
this.bugReportToolStripMenuItem.Name = "bugReportToolStripMenuItem";
|
||||
this.bugReportToolStripMenuItem.Size = new System.Drawing.Size(149, 24);
|
||||
this.bugReportToolStripMenuItem.Text = "Bug Report";
|
||||
this.bugReportToolStripMenuItem.Visible = false;
|
||||
//
|
||||
// todoListToolStripMenuItem
|
||||
//
|
||||
this.todoListToolStripMenuItem.Enabled = false;
|
||||
this.todoListToolStripMenuItem.Name = "todoListToolStripMenuItem";
|
||||
this.todoListToolStripMenuItem.Size = new System.Drawing.Size(149, 24);
|
||||
this.todoListToolStripMenuItem.Text = "Todo List";
|
||||
this.todoListToolStripMenuItem.Visible = false;
|
||||
this.todoListToolStripMenuItem.Click += new System.EventHandler(this.todoListToolStripMenuItem_Click);
|
||||
//
|
||||
// 메일전송ToolStripMenuItem
|
||||
//
|
||||
this.메일전송ToolStripMenuItem.ForeColor = System.Drawing.Color.Red;
|
||||
this.메일전송ToolStripMenuItem.Name = "메일전송ToolStripMenuItem";
|
||||
this.메일전송ToolStripMenuItem.Size = new System.Drawing.Size(149, 24);
|
||||
this.메일전송ToolStripMenuItem.Text = "메일전송";
|
||||
this.메일전송ToolStripMenuItem.Visible = false;
|
||||
this.메일전송ToolStripMenuItem.Click += new System.EventHandler(this.메일전송ToolStripMenuItem_Click);
|
||||
//
|
||||
// 기타ToolStripMenuItem
|
||||
//
|
||||
this.기타ToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.품목검색ToolStripMenuItem,
|
||||
this.대쉬보드ToolStripMenuItem,
|
||||
this.toolStripMenuItem17,
|
||||
this.webview2TestToolStripMenuItem});
|
||||
this.기타ToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("기타ToolStripMenuItem.Image")));
|
||||
this.기타ToolStripMenuItem.Name = "기타ToolStripMenuItem";
|
||||
this.기타ToolStripMenuItem.Size = new System.Drawing.Size(65, 23);
|
||||
this.기타ToolStripMenuItem.Text = "기타";
|
||||
//
|
||||
// 품목검색ToolStripMenuItem
|
||||
//
|
||||
this.품목검색ToolStripMenuItem.Name = "품목검색ToolStripMenuItem";
|
||||
this.품목검색ToolStripMenuItem.Size = new System.Drawing.Size(171, 24);
|
||||
this.품목검색ToolStripMenuItem.Text = "품목 검색";
|
||||
this.품목검색ToolStripMenuItem.Click += new System.EventHandler(this.품목검색ToolStripMenuItem_Click);
|
||||
//
|
||||
// 대쉬보드ToolStripMenuItem
|
||||
//
|
||||
this.대쉬보드ToolStripMenuItem.Name = "대쉬보드ToolStripMenuItem";
|
||||
this.대쉬보드ToolStripMenuItem.Size = new System.Drawing.Size(171, 24);
|
||||
this.대쉬보드ToolStripMenuItem.Text = "대쉬보드";
|
||||
this.대쉬보드ToolStripMenuItem.Click += new System.EventHandler(this.대쉬보드ToolStripMenuItem_Click);
|
||||
//
|
||||
// toolStripMenuItem17
|
||||
//
|
||||
this.toolStripMenuItem17.Name = "toolStripMenuItem17";
|
||||
this.toolStripMenuItem17.Size = new System.Drawing.Size(168, 6);
|
||||
//
|
||||
// webview2TestToolStripMenuItem
|
||||
//
|
||||
this.webview2TestToolStripMenuItem.Name = "webview2TestToolStripMenuItem";
|
||||
this.webview2TestToolStripMenuItem.Size = new System.Drawing.Size(171, 24);
|
||||
this.webview2TestToolStripMenuItem.Text = "Webview2 Test";
|
||||
this.webview2TestToolStripMenuItem.Click += new System.EventHandler(this.webview2TestToolStripMenuItem_Click);
|
||||
//
|
||||
// 즐겨찾기ToolStripMenuItem
|
||||
//
|
||||
this.즐겨찾기ToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("즐겨찾기ToolStripMenuItem.Image")));
|
||||
@@ -921,11 +722,7 @@
|
||||
this.addSIdDataToolStripMenuItem,
|
||||
this.계정목록ToolStripMenuItem,
|
||||
this.그룹정보ToolStripMenuItem1,
|
||||
this.toolStripMenuItem1,
|
||||
this.임의테이블조작ToolStripMenuItem,
|
||||
this.mailBackupToolStripMenuItem,
|
||||
this.메일자동발신테스트ToolStripMenuItem,
|
||||
this.toolStripMenuItem5,
|
||||
this.아이템비활성화하기ToolStripMenuItem,
|
||||
this.sPR설정ToolStripMenuItem,
|
||||
this.toolStripMenuItem13,
|
||||
@@ -1014,21 +811,6 @@
|
||||
this.그룹정보ToolStripMenuItem1.Text = "그룹정보";
|
||||
this.그룹정보ToolStripMenuItem1.Click += new System.EventHandler(this.그룹정보ToolStripMenuItem1_Click);
|
||||
//
|
||||
// toolStripMenuItem1
|
||||
//
|
||||
this.toolStripMenuItem1.ForeColor = System.Drawing.Color.HotPink;
|
||||
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
|
||||
this.toolStripMenuItem1.Size = new System.Drawing.Size(302, 24);
|
||||
this.toolStripMenuItem1.Text = "Staff Grid";
|
||||
this.toolStripMenuItem1.Click += new System.EventHandler(this.toolStripMenuItem1_Click);
|
||||
//
|
||||
// 임의테이블조작ToolStripMenuItem
|
||||
//
|
||||
this.임의테이블조작ToolStripMenuItem.Name = "임의테이블조작ToolStripMenuItem";
|
||||
this.임의테이블조작ToolStripMenuItem.Size = new System.Drawing.Size(302, 24);
|
||||
this.임의테이블조작ToolStripMenuItem.Text = "구매내역 suuply 다시 설정 하기";
|
||||
this.임의테이블조작ToolStripMenuItem.Click += new System.EventHandler(this.임의테이블조작ToolStripMenuItem_Click);
|
||||
//
|
||||
// mailBackupToolStripMenuItem
|
||||
//
|
||||
this.mailBackupToolStripMenuItem.Name = "mailBackupToolStripMenuItem";
|
||||
@@ -1036,18 +818,6 @@
|
||||
this.mailBackupToolStripMenuItem.Text = "Mail Backup";
|
||||
this.mailBackupToolStripMenuItem.Click += new System.EventHandler(this.mailBackupToolStripMenuItem_Click);
|
||||
//
|
||||
// 메일자동발신테스트ToolStripMenuItem
|
||||
//
|
||||
this.메일자동발신테스트ToolStripMenuItem.Name = "메일자동발신테스트ToolStripMenuItem";
|
||||
this.메일자동발신테스트ToolStripMenuItem.Size = new System.Drawing.Size(302, 24);
|
||||
this.메일자동발신테스트ToolStripMenuItem.Text = "메일자동발신(테스트)";
|
||||
this.메일자동발신테스트ToolStripMenuItem.Click += new System.EventHandler(this.메일자동발신테스트ToolStripMenuItem_Click);
|
||||
//
|
||||
// toolStripMenuItem5
|
||||
//
|
||||
this.toolStripMenuItem5.Name = "toolStripMenuItem5";
|
||||
this.toolStripMenuItem5.Size = new System.Drawing.Size(299, 6);
|
||||
//
|
||||
// 아이템비활성화하기ToolStripMenuItem
|
||||
//
|
||||
this.아이템비활성화하기ToolStripMenuItem.Name = "아이템비활성화하기ToolStripMenuItem";
|
||||
@@ -1076,22 +846,6 @@
|
||||
this.프로젝트스케쥴담당자사번업데이트ToolStripMenuItem.Text = "프로젝트스케쥴담당자사번업데이트";
|
||||
this.프로젝트스케쥴담당자사번업데이트ToolStripMenuItem.Click += new System.EventHandler(this.프로젝트스케쥴담당자사번업데이트ToolStripMenuItem_Click);
|
||||
//
|
||||
// 버젼확인ToolStripMenuItem
|
||||
//
|
||||
this.버젼확인ToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("버젼확인ToolStripMenuItem.Image")));
|
||||
this.버젼확인ToolStripMenuItem.Name = "버젼확인ToolStripMenuItem";
|
||||
this.버젼확인ToolStripMenuItem.Size = new System.Drawing.Size(93, 23);
|
||||
this.버젼확인ToolStripMenuItem.Text = "버젼확인";
|
||||
this.버젼확인ToolStripMenuItem.Click += new System.EventHandler(this.버젼확인ToolStripMenuItem_Click);
|
||||
//
|
||||
// 설명서ToolStripMenuItem
|
||||
//
|
||||
this.설명서ToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("설명서ToolStripMenuItem.Image")));
|
||||
this.설명서ToolStripMenuItem.Name = "설명서ToolStripMenuItem";
|
||||
this.설명서ToolStripMenuItem.Size = new System.Drawing.Size(79, 23);
|
||||
this.설명서ToolStripMenuItem.Text = "설명서";
|
||||
this.설명서ToolStripMenuItem.Click += new System.EventHandler(this.설명서ToolStripMenuItem_Click);
|
||||
//
|
||||
// tabControl1
|
||||
//
|
||||
this.tabControl1.Appearance = System.Windows.Forms.TabAppearance.FlatButtons;
|
||||
@@ -1244,15 +998,9 @@
|
||||
private System.Windows.Forms.ToolStripMenuItem itemsToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripStatusLabel sbLogin;
|
||||
private System.Windows.Forms.ToolStripMenuItem codesToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem mn_docu;
|
||||
private System.Windows.Forms.ToolStripMenuItem freeBoardToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem bugReportToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem todoListToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem managementToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem personalInventoryToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem userInfoToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem minutesToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem requestITemToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem mn_purchase;
|
||||
private System.Windows.Forms.ToolStripMenuItem btDev;
|
||||
private System.Windows.Forms.ToolStripMenuItem purchaseImportToolStripMenuItem;
|
||||
@@ -1267,9 +1015,7 @@
|
||||
private System.Windows.Forms.ToolStripMenuItem mn_project;
|
||||
private System.Windows.Forms.ToolStripMenuItem projectImportCompleteToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem purchaseOrderImportToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 메일전송ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem mn_dailyhistory;
|
||||
private System.Windows.Forms.ToolStripMenuItem 패치내역ToolStripMenuItem1;
|
||||
private System.Windows.Forms.ToolStripMenuItem workReportImportToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem mn_kuntae;
|
||||
private System.Windows.Forms.ToolStripMenuItem 즐겨찾기ToolStripMenuItem;
|
||||
@@ -1280,14 +1026,8 @@
|
||||
private System.Windows.Forms.ToolStripMenuItem 권한설정ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 관리ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 재고현황ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1;
|
||||
private System.Windows.Forms.ToolStripMenuItem 임의테이블조작ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 메일양식ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 메일내역ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem3;
|
||||
private System.Windows.Forms.ToolStripMenuItem mailBackupToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 메모장ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem4;
|
||||
private System.Windows.Forms.ToolStrip toolStrip1;
|
||||
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem6;
|
||||
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem7;
|
||||
@@ -1296,33 +1036,24 @@
|
||||
private System.Windows.Forms.ToolStripMenuItem 근태입력ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 근로명부ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripStatusLabel lbSvr;
|
||||
private System.Windows.Forms.ToolStripMenuItem 비용절감ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 목록ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripButton toolStripButton1;
|
||||
private System.Windows.Forms.ToolStripButton toolStripButton2;
|
||||
private System.Windows.Forms.ToolStripMenuItem 목록ToolStripMenuItem1;
|
||||
private System.Windows.Forms.ToolStripMenuItem 자동입력ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 업무현황전자실ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 기타ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 품목검색ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem layoutToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 교육목록ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 양식ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 설명서ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 라이선스ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 휴일연장근무승인ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem9;
|
||||
private System.Windows.Forms.ToolStripMenuItem 휴일연장근무집계표출력ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 메일자동발신테스트ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 출근부출력ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 휴가신청ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem10;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem5;
|
||||
private System.Windows.Forms.ToolStripMenuItem 아이템비활성화하기ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 휴가사용현황ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 개인별근태원장ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 근태입력오류확인ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 버젼확인ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem11;
|
||||
private System.Windows.Forms.ToolStripMenuItem 근태마감ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem sPR설정ToolStripMenuItem;
|
||||
@@ -1341,7 +1072,6 @@
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem15;
|
||||
private System.Windows.Forms.ToolStripMenuItem 개인별근태집계표ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 연차현황ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 대쉬보드ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripStatusLabel sbLoginUseTime;
|
||||
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem16;
|
||||
private System.Windows.Forms.ToolStripMenuItem 담당자별업무현황ToolStripMenuItem;
|
||||
@@ -1350,8 +1080,6 @@
|
||||
private System.Windows.Forms.ToolStripMenuItem 업무분류및형태설정ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 대체시간이월ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 월별NRCR기준금액입력ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem17;
|
||||
private System.Windows.Forms.ToolStripMenuItem webview2TestToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripStatusLabel sbWeb;
|
||||
private System.Windows.Forms.ToolStripStatusLabel sbChat;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem18;
|
||||
|
||||
120
Project/fMain.cs
120
Project/fMain.cs
@@ -164,8 +164,8 @@ namespace Project
|
||||
// WebView2 로그인의 경우 OnLoginCompleted()에서 호출됨
|
||||
//if (Pub.InitWebView != 1)
|
||||
//{
|
||||
Menu_Dashboard();
|
||||
//OnLoginCompleted();
|
||||
Menu_Dashboard();
|
||||
//OnLoginCompleted();
|
||||
//}
|
||||
}
|
||||
|
||||
@@ -183,8 +183,6 @@ namespace Project
|
||||
this.mn_jago.Visible = FCOMMON.Util.getBit(FCOMMON.info.Login.gpermission, (int)FCOMMON.eGroupPermission.menu_jago);
|
||||
//this.mn_eq.Visible = FCOMMON.Util.getBit(FCOMMON.info.Login.gpermission, (int)FCOMMON.eGroupPermission.menu_equipment);
|
||||
this.mn_kuntae.Visible = FCOMMON.Util.getBit(FCOMMON.info.Login.gpermission, (int)FCOMMON.eGroupPermission.menu_workday);
|
||||
this.mn_docu.Visible = FCOMMON.Util.getBit(FCOMMON.info.Login.gpermission, (int)FCOMMON.eGroupPermission.menu_docu);
|
||||
//this.mn_logdata.Visible = FCOMMON.Util.getBit(FCOMMON.info.Login.gpermission, (int)FCOMMON.eGroupPermission.menu_logdata);
|
||||
|
||||
//220421
|
||||
FCOMMON.info.Disable_8hourover = Pub.setting.Disable8HourOver;
|
||||
@@ -377,12 +375,7 @@ namespace Project
|
||||
|
||||
|
||||
}
|
||||
void menu_save_cost()
|
||||
{
|
||||
string formkey = "SAVECOST";
|
||||
if (!ShowForm(formkey))
|
||||
AddForm(formkey, new FPJ0000.fSaveCostList());
|
||||
}
|
||||
|
||||
|
||||
void menu_dayhistory()
|
||||
{
|
||||
@@ -459,27 +452,10 @@ namespace Project
|
||||
|
||||
private void codesToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
//if (Pub.InitWebView > 0 && System.Diagnostics.Debugger.IsAttached)
|
||||
//{
|
||||
// var f = new Dialog.fCommon();
|
||||
// f.ShowDialog();
|
||||
//}
|
||||
//else
|
||||
{
|
||||
var f = new FCM0000.fCode();
|
||||
f.ShowDialog();
|
||||
}
|
||||
|
||||
var f = new FCM0000.fCode();
|
||||
f.ShowDialog();
|
||||
}
|
||||
|
||||
|
||||
private void requestITemToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
string formkey = "ITEMREQUEST";
|
||||
if (!ShowForm(formkey))
|
||||
AddForm(formkey, new FCM0000.fRequestItem());
|
||||
|
||||
}
|
||||
void menu_itemin()
|
||||
{
|
||||
string formkey = "ITEMIPKO";
|
||||
@@ -697,28 +673,6 @@ namespace Project
|
||||
Menu_Dashboard();
|
||||
}
|
||||
|
||||
private void 메일전송ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (FCOMMON.info.Login.level < 10)
|
||||
{
|
||||
FCOMMON.Util.MsgE("테스트 기능이므로 개발자만 사용가능 합니다.");
|
||||
return;
|
||||
}
|
||||
FCM0000.fSendMail f = new FCM0000.fSendMail();
|
||||
//f.MdiParent = this;
|
||||
f.Show();
|
||||
}
|
||||
|
||||
private void 업무일지ToolStripMenuItem1_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void 패치내역ToolStripMenuItem1_Click(object sender, EventArgs e)
|
||||
{
|
||||
FCM0000.fPatchList f = new FCM0000.fPatchList();
|
||||
f.Show();
|
||||
}
|
||||
|
||||
private void workReportImportToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
@@ -823,12 +777,7 @@ namespace Project
|
||||
if (!ShowForm(formkey))
|
||||
AddForm(formkey, new FCM0000.fInventoryJagoList());
|
||||
}
|
||||
void Menu_Note()
|
||||
{
|
||||
string formkey = "NOTELIST";
|
||||
if (!ShowForm(formkey))
|
||||
AddForm(formkey, new FPJ0000.Note.fNote());
|
||||
}
|
||||
|
||||
private void 재고현황ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
Menu_InventoryList();
|
||||
@@ -930,11 +879,6 @@ namespace Project
|
||||
FCOMMON.Util.MsgI("complete");
|
||||
}
|
||||
|
||||
private void sMTRepairLogToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void 메일양식ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
string formkey = "MAILFORM";
|
||||
@@ -942,20 +886,6 @@ namespace Project
|
||||
AddForm(formkey, new FCM0000.fMailform());
|
||||
}
|
||||
|
||||
private void 메일내역ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
string formkey = "MAILLIST";
|
||||
if (!ShowForm(formkey))
|
||||
AddForm(formkey, new FCM0000.Mail.fMailList());
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void pMP데이터베이스업데이트ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
private void mailBackupToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
var f = new FCM0000.Mail.fMailBackup();
|
||||
@@ -963,11 +893,6 @@ namespace Project
|
||||
f.Show();
|
||||
}
|
||||
|
||||
private void 메모장ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
Menu_Note();
|
||||
}
|
||||
|
||||
|
||||
private void toolStripMenuItem7_Click(object sender, EventArgs e)
|
||||
{
|
||||
@@ -998,10 +923,6 @@ namespace Project
|
||||
AddForm(formkey, new FBS0000.fWorkTableUser());
|
||||
}
|
||||
|
||||
private void 비용절감ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
menu_save_cost();
|
||||
}
|
||||
|
||||
private void 목록ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
@@ -1026,15 +947,6 @@ namespace Project
|
||||
menu_work_reportautoinput();
|
||||
}
|
||||
|
||||
private void 업무현황전자실ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
//업무현황 전자실
|
||||
Util.MsgE("자스민 이용하세요!!");
|
||||
string formkey = "EBOARD";
|
||||
if (!ShowForm(formkey))
|
||||
AddForm(formkey, new FPJ0000.fEboardList(), "ALL");
|
||||
}
|
||||
|
||||
|
||||
private void 품목검색ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
@@ -1049,12 +961,6 @@ namespace Project
|
||||
AddForm(formkey, new FPJ0000.fProjectLayout());
|
||||
}
|
||||
|
||||
private void 교육목록ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
string formkey = "EDLIST";
|
||||
if (!ShowForm(formkey))
|
||||
AddForm(formkey, new FED0000.fEdulist());
|
||||
}
|
||||
|
||||
private void 양식ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
@@ -1063,16 +969,6 @@ namespace Project
|
||||
AddForm(formkey, new FCM0000.fJRForm());
|
||||
}
|
||||
|
||||
private void 설명서ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
// 로컬 PDF 파일 열기
|
||||
var pdfPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Manual.pdf");
|
||||
if (System.IO.File.Exists(pdfPath))
|
||||
Util.RunExplorer(pdfPath);
|
||||
else
|
||||
Util.MsgE("설명서 파일을 찾을 수 없습니다.");
|
||||
}
|
||||
|
||||
private void 라이선스ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
string formkey = "LICENSE";
|
||||
@@ -1139,7 +1035,7 @@ namespace Project
|
||||
private void 개인별근태원장ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
var uid = FCOMMON.info.Login.nameK + "(" + FCOMMON.info.Login.no + ")";
|
||||
var f = new FBS0000.fHolyDayData(DateTime.Now.ToShortDateString(), uid);
|
||||
var f = new FBS0000.fHolyDayData(DateTime.Now.ToString("yyyy-MM-dd"), uid);
|
||||
f.Show();
|
||||
}
|
||||
|
||||
@@ -1461,7 +1357,7 @@ namespace Project
|
||||
private void 개인별근태집계표ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
var uid = FCOMMON.info.Login.nameK + "(" + FCOMMON.info.Login.no + ")";
|
||||
var f = new FBS0000.fHolyDayDataSum(DateTime.Now.ToShortDateString(), uid);
|
||||
var f = new FBS0000.fHolyDayDataSum(DateTime.Now.ToString("yyyy-MM-dd"), uid);
|
||||
f.Show();
|
||||
}
|
||||
|
||||
|
||||
@@ -141,26 +141,6 @@
|
||||
0IOABBs4KBjggQGBjQM9XoQwIYIHBB4yUpjo8AFLBS9fKjAgYSJCAQEyeJAgIUAEnj4RAgjgQUPPCgwQ
|
||||
9Ey51APJABUIYKAwoADNBBlfRrCwtUOGBT49JEhAwIAFABQaFEDb0cMBAwg0DECbtOGFAoD7GlQomCHD
|
||||
gAA7
|
||||
</value>
|
||||
</data>
|
||||
<data name="codesToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
R0lGODlhEAAQAIQAAHan1azQ4ldvj9vp9HSQruTr80lVa+vx9pu811SRuXifuj13uYyz2VFhe4Gt2UNL
|
||||
XPL1+Orv+ufu9YOqxYyzzNHW3SkxQz5FVWag2T6CuZe3y5G0t+Do7+r0/77a9f///yH/C05FVFNDQVBF
|
||||
Mi4wAwEBAAAh+QQAAAAAACwAAAAAEAAQAAAIrwA/CBxIsKDAAQESIkBAYYICBQQICCAgMMAACQMyaswo
|
||||
oUKDih0SZMiwoKTJBQcEVDyAoEMHDy5hdnAg4eMHBBIQeNjJcyeDAjYRRNAQs+hMoAIpRNjQs6eDAgYE
|
||||
TshpVCYAqAIV5GzKU0GBB1klMKjqEgMHsB8IiOW60+wFgQQgIGDgoC4AABgwADjw9oOAChAkSChAmIPh
|
||||
AxUswBXAuEEDAwYePLhwwYJNg5gFBgQAOw==
|
||||
</value>
|
||||
</data>
|
||||
<data name="메일양식ToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
R0lGODlhEAAQAIQfAHWSrbTY+6nU/I+74/r8/drj7FlxkUlVa9Xp/eLs9cvT2oWpxG+bwqPQ+57N++v1
|
||||
/lJgeabK7JnB5kNLXJG0z5nA1oyw0SkxQz5FVb7e/aC91tHl8qXB2n2gu////////yH/C05FVFNDQVBF
|
||||
Mi4wAwEBAAAh+QQBAAAfACwAAAAAEAAQAAAIpAA/CBxIsKDBgwQ9KFzIsKHCDRUqUFhAsQOAiwAMQFBY
|
||||
gYDHjyAJKNjogQIBChoQZAgQAEGCiQUOKFxAIEMEDhsQPEDAQEKDBzI9dKiZIYOFowwENPg5QeHQlRIi
|
||||
SJAwYIADBwWaegCQIMAACQEEKK2KFYNCrgMihBXbwEHVBGY9GFCQIEGBu3jvKrhw1oBfCBAOHJgwAQOG
|
||||
CyQdKlaIsLHjggEBADs=
|
||||
</value>
|
||||
</data>
|
||||
<data name="commonToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
@@ -283,26 +263,6 @@
|
||||
Mi4wAwEBAAAh+QQBAAAQACwAAAAAEAAQAAAIZQAhCBxIsKBABgQBGCTIoCEEBgEWDmRAgMAAAwUgKJQ4
|
||||
QIEDBwciSmw4QMDHBRIBBCiQAIGABw8aSBSosgHMmCkH2oQpc6bAnTh9QgDa0ydRoUMffCw6s4FJB0wl
|
||||
OoWKdGiDBgEBADs=
|
||||
</value>
|
||||
</data>
|
||||
<data name="mn_docu.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
R0lGODlhEAAQAIQfAJrM+3OSsKfS++zx9uXt9Yis1FdwkZW51ElVa8fj/bba/NXb5PL2+o276b3d/VJh
|
||||
e7TR4ENLXNXn8KLD536kwIyzzJ/E2KjL3t7n7ykxQz5FVa/W/OLp8I+w1P///////yH/C05FVFNDQVBF
|
||||
Mi4wAwEBAAAh+QQBAAAfACwAAAAAEAAQAAAItgA9CBxIcOCHgx4kQIBwwcKBChQiBgjgASEECQQGZNRI
|
||||
oGMDAxU9QCCQoGRJBygZNPgo8AKDBB1iyuzAoOYDgRZeonSgoGfPDQxuejjwcsLMAkgFBBVY4aVPBRui
|
||||
ClCKQCCFojGRIm0ggEBVDxQG8IQqdSoAAhGsijWqdSsADmk9BBBLdqoAAHgxaBAYgAHPsnjxDtjrwcAC
|
||||
Bhw5KOaAYQCEDHwNSH7wAAGCCBE0aMggtKBnggEBADs=
|
||||
</value>
|
||||
</data>
|
||||
<data name="기타ToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
R0lGODlhEAAQAIQfAKnrVsfvlYnVOHy8KnfJLJneRWqyJLvth1W7GzGTEVWnHT2aFIPNMkuiGmrKJGKt
|
||||
Io7eOXa5KU64GDiWE1yqIHK3KHa5J0WeGGC/IG+1JW/FKGjCJHnRLWrOIP///////yH/C05FVFNDQVBF
|
||||
Mi4wAwEBAAAh+QQBAAAfACwAAAAAEAAQAAAIqwA/CBTooeDAgwg9DFjoAWHCAQEAFBjQ0CHBAQAEFLBQ
|
||||
8WDBjxEARPjY8YPChREiZshg4EFJhQFiFmBQAAIECh8vLoTAgAEBAgIUeGhwoaHCghUE/NTAgcCFAxAW
|
||||
GDWZQamGDRgwIEAgYUJBjh4MCODAAYODBRMkSEhQMAJLARQUNODgwGsCtiYjHBDgsuCCDl4NmqxQAK7R
|
||||
v3gHemD5QK4HtBMSEyRplOTBgAA7
|
||||
</value>
|
||||
</data>
|
||||
<data name="즐겨찾기ToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
@@ -324,24 +284,24 @@
|
||||
vQU5DIar2KFgxYEHBgQAOw==
|
||||
</value>
|
||||
</data>
|
||||
<data name="버젼확인ToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<data name="codesToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
R0lGODlhEAAQAIQfAGm6/idTd4yTmF+v8Xa37KvW+lyh3KHJ62aq41ee2bXZ98nm/2mt5W2Ck5XN/C1c
|
||||
hEZieho8WXXA/2Gn4P39/W+y6V+l3qjP8Njt/lx2izxPYGyv51Oa1EJWZ////////yH/C05FVFNDQVBF
|
||||
Mi4wAwEBAAAh+QQBAAAfACwAAAAAEAAQAAAIqgA/CPzgoaBBDwMTEoQgoGGDBhAQKvSQAcOCBQUcaHwg
|
||||
USBFDARCEqhQgYEEjh47gKxwweAFBAgkREDooYMCAhs8XGCAwMOEmB1o2qywYSdMnxMABCVocwMDngUP
|
||||
GLAAYCZTBTARHPAgdWpVoQV+TrBgoGwCA1+ZOkgwduuBBAk4pCWogUBcDnjxAgjQkS4BAAMCD9jrgcJE
|
||||
DQ8eBAjwYKZhhQQPFoRMuXJAADs=
|
||||
R0lGODlhEAAQAIQAAHan1azQ4ldvj9vp9HSQruTr80lVa+vx9pu811SRuXifuj13uYyz2VFhe4Gt2UNL
|
||||
XPL1+Orv+ufu9YOqxYyzzNHW3SkxQz5FVWag2T6CuZe3y5G0t+Do7+r0/77a9f///yH/C05FVFNDQVBF
|
||||
Mi4wAwEBAAAh+QQAAAAAACwAAAAAEAAQAAAIrwA/CBxIsKDAAQESIkBAYYICBQQICCAgMMAACQMyaswo
|
||||
oUKDih0SZMiwoKTJBQcEVDyAoEMHDy5hdnAg4eMHBBIQeNjJcyeDAjYRRNAQs+hMoAIpRNjQs6eDAgYE
|
||||
TshpVCYAqAIV5GzKU0GBB1klMKjqEgMHsB8IiOW60+wFgQQgIGDgoC4AABgwADjw9oOAChAkSChAmIPh
|
||||
AxUswBXAuEEDAwYePLhwwYJNg5gFBgQAOw==
|
||||
</value>
|
||||
</data>
|
||||
<data name="설명서ToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<data name="메일양식ToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
R0lGODlhEAAQAIQAAP/99v/qaOvOSem4M+zSSv/ypf/ug//1w//2zP/xnv/te//zrf/0uv/41/nWdufB
|
||||
MP/vkevTVf/rcv/0s//wlv/57OvRM//vi+/OQtaXIuuYEuvTLNyhJ+vHUP///////yH/C05FVFNDQVBF
|
||||
Mi4wAwEBAAAh+QQBAAAfACwAAAAAEAAQAAAIoAA/CBxIsCBBDwgTKizogUCEhwQIYLBgYYOHgR4cKPQA
|
||||
oMEBBAgsfsjoAQGDCQsKJEhAAcKBChYQajyZkiWECwYMAHiAkAAAlCop4FRA9ABPDxgqABVqQIGEpxQG
|
||||
IMTQoCaEphICaFXAAaEABCmZZtUawECGi0gRHGigloFWCgzOYhRAt0OHASg1yD24cUAFDRcNMhwAWLBB
|
||||
D4UNMwz8ISAAOw==
|
||||
R0lGODlhEAAQAIQfAHWSrbTY+6nU/I+74/r8/drj7FlxkUlVa9Xp/eLs9cvT2oWpxG+bwqPQ+57N++v1
|
||||
/lJgeabK7JnB5kNLXJG0z5nA1oyw0SkxQz5FVb7e/aC91tHl8qXB2n2gu////////yH/C05FVFNDQVBF
|
||||
Mi4wAwEBAAAh+QQBAAAfACwAAAAAEAAQAAAIpAA/CBxIsKDBgwQ9KFzIsKHCDRUqUFhAsQOAiwAMQFBY
|
||||
gYDHjyAJKNjogQIBChoQZAgQAEGCiQUOKFxAIEMEDhsQPEDAQEKDBzI9dKiZIYOFowwENPg5QeHQlRIi
|
||||
SJAwYIADBwWaegCQIMAACQEEKK2KFYNCrgMihBXbwEHVBGY9GFCQIEGBu3jvKrhw1oBfCBAOHJgwAQOG
|
||||
CyQdKlaIsLHjggEBADs=
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
@@ -445,14 +405,14 @@
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIHSURBVDhPY2CAgZnGrAxLtTMZluosYFim08KwWFcdLL5K
|
||||
i4dhmVYhwzLteQzLdFoZlqlLwfWggKU6qxmW6fyH48U6PxiWaHoyLNO8jiK+VOsJwyotCTTNWjYgSYG1
|
||||
lv/9Tub8T7lc/z/3ZMX/eXNiP9S05P9LvdzwP/Jc2X/VbV5QQ7T7UA1YpjOBf435seQr9d+Kb/X8L7nZ
|
||||
lv/9Tub8T7lc/z/3ZMX/eXNiP9TU5/9LvdzwP/Jc2X/VbV5QQ7T7UA1YpjOBf435seQr9d+Kb/X8L7nZ
|
||||
8//QzJz/jzrT/l+dlPkTJAbDJrtDTzAs0bmGasBSXcHiW911MEUdh+r/Xy+N+L+/1f7v9UKvzz3bCuEG
|
||||
FN/qugBSj2oAAwND8c3uuTBFlZc6lp0vDDl4Odnt28Ugtf/bKpz2Fl/s+AiSK7jZ8w5dLxjAXFB0s6cE
|
||||
xH/RGiH+uMzz/5UMrT9Psm3UCm/26hff6vpcdKvnPLpeMCi+02NcfKPrOIz/uNjT81Gpx38wLvHyAKu5
|
||||
2V1afKu7BUUjMii+0y0GYz+p8MqCGfCk0jsTJFZ/v54j99ZEPhRNuMCjCs++J+Ve/0H4cblXL7o8QfC4
|
||||
zHMj3AulHhvQ5fGC//vrOV50RZ1+0xP3H4RfdkaeAomhq0MB/w70a/490Nv3/0DvmfsHen//P9D7HxlD
|
||||
xc6A1ezv0UBo3DaR/e+B3vknOuv/oWvChUFq/x7omQfSy/B3f28vugJiMUgvw78DfbZ/D/Qs/3+gdxUp
|
||||
GKQHpBcAJ5WqUADLneEAAAAASUVORK5CYII=
|
||||
xc6A1ezv0UBo3DaR/e+B3vmHmuv/oWvChUFq/x7omQfSy/B3f28vugJiMUgvw78DfbZ/D/Qs/3+gdxUp
|
||||
GKQHpBcAByWqM8i7D2wAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
|
||||
@@ -3,8 +3,12 @@ import { HashRouter, Routes, Route } from 'react-router-dom';
|
||||
import { Layout } from '@/components/layout';
|
||||
import { Dashboard, Todo, Kuntae, Jobreport, Project, Login, CommonCodePage, ItemsPage, UserListPage, MonthlyWorkPage, MailFormPage, UserAuthPage, Note } from '@/pages';
|
||||
import { PatchList } from '@/pages/PatchList';
|
||||
import { BugReport } from '@/pages/BugReport';
|
||||
import { MailList } from '@/pages/MailList';
|
||||
import { Customs } from '@/pages/Customs';
|
||||
import { LicenseList } from '@/components/license/LicenseList';
|
||||
import { PartList } from '@/pages/PartList';
|
||||
import HolidayRequest from '@/pages/HolidayRequest';
|
||||
import { comms } from '@/communication';
|
||||
import { UserInfo } from '@/types';
|
||||
import { Loader2 } from 'lucide-react';
|
||||
@@ -87,6 +91,7 @@ export default function App() {
|
||||
<Route path="/dashboard" element={<Dashboard />} />
|
||||
<Route path="/todo" element={<Todo />} />
|
||||
<Route path="/kuntae" element={<Kuntae />} />
|
||||
<Route path="/holiday-request" element={<HolidayRequest />} />
|
||||
<Route path="/jobreport" element={<Jobreport />} />
|
||||
<Route path="/project" element={<Project />} />
|
||||
<Route path="/common" element={<CommonCodePage />} />
|
||||
@@ -98,7 +103,10 @@ export default function App() {
|
||||
<Route path="/mail-form" element={<MailFormPage />} />
|
||||
<Route path="/note" element={<Note />} />
|
||||
<Route path="/patch-list" element={<PatchList />} />
|
||||
<Route path="/bug-report" element={<BugReport />} />
|
||||
<Route path="/mail-list" element={<MailList />} />
|
||||
<Route path="/license" element={<LicenseList />} />
|
||||
<Route path="/partlist" element={<PartList />} />
|
||||
</Route>
|
||||
</Routes>
|
||||
{/* Tailwind Breakpoint Indicator - 개발용 */}
|
||||
|
||||
@@ -42,6 +42,9 @@ import type {
|
||||
BoardItem,
|
||||
MailItem,
|
||||
CustomItem,
|
||||
LicenseItem,
|
||||
PartListItem,
|
||||
HolidayRequest,
|
||||
} from '@/types';
|
||||
|
||||
// WebView2 환경 감지
|
||||
@@ -135,21 +138,28 @@ class CommunicationLayer {
|
||||
}, 2000);
|
||||
}
|
||||
|
||||
const requestId = Date.now().toString() + Math.random().toString(36).substr(2, 9);
|
||||
|
||||
const timeoutId = setTimeout(() => {
|
||||
this.listeners = this.listeners.filter(cb => cb !== handler);
|
||||
reject(new Error(`${requestType} timeout`));
|
||||
}, 10000);
|
||||
|
||||
const handler = (data: unknown) => {
|
||||
const msg = data as { type: string; data?: T; Success?: boolean; Message?: string };
|
||||
const msg = data as { type: string; data?: T; Success?: boolean; Message?: string; requestId?: string };
|
||||
if (msg.type === responseType) {
|
||||
// requestId가 있는 경우 일치 여부 확인 (백엔드가 지원하는 경우)
|
||||
if (msg.requestId && msg.requestId !== requestId) {
|
||||
return;
|
||||
}
|
||||
|
||||
clearTimeout(timeoutId);
|
||||
this.listeners = this.listeners.filter(cb => cb !== handler);
|
||||
resolve(msg.data as T);
|
||||
}
|
||||
};
|
||||
this.listeners.push(handler);
|
||||
this.ws?.send(JSON.stringify({ ...params, type: requestType }));
|
||||
this.ws?.send(JSON.stringify({ ...params, type: requestType, requestId }));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -464,6 +474,21 @@ class CommunicationLayer {
|
||||
}
|
||||
}
|
||||
|
||||
public async saveProjectHistory(historyData: { idx?: number; pidx: number; pdate: string; progress: number; remark: string }): Promise<ApiResponse> {
|
||||
if (isWebView && machine) {
|
||||
const result = await machine.Project_SaveHistory(
|
||||
historyData.idx || 0,
|
||||
historyData.pidx,
|
||||
historyData.pdate,
|
||||
historyData.progress,
|
||||
historyData.remark
|
||||
);
|
||||
return JSON.parse(result);
|
||||
} else {
|
||||
return this.wsRequest<ApiResponse>('PROJECT_SAVE_HISTORY', 'PROJECT_SAVE_HISTORY_RESULT', historyData);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ===== Login API =====
|
||||
|
||||
@@ -899,6 +924,39 @@ class CommunicationLayer {
|
||||
}
|
||||
}
|
||||
|
||||
// ===== HolidayRequest API (휴가/외출 신청) =====
|
||||
|
||||
public async getHolidayRequestList(startDate: string, endDate: string, userId: string, userLevel: number): Promise<ApiResponse<HolidayRequest[]>> {
|
||||
if (isWebView && machine) {
|
||||
const result = await machine.HolidayRequest_GetList(startDate, endDate, userId, userLevel);
|
||||
return JSON.parse(result);
|
||||
} else {
|
||||
return this.wsRequest<ApiResponse<HolidayRequest[]>>('HOLIDAY_REQUEST_GET_LIST', 'HOLIDAY_REQUEST_LIST_DATA', { startDate, endDate, userId, userLevel });
|
||||
}
|
||||
}
|
||||
|
||||
public async saveHolidayRequest(data: HolidayRequest): Promise<ApiResponse> {
|
||||
const { idx, uid, cate, sdate, edate, Remark, Response, conf, HolyReason, HolyBackup, HolyLocation, HolyDays, HolyTimes, stime, etime } = data;
|
||||
const remark = Remark || '';
|
||||
const response = Response || '';
|
||||
const holyReason = HolyReason || '';
|
||||
const holyBackup = HolyBackup || '';
|
||||
const holyLocation = HolyLocation || '';
|
||||
const holyDays = HolyDays || 0;
|
||||
const holyTimes = HolyTimes || 0;
|
||||
const sTime = stime || '';
|
||||
const eTime = etime || '';
|
||||
|
||||
if (isWebView && machine) {
|
||||
const result = await machine.HolidayRequest_Save(idx, uid, cate, sdate, edate, remark, response, conf, holyReason, holyBackup, holyLocation, holyDays, holyTimes, sTime, eTime);
|
||||
return JSON.parse(result);
|
||||
} else {
|
||||
return this.wsRequest<ApiResponse>('HOLIDAY_REQUEST_SAVE', 'HOLIDAY_REQUEST_SAVED', {
|
||||
idx, uid, cate, sdate, edate, remark, response, conf, holyReason, holyBackup, holyLocation, holyDays, holyTimes, stime: sTime, etime: eTime
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// ===== MailForm API (메일양식) =====
|
||||
|
||||
public async getMailFormList(): Promise<ApiResponse<MailFormItem[]>> {
|
||||
@@ -1314,6 +1372,37 @@ class CommunicationLayer {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 게시판 댓글/답글 목록 조회
|
||||
* @param rootIdx 원글 인덱스
|
||||
* @returns ApiResponse<BoardItem[]>
|
||||
*/
|
||||
public async getBoardReplies(rootIdx: number): Promise<ApiResponse<BoardItem[]>> {
|
||||
if (isWebView && machine) {
|
||||
const result = await machine.Board_GetReplies(rootIdx);
|
||||
return JSON.parse(result);
|
||||
} else {
|
||||
return this.wsRequest<ApiResponse<BoardItem[]>>('BOARD_GET_REPLIES', 'BOARD_REPLIES_DATA', { rootIdx });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 게시판 댓글/답글 추가
|
||||
* @param rootIdx 원글 인덱스
|
||||
* @param pidx 부모 글 인덱스
|
||||
* @param contents 댓글 내용
|
||||
* @param isComment 댓글 타입 (true: 댓글, false: 답글)
|
||||
* @returns ApiResponse
|
||||
*/
|
||||
public async addBoardReply(rootIdx: number, pidx: number, title: string, contents: string, isComment: boolean = true): Promise<ApiResponse> {
|
||||
if (isWebView && machine) {
|
||||
const result = await machine.Board_AddReply(rootIdx, pidx, title, contents, isComment);
|
||||
return JSON.parse(result);
|
||||
} else {
|
||||
return this.wsRequest<ApiResponse>('BOARD_ADD_REPLY', 'BOARD_REPLY_ADDED', { rootIdx, pidx, title, contents, isComment });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 메일 발신 내역 조회
|
||||
* @param startDate 시작일 (yyyy-MM-dd)
|
||||
@@ -1330,6 +1419,64 @@ class CommunicationLayer {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 메일 데이터 추가 (발송 대기열)
|
||||
* @param cate 분류
|
||||
* @param subject 제목
|
||||
* @param fromlist 발신자
|
||||
* @param tolist 수신자
|
||||
* @param cc 참조
|
||||
* @param bcc 숨은참조
|
||||
* @param body 내용
|
||||
* @returns ApiResponse
|
||||
*/
|
||||
public async addMailData(cate: string, subject: string, fromlist: string, tolist: string, cc: string, bcc: string, body: string): Promise<ApiResponse> {
|
||||
if (isWebView && machine) {
|
||||
const result = await machine.Mail_AddData(cate, subject, fromlist, tolist, cc, bcc, body);
|
||||
return JSON.parse(result);
|
||||
} else {
|
||||
return this.wsRequest<ApiResponse>('MAIL_ADD_DATA', 'MAIL_ADD_DATA_RESULT', { cate, subject, fromlist, tolist, cc, bcc, body });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 메일 직접 발송 (SMTP)
|
||||
* @param cate 분류
|
||||
* @param subject 제목
|
||||
* @param fromlist 발신자
|
||||
* @param tolist 수신자
|
||||
* @param cc 참조
|
||||
* @param bcc 숨은참조
|
||||
* @param body 내용
|
||||
* @returns ApiResponse
|
||||
*/
|
||||
public async sendMailDirect(cate: string, subject: string, fromlist: string, tolist: string, cc: string, bcc: string, body: string): Promise<ApiResponse> {
|
||||
if (isWebView && machine) {
|
||||
const result = await machine.Mail_SendDirect(cate, subject, fromlist, tolist, cc, bcc, body);
|
||||
return JSON.parse(result);
|
||||
} else {
|
||||
return this.wsRequest<ApiResponse>('MAIL_SEND_DIRECT', 'MAIL_SEND_DIRECT_RESULT', { cate, subject, fromlist, tolist, cc, bcc, body });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Outlook으로 메일 미리보기/발송
|
||||
* @param subject 제목
|
||||
* @param tolist 수신자
|
||||
* @param cc 참조
|
||||
* @param bcc 숨은참조
|
||||
* @param body 내용
|
||||
* @returns ApiResponse
|
||||
*/
|
||||
public async sendMailOutlook(subject: string, tolist: string, cc: string, bcc: string, body: string): Promise<ApiResponse> {
|
||||
if (isWebView && machine) {
|
||||
const result = await machine.Mail_SendOutlook(subject, tolist, cc, bcc, body);
|
||||
return JSON.parse(result);
|
||||
} else {
|
||||
return this.wsRequest<ApiResponse>('MAIL_SEND_OUTLOOK', 'MAIL_SEND_OUTLOOK_RESULT', { subject, tolist, cc, bcc, body });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 업체정보 목록 조회
|
||||
* @param searchKey 검색어
|
||||
@@ -1357,6 +1504,175 @@ class CommunicationLayer {
|
||||
return this.wsRequest<ApiResponse<CustomItem>>('CUSTOMS_GET_DETAIL', 'CUSTOMS_DETAIL_DATA', { idx });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 라이선스 목록 조회
|
||||
* @returns ApiResponse<LicenseItem[]>
|
||||
*/
|
||||
public async getLicenseList(): Promise<ApiResponse<LicenseItem[]>> {
|
||||
if (isWebView && machine) {
|
||||
const result = await machine.License_GetList();
|
||||
return JSON.parse(result);
|
||||
} else {
|
||||
return this.wsRequest<ApiResponse<LicenseItem[]>>('LICENSE_GET_LIST', 'LICENSE_LIST_DATA', {});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 라이선스 추가
|
||||
*/
|
||||
public async addLicense(
|
||||
name: string,
|
||||
version: string,
|
||||
meterialNo: string,
|
||||
supply: string,
|
||||
qty: number,
|
||||
uids: string,
|
||||
serialNo: string,
|
||||
remark: string,
|
||||
sdate: string,
|
||||
edate: string,
|
||||
manu: string,
|
||||
expire: boolean
|
||||
): Promise<ApiResponse> {
|
||||
if (isWebView && machine) {
|
||||
const result = await machine.License_Add(name, version, meterialNo, supply, qty, uids, serialNo, remark, sdate, edate, manu, expire);
|
||||
return JSON.parse(result);
|
||||
} else {
|
||||
return this.wsRequest<ApiResponse>('LICENSE_ADD', 'LICENSE_ADD_RESULT', {
|
||||
name, version, meterialNo, supply, qty, uids, serialNo, remark, sdate, edate, manu, expire
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 라이선스 수정
|
||||
*/
|
||||
public async updateLicense(
|
||||
idx: number,
|
||||
name: string,
|
||||
version: string,
|
||||
meterialNo: string,
|
||||
supply: string,
|
||||
qty: number,
|
||||
uids: string,
|
||||
serialNo: string,
|
||||
remark: string,
|
||||
sdate: string,
|
||||
edate: string,
|
||||
manu: string,
|
||||
expire: boolean
|
||||
): Promise<ApiResponse> {
|
||||
if (isWebView && machine) {
|
||||
const result = await machine.License_Update(idx, name, version, meterialNo, supply, qty, uids, serialNo, remark, sdate, edate, manu, expire);
|
||||
return JSON.parse(result);
|
||||
} else {
|
||||
return this.wsRequest<ApiResponse>('LICENSE_UPDATE', 'LICENSE_UPDATE_RESULT', {
|
||||
idx, name, version, meterialNo, supply, qty, uids, serialNo, remark, sdate, edate, manu, expire
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 라이선스 삭제
|
||||
*/
|
||||
public async deleteLicense(idx: number): Promise<ApiResponse> {
|
||||
if (isWebView && machine) {
|
||||
const result = await machine.License_Delete(idx);
|
||||
return JSON.parse(result);
|
||||
} else {
|
||||
return this.wsRequest<ApiResponse>('LICENSE_DELETE', 'LICENSE_DELETE_RESULT', { idx });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 라이선스 폴더 열기
|
||||
*/
|
||||
public async openLicenseFolder(idx: number): Promise<ApiResponse> {
|
||||
if (isWebView && machine) {
|
||||
const result = await machine.License_OpenFolder(idx);
|
||||
return JSON.parse(result);
|
||||
} else {
|
||||
return this.wsRequest<ApiResponse>('LICENSE_OPEN_FOLDER', 'LICENSE_OPEN_FOLDER_RESULT', { idx });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 라이선스 CSV 내보내기
|
||||
*/
|
||||
public async exportLicenseCSV(filePath: string): Promise<ApiResponse> {
|
||||
if (isWebView && machine) {
|
||||
const result = await machine.License_ExportCSV(filePath);
|
||||
return JSON.parse(result);
|
||||
} else {
|
||||
return this.wsRequest<ApiResponse>('LICENSE_EXPORT_CSV', 'LICENSE_EXPORT_CSV_RESULT', { filePath });
|
||||
}
|
||||
}
|
||||
|
||||
// ===== PartList API =====
|
||||
|
||||
/**
|
||||
* 프로젝트별 파트리스트 조회
|
||||
*/
|
||||
public async getPartList(projectIdx: number): Promise<ApiResponse<PartListItem[]>> {
|
||||
if (isWebView && machine) {
|
||||
const result = await machine.PartList_GetList(projectIdx);
|
||||
return JSON.parse(result);
|
||||
} else {
|
||||
return this.wsRequest<ApiResponse<PartListItem[]>>('PARTLIST_GET_LIST', 'PARTLIST_LIST_DATA', { projectIdx });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 파트리스트 항목 저장 (추가/수정)
|
||||
*/
|
||||
public async savePartList(
|
||||
idx: number,
|
||||
projectIdx: number,
|
||||
itemgroup: string,
|
||||
itemname: string,
|
||||
item: string,
|
||||
itemmodel: string,
|
||||
itemscale: string,
|
||||
itemunit: string,
|
||||
qty: number,
|
||||
price: number,
|
||||
itemsupply: string,
|
||||
itemsupplyidx: number,
|
||||
itemmanu: string,
|
||||
itemsid: string,
|
||||
option1: string,
|
||||
remark: string,
|
||||
no: number,
|
||||
qtybuy: number
|
||||
): Promise<ApiResponse> {
|
||||
if (isWebView && machine) {
|
||||
const result = await machine.PartList_Save(
|
||||
idx, projectIdx, itemgroup, itemname, item, itemmodel, itemscale,
|
||||
itemunit, qty, price, itemsupply, itemsupplyidx, itemmanu, itemsid,
|
||||
option1, remark, no, qtybuy
|
||||
);
|
||||
return JSON.parse(result);
|
||||
} else {
|
||||
return this.wsRequest<ApiResponse>('PARTLIST_SAVE', 'PARTLIST_SAVE_RESULT', {
|
||||
idx, projectIdx, itemgroup, itemname, item, itemmodel, itemscale,
|
||||
itemunit, qty, price, itemsupply, itemsupplyidx, itemmanu, itemsid,
|
||||
option1, remark, no, qtybuy
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 파트리스트 항목 삭제
|
||||
*/
|
||||
public async deletePartList(idx: number): Promise<ApiResponse> {
|
||||
if (isWebView && machine) {
|
||||
const result = await machine.PartList_Delete(idx);
|
||||
return JSON.parse(result);
|
||||
} else {
|
||||
return this.wsRequest<ApiResponse>('PARTLIST_DELETE', 'PARTLIST_DELETE_RESULT', { idx });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const comms = new CommunicationLayer();
|
||||
|
||||
@@ -93,6 +93,19 @@ export function FavoriteDialog({ isOpen, onClose }: FavoriteDialogProps) {
|
||||
}
|
||||
}, [isOpen]);
|
||||
|
||||
useEffect(() => {
|
||||
const handleEscape = (e: KeyboardEvent) => {
|
||||
if (e.key === 'Escape' && isOpen) {
|
||||
onClose();
|
||||
}
|
||||
};
|
||||
|
||||
if (isOpen) {
|
||||
window.addEventListener('keydown', handleEscape);
|
||||
return () => window.removeEventListener('keydown', handleEscape);
|
||||
}
|
||||
}, [isOpen, onClose]);
|
||||
|
||||
const loadFavorites = async () => {
|
||||
setLoading(true);
|
||||
try {
|
||||
|
||||
507
Project/frontend/src/components/holiday/HolidayRequestDialog.tsx
Normal file
507
Project/frontend/src/components/holiday/HolidayRequestDialog.tsx
Normal file
@@ -0,0 +1,507 @@
|
||||
import { useState, useEffect } from 'react';
|
||||
import { X, Save, Calendar, Clock, MapPin, User, FileText, AlertCircle } from 'lucide-react';
|
||||
import { comms } from '@/communication';
|
||||
import { HolidayRequest, CommonCode } from '@/types';
|
||||
|
||||
interface HolidayRequestDialogProps {
|
||||
isOpen: boolean;
|
||||
onClose: () => void;
|
||||
onSave: () => void;
|
||||
initialData?: HolidayRequest | null;
|
||||
userLevel: number;
|
||||
currentUserId: string;
|
||||
currentUserName: string;
|
||||
}
|
||||
|
||||
export function HolidayRequestDialog({
|
||||
isOpen,
|
||||
onClose,
|
||||
onSave,
|
||||
initialData,
|
||||
userLevel,
|
||||
currentUserId,
|
||||
// currentUserName
|
||||
}: HolidayRequestDialogProps) {
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [codes, setCodes] = useState<{
|
||||
cate: CommonCode[];
|
||||
reason: CommonCode[];
|
||||
location: CommonCode[];
|
||||
backup: CommonCode[];
|
||||
}>({
|
||||
cate: [],
|
||||
reason: [],
|
||||
location: [],
|
||||
backup: []
|
||||
});
|
||||
const [users, setUsers] = useState<Array<{ id: string; name: string }>>([]);
|
||||
|
||||
// Form State
|
||||
const [formData, setFormData] = useState<HolidayRequest>({
|
||||
idx: 0,
|
||||
gcode: '',
|
||||
uid: currentUserId,
|
||||
cate: '',
|
||||
sdate: new Date().toISOString().split('T')[0],
|
||||
edate: new Date().toISOString().split('T')[0],
|
||||
Remark: '',
|
||||
wuid: currentUserId,
|
||||
wdate: '',
|
||||
Response: '',
|
||||
conf: 0,
|
||||
HolyReason: '',
|
||||
HolyBackup: '',
|
||||
HolyLocation: '',
|
||||
HolyDays: 0,
|
||||
HolyTimes: 0,
|
||||
stime: '09:00',
|
||||
etime: '18:00',
|
||||
sendmail: false
|
||||
});
|
||||
|
||||
const [requestType, setRequestType] = useState<'day' | 'time' | 'out'>('day'); // day: 휴가, time: 대체, out: 외출
|
||||
|
||||
useEffect(() => {
|
||||
if (isOpen) {
|
||||
loadCodes();
|
||||
if (userLevel >= 5) {
|
||||
loadUsers();
|
||||
}
|
||||
|
||||
if (initialData) {
|
||||
setFormData({ ...initialData });
|
||||
// Determine request type based on data
|
||||
if (initialData.cate === '외출') {
|
||||
setRequestType('out');
|
||||
} else if (initialData.cate === '대체') {
|
||||
setRequestType('time');
|
||||
} else {
|
||||
setRequestType('day');
|
||||
}
|
||||
} else {
|
||||
// Reset form for new entry
|
||||
setFormData({
|
||||
idx: 0,
|
||||
gcode: '',
|
||||
uid: currentUserId,
|
||||
cate: '',
|
||||
sdate: new Date().toISOString().split('T')[0],
|
||||
edate: new Date().toISOString().split('T')[0],
|
||||
Remark: '',
|
||||
wuid: currentUserId,
|
||||
wdate: '',
|
||||
Response: '',
|
||||
conf: 0,
|
||||
HolyReason: '',
|
||||
HolyBackup: '',
|
||||
HolyLocation: '',
|
||||
HolyDays: 0,
|
||||
HolyTimes: 0,
|
||||
stime: '09:00',
|
||||
etime: '18:00',
|
||||
sendmail: false
|
||||
});
|
||||
setRequestType('day');
|
||||
}
|
||||
}
|
||||
}, [isOpen, initialData, currentUserId]);
|
||||
|
||||
const loadCodes = async () => {
|
||||
try {
|
||||
const [cateRes, reasonRes, locationRes, backupRes] = await Promise.all([
|
||||
comms.getCommonList('50'),
|
||||
comms.getCommonList('51'),
|
||||
comms.getCommonList('52'),
|
||||
comms.getCommonList('53')
|
||||
]);
|
||||
setCodes({
|
||||
cate: cateRes || [],
|
||||
reason: reasonRes || [],
|
||||
location: locationRes || [],
|
||||
backup: backupRes || []
|
||||
});
|
||||
|
||||
// Set default category if new
|
||||
if (!initialData && cateRes && cateRes.length > 0) {
|
||||
setFormData(prev => ({ ...prev, cate: cateRes[0].svalue }));
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to load codes:', error);
|
||||
}
|
||||
};
|
||||
|
||||
const loadUsers = async () => {
|
||||
try {
|
||||
const userList = await comms.getUserList('');
|
||||
if (userList && userList.length > 0) {
|
||||
const mappedUsers = userList.map((u: any) => ({
|
||||
id: u.id || u.Id,
|
||||
name: u.name || u.NameK || u.id
|
||||
}));
|
||||
setUsers(mappedUsers);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to load users:', error);
|
||||
}
|
||||
};
|
||||
|
||||
const handleSave = async () => {
|
||||
// Validation
|
||||
if (!formData.cate && requestType === 'day') {
|
||||
alert('구분을 선택하세요.');
|
||||
return;
|
||||
}
|
||||
if (formData.sdate > formData.edate) {
|
||||
alert('종료일이 시작일보다 빠를 수 없습니다.');
|
||||
return;
|
||||
}
|
||||
|
||||
// Prepare data based on type
|
||||
const dataToSave = { ...formData };
|
||||
if (requestType === 'out') {
|
||||
dataToSave.cate = '외출';
|
||||
dataToSave.HolyDays = 0;
|
||||
// Calculate times if needed, or rely on user input?
|
||||
// WinForms doesn't seem to auto-calc times for 'out', just saves stime/etime.
|
||||
} else if (requestType === 'time') {
|
||||
dataToSave.cate = '대체';
|
||||
dataToSave.HolyDays = 0;
|
||||
} else {
|
||||
// Day
|
||||
dataToSave.HolyTimes = 0;
|
||||
dataToSave.stime = '';
|
||||
dataToSave.etime = '';
|
||||
|
||||
// Calculate days
|
||||
const start = new Date(dataToSave.sdate);
|
||||
const end = new Date(dataToSave.edate);
|
||||
const diffTime = Math.abs(end.getTime() - start.getTime());
|
||||
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1;
|
||||
dataToSave.HolyDays = diffDays;
|
||||
}
|
||||
|
||||
setLoading(true);
|
||||
try {
|
||||
const response = await comms.saveHolidayRequest(dataToSave);
|
||||
if (response.Success) {
|
||||
onSave();
|
||||
onClose();
|
||||
} else {
|
||||
alert('저장 실패: ' + response.Message);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Save error:', error);
|
||||
alert('저장 중 오류가 발생했습니다.');
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
if (!isOpen) return null;
|
||||
|
||||
return (
|
||||
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm p-4">
|
||||
<div className="bg-white rounded-xl shadow-2xl w-full max-w-2xl max-h-[90vh] overflow-y-auto">
|
||||
{/* Header */}
|
||||
<div className="flex items-center justify-between px-6 py-4 border-b border-gray-100">
|
||||
<h2 className="text-xl font-bold text-gray-800">
|
||||
{formData.idx === 0 ? '휴가/외출 신청' : '신청 내역 수정'}
|
||||
</h2>
|
||||
<button onClick={onClose} className="p-2 hover:bg-gray-100 rounded-full transition-colors">
|
||||
<X className="w-5 h-5 text-gray-500" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Body */}
|
||||
<div className="p-6 space-y-6">
|
||||
{/* Request Type */}
|
||||
<div className="flex gap-4 p-4 bg-gray-50 rounded-lg">
|
||||
<label className="flex items-center gap-2 cursor-pointer">
|
||||
<input
|
||||
type="radio"
|
||||
name="type"
|
||||
checked={requestType === 'day'}
|
||||
onChange={() => setRequestType('day')}
|
||||
className="w-4 h-4 text-blue-600"
|
||||
disabled={formData.idx > 0 && initialData?.cate !== '대체' && initialData?.cate !== '외출'}
|
||||
/>
|
||||
<span className="font-medium text-gray-700">일반휴가</span>
|
||||
</label>
|
||||
<label className="flex items-center gap-2 cursor-pointer">
|
||||
<input
|
||||
type="radio"
|
||||
name="type"
|
||||
checked={requestType === 'time'}
|
||||
onChange={() => setRequestType('time')}
|
||||
className="w-4 h-4 text-blue-600"
|
||||
disabled={formData.idx > 0 && initialData?.cate !== '대체'}
|
||||
/>
|
||||
<span className="font-medium text-gray-700">대체휴가(시간)</span>
|
||||
</label>
|
||||
<label className="flex items-center gap-2 cursor-pointer">
|
||||
<input
|
||||
type="radio"
|
||||
name="type"
|
||||
checked={requestType === 'out'}
|
||||
onChange={() => setRequestType('out')}
|
||||
className="w-4 h-4 text-blue-600"
|
||||
disabled={formData.idx > 0 && initialData?.cate !== '외출'}
|
||||
/>
|
||||
<span className="font-medium text-gray-700">외출</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
{/* User Selection (Admin only) */}
|
||||
{userLevel >= 5 && (
|
||||
<div className="grid grid-cols-1 gap-2">
|
||||
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
|
||||
<User className="w-4 h-4" /> 신청자
|
||||
</label>
|
||||
<select
|
||||
value={formData.uid}
|
||||
onChange={(e) => setFormData({ ...formData, uid: e.target.value })}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||
disabled={formData.idx > 0}
|
||||
>
|
||||
{users.map(user => (
|
||||
<option key={user.id} value={user.id}>{user.name} ({user.id})</option>
|
||||
))}
|
||||
</select>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Date & Time */}
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
|
||||
<Calendar className="w-4 h-4" /> 시작일
|
||||
</label>
|
||||
<input
|
||||
type="date"
|
||||
value={formData.sdate}
|
||||
onChange={(e) => setFormData({ ...formData, sdate: e.target.value })}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||
/>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
|
||||
<Calendar className="w-4 h-4" /> 종료일
|
||||
</label>
|
||||
<input
|
||||
type="date"
|
||||
value={formData.edate}
|
||||
onChange={(e) => setFormData({ ...formData, edate: e.target.value })}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{(requestType === 'time' || requestType === 'out') && (
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
|
||||
<Clock className="w-4 h-4" /> 시작 시간
|
||||
</label>
|
||||
<input
|
||||
type="time"
|
||||
value={formData.stime}
|
||||
onChange={(e) => setFormData({ ...formData, stime: e.target.value })}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||
/>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
|
||||
<Clock className="w-4 h-4" /> 종료 시간
|
||||
</label>
|
||||
<input
|
||||
type="time"
|
||||
value={formData.etime}
|
||||
onChange={(e) => setFormData({ ...formData, etime: e.target.value })}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Category & Reason */}
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
|
||||
<FileText className="w-4 h-4" /> 구분
|
||||
</label>
|
||||
{requestType === 'day' ? (
|
||||
<select
|
||||
value={formData.cate}
|
||||
onChange={(e) => setFormData({ ...formData, cate: e.target.value })}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||
>
|
||||
{codes.cate.map(code => (
|
||||
<option key={code.code} value={code.svalue}>{code.svalue}</option>
|
||||
))}
|
||||
</select>
|
||||
) : (
|
||||
<input
|
||||
type="text"
|
||||
value={requestType === 'out' ? '외출' : '대체'}
|
||||
disabled
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg bg-gray-100 text-gray-500"
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
|
||||
<AlertCircle className="w-4 h-4" /> 사유
|
||||
</label>
|
||||
<select
|
||||
value={formData.HolyReason}
|
||||
onChange={(e) => setFormData({ ...formData, HolyReason: e.target.value })}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||
>
|
||||
<option value="">선택하세요</option>
|
||||
{codes.reason.map(code => (
|
||||
<option key={code.code} value={code.svalue}>{code.svalue}</option>
|
||||
))}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Location & Backup */}
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
|
||||
<MapPin className="w-4 h-4" /> 행선지
|
||||
</label>
|
||||
<select
|
||||
value={formData.HolyLocation}
|
||||
onChange={(e) => setFormData({ ...formData, HolyLocation: e.target.value })}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||
>
|
||||
<option value="">선택하세요</option>
|
||||
{codes.location.map(code => (
|
||||
<option key={code.code} value={code.svalue}>{code.svalue}</option>
|
||||
))}
|
||||
</select>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
|
||||
<User className="w-4 h-4" /> 업무대행
|
||||
</label>
|
||||
<select
|
||||
value={formData.HolyBackup}
|
||||
onChange={(e) => setFormData({ ...formData, HolyBackup: e.target.value })}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||
>
|
||||
<option value="">선택하세요</option>
|
||||
{codes.backup.map(code => (
|
||||
<option key={code.code} value={code.svalue}>{code.svalue}</option>
|
||||
))}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Days & Times (Manual Override) */}
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium text-gray-700">일수</label>
|
||||
<input
|
||||
type="number"
|
||||
step="0.5"
|
||||
value={formData.HolyDays}
|
||||
onChange={(e) => setFormData({ ...formData, HolyDays: parseFloat(e.target.value) })}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||
disabled={requestType !== 'day'}
|
||||
/>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium text-gray-700">시간</label>
|
||||
<input
|
||||
type="number"
|
||||
step="0.5"
|
||||
value={formData.HolyTimes}
|
||||
onChange={(e) => setFormData({ ...formData, HolyTimes: parseFloat(e.target.value) })}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||
disabled={requestType === 'day'}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Remark */}
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium text-gray-700">비고</label>
|
||||
<textarea
|
||||
value={formData.Remark}
|
||||
onChange={(e) => setFormData({ ...formData, Remark: e.target.value })}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent h-20 resize-none"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* Admin Response & Confirmation */}
|
||||
{userLevel >= 5 && (
|
||||
<div className="p-4 bg-blue-50 rounded-lg space-y-4 border border-blue-100">
|
||||
<h3 className="font-semibold text-blue-800">관리자 승인</h3>
|
||||
<div className="flex gap-4">
|
||||
<label className="flex items-center gap-2 cursor-pointer">
|
||||
<input
|
||||
type="radio"
|
||||
name="conf"
|
||||
checked={formData.conf === 0}
|
||||
onChange={() => setFormData({ ...formData, conf: 0 })}
|
||||
className="w-4 h-4 text-blue-600"
|
||||
/>
|
||||
<span className="text-gray-700">미승인</span>
|
||||
</label>
|
||||
<label className="flex items-center gap-2 cursor-pointer">
|
||||
<input
|
||||
type="radio"
|
||||
name="conf"
|
||||
checked={formData.conf === 1}
|
||||
onChange={() => setFormData({ ...formData, conf: 1 })}
|
||||
className="w-4 h-4 text-green-600"
|
||||
/>
|
||||
<span className="text-gray-700">승인</span>
|
||||
</label>
|
||||
<label className="flex items-center gap-2 cursor-pointer">
|
||||
<input
|
||||
type="radio"
|
||||
name="conf"
|
||||
checked={formData.conf === 2}
|
||||
onChange={() => setFormData({ ...formData, conf: 2 })}
|
||||
className="w-4 h-4 text-red-600"
|
||||
/>
|
||||
<span className="text-gray-700">반려</span>
|
||||
</label>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium text-gray-700">관리자 메모</label>
|
||||
<input
|
||||
type="text"
|
||||
value={formData.Response}
|
||||
onChange={(e) => setFormData({ ...formData, Response: e.target.value })}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Footer */}
|
||||
<div className="flex items-center justify-end gap-3 px-6 py-4 border-t border-gray-100 bg-gray-50 rounded-b-xl">
|
||||
<button
|
||||
onClick={onClose}
|
||||
className="px-4 py-2 text-gray-600 hover:bg-gray-200 rounded-lg transition-colors font-medium"
|
||||
>
|
||||
취소
|
||||
</button>
|
||||
<button
|
||||
onClick={handleSave}
|
||||
disabled={loading}
|
||||
className="flex items-center gap-2 px-6 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg shadow-lg shadow-blue-500/30 transition-all font-medium disabled:opacity-50"
|
||||
>
|
||||
<Save className="w-4 h-4" />
|
||||
{loading ? '저장 중...' : '저장'}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -319,7 +319,7 @@ export function JobReportDayDialog({ isOpen, onClose, initialMonth }: JobReportD
|
||||
);
|
||||
})}
|
||||
<td className="px-3 py-2 text-center text-sm text-white border border-white/10 font-medium whitespace-nowrap">
|
||||
{row.totalHrs}+{row.totalOt}(*{row.totalHolidayOt})
|
||||
{row.totalHrs.toFixed(1)}+{row.totalOt.toFixed(1)}(*{row.totalHolidayOt.toFixed(1)})
|
||||
</td>
|
||||
</tr>
|
||||
))
|
||||
|
||||
@@ -95,12 +95,15 @@ export function JobreportEditModal({
|
||||
try {
|
||||
// WebSocket 모드에서는 같은 응답타입을 사용하므로 순차적으로 로드
|
||||
const requestPart = await comms.getCommonList('13'); // 요청부서
|
||||
if (requestPart) requestPart.sort((a, b) => (a.memo || a.svalue || '').localeCompare(b.memo || b.svalue || ''));
|
||||
setRequestPartList(requestPart || []);
|
||||
|
||||
const packages = await comms.getCommonList('14'); // 패키지
|
||||
if (packages) packages.sort((a, b) => (a.memo || a.svalue || '').localeCompare(b.memo || b.svalue || ''));
|
||||
setPackageList(packages || []);
|
||||
|
||||
const processes = await comms.getCommonList('16'); // 공정(프로세스)
|
||||
if (processes) processes.sort((a, b) => (a.memo || a.svalue || '').localeCompare(b.memo || b.svalue || ''));
|
||||
setProcessList(processes || []);
|
||||
|
||||
const statuses = await comms.getCommonList('12'); // 상태
|
||||
@@ -118,6 +121,58 @@ export function JobreportEditModal({
|
||||
}
|
||||
}, [isOpen, loadCommonCodes]);
|
||||
|
||||
// 모달 열릴 때 프로젝트가 설정되어 있으면 자동으로 최종 설정 불러오기
|
||||
useEffect(() => {
|
||||
const loadLastSettings = async () => {
|
||||
// 신규 등록이고, 프로젝트가 설정되어 있으며, 기본값이 비어있는 경우에만 자동 로드
|
||||
if (isOpen && !editingItem && formData.pidx && formData.pidx > 0) {
|
||||
// 이미 설정된 값이 있으면 자동 로드하지 않음 (복사 기능 등에서 이미 값이 있을 수 있음)
|
||||
const hasExistingSettings = formData.requestpart || formData.package || formData.type || formData.process;
|
||||
if (hasExistingSettings) {
|
||||
setPreviousProjectIdx(formData.pidx);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const lastReport = await comms.getLastJobReportByProject(formData.pidx, formData.projectName);
|
||||
if (lastReport.Success && lastReport.Data) {
|
||||
const updatedFormData = { ...formData };
|
||||
|
||||
if (lastReport.Data.requestpart) {
|
||||
updatedFormData.requestpart = lastReport.Data.requestpart;
|
||||
}
|
||||
if (lastReport.Data.package) {
|
||||
updatedFormData.package = lastReport.Data.package;
|
||||
}
|
||||
if (lastReport.Data.type) {
|
||||
updatedFormData.type = lastReport.Data.type;
|
||||
}
|
||||
if (lastReport.Data.jobgrp) {
|
||||
updatedFormData.jobgrp = lastReport.Data.jobgrp;
|
||||
}
|
||||
if (lastReport.Data.process) {
|
||||
updatedFormData.process = lastReport.Data.process;
|
||||
}
|
||||
if (lastReport.Data.status) {
|
||||
updatedFormData.status = lastReport.Data.status;
|
||||
}
|
||||
|
||||
onFormChange(updatedFormData);
|
||||
}
|
||||
setPreviousProjectIdx(formData.pidx);
|
||||
} catch (error) {
|
||||
console.error('최종 설정 불러오기 오류:', error);
|
||||
setPreviousProjectIdx(formData.pidx);
|
||||
}
|
||||
} else if (isOpen && !editingItem) {
|
||||
// 신규 등록인데 프로젝트가 없으면 초기화
|
||||
setPreviousProjectIdx(null);
|
||||
}
|
||||
};
|
||||
|
||||
loadLastSettings();
|
||||
}, [isOpen, editingItem]);
|
||||
|
||||
if (!isOpen) return null;
|
||||
|
||||
const handleFieldChange = <K extends keyof JobreportFormData>(
|
||||
@@ -210,7 +265,9 @@ export function JobreportEditModal({
|
||||
onMouseDown={(e) => e.stopPropagation()}
|
||||
>
|
||||
{/* 헤더 */}
|
||||
<div className="px-6 py-4 border-b border-white/10 flex items-center justify-between sticky top-0 bg-slate-800/95 backdrop-blur z-10">
|
||||
<div className={`px-6 py-4 border-b border-white/10 flex items-center justify-between sticky top-0 backdrop-blur z-10 ${
|
||||
editingItem ? 'bg-slate-800/95' : 'bg-primary-600/30'
|
||||
}`}>
|
||||
<h2 className="text-xl font-semibold text-white flex items-center">
|
||||
<FileText className="w-5 h-5 mr-2" />
|
||||
{editingItem ? '업무일지 수정' : '업무일지 등록'}
|
||||
|
||||
@@ -15,14 +15,19 @@ import {
|
||||
User,
|
||||
Users,
|
||||
CalendarDays,
|
||||
Calendar,
|
||||
Mail,
|
||||
Shield,
|
||||
List,
|
||||
AlertTriangle,
|
||||
Building,
|
||||
Star,
|
||||
Bug,
|
||||
Settings,
|
||||
Key,
|
||||
} from 'lucide-react';
|
||||
import { clsx } from 'clsx';
|
||||
import { comms } from '@/communication';
|
||||
import { UserInfoDialog } from '@/components/user/UserInfoDialog';
|
||||
import { UserGroupDialog } from '@/components/user/UserGroupDialog';
|
||||
import { KuntaeErrorCheckDialog } from '@/components/kuntae/KuntaeErrorCheckDialog';
|
||||
@@ -38,6 +43,7 @@ interface NavItem {
|
||||
icon: React.ElementType;
|
||||
label: string;
|
||||
action?: string;
|
||||
className?: string; // 추가: 클래스 이름
|
||||
}
|
||||
|
||||
interface SubMenu {
|
||||
@@ -53,6 +59,7 @@ interface MenuItem {
|
||||
label: string;
|
||||
submenu?: SubMenu;
|
||||
action?: string;
|
||||
className?: string; // gold 등 스타일 적용용
|
||||
}
|
||||
|
||||
interface DropdownMenuConfig {
|
||||
@@ -75,58 +82,76 @@ const leftDropdownMenus: DropdownMenuConfig[] = [
|
||||
items: [
|
||||
{ type: 'link', path: '/kuntae', icon: List, label: '목록' },
|
||||
{ type: 'action', icon: AlertTriangle, label: '오류검사', action: 'kuntaeErrorCheck' },
|
||||
{ type: 'link', path: '/holiday-request', icon: Calendar, label: '휴가/외출 신청' },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: '관리',
|
||||
icon: Settings,
|
||||
items: [
|
||||
{ type: 'link', path: '/license', icon: Key, label: '라이선스' },
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
// 좌측 단독 액션 버튼 (즐겨찾기)
|
||||
const leftActionItems: NavItem[] = [
|
||||
{ icon: Star, label: '즐겨찾기', action: 'favorite' },
|
||||
];
|
||||
// 좌측 단독 액션 버튼
|
||||
const leftActionItems: NavItem[] = [];
|
||||
|
||||
// 우측 메뉴 항목
|
||||
const rightNavItems: NavItem[] = [
|
||||
{ icon: Star, label: '즐겨찾기', action: 'favorite' },
|
||||
{ path: '/todo', icon: CheckSquare, label: '할일' },
|
||||
];
|
||||
|
||||
// 드롭다운 메뉴 (2단계 지원)
|
||||
const dropdownMenus: DropdownMenuConfig[] = [
|
||||
{
|
||||
label: '공용정보',
|
||||
icon: Database,
|
||||
items: [
|
||||
{ type: 'link', path: '/common', icon: Code, label: '공용코드' },
|
||||
{ type: 'link', path: '/items', icon: Package, label: '품목정보' },
|
||||
{ type: 'link', path: '/customs', icon: Building, label: '업체정보' },
|
||||
{
|
||||
type: 'submenu',
|
||||
icon: Users,
|
||||
label: '사용자',
|
||||
submenu: {
|
||||
label: '사용자',
|
||||
const getDropdownMenus = (userLevel: number, userCode: string): DropdownMenuConfig[] => {
|
||||
const mailListItem = {
|
||||
type: 'link' as const,
|
||||
path: '/mail-list',
|
||||
icon: Mail,
|
||||
label: '메일 내역',
|
||||
className: (userCode === '395552') ? 'text-[gold] font-bold' : '',
|
||||
};
|
||||
|
||||
return [
|
||||
{
|
||||
label: '공용정보',
|
||||
icon: Database,
|
||||
items: [
|
||||
{ type: 'link', path: '/common', icon: Code, label: '공용코드' },
|
||||
{ type: 'link', path: '/items', icon: Package, label: '품목정보' },
|
||||
{ type: 'link', path: '/customs', icon: Building, label: '업체정보' },
|
||||
{
|
||||
type: 'submenu',
|
||||
icon: Users,
|
||||
items: [
|
||||
{ icon: User, label: '정보', action: 'userInfo' },
|
||||
{ path: '/user/list', icon: Users, label: '목록' },
|
||||
{ path: '/user/auth', icon: Shield, label: '권한' },
|
||||
{ icon: Users, label: '그룹정보', action: 'userGroup' },
|
||||
],
|
||||
label: '사용자',
|
||||
submenu: {
|
||||
label: '사용자',
|
||||
icon: Users,
|
||||
items: [
|
||||
{ icon: User, label: '정보', action: 'userInfo' },
|
||||
{ path: '/user/list', icon: Users, label: '목록' },
|
||||
{ path: '/user/auth', icon: Shield, label: '권한' },
|
||||
{ icon: Users, label: '그룹정보', action: 'userGroup' },
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{ type: 'link', path: '/monthly-work', icon: CalendarDays, label: '월별근무표' },
|
||||
{ type: 'link', path: '/mail-form', icon: Mail, label: '메일양식' },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: '문서',
|
||||
icon: FileText,
|
||||
items: [
|
||||
{ type: 'link', path: '/note', icon: FileText, label: '메모장' },
|
||||
{ type: 'link', path: '/patch-list', icon: FileText, label: '패치 내역' },
|
||||
{ type: 'link', path: '/mail-list', icon: Mail, label: '메일 내역' },
|
||||
],
|
||||
},
|
||||
];
|
||||
{ type: 'link', path: '/monthly-work', icon: CalendarDays, label: '월별근무표' },
|
||||
{ type: 'link', path: '/mail-form', icon: Mail, label: '메일양식' },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: '문서',
|
||||
icon: FileText,
|
||||
items: [
|
||||
{ type: 'link', path: '/note', icon: FileText, label: '메모장' },
|
||||
{ type: 'link', path: '/patch-list', icon: FileText, label: '패치 내역' },
|
||||
{ type: 'link', path: '/bug-report', icon: Bug, label: '버그 신고' },
|
||||
...(userLevel >= 9 || userCode === '395552' ? [mailListItem] : []),
|
||||
],
|
||||
},
|
||||
];
|
||||
};
|
||||
|
||||
function DropdownNavMenu({
|
||||
menu,
|
||||
@@ -193,7 +218,7 @@ function DropdownNavMenu({
|
||||
'flex items-center space-x-2 px-4 py-2 text-sm transition-colors',
|
||||
isActive
|
||||
? 'bg-white/20 text-white'
|
||||
: 'text-white/70 hover:bg-white/10 hover:text-white'
|
||||
: (item.className || 'text-white/70 hover:bg-white/10 hover:text-white')
|
||||
)
|
||||
}
|
||||
>
|
||||
@@ -325,7 +350,7 @@ function MobileDropdownMenu({
|
||||
'flex items-center space-x-3 px-4 py-2 rounded-lg transition-all duration-200',
|
||||
isActive
|
||||
? 'bg-white/20 text-white'
|
||||
: 'text-white/70 hover:bg-white/10 hover:text-white'
|
||||
: (item.className || 'text-white/70 hover:bg-white/10 hover:text-white')
|
||||
)
|
||||
}
|
||||
>
|
||||
@@ -372,7 +397,7 @@ function MobileDropdownMenu({
|
||||
'flex items-center space-x-3 px-4 py-2 rounded-lg transition-all duration-200',
|
||||
isActive
|
||||
? 'bg-white/20 text-white'
|
||||
: 'text-white/70 hover:bg-white/10 hover:text-white'
|
||||
: (item.className || 'text-white/70 hover:bg-white/10 hover:text-white')
|
||||
)
|
||||
}
|
||||
>
|
||||
@@ -408,6 +433,27 @@ export function Header(_props: HeaderProps) {
|
||||
const [showUserGroupDialog, setShowUserGroupDialog] = useState(false);
|
||||
const [showKuntaeErrorCheckDialog, setShowKuntaeErrorCheckDialog] = useState(false);
|
||||
const [showFavoriteDialog, setShowFavoriteDialog] = useState(false);
|
||||
const [userLevel, setUserLevel] = useState<number>(0);
|
||||
const [userCode, setUserCode] = useState<string>('');
|
||||
|
||||
// 사용자 정보 로드
|
||||
useEffect(() => {
|
||||
const loadUserInfo = async () => {
|
||||
try {
|
||||
const loginStatus = await comms.checkLoginStatus();
|
||||
console.log('Login Status:', loginStatus);
|
||||
if (loginStatus.Success && loginStatus.IsLoggedIn && loginStatus.User) {
|
||||
const user = loginStatus.User as { Level?: number; Id?: string };
|
||||
setUserLevel(user.Level || 0);
|
||||
setUserCode(user.Id || '');
|
||||
console.log('userLevel:', user.Level, 'userCode:', user.Id);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('사용자 정보 로드 오류:', error);
|
||||
}
|
||||
};
|
||||
loadUserInfo();
|
||||
}, []);
|
||||
|
||||
const handleAction = (action: string) => {
|
||||
if (action === 'userInfo') {
|
||||
@@ -484,27 +530,38 @@ export function Header(_props: HeaderProps) {
|
||||
{/* Desktop Navigation - Right */}
|
||||
<nav className="hidden lg:flex items-center space-x-1">
|
||||
{/* 드롭다운 메뉴들 (공용정보) */}
|
||||
{dropdownMenus.map((menu) => (
|
||||
{getDropdownMenus(userLevel, userCode).map((menu) => (
|
||||
<DropdownNavMenu key={menu.label} menu={menu} onAction={handleAction} />
|
||||
))}
|
||||
|
||||
{/* 우측 메뉴들 (할일) */}
|
||||
{/* 우측 메뉴들 (즐겨찾기, 할일) */}
|
||||
{rightNavItems.map((item) => (
|
||||
<NavLink
|
||||
key={item.path}
|
||||
to={item.path!}
|
||||
className={({ isActive }) =>
|
||||
clsx(
|
||||
'flex items-center space-x-2 px-4 py-2 rounded-lg transition-all duration-200 text-sm font-medium',
|
||||
isActive
|
||||
? 'bg-white/20 text-white shadow-lg'
|
||||
: 'text-white/70 hover:bg-white/10 hover:text-white'
|
||||
)
|
||||
}
|
||||
>
|
||||
<item.icon className="w-4 h-4" />
|
||||
<span>{item.label}</span>
|
||||
</NavLink>
|
||||
item.path ? (
|
||||
<NavLink
|
||||
key={item.path}
|
||||
to={item.path}
|
||||
className={({ isActive }) =>
|
||||
clsx(
|
||||
'flex items-center space-x-2 px-4 py-2 rounded-lg transition-all duration-200 text-sm font-medium',
|
||||
isActive
|
||||
? 'bg-white/20 text-white shadow-lg'
|
||||
: 'text-white/70 hover:bg-white/10 hover:text-white'
|
||||
)
|
||||
}
|
||||
>
|
||||
<item.icon className="w-4 h-4" />
|
||||
<span>{item.label}</span>
|
||||
</NavLink>
|
||||
) : (
|
||||
<button
|
||||
key={item.label}
|
||||
onClick={() => item.action && handleAction(item.action)}
|
||||
className="flex items-center space-x-2 px-4 py-2 rounded-lg transition-all duration-200 text-sm font-medium text-white/70 hover:bg-white/10 hover:text-white"
|
||||
>
|
||||
<item.icon className="w-4 h-4" />
|
||||
<span>{item.label}</span>
|
||||
</button>
|
||||
)
|
||||
))}
|
||||
</nav>
|
||||
</div>
|
||||
@@ -562,7 +619,7 @@ export function Header(_props: HeaderProps) {
|
||||
<div className="border-t border-white/10 my-2" />
|
||||
|
||||
{/* 우측 드롭다운 메뉴들 (공용정보) */}
|
||||
{dropdownMenus.map((menu) => (
|
||||
{getDropdownMenus(userLevel, userCode).map((menu) => (
|
||||
<MobileDropdownMenu
|
||||
key={menu.label}
|
||||
menu={menu}
|
||||
@@ -571,24 +628,38 @@ export function Header(_props: HeaderProps) {
|
||||
/>
|
||||
))}
|
||||
|
||||
{/* 우측 메뉴들 (할일) */}
|
||||
{/* 우측 메뉴들 (즐겨찾기, 할일) */}
|
||||
{rightNavItems.map((item) => (
|
||||
<NavLink
|
||||
key={item.path}
|
||||
to={item.path!}
|
||||
onClick={() => setIsMobileMenuOpen(false)}
|
||||
className={({ isActive }) =>
|
||||
clsx(
|
||||
'flex items-center space-x-3 px-4 py-3 rounded-lg transition-all duration-200',
|
||||
isActive
|
||||
? 'bg-white/20 text-white'
|
||||
: 'text-white/70 hover:bg-white/10 hover:text-white'
|
||||
)
|
||||
}
|
||||
>
|
||||
<item.icon className="w-5 h-5" />
|
||||
<span className="font-medium">{item.label}</span>
|
||||
</NavLink>
|
||||
item.path ? (
|
||||
<NavLink
|
||||
key={item.path}
|
||||
to={item.path}
|
||||
onClick={() => setIsMobileMenuOpen(false)}
|
||||
className={({ isActive }) =>
|
||||
clsx(
|
||||
'flex items-center space-x-3 px-4 py-3 rounded-lg transition-all duration-200',
|
||||
isActive
|
||||
? 'bg-white/20 text-white'
|
||||
: 'text-white/70 hover:bg-white/10 hover:text-white'
|
||||
)
|
||||
}
|
||||
>
|
||||
<item.icon className="w-5 h-5" />
|
||||
<span className="font-medium">{item.label}</span>
|
||||
</NavLink>
|
||||
) : (
|
||||
<button
|
||||
key={item.label}
|
||||
onClick={() => {
|
||||
if (item.action) handleAction(item.action);
|
||||
setIsMobileMenuOpen(false);
|
||||
}}
|
||||
className="flex items-center space-x-3 px-4 py-3 rounded-lg transition-all duration-200 text-white/70 hover:bg-white/10 hover:text-white w-full text-left"
|
||||
>
|
||||
<item.icon className="w-5 h-5" />
|
||||
<span className="font-medium">{item.label}</span>
|
||||
</button>
|
||||
)
|
||||
))}
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
@@ -12,6 +12,7 @@ interface StatusBarProps {
|
||||
export function StatusBar({ userName, userDept, isConnected }: StatusBarProps) {
|
||||
const [currentTime, setCurrentTime] = useState(new Date());
|
||||
const [versionDisplay, setVersionDisplay] = useState('');
|
||||
const [hasNewVersion, setHasNewVersion] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
const timer = setInterval(() => setCurrentTime(new Date()), 1000);
|
||||
@@ -25,6 +26,7 @@ export function StatusBar({ userName, userDept, isConnected }: StatusBarProps) {
|
||||
const result = await comms.getAppVersion();
|
||||
if (result.Success) {
|
||||
setVersionDisplay(result.DisplayVersion);
|
||||
setHasNewVersion(result.HasNewVersion || false);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('버전 정보 로드 오류:', error);
|
||||
@@ -41,8 +43,13 @@ export function StatusBar({ userName, userDept, isConnected }: StatusBarProps) {
|
||||
</div>
|
||||
|
||||
{/* Center: App Version */}
|
||||
<div className="text-white/50">
|
||||
<div className={`font-medium ${hasNewVersion ? 'text-yellow-400 animate-pulse' : 'text-white/50'}`}>
|
||||
{versionDisplay || 'Loading...'}
|
||||
{hasNewVersion && (
|
||||
<span className="ml-2 text-xs bg-yellow-500/20 text-yellow-400 px-2 py-0.5 rounded animate-pulse">
|
||||
업데이트 필요
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Right: Connection Status & Time */}
|
||||
|
||||
293
Project/frontend/src/components/license/LicenseEditDialog.tsx
Normal file
293
Project/frontend/src/components/license/LicenseEditDialog.tsx
Normal file
@@ -0,0 +1,293 @@
|
||||
import { X, Save, Trash2 } from 'lucide-react';
|
||||
import { useState, useEffect } from 'react';
|
||||
import type { LicenseItem } from '@/types';
|
||||
|
||||
interface LicenseEditDialogProps {
|
||||
item: LicenseItem | null;
|
||||
isOpen: boolean;
|
||||
onClose: () => void;
|
||||
onSave: (data: Partial<LicenseItem>) => Promise<void>;
|
||||
onDelete?: (idx: number) => Promise<void>;
|
||||
}
|
||||
|
||||
export function LicenseEditDialog({ item, isOpen, onClose, onSave, onDelete }: LicenseEditDialogProps) {
|
||||
const [formData, setFormData] = useState<Partial<LicenseItem>>({});
|
||||
const [saving, setSaving] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (item) {
|
||||
setFormData({
|
||||
idx: item.idx,
|
||||
expire: item.expire || false,
|
||||
name: item.name || '',
|
||||
version: item.version || '',
|
||||
meterialNo: item.meterialNo || '',
|
||||
supply: item.supply || '',
|
||||
qty: item.qty || 1,
|
||||
uids: item.uids || '',
|
||||
serialNo: item.serialNo || '',
|
||||
remark: item.remark || '',
|
||||
sdate: item.sdate ? item.sdate.split('T')[0] : '',
|
||||
edate: item.edate ? item.edate.split('T')[0] : '',
|
||||
manu: item.manu || '',
|
||||
});
|
||||
}
|
||||
}, [item]);
|
||||
|
||||
useEffect(() => {
|
||||
const handleEscape = (e: KeyboardEvent) => {
|
||||
if (e.key === 'Escape' && isOpen) {
|
||||
onClose();
|
||||
}
|
||||
};
|
||||
|
||||
if (isOpen) {
|
||||
document.addEventListener('keydown', handleEscape);
|
||||
return () => document.removeEventListener('keydown', handleEscape);
|
||||
}
|
||||
}, [isOpen, onClose]);
|
||||
|
||||
const handleSave = async () => {
|
||||
if (!formData.name?.trim()) {
|
||||
alert('제품명을 입력해주세요.');
|
||||
return;
|
||||
}
|
||||
|
||||
setSaving(true);
|
||||
try {
|
||||
await onSave(formData);
|
||||
onClose();
|
||||
} catch (error) {
|
||||
console.error('Save failed:', error);
|
||||
alert('저장에 실패했습니다.');
|
||||
} finally {
|
||||
setSaving(false);
|
||||
}
|
||||
};
|
||||
|
||||
const handleDelete = async () => {
|
||||
if (!formData.idx) return;
|
||||
if (!confirm('삭제하시겠습니까?')) return;
|
||||
|
||||
setSaving(true);
|
||||
try {
|
||||
if (onDelete) {
|
||||
await onDelete(formData.idx);
|
||||
}
|
||||
onClose();
|
||||
} catch (error) {
|
||||
console.error('Delete failed:', error);
|
||||
alert('삭제에 실패했습니다.');
|
||||
} finally {
|
||||
setSaving(false);
|
||||
}
|
||||
};
|
||||
|
||||
if (!isOpen) return null;
|
||||
|
||||
return (
|
||||
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50" onClick={onClose}>
|
||||
<div className="glass-effect rounded-lg w-full max-w-3xl max-h-[90vh] overflow-y-auto m-4" onClick={(e) => e.stopPropagation()}>
|
||||
{/* Header */}
|
||||
<div className="flex items-center justify-between p-4 border-b border-white/10">
|
||||
<h2 className="text-xl font-semibold text-white">
|
||||
{formData.idx ? '라이선스 수정' : '라이선스 추가'}
|
||||
</h2>
|
||||
<button
|
||||
onClick={onClose}
|
||||
className="text-white/70 hover:text-white transition-colors"
|
||||
>
|
||||
<X className="w-6 h-6" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Body */}
|
||||
<div className="p-6 space-y-6">
|
||||
{/* 기본 정보 */}
|
||||
<div className="space-y-4">
|
||||
<h3 className="text-sm font-semibold text-white/90 flex items-center space-x-2 border-b border-white/10 pb-2">
|
||||
<span>기본 정보</span>
|
||||
</h3>
|
||||
<div className="grid grid-cols-12 gap-4">
|
||||
<div className="col-span-1 flex items-center">
|
||||
<label className="flex items-center space-x-2 cursor-pointer">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={formData.expire || false}
|
||||
onChange={(e) => setFormData({ ...formData, expire: e.target.checked })}
|
||||
className="w-4 h-4"
|
||||
/>
|
||||
<span className="text-sm text-white/70">만료</span>
|
||||
</label>
|
||||
</div>
|
||||
<div className="col-span-5">
|
||||
<label className="block text-sm text-white/70 mb-1">제품명 *</label>
|
||||
<input
|
||||
type="text"
|
||||
value={formData.name || ''}
|
||||
onChange={(e) => setFormData({ ...formData, name: e.target.value })}
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
|
||||
/>
|
||||
</div>
|
||||
<div className="col-span-3">
|
||||
<label className="block text-sm text-white/70 mb-1">버전</label>
|
||||
<input
|
||||
type="text"
|
||||
value={formData.version || ''}
|
||||
onChange={(e) => setFormData({ ...formData, version: e.target.value })}
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
|
||||
/>
|
||||
</div>
|
||||
<div className="col-span-3">
|
||||
<label className="block text-sm text-white/70 mb-1">자재번호</label>
|
||||
<input
|
||||
type="text"
|
||||
value={formData.meterialNo || ''}
|
||||
onChange={(e) => setFormData({ ...formData, meterialNo: e.target.value })}
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 공급 정보 */}
|
||||
<div className="space-y-4">
|
||||
<h3 className="text-sm font-semibold text-white/90 flex items-center space-x-2 border-b border-white/10 pb-2">
|
||||
<span>공급 정보</span>
|
||||
</h3>
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label className="block text-sm text-white/70 mb-1">공급업체</label>
|
||||
<input
|
||||
type="text"
|
||||
value={formData.supply || ''}
|
||||
onChange={(e) => setFormData({ ...formData, supply: e.target.value })}
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-sm text-white/70 mb-1">제조사</label>
|
||||
<input
|
||||
type="text"
|
||||
value={formData.manu || ''}
|
||||
onChange={(e) => setFormData({ ...formData, manu: e.target.value })}
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 사용 정보 */}
|
||||
<div className="space-y-4">
|
||||
<h3 className="text-sm font-semibold text-white/90 flex items-center space-x-2 border-b border-white/10 pb-2">
|
||||
<span>사용 정보</span>
|
||||
</h3>
|
||||
<div className="grid grid-cols-12 gap-4">
|
||||
<div className="col-span-2">
|
||||
<label className="block text-sm text-white/70 mb-1">수량</label>
|
||||
<input
|
||||
type="number"
|
||||
value={formData.qty || 1}
|
||||
onChange={(e) => setFormData({ ...formData, qty: parseInt(e.target.value) || 1 })}
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
|
||||
/>
|
||||
</div>
|
||||
<div className="col-span-4">
|
||||
<label className="block text-sm text-white/70 mb-1">사용자</label>
|
||||
<input
|
||||
type="text"
|
||||
value={formData.uids || ''}
|
||||
onChange={(e) => setFormData({ ...formData, uids: e.target.value })}
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
|
||||
/>
|
||||
</div>
|
||||
<div className="col-span-6">
|
||||
<label className="block text-sm text-white/70 mb-1">S/N</label>
|
||||
<input
|
||||
type="text"
|
||||
value={formData.serialNo || ''}
|
||||
onChange={(e) => setFormData({ ...formData, serialNo: e.target.value })}
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 기간 정보 */}
|
||||
<div className="space-y-4">
|
||||
<h3 className="text-sm font-semibold text-white/90 flex items-center space-x-2 border-b border-white/10 pb-2">
|
||||
<span>기간 정보</span>
|
||||
</h3>
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label className="block text-sm text-white/70 mb-1">시작일</label>
|
||||
<input
|
||||
type="date"
|
||||
value={formData.sdate || ''}
|
||||
onChange={(e) => setFormData({ ...formData, sdate: e.target.value })}
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-sm text-white/70 mb-1">종료일</label>
|
||||
<input
|
||||
type="date"
|
||||
value={formData.edate || ''}
|
||||
onChange={(e) => setFormData({ ...formData, edate: e.target.value })}
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 비고 */}
|
||||
<div className="space-y-4">
|
||||
<h3 className="text-sm font-semibold text-white/90 flex items-center space-x-2 border-b border-white/10 pb-2">
|
||||
<span>비고</span>
|
||||
</h3>
|
||||
<textarea
|
||||
value={formData.remark || ''}
|
||||
onChange={(e) => setFormData({ ...formData, remark: e.target.value })}
|
||||
rows={3}
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500 resize-none"
|
||||
placeholder="추가 메모를 입력하세요..."
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Footer */}
|
||||
<div className="flex items-center justify-between p-4 border-t border-white/10">
|
||||
<div>
|
||||
{formData.idx && onDelete && (
|
||||
<button
|
||||
onClick={handleDelete}
|
||||
disabled={saving}
|
||||
className="flex items-center space-x-2 px-4 py-2 bg-red-500 hover:bg-red-600 disabled:bg-gray-600 text-white rounded-lg transition-colors"
|
||||
>
|
||||
<Trash2 className="w-4 h-4" />
|
||||
<span>삭제</span>
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex items-center space-x-2">
|
||||
<button
|
||||
onClick={onClose}
|
||||
disabled={saving}
|
||||
className="px-4 py-2 bg-gray-600 hover:bg-gray-700 disabled:bg-gray-800 text-white rounded-lg transition-colors"
|
||||
>
|
||||
취소
|
||||
</button>
|
||||
<button
|
||||
onClick={handleSave}
|
||||
disabled={saving}
|
||||
className="flex items-center space-x-2 px-4 py-2 bg-blue-500 hover:bg-blue-600 disabled:bg-gray-600 text-white rounded-lg transition-colors"
|
||||
>
|
||||
<Save className="w-4 h-4" />
|
||||
<span>{saving ? '저장 중...' : '저장'}</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
387
Project/frontend/src/components/license/LicenseList.tsx
Normal file
387
Project/frontend/src/components/license/LicenseList.tsx
Normal file
@@ -0,0 +1,387 @@
|
||||
import { useState, useEffect } from 'react';
|
||||
import {
|
||||
Plus,
|
||||
FolderOpen,
|
||||
Download,
|
||||
Search,
|
||||
X,
|
||||
ChevronLeft,
|
||||
ChevronRight,
|
||||
CheckCircle,
|
||||
XCircle,
|
||||
} from 'lucide-react';
|
||||
import { comms } from '@/communication';
|
||||
import { LicenseEditDialog } from './LicenseEditDialog';
|
||||
import type { LicenseItem } from '@/types';
|
||||
|
||||
export function LicenseList() {
|
||||
const [list, setList] = useState<LicenseItem[]>([]);
|
||||
const [filteredList, setFilteredList] = useState<LicenseItem[]>([]);
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [searchText, setSearchText] = useState('');
|
||||
const [selectedItem, setSelectedItem] = useState<LicenseItem | null>(null);
|
||||
const [isDialogOpen, setIsDialogOpen] = useState(false);
|
||||
|
||||
// Pagination
|
||||
const [currentPage, setCurrentPage] = useState(1);
|
||||
const pageSize = 25;
|
||||
|
||||
useEffect(() => {
|
||||
loadData();
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
applyFilter();
|
||||
}, [searchText, list]);
|
||||
|
||||
const loadData = async () => {
|
||||
setLoading(true);
|
||||
try {
|
||||
const response = await comms.getLicenseList();
|
||||
if (response.Success && response.Data) {
|
||||
setList(response.Data);
|
||||
} else {
|
||||
alert(response.Message || '라이선스 목록을 불러오는데 실패했습니다.');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to load license list:', error);
|
||||
alert('라이선스 목록을 불러오는데 실패했습니다.');
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
const applyFilter = () => {
|
||||
if (!searchText.trim()) {
|
||||
setFilteredList(list);
|
||||
return;
|
||||
}
|
||||
|
||||
const search = searchText.toLowerCase();
|
||||
const filtered = list.filter((item) => {
|
||||
return (
|
||||
item.name?.toLowerCase().includes(search) ||
|
||||
item.version?.toLowerCase().includes(search) ||
|
||||
item.supply?.toLowerCase().includes(search) ||
|
||||
item.manu?.toLowerCase().includes(search) ||
|
||||
item.serialNo?.toLowerCase().includes(search) ||
|
||||
item.meterialNo?.toLowerCase().includes(search) ||
|
||||
item.remark?.toLowerCase().includes(search)
|
||||
);
|
||||
});
|
||||
setFilteredList(filtered);
|
||||
setCurrentPage(1);
|
||||
};
|
||||
|
||||
const handleAdd = () => {
|
||||
setSelectedItem({
|
||||
expire: false,
|
||||
name: '',
|
||||
version: '',
|
||||
meterialNo: '',
|
||||
supply: '',
|
||||
qty: 1,
|
||||
uids: '',
|
||||
serialNo: '',
|
||||
remark: '',
|
||||
sdate: new Date().toISOString().split('T')[0],
|
||||
edate: '',
|
||||
manu: '',
|
||||
});
|
||||
setIsDialogOpen(true);
|
||||
};
|
||||
|
||||
const handleRowClick = (item: LicenseItem) => {
|
||||
setSelectedItem(item);
|
||||
setIsDialogOpen(true);
|
||||
};
|
||||
|
||||
const handleSave = async (formData: Partial<LicenseItem>) => {
|
||||
if (!formData.name?.trim()) {
|
||||
alert('제품명을 입력해주세요.');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
setLoading(true);
|
||||
let response;
|
||||
|
||||
if (formData.idx) {
|
||||
// Update
|
||||
response = await comms.updateLicense(
|
||||
formData.idx,
|
||||
formData.name!,
|
||||
formData.version || '',
|
||||
formData.meterialNo || '',
|
||||
formData.supply || '',
|
||||
formData.qty || 1,
|
||||
formData.uids || '',
|
||||
formData.serialNo || '',
|
||||
formData.remark || '',
|
||||
formData.sdate || '',
|
||||
formData.edate || '',
|
||||
formData.manu || '',
|
||||
formData.expire || false
|
||||
);
|
||||
} else {
|
||||
// Add
|
||||
response = await comms.addLicense(
|
||||
formData.name!,
|
||||
formData.version || '',
|
||||
formData.meterialNo || '',
|
||||
formData.supply || '',
|
||||
formData.qty || 1,
|
||||
formData.uids || '',
|
||||
formData.serialNo || '',
|
||||
formData.remark || '',
|
||||
formData.sdate || '',
|
||||
formData.edate || '',
|
||||
formData.manu || '',
|
||||
formData.expire || false
|
||||
);
|
||||
}
|
||||
|
||||
if (response.Success) {
|
||||
alert(response.Message || '저장되었습니다.');
|
||||
await loadData();
|
||||
} else {
|
||||
alert(response.Message || '저장에 실패했습니다.');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to save license:', error);
|
||||
alert('저장에 실패했습니다.');
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
const handleDelete = async (idx: number) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
const response = await comms.deleteLicense(idx);
|
||||
if (response.Success) {
|
||||
alert(response.Message || '삭제되었습니다.');
|
||||
await loadData();
|
||||
} else {
|
||||
alert(response.Message || '삭제에 실패했습니다.');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to delete license:', error);
|
||||
alert('삭제에 실패했습니다.');
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
const handleOpenFolder = async (item: LicenseItem, e: React.MouseEvent) => {
|
||||
e.stopPropagation();
|
||||
if (!item.idx) {
|
||||
alert('저장된 자료만 폴더를 열 수 있습니다.');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await comms.openLicenseFolder(item.idx);
|
||||
if (!response.Success) {
|
||||
alert(response.Message || '폴더 열기에 실패했습니다.');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to open folder:', error);
|
||||
alert('폴더 열기에 실패했습니다.');
|
||||
}
|
||||
};
|
||||
|
||||
const handleExportCSV = async () => {
|
||||
const filename = `license_${new Date().toISOString().split('T')[0]}.csv`;
|
||||
const filepath = `C:\\Temp\\${filename}`;
|
||||
|
||||
try {
|
||||
const response = await comms.exportLicenseCSV(filepath);
|
||||
if (response.Success) {
|
||||
alert(`CSV 파일이 생성되었습니다.\n\n${filepath}`);
|
||||
} else {
|
||||
alert(response.Message || 'CSV 내보내기에 실패했습니다.');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to export CSV:', error);
|
||||
alert('CSV 내보내기에 실패했습니다.');
|
||||
}
|
||||
};
|
||||
|
||||
const handleCloseDialog = () => {
|
||||
setIsDialogOpen(false);
|
||||
setSelectedItem(null);
|
||||
};
|
||||
|
||||
// Pagination
|
||||
const totalPages = Math.ceil(filteredList.length / pageSize);
|
||||
const paginatedList = filteredList.slice(
|
||||
(currentPage - 1) * pageSize,
|
||||
currentPage * pageSize
|
||||
);
|
||||
|
||||
const goToPreviousPage = () => {
|
||||
setCurrentPage((prev) => Math.max(1, prev - 1));
|
||||
};
|
||||
|
||||
const goToNextPage = () => {
|
||||
setCurrentPage((prev) => Math.min(totalPages, prev + 1));
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="p-6 space-y-4">
|
||||
{/* Header */}
|
||||
<div className="flex items-center justify-between">
|
||||
<h1 className="text-2xl font-bold text-white">라이선스 관리</h1>
|
||||
<div className="flex items-center space-x-2">
|
||||
<button
|
||||
onClick={handleAdd}
|
||||
disabled={loading}
|
||||
className="flex items-center space-x-2 px-4 py-2 bg-blue-500 hover:bg-blue-600 disabled:bg-gray-600 text-white rounded-lg transition-colors"
|
||||
>
|
||||
<Plus className="w-4 h-4" />
|
||||
<span>추가</span>
|
||||
</button>
|
||||
<button
|
||||
onClick={handleExportCSV}
|
||||
disabled={loading}
|
||||
className="flex items-center space-x-2 px-4 py-2 bg-green-500 hover:bg-green-600 disabled:bg-gray-600 text-white rounded-lg transition-colors"
|
||||
>
|
||||
<Download className="w-4 h-4" />
|
||||
<span>CSV</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Search */}
|
||||
<div className="flex items-center space-x-2">
|
||||
<div className="flex-1 relative">
|
||||
<Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-white/50" />
|
||||
<input
|
||||
type="text"
|
||||
value={searchText}
|
||||
onChange={(e) => setSearchText(e.target.value)}
|
||||
placeholder="검색 (제품명, 버전, 공급업체, 제조사, S/N, 자재번호, 비고)"
|
||||
className="w-full pl-10 pr-10 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:border-blue-500"
|
||||
/>
|
||||
{searchText && (
|
||||
<button
|
||||
onClick={() => setSearchText('')}
|
||||
className="absolute right-3 top-1/2 -translate-y-1/2 text-white/50 hover:text-white"
|
||||
>
|
||||
<X className="w-4 h-4" />
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Table */}
|
||||
<div className="glass-effect rounded-lg overflow-hidden">
|
||||
<div className="overflow-x-auto">
|
||||
<table className="w-full border-collapse">
|
||||
<thead className="bg-white/10">
|
||||
<tr>
|
||||
<th className="px-4 py-3 text-center text-sm font-semibold text-white border-r border-white/10 w-16">상태</th>
|
||||
<th className="px-4 py-3 text-left text-sm font-semibold text-white border-r border-white/10" style={{ width: '25%' }}>제품명</th>
|
||||
<th className="px-4 py-3 text-left text-sm font-semibold text-white border-r border-white/10" style={{ width: '25%' }}>버전</th>
|
||||
<th className="px-4 py-3 text-left text-sm font-semibold text-white border-r border-white/10 w-20">수량</th>
|
||||
<th className="px-4 py-3 text-left text-sm font-semibold text-white border-r border-white/10" style={{ width: '12%' }}>사용자</th>
|
||||
<th className="px-4 py-3 text-left text-sm font-semibold text-white" style={{ width: '15%' }}>S/N</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{loading && (
|
||||
<tr>
|
||||
<td colSpan={6} className="px-4 py-8 text-center text-white/70">
|
||||
로딩 중...
|
||||
</td>
|
||||
</tr>
|
||||
)}
|
||||
{!loading && paginatedList.length === 0 && (
|
||||
<tr>
|
||||
<td colSpan={6} className="px-4 py-8 text-center text-white/70">
|
||||
데이터가 없습니다.
|
||||
</td>
|
||||
</tr>
|
||||
)}
|
||||
{!loading &&
|
||||
paginatedList.map((item) => (
|
||||
<tr
|
||||
key={item.idx}
|
||||
onClick={() => handleRowClick(item)}
|
||||
className={`border-t border-white/10 hover:bg-white/10 cursor-pointer transition-colors ${
|
||||
item.expire ? 'bg-red-500/10' : ''
|
||||
}`}
|
||||
>
|
||||
<td className="px-4 py-3 text-center border-r border-white/10">
|
||||
<div className="flex justify-center" title={item.expire ? '만료' : '유효'}>
|
||||
{item.expire ? (
|
||||
<XCircle className="w-5 h-5 text-red-500" />
|
||||
) : (
|
||||
<CheckCircle className="w-5 h-5 text-green-500" />
|
||||
)}
|
||||
</div>
|
||||
</td>
|
||||
<td className="px-4 py-3 text-sm text-white border-r border-white/10 max-w-xs">
|
||||
<div className="flex items-center space-x-2">
|
||||
<button
|
||||
onClick={(e) => handleOpenFolder(item, e)}
|
||||
className="p-1 text-yellow-400 hover:text-yellow-300 transition-colors flex-shrink-0"
|
||||
title="폴더 열기"
|
||||
>
|
||||
<FolderOpen className="w-4 h-4" />
|
||||
</button>
|
||||
<span className="break-words">{item.name}</span>
|
||||
</div>
|
||||
</td>
|
||||
<td className="px-4 py-3 text-sm text-white border-r border-white/10 break-words">{item.version}</td>
|
||||
<td className="px-4 py-3 text-sm text-white border-r border-white/10">{item.qty}</td>
|
||||
<td className="px-4 py-3 text-sm text-white border-r border-white/10 break-words max-w-[8rem]">{item.uids}</td>
|
||||
<td className="px-4 py-3 text-sm text-white break-words">{item.serialNo}</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{/* Pagination */}
|
||||
{totalPages > 1 && (
|
||||
<div className="flex items-center justify-between px-4 py-3 border-t border-white/10">
|
||||
<div className="text-sm text-white/70">
|
||||
전체 {filteredList.length}건 중 {(currentPage - 1) * pageSize + 1}~
|
||||
{Math.min(currentPage * pageSize, filteredList.length)}건
|
||||
</div>
|
||||
<div className="flex items-center space-x-2">
|
||||
<button
|
||||
onClick={goToPreviousPage}
|
||||
disabled={currentPage === 1}
|
||||
className="p-2 text-white/70 hover:text-white disabled:text-white/30 disabled:cursor-not-allowed"
|
||||
>
|
||||
<ChevronLeft className="w-5 h-5" />
|
||||
</button>
|
||||
<span className="text-sm text-white">
|
||||
{currentPage} / {totalPages}
|
||||
</span>
|
||||
<button
|
||||
onClick={goToNextPage}
|
||||
disabled={currentPage === totalPages}
|
||||
className="p-2 text-white/70 hover:text-white disabled:text-white/30 disabled:cursor-not-allowed"
|
||||
>
|
||||
<ChevronRight className="w-5 h-5" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Edit Dialog */}
|
||||
<LicenseEditDialog
|
||||
item={selectedItem}
|
||||
isOpen={isDialogOpen}
|
||||
onClose={handleCloseDialog}
|
||||
onSave={handleSave}
|
||||
onDelete={handleDelete}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
304
Project/frontend/src/components/mail/MailTestDialog.tsx
Normal file
304
Project/frontend/src/components/mail/MailTestDialog.tsx
Normal file
@@ -0,0 +1,304 @@
|
||||
import { useState, useEffect } from 'react';
|
||||
import { X, Mail, Send } from 'lucide-react';
|
||||
import { comms } from '@/communication';
|
||||
|
||||
interface MailTestDialogProps {
|
||||
isOpen: boolean;
|
||||
onClose: () => void;
|
||||
}
|
||||
|
||||
export function MailTestDialog({ isOpen, onClose }: MailTestDialogProps) {
|
||||
const [formData, setFormData] = useState({
|
||||
cate: '테스트',
|
||||
subject: '',
|
||||
fromlist: '',
|
||||
tolist: '',
|
||||
cc: '',
|
||||
bcc: '',
|
||||
body: '',
|
||||
});
|
||||
const [processing, setProcessing] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
const loadUserEmail = async () => {
|
||||
try {
|
||||
const response = await comms.checkLoginStatus();
|
||||
if (response.Success && response.IsLoggedIn && response.User) {
|
||||
const user = response.User as { Email?: string };
|
||||
if (user.Email) {
|
||||
setFormData(prev => ({ ...prev, fromlist: user.Email || '' }));
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('사용자 정보 로드 오류:', error);
|
||||
}
|
||||
};
|
||||
|
||||
if (isOpen) {
|
||||
loadUserEmail();
|
||||
}
|
||||
}, [isOpen]);
|
||||
|
||||
useEffect(() => {
|
||||
const handleEscape = (e: KeyboardEvent) => {
|
||||
if (e.key === 'Escape' && isOpen) {
|
||||
onClose();
|
||||
}
|
||||
};
|
||||
|
||||
if (isOpen) {
|
||||
window.addEventListener('keydown', handleEscape);
|
||||
return () => window.removeEventListener('keydown', handleEscape);
|
||||
}
|
||||
}, [isOpen, onClose]);
|
||||
|
||||
const handleSubmit = async (mode: 'queue' | 'direct' | 'outlook' = 'queue') => {
|
||||
if (!formData.subject.trim()) {
|
||||
alert('제목을 입력해주세요.');
|
||||
return;
|
||||
}
|
||||
if (!formData.tolist.trim()) {
|
||||
alert('수신자를 입력해주세요.');
|
||||
return;
|
||||
}
|
||||
if (!formData.body.trim()) {
|
||||
alert('내용을 입력해주세요.');
|
||||
return;
|
||||
}
|
||||
|
||||
setProcessing(true);
|
||||
try {
|
||||
let response;
|
||||
if (mode === 'outlook') {
|
||||
// Outlook 미리보기
|
||||
response = await comms.sendMailOutlook(
|
||||
formData.subject,
|
||||
formData.tolist,
|
||||
formData.cc,
|
||||
formData.bcc,
|
||||
formData.body
|
||||
);
|
||||
} else if (mode === 'direct') {
|
||||
// 직접 발송
|
||||
response = await comms.sendMailDirect(
|
||||
formData.cate,
|
||||
formData.subject,
|
||||
formData.fromlist,
|
||||
formData.tolist,
|
||||
formData.cc,
|
||||
formData.bcc,
|
||||
formData.body
|
||||
);
|
||||
} else {
|
||||
// 발송 대기열에 추가
|
||||
response = await comms.addMailData(
|
||||
formData.cate,
|
||||
formData.subject,
|
||||
formData.fromlist,
|
||||
formData.tolist,
|
||||
formData.cc,
|
||||
formData.bcc,
|
||||
formData.body
|
||||
);
|
||||
}
|
||||
|
||||
if (response.Success) {
|
||||
alert(response.Message || '처리되었습니다.');
|
||||
if (mode !== 'outlook') {
|
||||
onClose();
|
||||
// 폼 초기화
|
||||
setFormData({
|
||||
cate: '테스트',
|
||||
subject: '',
|
||||
fromlist: formData.fromlist, // 발신자는 유지
|
||||
tolist: '',
|
||||
cc: '',
|
||||
bcc: '',
|
||||
body: '',
|
||||
});
|
||||
}
|
||||
} else {
|
||||
alert(response.Message || '메일 처리에 실패했습니다.');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('메일 처리 오류:', error);
|
||||
alert('메일 처리 중 오류가 발생했습니다.');
|
||||
} finally {
|
||||
setProcessing(false);
|
||||
}
|
||||
};
|
||||
|
||||
if (!isOpen) return null;
|
||||
|
||||
return (
|
||||
<div className="fixed inset-0 z-[10000] flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm">
|
||||
<div className="relative w-full max-w-3xl glass-effect-solid rounded-2xl shadow-2xl overflow-hidden">
|
||||
{/* Header */}
|
||||
<div className="flex items-center justify-between px-6 py-4 border-b border-white/10">
|
||||
<div className="flex items-center gap-3">
|
||||
<Mail className="w-5 h-5 text-primary-400" />
|
||||
<h2 className="text-lg font-semibold text-white">메일 테스트</h2>
|
||||
</div>
|
||||
<button
|
||||
onClick={onClose}
|
||||
className="p-2 rounded-lg text-white/60 hover:text-white hover:bg-white/10 transition-colors"
|
||||
>
|
||||
<X className="w-5 h-5" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Content */}
|
||||
<div className="p-6 space-y-4 max-h-[70vh] overflow-y-auto">
|
||||
{/* 분류 */}
|
||||
<div>
|
||||
<label className="block text-white/80 text-sm font-medium mb-2">분류</label>
|
||||
<input
|
||||
type="text"
|
||||
value={formData.cate}
|
||||
onChange={(e) => setFormData({ ...formData, cate: e.target.value })}
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* 제목 */}
|
||||
<div>
|
||||
<label className="block text-white/80 text-sm font-medium mb-2">제목 *</label>
|
||||
<input
|
||||
type="text"
|
||||
value={formData.subject}
|
||||
onChange={(e) => setFormData({ ...formData, subject: e.target.value })}
|
||||
placeholder="메일 제목을 입력하세요"
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* 발신자 */}
|
||||
<div>
|
||||
<label className="block text-white/80 text-sm font-medium mb-2">발신자</label>
|
||||
<input
|
||||
type="text"
|
||||
value={formData.fromlist}
|
||||
onChange={(e) => setFormData({ ...formData, fromlist: e.target.value })}
|
||||
placeholder="발신자 이메일 (쉼표로 구분)"
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* 수신자 */}
|
||||
<div>
|
||||
<label className="block text-white/80 text-sm font-medium mb-2">수신자 *</label>
|
||||
<input
|
||||
type="text"
|
||||
value={formData.tolist}
|
||||
onChange={(e) => setFormData({ ...formData, tolist: e.target.value })}
|
||||
placeholder="수신자 이메일 (쉼표로 구분)"
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* 참조 */}
|
||||
<div>
|
||||
<label className="block text-white/80 text-sm font-medium mb-2">참조 (CC)</label>
|
||||
<input
|
||||
type="text"
|
||||
value={formData.cc}
|
||||
onChange={(e) => setFormData({ ...formData, cc: e.target.value })}
|
||||
placeholder="참조 이메일 (쉼표로 구분)"
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* 숨은참조 */}
|
||||
<div>
|
||||
<label className="block text-white/80 text-sm font-medium mb-2">숨은참조 (BCC)</label>
|
||||
<input
|
||||
type="text"
|
||||
value={formData.bcc}
|
||||
onChange={(e) => setFormData({ ...formData, bcc: e.target.value })}
|
||||
placeholder="숨은참조 이메일 (쉼표로 구분)"
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* 내용 */}
|
||||
<div>
|
||||
<label className="block text-white/80 text-sm font-medium mb-2">내용 *</label>
|
||||
<textarea
|
||||
value={formData.body}
|
||||
onChange={(e) => setFormData({ ...formData, body: e.target.value })}
|
||||
placeholder="메일 내용을 입력하세요 (HTML 가능)"
|
||||
rows={8}
|
||||
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400 resize-none"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="text-white/50 text-xs">
|
||||
* 메일은 발송 대기열에 추가됩니다. 실제 발송은 메일 서비스가 처리합니다.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Footer */}
|
||||
<div className="flex items-center justify-end gap-2 px-6 py-4 border-t border-white/10 bg-black/20">
|
||||
<button
|
||||
onClick={onClose}
|
||||
disabled={processing}
|
||||
className="px-4 py-2 rounded-lg bg-white/10 hover:bg-white/20 text-white transition-colors disabled:opacity-50"
|
||||
>
|
||||
취소
|
||||
</button>
|
||||
<button
|
||||
onClick={() => handleSubmit('queue')}
|
||||
disabled={processing}
|
||||
className="px-4 py-2 rounded-lg bg-blue-500 hover:bg-blue-600 text-white transition-colors flex items-center gap-2 disabled:opacity-50"
|
||||
>
|
||||
{processing ? (
|
||||
<>
|
||||
<div className="w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin" />
|
||||
처리중...
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Mail className="w-4 h-4" />
|
||||
대기열 추가
|
||||
</>
|
||||
)}
|
||||
</button>
|
||||
<button
|
||||
onClick={() => handleSubmit('direct')}
|
||||
disabled={processing}
|
||||
className="px-4 py-2 rounded-lg bg-green-500 hover:bg-green-600 text-white transition-colors flex items-center gap-2 disabled:opacity-50"
|
||||
>
|
||||
{processing ? (
|
||||
<>
|
||||
<div className="w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin" />
|
||||
처리중...
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Send className="w-4 h-4" />
|
||||
즉시 발송
|
||||
</>
|
||||
)}
|
||||
</button>
|
||||
<button
|
||||
onClick={() => handleSubmit('outlook')}
|
||||
disabled={processing}
|
||||
className="px-4 py-2 rounded-lg bg-orange-500 hover:bg-orange-600 text-white transition-colors flex items-center gap-2 disabled:opacity-50"
|
||||
>
|
||||
{processing ? (
|
||||
<>
|
||||
<div className="w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin" />
|
||||
처리중...
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Mail className="w-4 h-4" />
|
||||
Outlook
|
||||
</>
|
||||
)}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
519
Project/frontend/src/components/project/PartListDialog.tsx
Normal file
519
Project/frontend/src/components/project/PartListDialog.tsx
Normal file
@@ -0,0 +1,519 @@
|
||||
import { useState, useEffect } from 'react';
|
||||
import { X, Save, Trash2, Plus, RefreshCw } from 'lucide-react';
|
||||
import { comms } from '@/communication';
|
||||
import { PartListItem } from '@/types';
|
||||
|
||||
interface PartListDialogProps {
|
||||
projectIdx: number;
|
||||
projectName: string;
|
||||
onClose: () => void;
|
||||
}
|
||||
|
||||
export function PartListDialog({ projectIdx, projectName, onClose }: PartListDialogProps) {
|
||||
const [parts, setParts] = useState<PartListItem[]>([]);
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [editingIdx, setEditingIdx] = useState<number | null>(null);
|
||||
const [editForm, setEditForm] = useState<Partial<PartListItem>>({});
|
||||
|
||||
// ESC 키 핸들러
|
||||
useEffect(() => {
|
||||
const handleKeyDown = (e: KeyboardEvent) => {
|
||||
if (e.key === 'Escape') {
|
||||
if (editingIdx !== null) {
|
||||
setEditingIdx(null);
|
||||
setEditForm({});
|
||||
} else {
|
||||
onClose();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
window.addEventListener('keydown', handleKeyDown);
|
||||
return () => window.removeEventListener('keydown', handleKeyDown);
|
||||
}, [editingIdx, onClose]);
|
||||
|
||||
// 데이터 로드
|
||||
const loadParts = async () => {
|
||||
setLoading(true);
|
||||
try {
|
||||
console.log('[PartList] 로드 시작, projectIdx:', projectIdx);
|
||||
const result = await comms.getPartList(projectIdx);
|
||||
console.log('[PartList] 결과:', result);
|
||||
if (result.Success && result.Data) {
|
||||
console.log('[PartList] 데이터 개수:', result.Data.length);
|
||||
setParts(result.Data);
|
||||
} else {
|
||||
console.error('[PartList] 실패:', result.Message);
|
||||
alert(result.Message || '파트리스트 로드 실패');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('파트리스트 로드 실패:', error);
|
||||
alert('파트리스트 로드 중 오류: ' + error);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
loadParts();
|
||||
}, [projectIdx]);
|
||||
|
||||
// 편집 시작
|
||||
const startEdit = (part: PartListItem) => {
|
||||
setEditingIdx(part.idx);
|
||||
setEditForm({ ...part });
|
||||
};
|
||||
|
||||
// 편집 취소
|
||||
const cancelEdit = () => {
|
||||
setEditingIdx(null);
|
||||
setEditForm({});
|
||||
};
|
||||
|
||||
// 저장
|
||||
const handleSave = async () => {
|
||||
if (!editForm.itemname || !editForm.item) {
|
||||
alert('품명과 자재번호는 필수입니다.');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await comms.savePartList(
|
||||
editingIdx || 0,
|
||||
projectIdx,
|
||||
editForm.itemgroup || '',
|
||||
editForm.itemname || '',
|
||||
editForm.item || '',
|
||||
editForm.itemmodel || '',
|
||||
editForm.itemscale || '',
|
||||
editForm.itemunit || '',
|
||||
editForm.qty || 0,
|
||||
editForm.price || 0,
|
||||
editForm.itemsupply || '',
|
||||
editForm.itemsupplyidx || 0,
|
||||
editForm.itemmanu || '',
|
||||
editForm.itemsid || '',
|
||||
editForm.option1 || '',
|
||||
editForm.remark || '',
|
||||
editForm.no || 0,
|
||||
editForm.qtybuy || 0
|
||||
);
|
||||
|
||||
if (result.Success) {
|
||||
await loadParts();
|
||||
cancelEdit();
|
||||
} else {
|
||||
alert(result.Message || '저장 실패');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('저장 실패:', error);
|
||||
alert('저장 중 오류가 발생했습니다.');
|
||||
}
|
||||
};
|
||||
|
||||
// 삭제
|
||||
const handleDelete = async (idx: number) => {
|
||||
if (!confirm('정말 삭제하시겠습니까?')) return;
|
||||
|
||||
try {
|
||||
const result = await comms.deletePartList(idx);
|
||||
if (result.Success) {
|
||||
await loadParts();
|
||||
} else {
|
||||
alert(result.Message || '삭제 실패');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('삭제 실패:', error);
|
||||
alert('삭제 중 오류가 발생했습니다.');
|
||||
}
|
||||
};
|
||||
|
||||
// 새 항목 추가
|
||||
const addNew = () => {
|
||||
setEditingIdx(-1);
|
||||
setEditForm({
|
||||
Project: projectIdx,
|
||||
itemgroup: '',
|
||||
itemname: '',
|
||||
item: '',
|
||||
itemmodel: '',
|
||||
itemscale: '',
|
||||
itemunit: 'EA',
|
||||
qty: 1,
|
||||
price: 0,
|
||||
itemsupply: '',
|
||||
itemsupplyidx: 0,
|
||||
itemmanu: '',
|
||||
itemsid: '',
|
||||
option1: '',
|
||||
remark: '',
|
||||
no: 0,
|
||||
qtybuy: 0,
|
||||
});
|
||||
};
|
||||
|
||||
// 금액 계산
|
||||
const getAmount = (qty: number, price: number) => qty * price;
|
||||
|
||||
return (
|
||||
<div className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4">
|
||||
<div className="bg-slate-800/95 backdrop-blur rounded-lg w-full max-w-7xl max-h-[90vh] flex flex-col shadow-2xl border border-white/10">
|
||||
{/* 헤더 */}
|
||||
<div className="flex items-center justify-between p-4 border-b border-white/10 bg-primary-600/30 sticky top-0 z-10">
|
||||
<div>
|
||||
<h2 className="text-lg font-bold text-white">파트리스트</h2>
|
||||
<p className="text-sm text-white/60">{projectName}</p>
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
<button
|
||||
onClick={addNew}
|
||||
className="flex items-center gap-2 px-3 py-1.5 bg-primary-600 hover:bg-primary-500 text-white rounded transition-colors"
|
||||
>
|
||||
<Plus className="w-4 h-4" />
|
||||
<span className="text-sm">추가</span>
|
||||
</button>
|
||||
<button
|
||||
onClick={loadParts}
|
||||
disabled={loading}
|
||||
className="p-2 hover:bg-white/10 rounded transition-colors disabled:opacity-50"
|
||||
title="새로고침"
|
||||
>
|
||||
<RefreshCw className={`w-5 h-5 text-white/70 ${loading ? 'animate-spin' : ''}`} />
|
||||
</button>
|
||||
<button
|
||||
onClick={onClose}
|
||||
className="p-2 hover:bg-white/10 rounded transition-colors"
|
||||
>
|
||||
<X className="w-5 h-5 text-white/70" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 테이블 */}
|
||||
<div className="flex-1 overflow-auto p-4">
|
||||
{loading && parts.length === 0 ? (
|
||||
<div className="flex items-center justify-center h-64">
|
||||
<RefreshCw className="w-8 h-8 text-primary-500 animate-spin" />
|
||||
</div>
|
||||
) : (
|
||||
<table className="w-full border-collapse">
|
||||
<thead className="sticky top-0 bg-slate-700/50 backdrop-blur z-10">
|
||||
<tr className="border-b border-white/10">
|
||||
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-12">No</th>
|
||||
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-24">그룹</th>
|
||||
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium">품명</th>
|
||||
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-32">모델</th>
|
||||
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-32">규격</th>
|
||||
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-16">단위</th>
|
||||
<th className="px-2 py-2 text-right text-xs text-white/70 font-medium w-20">수량</th>
|
||||
<th className="px-2 py-2 text-right text-xs text-white/70 font-medium w-28">단가</th>
|
||||
<th className="px-2 py-2 text-right text-xs text-white/70 font-medium w-32">금액</th>
|
||||
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-32">공급처</th>
|
||||
<th className="px-2 py-2 text-center text-xs text-white/70 font-medium w-20">작업</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{parts.length === 0 && !loading ? (
|
||||
<tr>
|
||||
<td colSpan={11} className="px-2 py-8 text-center text-white/40 text-sm">
|
||||
등록된 파트가 없습니다.
|
||||
</td>
|
||||
</tr>
|
||||
) : (
|
||||
parts.map((part) => {
|
||||
const isEditing = editingIdx === part.idx;
|
||||
return (
|
||||
<tr
|
||||
key={part.idx}
|
||||
className={`border-b border-white/5 hover:bg-white/5 transition-colors ${
|
||||
isEditing ? 'bg-primary-500/10' : ''
|
||||
}`}
|
||||
>
|
||||
<td className="px-2 py-2">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="number"
|
||||
value={editForm.no || 0}
|
||||
onChange={(e) => setEditForm({ ...editForm, no: parseInt(e.target.value) || 0 })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/70 text-xs">{part.no || ''}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemgroup || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemgroup: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/70 text-xs">{part.itemgroup || ''}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemname || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemname: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
required
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/90 text-xs font-medium">{part.itemname || ''}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemmodel || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemmodel: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/70 text-xs">{part.itemmodel || ''}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemscale || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemscale: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/70 text-xs">{part.itemscale || ''}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemunit || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemunit: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/70 text-xs">{part.itemunit || ''}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2 text-right">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="number"
|
||||
value={editForm.qty || 0}
|
||||
onChange={(e) => setEditForm({ ...editForm, qty: parseFloat(e.target.value) || 0 })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none text-right"
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/70 text-xs">{part.qty?.toLocaleString() || 0}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2 text-right">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="number"
|
||||
value={editForm.price || 0}
|
||||
onChange={(e) => setEditForm({ ...editForm, price: parseFloat(e.target.value) || 0 })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none text-right"
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/70 text-xs">{part.price?.toLocaleString() || 0}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2 text-right">
|
||||
<span className="text-white/90 text-xs font-medium">
|
||||
{getAmount(
|
||||
isEditing ? editForm.qty || 0 : part.qty || 0,
|
||||
isEditing ? editForm.price || 0 : part.price || 0
|
||||
).toLocaleString()}
|
||||
</span>
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemsupply || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemsupply: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/70 text-xs">{part.itemsupply || ''}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
{isEditing ? (
|
||||
<div className="flex items-center justify-center gap-1">
|
||||
<button
|
||||
onClick={handleSave}
|
||||
className="p-1 hover:bg-green-500/20 text-green-400 rounded transition-colors"
|
||||
title="저장"
|
||||
>
|
||||
<Save className="w-4 h-4" />
|
||||
</button>
|
||||
<button
|
||||
onClick={cancelEdit}
|
||||
className="p-1 hover:bg-white/10 text-white/50 rounded transition-colors"
|
||||
title="취소"
|
||||
>
|
||||
<X className="w-4 h-4" />
|
||||
</button>
|
||||
</div>
|
||||
) : (
|
||||
<div className="flex items-center justify-center gap-1">
|
||||
<button
|
||||
onClick={() => startEdit(part)}
|
||||
className="p-1 hover:bg-white/10 text-white/70 rounded transition-colors text-xs"
|
||||
>
|
||||
편집
|
||||
</button>
|
||||
<button
|
||||
onClick={() => handleDelete(part.idx)}
|
||||
className="p-1 hover:bg-red-500/20 text-red-400 rounded transition-colors"
|
||||
title="삭제"
|
||||
>
|
||||
<Trash2 className="w-4 h-4" />
|
||||
</button>
|
||||
</div>
|
||||
)}
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
})
|
||||
)}
|
||||
{/* 새 항목 추가 행 */}
|
||||
{editingIdx === -1 && (
|
||||
<tr className="border-b border-white/5 bg-primary-500/10">
|
||||
<td className="px-2 py-2">
|
||||
<input
|
||||
type="number"
|
||||
value={editForm.no || 0}
|
||||
onChange={(e) => setEditForm({ ...editForm, no: parseInt(e.target.value) || 0 })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemgroup || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemgroup: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
placeholder="그룹"
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemname || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemname: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
placeholder="품명 *"
|
||||
required
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemmodel || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemmodel: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
placeholder="모델"
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemscale || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemscale: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
placeholder="규격"
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemunit || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemunit: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
placeholder="단위"
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2 text-right">
|
||||
<input
|
||||
type="number"
|
||||
value={editForm.qty || 0}
|
||||
onChange={(e) => setEditForm({ ...editForm, qty: parseFloat(e.target.value) || 0 })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none text-right"
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2 text-right">
|
||||
<input
|
||||
type="number"
|
||||
value={editForm.price || 0}
|
||||
onChange={(e) => setEditForm({ ...editForm, price: parseFloat(e.target.value) || 0 })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none text-right"
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2 text-right">
|
||||
<span className="text-white/90 text-xs font-medium">
|
||||
{getAmount(editForm.qty || 0, editForm.price || 0).toLocaleString()}
|
||||
</span>
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemsupply || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemsupply: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
placeholder="공급처"
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
<div className="flex items-center justify-center gap-1">
|
||||
<button
|
||||
onClick={handleSave}
|
||||
className="p-1 hover:bg-green-500/20 text-green-400 rounded transition-colors"
|
||||
title="저장"
|
||||
>
|
||||
<Save className="w-4 h-4" />
|
||||
</button>
|
||||
<button
|
||||
onClick={cancelEdit}
|
||||
className="p-1 hover:bg-white/10 text-white/50 rounded transition-colors"
|
||||
title="취소"
|
||||
>
|
||||
<X className="w-4 h-4" />
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
)}
|
||||
</tbody>
|
||||
</table>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* 합계 */}
|
||||
{parts.length > 0 && (
|
||||
<div className="p-4 border-t border-white/10 bg-slate-900/50">
|
||||
<div className="flex justify-end gap-4 text-sm">
|
||||
<span className="text-white/70">
|
||||
총 <span className="text-white font-medium">{parts.length}</span>개 항목
|
||||
</span>
|
||||
<span className="text-white/70">
|
||||
합계: <span className="text-primary-400 font-medium">
|
||||
{parts.reduce((sum, part) => sum + getAmount(part.qty || 0, part.price || 0), 0).toLocaleString()}
|
||||
</span>원
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1 +1,2 @@
|
||||
export { ProjectDetailDialog } from './ProjectDetailDialog';
|
||||
export { PartListDialog } from './PartListDialog';
|
||||
|
||||
774
Project/frontend/src/pages/BoardList.tsx
Normal file
774
Project/frontend/src/pages/BoardList.tsx
Normal file
@@ -0,0 +1,774 @@
|
||||
import { useState, useEffect } from 'react';
|
||||
import { FileText, Search, RefreshCw, Calendar, Edit3, User, Plus } from 'lucide-react';
|
||||
import { comms } from '@/communication';
|
||||
import { BoardItem } from '@/types';
|
||||
|
||||
interface BoardListProps {
|
||||
bidx: number;
|
||||
title: string;
|
||||
icon?: React.ReactNode;
|
||||
defaultCategory?: string;
|
||||
categories?: { value: string; label: string; color: string }[];
|
||||
}
|
||||
|
||||
export function BoardList({
|
||||
bidx,
|
||||
title,
|
||||
icon = <FileText className="w-5 h-5" />,
|
||||
defaultCategory = 'PATCH',
|
||||
categories = [
|
||||
{ value: 'PATCH', label: 'PATCH', color: 'red' },
|
||||
{ value: 'UPDATE', label: 'UPDATE', color: 'lime' }
|
||||
]
|
||||
}: BoardListProps) {
|
||||
const [boardList, setBoardList] = useState<BoardItem[]>([]);
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [searchKey, setSearchKey] = useState('');
|
||||
const [selectedItem, setSelectedItem] = useState<BoardItem | null>(null);
|
||||
const [showModal, setShowModal] = useState(false);
|
||||
const [showEditModal, setShowEditModal] = useState(false);
|
||||
const [showReplyModal, setShowReplyModal] = useState(false);
|
||||
const [editFormData, setEditFormData] = useState<BoardItem | null>(null);
|
||||
const [userLevel, setUserLevel] = useState(0);
|
||||
const [userId, setUserId] = useState('');
|
||||
const [replies, setReplies] = useState<BoardItem[]>([]); // 댓글 목록 (is_comment=true)
|
||||
const [replyPosts, setReplyPosts] = useState<BoardItem[]>([]); // 답글 목록 (is_comment=false)
|
||||
const [commentText, setCommentText] = useState('');
|
||||
const [replyFormData, setReplyFormData] = useState<{ title: string; contents: string }>({ title: '', contents: '' });
|
||||
|
||||
useEffect(() => {
|
||||
loadUserInfo();
|
||||
loadData();
|
||||
}, []);
|
||||
|
||||
// ESC 키 처리
|
||||
useEffect(() => {
|
||||
const handleEscKey = (e: KeyboardEvent) => {
|
||||
if (e.key === 'Escape') {
|
||||
if (showReplyModal) {
|
||||
setShowReplyModal(false);
|
||||
} else if (showEditModal) {
|
||||
setShowEditModal(false);
|
||||
} else if (showModal) {
|
||||
setShowModal(false);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
document.addEventListener('keydown', handleEscKey);
|
||||
return () => document.removeEventListener('keydown', handleEscKey);
|
||||
}, [showModal, showEditModal, showReplyModal]);
|
||||
|
||||
const loadUserInfo = async () => {
|
||||
try {
|
||||
const response = await comms.checkLoginStatus();
|
||||
if (response.Success && response.User) {
|
||||
setUserLevel(response.User.Level);
|
||||
setUserId(response.User.Id);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('사용자 정보 로드 오류:', error);
|
||||
}
|
||||
};
|
||||
|
||||
const loadData = async () => {
|
||||
setLoading(true);
|
||||
try {
|
||||
console.log('게시판 조회:', { bidx, searchKey });
|
||||
const response = await comms.getBoardList(bidx, searchKey);
|
||||
console.log('게시판 응답:', response);
|
||||
if (response.Success && response.Data) {
|
||||
setBoardList(response.Data);
|
||||
} else {
|
||||
console.warn('게시판 없음:', response.Message);
|
||||
setBoardList([]);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('게시판 로드 오류:', error);
|
||||
alert('데이터를 불러오는 중 오류가 발생했습니다.');
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
const handleSearch = () => {
|
||||
loadData();
|
||||
};
|
||||
|
||||
const loadReplies = async (rootIdx: number) => {
|
||||
try {
|
||||
const response = await comms.getBoardReplies(rootIdx);
|
||||
if (response.Success && response.Data) {
|
||||
setReplies(response.Data);
|
||||
} else {
|
||||
setReplies([]);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('댓글 로드 오류:', error);
|
||||
setReplies([]);
|
||||
}
|
||||
};
|
||||
|
||||
const loadReplyPosts = async (rootIdx: number) => {
|
||||
try {
|
||||
// 목록에서 해당 root_idx의 답글들만 필터링
|
||||
const replyList = boardList.filter(item => item.root_idx === rootIdx && !item.is_comment);
|
||||
setReplyPosts(replyList);
|
||||
} catch (error) {
|
||||
console.error('답글 로드 오류:', error);
|
||||
setReplyPosts([]);
|
||||
}
|
||||
};
|
||||
|
||||
const handleAddComment = async () => {
|
||||
if (!selectedItem || !commentText.trim()) return;
|
||||
|
||||
try {
|
||||
const response = await comms.addBoardReply(selectedItem.idx, selectedItem.idx, '', commentText, true);
|
||||
if (response.Success) {
|
||||
setCommentText('');
|
||||
loadReplies(selectedItem.idx);
|
||||
// reply_count 업데이트를 위해 목록 새로고침
|
||||
loadData();
|
||||
} else {
|
||||
alert(response.Message || '댓글 등록에 실패했습니다.');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('댓글 등록 오류:', error);
|
||||
alert('댓글 등록 중 오류가 발생했습니다.');
|
||||
}
|
||||
};
|
||||
|
||||
const handleAddReply = async () => {
|
||||
if (!selectedItem || !replyFormData.title.trim() || !replyFormData.contents.trim()) {
|
||||
alert('제목과 내용을 입력해주세요.');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// 답글은 is_comment=false, title 포함
|
||||
const rootIdx = selectedItem.root_idx || selectedItem.idx;
|
||||
const response = await comms.addBoardReply(rootIdx, selectedItem.idx, replyFormData.title, replyFormData.contents, false);
|
||||
if (response.Success) {
|
||||
setShowReplyModal(false);
|
||||
setReplyFormData({ title: '', contents: '' });
|
||||
await loadData(); // 목록 새로고침
|
||||
loadReplyPosts(rootIdx); // 답글 목록 새로고침
|
||||
} else {
|
||||
alert(response.Message || '답글 등록에 실패했습니다.');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('답글 등록 오류:', error);
|
||||
alert('답글 등록 중 오류가 발생했습니다.');
|
||||
}
|
||||
};
|
||||
|
||||
const handleRowClick = async (item: BoardItem) => {
|
||||
try {
|
||||
const response = await comms.getBoardDetail(item.idx);
|
||||
if (response.Success && response.Data) {
|
||||
setSelectedItem(response.Data);
|
||||
const rootIdx = response.Data.root_idx || response.Data.idx;
|
||||
loadReplies(rootIdx); // 댓글 로드
|
||||
loadReplyPosts(rootIdx); // 답글 로드
|
||||
setShowModal(true); // 모두 뷰어로 보기
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('상세 조회 오류:', error);
|
||||
alert('데이터를 불러오는 중 오류가 발생했습니다.');
|
||||
}
|
||||
};
|
||||
|
||||
const handleEditClick = () => {
|
||||
if (selectedItem) {
|
||||
setEditFormData(selectedItem);
|
||||
setShowModal(false);
|
||||
setShowEditModal(true);
|
||||
}
|
||||
};
|
||||
|
||||
const handleEditSave = async () => {
|
||||
if (!editFormData) return;
|
||||
|
||||
try {
|
||||
const isNew = editFormData.idx === 0;
|
||||
|
||||
if (isNew) {
|
||||
// 신규 등록
|
||||
const response = await comms.addBoard(
|
||||
bidx,
|
||||
editFormData.header || '',
|
||||
editFormData.cate || '',
|
||||
editFormData.title || '',
|
||||
editFormData.contents || ''
|
||||
);
|
||||
|
||||
if (response.Success) {
|
||||
setShowEditModal(false);
|
||||
setEditFormData(null);
|
||||
loadData();
|
||||
} else {
|
||||
alert(response.Message || '등록에 실패했습니다.');
|
||||
}
|
||||
} else {
|
||||
// 수정
|
||||
const response = await comms.editBoard(
|
||||
editFormData.idx,
|
||||
editFormData.header || '',
|
||||
editFormData.cate || '',
|
||||
editFormData.title || '',
|
||||
editFormData.contents || ''
|
||||
);
|
||||
|
||||
if (response.Success) {
|
||||
setShowEditModal(false);
|
||||
setEditFormData(null);
|
||||
loadData();
|
||||
} else {
|
||||
alert(response.Message || '수정에 실패했습니다.');
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('저장 오류:', error);
|
||||
alert('저장 중 오류가 발생했습니다.');
|
||||
}
|
||||
};
|
||||
|
||||
const handleDelete = async () => {
|
||||
if (!editFormData || editFormData.idx === 0) return;
|
||||
|
||||
if (!confirm('정말 삭제하시겠습니까?')) return;
|
||||
|
||||
try {
|
||||
const response = await comms.deleteBoard(editFormData.idx);
|
||||
|
||||
if (response.Success) {
|
||||
setShowEditModal(false);
|
||||
setEditFormData(null);
|
||||
loadData();
|
||||
} else {
|
||||
alert(response.Message || '삭제에 실패했습니다.');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('삭제 오류:', error);
|
||||
alert('삭제 중 오류가 발생했습니다.');
|
||||
}
|
||||
};
|
||||
|
||||
const formatDate = (dateStr: string | null) => {
|
||||
if (!dateStr) return '-';
|
||||
try {
|
||||
const date = new Date(dateStr);
|
||||
const yy = String(date.getFullYear()).slice(-2);
|
||||
const mm = String(date.getMonth() + 1).padStart(2, '0');
|
||||
const dd = String(date.getDate()).padStart(2, '0');
|
||||
return `${yy}.${mm}.${dd}`;
|
||||
} catch {
|
||||
return dateStr;
|
||||
}
|
||||
};
|
||||
|
||||
const isNew = (dateStr: string | null) => {
|
||||
if (!dateStr) return false;
|
||||
try {
|
||||
const date = new Date(dateStr);
|
||||
const now = new Date();
|
||||
const diffTime = now.getTime() - date.getTime();
|
||||
const diffDays = diffTime / (1000 * 60 * 60 * 24);
|
||||
return diffDays <= 3;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
const getCategoryColor = (cate: string) => {
|
||||
const category = categories.find(c => c.value.toUpperCase() === cate.toUpperCase());
|
||||
if (!category) return 'bg-gray-500/20 text-gray-400';
|
||||
|
||||
switch (category.color) {
|
||||
case 'lime': return 'bg-lime-500/20 text-lime-400';
|
||||
case 'red': return 'bg-red-500/20 text-red-400';
|
||||
case 'blue': return 'bg-blue-500/20 text-blue-400';
|
||||
case 'yellow': return 'bg-yellow-500/20 text-yellow-400';
|
||||
default: return 'bg-gray-500/20 text-gray-400';
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="space-y-6 animate-fade-in">
|
||||
{/* 검색 필터 */}
|
||||
<div className="glass-effect rounded-2xl p-6">
|
||||
<div className="flex items-center gap-4">
|
||||
<div className="flex items-center gap-2 flex-1">
|
||||
<label className="text-white/70 text-sm font-medium whitespace-nowrap">검색어</label>
|
||||
<input
|
||||
type="text"
|
||||
value={searchKey}
|
||||
onChange={(e) => setSearchKey(e.target.value)}
|
||||
onKeyDown={(e) => e.key === 'Enter' && handleSearch()}
|
||||
placeholder="제목, 내용, 작성자 등"
|
||||
className="flex-1 h-10 bg-white/20 border border-white/30 rounded-lg px-3 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<button
|
||||
onClick={handleSearch}
|
||||
disabled={loading}
|
||||
className="h-10 bg-primary-500 hover:bg-primary-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center disabled:opacity-50"
|
||||
>
|
||||
{loading ? (
|
||||
<RefreshCw className="w-4 h-4 mr-2 animate-spin" />
|
||||
) : (
|
||||
<Search className="w-4 h-4 mr-2" />
|
||||
)}
|
||||
조회
|
||||
</button>
|
||||
|
||||
<button
|
||||
onClick={() => {
|
||||
setEditFormData({
|
||||
idx: 0,
|
||||
bidx: bidx,
|
||||
gcode: '',
|
||||
header: '',
|
||||
cate: defaultCategory,
|
||||
title: '',
|
||||
contents: '',
|
||||
file: '',
|
||||
guid: '',
|
||||
url: '',
|
||||
wuid: '',
|
||||
wuid_name: '',
|
||||
wdate: null,
|
||||
project: '',
|
||||
pidx: 0,
|
||||
close: false,
|
||||
remark: ''
|
||||
});
|
||||
setShowEditModal(true);
|
||||
}}
|
||||
disabled={!(userLevel >= 9 || userId === '395552')}
|
||||
className="h-10 bg-green-500 hover:bg-green-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center disabled:opacity-30 disabled:cursor-not-allowed"
|
||||
>
|
||||
<Plus className="w-4 h-4 mr-2" />
|
||||
추가
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 게시판 목록 */}
|
||||
<div className="glass-effect rounded-2xl overflow-hidden">
|
||||
<div className="px-6 py-4 border-b border-white/10 flex items-center justify-between">
|
||||
<h3 className="text-lg font-semibold text-white flex items-center">
|
||||
{icon}
|
||||
<span className="ml-2">{title}</span>
|
||||
</h3>
|
||||
<span className="text-white/60 text-sm">{boardList.length}건</span>
|
||||
</div>
|
||||
|
||||
<div className="divide-y divide-white/10 max-h-[calc(100vh-300px)] overflow-y-auto">
|
||||
{loading ? (
|
||||
<div className="px-6 py-8 text-center">
|
||||
<div className="flex items-center justify-center">
|
||||
<RefreshCw className="w-5 h-5 mr-2 animate-spin text-white/50" />
|
||||
<span className="text-white/50">데이터를 불러오는 중...</span>
|
||||
</div>
|
||||
</div>
|
||||
) : boardList.length === 0 ? (
|
||||
<div className="px-6 py-8 text-center">
|
||||
<FileText className="w-12 h-12 mx-auto mb-3 text-white/30" />
|
||||
<p className="text-white/50">조회된 데이터가 없습니다.</p>
|
||||
</div>
|
||||
) : (
|
||||
boardList.map((item) => (
|
||||
<div
|
||||
key={item.idx}
|
||||
className="px-6 py-3 hover:bg-white/5 transition-colors cursor-pointer"
|
||||
onClick={() => handleRowClick(item)}
|
||||
style={{ paddingLeft: `${24 + (item.depth || 0) * 24}px` }}
|
||||
>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center gap-2 flex-shrink-0">
|
||||
{item.depth && item.depth > 0 && (
|
||||
<span className="text-white/40 text-xs mr-1">↳</span>
|
||||
)}
|
||||
{item.cate && (
|
||||
<span className={`px-2 py-0.5 text-xs rounded whitespace-nowrap ${getCategoryColor(item.cate)}`}>
|
||||
{item.cate}
|
||||
</span>
|
||||
)}
|
||||
{item.header && (
|
||||
<span className="px-2 py-0.5 bg-primary-500/20 text-primary-400 text-xs rounded whitespace-nowrap">
|
||||
{item.header}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex items-center text-white/60 text-xs flex-shrink-0 mr-3">
|
||||
<Calendar className="w-3 h-3 mr-1" />
|
||||
{formatDate(item.wdate)}
|
||||
</div>
|
||||
<h4 className="text-white font-medium flex-1 min-w-0 flex items-center gap-2">
|
||||
<span className="truncate">{item.title || '(댓글)'}</span>
|
||||
{isNew(item.wdate) && (
|
||||
<span className="px-1.5 py-0.5 bg-yellow-500 text-white text-[10px] rounded font-bold animate-pulse flex-shrink-0">
|
||||
NEW
|
||||
</span>
|
||||
)}
|
||||
{(item.reply_count ?? 0) > 0 && (
|
||||
<span className="px-1.5 py-0.5 bg-blue-500/20 text-blue-400 text-[10px] rounded flex-shrink-0">
|
||||
💬 {item.reply_count}
|
||||
</span>
|
||||
)}
|
||||
</h4>
|
||||
<div className="flex items-center text-white/60 text-xs flex-shrink-0">
|
||||
<User className="w-3 h-3 mr-1" />
|
||||
{item.wuid_name || item.wuid}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 상세 모달 */}
|
||||
{showModal && selectedItem && (
|
||||
<div className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm">
|
||||
<div className="bg-gray-900 rounded-2xl shadow-2xl w-full max-w-4xl max-h-[90vh] overflow-hidden border border-white/10">
|
||||
<div className="flex items-center justify-between px-6 py-4 border-b border-white/10">
|
||||
<div className="flex items-center gap-2">
|
||||
{selectedItem.header && (
|
||||
<span className="px-2 py-1 bg-primary-500/20 text-primary-400 text-sm rounded">
|
||||
{selectedItem.header}
|
||||
</span>
|
||||
)}
|
||||
{selectedItem.cate && (
|
||||
<span className={`px-2 py-1 text-sm rounded ${getCategoryColor(selectedItem.cate)}`}>
|
||||
{selectedItem.cate}
|
||||
</span>
|
||||
)}
|
||||
<h2 className="text-xl font-bold text-white ml-2">{selectedItem.title}</h2>
|
||||
</div>
|
||||
<button
|
||||
onClick={() => setShowModal(false)}
|
||||
className="text-white/50 hover:text-white transition-colors"
|
||||
>
|
||||
<span className="text-2xl">×</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="px-6 py-4 border-b border-white/10 flex items-center gap-4 text-sm text-white/60">
|
||||
<div className="flex items-center">
|
||||
<User className="w-4 h-4 mr-1" />
|
||||
{selectedItem.wuid_name || selectedItem.wuid}
|
||||
</div>
|
||||
<div className="flex items-center">
|
||||
<Calendar className="w-4 h-4 mr-1" />
|
||||
{formatDate(selectedItem.wdate)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="overflow-y-auto max-h-[calc(90vh-400px)] p-6">
|
||||
{selectedItem.contents && selectedItem.contents.trim() && (
|
||||
<div className="prose prose-invert max-w-none mb-8">
|
||||
<div className="text-white whitespace-pre-wrap">{selectedItem.contents}</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* 답글 목록 */}
|
||||
{replyPosts.length > 0 && (
|
||||
<div className={selectedItem.contents && selectedItem.contents.trim() ? "border-t border-white/10 pt-6 mb-6" : "mb-6"}>
|
||||
<h3 className="text-lg font-semibold text-white mb-4">
|
||||
답글 {replyPosts.length}개
|
||||
</h3>
|
||||
|
||||
<div className="space-y-3">
|
||||
{replyPosts.map((replyPost) => (
|
||||
<div
|
||||
key={replyPost.idx}
|
||||
className="bg-white/5 hover:bg-white/10 rounded-lg p-4 cursor-pointer transition-colors"
|
||||
onClick={() => handleRowClick(replyPost)}
|
||||
>
|
||||
<div className="flex items-center justify-between mb-2">
|
||||
<h4 className="text-white font-medium flex items-center gap-2">
|
||||
{replyPost.depth && replyPost.depth > 0 && (
|
||||
<span className="text-white/40 text-sm">↳</span>
|
||||
)}
|
||||
<span>{replyPost.title}</span>
|
||||
{isNew(replyPost.wdate) && (
|
||||
<span className="px-1.5 py-0.5 bg-yellow-500 text-white text-[10px] rounded font-bold">
|
||||
NEW
|
||||
</span>
|
||||
)}
|
||||
</h4>
|
||||
<div className="flex items-center gap-3 text-xs text-white/60">
|
||||
<div className="flex items-center">
|
||||
<User className="w-3 h-3 mr-1" />
|
||||
{replyPost.wuid_name || replyPost.wuid}
|
||||
</div>
|
||||
<div className="flex items-center">
|
||||
<Calendar className="w-3 h-3 mr-1" />
|
||||
{formatDate(replyPost.wdate)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{replyPost.contents && (
|
||||
<div className="text-white/60 text-sm line-clamp-2">
|
||||
{replyPost.contents}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* 댓글 목록 */}
|
||||
<div className={(selectedItem.contents && selectedItem.contents.trim()) || replyPosts.length > 0 ? "border-t border-white/10 pt-6" : ""}>
|
||||
<h3 className="text-lg font-semibold text-white mb-4">
|
||||
댓글 {replies.length}개
|
||||
</h3>
|
||||
|
||||
<div className="space-y-4 mb-6">
|
||||
{replies.map((reply) => (
|
||||
<div key={reply.idx} className="bg-white/5 rounded-lg p-4">
|
||||
<div className="flex items-center gap-2 mb-2">
|
||||
<User className="w-4 h-4 text-white/60" />
|
||||
<span className="text-sm text-white/80">{reply.wuid_name || reply.wuid}</span>
|
||||
<span className="text-xs text-white/50">{formatDate(reply.wdate)}</span>
|
||||
</div>
|
||||
<div className="text-white/70 text-sm whitespace-pre-wrap">{reply.contents}</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
{/* 댓글 입력 */}
|
||||
<div className="bg-white/5 rounded-lg p-4">
|
||||
<textarea
|
||||
value={commentText}
|
||||
onChange={(e) => setCommentText(e.target.value)}
|
||||
placeholder="댓글을 입력하세요..."
|
||||
rows={3}
|
||||
className="w-full bg-white/10 border border-white/30 rounded-lg px-3 py-2 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400 resize-none"
|
||||
/>
|
||||
<div className="flex justify-end mt-2">
|
||||
<button
|
||||
onClick={handleAddComment}
|
||||
disabled={!commentText.trim()}
|
||||
className="px-4 py-2 bg-primary-500 hover:bg-primary-600 disabled:opacity-50 disabled:cursor-not-allowed text-white rounded-lg transition-colors"
|
||||
>
|
||||
댓글 등록
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center justify-between px-6 py-4 border-t border-white/10 bg-white/5">
|
||||
<div className="flex items-center gap-2">
|
||||
<button
|
||||
onClick={() => setShowReplyModal(true)}
|
||||
className="px-4 py-2 rounded-lg bg-green-500 hover:bg-green-600 text-white transition-colors"
|
||||
>
|
||||
답글 달기
|
||||
</button>
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
{(userLevel >= 9 || userId === '395552') && (
|
||||
<>
|
||||
<button
|
||||
onClick={handleEditClick}
|
||||
className="px-4 py-2 rounded-lg bg-primary-500 hover:bg-primary-600 text-white transition-colors flex items-center"
|
||||
>
|
||||
<Edit3 className="w-4 h-4 mr-2" />
|
||||
편집
|
||||
</button>
|
||||
<button
|
||||
onClick={async () => {
|
||||
if (!selectedItem) return;
|
||||
if (!confirm('정말 삭제하시겠습니까?')) return;
|
||||
try {
|
||||
const response = await comms.deleteBoard(selectedItem.idx);
|
||||
if (response.Success) {
|
||||
setShowModal(false);
|
||||
loadData();
|
||||
} else {
|
||||
alert(response.Message || '삭제에 실패했습니다.');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('삭제 오류:', error);
|
||||
alert('삭제 중 오류가 발생했습니다.');
|
||||
}
|
||||
}}
|
||||
className="px-4 py-2 rounded-lg bg-red-500 hover:bg-red-600 text-white transition-colors"
|
||||
>
|
||||
삭제
|
||||
</button>
|
||||
</>
|
||||
)}
|
||||
<button
|
||||
onClick={() => setShowModal(false)}
|
||||
className="px-4 py-2 rounded-lg bg-white/10 hover:bg-white/20 text-white transition-colors"
|
||||
>
|
||||
닫기
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* 편집 모달 */}
|
||||
{showEditModal && editFormData && (
|
||||
<div className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm">
|
||||
<div className="bg-gray-900 rounded-2xl shadow-2xl w-full max-w-4xl max-h-[90vh] overflow-hidden border border-white/10">
|
||||
<div className="flex items-center justify-between px-6 py-4 border-b border-white/10">
|
||||
<h2 className="text-xl font-bold text-white flex items-center">
|
||||
<Edit3 className="w-5 h-5 mr-2" />
|
||||
{editFormData.idx === 0 ? `${title} 등록` : `${title} 편집`}
|
||||
</h2>
|
||||
<button
|
||||
onClick={() => setShowEditModal(false)}
|
||||
className="text-white/50 hover:text-white transition-colors"
|
||||
>
|
||||
<span className="text-2xl">×</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="overflow-y-auto max-h-[calc(90vh-180px)] p-6 space-y-4">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="w-32">
|
||||
<label className="block text-white/70 text-xs font-medium mb-1">카테고리</label>
|
||||
<select
|
||||
value={editFormData.cate || defaultCategory}
|
||||
onChange={(e) => setEditFormData({ ...editFormData, cate: e.target.value })}
|
||||
className="w-full h-9 bg-white/10 border border-white/30 rounded-lg px-2 text-white text-sm focus:outline-none focus:ring-2 focus:ring-primary-400"
|
||||
>
|
||||
{categories.map((cat) => (
|
||||
<option key={cat.value} value={cat.value} className="bg-gray-800">
|
||||
{cat.label}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div className="flex-1">
|
||||
<label className="block text-white/70 text-xs font-medium mb-1">제목</label>
|
||||
<input
|
||||
type="text"
|
||||
value={editFormData.title || ''}
|
||||
onChange={(e) => setEditFormData({ ...editFormData, title: e.target.value })}
|
||||
className="w-full h-9 bg-white/10 border border-white/30 rounded-lg px-3 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
|
||||
placeholder="제목"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-white/70 text-sm font-medium mb-2">내용</label>
|
||||
<textarea
|
||||
value={editFormData.contents || ''}
|
||||
onChange={(e) => setEditFormData({ ...editFormData, contents: e.target.value })}
|
||||
rows={15}
|
||||
className="w-full bg-white/10 border border-white/30 rounded-lg px-3 py-2 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400 resize-none"
|
||||
placeholder="내용을 입력하세요..."
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center justify-between px-6 py-4 border-t border-white/10 bg-white/5">
|
||||
<div>
|
||||
{editFormData && editFormData.idx > 0 && (
|
||||
<button
|
||||
onClick={handleDelete}
|
||||
className="px-4 py-2 rounded-lg bg-red-500 hover:bg-red-600 text-white transition-colors"
|
||||
>
|
||||
삭제
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
<button
|
||||
onClick={() => setShowEditModal(false)}
|
||||
className="px-4 py-2 rounded-lg bg-white/10 hover:bg-white/20 text-white transition-colors"
|
||||
>
|
||||
취소
|
||||
</button>
|
||||
<button
|
||||
onClick={handleEditSave}
|
||||
className="px-4 py-2 rounded-lg bg-primary-500 hover:bg-primary-600 text-white transition-colors"
|
||||
>
|
||||
저장
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* 답글 달기 모달 */}
|
||||
{showReplyModal && selectedItem && (
|
||||
<div className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm">
|
||||
<div className="bg-gray-900 rounded-2xl shadow-2xl w-full max-w-4xl max-h-[90vh] overflow-hidden border border-white/10">
|
||||
<div className="flex items-center justify-between px-6 py-4 border-b border-white/10">
|
||||
<h2 className="text-xl font-bold text-white flex items-center">
|
||||
<Edit3 className="w-5 h-5 mr-2" />
|
||||
답글 작성
|
||||
</h2>
|
||||
<button
|
||||
onClick={() => setShowReplyModal(false)}
|
||||
className="text-white/50 hover:text-white transition-colors"
|
||||
>
|
||||
<span className="text-2xl">×</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="overflow-y-auto max-h-[calc(90vh-180px)] p-6 space-y-4">
|
||||
<div className="bg-white/5 rounded-lg p-4 mb-4">
|
||||
<div className="text-sm text-white/60 mb-2">원글</div>
|
||||
<div className="text-white font-medium">{selectedItem.title}</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-white/70 text-sm font-medium mb-2">답글 제목</label>
|
||||
<input
|
||||
type="text"
|
||||
value={replyFormData.title}
|
||||
onChange={(e) => setReplyFormData({ ...replyFormData, title: e.target.value })}
|
||||
className="w-full h-10 bg-white/10 border border-white/30 rounded-lg px-3 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
|
||||
placeholder="답글 제목을 입력하세요"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-white/70 text-sm font-medium mb-2">답글 내용</label>
|
||||
<textarea
|
||||
value={replyFormData.contents}
|
||||
onChange={(e) => setReplyFormData({ ...replyFormData, contents: e.target.value })}
|
||||
rows={15}
|
||||
className="w-full bg-white/10 border border-white/30 rounded-lg px-3 py-2 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400 resize-none"
|
||||
placeholder="답글 내용을 입력하세요..."
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center justify-end gap-2 px-6 py-4 border-t border-white/10 bg-white/5">
|
||||
<button
|
||||
onClick={() => setShowReplyModal(false)}
|
||||
className="px-4 py-2 rounded-lg bg-white/10 hover:bg-white/20 text-white transition-colors"
|
||||
>
|
||||
취소
|
||||
</button>
|
||||
<button
|
||||
onClick={handleAddReply}
|
||||
className="px-4 py-2 rounded-lg bg-primary-500 hover:bg-primary-600 text-white transition-colors"
|
||||
>
|
||||
답글 등록
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
18
Project/frontend/src/pages/BugReport.tsx
Normal file
18
Project/frontend/src/pages/BugReport.tsx
Normal file
@@ -0,0 +1,18 @@
|
||||
import { BoardList } from './BoardList';
|
||||
import { Bug } from 'lucide-react';
|
||||
|
||||
export function BugReport() {
|
||||
return (
|
||||
<BoardList
|
||||
bidx={2}
|
||||
title="버그 신고"
|
||||
icon={<Bug className="w-5 h-5" />}
|
||||
defaultCategory="BUG"
|
||||
categories={[
|
||||
{ value: 'BUG', label: 'BUG', color: 'red' },
|
||||
{ value: 'FIXED', label: 'FIXED', color: 'lime' },
|
||||
{ value: 'PENDING', label: 'PENDING', color: 'yellow' }
|
||||
]}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -61,9 +61,13 @@ export function Dashboard() {
|
||||
const [purchaseCR, setPurchaseCR] = useState(0);
|
||||
const [todoCount, setTodoCount] = useState(0);
|
||||
const [todayWorkHrs, setTodayWorkHrs] = useState(0);
|
||||
const [unregisteredJobReportCount, setUnregisteredJobReportCount] = useState(0);
|
||||
const [unregisteredJobReportDays, setUnregisteredJobReportDays] = useState<{ date: string; hrs: number }[]>([]);
|
||||
|
||||
// 목록 데이터
|
||||
const [urgentTodos, setUrgentTodos] = useState<TodoModel[]>([]);
|
||||
const [allUrgentTodos, setAllUrgentTodos] = useState<TodoModel[]>([]); // 전체 할일 목록
|
||||
const [todoPage, setTodoPage] = useState(1); // 할일 페이지
|
||||
const [purchaseNRList, setPurchaseNRList] = useState<PurchaseItem[]>([]);
|
||||
const [purchaseCRList, setPurchaseCRList] = useState<PurchaseItem[]>([]);
|
||||
const [recentNotes, setRecentNotes] = useState<NoteItem[]>([]);
|
||||
@@ -71,6 +75,7 @@ export function Dashboard() {
|
||||
// 모달 상태
|
||||
const [showNRModal, setShowNRModal] = useState(false);
|
||||
const [showCRModal, setShowCRModal] = useState(false);
|
||||
const [showUnregisteredModal, setShowUnregisteredModal] = useState(false);
|
||||
const [showNoteModal, setShowNoteModal] = useState(false);
|
||||
const [showNoteEditModal, setShowNoteEditModal] = useState(false);
|
||||
const [showNoteAddModal, setShowNoteAddModal] = useState(false);
|
||||
@@ -92,12 +97,42 @@ export function Dashboard() {
|
||||
status: '0' as TodoStatus,
|
||||
});
|
||||
|
||||
// 할일 페이지 변경 시 목록 업데이트
|
||||
useEffect(() => {
|
||||
const start = (todoPage - 1) * 6;
|
||||
const end = start + 6;
|
||||
setUrgentTodos(allUrgentTodos.slice(start, end));
|
||||
}, [todoPage, allUrgentTodos]);
|
||||
|
||||
// ESC 키로 모달 닫기
|
||||
useEffect(() => {
|
||||
const handleEscape = (e: KeyboardEvent) => {
|
||||
if (e.key === 'Escape') {
|
||||
if (showTodoAddModal) {
|
||||
setShowTodoAddModal(false);
|
||||
} else if (showTodoEditModal) {
|
||||
setShowTodoEditModal(false);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if (showTodoAddModal || showTodoEditModal) {
|
||||
document.addEventListener('keydown', handleEscape);
|
||||
return () => document.removeEventListener('keydown', handleEscape);
|
||||
}
|
||||
}, [showTodoAddModal, showTodoEditModal]);
|
||||
|
||||
const loadDashboardData = useCallback(async () => {
|
||||
try {
|
||||
// 오늘 날짜 (로컬 시간 기준)
|
||||
const now = new Date();
|
||||
const todayStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;
|
||||
|
||||
// 15일 전 날짜 계산
|
||||
const fifteenDaysAgoDate = new Date(now);
|
||||
fifteenDaysAgoDate.setDate(now.getDate() - 15);
|
||||
const fifteenDaysAgoStr = `${fifteenDaysAgoDate.getFullYear()}-${String(fifteenDaysAgoDate.getMonth() + 1).padStart(2, '0')}-${String(fifteenDaysAgoDate.getDate()).padStart(2, '0')}`;
|
||||
|
||||
// 현재 로그인 사용자 ID 가져오기
|
||||
let currentUserId = '';
|
||||
try {
|
||||
@@ -115,12 +150,14 @@ export function Dashboard() {
|
||||
urgentTodosResponse,
|
||||
allTodosResponse,
|
||||
jobreportResponse,
|
||||
jobreportHistoryResponse,
|
||||
notesResponse,
|
||||
] = await Promise.all([
|
||||
comms.getPurchaseWaitCount(),
|
||||
comms.getUrgentTodos(),
|
||||
comms.getTodos(),
|
||||
comms.getJobReportList(todayStr, todayStr, currentUserId, ''),
|
||||
comms.getJobReportList(fifteenDaysAgoStr, todayStr, currentUserId, ''),
|
||||
comms.getNoteList('2000-01-01', todayStr, ''),
|
||||
]);
|
||||
|
||||
@@ -128,7 +165,9 @@ export function Dashboard() {
|
||||
setPurchaseCR(purchaseCount.CR);
|
||||
|
||||
if (urgentTodosResponse.Success && urgentTodosResponse.Data) {
|
||||
setUrgentTodos(urgentTodosResponse.Data.slice(0, 5));
|
||||
setAllUrgentTodos(urgentTodosResponse.Data);
|
||||
setUrgentTodos(urgentTodosResponse.Data.slice(0, 6));
|
||||
setTodoPage(1);
|
||||
}
|
||||
|
||||
if (allTodosResponse.Success && allTodosResponse.Data) {
|
||||
@@ -145,6 +184,39 @@ export function Dashboard() {
|
||||
setTodayWorkHrs(0);
|
||||
}
|
||||
|
||||
// 최근 15일간 업무일지 미등록(8시간 미만) 확인
|
||||
if (jobreportHistoryResponse.Success && jobreportHistoryResponse.Data) {
|
||||
const dailyWork: { [key: string]: number } = {};
|
||||
|
||||
// 날짜별 시간 합계 계산
|
||||
jobreportHistoryResponse.Data.forEach((item: JobReportItem) => {
|
||||
if (item.pdate) {
|
||||
const date = item.pdate.substring(0, 10);
|
||||
dailyWork[date] = (dailyWork[date] || 0) + (item.hrs || 0);
|
||||
}
|
||||
});
|
||||
|
||||
const insufficientDays: { date: string; hrs: number }[] = [];
|
||||
|
||||
// 어제부터 15일 전까지 확인 (오늘은 제외)
|
||||
for (let i = 1; i <= 15; i++) {
|
||||
const d = new Date(now);
|
||||
d.setDate(now.getDate() - i);
|
||||
const dStr = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
|
||||
|
||||
// 주말(토:6, 일:0) 제외
|
||||
if (d.getDay() === 0 || d.getDay() === 6) continue;
|
||||
|
||||
const hrs = dailyWork[dStr] || 0;
|
||||
if (hrs < 8) {
|
||||
insufficientDays.push({ date: dStr, hrs });
|
||||
}
|
||||
}
|
||||
|
||||
setUnregisteredJobReportCount(insufficientDays.length);
|
||||
setUnregisteredJobReportDays(insufficientDays);
|
||||
}
|
||||
|
||||
// 최근 메모 목록 (최대 10개)
|
||||
if (notesResponse.Success && notesResponse.Data) {
|
||||
setRecentNotes(notesResponse.Data.slice(0, 10));
|
||||
@@ -214,6 +286,7 @@ export function Dashboard() {
|
||||
|
||||
const getPriorityText = (seqno: number) => {
|
||||
switch (seqno) {
|
||||
case -1: return '낮음';
|
||||
case 1: return '중요';
|
||||
case 2: return '매우 중요';
|
||||
case 3: return '긴급';
|
||||
@@ -223,6 +296,7 @@ export function Dashboard() {
|
||||
|
||||
const getPriorityClass = (seqno: number) => {
|
||||
switch (seqno) {
|
||||
case -1: return 'bg-white/5 text-white/40';
|
||||
case 1: return 'bg-primary-500/20 text-primary-300';
|
||||
case 2: return 'bg-warning-500/20 text-warning-300';
|
||||
case 3: return 'bg-danger-500/20 text-danger-300';
|
||||
@@ -494,7 +568,7 @@ export function Dashboard() {
|
||||
</div>
|
||||
|
||||
{/* 통계 카드 */}
|
||||
<div className="grid grid-cols-1 md:grid-cols-4 gap-6">
|
||||
<div className="grid grid-cols-1 md:grid-cols-5 gap-6">
|
||||
<StatCard
|
||||
title="구매요청 (NR)"
|
||||
value={purchaseNR}
|
||||
@@ -516,6 +590,13 @@ export function Dashboard() {
|
||||
color="text-warning-400"
|
||||
onClick={() => navigate('/todo')}
|
||||
/>
|
||||
<StatCard
|
||||
title="업무일지 미등록"
|
||||
value={`${unregisteredJobReportCount}건`}
|
||||
icon={<AlertTriangle className="w-6 h-6 text-danger-400" />}
|
||||
color="text-danger-400"
|
||||
onClick={() => setShowUnregisteredModal(true)}
|
||||
/>
|
||||
<StatCard
|
||||
title="금일 업무일지"
|
||||
value={`${todayWorkHrs}시간`}
|
||||
@@ -559,20 +640,25 @@ export function Dashboard() {
|
||||
onClick={() => handleTodoEdit(todo)}
|
||||
>
|
||||
<div className="flex items-center justify-between">
|
||||
<div className="flex items-center space-x-4">
|
||||
<div className="flex items-center space-x-4 flex-1 min-w-0">
|
||||
{todo.flag && (
|
||||
<Flag className="w-4 h-4 text-warning-400" />
|
||||
<Flag className="w-4 h-4 text-warning-400 flex-shrink-0" />
|
||||
)}
|
||||
<div>
|
||||
<div className="flex-1 min-w-0">
|
||||
<p className="text-white font-medium">
|
||||
{todo.request && (
|
||||
<span className="text-xs text-primary-400 mr-2">
|
||||
({todo.request})
|
||||
</span>
|
||||
)}
|
||||
{todo.title || '제목 없음'}
|
||||
</p>
|
||||
<p className="text-white/60 text-sm line-clamp-1">
|
||||
<p className="text-white/60 text-sm line-clamp-1 mt-1">
|
||||
{todo.remark}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-center space-x-3">
|
||||
<div className="flex items-center space-x-3 flex-shrink-0 ml-4">
|
||||
<span className={`px-2 py-1 rounded-full text-xs font-medium ${getPriorityClass(todo.seqno)}`}>
|
||||
{getPriorityText(todo.seqno)}
|
||||
</span>
|
||||
@@ -595,8 +681,94 @@ export function Dashboard() {
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
{allUrgentTodos.length > 6 && (
|
||||
<div className="px-6 py-3 border-t border-white/10 flex items-center justify-between">
|
||||
<span className="text-xs text-white/50">
|
||||
{(todoPage - 1) * 6 + 1}-{Math.min(todoPage * 6, allUrgentTodos.length)} / {allUrgentTodos.length}건
|
||||
</span>
|
||||
<div className="flex gap-1">
|
||||
<button
|
||||
onClick={() => setTodoPage(p => Math.max(1, p - 1))}
|
||||
disabled={todoPage === 1}
|
||||
className="px-2 py-1 rounded bg-white/10 hover:bg-white/20 text-white/70 disabled:opacity-30 disabled:cursor-not-allowed transition-colors text-xs"
|
||||
>
|
||||
이전
|
||||
</button>
|
||||
<button
|
||||
onClick={() => setTodoPage(p => Math.min(Math.ceil(allUrgentTodos.length / 6), p + 1))}
|
||||
disabled={todoPage >= Math.ceil(allUrgentTodos.length / 6)}
|
||||
className="px-2 py-1 rounded bg-white/10 hover:bg-white/20 text-white/70 disabled:opacity-30 disabled:cursor-not-allowed transition-colors text-xs"
|
||||
>
|
||||
다음
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* 업무일지 미등록 상세 모달 */}
|
||||
{showUnregisteredModal && (
|
||||
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm p-4">
|
||||
<div className="bg-slate-900 border border-white/10 rounded-2xl w-full max-w-md shadow-2xl overflow-hidden animate-scale-in">
|
||||
<div className="flex items-center justify-between px-6 py-4 border-b border-white/10 bg-white/5">
|
||||
<h3 className="text-lg font-semibold text-white flex items-center gap-2">
|
||||
<AlertTriangle className="w-5 h-5 text-danger-400" />
|
||||
업무일지 미등록 내역
|
||||
</h3>
|
||||
<button
|
||||
onClick={() => setShowUnregisteredModal(false)}
|
||||
className="text-white/50 hover:text-white transition-colors"
|
||||
>
|
||||
<X className="w-5 h-5" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="p-6 max-h-[60vh] overflow-y-auto">
|
||||
<p className="text-white/70 text-sm mb-4">
|
||||
최근 15일(평일 기준) 중 8시간 미만 등록된 날짜입니다.
|
||||
</p>
|
||||
|
||||
{unregisteredJobReportDays.length === 0 ? (
|
||||
<div className="text-center py-8 text-white/50">
|
||||
미등록 내역이 없습니다.
|
||||
</div>
|
||||
) : (
|
||||
<div className="space-y-2">
|
||||
{unregisteredJobReportDays.map((day, index) => (
|
||||
<div key={index} className="flex items-center justify-between p-3 bg-white/5 rounded-lg border border-white/5">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="w-8 h-8 rounded-full bg-danger-500/20 flex items-center justify-center text-danger-400 text-xs font-bold">
|
||||
{index + 1}
|
||||
</div>
|
||||
<span className="text-white font-medium">{day.date}</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
<span className={`font-bold ${day.hrs === 0 ? 'text-danger-400' : 'text-warning-400'}`}>
|
||||
{day.hrs}시간
|
||||
</span>
|
||||
<span className="text-white/40 text-xs">/ 8시간</span>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="px-6 py-4 border-t border-white/10 bg-white/5 flex justify-end">
|
||||
<button
|
||||
onClick={() => {
|
||||
setShowUnregisteredModal(false);
|
||||
navigate('/jobreport');
|
||||
}}
|
||||
className="px-4 py-2 bg-primary-500 hover:bg-primary-600 text-white rounded-lg transition-colors text-sm font-medium"
|
||||
>
|
||||
업무일지 작성하러 가기
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* NR 모달 */}
|
||||
{showNRModal && (
|
||||
<Modal title="구매요청 (NR) 목록" onClose={() => setShowNRModal(false)}>
|
||||
@@ -743,10 +915,11 @@ export function Dashboard() {
|
||||
onChange={(e) => setTodoFormData(prev => ({ ...prev, seqno: parseInt(e.target.value) as TodoPriority }))}
|
||||
className="w-full bg-white/20 backdrop-blur-sm border border-white/30 rounded-lg px-4 py-2 text-white focus:outline-none focus:ring-2 focus:ring-primary-400 transition-all"
|
||||
>
|
||||
<option value={0}>보통</option>
|
||||
<option value={1}>중요</option>
|
||||
<option value={2}>매우 중요</option>
|
||||
<option value={3}>긴급</option>
|
||||
<option value={2}>매우 중요</option>
|
||||
<option value={1}>중요</option>
|
||||
<option value={0}>보통</option>
|
||||
<option value={-1}>낮음</option>
|
||||
</select>
|
||||
</div>
|
||||
<div className="flex items-end">
|
||||
@@ -805,9 +978,22 @@ export function Dashboard() {
|
||||
<Edit2 className="w-5 h-5 mr-2" />
|
||||
할일 수정
|
||||
</h2>
|
||||
<button onClick={() => setShowTodoEditModal(false)} className="text-white/70 hover:text-white transition-colors">
|
||||
<X className="w-6 h-6" />
|
||||
</button>
|
||||
<div className="flex items-center space-x-2">
|
||||
{editingTodo.status !== '5' && (
|
||||
<button
|
||||
type="button"
|
||||
onClick={handleTodoComplete}
|
||||
disabled={processing}
|
||||
className="bg-success-500 hover:bg-success-600 text-white px-3 py-1.5 rounded-lg transition-colors flex items-center disabled:opacity-50 text-sm"
|
||||
>
|
||||
<CheckCircle className="w-4 h-4 mr-1" />
|
||||
완료 처리
|
||||
</button>
|
||||
)}
|
||||
<button onClick={() => setShowTodoEditModal(false)} className="text-white/70 hover:text-white transition-colors">
|
||||
<X className="w-6 h-6" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 내용 */}
|
||||
@@ -890,10 +1076,11 @@ export function Dashboard() {
|
||||
onChange={(e) => setTodoFormData(prev => ({ ...prev, seqno: parseInt(e.target.value) as TodoPriority }))}
|
||||
className="w-full bg-white/20 backdrop-blur-sm border border-white/30 rounded-lg px-4 py-2 text-white focus:outline-none focus:ring-2 focus:ring-primary-400 transition-all"
|
||||
>
|
||||
<option value={0}>보통</option>
|
||||
<option value={1}>중요</option>
|
||||
<option value={2}>매우 중요</option>
|
||||
<option value={3}>긴급</option>
|
||||
<option value={2}>매우 중요</option>
|
||||
<option value={1}>중요</option>
|
||||
<option value={0}>보통</option>
|
||||
<option value={-1}>낮음</option>
|
||||
</select>
|
||||
</div>
|
||||
<div className="flex items-end">
|
||||
@@ -911,40 +1098,8 @@ export function Dashboard() {
|
||||
</div>
|
||||
|
||||
{/* 푸터 */}
|
||||
<div className="px-6 py-4 border-t border-white/10 flex justify-between">
|
||||
{/* 왼쪽: 삭제 버튼 */}
|
||||
<div>
|
||||
<button
|
||||
type="button"
|
||||
onClick={handleTodoDelete}
|
||||
disabled={processing}
|
||||
className="bg-danger-500 hover:bg-danger-600 text-white px-4 py-2 rounded-lg transition-colors flex items-center disabled:opacity-50"
|
||||
>
|
||||
<Trash2 className="w-4 h-4 mr-2" />
|
||||
삭제
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* 오른쪽: 취소, 완료, 수정 버튼 */}
|
||||
<div className="px-6 py-4 border-t border-white/10 flex justify-end">
|
||||
<div className="flex space-x-3">
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => setShowTodoEditModal(false)}
|
||||
className="bg-white/20 hover:bg-white/30 text-white px-4 py-2 rounded-lg transition-colors"
|
||||
>
|
||||
취소
|
||||
</button>
|
||||
{editingTodo.status !== '5' && (
|
||||
<button
|
||||
type="button"
|
||||
onClick={handleTodoComplete}
|
||||
disabled={processing}
|
||||
className="bg-success-500 hover:bg-success-600 text-white px-4 py-2 rounded-lg transition-colors flex items-center disabled:opacity-50"
|
||||
>
|
||||
<CheckCircle className="w-4 h-4 mr-2" />
|
||||
완료 처리
|
||||
</button>
|
||||
)}
|
||||
<button
|
||||
type="button"
|
||||
onClick={handleTodoUpdate}
|
||||
@@ -958,6 +1113,15 @@ export function Dashboard() {
|
||||
)}
|
||||
수정
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
onClick={handleTodoDelete}
|
||||
disabled={processing}
|
||||
className="bg-danger-500 hover:bg-danger-600 text-white px-4 py-2 rounded-lg transition-colors flex items-center disabled:opacity-50"
|
||||
>
|
||||
<Trash2 className="w-4 h-4 mr-2" />
|
||||
삭제
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
374
Project/frontend/src/pages/HolidayRequest.tsx
Normal file
374
Project/frontend/src/pages/HolidayRequest.tsx
Normal file
@@ -0,0 +1,374 @@
|
||||
import { useState, useEffect, useCallback } from 'react';
|
||||
import { Calendar, Search, User, RefreshCw, ChevronLeft, ChevronRight, Plus } from 'lucide-react';
|
||||
import { comms } from '../communication';
|
||||
import { HolidayRequest, HolidayRequestSummary } from '../types';
|
||||
import { HolidayRequestDialog } from '../components/holiday/HolidayRequestDialog';
|
||||
|
||||
export default function HolidayRequestPage() {
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [requests, setRequests] = useState<HolidayRequest[]>([]);
|
||||
const [summary, setSummary] = useState<HolidayRequestSummary>({
|
||||
ApprovedDays: 0,
|
||||
ApprovedTimes: 0,
|
||||
PendingDays: 0,
|
||||
PendingTimes: 0
|
||||
});
|
||||
|
||||
// 필터 상태
|
||||
const [startDate, setStartDate] = useState('');
|
||||
const [endDate, setEndDate] = useState('');
|
||||
const [selectedUserId, setSelectedUserId] = useState('%');
|
||||
const [userLevel, setUserLevel] = useState(0);
|
||||
const [currentUserId, setCurrentUserId] = useState('');
|
||||
const [currentUserName, setCurrentUserName] = useState('');
|
||||
|
||||
// 사용자 목록
|
||||
const [users, setUsers] = useState<Array<{id: string, name: string}>>([]);
|
||||
|
||||
// Dialog State
|
||||
const [isDialogOpen, setIsDialogOpen] = useState(false);
|
||||
const [selectedRequest, setSelectedRequest] = useState<HolidayRequest | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
// 초기 날짜 설정: 1개월 전 ~ 1개월 후
|
||||
const today = new Date();
|
||||
const oneMonthAgo = new Date(today);
|
||||
oneMonthAgo.setMonth(today.getMonth() - 1);
|
||||
const oneMonthLater = new Date(today);
|
||||
oneMonthLater.setMonth(today.getMonth() + 1);
|
||||
|
||||
setStartDate(formatDate(oneMonthAgo));
|
||||
setEndDate(formatDate(oneMonthLater));
|
||||
|
||||
// 사용자 정보 로드
|
||||
loadUserInfo();
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (startDate && endDate && currentUserId) {
|
||||
loadData();
|
||||
}
|
||||
}, [startDate, endDate, selectedUserId, currentUserId]);
|
||||
|
||||
const formatDate = (date: Date) => {
|
||||
return date.toISOString().split('T')[0];
|
||||
};
|
||||
|
||||
const formatDateShort = (dateStr?: string) => {
|
||||
if (!dateStr) return '-';
|
||||
const d = dateStr.substring(0, 10);
|
||||
if (d.length < 10) return d;
|
||||
return `${d.substring(2, 4)}-${d.substring(5, 7)}-${d.substring(8, 10)}`;
|
||||
};
|
||||
|
||||
const loadUserInfo = async () => {
|
||||
try {
|
||||
// 사용자 정보 조회
|
||||
const loginStatus = await comms.checkLoginStatus();
|
||||
if (loginStatus.Success && loginStatus.IsLoggedIn && loginStatus.User) {
|
||||
const user = loginStatus.User as { Level?: number; Id?: string; NameK?: string; Name?: string };
|
||||
setCurrentUserId(user.Id || '');
|
||||
setCurrentUserName(user.NameK || user.Name || '');
|
||||
setUserLevel(user.Level || 0);
|
||||
|
||||
// 사용자 목록 로드
|
||||
loadUsers(user.Level || 0);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to load user info:', error);
|
||||
}
|
||||
};
|
||||
|
||||
const loadUsers = async (level: number) => {
|
||||
try {
|
||||
// 레벨 5 이상만 사용자 목록 조회 가능
|
||||
if (level >= 5) {
|
||||
const userList = await comms.getUserList('');
|
||||
if (userList && userList.length > 0) {
|
||||
const mappedUsers = userList.map((u: any) => ({
|
||||
id: u.id || u.Id,
|
||||
name: u.name || u.NameK || u.id
|
||||
}));
|
||||
setUsers([{ id: '%', name: '전체' }, ...mappedUsers]);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to load users:', error);
|
||||
}
|
||||
};
|
||||
|
||||
const loadData = useCallback(async () => {
|
||||
if (!startDate || !endDate) return;
|
||||
|
||||
setLoading(true);
|
||||
try {
|
||||
const userId = userLevel < 5 ? currentUserId : selectedUserId;
|
||||
const response = await comms.getHolidayRequestList(startDate, endDate, userId, userLevel);
|
||||
|
||||
if (response.Success && response.Data) {
|
||||
setRequests(response.Data);
|
||||
// Summary는 별도 필드로 올 수 있음
|
||||
const data = response as any;
|
||||
if (data.Summary) {
|
||||
setSummary(data.Summary);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to load holiday requests:', error);
|
||||
alert('데이터를 불러오는 중 오류가 발생했습니다.');
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, [startDate, endDate, selectedUserId, userLevel, currentUserId]);
|
||||
|
||||
// 월 이동
|
||||
const moveMonth = (offset: number) => {
|
||||
const current = new Date(startDate);
|
||||
current.setMonth(current.getMonth() + offset);
|
||||
const year = current.getFullYear();
|
||||
const month = current.getMonth();
|
||||
|
||||
const newStart = new Date(year, month, 1);
|
||||
const newEnd = new Date(year, month + 1, 0);
|
||||
|
||||
setStartDate(formatDate(newStart));
|
||||
setEndDate(formatDate(newEnd));
|
||||
};
|
||||
|
||||
const getCategoryName = (cate: string) => {
|
||||
const categories: { [key: string]: string } = {
|
||||
'1': '연차',
|
||||
'2': '반차',
|
||||
'3': '병가',
|
||||
'4': '경조사',
|
||||
'5': '외출',
|
||||
'6': '기타'
|
||||
};
|
||||
return categories[cate] || cate;
|
||||
};
|
||||
|
||||
const getConfirmStatusText = (conf: number) => {
|
||||
return conf === 1 ? '승인' : '미승인';
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="flex flex-col h-full bg-gradient-to-br from-slate-50 via-blue-50/30 to-slate-50">
|
||||
{/* 헤더 */}
|
||||
<div className="glass-effect-solid border-b border-white/20">
|
||||
<div className="flex items-center justify-between px-6 py-4">
|
||||
<div className="flex items-center space-x-3">
|
||||
<div className="p-2 bg-gradient-to-br from-blue-500 to-blue-600 rounded-xl shadow-lg">
|
||||
<Calendar className="w-5 h-5 text-white" />
|
||||
</div>
|
||||
<div>
|
||||
<h1 className="text-xl font-bold text-white">휴가/외출 신청</h1>
|
||||
<p className="text-sm text-white/70">Holiday Request Management</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
<button
|
||||
onClick={() => {
|
||||
setSelectedRequest(null);
|
||||
setIsDialogOpen(true);
|
||||
}}
|
||||
className="flex items-center gap-2 px-4 py-2 bg-blue-500 hover:bg-blue-600 text-white rounded-lg transition-all shadow-lg hover:shadow-blue-500/30"
|
||||
>
|
||||
<Plus className="w-4 h-4" />
|
||||
<span className="text-sm font-medium">신청</span>
|
||||
</button>
|
||||
<button
|
||||
onClick={loadData}
|
||||
disabled={loading}
|
||||
className="flex items-center gap-2 px-4 py-2 glass-effect-solid hover:bg-white/20 rounded-lg transition-all text-white disabled:opacity-50"
|
||||
>
|
||||
<RefreshCw className={`w-4 h-4 ${loading ? 'animate-spin' : ''}`} />
|
||||
<span className="text-sm font-medium">새로고침</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 필터 영역 */}
|
||||
<div className="glass-effect-solid border-b border-white/20">
|
||||
<div className="px-6 py-4">
|
||||
<div className="flex items-center gap-4 flex-wrap">
|
||||
{/* 월 이동 버튼 */}
|
||||
<div className="flex items-center gap-2">
|
||||
<button
|
||||
onClick={() => moveMonth(-1)}
|
||||
className="p-2 glass-effect hover:bg-white/30 rounded-lg transition-all"
|
||||
>
|
||||
<ChevronLeft className="w-4 h-4 text-white" />
|
||||
</button>
|
||||
<div className="flex items-center gap-2">
|
||||
<Calendar className="w-4 h-4 text-white/80" />
|
||||
<input
|
||||
type="date"
|
||||
value={startDate}
|
||||
onChange={(e) => setStartDate(e.target.value)}
|
||||
className="px-3 py-2 glass-effect text-white text-sm rounded-lg focus:ring-2 focus:ring-blue-400/50 focus:outline-none"
|
||||
/>
|
||||
<span className="text-white/60">~</span>
|
||||
<input
|
||||
type="date"
|
||||
value={endDate}
|
||||
onChange={(e) => setEndDate(e.target.value)}
|
||||
className="px-3 py-2 glass-effect text-white text-sm rounded-lg focus:ring-2 focus:ring-blue-400/50 focus:outline-none"
|
||||
/>
|
||||
</div>
|
||||
<button
|
||||
onClick={() => moveMonth(1)}
|
||||
className="p-2 glass-effect hover:bg-white/30 rounded-lg transition-all"
|
||||
>
|
||||
<ChevronRight className="w-4 h-4 text-white" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* 담당자 선택 (레벨 5 이상만) */}
|
||||
{userLevel >= 5 && (
|
||||
<div className="flex items-center gap-2">
|
||||
<User className="w-4 h-4 text-white/80" />
|
||||
<select
|
||||
value={selectedUserId}
|
||||
onChange={(e) => setSelectedUserId(e.target.value)}
|
||||
className="px-3 py-2 glass-effect text-white text-sm rounded-lg focus:ring-2 focus:ring-blue-400/50 focus:outline-none"
|
||||
>
|
||||
{users.map(user => (
|
||||
<option key={user.id} value={user.id}>{user.name}</option>
|
||||
))}
|
||||
</select>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* 조회 버튼 */}
|
||||
<button
|
||||
onClick={loadData}
|
||||
disabled={loading}
|
||||
className="flex items-center gap-2 px-4 py-2 bg-gradient-to-r from-blue-500 to-blue-600 hover:from-blue-600 hover:to-blue-700 text-white text-sm font-medium rounded-lg shadow-lg transition-all disabled:opacity-50"
|
||||
>
|
||||
<Search className="w-4 h-4" />
|
||||
조회
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* 합계 표시 */}
|
||||
<div className="mt-4 flex gap-6 text-sm">
|
||||
<div className="glass-effect px-4 py-2 rounded-lg">
|
||||
<span className="font-medium text-white/90">합계(일) = </span>
|
||||
<span className="text-blue-300 font-semibold">승인: {summary.ApprovedDays}</span>
|
||||
<span className="mx-1 text-white/60">/</span>
|
||||
<span className={summary.PendingDays === 0 ? 'text-white/90' : 'text-red-400 font-semibold'}>
|
||||
미승인: {summary.PendingDays}
|
||||
</span>
|
||||
</div>
|
||||
<div className="glass-effect px-4 py-2 rounded-lg">
|
||||
<span className="font-medium text-white/90">합계(시간) = </span>
|
||||
<span className="text-blue-300 font-semibold">승인: {summary.ApprovedTimes}</span>
|
||||
<span className="mx-1 text-white/60">/</span>
|
||||
<span className={summary.PendingTimes === 0 ? 'text-white/90' : 'text-red-400 font-semibold'}>
|
||||
미승인: {summary.PendingTimes}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 테이블 */}
|
||||
<div className="flex-1 overflow-auto px-6 py-4">
|
||||
<div className="glass-effect-solid rounded-xl overflow-hidden">
|
||||
<div className="overflow-x-auto">
|
||||
<table className="w-full text-sm">
|
||||
<thead>
|
||||
<tr className="border-b border-white/10">
|
||||
<th className="px-4 py-3 text-left font-semibold text-white/90">No</th>
|
||||
<th className="px-4 py-3 text-left font-semibold text-white/90">신청일</th>
|
||||
<th className="px-4 py-3 text-left font-semibold text-white/90">부서</th>
|
||||
<th className="px-4 py-3 text-left font-semibold text-white/90">신청자</th>
|
||||
<th className="px-4 py-3 text-left font-semibold text-white/90">종류</th>
|
||||
<th className="px-4 py-3 text-left font-semibold text-white/90">시작일</th>
|
||||
<th className="px-4 py-3 text-left font-semibold text-white/90">종료일</th>
|
||||
<th className="px-4 py-3 text-center font-semibold text-white/90">일수</th>
|
||||
<th className="px-4 py-3 text-center font-semibold text-white/90">시간</th>
|
||||
<th className="px-4 py-3 text-left font-semibold text-white/90">사유</th>
|
||||
<th className="px-4 py-3 text-center font-semibold text-white/90">승인</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{loading ? (
|
||||
<tr>
|
||||
<td colSpan={11} className="px-4 py-12 text-center">
|
||||
<div className="flex items-center justify-center gap-3">
|
||||
<RefreshCw className="w-5 h-5 text-blue-400 animate-spin" />
|
||||
<span className="text-white/60">데이터를 불러오는 중...</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
) : requests.length === 0 ? (
|
||||
<tr>
|
||||
<td colSpan={11} className="px-4 py-12 text-center">
|
||||
<div className="flex flex-col items-center justify-center gap-3">
|
||||
<Calendar className="w-12 h-12 text-white/30" />
|
||||
<span className="text-white/60">조회된 데이터가 없습니다.</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
) : (
|
||||
requests.map((req, index) => (
|
||||
<tr
|
||||
key={req.idx}
|
||||
className="border-b border-white/5 hover:bg-white/5 transition-colors cursor-pointer"
|
||||
onClick={() => {
|
||||
setSelectedRequest(req);
|
||||
setIsDialogOpen(true);
|
||||
}}
|
||||
>
|
||||
<td className="px-4 py-3 text-white/70">{index + 1}</td>
|
||||
<td className="px-4 py-3 text-white/90">{formatDateShort(req.wdate)}</td>
|
||||
<td className="px-4 py-3 text-white/80">{req.dept || ''}</td>
|
||||
<td className="px-4 py-3 text-white font-medium">{req.name || ''}</td>
|
||||
<td className="px-4 py-3">
|
||||
<span className="px-2 py-1 bg-blue-500/20 text-blue-300 rounded text-xs font-medium">
|
||||
{getCategoryName(req.cate)}
|
||||
</span>
|
||||
</td>
|
||||
<td className="px-4 py-3 text-white/90">{formatDateShort(req.sdate)}</td>
|
||||
<td className="px-4 py-3 text-white/90">{formatDateShort(req.edate)}</td>
|
||||
<td className="px-4 py-3 text-center text-white/90">{req.HolyDays || 0}</td>
|
||||
<td className="px-4 py-3 text-center text-white/90">{req.HolyTimes || 0}</td>
|
||||
<td className="px-4 py-3 text-white/70 max-w-xs truncate" title={req.HolyReason || ''}>
|
||||
{req.HolyReason || '-'}
|
||||
</td>
|
||||
<td className="px-4 py-3 text-center">
|
||||
<span className={`px-2 py-1 rounded text-xs font-semibold ${
|
||||
req.conf === 1
|
||||
? 'bg-green-500/20 text-green-300'
|
||||
: 'bg-red-500/20 text-red-300'
|
||||
}`}>
|
||||
{getConfirmStatusText(req.conf)}
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
))
|
||||
)}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 다이얼로그 */}
|
||||
<HolidayRequestDialog
|
||||
isOpen={isDialogOpen}
|
||||
onClose={() => setIsDialogOpen(false)}
|
||||
onSave={() => {
|
||||
setIsDialogOpen(false);
|
||||
loadData();
|
||||
}}
|
||||
initialData={selectedRequest}
|
||||
currentUserName={currentUserName}
|
||||
currentUserId={currentUserId}
|
||||
userLevel={userLevel}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -4,8 +4,11 @@ import {
|
||||
Search,
|
||||
RefreshCw,
|
||||
Copy,
|
||||
Info,
|
||||
Plus,
|
||||
Calendar,
|
||||
AlertTriangle,
|
||||
X,
|
||||
} from 'lucide-react';
|
||||
import { comms } from '@/communication';
|
||||
import { JobReportItem, JobReportUser } from '@/types';
|
||||
@@ -42,6 +45,11 @@ export function Jobreport() {
|
||||
// 오늘 근무시간 상태
|
||||
const [todayWork, setTodayWork] = useState({ hrs: 0, ot: 0 });
|
||||
|
||||
// 미등록 업무일지 상태
|
||||
const [unregisteredJobReportCount, setUnregisteredJobReportCount] = useState(0);
|
||||
const [unregisteredJobReportDays, setUnregisteredJobReportDays] = useState<{ date: string; hrs: number }[]>([]);
|
||||
const [showUnregisteredModal, setShowUnregisteredModal] = useState(false);
|
||||
|
||||
// 날짜 포맷 헬퍼 함수 (로컬 시간 기준)
|
||||
const formatDateLocal = (date: Date) => {
|
||||
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
|
||||
@@ -69,6 +77,55 @@ export function Jobreport() {
|
||||
}
|
||||
}, []);
|
||||
|
||||
// 미등록 업무일지 로드
|
||||
const loadUnregisteredJobReports = useCallback(async (userId: string) => {
|
||||
try {
|
||||
const now = new Date();
|
||||
const todayStr = formatDateLocal(now);
|
||||
|
||||
// 15일 전 날짜 계산
|
||||
const fifteenDaysAgoDate = new Date(now);
|
||||
fifteenDaysAgoDate.setDate(now.getDate() - 15);
|
||||
const fifteenDaysAgoStr = formatDateLocal(fifteenDaysAgoDate);
|
||||
|
||||
const response = await comms.getJobReportList(fifteenDaysAgoStr, todayStr, userId, '');
|
||||
|
||||
if (response.Success && response.Data) {
|
||||
const dailyWork: { [key: string]: number } = {};
|
||||
|
||||
// 날짜별 시간 합계 계산
|
||||
response.Data.forEach((item: JobReportItem) => {
|
||||
if (item.pdate) {
|
||||
const date = item.pdate.substring(0, 10);
|
||||
dailyWork[date] = (dailyWork[date] || 0) + (item.hrs || 0);
|
||||
}
|
||||
});
|
||||
|
||||
const insufficientDays: { date: string; hrs: number }[] = [];
|
||||
|
||||
// 어제부터 15일 전까지 확인 (오늘은 제외)
|
||||
for (let i = 1; i <= 15; i++) {
|
||||
const d = new Date(now);
|
||||
d.setDate(now.getDate() - i);
|
||||
const dStr = formatDateLocal(d);
|
||||
|
||||
// 주말(토:6, 일:0) 제외
|
||||
if (d.getDay() === 0 || d.getDay() === 6) continue;
|
||||
|
||||
const hrs = dailyWork[dStr] || 0;
|
||||
if (hrs < 8) {
|
||||
insufficientDays.push({ date: dStr, hrs });
|
||||
}
|
||||
}
|
||||
|
||||
setUnregisteredJobReportCount(insufficientDays.length);
|
||||
setUnregisteredJobReportDays(insufficientDays);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('미등록 업무일지 로드 오류:', error);
|
||||
}
|
||||
}, []);
|
||||
|
||||
// 초기화 완료 플래그
|
||||
const [initialized, setInitialized] = useState(false);
|
||||
|
||||
@@ -128,6 +185,7 @@ export function Jobreport() {
|
||||
const handleSearchAndLoadToday = async () => {
|
||||
await handleSearch();
|
||||
loadTodayWork(selectedUser);
|
||||
loadUnregisteredJobReports(selectedUser);
|
||||
};
|
||||
|
||||
// 사용자 목록 로드
|
||||
@@ -181,7 +239,10 @@ export function Jobreport() {
|
||||
// 새 업무일지 추가 모달
|
||||
const openAddModal = () => {
|
||||
setEditingItem(null);
|
||||
setFormData(initialFormData);
|
||||
setFormData({
|
||||
...initialFormData,
|
||||
pdate: formatDateLocal(new Date())
|
||||
});
|
||||
setShowModal(true);
|
||||
};
|
||||
|
||||
@@ -194,7 +255,7 @@ export function Jobreport() {
|
||||
const data = response.Data;
|
||||
setEditingItem(null); // 새로 추가하는 것이므로 null
|
||||
setFormData({
|
||||
pdate: new Date().toISOString().split('T')[0], // 오늘 날짜
|
||||
pdate: formatDateLocal(new Date()), // 오늘 날짜 (로컬 시간 기준)
|
||||
projectName: data.projectName || '',
|
||||
pidx: data.pidx ?? null, // pidx도 복사
|
||||
requestpart: data.requestpart || '',
|
||||
@@ -207,8 +268,8 @@ export function Jobreport() {
|
||||
ot: 0, // OT 초기화
|
||||
otStart: data.otStart ? data.otStart.substring(11, 16) : '18:00',
|
||||
otEnd: data.otEnd ? data.otEnd.substring(11, 16) : '20:00',
|
||||
jobgrp: '',
|
||||
tag: '',
|
||||
jobgrp: data.jobgrp || '',
|
||||
tag: data.tag || '',
|
||||
});
|
||||
setShowModal(true);
|
||||
}
|
||||
@@ -313,6 +374,7 @@ export function Jobreport() {
|
||||
setShowModal(false);
|
||||
loadData();
|
||||
loadTodayWork(selectedUser);
|
||||
loadUnregisteredJobReports(selectedUser);
|
||||
} else {
|
||||
alert(response.Message || '저장에 실패했습니다.');
|
||||
}
|
||||
@@ -335,6 +397,7 @@ export function Jobreport() {
|
||||
alert('삭제되었습니다.');
|
||||
loadData();
|
||||
loadTodayWork(selectedUser);
|
||||
loadUnregisteredJobReports(selectedUser);
|
||||
} else {
|
||||
alert(response.Message || '삭제에 실패했습니다.');
|
||||
}
|
||||
@@ -409,32 +472,32 @@ export function Jobreport() {
|
||||
{/* 좌측: 필터 영역 */}
|
||||
<div className="flex-1">
|
||||
<div className="flex items-start gap-3">
|
||||
{/* 빠른 날짜 선택 버튼 */}
|
||||
<div className="flex flex-col gap-2">
|
||||
{/* 빠른 날짜 선택 버튼 - 2x2 그리드 */}
|
||||
<div className="grid grid-cols-2 gap-2">
|
||||
<button
|
||||
onClick={setToday}
|
||||
className="h-8 bg-white/10 hover:bg-white/20 text-white text-xs px-3 rounded-lg transition-colors whitespace-nowrap"
|
||||
className="h-10 bg-white/10 hover:bg-white/20 text-white text-xs px-2 rounded-lg transition-colors whitespace-nowrap"
|
||||
title="오늘 날짜로 설정"
|
||||
>
|
||||
오늘
|
||||
</button>
|
||||
<button
|
||||
onClick={setYesterday}
|
||||
className="h-8 bg-white/10 hover:bg-white/20 text-white text-xs px-3 rounded-lg transition-colors whitespace-nowrap"
|
||||
className="h-10 bg-white/10 hover:bg-white/20 text-white text-xs px-2 rounded-lg transition-colors whitespace-nowrap"
|
||||
title="어제 날짜로 설정"
|
||||
>
|
||||
어제
|
||||
</button>
|
||||
<button
|
||||
onClick={setThisMonth}
|
||||
className="h-8 bg-white/10 hover:bg-white/20 text-white text-xs px-3 rounded-lg transition-colors whitespace-nowrap"
|
||||
className="h-10 bg-white/10 hover:bg-white/20 text-white text-xs px-2 rounded-lg transition-colors whitespace-nowrap"
|
||||
title="이번 달 1일부터 말일까지"
|
||||
>
|
||||
이번달
|
||||
</button>
|
||||
<button
|
||||
onClick={setLastMonth}
|
||||
className="h-8 bg-white/10 hover:bg-white/20 text-white text-xs px-3 rounded-lg transition-colors whitespace-nowrap"
|
||||
className="h-10 bg-white/10 hover:bg-white/20 text-white text-xs px-2 rounded-lg transition-colors whitespace-nowrap"
|
||||
title="저번달 1일부터 말일까지"
|
||||
>
|
||||
저번달
|
||||
@@ -510,7 +573,7 @@ export function Jobreport() {
|
||||
className="h-10 bg-success-500 hover:bg-success-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center"
|
||||
>
|
||||
<Plus className="w-4 h-4 mr-2" />
|
||||
새 업무일지
|
||||
추가
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -520,31 +583,48 @@ export function Jobreport() {
|
||||
<div className="flex-shrink-0 flex flex-col gap-3 justify-center">
|
||||
<button
|
||||
onClick={() => setShowDayReportModal(true)}
|
||||
className="h-12 bg-indigo-500 hover:bg-indigo-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center whitespace-nowrap"
|
||||
className="h-10 bg-indigo-500 hover:bg-indigo-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center whitespace-nowrap"
|
||||
>
|
||||
<Calendar className="w-4 h-4 mr-2" />
|
||||
일별 집계
|
||||
</button>
|
||||
<button
|
||||
onClick={() => setShowTypeReportModal(true)}
|
||||
className="h-12 bg-purple-500 hover:bg-purple-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center whitespace-nowrap"
|
||||
className="h-10 bg-purple-500 hover:bg-purple-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center whitespace-nowrap"
|
||||
>
|
||||
<FileText className="w-4 h-4 mr-2" />
|
||||
업무형태별 집계
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* 미등록 업무일지 카드 */}
|
||||
<div className="flex-shrink-0 w-40">
|
||||
<div
|
||||
className="bg-white/10 rounded-xl p-4 h-full flex flex-col justify-center cursor-pointer hover:bg-white/20 transition-colors"
|
||||
onClick={() => setShowUnregisteredModal(true)}
|
||||
>
|
||||
<div className="text-white/70 text-sm font-medium mb-2 text-center flex items-center justify-center gap-2">
|
||||
<AlertTriangle className="w-4 h-4 text-danger-400" />
|
||||
미등록
|
||||
</div>
|
||||
<div className="text-center">
|
||||
<span className="text-3xl font-bold text-danger-400">{unregisteredJobReportCount}</span>
|
||||
<span className="text-white/70 text-lg ml-1">건</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 우측: 오늘 근무시간 */}
|
||||
<div className="flex-shrink-0 w-48">
|
||||
<div className="flex-shrink-0 w-40">
|
||||
<div className="bg-white/10 rounded-xl p-4 h-full flex flex-col justify-center">
|
||||
<div className="text-white/70 text-sm font-medium mb-2 text-center">오늘 근무시간</div>
|
||||
<div className="text-center">
|
||||
<span className="text-3xl font-bold text-white">{todayWork.hrs}</span>
|
||||
<span className="text-3xl font-bold text-white">{todayWork.hrs.toFixed(1)}</span>
|
||||
<span className="text-white/70 text-lg ml-1">시간</span>
|
||||
</div>
|
||||
{todayWork.ot > 0 && (
|
||||
<div className="text-center mt-1">
|
||||
<span className="text-warning-400 text-sm">OT: {todayWork.ot}시간</span>
|
||||
<span className="text-warning-400 text-sm">OT: {todayWork.ot.toFixed(1)}시간</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
@@ -567,13 +647,13 @@ export function Jobreport() {
|
||||
<thead className="bg-white/10">
|
||||
<tr>
|
||||
<th className="px-2 py-3 text-center text-xs font-medium text-white/70 uppercase w-10"></th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase">날짜</th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase">프로젝트</th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase">업무형태</th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase">상태</th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase">시간</th>
|
||||
{canViewOT && <th className="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase">OT</th>}
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase">담당자</th>
|
||||
<th className="px-2 py-3 text-left text-xs font-medium text-white/70 uppercase w-24">날짜</th>
|
||||
<th className="px-2 py-3 text-left text-xs font-medium text-white/70 uppercase" style={{ width: '35%' }}>프로젝트</th>
|
||||
<th className="px-2 py-3 text-left text-xs font-medium text-white/70 uppercase">업무형태</th>
|
||||
<th className="px-2 py-3 text-left text-xs font-medium text-white/70 uppercase">상태</th>
|
||||
<th className="px-2 py-3 text-left text-xs font-medium text-white/70 uppercase">시간</th>
|
||||
{canViewOT && <th className="px-2 py-3 text-left text-xs font-medium text-white/70 uppercase">OT</th>}
|
||||
<th className="px-2 py-3 text-left text-xs font-medium text-white/70 uppercase">담당자</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody className="divide-y divide-white/10">
|
||||
@@ -596,38 +676,51 @@ export function Jobreport() {
|
||||
paginatedList.map((item) => (
|
||||
<tr
|
||||
key={item.idx}
|
||||
className={`hover:bg-white/5 transition-colors cursor-pointer ${item.type === '휴가' ? 'bg-gradient-to-r from-lime-400/30 via-emerald-400/20 to-teal-400/30' : ''}`}
|
||||
onClick={() => openEditModal(item)}
|
||||
className="hover:bg-white/5 transition-colors"
|
||||
>
|
||||
<td className="px-2 py-3 text-center">
|
||||
<button
|
||||
onClick={(e) => openCopyModal(item, e)}
|
||||
className="text-white/40 hover:text-primary-400 transition-colors"
|
||||
title="복사하여 새로 작성"
|
||||
>
|
||||
<Copy className="w-4 h-4" />
|
||||
</button>
|
||||
<td
|
||||
className="px-2 py-3 text-center cursor-pointer hover:bg-primary-500/10 transition-colors"
|
||||
onClick={(e) => openCopyModal(item, e)}
|
||||
title="복사하여 새로 작성"
|
||||
>
|
||||
<Copy className="w-4 h-4 mx-auto text-white/40" />
|
||||
</td>
|
||||
<td className="px-4 py-3 text-white text-sm">{formatDate(item.pdate)}</td>
|
||||
<td className={`px-4 py-3 text-sm font-medium max-w-xs truncate ${item.pidx && item.pidx > 0 ? 'text-white' : 'text-white/50'}`} title={item.projectName}>
|
||||
{item.projectName || '-'}
|
||||
<td className="px-4 py-3 text-white text-sm cursor-pointer" onClick={() => openEditModal(item)}>{formatDate(item.pdate)}</td>
|
||||
<td className={`px-4 py-3 text-sm font-medium ${item.pidx && item.pidx > 0 ? 'text-white' : 'text-white/50'}`}>
|
||||
<div className="flex items-center space-x-2">
|
||||
{item.pidx && item.pidx > 0 && (
|
||||
<button
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
window.open(`#/project-detail/${item.pidx}`, '_blank');
|
||||
}}
|
||||
className="text-primary-400 hover:text-primary-300 transition-colors flex-shrink-0"
|
||||
title="프로젝트 정보 보기"
|
||||
>
|
||||
<Info className="w-4 h-4" />
|
||||
</button>
|
||||
)}
|
||||
<span className="truncate cursor-pointer" onClick={() => openEditModal(item)} title={item.projectName}>
|
||||
{item.projectName || '-'}
|
||||
</span>
|
||||
</div>
|
||||
</td>
|
||||
<td className="px-4 py-3 text-white text-sm">{item.type || '-'}</td>
|
||||
<td className="px-4 py-3 text-sm">
|
||||
<td className="px-4 py-3 text-white text-sm cursor-pointer" onClick={() => openEditModal(item)}>{item.type || '-'}</td>
|
||||
<td className="px-4 py-3 text-sm cursor-pointer" onClick={() => openEditModal(item)}>
|
||||
<span className={`px-2 py-1 rounded text-xs ${item.status?.includes('완료') ? 'bg-green-500/20 text-green-400' : 'bg-white/20 text-white/70'
|
||||
}`}>
|
||||
{item.status || '-'}
|
||||
</span>
|
||||
</td>
|
||||
<td className="px-4 py-3 text-white text-sm">
|
||||
{item.hrs || 0}h
|
||||
<td className="px-4 py-3 text-white text-sm cursor-pointer" onClick={() => openEditModal(item)}>
|
||||
{item.hrs || 0}
|
||||
</td>
|
||||
{canViewOT && (
|
||||
<td className="px-4 py-3 text-white text-sm">
|
||||
{item.ot ? <span className="text-warning-400">{item.ot}h</span> : '-'}
|
||||
<td className="px-4 py-3 text-white text-sm cursor-pointer" onClick={() => openEditModal(item)}>
|
||||
{item.ot ? <span className="text-warning-400">{item.ot}</span> : '-'}
|
||||
</td>
|
||||
)}
|
||||
<td className="px-4 py-3 text-white text-sm">{item.name || item.id || '-'}</td>
|
||||
<td className="px-4 py-3 text-white text-sm cursor-pointer" onClick={() => openEditModal(item)}>{item.name || item.id || '-'}</td>
|
||||
</tr>
|
||||
))
|
||||
)}
|
||||
@@ -708,6 +801,66 @@ export function Jobreport() {
|
||||
endDate={endDate}
|
||||
userId={selectedUser}
|
||||
/>
|
||||
|
||||
{/* 업무일지 미등록 상세 모달 */}
|
||||
{showUnregisteredModal && (
|
||||
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm p-4">
|
||||
<div className="bg-slate-900 border border-white/10 rounded-2xl w-full max-w-md shadow-2xl overflow-hidden animate-scale-in">
|
||||
<div className="flex items-center justify-between px-6 py-4 border-b border-white/10 bg-white/5">
|
||||
<h3 className="text-lg font-semibold text-white flex items-center gap-2">
|
||||
<AlertTriangle className="w-5 h-5 text-danger-400" />
|
||||
업무일지 미등록 내역
|
||||
</h3>
|
||||
<button
|
||||
onClick={() => setShowUnregisteredModal(false)}
|
||||
className="text-white/50 hover:text-white transition-colors"
|
||||
>
|
||||
<X className="w-5 h-5" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="p-6 max-h-[60vh] overflow-y-auto">
|
||||
<p className="text-white/70 text-sm mb-4">
|
||||
최근 15일(평일 기준) 중 8시간 미만 등록된 날짜입니다.
|
||||
</p>
|
||||
|
||||
{unregisteredJobReportDays.length === 0 ? (
|
||||
<div className="text-center py-8 text-white/50">
|
||||
미등록 내역이 없습니다.
|
||||
</div>
|
||||
) : (
|
||||
<div className="space-y-2">
|
||||
{unregisteredJobReportDays.map((day, index) => (
|
||||
<div key={index} className="flex items-center justify-between p-3 bg-white/5 rounded-lg border border-white/5">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="w-8 h-8 rounded-full bg-danger-500/20 flex items-center justify-center text-danger-400 text-xs font-bold">
|
||||
{index + 1}
|
||||
</div>
|
||||
<span className="text-white font-medium">{day.date}</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
<span className={`font-bold ${day.hrs === 0 ? 'text-danger-400' : 'text-warning-400'}`}>
|
||||
{day.hrs}시간
|
||||
</span>
|
||||
<span className="text-white/40 text-xs">/ 8시간</span>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="px-6 py-4 border-t border-white/10 bg-white/5 flex justify-end">
|
||||
<button
|
||||
onClick={() => setShowUnregisteredModal(false)}
|
||||
className="px-4 py-2 bg-white/10 hover:bg-white/20 text-white rounded-lg transition-colors text-sm font-medium"
|
||||
>
|
||||
닫기
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { useState, useEffect } from 'react';
|
||||
import { Mail, Search, RefreshCw, Calendar } from 'lucide-react';
|
||||
import { Mail, Search, RefreshCw, Calendar, ChevronLeft, ChevronRight } from 'lucide-react';
|
||||
import { comms } from '@/communication';
|
||||
import { MailItem, UserInfo } from '@/types';
|
||||
import { MailTestDialog } from '@/components/mail/MailTestDialog';
|
||||
|
||||
export function MailList() {
|
||||
const [mailList, setMailList] = useState<MailItem[]>([]);
|
||||
@@ -11,7 +12,10 @@ export function MailList() {
|
||||
const [searchKey, setSearchKey] = useState('');
|
||||
const [selectedItem, setSelectedItem] = useState<MailItem | null>(null);
|
||||
const [showModal, setShowModal] = useState(false);
|
||||
const [showTestDialog, setShowTestDialog] = useState(false);
|
||||
const [currentUser, setCurrentUser] = useState<UserInfo | null>(null);
|
||||
const [currentPage, setCurrentPage] = useState(1);
|
||||
const pageSize = 25;
|
||||
|
||||
const formatDateLocal = (date: Date) => {
|
||||
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
|
||||
@@ -78,9 +82,17 @@ export function MailList() {
|
||||
alert('시작일은 종료일보다 늦을 수 없습니다.');
|
||||
return;
|
||||
}
|
||||
setCurrentPage(1);
|
||||
loadData();
|
||||
};
|
||||
|
||||
// 페이징 계산
|
||||
const totalPages = Math.ceil(mailList.length / pageSize);
|
||||
const paginatedList = mailList.slice(
|
||||
(currentPage - 1) * pageSize,
|
||||
currentPage * pageSize
|
||||
);
|
||||
|
||||
const handleRowClick = (item: MailItem) => {
|
||||
// 레벨 9 이상(개발자)만 상세보기 가능
|
||||
if (!currentUser || currentUser.Level < 9) {
|
||||
@@ -151,6 +163,16 @@ export function MailList() {
|
||||
)}
|
||||
조회
|
||||
</button>
|
||||
|
||||
{currentUser && currentUser.Level >= 9 && (
|
||||
<button
|
||||
onClick={() => setShowTestDialog(true)}
|
||||
className="h-10 bg-green-500 hover:bg-green-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center"
|
||||
>
|
||||
<Mail className="w-4 h-4 mr-2" />
|
||||
테스트
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -164,7 +186,7 @@ export function MailList() {
|
||||
<span className="text-white/60 text-sm">{mailList.length}건</span>
|
||||
</div>
|
||||
|
||||
<div className="divide-y divide-white/10 max-h-[calc(100vh-300px)] overflow-y-auto">
|
||||
<div className="divide-y divide-white/10 max-h-[calc(100vh-380px)] overflow-y-auto">
|
||||
{loading ? (
|
||||
<div className="px-6 py-8 text-center">
|
||||
<div className="flex items-center justify-center">
|
||||
@@ -178,7 +200,7 @@ export function MailList() {
|
||||
<p className="text-white/50">조회된 데이터가 없습니다.</p>
|
||||
</div>
|
||||
) : (
|
||||
mailList.map((item) => (
|
||||
paginatedList.map((item) => (
|
||||
<div
|
||||
key={item.idx}
|
||||
className={`px-6 py-4 transition-colors ${currentUser && currentUser.Level >= 9 ? 'hover:bg-white/5 cursor-pointer' : 'cursor-default'}`}
|
||||
@@ -215,6 +237,29 @@ export function MailList() {
|
||||
))
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* 페이징 */}
|
||||
{totalPages > 1 && (
|
||||
<div className="flex items-center justify-center gap-2 px-6 py-3 border-t border-white/10">
|
||||
<button
|
||||
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
|
||||
disabled={currentPage === 1}
|
||||
className="p-1 rounded hover:bg-white/10 disabled:opacity-30 text-white/70"
|
||||
>
|
||||
<ChevronLeft className="w-5 h-5" />
|
||||
</button>
|
||||
<span className="text-white/70 text-sm">
|
||||
{currentPage} / {totalPages}
|
||||
</span>
|
||||
<button
|
||||
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
|
||||
disabled={currentPage === totalPages}
|
||||
className="p-1 rounded hover:bg-white/10 disabled:opacity-30 text-white/70"
|
||||
>
|
||||
<ChevronRight className="w-5 h-5" />
|
||||
</button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* 상세 모달 */}
|
||||
@@ -283,6 +328,15 @@ export function MailList() {
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* 메일 테스트 다이얼로그 */}
|
||||
<MailTestDialog
|
||||
isOpen={showTestDialog}
|
||||
onClose={() => {
|
||||
setShowTestDialog(false);
|
||||
loadData(); // 목록 새로고침
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
588
Project/frontend/src/pages/PartList.tsx
Normal file
588
Project/frontend/src/pages/PartList.tsx
Normal file
@@ -0,0 +1,588 @@
|
||||
import { useState, useEffect } from 'react';
|
||||
import {
|
||||
ClipboardList,
|
||||
Search,
|
||||
RefreshCw,
|
||||
Plus,
|
||||
Save,
|
||||
Trash2,
|
||||
X,
|
||||
DollarSign,
|
||||
} from 'lucide-react';
|
||||
import { comms } from '@/communication';
|
||||
import { PartListItem } from '@/types';
|
||||
import { useSearchParams } from 'react-router-dom';
|
||||
|
||||
export function PartList() {
|
||||
const [searchParams] = useSearchParams();
|
||||
const projectIdx = parseInt(searchParams.get('idx') || '0');
|
||||
const projectName = searchParams.get('name') || '';
|
||||
|
||||
const [parts, setParts] = useState<PartListItem[]>([]);
|
||||
const [filteredParts, setFilteredParts] = useState<PartListItem[]>([]);
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [searchKey, setSearchKey] = useState('');
|
||||
const [editingIdx, setEditingIdx] = useState<number | null>(null);
|
||||
const [editForm, setEditForm] = useState<Partial<PartListItem>>({});
|
||||
const [showSummary, setShowSummary] = useState(false);
|
||||
|
||||
// 데이터 로드
|
||||
const loadParts = async () => {
|
||||
setLoading(true);
|
||||
try {
|
||||
console.log('[PartList] 로드 시작, projectIdx:', projectIdx);
|
||||
const result = await comms.getPartList(projectIdx);
|
||||
console.log('[PartList] 결과:', result);
|
||||
if (result.Success && result.Data) {
|
||||
console.log('[PartList] 데이터 개수:', result.Data.length);
|
||||
setParts(result.Data);
|
||||
setFilteredParts(result.Data);
|
||||
} else {
|
||||
console.error('[PartList] 실패:', result.Message);
|
||||
alert(result.Message || '파트리스트 로드 실패');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('파트리스트 로드 실패:', error);
|
||||
alert('파트리스트 로드 중 오류: ' + error);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (projectIdx > 0) {
|
||||
loadParts();
|
||||
}
|
||||
}, [projectIdx]);
|
||||
|
||||
// 검색
|
||||
useEffect(() => {
|
||||
if (!searchKey.trim()) {
|
||||
setFilteredParts(parts);
|
||||
return;
|
||||
}
|
||||
|
||||
const search = searchKey.toLowerCase();
|
||||
const filtered = parts.filter((part) => {
|
||||
return (
|
||||
part.itemsid?.toLowerCase().includes(search) ||
|
||||
part.itemname?.toLowerCase().includes(search) ||
|
||||
part.itemmodel?.toLowerCase().includes(search)
|
||||
);
|
||||
});
|
||||
setFilteredParts(filtered);
|
||||
}, [searchKey, parts]);
|
||||
|
||||
// 편집 시작
|
||||
const startEdit = (part: PartListItem) => {
|
||||
setEditingIdx(part.idx);
|
||||
setEditForm({ ...part });
|
||||
};
|
||||
|
||||
// 편집 취소
|
||||
const cancelEdit = () => {
|
||||
setEditingIdx(null);
|
||||
setEditForm({});
|
||||
};
|
||||
|
||||
// 저장
|
||||
const handleSave = async () => {
|
||||
if (!editForm.itemname || !editForm.item) {
|
||||
alert('품명과 자재번호는 필수입니다.');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await comms.savePartList(
|
||||
editingIdx || 0,
|
||||
projectIdx,
|
||||
editForm.itemgroup || '',
|
||||
editForm.itemname || '',
|
||||
editForm.item || '',
|
||||
editForm.itemmodel || '',
|
||||
'', // itemscale 제거됨
|
||||
editForm.itemunit || '',
|
||||
editForm.qty || 0,
|
||||
editForm.price || 0,
|
||||
editForm.itemsupply || '',
|
||||
editForm.itemsupplyidx || 0,
|
||||
editForm.itemmanu || '',
|
||||
editForm.itemsid || '',
|
||||
editForm.option1 || '',
|
||||
editForm.remark || '',
|
||||
editForm.no || 0,
|
||||
editForm.qtybuy || 0
|
||||
);
|
||||
|
||||
if (result.Success) {
|
||||
await loadParts();
|
||||
cancelEdit();
|
||||
} else {
|
||||
alert(result.Message || '저장 실패');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('저장 실패:', error);
|
||||
alert('저장 중 오류가 발생했습니다.');
|
||||
}
|
||||
};
|
||||
|
||||
// 삭제
|
||||
const handleDelete = async (idx: number) => {
|
||||
if (!confirm('정말 삭제하시겠습니까?')) return;
|
||||
|
||||
try {
|
||||
const result = await comms.deletePartList(idx);
|
||||
if (result.Success) {
|
||||
await loadParts();
|
||||
} else {
|
||||
alert(result.Message || '삭제 실패');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('삭제 실패:', error);
|
||||
alert('삭제 중 오류가 발생했습니다.');
|
||||
}
|
||||
};
|
||||
|
||||
// 새 항목 추가
|
||||
const addNew = () => {
|
||||
setEditingIdx(-1);
|
||||
setEditForm({
|
||||
Project: projectIdx,
|
||||
itemgroup: '',
|
||||
itemname: '',
|
||||
item: '',
|
||||
itemmodel: '',
|
||||
itemunit: 'EA',
|
||||
qty: 1,
|
||||
price: 0,
|
||||
itemsupply: '',
|
||||
itemsupplyidx: 0,
|
||||
itemmanu: '',
|
||||
itemsid: '',
|
||||
option1: '',
|
||||
remark: '',
|
||||
no: 0,
|
||||
qtybuy: 0,
|
||||
});
|
||||
};
|
||||
|
||||
// 금액 계산
|
||||
const getAmount = (qty: number, price: number) => qty * price;
|
||||
|
||||
// 합계 계산
|
||||
const totalAmount = filteredParts.reduce((sum, part) => sum + getAmount(part.qty || 0, part.price || 0), 0);
|
||||
|
||||
// 그룹별 합계
|
||||
const groupSummary = filteredParts.reduce((acc, part) => {
|
||||
const group = part.itemgroup || '미분류';
|
||||
if (!acc[group]) {
|
||||
acc[group] = { count: 0, amount: 0 };
|
||||
}
|
||||
acc[group].count++;
|
||||
acc[group].amount += getAmount(part.qty || 0, part.price || 0);
|
||||
return acc;
|
||||
}, {} as Record<string, { count: number; amount: number }>);
|
||||
|
||||
return (
|
||||
<div className="p-4 space-y-4">
|
||||
{/* 헤더 */}
|
||||
<div className="glass-effect rounded-xl p-4">
|
||||
<div className="flex items-center justify-between mb-4">
|
||||
<div className="flex items-center gap-3">
|
||||
<ClipboardList className="w-6 h-6 text-amber-400" />
|
||||
<div>
|
||||
<h1 className="text-xl font-bold text-white">파트리스트</h1>
|
||||
<p className="text-sm text-white/60">{projectName}</p>
|
||||
</div>
|
||||
<span className="text-white/50 text-sm">({filteredParts.length}건)</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
<button
|
||||
onClick={addNew}
|
||||
className="flex items-center gap-2 px-3 py-1.5 bg-primary-600 hover:bg-primary-500 text-white rounded transition-colors"
|
||||
>
|
||||
<Plus className="w-4 h-4" />
|
||||
<span className="text-sm">추가</span>
|
||||
</button>
|
||||
<button
|
||||
onClick={loadParts}
|
||||
disabled={loading}
|
||||
className="p-2 hover:bg-white/10 rounded transition-colors disabled:opacity-50"
|
||||
title="새로고침"
|
||||
>
|
||||
<RefreshCw className={`w-5 h-5 text-white/70 ${loading ? 'animate-spin' : ''}`} />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 검색 */}
|
||||
<div className="flex items-center gap-2 bg-white/5 rounded-lg px-3 py-2">
|
||||
<Search className="w-4 h-4 text-white/50" />
|
||||
<input
|
||||
type="text"
|
||||
value={searchKey}
|
||||
onChange={(e) => setSearchKey(e.target.value)}
|
||||
placeholder="SID, 품명, 모델로 검색..."
|
||||
className="flex-1 bg-transparent text-white placeholder-white/30 focus:outline-none text-sm"
|
||||
/>
|
||||
{searchKey && (
|
||||
<button onClick={() => setSearchKey('')} className="text-white/50 hover:text-white/70">
|
||||
<X className="w-4 h-4" />
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 테이블 */}
|
||||
<div className="glass-effect rounded-xl overflow-hidden">
|
||||
<div className="overflow-x-auto">
|
||||
{loading && parts.length === 0 ? (
|
||||
<div className="flex items-center justify-center h-64">
|
||||
<RefreshCw className="w-8 h-8 text-primary-500 animate-spin" />
|
||||
</div>
|
||||
) : (
|
||||
<table className="w-full">
|
||||
<thead className="bg-slate-700/50 sticky top-0 z-10">
|
||||
<tr className="border-b border-white/10">
|
||||
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-12">No</th>
|
||||
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-24">그룹</th>
|
||||
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-24">SID</th>
|
||||
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium">품명</th>
|
||||
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-32">모델</th>
|
||||
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-16">단위</th>
|
||||
<th className="px-2 py-2 text-right text-xs text-white/70 font-medium w-20">수량</th>
|
||||
<th className="px-2 py-2 text-right text-xs text-white/70 font-medium w-28">단가</th>
|
||||
<th className="px-2 py-2 text-right text-xs text-white/70 font-medium w-32">금액</th>
|
||||
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-32">공급처</th>
|
||||
<th className="px-2 py-2 text-center text-xs text-white/70 font-medium w-20">작업</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{filteredParts.length === 0 && !loading ? (
|
||||
<tr>
|
||||
<td colSpan={11} className="px-2 py-8 text-center text-white/40 text-sm">
|
||||
{searchKey ? '검색 결과가 없습니다.' : '등록된 파트가 없습니다.'}
|
||||
</td>
|
||||
</tr>
|
||||
) : (
|
||||
filteredParts.map((part) => {
|
||||
const isEditing = editingIdx === part.idx;
|
||||
return (
|
||||
<tr
|
||||
key={part.idx}
|
||||
className={`border-b border-white/5 hover:bg-white/5 transition-colors ${
|
||||
isEditing ? 'bg-primary-500/10' : ''
|
||||
}`}
|
||||
>
|
||||
<td className="px-2 py-2">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="number"
|
||||
value={editForm.no || 0}
|
||||
onChange={(e) => setEditForm({ ...editForm, no: parseInt(e.target.value) || 0 })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/70 text-xs">{part.no || ''}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemgroup || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemgroup: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/70 text-xs">{part.itemgroup || ''}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemsid || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemsid: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/70 text-xs">{part.itemsid || ''}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemname || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemname: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
required
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/90 text-xs font-medium">{part.itemname || ''}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemmodel || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemmodel: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/70 text-xs">{part.itemmodel || ''}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemunit || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemunit: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/70 text-xs">{part.itemunit || ''}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2 text-right">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="number"
|
||||
value={editForm.qty || 0}
|
||||
onChange={(e) => setEditForm({ ...editForm, qty: parseFloat(e.target.value) || 0 })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none text-right"
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/70 text-xs">{part.qty?.toLocaleString() || 0}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2 text-right">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="number"
|
||||
value={editForm.price || 0}
|
||||
onChange={(e) => setEditForm({ ...editForm, price: parseFloat(e.target.value) || 0 })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none text-right"
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/70 text-xs">{part.price?.toLocaleString() || 0}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2 text-right">
|
||||
<span className="text-white/90 text-xs font-medium">
|
||||
{getAmount(
|
||||
isEditing ? editForm.qty || 0 : part.qty || 0,
|
||||
isEditing ? editForm.price || 0 : part.price || 0
|
||||
).toLocaleString()}
|
||||
</span>
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
{isEditing ? (
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemsupply || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemsupply: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
/>
|
||||
) : (
|
||||
<span className="text-white/70 text-xs">{part.itemsupply || ''}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
{isEditing ? (
|
||||
<div className="flex items-center justify-center gap-1">
|
||||
<button
|
||||
onClick={handleSave}
|
||||
className="p-1 hover:bg-green-500/20 text-green-400 rounded transition-colors"
|
||||
title="저장"
|
||||
>
|
||||
<Save className="w-4 h-4" />
|
||||
</button>
|
||||
<button
|
||||
onClick={cancelEdit}
|
||||
className="p-1 hover:bg-white/10 text-white/50 rounded transition-colors"
|
||||
title="취소"
|
||||
>
|
||||
<X className="w-4 h-4" />
|
||||
</button>
|
||||
</div>
|
||||
) : (
|
||||
<div className="flex items-center justify-center gap-1">
|
||||
<button
|
||||
onClick={() => startEdit(part)}
|
||||
className="p-1 hover:bg-white/10 text-white/70 rounded transition-colors text-xs"
|
||||
>
|
||||
편집
|
||||
</button>
|
||||
<button
|
||||
onClick={() => handleDelete(part.idx)}
|
||||
className="p-1 hover:bg-red-500/20 text-red-400 rounded transition-colors"
|
||||
title="삭제"
|
||||
>
|
||||
<Trash2 className="w-4 h-4" />
|
||||
</button>
|
||||
</div>
|
||||
)}
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
})
|
||||
)}
|
||||
{/* 새 항목 추가 행 */}
|
||||
{editingIdx === -1 && (
|
||||
<tr className="border-b border-white/5 bg-primary-500/10">
|
||||
<td className="px-2 py-2">
|
||||
<input
|
||||
type="number"
|
||||
value={editForm.no || 0}
|
||||
onChange={(e) => setEditForm({ ...editForm, no: parseInt(e.target.value) || 0 })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemgroup || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemgroup: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
placeholder="그룹"
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemsid || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemsid: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
placeholder="SID"
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemname || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemname: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
placeholder="품명 *"
|
||||
required
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemmodel || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemmodel: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
placeholder="모델"
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemunit || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemunit: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
placeholder="단위"
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2 text-right">
|
||||
<input
|
||||
type="number"
|
||||
value={editForm.qty || 0}
|
||||
onChange={(e) => setEditForm({ ...editForm, qty: parseFloat(e.target.value) || 0 })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none text-right"
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2 text-right">
|
||||
<input
|
||||
type="number"
|
||||
value={editForm.price || 0}
|
||||
onChange={(e) => setEditForm({ ...editForm, price: parseFloat(e.target.value) || 0 })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none text-right"
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2 text-right">
|
||||
<span className="text-white/90 text-xs font-medium">
|
||||
{getAmount(editForm.qty || 0, editForm.price || 0).toLocaleString()}
|
||||
</span>
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
<input
|
||||
type="text"
|
||||
value={editForm.itemsupply || ''}
|
||||
onChange={(e) => setEditForm({ ...editForm, itemsupply: e.target.value })}
|
||||
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
|
||||
placeholder="공급처"
|
||||
/>
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
<div className="flex items-center justify-center gap-1">
|
||||
<button
|
||||
onClick={handleSave}
|
||||
className="p-1 hover:bg-green-500/20 text-green-400 rounded transition-colors"
|
||||
title="저장"
|
||||
>
|
||||
<Save className="w-4 h-4" />
|
||||
</button>
|
||||
<button
|
||||
onClick={cancelEdit}
|
||||
className="p-1 hover:bg-white/10 text-white/50 rounded transition-colors"
|
||||
title="취소"
|
||||
>
|
||||
<X className="w-4 h-4" />
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
)}
|
||||
</tbody>
|
||||
</table>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 하단 정보 */}
|
||||
<div className="flex gap-4">
|
||||
{/* 좌측: 비용 요약 */}
|
||||
<div className="glass-effect rounded-xl p-4 flex-1">
|
||||
<button
|
||||
onClick={() => setShowSummary(!showSummary)}
|
||||
className="flex items-center gap-2 text-amber-400 hover:text-amber-300 mb-3"
|
||||
>
|
||||
<DollarSign className="w-5 h-5" />
|
||||
<span className="font-medium">비용 요약</span>
|
||||
</button>
|
||||
|
||||
{showSummary && (
|
||||
<div className="space-y-2">
|
||||
{Object.entries(groupSummary).map(([group, data]) => (
|
||||
<div key={group} className="flex items-center justify-between text-sm border-b border-white/5 pb-2">
|
||||
<span className="text-white/70">{group}</span>
|
||||
<div className="flex items-center gap-4">
|
||||
<span className="text-white/50 text-xs">{data.count}건</span>
|
||||
<span className="text-primary-400 font-medium">{data.amount.toLocaleString()}원</span>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* 우측: 합계 */}
|
||||
<div className="glass-effect rounded-xl p-4 min-w-[300px]">
|
||||
<div className="flex justify-between items-center mb-2">
|
||||
<span className="text-white/70 text-sm">총 항목</span>
|
||||
<span className="text-white font-medium">{filteredParts.length}개</span>
|
||||
</div>
|
||||
<div className="flex justify-between items-center">
|
||||
<span className="text-white/70 text-sm">총 금액</span>
|
||||
<span className="text-amber-400 font-bold text-lg">{totalAmount.toLocaleString()}원</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,452 +1,17 @@
|
||||
import { useState, useEffect } from 'react';
|
||||
import { FileText, Search, RefreshCw, Calendar, Edit3, User, Plus } from 'lucide-react';
|
||||
import { comms } from '@/communication';
|
||||
import { BoardItem } from '@/types';
|
||||
import { BoardList } from './BoardList';
|
||||
import { FileText } from 'lucide-react';
|
||||
|
||||
export function PatchList() {
|
||||
const [boardList, setBoardList] = useState<BoardItem[]>([]);
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [searchKey, setSearchKey] = useState('');
|
||||
const [selectedItem, setSelectedItem] = useState<BoardItem | null>(null);
|
||||
const [showModal, setShowModal] = useState(false);
|
||||
const [showEditModal, setShowEditModal] = useState(false);
|
||||
const [editFormData, setEditFormData] = useState<BoardItem | null>(null);
|
||||
const [userLevel, setUserLevel] = useState(0);
|
||||
const [userId, setUserId] = useState('');
|
||||
|
||||
useEffect(() => {
|
||||
loadUserInfo();
|
||||
loadData();
|
||||
}, []);
|
||||
|
||||
const loadUserInfo = async () => {
|
||||
try {
|
||||
const response = await comms.checkLoginStatus();
|
||||
if (response.Success && response.User) {
|
||||
setUserLevel(response.User.Level);
|
||||
setUserId(response.User.Id);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('사용자 정보 로드 오류:', error);
|
||||
}
|
||||
};
|
||||
|
||||
const loadData = async () => {
|
||||
setLoading(true);
|
||||
try {
|
||||
console.log('패치내역 조회:', { bidx: 5, searchKey });
|
||||
const response = await comms.getBoardList(5, searchKey); // bidx=5: 패치내역
|
||||
console.log('패치내역 응답:', response);
|
||||
if (response.Success && response.Data) {
|
||||
setBoardList(response.Data);
|
||||
} else {
|
||||
console.warn('패치내역 없음:', response.Message);
|
||||
setBoardList([]);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('패치내역 로드 오류:', error);
|
||||
alert('데이터를 불러오는 중 오류가 발생했습니다.');
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
const handleSearch = () => {
|
||||
loadData();
|
||||
};
|
||||
|
||||
const handleRowClick = async (item: BoardItem) => {
|
||||
try {
|
||||
const response = await comms.getBoardDetail(item.idx);
|
||||
if (response.Success && response.Data) {
|
||||
setSelectedItem(response.Data);
|
||||
|
||||
// 개발자(레벨 >= 9) 또는 사번 395552이면 바로 편집 모드
|
||||
if (userLevel >= 9 || userId === '395552') {
|
||||
setEditFormData(response.Data);
|
||||
setShowEditModal(true);
|
||||
} else {
|
||||
setShowModal(true);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('상세 조회 오류:', error);
|
||||
alert('데이터를 불러오는 중 오류가 발생했습니다.');
|
||||
}
|
||||
};
|
||||
|
||||
const handleEditClick = () => {
|
||||
if (selectedItem) {
|
||||
setEditFormData(selectedItem);
|
||||
setShowModal(false);
|
||||
setShowEditModal(true);
|
||||
}
|
||||
};
|
||||
|
||||
const handleEditSave = async () => {
|
||||
if (!editFormData) return;
|
||||
|
||||
try {
|
||||
const isNew = editFormData.idx === 0;
|
||||
|
||||
if (isNew) {
|
||||
// 신규 등록
|
||||
const response = await comms.addBoard(
|
||||
5, // bidx: 패치내역
|
||||
editFormData.header || '',
|
||||
editFormData.cate || '',
|
||||
editFormData.title || '',
|
||||
editFormData.contents || ''
|
||||
);
|
||||
|
||||
if (response.Success) {
|
||||
alert('등록되었습니다.');
|
||||
setShowEditModal(false);
|
||||
setEditFormData(null);
|
||||
loadData();
|
||||
} else {
|
||||
alert(response.Message || '등록에 실패했습니다.');
|
||||
}
|
||||
} else {
|
||||
// 수정
|
||||
const response = await comms.editBoard(
|
||||
editFormData.idx,
|
||||
editFormData.header || '',
|
||||
editFormData.cate || '',
|
||||
editFormData.title || '',
|
||||
editFormData.contents || ''
|
||||
);
|
||||
|
||||
if (response.Success) {
|
||||
alert('수정되었습니다.');
|
||||
setShowEditModal(false);
|
||||
setEditFormData(null);
|
||||
loadData();
|
||||
} else {
|
||||
alert(response.Message || '수정에 실패했습니다.');
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('저장 오류:', error);
|
||||
alert('저장 중 오류가 발생했습니다.');
|
||||
}
|
||||
};
|
||||
|
||||
const handleDelete = async () => {
|
||||
if (!editFormData || editFormData.idx === 0) return;
|
||||
|
||||
if (!confirm('정말 삭제하시겠습니까?')) return;
|
||||
|
||||
try {
|
||||
const response = await comms.deleteBoard(editFormData.idx);
|
||||
|
||||
if (response.Success) {
|
||||
alert('삭제되었습니다.');
|
||||
setShowEditModal(false);
|
||||
setEditFormData(null);
|
||||
loadData();
|
||||
} else {
|
||||
alert(response.Message || '삭제에 실패했습니다.');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('삭제 오류:', error);
|
||||
alert('삭제 중 오류가 발생했습니다.');
|
||||
}
|
||||
};
|
||||
|
||||
const formatDate = (dateStr: string | null) => {
|
||||
if (!dateStr) return '-';
|
||||
try {
|
||||
const date = new Date(dateStr);
|
||||
const yy = String(date.getFullYear()).slice(-2);
|
||||
const mm = String(date.getMonth() + 1).padStart(2, '0');
|
||||
const dd = String(date.getDate()).padStart(2, '0');
|
||||
return `${yy}.${mm}.${dd}`;
|
||||
} catch {
|
||||
return dateStr;
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="space-y-6 animate-fade-in">
|
||||
{/* 검색 필터 */}
|
||||
<div className="glass-effect rounded-2xl p-6">
|
||||
<div className="flex items-center gap-4">
|
||||
<div className="flex items-center gap-2 flex-1">
|
||||
<label className="text-white/70 text-sm font-medium whitespace-nowrap">검색어</label>
|
||||
<input
|
||||
type="text"
|
||||
value={searchKey}
|
||||
onChange={(e) => setSearchKey(e.target.value)}
|
||||
onKeyDown={(e) => e.key === 'Enter' && handleSearch()}
|
||||
placeholder="제목, 내용, 작성자 등"
|
||||
className="flex-1 h-10 bg-white/20 border border-white/30 rounded-lg px-3 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<button
|
||||
onClick={handleSearch}
|
||||
disabled={loading}
|
||||
className="h-10 bg-primary-500 hover:bg-primary-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center disabled:opacity-50"
|
||||
>
|
||||
{loading ? (
|
||||
<RefreshCw className="w-4 h-4 mr-2 animate-spin" />
|
||||
) : (
|
||||
<Search className="w-4 h-4 mr-2" />
|
||||
)}
|
||||
조회
|
||||
</button>
|
||||
|
||||
<button
|
||||
onClick={() => {
|
||||
setEditFormData({
|
||||
idx: 0,
|
||||
bidx: 5,
|
||||
gcode: '',
|
||||
header: '',
|
||||
cate: '패치',
|
||||
title: '',
|
||||
contents: '',
|
||||
file: '',
|
||||
guid: '',
|
||||
url: '',
|
||||
wuid: '',
|
||||
wuid_name: '',
|
||||
wdate: null,
|
||||
project: '',
|
||||
pidx: 0,
|
||||
close: false,
|
||||
remark: ''
|
||||
});
|
||||
setShowEditModal(true);
|
||||
}}
|
||||
disabled={!(userLevel >= 9 || userId === '395552')}
|
||||
className="h-10 bg-green-500 hover:bg-green-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center disabled:opacity-30 disabled:cursor-not-allowed"
|
||||
>
|
||||
<Plus className="w-4 h-4 mr-2" />
|
||||
추가
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 패치내역 목록 */}
|
||||
<div className="glass-effect rounded-2xl overflow-hidden">
|
||||
<div className="px-6 py-4 border-b border-white/10 flex items-center justify-between">
|
||||
<h3 className="text-lg font-semibold text-white flex items-center">
|
||||
<FileText className="w-5 h-5 mr-2" />
|
||||
패치 내역
|
||||
</h3>
|
||||
<span className="text-white/60 text-sm">{boardList.length}건</span>
|
||||
</div>
|
||||
|
||||
<div className="divide-y divide-white/10 max-h-[calc(100vh-300px)] overflow-y-auto">
|
||||
{loading ? (
|
||||
<div className="px-6 py-8 text-center">
|
||||
<div className="flex items-center justify-center">
|
||||
<RefreshCw className="w-5 h-5 mr-2 animate-spin text-white/50" />
|
||||
<span className="text-white/50">데이터를 불러오는 중...</span>
|
||||
</div>
|
||||
</div>
|
||||
) : boardList.length === 0 ? (
|
||||
<div className="px-6 py-8 text-center">
|
||||
<FileText className="w-12 h-12 mx-auto mb-3 text-white/30" />
|
||||
<p className="text-white/50">조회된 데이터가 없습니다.</p>
|
||||
</div>
|
||||
) : (
|
||||
boardList.map((item) => (
|
||||
<div
|
||||
key={item.idx}
|
||||
className="px-6 py-3 hover:bg-white/5 transition-colors cursor-pointer"
|
||||
onClick={() => handleRowClick(item)}
|
||||
>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center gap-2 flex-shrink-0">
|
||||
{item.cate && (
|
||||
<span className={`px-2 py-0.5 text-xs rounded whitespace-nowrap ${
|
||||
item.cate.toLowerCase() === 'update'
|
||||
? 'bg-lime-500/20 text-lime-400'
|
||||
: 'bg-red-500/20 text-red-400'
|
||||
}`}>
|
||||
{item.cate}
|
||||
</span>
|
||||
)}
|
||||
{item.header && (
|
||||
<span className="px-2 py-0.5 bg-primary-500/20 text-primary-400 text-xs rounded whitespace-nowrap">
|
||||
{item.header}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
<h4 className="text-white font-medium flex-1 min-w-0 truncate">{item.title}</h4>
|
||||
<div className="flex items-center text-white/60 text-xs flex-shrink-0">
|
||||
<Calendar className="w-3 h-3 mr-1" />
|
||||
{formatDate(item.wdate)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 상세 모달 */}
|
||||
{showModal && selectedItem && (
|
||||
<div className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm">
|
||||
<div className="bg-gray-900 rounded-2xl shadow-2xl w-full max-w-4xl max-h-[90vh] overflow-hidden border border-white/10">
|
||||
<div className="flex items-center justify-between px-6 py-4 border-b border-white/10">
|
||||
<div className="flex items-center gap-2">
|
||||
{selectedItem.header && (
|
||||
<span className="px-2 py-1 bg-primary-500/20 text-primary-400 text-sm rounded">
|
||||
{selectedItem.header}
|
||||
</span>
|
||||
)}
|
||||
{selectedItem.cate && (
|
||||
<span className="px-2 py-1 bg-white/10 text-white/70 text-sm rounded">
|
||||
{selectedItem.cate}
|
||||
</span>
|
||||
)}
|
||||
<h2 className="text-xl font-bold text-white ml-2">{selectedItem.title}</h2>
|
||||
</div>
|
||||
<button
|
||||
onClick={() => setShowModal(false)}
|
||||
className="text-white/50 hover:text-white transition-colors"
|
||||
>
|
||||
<span className="text-2xl">×</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="px-6 py-4 border-b border-white/10 flex items-center gap-4 text-sm text-white/60">
|
||||
<div className="flex items-center">
|
||||
<User className="w-4 h-4 mr-1" />
|
||||
{selectedItem.wuid_name || selectedItem.wuid}
|
||||
</div>
|
||||
<div className="flex items-center">
|
||||
<Calendar className="w-4 h-4 mr-1" />
|
||||
{formatDate(selectedItem.wdate)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="overflow-y-auto max-h-[calc(90vh-180px)] p-6">
|
||||
<div className="prose prose-invert max-w-none">
|
||||
<div className="text-white whitespace-pre-wrap">{selectedItem.contents}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center justify-end gap-2 px-6 py-4 border-t border-white/10 bg-white/5">
|
||||
{(userLevel >= 9 || userId === '395552') && (
|
||||
<button
|
||||
onClick={handleEditClick}
|
||||
className="px-4 py-2 rounded-lg bg-primary-500 hover:bg-primary-600 text-white transition-colors flex items-center"
|
||||
>
|
||||
<Edit3 className="w-4 h-4 mr-2" />
|
||||
편집
|
||||
</button>
|
||||
)}
|
||||
<button
|
||||
onClick={() => setShowModal(false)}
|
||||
className="px-4 py-2 rounded-lg bg-white/10 hover:bg-white/20 text-white transition-colors"
|
||||
>
|
||||
닫기
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* 편집 모달 */}
|
||||
{showEditModal && editFormData && (
|
||||
<div className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm">
|
||||
<div className="bg-gray-900 rounded-2xl shadow-2xl w-full max-w-4xl max-h-[90vh] overflow-hidden border border-white/10">
|
||||
<div className="flex items-center justify-between px-6 py-4 border-b border-white/10">
|
||||
<h2 className="text-xl font-bold text-white flex items-center">
|
||||
<Edit3 className="w-5 h-5 mr-2" />
|
||||
패치내역 편집
|
||||
</h2>
|
||||
<button
|
||||
onClick={() => setShowEditModal(false)}
|
||||
className="text-white/50 hover:text-white transition-colors"
|
||||
>
|
||||
<span className="text-2xl">×</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="overflow-y-auto max-h-[calc(90vh-180px)] p-6 space-y-4">
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label className="block text-white/70 text-sm font-medium mb-2">카테고리</label>
|
||||
<select
|
||||
value={editFormData.cate || '패치'}
|
||||
onChange={(e) => setEditFormData({ ...editFormData, cate: e.target.value })}
|
||||
className="w-full h-10 bg-white/10 border border-white/30 rounded-lg px-3 text-white focus:outline-none focus:ring-2 focus:ring-primary-400"
|
||||
>
|
||||
<option value="패치" className="bg-gray-800">패치</option>
|
||||
<option value="update" className="bg-gray-800">update</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-white/70 text-sm font-medium mb-2">헤더</label>
|
||||
<input
|
||||
type="text"
|
||||
value={editFormData.header || ''}
|
||||
onChange={(e) => setEditFormData({ ...editFormData, header: e.target.value })}
|
||||
className="w-full h-10 bg-white/10 border border-white/30 rounded-lg px-3 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
|
||||
placeholder="예: v2.0.0"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-white/70 text-sm font-medium mb-2">제목</label>
|
||||
<input
|
||||
type="text"
|
||||
value={editFormData.title || ''}
|
||||
onChange={(e) => setEditFormData({ ...editFormData, title: e.target.value })}
|
||||
className="w-full h-10 bg-white/10 border border-white/30 rounded-lg px-3 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
|
||||
placeholder="패치 제목"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-white/70 text-sm font-medium mb-2">내용</label>
|
||||
<textarea
|
||||
value={editFormData.contents || ''}
|
||||
onChange={(e) => setEditFormData({ ...editFormData, contents: e.target.value })}
|
||||
rows={15}
|
||||
className="w-full bg-white/10 border border-white/30 rounded-lg px-3 py-2 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400 resize-none"
|
||||
placeholder="패치 내용을 입력하세요..."
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center justify-between px-6 py-4 border-t border-white/10 bg-white/5">
|
||||
<div>
|
||||
{editFormData && editFormData.idx > 0 && (
|
||||
<button
|
||||
onClick={handleDelete}
|
||||
className="px-4 py-2 rounded-lg bg-red-500 hover:bg-red-600 text-white transition-colors"
|
||||
>
|
||||
삭제
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
<button
|
||||
onClick={() => setShowEditModal(false)}
|
||||
className="px-4 py-2 rounded-lg bg-white/10 hover:bg-white/20 text-white transition-colors"
|
||||
>
|
||||
취소
|
||||
</button>
|
||||
<button
|
||||
onClick={handleEditSave}
|
||||
className="px-4 py-2 rounded-lg bg-primary-500 hover:bg-primary-600 text-white transition-colors"
|
||||
>
|
||||
저장
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<BoardList
|
||||
bidx={5}
|
||||
title="패치 내역"
|
||||
icon={<FileText className="w-5 h-5" />}
|
||||
defaultCategory="PATCH"
|
||||
categories={[
|
||||
{ value: 'PATCH', label: 'PATCH', color: 'red' },
|
||||
{ value: 'UPDATE', label: 'UPDATE', color: 'lime' }
|
||||
]}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -8,10 +8,14 @@ import {
|
||||
User,
|
||||
Calendar,
|
||||
ExternalLink,
|
||||
ClipboardList,
|
||||
Mail,
|
||||
Edit2,
|
||||
} from 'lucide-react';
|
||||
import { comms } from '@/communication';
|
||||
import { ProjectListItem, ProjectListResponse } from '@/types';
|
||||
import { ProjectDetailDialog } from '@/components/project';
|
||||
import clsx from 'clsx';
|
||||
|
||||
// 상태별 색상 매핑
|
||||
const statusColors: Record<string, { text: string; bg: string }> = {
|
||||
@@ -29,6 +33,11 @@ export function Project() {
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [selectedProject, setSelectedProject] = useState<ProjectListItem | null>(null);
|
||||
const [showDetailDialog, setShowDetailDialog] = useState(false);
|
||||
const [expandedProject, setExpandedProject] = useState<number | null>(null);
|
||||
const [projectHistory, setProjectHistory] = useState<any[]>([]);
|
||||
const [loadingHistory, setLoadingHistory] = useState(false);
|
||||
const [editingHistory, setEditingHistory] = useState<any | null>(null);
|
||||
const [editRemark, setEditRemark] = useState('');
|
||||
|
||||
// 필터 상태
|
||||
const [categories, setCategories] = useState<string[]>([]);
|
||||
@@ -37,14 +46,16 @@ export function Project() {
|
||||
const [selectedProcess, setSelectedProcess] = useState('전체');
|
||||
const [userFilter, setUserFilter] = useState('');
|
||||
const [currentUserName, setCurrentUserName] = useState('');
|
||||
const [userLevel, setUserLevel] = useState<number>(0);
|
||||
const [userCode, setUserCode] = useState<string>('');
|
||||
|
||||
// 상태 필터 체크박스
|
||||
const [statusChecks, setStatusChecks] = useState({
|
||||
검토: true,
|
||||
진행: true,
|
||||
대기: true,
|
||||
대기: false,
|
||||
보류: true,
|
||||
완료: false,
|
||||
완료: true,
|
||||
'완료(보고)': false,
|
||||
취소: false,
|
||||
});
|
||||
@@ -82,9 +93,12 @@ export function Project() {
|
||||
try {
|
||||
const loginStatus = await comms.checkLoginStatus();
|
||||
if (loginStatus.Success && loginStatus.IsLoggedIn && loginStatus.User) {
|
||||
const userName = (loginStatus.User as { NameK?: string }).NameK || loginStatus.User.Name || '';
|
||||
const user = loginStatus.User as { NameK?: string; Level?: number; Code?: string };
|
||||
const userName = user.NameK || loginStatus.User.Name || '';
|
||||
setCurrentUserName(userName);
|
||||
setUserFilter(userName);
|
||||
setUserLevel(user.Level || 0);
|
||||
setUserCode(user.Code || '');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('로그인 정보 로드 오류:', error);
|
||||
@@ -155,8 +169,11 @@ export function Project() {
|
||||
const filtered = projects.filter(
|
||||
(p) =>
|
||||
p.name?.toLowerCase().includes(key) ||
|
||||
p.userManager?.toLowerCase().includes(key) ||
|
||||
p.usermain?.toLowerCase().includes(key) ||
|
||||
p.name_champion?.toLowerCase().includes(key) ||
|
||||
p.name_design?.toLowerCase().includes(key) ||
|
||||
p.name_epanel?.toLowerCase().includes(key) ||
|
||||
p.name_software?.toLowerCase().includes(key) ||
|
||||
p.reqstaff?.toLowerCase().includes(key) ||
|
||||
p.orderno?.toLowerCase().includes(key) ||
|
||||
p.memo?.toLowerCase().includes(key)
|
||||
);
|
||||
@@ -186,6 +203,82 @@ export function Project() {
|
||||
setStatusChecks((prev) => ({ ...prev, [status]: !prev[status as keyof typeof prev] }));
|
||||
};
|
||||
|
||||
// 히스토리 토글 (편집 아이콘 클릭)
|
||||
const toggleHistory = async (projectIdx: number) => {
|
||||
if (expandedProject === projectIdx) {
|
||||
setExpandedProject(null);
|
||||
setProjectHistory([]);
|
||||
setEditingHistory(null);
|
||||
} else {
|
||||
setExpandedProject(projectIdx);
|
||||
setLoadingHistory(true);
|
||||
try {
|
||||
const result = await comms.getProjectHistory(projectIdx);
|
||||
if (result.Success && result.Data) {
|
||||
setProjectHistory(result.Data as any[]);
|
||||
} else {
|
||||
setProjectHistory([]);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('히스토리 로드 오류:', error);
|
||||
setProjectHistory([]);
|
||||
} finally {
|
||||
setLoadingHistory(false);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 히스토리 편집 시작
|
||||
const startEditHistory = (history: any) => {
|
||||
setEditingHistory(history);
|
||||
setEditRemark(history.remark || '');
|
||||
};
|
||||
|
||||
// 새 히스토리 추가 시작
|
||||
const startAddHistory = (projectIdx: number) => {
|
||||
const today = new Date().toISOString().substring(0, 10);
|
||||
setEditingHistory({ pidx: projectIdx, pdate: today, progress: 0, remark: '', isNew: true });
|
||||
setEditRemark('');
|
||||
};
|
||||
|
||||
// 히스토리 저장
|
||||
const saveHistory = async () => {
|
||||
if (!editingHistory) return;
|
||||
|
||||
try {
|
||||
const historyData = {
|
||||
idx: editingHistory.idx || 0,
|
||||
pidx: editingHistory.pidx,
|
||||
pdate: editingHistory.pdate,
|
||||
progress: editingHistory.progress || 0,
|
||||
remark: editRemark,
|
||||
};
|
||||
|
||||
const result = await comms.saveProjectHistory(historyData);
|
||||
|
||||
if (result.Success) {
|
||||
// 저장 성공 후 히스토리 다시 로드
|
||||
const historyResult = await comms.getProjectHistory(editingHistory.pidx);
|
||||
if (historyResult.Success && historyResult.Data) {
|
||||
setProjectHistory(historyResult.Data as any[]);
|
||||
}
|
||||
} else {
|
||||
alert(result.Message || '저장에 실패했습니다.');
|
||||
}
|
||||
|
||||
setEditingHistory(null);
|
||||
setEditRemark('');
|
||||
} catch (error) {
|
||||
console.error('히스토리 저장 오류:', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 편집 취소
|
||||
const cancelEdit = () => {
|
||||
setEditingHistory(null);
|
||||
setEditRemark('');
|
||||
};
|
||||
|
||||
// 페이징 계산
|
||||
const totalPages = Math.ceil(filteredProjects.length / pageSize);
|
||||
const paginatedProjects = filteredProjects.slice(
|
||||
@@ -326,7 +419,7 @@ export function Project() {
|
||||
<tr className="text-white/60 text-left">
|
||||
<th className="px-3 py-2 w-16">상태</th>
|
||||
<th className="px-3 py-2">프로젝트명</th>
|
||||
<th className="px-3 py-2 w-20">담당</th>
|
||||
<th className="px-3 py-2 w-20">챔피언</th>
|
||||
<th className="px-3 py-2 w-28">요청자</th>
|
||||
<th className="px-3 py-2 w-20 text-center">진행률</th>
|
||||
<th className="px-3 py-2 w-24">시작</th>
|
||||
@@ -351,33 +444,40 @@ export function Project() {
|
||||
) : (
|
||||
paginatedProjects.map((project) => {
|
||||
const statusColor = statusColors[project.status] || { text: 'text-white', bg: 'bg-white/10' };
|
||||
const isSelected = selectedProject?.idx === project.idx;
|
||||
const rowBg = project.bHighlight
|
||||
? 'bg-lime-500/10'
|
||||
: project.bCost
|
||||
? 'bg-yellow-500/10'
|
||||
: project.bmajoritem
|
||||
? 'bg-pink-500/10'
|
||||
: '';
|
||||
const isExpanded = expandedProject === project.idx;
|
||||
|
||||
return (
|
||||
<tr
|
||||
key={project.idx}
|
||||
onClick={() => handleSelectProject(project)}
|
||||
className={`cursor-pointer transition-colors ${rowBg} ${
|
||||
isSelected ? 'bg-primary-500/20' : 'hover:bg-white/5'
|
||||
}`}
|
||||
>
|
||||
<td className="px-3 py-2">
|
||||
<span className={`px-2 py-0.5 rounded text-xs ${statusColor.bg} ${statusColor.text}`}>
|
||||
{project.status}
|
||||
</span>
|
||||
</td>
|
||||
<td className={`px-3 py-2 ${statusColor.text}`}>
|
||||
<div className="truncate max-w-xs" title={project.name}>
|
||||
{project.name}
|
||||
</div>
|
||||
</td>
|
||||
<>
|
||||
<tr
|
||||
key={project.idx}
|
||||
className={clsx(
|
||||
'border-b border-white/10 cursor-pointer hover:bg-white/5',
|
||||
isExpanded && 'bg-primary-900/30'
|
||||
)}
|
||||
onClick={() => toggleHistory(project.idx)}
|
||||
>
|
||||
<td className="px-3 py-2">
|
||||
<span className={`px-2 py-0.5 rounded text-xs ${statusColor.bg} ${statusColor.text}`}>
|
||||
{project.status}
|
||||
</span>
|
||||
</td>
|
||||
<td className={`px-3 py-2 ${statusColor.text}`}>
|
||||
<div className="truncate max-w-xs" title={project.name}>
|
||||
<div className="flex items-center gap-2">
|
||||
<button
|
||||
onClick={e => {
|
||||
e.stopPropagation();
|
||||
handleSelectProject(project);
|
||||
}}
|
||||
className="text-primary-300 hover:text-primary-200 transition-colors"
|
||||
title="편집"
|
||||
>
|
||||
<Edit2 className="w-4 h-4" />
|
||||
</button>
|
||||
<span className="font-regular text-white/90">{project.name}</span>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td className="px-3 py-2 text-white/70">{project.name_champion || project.userManager}</td>
|
||||
<td className="px-3 py-2 text-white/70 text-xs">
|
||||
<div>{project.ReqLine}</div>
|
||||
@@ -400,20 +500,115 @@ export function Project() {
|
||||
<div className="text-white/40">{formatDate(project.edate)}</div>
|
||||
</td>
|
||||
<td className="px-3 py-2">
|
||||
{project.jasmin && project.jasmin > 0 && (
|
||||
<button
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
openJasmin(project.jasmin);
|
||||
}}
|
||||
className="text-primary-400 hover:text-primary-300"
|
||||
title="자스민 열기"
|
||||
<div className="flex items-center gap-2">
|
||||
{project.jasmin && project.jasmin > 0 && (
|
||||
<button
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
openJasmin(project.jasmin);
|
||||
}}
|
||||
className="text-primary-400 hover:text-primary-300"
|
||||
title="자스민 열기"
|
||||
>
|
||||
<ExternalLink className="w-4 h-4" />
|
||||
</button>
|
||||
)}
|
||||
{(userLevel >= 9 || userCode === '395552') && (
|
||||
<button
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
const w = window as any;
|
||||
if (w.CefSharp) {
|
||||
w.CefSharp.BindObjectAsync('bridge').then(() => {
|
||||
w.bridge?.OpenMailHistory();
|
||||
});
|
||||
}
|
||||
}}
|
||||
className="text-cyan-400 hover:text-cyan-300"
|
||||
title="메일내역"
|
||||
>
|
||||
<Mail className="w-4 h-4" />
|
||||
</button>
|
||||
)}
|
||||
<a
|
||||
href={`#/partlist?idx=${project.idx}&name=${encodeURIComponent(project.name)}`}
|
||||
onClick={(e) => e.stopPropagation()}
|
||||
className="text-amber-400 hover:text-amber-300"
|
||||
title="파트리스트"
|
||||
>
|
||||
<ExternalLink className="w-4 h-4" />
|
||||
</button>
|
||||
)}
|
||||
<ClipboardList className="w-4 h-4" />
|
||||
</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{isExpanded && (
|
||||
<tr key={`history-${project.idx}`}>
|
||||
<td colSpan={8} className="px-3 py-2 bg-primary-950/50">
|
||||
<div className="p-4">
|
||||
<div className="flex items-center justify-between mb-3">
|
||||
<div className="text-sm font-semibold text-primary-300">주간 업무 내용</div>
|
||||
<button
|
||||
onClick={() => startAddHistory(project.idx)}
|
||||
className="text-xs px-3 py-1 bg-primary-500/20 hover:bg-primary-500/30 text-primary-400 rounded transition-colors"
|
||||
>
|
||||
+ 새 내용 등록
|
||||
</button>
|
||||
</div>
|
||||
{loadingHistory ? (
|
||||
<div className="text-white/50 text-sm">로딩 중...</div>
|
||||
) : editingHistory ? (
|
||||
<div className="bg-white/10 rounded p-3 space-y-3">
|
||||
<div className="flex gap-4 text-xs text-white/60">
|
||||
<span className="text-primary-400 font-semibold">{formatDate(editingHistory.pdate)}</span>
|
||||
<span>진행률: {editingHistory.progress || 0}%</span>
|
||||
</div>
|
||||
<textarea
|
||||
value={editRemark}
|
||||
onChange={(e) => setEditRemark(e.target.value)}
|
||||
className="w-full h-32 px-3 py-2 bg-white/5 border border-white/10 rounded text-white text-sm resize-none"
|
||||
placeholder="업무 내용을 입력하세요..."
|
||||
/>
|
||||
<div className="flex gap-2 justify-end">
|
||||
<button
|
||||
onClick={cancelEdit}
|
||||
className="px-3 py-1 bg-white/5 hover:bg-white/10 text-white/70 rounded text-sm transition-colors"
|
||||
>
|
||||
취소
|
||||
</button>
|
||||
<button
|
||||
onClick={saveHistory}
|
||||
className="px-3 py-1 bg-primary-500/20 hover:bg-primary-500/30 text-primary-400 rounded text-sm transition-colors"
|
||||
>
|
||||
저장
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
) : projectHistory.length > 0 ? (
|
||||
<div
|
||||
className="bg-white/5 rounded p-3 border-l-2 border-primary-500 cursor-pointer hover:bg-white/10 transition-colors"
|
||||
onClick={() => startEditHistory(projectHistory[0])}
|
||||
>
|
||||
<div className="flex gap-4 mb-2 text-xs">
|
||||
<span className="text-primary-400 font-semibold">{formatDate(projectHistory[0].pdate)}</span>
|
||||
<span className="text-white/60">진행률: {projectHistory[0].progress || 0}%</span>
|
||||
<span className="text-white/40">{projectHistory[0].wname || ''}</span>
|
||||
</div>
|
||||
{projectHistory[0].remark ? (
|
||||
<div className="text-sm text-white/80 whitespace-pre-wrap">{projectHistory[0].remark}</div>
|
||||
) : (
|
||||
<div className="text-sm text-white/40 italic">내용이 비어있습니다. 클릭하여 입력하세요.</div>
|
||||
)}
|
||||
</div>
|
||||
) : (
|
||||
<div className="text-white/50 text-sm text-center py-4">
|
||||
업무 내용이 없습니다. 새 내용을 등록하세요.
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
})
|
||||
)}
|
||||
@@ -452,6 +647,8 @@ export function Project() {
|
||||
onClose={handleCloseDialog}
|
||||
/>
|
||||
)}
|
||||
|
||||
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@ const getStatusClass = (status: string): string => {
|
||||
|
||||
const getPriorityText = (seqno: number): string => {
|
||||
switch (seqno) {
|
||||
case -1: return '낮음';
|
||||
case 1: return '중요';
|
||||
case 2: return '매우 중요';
|
||||
case 3: return '긴급';
|
||||
@@ -46,6 +47,7 @@ const getPriorityText = (seqno: number): string => {
|
||||
|
||||
const getPriorityClass = (seqno: number): string => {
|
||||
switch (seqno) {
|
||||
case -1: return 'bg-white/5 text-white/40';
|
||||
case 1: return 'bg-primary-500/20 text-primary-300';
|
||||
case 2: return 'bg-warning-500/20 text-warning-300';
|
||||
case 3: return 'bg-danger-500/20 text-danger-300';
|
||||
@@ -561,9 +563,22 @@ function TodoModal({
|
||||
<Plus className="w-5 h-5 mr-2" />
|
||||
{title}
|
||||
</h2>
|
||||
<button onClick={onClose} className="text-white/70 hover:text-white transition-colors">
|
||||
<X className="w-6 h-6" />
|
||||
</button>
|
||||
<div className="flex items-center space-x-2">
|
||||
{isEdit && onComplete && currentStatus !== '5' && (
|
||||
<button
|
||||
type="button"
|
||||
onClick={onComplete}
|
||||
disabled={processing}
|
||||
className="bg-success-500 hover:bg-success-600 text-white px-3 py-1.5 rounded-lg transition-colors flex items-center disabled:opacity-50 text-sm"
|
||||
>
|
||||
<CheckCircle className="w-4 h-4 mr-1" />
|
||||
완료 처리
|
||||
</button>
|
||||
)}
|
||||
<button onClick={onClose} className="text-white/70 hover:text-white transition-colors">
|
||||
<X className="w-6 h-6" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 내용 */}
|
||||
@@ -640,10 +655,11 @@ function TodoModal({
|
||||
onChange={(e) => setFormData(prev => ({ ...prev, seqno: parseInt(e.target.value) as TodoPriority }))}
|
||||
className="w-full bg-white/20 backdrop-blur-sm border border-white/30 rounded-lg px-4 py-2 text-white focus:outline-none focus:ring-2 focus:ring-primary-400 transition-all"
|
||||
>
|
||||
<option value={0}>보통</option>
|
||||
<option value={1}>중요</option>
|
||||
<option value={2}>매우 중요</option>
|
||||
<option value={3}>긴급</option>
|
||||
<option value={2}>매우 중요</option>
|
||||
<option value={1}>중요</option>
|
||||
<option value={0}>보통</option>
|
||||
<option value={-1}>낮음</option>
|
||||
</select>
|
||||
</div>
|
||||
<div className="flex items-end">
|
||||
@@ -661,42 +677,8 @@ function TodoModal({
|
||||
</div>
|
||||
|
||||
{/* 푸터 */}
|
||||
<div className="px-6 py-4 border-t border-white/10 flex justify-between">
|
||||
{/* 왼쪽: 삭제 버튼 (편집 모드일 때만) */}
|
||||
<div>
|
||||
{isEdit && onDelete && (
|
||||
<button
|
||||
type="button"
|
||||
onClick={onDelete}
|
||||
disabled={processing}
|
||||
className="bg-danger-500 hover:bg-danger-600 text-white px-4 py-2 rounded-lg transition-colors flex items-center disabled:opacity-50"
|
||||
>
|
||||
<Trash2 className="w-4 h-4 mr-2" />
|
||||
삭제
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* 오른쪽: 취소, 완료, 수정 버튼 */}
|
||||
<div className="px-6 py-4 border-t border-white/10 flex justify-end">
|
||||
<div className="flex space-x-3">
|
||||
<button
|
||||
type="button"
|
||||
onClick={onClose}
|
||||
className="bg-white/20 hover:bg-white/30 text-white px-4 py-2 rounded-lg transition-colors"
|
||||
>
|
||||
취소
|
||||
</button>
|
||||
{isEdit && onComplete && currentStatus !== '5' && (
|
||||
<button
|
||||
type="button"
|
||||
onClick={onComplete}
|
||||
disabled={processing}
|
||||
className="bg-success-500 hover:bg-success-600 text-white px-4 py-2 rounded-lg transition-colors flex items-center disabled:opacity-50"
|
||||
>
|
||||
<CheckCircle className="w-4 h-4 mr-2" />
|
||||
완료 처리
|
||||
</button>
|
||||
)}
|
||||
<button
|
||||
type="button"
|
||||
onClick={onSubmit}
|
||||
@@ -710,6 +692,17 @@ function TodoModal({
|
||||
)}
|
||||
{submitText}
|
||||
</button>
|
||||
{isEdit && onDelete && (
|
||||
<button
|
||||
type="button"
|
||||
onClick={onDelete}
|
||||
disabled={processing}
|
||||
className="bg-danger-500 hover:bg-danger-600 text-white px-4 py-2 rounded-lg transition-colors flex items-center disabled:opacity-50"
|
||||
>
|
||||
<Trash2 className="w-4 h-4 mr-2" />
|
||||
삭제
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -64,7 +64,7 @@ export interface PurchaseItem {
|
||||
|
||||
// 상태 관련 타입
|
||||
export type TodoStatus = '0' | '1' | '2' | '3' | '5';
|
||||
export type TodoPriority = 0 | 1 | 2 | 3;
|
||||
export type TodoPriority = -1 | 0 | 1 | 2 | 3;
|
||||
|
||||
// 로그 타입
|
||||
export interface LogEntry {
|
||||
@@ -447,6 +447,7 @@ export interface MachineBridgeInterface {
|
||||
Project_GetProcesses(): Promise<string>;
|
||||
Project_GetList(statusFilter: string, category: string, process: string, userFilter: string, yearStart: string, yearEnd: string, dateType: string): Promise<string>;
|
||||
Project_GetHistory(projectIdx: number): Promise<string>;
|
||||
Project_SaveHistory(idx: number, pidx: number, pdate: string, progress: number, remark: string): Promise<string>;
|
||||
Project_GetDailyMemo(projectIdx: number): Promise<string>;
|
||||
|
||||
// Note API (메모장)
|
||||
@@ -462,13 +463,35 @@ export interface MachineBridgeInterface {
|
||||
Board_Add(bidx: number, header: string, cate: string, title: string, contents: string): Promise<string>;
|
||||
Board_Edit(idx: number, header: string, cate: string, title: string, contents: string): Promise<string>;
|
||||
Board_Delete(idx: number): Promise<string>;
|
||||
Board_GetReplies(rootIdx: number): Promise<string>;
|
||||
Board_AddReply(rootIdx: number, pidx: number, title: string, contents: string, isComment: boolean): Promise<string>;
|
||||
|
||||
// Mail API (메일 발신 내역)
|
||||
Mail_GetList(startDate: string, endDate: string, searchKey: string): Promise<string>;
|
||||
Mail_AddData(cate: string, subject: string, fromlist: string, tolist: string, cc: string, bcc: string, body: string): Promise<string>;
|
||||
Mail_SendDirect(cate: string, subject: string, fromlist: string, tolist: string, cc: string, bcc: string, body: string): Promise<string>;
|
||||
Mail_SendOutlook(subject: string, tolist: string, cc: string, bcc: string, body: string): Promise<string>;
|
||||
|
||||
// Customs API (업체정보)
|
||||
Customs_GetList(searchKey: string): Promise<string>;
|
||||
Customs_GetDetail(idx: number): Promise<string>;
|
||||
|
||||
// License API (라이선스 관리)
|
||||
License_GetList(): Promise<string>;
|
||||
License_Add(name: string, version: string, meterialNo: string, supply: string, qty: number, uids: string, serialNo: string, remark: string, sdate: string, edate: string, manu: string, expire: boolean): Promise<string>;
|
||||
License_Update(idx: number, name: string, version: string, meterialNo: string, supply: string, qty: number, uids: string, serialNo: string, remark: string, sdate: string, edate: string, manu: string, expire: boolean): Promise<string>;
|
||||
License_Delete(idx: number): Promise<string>;
|
||||
License_OpenFolder(idx: number): Promise<string>;
|
||||
License_ExportCSV(filePath: string): Promise<string>;
|
||||
|
||||
// PartList API (파트리스트)
|
||||
PartList_GetList(projectIdx: number): Promise<string>;
|
||||
PartList_Save(idx: number, projectIdx: number, itemgroup: string, itemname: string, item: string, itemmodel: string, itemscale: string, itemunit: string, qty: number, price: number, itemsupply: string, itemsupplyidx: number, itemmanu: string, itemsid: string, option1: string, remark: string, no: number, qtybuy: number): Promise<string>;
|
||||
PartList_Delete(idx: number): Promise<string>;
|
||||
|
||||
// HolidayRequest API (휴가/외출 신청)
|
||||
HolidayRequest_GetList(startDate: string, endDate: string, userId: string, userLevel: number): Promise<string>;
|
||||
HolidayRequest_Save(idx: number, uid: string, cate: string, sdate: string, edate: string, remark: string, response: string, conf: number, holyReason: string, holyBackup: string, holyLocation: string, holyDays: number, holyTimes: number, stime: string, etime: string): Promise<string>;
|
||||
}
|
||||
|
||||
// 사용자 권한 정보 타입
|
||||
@@ -501,6 +524,8 @@ export interface AppVersionInfo {
|
||||
ProductName: string;
|
||||
ProductVersion: string;
|
||||
DisplayVersion: string;
|
||||
MaxVersion?: string;
|
||||
HasNewVersion?: boolean;
|
||||
}
|
||||
|
||||
// 사용자 전체 정보 저장용 타입
|
||||
@@ -825,6 +850,44 @@ export interface JobReportTypeItem {
|
||||
count: number;
|
||||
}
|
||||
|
||||
// 휴가/외출 신청 타입
|
||||
export interface HolidayRequest {
|
||||
idx: number;
|
||||
gcode: string;
|
||||
uid: string;
|
||||
cate: string;
|
||||
sdate: string;
|
||||
edate: string;
|
||||
Remark?: string;
|
||||
wuid?: string;
|
||||
wdate?: string;
|
||||
dept?: string;
|
||||
name?: string;
|
||||
grade?: string;
|
||||
tel?: string;
|
||||
processs?: string;
|
||||
Response?: string;
|
||||
conf: number;
|
||||
HolyReason?: string;
|
||||
HolyBackup?: string;
|
||||
HolyLocation?: string;
|
||||
HolyDays?: number;
|
||||
HolyTimes?: number;
|
||||
sendmail?: boolean;
|
||||
stime?: string;
|
||||
etime?: string;
|
||||
conf_id?: string;
|
||||
conf_time?: string;
|
||||
}
|
||||
|
||||
// 휴가/외출 신청 합계 타입
|
||||
export interface HolidayRequestSummary {
|
||||
ApprovedDays: number;
|
||||
ApprovedTimes: number;
|
||||
PendingDays: number;
|
||||
PendingTimes: number;
|
||||
}
|
||||
|
||||
export interface JobReportDayData {
|
||||
items: JobReportDayItem[];
|
||||
holidays: HolidayItem[];
|
||||
@@ -849,6 +912,12 @@ export interface BoardItem {
|
||||
close: boolean;
|
||||
remark: string;
|
||||
wuid_name: string;
|
||||
root_idx?: number | null;
|
||||
depth?: number;
|
||||
sort_order?: number;
|
||||
thread_path?: string;
|
||||
is_comment?: boolean;
|
||||
reply_count?: number;
|
||||
}
|
||||
|
||||
// Mail 발신 내역 타입
|
||||
@@ -887,3 +956,48 @@ export interface CustomItem {
|
||||
name2: string;
|
||||
gcode: string;
|
||||
}
|
||||
|
||||
// 라이선스 타입
|
||||
export interface LicenseItem {
|
||||
idx?: number;
|
||||
gcode?: string;
|
||||
expire?: boolean;
|
||||
name?: string;
|
||||
version?: string;
|
||||
meterialNo?: string;
|
||||
supply?: string;
|
||||
qty?: number;
|
||||
uids?: string;
|
||||
serialNo?: string;
|
||||
remark?: string;
|
||||
sdate?: string;
|
||||
edate?: string;
|
||||
manu?: string;
|
||||
wuid?: string;
|
||||
wdate?: string;
|
||||
}
|
||||
|
||||
// 파트리스트 타입 (ProjectsPart 테이블)
|
||||
export interface PartListItem {
|
||||
idx: number;
|
||||
Project: number;
|
||||
itemgroup?: string;
|
||||
itemname: string;
|
||||
item: string; // 자재번호
|
||||
itemmodel?: string;
|
||||
itemscale?: string;
|
||||
itemunit?: string;
|
||||
qty?: number;
|
||||
price?: number;
|
||||
amt?: number; // 계산된 금액 (qty * price)
|
||||
itemsupply?: string;
|
||||
itemsupplyidx?: number;
|
||||
itemmanu?: string;
|
||||
itemsid?: string;
|
||||
option1?: string;
|
||||
remark?: string;
|
||||
no?: number;
|
||||
qtybuy?: number;
|
||||
wuid?: string;
|
||||
wdate?: string;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="CsvHelper" version="30.0.1" targetFramework="net46" />
|
||||
<package id="EntityFramework" version="6.2.0" targetFramework="net45" />
|
||||
@@ -9,6 +9,8 @@
|
||||
<package id="Microsoft.ReportingServices.ReportViewerControl.Winforms" version="150.1586.0" targetFramework="net46" />
|
||||
<package id="Microsoft.SqlServer.Types" version="14.0.314.76" targetFramework="net46" />
|
||||
<package id="Microsoft.Web.WebView2" version="1.0.2210.55" targetFramework="net46" />
|
||||
<package id="NetOfficeFw.Core" version="1.8.1" targetFramework="net46" />
|
||||
<package id="NetOfficeFw.Outlook" version="1.8.1" targetFramework="net46" />
|
||||
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net46" />
|
||||
<package id="System.Buffers" version="4.5.1" targetFramework="net46" />
|
||||
<package id="System.Memory" version="4.5.5" targetFramework="net46" />
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace Console_SendMail.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.9.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<Settings>
|
||||
<Setting Name="gwcs" Type="(Connection string)" Scope="Application">
|
||||
<DesignTimeValue Profile="(Default)"><?xml version="1.0" encoding="utf-16"?>
|
||||
<SerializableConnectionString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<ConnectionString>Data Source=K4FASQL.kr.ds.amkor.com,50150;Initial Catalog=EE;Persist Security Info=True;User ID=eeadm;Password=uJnU8a8q&amp;DJ+ug-D;Encrypt=False;TrustServerCertificate=True</ConnectionString>
|
||||
<ProviderName>System.Data.SqlClient</ProviderName>
|
||||
</SerializableConnectionString></DesignTimeValue>
|
||||
@@ -12,7 +12,7 @@
|
||||
</Setting>
|
||||
<Setting Name="cs" Type="(Connection string)" Scope="Application">
|
||||
<DesignTimeValue Profile="(Default)"><?xml version="1.0" encoding="utf-16"?>
|
||||
<SerializableConnectionString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<ConnectionString>Data Source=K4FASQL.kr.ds.amkor.com,50150;Initial Catalog=EE;Persist Security Info=True;User ID=eeadm;Password=uJnU8a8q&amp;DJ+ug-D;Encrypt=False;TrustServerCertificate=True</ConnectionString>
|
||||
</SerializableConnectionString></DesignTimeValue>
|
||||
<Value Profile="(Default)">Data Source=K4FASQL.kr.ds.amkor.com,50150;Initial Catalog=EE;Persist Security Info=True;User ID=eeadm;Password=uJnU8a8q&DJ+ug-D;Encrypt=False;TrustServerCertificate=True</Value>
|
||||
|
||||
@@ -995,8 +995,8 @@ namespace Console_SendMail
|
||||
//기준일자는 오늘부터 -15일이다
|
||||
//var sd = DateTime.Now.AddDays(-15);
|
||||
//var ed = DateTime.Now;
|
||||
//var str_sd = sd.ToShortDateString();
|
||||
//var str_ed = ed.ToShortDateString();
|
||||
//var str_sd = sd.ToString("yyyy-MM-dd");
|
||||
//var str_ed = ed.ToString("yyyy-MM-dd");
|
||||
|
||||
var str_dt = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
var sql = "select (select isnull(max(pdate),'') from ProjectsHistory where pidx = Projects.idx) as LastHistory," +
|
||||
@@ -1182,7 +1182,7 @@ namespace Console_SendMail
|
||||
newdr.tolist = "chikyun.kim@amkor.co.kr";
|
||||
newdr.bcc = string.Empty;
|
||||
newdr.cc = string.Empty;
|
||||
newdr.pdate = DateTime.Now.ToString("yyyy-MM-dd");//.ToShortDateString();
|
||||
newdr.pdate = DateTime.Now.ToString("yyyy-MM-dd");//.ToString("yyyy-MM-dd");
|
||||
newdr.body = ex.Message;
|
||||
newdr.wuid = "dev";// "dev";
|
||||
newdr.wdate = DateTime.Now;
|
||||
|
||||
Submodule Sub/tcpservice updated: d7fe2baa0e...1680e266da
@@ -20,7 +20,7 @@ namespace FBS0000
|
||||
Properties.Settings.Default["gwcs"] = FCOMMON.info.CS;
|
||||
|
||||
var sd = DateTime.Now.ToString("yyyy-MM-01");
|
||||
var ed = DateTime.Parse(sd).AddMonths(1).AddDays(-1).ToShortDateString();// DateTime.Now.AddMonths(1).ToString("yyyy-MM-01")).AddDays(-1).ToShortDateString();
|
||||
var ed = DateTime.Parse(sd).AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");// DateTime.Now.AddMonths(1).ToString("yyyy-MM-01")).AddDays(-1).ToString("yyyy-MM-dd");
|
||||
|
||||
tbSD.Text = sd;
|
||||
tbED.Text = ed;
|
||||
@@ -68,7 +68,7 @@ namespace FBS0000
|
||||
cols.Add(curDate.Day.ToString("00") + "\r\n" + curDate.DayOfWeek.ToString().Substring(0, 3));
|
||||
coltag.Add(curDate);
|
||||
|
||||
if (curDate.ToShortDateString() == ed.ToShortDateString()) break;
|
||||
if (curDate.ToString("yyyy-MM-dd") == ed.ToString("yyyy-MM-dd")) break;
|
||||
}
|
||||
cols.AddRange(new string[] { $"발생\n~{sd.AddDays(-1).ToString("MM/dd")}", "사용", $"잔여\n~{ed.ToString("MM/dd")}" });
|
||||
coltag.AddRange(new DateTime[] { initdate, initdate, initdate });
|
||||
@@ -159,8 +159,8 @@ namespace FBS0000
|
||||
|
||||
}
|
||||
//이월잔액
|
||||
var jand = qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, item.empno, sd.ToString("yyyy-01-01"), sd.AddDays(-1).ToShortDateString(), "999999", "%");
|
||||
var jan = qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, item.empno, sd.ToString("yyyy-01-01"), ed.ToShortDateString(), "999999", "%");
|
||||
var jand = qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, item.empno, sd.ToString("yyyy-01-01"), sd.AddDays(-1).ToString("yyyy-MM-dd"), "999999", "%");
|
||||
var jan = qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, item.empno, sd.ToString("yyyy-01-01"), ed.ToString("yyyy-MM-dd"), "999999", "%");
|
||||
var used = 0.0;
|
||||
|
||||
fpSpread1_Sheet1.Rows[rowindex].ResetBorder();
|
||||
@@ -177,7 +177,7 @@ namespace FBS0000
|
||||
var curDate = sd.AddDays(c - 4);
|
||||
var bholy = false;
|
||||
//이날짜가 휴일인지 체크한다.
|
||||
var drHoly = HolyList.Where(t => t.pdate == curDate.ToShortDateString()).FirstOrDefault();
|
||||
var drHoly = HolyList.Where(t => t.pdate == curDate.ToString("yyyy-MM-dd")).FirstOrDefault();
|
||||
|
||||
if (drHoly != null && drHoly.free)
|
||||
{
|
||||
@@ -209,9 +209,9 @@ namespace FBS0000
|
||||
|
||||
|
||||
//입사일이면 메세지 추가
|
||||
if (item.indate == curDate.ToShortDateString())
|
||||
if (item.indate == curDate.ToString("yyyy-MM-dd"))
|
||||
fpSpread1_Sheet1.Cells[rowindex, c].Note += "입사";
|
||||
if (item.outdate == curDate.ToShortDateString())
|
||||
if (item.outdate == curDate.ToString("yyyy-MM-dd"))
|
||||
fpSpread1_Sheet1.Cells[rowindex, c].Note += "퇴사";
|
||||
|
||||
//현재인원값
|
||||
@@ -220,16 +220,16 @@ namespace FBS0000
|
||||
// Boolean usePerson = true;
|
||||
|
||||
//
|
||||
//if (bIndate == true && curDate.ToShortDateString().CompareTo(dtIn.ToShortDateString()) < 0)
|
||||
//if (bIndate == true && curDate.ToString("yyyy-MM-dd").CompareTo(dtIn.ToString("yyyy-MM-dd")) < 0)
|
||||
// usePerson = false;
|
||||
//if (bOutdate == true && curDate.ToShortDateString().CompareTo(dtOut.ToShortDateString()) > 0)
|
||||
//if (bOutdate == true && curDate.ToString("yyyy-MM-dd").CompareTo(dtOut.ToString("yyyy-MM-dd")) > 0)
|
||||
// usePerson = false;
|
||||
|
||||
ps[3] = bholy ? 1 : 0;
|
||||
ps[2] += 1;
|
||||
|
||||
//근태기록에 자료가 있는지 확인한다.
|
||||
var dr = dtHoly.Where(t => t.uid == item.empno && (t.term > 0 || t.CrTime > 0) && (t.sdate.ToShortDateString().CompareTo(curDate.ToShortDateString()) <= 0 && t.edate.ToShortDateString().CompareTo(curDate.ToShortDateString()) >= 0)).FirstOrDefault();
|
||||
var dr = dtHoly.Where(t => t.uid == item.empno && (t.term > 0 || t.CrTime > 0) && (t.sdate.ToString("yyyy-MM-dd").CompareTo(curDate.ToString("yyyy-MM-dd")) <= 0 && t.edate.ToString("yyyy-MM-dd").CompareTo(curDate.ToString("yyyy-MM-dd")) >= 0)).FirstOrDefault();
|
||||
if (dr != null && fpSpread1_Sheet1.Cells[rowindex, c].Tag == null) //휴일이 아니여야 한다
|
||||
{
|
||||
|
||||
@@ -263,7 +263,7 @@ namespace FBS0000
|
||||
}
|
||||
|
||||
//근태 시작일자가 조회시작일보다 적다면, 데이터가 걸쳐진 것이므로 회색으로 처리하자 2308320
|
||||
if (dr.sdate.ToShortDateString().CompareTo(sd.ToShortDateString()) < 0)
|
||||
if (dr.sdate.ToString("yyyy-MM-dd").CompareTo(sd.ToString("yyyy-MM-dd")) < 0)
|
||||
{
|
||||
fpSpread1_Sheet1.Cells[rowindex, c].BackColor = Color.DimGray;
|
||||
fpSpread1_Sheet1.Cells[rowindex, c].ForeColor = Color.White;
|
||||
@@ -271,11 +271,11 @@ namespace FBS0000
|
||||
|
||||
if (string.IsNullOrEmpty(dr.contents) == false)
|
||||
{
|
||||
fpSpread1_Sheet1.Cells[rowindex, c].Note += $"({dr.cate}){dr.contents} 기간:{dr.sdate.ToShortDateString()}~{dr.edate.ToShortDateString()}";
|
||||
fpSpread1_Sheet1.Cells[rowindex, c].Note += $"({dr.cate}){dr.contents} 기간:{dr.sdate.ToString("yyyy-MM-dd")}~{dr.edate.ToString("yyyy-MM-dd")}";
|
||||
}
|
||||
else if (dr.sdate.ToShortDateString() != dr.edate.ToShortDateString())
|
||||
else if (dr.sdate.ToString("yyyy-MM-dd") != dr.edate.ToString("yyyy-MM-dd"))
|
||||
{
|
||||
fpSpread1_Sheet1.Cells[rowindex, c].Note += $"({dr.cate}) 기간:{dr.sdate.ToShortDateString()}~{dr.edate.ToShortDateString()}";
|
||||
fpSpread1_Sheet1.Cells[rowindex, c].Note += $"({dr.cate}) 기간:{dr.sdate.ToString("yyyy-MM-dd")}~{dr.edate.ToString("yyyy-MM-dd")}";
|
||||
}
|
||||
//else fpSpread1_Sheet1.Cells[rowindex, c].Note = string.Empty;
|
||||
}
|
||||
@@ -284,7 +284,7 @@ namespace FBS0000
|
||||
|
||||
ps[0] += 1;
|
||||
|
||||
var pdate = curDate.ToShortDateString();
|
||||
var pdate = curDate.ToString("yyyy-MM-dd");
|
||||
if (pdate == "2022-02-07" && item.empno == "66630")
|
||||
{
|
||||
|
||||
@@ -335,7 +335,7 @@ namespace FBS0000
|
||||
var celltag = fpSpread1_Sheet1.Cells[rowindex, c].Tag;
|
||||
if (celltag == null) //다른곳에서 지정했다면 처리하지 않는다.
|
||||
{
|
||||
if (DateTime.Now.ToShortDateString().CompareTo(pdate) > 0)
|
||||
if (DateTime.Now.ToString("yyyy-MM-dd").CompareTo(pdate) > 0)
|
||||
{
|
||||
fpSpread1_Sheet1.Cells[rowindex, c].Value = "--";
|
||||
fpSpread1_Sheet1.Cells[rowindex, c].ForeColor = Color.Red;
|
||||
@@ -482,8 +482,8 @@ namespace FBS0000
|
||||
var f = new FCOMMON.fSelectMonth();
|
||||
if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
|
||||
var sdDate = DateTime.Parse(DateTime.Now.ToString("yyyy-") + f.selectmon.ToString() + "-01");
|
||||
tbSD.Text = sdDate.ToShortDateString();
|
||||
tbED.Text = sdDate.AddMonths(1).AddDays(-1).ToShortDateString();
|
||||
tbSD.Text = sdDate.ToString("yyyy-MM-dd");
|
||||
tbED.Text = sdDate.AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
|
||||
this.RefreshData();
|
||||
}
|
||||
|
||||
@@ -517,8 +517,8 @@ namespace FBS0000
|
||||
var sd = DateTime.Parse(DateTime.Parse(tbSD.Text).ToString("yyyy-MM-01"));
|
||||
sd = sd.AddMonths(-1);
|
||||
var ed = sd.AddMonths(1).AddDays(-1);
|
||||
tbSD.Text = sd.ToShortDateString();
|
||||
tbED.Text = ed.ToShortDateString();
|
||||
tbSD.Text = sd.ToString("yyyy-MM-dd");
|
||||
tbED.Text = ed.ToString("yyyy-MM-dd");
|
||||
}
|
||||
|
||||
private void toolStripButton5_Click(object sender, EventArgs e)
|
||||
@@ -526,8 +526,8 @@ namespace FBS0000
|
||||
var sd = DateTime.Parse(DateTime.Parse(tbSD.Text).ToString("yyyy-MM-01"));
|
||||
sd = sd.AddMonths(1);
|
||||
var ed = sd.AddMonths(1).AddDays(-1);
|
||||
tbSD.Text = sd.ToShortDateString();
|
||||
tbED.Text = ed.ToShortDateString();
|
||||
tbSD.Text = sd.ToString("yyyy-MM-dd");
|
||||
tbED.Text = ed.ToString("yyyy-MM-dd");
|
||||
}
|
||||
|
||||
private void btXls_Click(object sender, EventArgs e)
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace FBS0000.Holiday
|
||||
|
||||
//dtSD.KeyDown += dtSD_KeyDown;
|
||||
//dtED.KeyDown += dtSD_KeyDown;
|
||||
tbDate.Text = DateTime.Now.ToShortDateString();
|
||||
tbDate.Text = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
}
|
||||
private void fErrorChk_Load(object sender, EventArgs e)
|
||||
{
|
||||
@@ -63,7 +63,7 @@ namespace FBS0000.Holiday
|
||||
{
|
||||
var CD = sd.AddDays(idx++);
|
||||
if (CD > ed) break;
|
||||
var pdate = CD.ToShortDateString();
|
||||
var pdate = CD.ToString("yyyy-MM-dd");
|
||||
tbDate.Text = pdate;
|
||||
Application.DoEvents();
|
||||
|
||||
@@ -383,7 +383,7 @@ namespace FBS0000.Holiday
|
||||
var CD = DateTime.Parse(lv.SubItems[0].Text);
|
||||
|
||||
//if (CD > ed) break;
|
||||
var pdate = CD.ToShortDateString();
|
||||
var pdate = CD.ToString("yyyy-MM-dd");
|
||||
cmd.Parameters["pdate"].Value = pdate;
|
||||
tbDate.Text = pdate;
|
||||
Application.DoEvents();
|
||||
|
||||
@@ -31,7 +31,7 @@ namespace FBS0000
|
||||
if (cmbUser.SelectedIndex < 0)
|
||||
cmbUser.SelectedIndex = 0;
|
||||
|
||||
this.tbMon.Text = DateTime.Now.ToShortDateString();
|
||||
this.tbMon.Text = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
cmbType.SelectedIndex = 0; //일기준으로한다
|
||||
int curLevel = Math.Max(FCOMMON.info.Login.level, FCOMMON.DBM.getAuth(FCOMMON.DBM.eAuthType.holyday));
|
||||
if (curLevel < 5) cmbUser.Enabled = false;
|
||||
@@ -68,12 +68,12 @@ namespace FBS0000
|
||||
var uid = GetUIDValue();
|
||||
if (cmbType.SelectedIndex == 0)
|
||||
{
|
||||
taDay.Fill(this.dsReport.Holydata_Day, FCOMMON.info.Login.gcode, uid, sd.ToShortDateString(), ed.ToShortDateString());
|
||||
taDay.Fill(this.dsReport.Holydata_Day, FCOMMON.info.Login.gcode, uid, sd.ToString("yyyy-MM-dd"), ed.ToString("yyyy-MM-dd"));
|
||||
//this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", bsDay));
|
||||
}
|
||||
else if (cmbType.SelectedIndex == 1) //대체
|
||||
{
|
||||
taTime.Fill(this.dsReport.Holydata_Time, FCOMMON.info.Login.gcode, uid, sd.ToShortDateString(), ed.ToShortDateString());
|
||||
taTime.Fill(this.dsReport.Holydata_Time, FCOMMON.info.Login.gcode, uid, sd.ToString("yyyy-MM-dd"), ed.ToString("yyyy-MM-dd"));
|
||||
dsReport.Holydata_Day.Clear();
|
||||
dsReport.Holydata_Day.Merge(dsReport.Holydata_Time);
|
||||
dsReport.Holydata_Day.AcceptChanges();
|
||||
@@ -82,7 +82,7 @@ namespace FBS0000
|
||||
else //PMS
|
||||
{
|
||||
var tapms = new dsReportTableAdapters.Holydata_TimePMSTableAdapter();
|
||||
tapms.Fill(this.dsReport.Holydata_TimePMS, FCOMMON.info.Login.gcode, uid, sd.ToShortDateString(), ed.ToShortDateString());
|
||||
tapms.Fill(this.dsReport.Holydata_TimePMS, FCOMMON.info.Login.gcode, uid, sd.ToString("yyyy-MM-dd"), ed.ToString("yyyy-MM-dd"));
|
||||
dsReport.Holydata_Day.Clear();
|
||||
dsReport.Holydata_Day.Merge(dsReport.Holydata_TimePMS);
|
||||
dsReport.Holydata_Day.AcceptChanges();
|
||||
@@ -140,14 +140,14 @@ namespace FBS0000
|
||||
{
|
||||
var sdo = DateTime.Parse(this.tbMon.Text);
|
||||
var sd = sdo.AddMonths(-1);
|
||||
tbMon.Text = sd.ToShortDateString();
|
||||
tbMon.Text = sd.ToString("yyyy-MM-dd");
|
||||
}
|
||||
|
||||
private void toolStripButton7_Click(object sender, EventArgs e)
|
||||
{
|
||||
var sdo = DateTime.Parse(this.tbMon.Text);
|
||||
var sd = sdo.AddMonths(1);
|
||||
tbMon.Text = sd.ToShortDateString();
|
||||
tbMon.Text = sd.ToString("yyyy-MM-dd");
|
||||
}
|
||||
|
||||
private void reportViewer1_Load(object sender, EventArgs e)
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace FBS0000
|
||||
//if (cmbUser.SelectedIndex < 0)
|
||||
// cmbUser.SelectedIndex = 0;
|
||||
|
||||
this.tbMon.Text = DateTime.Now.ToShortDateString();
|
||||
this.tbMon.Text = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
cmbType.SelectedIndex = 0; //일기준으로한다
|
||||
|
||||
}
|
||||
@@ -79,15 +79,15 @@ namespace FBS0000
|
||||
var sd = DateTime.Parse(ed.ToString("yyyy") + "-01-01");
|
||||
|
||||
int curLevel = Math.Max(FCOMMON.info.Login.level, FCOMMON.DBM.getAuth(FCOMMON.DBM.eAuthType.holyday));
|
||||
var uid = curLevel > 5 ? "%" : FCOMMON.info.Login.no; // GetUIDValue();
|
||||
var uid = curLevel >= 5 ? "%" : FCOMMON.info.Login.no; // GetUIDValue();
|
||||
if (cmbType.SelectedIndex == 0)
|
||||
{
|
||||
taDay.Fill(this.dsReport.Holydata_Day, FCOMMON.info.Login.gcode, uid, sd.ToShortDateString(), ed.ToShortDateString());
|
||||
taDay.Fill(this.dsReport.Holydata_Day, FCOMMON.info.Login.gcode, uid, sd.ToString("yyyy-MM-dd"), ed.ToString("yyyy-MM-dd"));
|
||||
//this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", bsDay));
|
||||
}
|
||||
else if(cmbType.SelectedIndex == 1)
|
||||
{
|
||||
taTime.Fill(this.dsReport.Holydata_Time, FCOMMON.info.Login.gcode, uid, sd.ToShortDateString(), ed.ToShortDateString());
|
||||
taTime.Fill(this.dsReport.Holydata_Time, FCOMMON.info.Login.gcode, uid, sd.ToString("yyyy-MM-dd"), ed.ToString("yyyy-MM-dd"));
|
||||
dsReport.Holydata_Day.Clear();
|
||||
dsReport.Holydata_Day.Merge(dsReport.Holydata_Time);
|
||||
dsReport.Holydata_Day.AcceptChanges();
|
||||
@@ -96,7 +96,7 @@ namespace FBS0000
|
||||
else //pms
|
||||
{
|
||||
var taPMS = new dsReportTableAdapters.Holydata_TimePMSTableAdapter();
|
||||
taPMS.Fill(this.dsReport.Holydata_TimePMS, FCOMMON.info.Login.gcode, uid, sd.ToShortDateString(), ed.ToShortDateString());
|
||||
taPMS.Fill(this.dsReport.Holydata_TimePMS, FCOMMON.info.Login.gcode, uid, sd.ToString("yyyy-MM-dd"), ed.ToString("yyyy-MM-dd"));
|
||||
dsReport.Holydata_Day.Clear();
|
||||
dsReport.Holydata_Day.Merge(dsReport.Holydata_TimePMS);
|
||||
dsReport.Holydata_Day.AcceptChanges();
|
||||
@@ -151,14 +151,14 @@ namespace FBS0000
|
||||
{
|
||||
var sdo = DateTime.Parse(this.tbMon.Text);
|
||||
var sd = sdo.AddMonths(-1);
|
||||
tbMon.Text = sd.ToShortDateString();
|
||||
tbMon.Text = sd.ToString("yyyy-MM-dd");
|
||||
}
|
||||
|
||||
private void toolStripButton7_Click(object sender, EventArgs e)
|
||||
{
|
||||
var sdo = DateTime.Parse(this.tbMon.Text);
|
||||
var sd = sdo.AddMonths(1);
|
||||
tbMon.Text = sd.ToShortDateString();
|
||||
tbMon.Text = sd.ToString("yyyy-MM-dd");
|
||||
}
|
||||
|
||||
private void reportViewer1_Load(object sender, EventArgs e)
|
||||
|
||||
@@ -45,7 +45,7 @@ namespace FBS0000
|
||||
im2.Put(new FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextColumnWrap);
|
||||
|
||||
dtSD.Text = DateTime.Now.ToString("yyyy-MM") + "-01";
|
||||
dtED.Text = DateTime.Parse(DateTime.Now.AddMonths(1).ToString("yyyy-MM") + "-01").AddDays(-1).ToShortDateString();
|
||||
dtED.Text = DateTime.Parse(DateTime.Now.AddMonths(1).ToString("yyyy-MM") + "-01").AddDays(-1).ToString("yyyy-MM-dd");
|
||||
|
||||
//현재 사용자의 그룹명을 가져옴
|
||||
var taQuery = new dsMSSQLTableAdapters.QueriesTableAdapter();
|
||||
@@ -137,7 +137,7 @@ namespace FBS0000
|
||||
var sd = DateTime.Parse(dtSD.Text + " 00:00:00");
|
||||
var ed = DateTime.Parse(dtED.Text + " 23:59:59");
|
||||
//sd = DateTime.Parse(ed.ToString("yyyy-01-01 00:00:00"));
|
||||
//this.tbSD.Text = sd.ToShortDateString();
|
||||
//this.tbSD.Text = sd.ToString("yyyy-MM-dd");
|
||||
|
||||
try
|
||||
{
|
||||
@@ -188,8 +188,8 @@ namespace FBS0000
|
||||
var fistdate = dr.sdate.ToString("yyyy-01-01");
|
||||
|
||||
//이 사용자의 이전까지의 잔량을 가져온다
|
||||
var yjand = qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, dr.uid, fistdate, dr.sdate.ToShortDateString(), dr.idx.ToString("000000"),"%");
|
||||
var yjanh = qta.WorkUserJan_YesterDay_Time(FCOMMON.info.Login.gcode, dr.uid, fistdate, dr.sdate.ToShortDateString(), dr.idx.ToString("000000"));
|
||||
var yjand = qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, dr.uid, fistdate, dr.sdate.ToString("yyyy-MM-dd"), dr.idx.ToString("000000"),"%");
|
||||
var yjanh = qta.WorkUserJan_YesterDay_Time(FCOMMON.info.Login.gcode, dr.uid, fistdate, dr.sdate.ToString("yyyy-MM-dd"), dr.idx.ToString("000000"));
|
||||
var jand = yjand + dr.termDr - dr.term;
|
||||
var janh = yjanh + dr.DrTime - dr.CrTime;
|
||||
this.fpSpread1.ActiveSheet.Cells[i, col_yjand].Value = yjand;
|
||||
@@ -298,8 +298,8 @@ namespace FBS0000
|
||||
|
||||
////이 사용자의 이전까지의 잔량을 가져온다
|
||||
//var fistdate = newdr.sdate.ToString("yyyy-01-01");
|
||||
//var yjand = 0;// qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, this.seluid, fistdate, newdr.sdate.ToShortDateString(),"999999");
|
||||
//var yjanh = 0;// qta.WorkUserJan_YesterDay_Time(FCOMMON.info.Login.gcode, seluid, fistdate, newdr.sdate.ToShortDateString(), "999999");
|
||||
//var yjand = 0;// qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, this.seluid, fistdate, newdr.sdate.ToString("yyyy-MM-dd"),"999999");
|
||||
//var yjanh = 0;// qta.WorkUserJan_YesterDay_Time(FCOMMON.info.Login.gcode, seluid, fistdate, newdr.sdate.ToString("yyyy-MM-dd"), "999999");
|
||||
|
||||
|
||||
|
||||
@@ -586,8 +586,8 @@ namespace FBS0000
|
||||
var f = new FCOMMON.fSelectMonth();
|
||||
if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
|
||||
var sdDate = DateTime.Parse(DateTime.Now.ToString("yyyy-") + f.selectmon.ToString() + "-01");
|
||||
dtSD.Text = sdDate.ToShortDateString();
|
||||
dtED.Text = sdDate.AddMonths(1).AddDays(-1).ToShortDateString();
|
||||
dtSD.Text = sdDate.ToString("yyyy-MM-dd");
|
||||
dtED.Text = sdDate.AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
|
||||
this.RefreshData();
|
||||
}
|
||||
|
||||
@@ -702,7 +702,7 @@ namespace FBS0000
|
||||
{
|
||||
var f = new FCOMMON.fSelectDay(DateTime.Parse(dtED.Text));
|
||||
if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
|
||||
dtED.Text = f.dtPick.SelectionStart.ToShortDateString();
|
||||
dtED.Text = f.dtPick.SelectionStart.ToString("yyyy-MM-dd");
|
||||
}
|
||||
|
||||
private void toolStripButton8_Click(object sender, EventArgs e)
|
||||
@@ -710,8 +710,8 @@ namespace FBS0000
|
||||
var sdo = DateTime.Parse(dtSD.Text);
|
||||
var sd = DateTime.Parse(sdo.AddMonths(-1).ToString("yyyy-MM-01"));
|
||||
var ed = sd.AddMonths(1).AddDays(-1);
|
||||
dtSD.Text = sd.ToShortDateString();
|
||||
dtED.Text = ed.ToShortDateString();
|
||||
dtSD.Text = sd.ToString("yyyy-MM-dd");
|
||||
dtED.Text = ed.ToString("yyyy-MM-dd");
|
||||
}
|
||||
|
||||
private void toolStripButton9_Click(object sender, EventArgs e)
|
||||
@@ -719,8 +719,8 @@ namespace FBS0000
|
||||
var sdo = DateTime.Parse(dtSD.Text);
|
||||
var sd = DateTime.Parse(sdo.AddMonths(1).ToString("yyyy-MM-01"));
|
||||
var ed = sd.AddMonths(1).AddDays(-1);
|
||||
dtSD.Text = sd.ToShortDateString();
|
||||
dtED.Text = ed.ToShortDateString();
|
||||
dtSD.Text = sd.ToString("yyyy-MM-dd");
|
||||
dtED.Text = ed.ToString("yyyy-MM-dd");
|
||||
}
|
||||
|
||||
private void toolStripLabel3_Click(object sender, EventArgs e)
|
||||
|
||||
@@ -169,7 +169,6 @@
|
||||
// tam
|
||||
//
|
||||
this.tam.BackupDataSetBeforeUpdate = false;
|
||||
this.tam.BoardTableAdapter = null;
|
||||
this.tam.EETGW_WorkTableUserTableAdapter = null;
|
||||
this.tam.HolidayLIstTableAdapter = null;
|
||||
this.tam.HolydayTableAdapter = this.ta;
|
||||
|
||||
@@ -70,7 +70,7 @@ namespace FBS0000.Holiday
|
||||
if (buffer.Length > 6) crtime = buffer[6].Trim();
|
||||
float.TryParse(crtime, out float val_crtime);
|
||||
|
||||
var lv = this.listView1.Items.Add(val_date.ToShortDateString());
|
||||
var lv = this.listView1.Items.Add(val_date.ToString("yyyy-MM-dd"));
|
||||
lv.SubItems.Add(vno);
|
||||
lv.SubItems.Add(vcate);
|
||||
lv.SubItems.Add(drday.ToString());
|
||||
|
||||
@@ -47,8 +47,8 @@ namespace FBS0000.Holiday
|
||||
cn.Open();
|
||||
var cmd = new System.Data.SqlClient.SqlCommand("", cn);
|
||||
cmd.Parameters.Add("gcode", SqlDbType.VarChar).Value = gcode;
|
||||
cmd.Parameters.Add("sd", SqlDbType.VarChar).Value = stime.ToShortDateString();
|
||||
cmd.Parameters.Add("ed", SqlDbType.VarChar).Value = etime.ToShortDateString();
|
||||
cmd.Parameters.Add("sd", SqlDbType.VarChar).Value = stime.ToString("yyyy-MM-dd");
|
||||
cmd.Parameters.Add("ed", SqlDbType.VarChar).Value = etime.ToString("yyyy-MM-dd");
|
||||
|
||||
//근태입력자료확인
|
||||
cmd.CommandText = "SELECT holyday.uid, Users.name,\r\nsum( Holyday.DrTime) AS Dr," +
|
||||
@@ -128,7 +128,7 @@ namespace FBS0000.Holiday
|
||||
}
|
||||
|
||||
var ed = dateTimePicker1.Value;
|
||||
if (UTIL.MsgQ($"{chkitems.Count}건의 자료를 {ed.ToShortDateString()}일자로 등록할까요?\n구분은 '대체'로 입력됩니다") != DialogResult.Yes)
|
||||
if (UTIL.MsgQ($"{chkitems.Count}건의 자료를 {ed.ToString("yyyy-MM-dd")}일자로 등록할까요?\n구분은 '대체'로 입력됩니다") != DialogResult.Yes)
|
||||
return;
|
||||
|
||||
var sumjan = 0.0;
|
||||
|
||||
@@ -45,7 +45,7 @@ namespace FBS0000
|
||||
im2.Put(new FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextColumnWrap);
|
||||
|
||||
dtSD.Text = DateTime.Now.ToString("yyyy") + "-01-01";
|
||||
dtED.Text = DateTime.Parse(DateTime.Now.AddMonths(1).ToString("yyyy-MM") + "-01").AddDays(-1).ToShortDateString();
|
||||
dtED.Text = DateTime.Parse(DateTime.Now.AddMonths(1).ToString("yyyy-MM") + "-01").AddDays(-1).ToString("yyyy-MM-dd");
|
||||
|
||||
//현재 사용자의 그룹명을 가져옴
|
||||
var taQuery = new dsMSSQLTableAdapters.QueriesTableAdapter();
|
||||
@@ -134,7 +134,7 @@ namespace FBS0000
|
||||
var sd = DateTime.Parse(dtSD.Text + " 00:00:00");
|
||||
var ed = DateTime.Parse(dtED.Text + " 23:59:59");
|
||||
//sd = DateTime.Parse(ed.ToString("yyyy-01-01 00:00:00"));
|
||||
//this.tbSD.Text = sd.ToShortDateString();
|
||||
//this.tbSD.Text = sd.ToString("yyyy-MM-dd");
|
||||
|
||||
try
|
||||
{
|
||||
@@ -185,8 +185,8 @@ namespace FBS0000
|
||||
var fistdate = dr.sdate.ToString("yyyy-01-01");
|
||||
|
||||
//이 사용자의 이전까지의 잔량을 가져온다
|
||||
var yjand = qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, dr.uid, fistdate, dr.sdate.ToShortDateString(), dr.idx.ToString("000000"),"년차");
|
||||
//var yjanh = qta.WorkUserJan_YesterDay_Time(FCOMMON.info.Login.gcode, dr.uid, fistdate, dr.sdate.ToShortDateString(), dr.idx.ToString("000000"));
|
||||
var yjand = qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, dr.uid, fistdate, dr.sdate.ToString("yyyy-MM-dd"), dr.idx.ToString("000000"),"년차");
|
||||
//var yjanh = qta.WorkUserJan_YesterDay_Time(FCOMMON.info.Login.gcode, dr.uid, fistdate, dr.sdate.ToString("yyyy-MM-dd"), dr.idx.ToString("000000"));
|
||||
var jand = yjand + dr.termDr - dr.term;
|
||||
//var janh = yjanh + dr.DrTime - dr.CrTime;
|
||||
this.fpSpread1.ActiveSheet.Cells[i, col_jand].Value = jand;
|
||||
@@ -295,8 +295,8 @@ namespace FBS0000
|
||||
|
||||
////이 사용자의 이전까지의 잔량을 가져온다
|
||||
//var fistdate = newdr.sdate.ToString("yyyy-01-01");
|
||||
//var yjand = 0;// qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, this.seluid, fistdate, newdr.sdate.ToShortDateString(),"999999");
|
||||
//var yjanh = 0;// qta.WorkUserJan_YesterDay_Time(FCOMMON.info.Login.gcode, seluid, fistdate, newdr.sdate.ToShortDateString(), "999999");
|
||||
//var yjand = 0;// qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, this.seluid, fistdate, newdr.sdate.ToString("yyyy-MM-dd"),"999999");
|
||||
//var yjanh = 0;// qta.WorkUserJan_YesterDay_Time(FCOMMON.info.Login.gcode, seluid, fistdate, newdr.sdate.ToString("yyyy-MM-dd"), "999999");
|
||||
|
||||
|
||||
|
||||
@@ -417,7 +417,7 @@ namespace FBS0000
|
||||
private void toolStripButton5_Click(object sender, EventArgs e)
|
||||
{
|
||||
//var sd = DateTime.Now.ToString("yyyy-MM-01");
|
||||
//var ed = DateTime.Parse(DateTime.Now.AddMonths(1).ToString("yyyy-MM-01")).AddDays(-1).ToShortDateString();
|
||||
//var ed = DateTime.Parse(DateTime.Now.AddMonths(1).ToString("yyyy-MM-01")).AddDays(-1).ToString("yyyy-MM-dd");
|
||||
var f = new WorkTable();
|
||||
f.Show();
|
||||
}
|
||||
@@ -579,8 +579,8 @@ namespace FBS0000
|
||||
var f = new FCOMMON.fSelectMonth();
|
||||
if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
|
||||
var sdDate = DateTime.Parse(DateTime.Now.ToString("yyyy-") + f.selectmon.ToString() + "-01");
|
||||
dtSD.Text = sdDate.ToShortDateString();
|
||||
dtED.Text = sdDate.AddMonths(1).AddDays(-1).ToShortDateString();
|
||||
dtSD.Text = sdDate.ToString("yyyy-MM-dd");
|
||||
dtED.Text = sdDate.AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
|
||||
this.RefreshData();
|
||||
}
|
||||
|
||||
@@ -695,7 +695,7 @@ namespace FBS0000
|
||||
{
|
||||
var f = new FCOMMON.fSelectDay(DateTime.Parse(dtED.Text));
|
||||
if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
|
||||
dtED.Text = f.dtPick.SelectionStart.ToShortDateString();
|
||||
dtED.Text = f.dtPick.SelectionStart.ToString("yyyy-MM-dd");
|
||||
}
|
||||
|
||||
private void toolStripButton8_Click(object sender, EventArgs e)
|
||||
@@ -703,8 +703,8 @@ namespace FBS0000
|
||||
var sdo = DateTime.Parse(dtSD.Text);
|
||||
var sd = DateTime.Parse(sdo.AddMonths(-1).ToString("yyyy-MM-01"));
|
||||
var ed = sd.AddMonths(1).AddDays(-1);
|
||||
dtSD.Text = sd.ToShortDateString();
|
||||
dtED.Text = ed.ToShortDateString();
|
||||
dtSD.Text = sd.ToString("yyyy-MM-dd");
|
||||
dtED.Text = ed.ToString("yyyy-MM-dd");
|
||||
}
|
||||
|
||||
private void toolStripButton9_Click(object sender, EventArgs e)
|
||||
@@ -712,8 +712,8 @@ namespace FBS0000
|
||||
var sdo = DateTime.Parse(dtSD.Text);
|
||||
var sd = DateTime.Parse(sdo.AddMonths(1).ToString("yyyy-MM-01"));
|
||||
var ed = sd.AddMonths(1).AddDays(-1);
|
||||
dtSD.Text = sd.ToShortDateString();
|
||||
dtED.Text = ed.ToShortDateString();
|
||||
dtSD.Text = sd.ToString("yyyy-MM-dd");
|
||||
dtED.Text = ed.ToString("yyyy-MM-dd");
|
||||
}
|
||||
|
||||
private void toolStripLabel3_Click(object sender, EventArgs e)
|
||||
|
||||
@@ -28,7 +28,7 @@ namespace FBS0000
|
||||
{
|
||||
EnsureVisibleAndUsableSize();
|
||||
|
||||
this.tbMon.Text = DateTime.Now.ToShortDateString();
|
||||
this.tbMon.Text = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
|
||||
refrehData();
|
||||
// this.reportViewer1.RefreshReport();
|
||||
@@ -38,7 +38,7 @@ namespace FBS0000
|
||||
{
|
||||
|
||||
var dt = DateTime.Parse(this.tbMon.Text);
|
||||
ta.Fill(this.dsReport.holydata, FCOMMON.info.Login.gcode, dt.Year.ToString("0000") + "-01-01", dt.ToShortDateString());
|
||||
ta.Fill(this.dsReport.holydata, FCOMMON.info.Login.gcode, dt.Year.ToString("0000") + "-01-01", dt.ToString("yyyy-MM-dd"));
|
||||
|
||||
//데이터를 재 집계한다.
|
||||
this.dsReport.holydatasum.Clear();
|
||||
@@ -385,14 +385,14 @@ namespace FBS0000
|
||||
{
|
||||
var sdo = DateTime.Parse(this.tbMon.Text);
|
||||
var sd = sdo.AddMonths(-1);
|
||||
tbMon.Text = sd.ToShortDateString();
|
||||
tbMon.Text = sd.ToString("yyyy-MM-dd");
|
||||
}
|
||||
|
||||
private void toolStripButton7_Click(object sender, EventArgs e)
|
||||
{
|
||||
var sdo = DateTime.Parse(this.tbMon.Text);
|
||||
var sd = sdo.AddMonths(1);
|
||||
tbMon.Text = sd.ToShortDateString();
|
||||
tbMon.Text = sd.ToString("yyyy-MM-dd");
|
||||
}
|
||||
|
||||
private void reportViewer1_Load(object sender, EventArgs e)
|
||||
|
||||
2881
SubProject/FBS0000/dsMSSQL.Designer.cs
generated
2881
SubProject/FBS0000/dsMSSQL.Designer.cs
generated
File diff suppressed because it is too large
Load Diff
@@ -128,107 +128,6 @@ WHERE (idx = @idx)</CommandText>
|
||||
</DbSource>
|
||||
</Sources>
|
||||
</TableAdapter>
|
||||
<TableAdapter BaseClass="System.ComponentModel.Component" DataAccessorModifier="AutoLayout, AnsiClass, Class, Public" DataAccessorName="BoardTableAdapter" GeneratorDataComponentClassName="BoardTableAdapter" Name="Board" UserDataComponentName="BoardTableAdapter">
|
||||
<MainSource>
|
||||
<DbSource ConnectionRef="gwcs (Settings)" DbObjectName="EE.dbo.Board" DbObjectType="Table" FillMethodModifier="Public" FillMethodName="Fill" GenerateMethods="Both" GenerateShortCommands="true" GeneratorGetMethodName="GetData" GeneratorSourceName="Fill" GetMethodModifier="Public" GetMethodName="GetData" QueryType="Rowset" ScalarCallRetval="System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" UseOptimisticConcurrency="true" UserGetMethodName="GetData" UserSourceName="Fill">
|
||||
<DeleteCommand>
|
||||
<DbCommand CommandType="Text" ModifiedByUser="false">
|
||||
<CommandText>DELETE FROM [Board] WHERE (([idx] = @Original_idx) AND ((@IsNull_bidx = 1 AND [bidx] IS NULL) OR ([bidx] = @Original_bidx)) AND ((@IsNull_header = 1 AND [header] IS NULL) OR ([header] = @Original_header)) AND ((@IsNull_cate = 1 AND [cate] IS NULL) OR ([cate] = @Original_cate)) AND ((@IsNull_title = 1 AND [title] IS NULL) OR ([title] = @Original_title)) AND ((@IsNull_file = 1 AND [file] IS NULL) OR ([file] = @Original_file)) AND ((@IsNull_guid = 1 AND [guid] IS NULL) OR ([guid] = @Original_guid)) AND ([wuid] = @Original_wuid) AND ([wdate] = @Original_wdate))</CommandText>
|
||||
<Parameters>
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@Original_idx" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="idx" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_bidx" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="bidx" SourceColumnNullMapping="true" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@Original_bidx" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="bidx" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_header" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="header" SourceColumnNullMapping="true" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Boolean" Direction="Input" ParameterName="@Original_header" Precision="0" ProviderType="Bit" Scale="0" Size="0" SourceColumn="header" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_cate" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="cate" SourceColumnNullMapping="true" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@Original_cate" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="cate" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_title" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="title" SourceColumnNullMapping="true" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@Original_title" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="title" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_file" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="file" SourceColumnNullMapping="true" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@Original_file" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="file" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_guid" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="guid" SourceColumnNullMapping="true" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@Original_guid" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="guid" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@Original_wuid" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="wuid" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="DateTime" Direction="Input" ParameterName="@Original_wdate" Precision="0" ProviderType="DateTime" Scale="0" Size="0" SourceColumn="wdate" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
</Parameters>
|
||||
</DbCommand>
|
||||
</DeleteCommand>
|
||||
<InsertCommand>
|
||||
<DbCommand CommandType="Text" ModifiedByUser="false">
|
||||
<CommandText>INSERT INTO [Board] ([bidx], [header], [cate], [title], [contents], [file], [guid], [wuid], [wdate]) VALUES (@bidx, @header, @cate, @title, @contents, @file, @guid, @wuid, @wdate);
|
||||
SELECT idx, bidx, header, cate, title, contents, [file], guid, wuid, wdate FROM Board WHERE (idx = SCOPE_IDENTITY())</CommandText>
|
||||
<Parameters>
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@bidx" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="bidx" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Boolean" Direction="Input" ParameterName="@header" Precision="0" ProviderType="Bit" Scale="0" Size="0" SourceColumn="header" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@cate" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="cate" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@title" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="title" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@contents" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="contents" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@file" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="file" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@guid" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="guid" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@wuid" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="wuid" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="DateTime" Direction="Input" ParameterName="@wdate" Precision="0" ProviderType="DateTime" Scale="0" Size="0" SourceColumn="wdate" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
</Parameters>
|
||||
</DbCommand>
|
||||
</InsertCommand>
|
||||
<SelectCommand>
|
||||
<DbCommand CommandType="Text" ModifiedByUser="false">
|
||||
<CommandText>SELECT idx, bidx, header, cate, title, contents, [file], guid, wuid, wdate
|
||||
FROM Board WITH (NOLOCK)
|
||||
WHERE (bidx = @bidx)</CommandText>
|
||||
<Parameters>
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="bidx" ColumnName="bidx" DataSourceName="EE.dbo.Board" DataTypeServer="int" DbType="Int32" Direction="Input" ParameterName="@bidx" Precision="0" ProviderType="Int" Scale="0" Size="4" SourceColumn="bidx" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
</Parameters>
|
||||
</DbCommand>
|
||||
</SelectCommand>
|
||||
<UpdateCommand>
|
||||
<DbCommand CommandType="Text" ModifiedByUser="false">
|
||||
<CommandText>UPDATE [Board] SET [bidx] = @bidx, [header] = @header, [cate] = @cate, [title] = @title, [contents] = @contents, [file] = @file, [guid] = @guid, [wuid] = @wuid, [wdate] = @wdate WHERE (([idx] = @Original_idx) AND ((@IsNull_bidx = 1 AND [bidx] IS NULL) OR ([bidx] = @Original_bidx)) AND ((@IsNull_header = 1 AND [header] IS NULL) OR ([header] = @Original_header)) AND ((@IsNull_cate = 1 AND [cate] IS NULL) OR ([cate] = @Original_cate)) AND ((@IsNull_title = 1 AND [title] IS NULL) OR ([title] = @Original_title)) AND ((@IsNull_file = 1 AND [file] IS NULL) OR ([file] = @Original_file)) AND ((@IsNull_guid = 1 AND [guid] IS NULL) OR ([guid] = @Original_guid)) AND ([wuid] = @Original_wuid) AND ([wdate] = @Original_wdate));
|
||||
SELECT idx, bidx, header, cate, title, contents, [file], guid, wuid, wdate FROM Board WHERE (idx = @idx)</CommandText>
|
||||
<Parameters>
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@bidx" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="bidx" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Boolean" Direction="Input" ParameterName="@header" Precision="0" ProviderType="Bit" Scale="0" Size="0" SourceColumn="header" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@cate" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="cate" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@title" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="title" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@contents" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="contents" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@file" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="file" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@guid" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="guid" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@wuid" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="wuid" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="DateTime" Direction="Input" ParameterName="@wdate" Precision="0" ProviderType="DateTime" Scale="0" Size="0" SourceColumn="wdate" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@Original_idx" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="idx" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_bidx" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="bidx" SourceColumnNullMapping="true" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@Original_bidx" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="bidx" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_header" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="header" SourceColumnNullMapping="true" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Boolean" Direction="Input" ParameterName="@Original_header" Precision="0" ProviderType="Bit" Scale="0" Size="0" SourceColumn="header" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_cate" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="cate" SourceColumnNullMapping="true" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@Original_cate" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="cate" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_title" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="title" SourceColumnNullMapping="true" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@Original_title" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="title" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_file" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="file" SourceColumnNullMapping="true" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@Original_file" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="file" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_guid" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="guid" SourceColumnNullMapping="true" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@Original_guid" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="guid" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@Original_wuid" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="wuid" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="DateTime" Direction="Input" ParameterName="@Original_wdate" Precision="0" ProviderType="DateTime" Scale="0" Size="0" SourceColumn="wdate" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="idx" ColumnName="idx" DataSourceName="" DataTypeServer="int" DbType="Int32" Direction="Input" ParameterName="@idx" Precision="0" ProviderType="Int" Scale="0" Size="4" SourceColumn="idx" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
</Parameters>
|
||||
</DbCommand>
|
||||
</UpdateCommand>
|
||||
</DbSource>
|
||||
</MainSource>
|
||||
<Mappings>
|
||||
<Mapping SourceColumn="idx" DataSetColumn="idx" />
|
||||
<Mapping SourceColumn="bidx" DataSetColumn="bidx" />
|
||||
<Mapping SourceColumn="header" DataSetColumn="header" />
|
||||
<Mapping SourceColumn="cate" DataSetColumn="cate" />
|
||||
<Mapping SourceColumn="title" DataSetColumn="title" />
|
||||
<Mapping SourceColumn="contents" DataSetColumn="contents" />
|
||||
<Mapping SourceColumn="file" DataSetColumn="file" />
|
||||
<Mapping SourceColumn="guid" DataSetColumn="guid" />
|
||||
<Mapping SourceColumn="wuid" DataSetColumn="wuid" />
|
||||
<Mapping SourceColumn="wdate" DataSetColumn="wdate" />
|
||||
</Mappings>
|
||||
<Sources />
|
||||
</TableAdapter>
|
||||
<TableAdapter BaseClass="System.ComponentModel.Component" DataAccessorModifier="AutoLayout, AnsiClass, Class, Public" DataAccessorName="HolydayTableAdapter" GeneratorDataComponentClassName="HolydayTableAdapter" Name="Holyday" UserDataComponentName="HolydayTableAdapter">
|
||||
<MainSource>
|
||||
<DbSource ConnectionRef="gwcs (Settings)" DbObjectName="EE.dbo.Holyday" DbObjectType="Table" FillMethodModifier="Public" FillMethodName="Fill" GenerateMethods="Both" GenerateShortCommands="true" GeneratorGetMethodName="GetData" GeneratorSourceName="Fill" GetMethodModifier="Public" GetMethodName="GetData" QueryType="Rowset" ScalarCallRetval="System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" UseOptimisticConcurrency="true" UserGetMethodName="GetData" UserSourceName="Fill">
|
||||
@@ -908,527 +807,475 @@ WHERE (gcode = @gcode) AND (uid = @uid) AND (CONVERT(CHAR(10), sdate, 23) >=
|
||||
</DataSource>
|
||||
</xs:appinfo>
|
||||
</xs:annotation>
|
||||
<xs:element name="dsMSSQL" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msprop:Generator_UserDSName="dsMSSQL" msprop:EnableTableAdapterManager="true" msprop:Generator_DataSetName="dsMSSQL">
|
||||
<xs:element name="dsMSSQL" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msprop:EnableTableAdapterManager="true" msprop:Generator_DataSetName="dsMSSQL" msprop:Generator_UserDSName="dsMSSQL">
|
||||
<xs:complexType>
|
||||
<xs:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:element name="minutes" msprop:Generator_RowEvHandlerName="minutesRowChangeEventHandler" msprop:Generator_RowDeletedName="minutesRowDeleted" msprop:Generator_RowDeletingName="minutesRowDeleting" msprop:Generator_RowEvArgName="minutesRowChangeEvent" msprop:Generator_TablePropName="minutes" msprop:Generator_RowChangedName="minutesRowChanged" msprop:Generator_UserTableName="minutes" msprop:Generator_RowChangingName="minutesRowChanging" msprop:Generator_RowClassName="minutesRow" msprop:Generator_TableClassName="minutesDataTable" msprop:Generator_TableVarName="tableminutes">
|
||||
<xs:element name="minutes" msprop:Generator_UserTableName="minutes" msprop:Generator_RowEvArgName="minutesRowChangeEvent" msprop:Generator_TableVarName="tableminutes" msprop:Generator_TablePropName="minutes" msprop:Generator_RowDeletingName="minutesRowDeleting" msprop:Generator_RowChangingName="minutesRowChanging" msprop:Generator_RowDeletedName="minutesRowDeleted" msprop:Generator_RowEvHandlerName="minutesRowChangeEventHandler" msprop:Generator_TableClassName="minutesDataTable" msprop:Generator_RowChangedName="minutesRowChanged" msprop:Generator_RowClassName="minutesRow">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_UserColumnName="idx" msprop:Generator_ColumnVarNameInTable="columnidx" type="xs:int" />
|
||||
<xs:element name="stime" msprop:Generator_ColumnPropNameInTable="stimeColumn" msprop:Generator_ColumnPropNameInRow="stime" msprop:Generator_UserColumnName="stime" msprop:Generator_ColumnVarNameInTable="columnstime" type="xs:dateTime" minOccurs="0" />
|
||||
<xs:element name="etime" msprop:Generator_ColumnPropNameInTable="etimeColumn" msprop:Generator_ColumnPropNameInRow="etime" msprop:Generator_UserColumnName="etime" msprop:Generator_ColumnVarNameInTable="columnetime" type="xs:dateTime" minOccurs="0" />
|
||||
<xs:element name="title" msprop:Generator_ColumnPropNameInTable="titleColumn" msprop:Generator_ColumnPropNameInRow="title" msprop:Generator_UserColumnName="title" msprop:Generator_ColumnVarNameInTable="columntitle" minOccurs="0">
|
||||
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnVarNameInTable="columnidx" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_UserColumnName="idx" type="xs:int" />
|
||||
<xs:element name="stime" msprop:Generator_ColumnVarNameInTable="columnstime" msprop:Generator_ColumnPropNameInRow="stime" msprop:Generator_ColumnPropNameInTable="stimeColumn" msprop:Generator_UserColumnName="stime" type="xs:dateTime" minOccurs="0" />
|
||||
<xs:element name="etime" msprop:Generator_ColumnVarNameInTable="columnetime" msprop:Generator_ColumnPropNameInRow="etime" msprop:Generator_ColumnPropNameInTable="etimeColumn" msprop:Generator_UserColumnName="etime" type="xs:dateTime" minOccurs="0" />
|
||||
<xs:element name="title" msprop:Generator_ColumnVarNameInTable="columntitle" msprop:Generator_ColumnPropNameInRow="title" msprop:Generator_ColumnPropNameInTable="titleColumn" msprop:Generator_UserColumnName="title" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="255" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="place" msprop:Generator_ColumnPropNameInTable="placeColumn" msprop:Generator_ColumnPropNameInRow="place" msprop:Generator_UserColumnName="place" msprop:Generator_ColumnVarNameInTable="columnplace" minOccurs="0">
|
||||
<xs:element name="place" msprop:Generator_ColumnVarNameInTable="columnplace" msprop:Generator_ColumnPropNameInRow="place" msprop:Generator_ColumnPropNameInTable="placeColumn" msprop:Generator_UserColumnName="place" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="50" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="contents" msprop:Generator_ColumnPropNameInTable="contentsColumn" msprop:Generator_ColumnPropNameInRow="contents" msprop:Generator_UserColumnName="contents" msprop:Generator_ColumnVarNameInTable="columncontents" minOccurs="0">
|
||||
<xs:element name="contents" msprop:Generator_ColumnVarNameInTable="columncontents" msprop:Generator_ColumnPropNameInRow="contents" msprop:Generator_ColumnPropNameInTable="contentsColumn" msprop:Generator_UserColumnName="contents" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="2147483647" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="project" msprop:Generator_ColumnPropNameInTable="projectColumn" msprop:Generator_ColumnPropNameInRow="project" msprop:Generator_UserColumnName="project" msprop:Generator_ColumnVarNameInTable="columnproject" type="xs:int" minOccurs="0" />
|
||||
<xs:element name="main" msprop:Generator_ColumnPropNameInTable="mainColumn" msprop:Generator_ColumnPropNameInRow="main" msprop:Generator_UserColumnName="main" msprop:Generator_ColumnVarNameInTable="columnmain" minOccurs="0">
|
||||
<xs:element name="project" msprop:Generator_ColumnVarNameInTable="columnproject" msprop:Generator_ColumnPropNameInRow="project" msprop:Generator_ColumnPropNameInTable="projectColumn" msprop:Generator_UserColumnName="project" type="xs:int" minOccurs="0" />
|
||||
<xs:element name="main" msprop:Generator_ColumnVarNameInTable="columnmain" msprop:Generator_ColumnPropNameInRow="main" msprop:Generator_ColumnPropNameInTable="mainColumn" msprop:Generator_UserColumnName="main" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="255" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="sub" msprop:Generator_ColumnPropNameInTable="subColumn" msprop:Generator_ColumnPropNameInRow="sub" msprop:Generator_UserColumnName="sub" msprop:Generator_ColumnVarNameInTable="columnsub" minOccurs="0">
|
||||
<xs:element name="sub" msprop:Generator_ColumnVarNameInTable="columnsub" msprop:Generator_ColumnPropNameInRow="sub" msprop:Generator_ColumnPropNameInTable="subColumn" msprop:Generator_UserColumnName="sub" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="255" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="memo" msprop:Generator_ColumnPropNameInTable="memoColumn" msprop:Generator_ColumnPropNameInRow="memo" msprop:Generator_UserColumnName="memo" msprop:Generator_ColumnVarNameInTable="columnmemo" minOccurs="0">
|
||||
<xs:element name="memo" msprop:Generator_ColumnVarNameInTable="columnmemo" msprop:Generator_ColumnPropNameInRow="memo" msprop:Generator_ColumnPropNameInTable="memoColumn" msprop:Generator_UserColumnName="memo" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="2147483647" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_UserColumnName="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid">
|
||||
<xs:element name="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_UserColumnName="wuid">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_UserColumnName="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" type="xs:dateTime" />
|
||||
<xs:element name="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_UserColumnName="wdate" type="xs:dateTime" />
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="Board" msprop:Generator_RowEvHandlerName="BoardRowChangeEventHandler" msprop:Generator_RowDeletedName="BoardRowDeleted" msprop:Generator_RowDeletingName="BoardRowDeleting" msprop:Generator_RowEvArgName="BoardRowChangeEvent" msprop:Generator_TablePropName="Board" msprop:Generator_RowChangedName="BoardRowChanged" msprop:Generator_UserTableName="Board" msprop:Generator_RowChangingName="BoardRowChanging" msprop:Generator_RowClassName="BoardRow" msprop:Generator_TableClassName="BoardDataTable" msprop:Generator_TableVarName="tableBoard">
|
||||
<xs:element name="Holyday" msprop:Generator_UserTableName="Holyday" msprop:Generator_RowEvArgName="HolydayRowChangeEvent" msprop:Generator_TableVarName="tableHolyday" msprop:Generator_TablePropName="Holyday" msprop:Generator_RowDeletingName="HolydayRowDeleting" msprop:Generator_RowChangingName="HolydayRowChanging" msprop:Generator_RowDeletedName="HolydayRowDeleted" msprop:Generator_RowEvHandlerName="HolydayRowChangeEventHandler" msprop:Generator_TableClassName="HolydayDataTable" msprop:Generator_RowChangedName="HolydayRowChanged" msprop:Generator_RowClassName="HolydayRow">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_UserColumnName="idx" msprop:Generator_ColumnVarNameInTable="columnidx" type="xs:int" />
|
||||
<xs:element name="bidx" msprop:Generator_ColumnPropNameInTable="bidxColumn" msprop:Generator_ColumnPropNameInRow="bidx" msprop:Generator_UserColumnName="bidx" msprop:Generator_ColumnVarNameInTable="columnbidx" type="xs:int" minOccurs="0" />
|
||||
<xs:element name="header" msprop:Generator_ColumnPropNameInTable="headerColumn" msprop:Generator_ColumnPropNameInRow="header" msprop:Generator_UserColumnName="header" msprop:Generator_ColumnVarNameInTable="columnheader" type="xs:boolean" minOccurs="0" />
|
||||
<xs:element name="cate" msprop:Generator_ColumnPropNameInTable="cateColumn" msprop:Generator_ColumnPropNameInRow="cate" msprop:Generator_UserColumnName="cate" msprop:Generator_ColumnVarNameInTable="columncate" minOccurs="0">
|
||||
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnVarNameInTable="columnidx" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_UserColumnName="idx" type="xs:int" />
|
||||
<xs:element name="cate" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="cate" msprop:Generator_ColumnVarNameInTable="columncate" msprop:Generator_ColumnPropNameInTable="cateColumn" msprop:Generator_UserColumnName="cate" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="2" />
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="title" msprop:Generator_ColumnPropNameInTable="titleColumn" msprop:Generator_ColumnPropNameInRow="title" msprop:Generator_UserColumnName="title" msprop:Generator_ColumnVarNameInTable="columntitle" minOccurs="0">
|
||||
<xs:element name="result" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="result" msprop:Generator_ColumnVarNameInTable="columnresult" msprop:Generator_ColumnPropNameInTable="resultColumn" msprop:Generator_UserColumnName="result" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="sdate" msprop:Generator_ColumnVarNameInTable="columnsdate" msprop:Generator_ColumnPropNameInRow="sdate" msprop:Generator_ColumnPropNameInTable="sdateColumn" msprop:Generator_UserColumnName="sdate" type="xs:dateTime" minOccurs="0" />
|
||||
<xs:element name="edate" msprop:Generator_ColumnVarNameInTable="columnedate" msprop:Generator_ColumnPropNameInRow="edate" msprop:Generator_ColumnPropNameInTable="edateColumn" msprop:Generator_UserColumnName="edate" type="xs:dateTime" minOccurs="0" />
|
||||
<xs:element name="term" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="term" msprop:Generator_ColumnVarNameInTable="columnterm" msprop:Generator_ColumnPropNameInTable="termColumn" msprop:Generator_UserColumnName="term" type="xs:double" minOccurs="0" />
|
||||
<xs:element name="title" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="title" msprop:Generator_ColumnVarNameInTable="columntitle" msprop:Generator_ColumnPropNameInTable="titleColumn" msprop:Generator_UserColumnName="title" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="255" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="contents" msprop:Generator_ColumnPropNameInTable="contentsColumn" msprop:Generator_ColumnPropNameInRow="contents" msprop:Generator_UserColumnName="contents" msprop:Generator_ColumnVarNameInTable="columncontents" minOccurs="0">
|
||||
<xs:element name="contents" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="contents" msprop:Generator_ColumnVarNameInTable="columncontents" msprop:Generator_ColumnPropNameInTable="contentsColumn" msprop:Generator_UserColumnName="contents" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="2147483647" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="file" msprop:Generator_ColumnPropNameInTable="fileColumn" msprop:Generator_ColumnPropNameInRow="file" msprop:Generator_UserColumnName="file" msprop:Generator_ColumnVarNameInTable="columnfile" minOccurs="0">
|
||||
<xs:element name="uid" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="uid" msprop:Generator_ColumnVarNameInTable="columnuid" msprop:Generator_ColumnPropNameInTable="uidColumn" msprop:Generator_UserColumnName="uid" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="tolist" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="tolist" msprop:Generator_ColumnVarNameInTable="columntolist" msprop:Generator_ColumnPropNameInTable="tolistColumn" msprop:Generator_UserColumnName="tolist" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="2147483647" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="mail" msprop:nullValue="false" msprop:Generator_ColumnPropNameInRow="mail" msprop:Generator_ColumnVarNameInTable="columnmail" msprop:Generator_ColumnPropNameInTable="mailColumn" msprop:Generator_UserColumnName="mail" type="xs:boolean" minOccurs="0" />
|
||||
<xs:element name="mailsend" msprop:nullValue="false" msprop:Generator_ColumnPropNameInRow="mailsend" msprop:Generator_ColumnVarNameInTable="columnmailsend" msprop:Generator_ColumnPropNameInTable="mailsendColumn" msprop:Generator_UserColumnName="mailsend" type="xs:boolean" minOccurs="0" />
|
||||
<xs:element name="reason" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="reason" msprop:Generator_ColumnVarNameInTable="columnreason" msprop:Generator_ColumnPropNameInTable="reasonColumn" msprop:Generator_UserColumnName="reason" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="2147483647" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_UserColumnName="wuid">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_UserColumnName="wdate" type="xs:dateTime" />
|
||||
<xs:element name="termDr" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="termDr" msprop:Generator_ColumnVarNameInTable="columntermDr" msprop:Generator_ColumnPropNameInTable="termDrColumn" msprop:Generator_UserColumnName="termDr" type="xs:double" minOccurs="0" />
|
||||
<xs:element name="gcode" msprop:Generator_ColumnVarNameInTable="columngcode" msprop:Generator_ColumnPropNameInRow="gcode" msprop:Generator_ColumnPropNameInTable="gcodeColumn" msprop:Generator_UserColumnName="gcode">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="DrTime" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="DrTime" msprop:Generator_ColumnVarNameInTable="columnDrTime" msprop:Generator_ColumnPropNameInTable="DrTimeColumn" msprop:Generator_UserColumnName="DrTime" type="xs:double" minOccurs="0" />
|
||||
<xs:element name="CrTime" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="CrTime" msprop:Generator_ColumnVarNameInTable="columnCrTime" msprop:Generator_ColumnPropNameInTable="CrTimeColumn" msprop:Generator_UserColumnName="CrTime" type="xs:double" minOccurs="0" />
|
||||
<xs:element name="UserName" msdata:ReadOnly="true" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="UserName" msprop:Generator_ColumnVarNameInTable="columnUserName" msprop:Generator_ColumnPropNameInTable="UserNameColumn" msprop:Generator_UserColumnName="UserName" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="200" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="guid" msprop:Generator_ColumnPropNameInTable="guidColumn" msprop:Generator_ColumnPropNameInRow="guid" msprop:Generator_UserColumnName="guid" msprop:Generator_ColumnVarNameInTable="columnguid" minOccurs="0">
|
||||
<xs:element name="tag" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="tag" msprop:Generator_ColumnVarNameInTable="columntag" msprop:Generator_ColumnPropNameInTable="tagColumn" msprop:Generator_UserColumnName="tag" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="50" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_UserColumnName="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid">
|
||||
<xs:element name="extcate" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="extcate" msprop:Generator_ColumnVarNameInTable="columnextcate" msprop:Generator_ColumnPropNameInTable="extcateColumn" msprop:Generator_UserColumnName="extcate" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_UserColumnName="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" type="xs:dateTime" />
|
||||
<xs:element name="extidx" msprop:nullValue="-1" msprop:Generator_ColumnPropNameInRow="extidx" msprop:Generator_ColumnVarNameInTable="columnextidx" msprop:Generator_ColumnPropNameInTable="extidxColumn" msprop:Generator_UserColumnName="extidx" type="xs:int" minOccurs="0" />
|
||||
<xs:element name="lock" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="_lock" msprop:Generator_ColumnVarNameInTable="columnlock" msprop:Generator_ColumnPropNameInTable="lockColumn" msprop:Generator_UserColumnName="lock" type="xs:boolean" minOccurs="0" />
|
||||
<xs:element name="iwol" msprop:Generator_ColumnVarNameInTable="columniwol" msprop:Generator_ColumnPropNameInRow="iwol" msprop:Generator_ColumnPropNameInTable="iwolColumn" msprop:Generator_UserColumnName="iwol" type="xs:boolean" minOccurs="0" />
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="Holyday" msprop:Generator_RowEvHandlerName="HolydayRowChangeEventHandler" msprop:Generator_RowDeletedName="HolydayRowDeleted" msprop:Generator_RowDeletingName="HolydayRowDeleting" msprop:Generator_RowEvArgName="HolydayRowChangeEvent" msprop:Generator_TablePropName="Holyday" msprop:Generator_RowChangedName="HolydayRowChanged" msprop:Generator_UserTableName="Holyday" msprop:Generator_RowChangingName="HolydayRowChanging" msprop:Generator_RowClassName="HolydayRow" msprop:Generator_TableClassName="HolydayDataTable" msprop:Generator_TableVarName="tableHolyday">
|
||||
<xs:element name="vHoliday_uselist" msprop:Generator_UserTableName="vHoliday_uselist" msprop:Generator_RowEvArgName="vHoliday_uselistRowChangeEvent" msprop:Generator_TableVarName="tablevHoliday_uselist" msprop:Generator_TablePropName="vHoliday_uselist" msprop:Generator_RowDeletingName="vHoliday_uselistRowDeleting" msprop:Generator_RowChangingName="vHoliday_uselistRowChanging" msprop:Generator_RowDeletedName="vHoliday_uselistRowDeleted" msprop:Generator_RowEvHandlerName="vHoliday_uselistRowChangeEventHandler" msprop:Generator_TableClassName="vHoliday_uselistDataTable" msprop:Generator_RowChangedName="vHoliday_uselistRowChanged" msprop:Generator_RowClassName="vHoliday_uselistRow">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_UserColumnName="idx" msprop:Generator_ColumnVarNameInTable="columnidx" type="xs:int" />
|
||||
<xs:element name="cate" msprop:Generator_ColumnPropNameInTable="cateColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="cate" msprop:Generator_UserColumnName="cate" msprop:Generator_ColumnVarNameInTable="columncate" minOccurs="0">
|
||||
<xs:element name="idx" msprop:Generator_ColumnVarNameInTable="columnidx" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_UserColumnName="idx" type="xs:int" />
|
||||
<xs:element name="gcode" msprop:Generator_ColumnVarNameInTable="columngcode" msprop:Generator_ColumnPropNameInRow="gcode" msprop:Generator_ColumnPropNameInTable="gcodeColumn" msprop:Generator_UserColumnName="gcode">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="uid" msprop:Generator_ColumnVarNameInTable="columnuid" msprop:Generator_ColumnPropNameInRow="uid" msprop:Generator_ColumnPropNameInTable="uidColumn" msprop:Generator_UserColumnName="uid" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="result" msprop:Generator_ColumnPropNameInTable="resultColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="result" msprop:Generator_UserColumnName="result" msprop:Generator_ColumnVarNameInTable="columnresult" minOccurs="0">
|
||||
<xs:element name="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_UserColumnName="wuid">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="sdate" msprop:Generator_ColumnPropNameInTable="sdateColumn" msprop:Generator_ColumnPropNameInRow="sdate" msprop:Generator_UserColumnName="sdate" msprop:Generator_ColumnVarNameInTable="columnsdate" type="xs:dateTime" minOccurs="0" />
|
||||
<xs:element name="edate" msprop:Generator_ColumnPropNameInTable="edateColumn" msprop:Generator_ColumnPropNameInRow="edate" msprop:Generator_UserColumnName="edate" msprop:Generator_ColumnVarNameInTable="columnedate" type="xs:dateTime" minOccurs="0" />
|
||||
<xs:element name="term" msprop:Generator_ColumnPropNameInTable="termColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="term" msprop:Generator_UserColumnName="term" msprop:Generator_ColumnVarNameInTable="columnterm" type="xs:double" minOccurs="0" />
|
||||
<xs:element name="title" msprop:Generator_ColumnPropNameInTable="titleColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="title" msprop:Generator_UserColumnName="title" msprop:Generator_ColumnVarNameInTable="columntitle" minOccurs="0">
|
||||
<xs:element name="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_UserColumnName="wdate" type="xs:dateTime" />
|
||||
<xs:element name="pdate" msprop:Generator_ColumnVarNameInTable="columnpdate" msprop:Generator_ColumnPropNameInRow="pdate" msprop:Generator_ColumnPropNameInTable="pdateColumn" msprop:Generator_UserColumnName="pdate" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="termdr" msdata:ReadOnly="true" msprop:Generator_ColumnVarNameInTable="columntermdr" msprop:Generator_ColumnPropNameInRow="termdr" msprop:Generator_ColumnPropNameInTable="termdrColumn" msprop:Generator_UserColumnName="termdr" type="xs:int" minOccurs="0" />
|
||||
<xs:element name="description" msprop:Generator_ColumnVarNameInTable="columndescription" msprop:Generator_ColumnPropNameInRow="description" msprop:Generator_ColumnPropNameInTable="descriptionColumn" msprop:Generator_UserColumnName="description" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="2147483647" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="term" msdata:ReadOnly="true" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="term" msprop:Generator_ColumnVarNameInTable="columnterm" msprop:Generator_ColumnPropNameInTable="termColumn" msprop:Generator_UserColumnName="term" type="xs:int" minOccurs="0" />
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="WorkTableGrp" msprop:Generator_UserTableName="WorkTableGrp" msprop:Generator_RowEvArgName="WorkTableGrpRowChangeEvent" msprop:Generator_TableVarName="tableWorkTableGrp" msprop:Generator_TablePropName="WorkTableGrp" msprop:Generator_RowDeletingName="WorkTableGrpRowDeleting" msprop:Generator_RowChangingName="WorkTableGrpRowChanging" msprop:Generator_RowDeletedName="WorkTableGrpRowDeleted" msprop:Generator_RowEvHandlerName="WorkTableGrpRowChangeEventHandler" msprop:Generator_TableClassName="WorkTableGrpDataTable" msprop:Generator_RowChangedName="WorkTableGrpRowChanged" msprop:Generator_RowClassName="WorkTableGrpRow">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="grp" msprop:Generator_ColumnVarNameInTable="columngrp" msprop:Generator_ColumnPropNameInRow="grp" msprop:Generator_ColumnPropNameInTable="grpColumn" msprop:Generator_UserColumnName="grp">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="100" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="EETGW_WorkTableUser" msprop:Generator_UserTableName="EETGW_WorkTableUser" msprop:Generator_RowEvArgName="EETGW_WorkTableUserRowChangeEvent" msprop:Generator_TableVarName="tableEETGW_WorkTableUser" msprop:Generator_TablePropName="EETGW_WorkTableUser" msprop:Generator_RowDeletingName="EETGW_WorkTableUserRowDeleting" msprop:Generator_RowChangingName="EETGW_WorkTableUserRowChanging" msprop:Generator_RowDeletedName="EETGW_WorkTableUserRowDeleted" msprop:Generator_RowEvHandlerName="EETGW_WorkTableUserRowChangeEventHandler" msprop:Generator_TableClassName="EETGW_WorkTableUserDataTable" msprop:Generator_RowChangedName="EETGW_WorkTableUserRowChanged" msprop:Generator_RowClassName="EETGW_WorkTableUserRow">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnVarNameInTable="columnidx" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_UserColumnName="idx" type="xs:int" />
|
||||
<xs:element name="gcode" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="gcode" msprop:Generator_ColumnVarNameInTable="columngcode" msprop:Generator_ColumnPropNameInTable="gcodeColumn" msprop:Generator_UserColumnName="gcode">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="grp" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="grp" msprop:Generator_ColumnVarNameInTable="columngrp" msprop:Generator_ColumnPropNameInTable="grpColumn" msprop:Generator_UserColumnName="grp" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="100" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="seq" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="seq" msprop:Generator_ColumnVarNameInTable="columnseq" msprop:Generator_ColumnPropNameInTable="seqColumn" msprop:Generator_UserColumnName="seq" type="xs:int" minOccurs="0" />
|
||||
<xs:element name="grade" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="grade" msprop:Generator_ColumnVarNameInTable="columngrade" msprop:Generator_ColumnPropNameInTable="gradeColumn" msprop:Generator_UserColumnName="grade" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="100" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="empno" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="empno" msprop:Generator_ColumnVarNameInTable="columnempno" msprop:Generator_ColumnPropNameInTable="empnoColumn" msprop:Generator_UserColumnName="empno" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="name" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="name" msprop:Generator_ColumnVarNameInTable="columnname" msprop:Generator_ColumnPropNameInTable="nameColumn" msprop:Generator_UserColumnName="name" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="100" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_UserColumnName="wuid">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_UserColumnName="wdate" type="xs:dateTime" />
|
||||
<xs:element name="indate" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="indate" msprop:Generator_ColumnVarNameInTable="columnindate" msprop:Generator_ColumnPropNameInTable="indateColumn" msprop:Generator_UserColumnName="indate" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="email" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="email" msprop:Generator_ColumnVarNameInTable="columnemail" msprop:Generator_ColumnPropNameInTable="emailColumn" msprop:Generator_UserColumnName="email" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="50" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="vJobReportForUser" msprop:Generator_UserTableName="vJobReportForUser" msprop:Generator_RowEvArgName="vJobReportForUserRowChangeEvent" msprop:Generator_TableVarName="tablevJobReportForUser" msprop:Generator_TablePropName="vJobReportForUser" msprop:Generator_RowDeletingName="vJobReportForUserRowDeleting" msprop:Generator_RowChangingName="vJobReportForUserRowChanging" msprop:Generator_RowDeletedName="vJobReportForUserRowDeleted" msprop:Generator_RowEvHandlerName="vJobReportForUserRowChangeEventHandler" msprop:Generator_TableClassName="vJobReportForUserDataTable" msprop:Generator_RowChangedName="vJobReportForUserRowChanged" msprop:Generator_RowClassName="vJobReportForUserRow">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="idx" msprop:Generator_ColumnVarNameInTable="columnidx" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_UserColumnName="idx" type="xs:int" />
|
||||
<xs:element name="pdate" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="pdate" msprop:Generator_ColumnVarNameInTable="columnpdate" msprop:Generator_ColumnPropNameInTable="pdateColumn" msprop:Generator_UserColumnName="pdate" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="gcode" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="gcode" msprop:Generator_ColumnVarNameInTable="columngcode" msprop:Generator_ColumnPropNameInTable="gcodeColumn" msprop:Generator_UserColumnName="gcode">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="id" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="id" msprop:Generator_ColumnVarNameInTable="columnid" msprop:Generator_ColumnPropNameInTable="idColumn" msprop:Generator_UserColumnName="id" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="name" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="name" msprop:Generator_ColumnVarNameInTable="columnname" msprop:Generator_ColumnPropNameInTable="nameColumn" msprop:Generator_UserColumnName="name" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="100" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="process" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="process" msprop:Generator_ColumnVarNameInTable="columnprocess" msprop:Generator_ColumnPropNameInTable="processColumn" msprop:Generator_UserColumnName="process" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="50" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="type" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="type" msprop:Generator_ColumnVarNameInTable="columntype" msprop:Generator_ColumnPropNameInTable="typeColumn" msprop:Generator_UserColumnName="type" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="50" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="svalue" msdata:ReadOnly="true" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="svalue" msprop:Generator_ColumnVarNameInTable="columnsvalue" msprop:Generator_ColumnPropNameInTable="svalueColumn" msprop:Generator_UserColumnName="svalue" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="255" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="contents" msprop:Generator_ColumnPropNameInTable="contentsColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="contents" msprop:Generator_UserColumnName="contents" msprop:Generator_ColumnVarNameInTable="columncontents" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="2147483647" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="uid" msprop:Generator_ColumnPropNameInTable="uidColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="uid" msprop:Generator_UserColumnName="uid" msprop:Generator_ColumnVarNameInTable="columnuid" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="tolist" msprop:Generator_ColumnPropNameInTable="tolistColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="tolist" msprop:Generator_UserColumnName="tolist" msprop:Generator_ColumnVarNameInTable="columntolist" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="2147483647" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="mail" msprop:Generator_ColumnPropNameInTable="mailColumn" msprop:nullValue="false" msprop:Generator_ColumnPropNameInRow="mail" msprop:Generator_UserColumnName="mail" msprop:Generator_ColumnVarNameInTable="columnmail" type="xs:boolean" minOccurs="0" />
|
||||
<xs:element name="mailsend" msprop:Generator_ColumnPropNameInTable="mailsendColumn" msprop:nullValue="false" msprop:Generator_ColumnPropNameInRow="mailsend" msprop:Generator_UserColumnName="mailsend" msprop:Generator_ColumnVarNameInTable="columnmailsend" type="xs:boolean" minOccurs="0" />
|
||||
<xs:element name="reason" msprop:Generator_ColumnPropNameInTable="reasonColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="reason" msprop:Generator_UserColumnName="reason" msprop:Generator_ColumnVarNameInTable="columnreason" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="2147483647" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_UserColumnName="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_UserColumnName="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" type="xs:dateTime" />
|
||||
<xs:element name="termDr" msprop:Generator_ColumnPropNameInTable="termDrColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="termDr" msprop:Generator_UserColumnName="termDr" msprop:Generator_ColumnVarNameInTable="columntermDr" type="xs:double" minOccurs="0" />
|
||||
<xs:element name="gcode" msprop:Generator_ColumnPropNameInTable="gcodeColumn" msprop:Generator_ColumnPropNameInRow="gcode" msprop:Generator_UserColumnName="gcode" msprop:Generator_ColumnVarNameInTable="columngcode">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="DrTime" msprop:Generator_ColumnPropNameInTable="DrTimeColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="DrTime" msprop:Generator_UserColumnName="DrTime" msprop:Generator_ColumnVarNameInTable="columnDrTime" type="xs:double" minOccurs="0" />
|
||||
<xs:element name="CrTime" msprop:Generator_ColumnPropNameInTable="CrTimeColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="CrTime" msprop:Generator_UserColumnName="CrTime" msprop:Generator_ColumnVarNameInTable="columnCrTime" type="xs:double" minOccurs="0" />
|
||||
<xs:element name="UserName" msdata:ReadOnly="true" msprop:Generator_ColumnPropNameInTable="UserNameColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="UserName" msprop:Generator_UserColumnName="UserName" msprop:Generator_ColumnVarNameInTable="columnUserName" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="200" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="tag" msprop:Generator_ColumnPropNameInTable="tagColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="tag" msprop:Generator_UserColumnName="tag" msprop:Generator_ColumnVarNameInTable="columntag" minOccurs="0">
|
||||
<xs:element name="hrs" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="hrs" msprop:Generator_ColumnVarNameInTable="columnhrs" msprop:Generator_ColumnPropNameInTable="hrsColumn" msprop:Generator_UserColumnName="hrs" type="xs:double" minOccurs="0" />
|
||||
<xs:element name="ot" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="ot" msprop:Generator_ColumnVarNameInTable="columnot" msprop:Generator_ColumnPropNameInTable="otColumn" msprop:Generator_UserColumnName="ot" type="xs:double" minOccurs="0" />
|
||||
<xs:element name="requestpart" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="requestpart" msprop:Generator_ColumnVarNameInTable="columnrequestpart" msprop:Generator_ColumnPropNameInTable="requestpartColumn" msprop:Generator_UserColumnName="requestpart" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="50" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="extcate" msprop:Generator_ColumnPropNameInTable="extcateColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="extcate" msprop:Generator_UserColumnName="extcate" msprop:Generator_ColumnVarNameInTable="columnextcate" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="extidx" msprop:Generator_ColumnPropNameInTable="extidxColumn" msprop:nullValue="-1" msprop:Generator_ColumnPropNameInRow="extidx" msprop:Generator_UserColumnName="extidx" msprop:Generator_ColumnVarNameInTable="columnextidx" type="xs:int" minOccurs="0" />
|
||||
<xs:element name="lock" msprop:Generator_ColumnPropNameInTable="lockColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="_lock" msprop:Generator_UserColumnName="lock" msprop:Generator_ColumnVarNameInTable="columnlock" type="xs:boolean" minOccurs="0" />
|
||||
<xs:element name="iwol" msprop:Generator_UserColumnName="iwol" msprop:Generator_ColumnPropNameInTable="iwolColumn" msprop:Generator_ColumnPropNameInRow="iwol" msprop:Generator_ColumnVarNameInTable="columniwol" type="xs:boolean" minOccurs="0" />
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="vHoliday_uselist" msprop:Generator_RowEvHandlerName="vHoliday_uselistRowChangeEventHandler" msprop:Generator_RowDeletedName="vHoliday_uselistRowDeleted" msprop:Generator_RowDeletingName="vHoliday_uselistRowDeleting" msprop:Generator_RowEvArgName="vHoliday_uselistRowChangeEvent" msprop:Generator_TablePropName="vHoliday_uselist" msprop:Generator_RowChangedName="vHoliday_uselistRowChanged" msprop:Generator_UserTableName="vHoliday_uselist" msprop:Generator_RowChangingName="vHoliday_uselistRowChanging" msprop:Generator_RowClassName="vHoliday_uselistRow" msprop:Generator_TableClassName="vHoliday_uselistDataTable" msprop:Generator_TableVarName="tablevHoliday_uselist">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="idx" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_UserColumnName="idx" msprop:Generator_ColumnVarNameInTable="columnidx" type="xs:int" />
|
||||
<xs:element name="gcode" msprop:Generator_ColumnPropNameInTable="gcodeColumn" msprop:Generator_ColumnPropNameInRow="gcode" msprop:Generator_UserColumnName="gcode" msprop:Generator_ColumnVarNameInTable="columngcode">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="uid" msprop:Generator_ColumnPropNameInTable="uidColumn" msprop:Generator_ColumnPropNameInRow="uid" msprop:Generator_UserColumnName="uid" msprop:Generator_ColumnVarNameInTable="columnuid" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_UserColumnName="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_UserColumnName="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" type="xs:dateTime" />
|
||||
<xs:element name="pdate" msprop:Generator_ColumnPropNameInTable="pdateColumn" msprop:Generator_ColumnPropNameInRow="pdate" msprop:Generator_UserColumnName="pdate" msprop:Generator_ColumnVarNameInTable="columnpdate" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="termdr" msdata:ReadOnly="true" msprop:Generator_ColumnPropNameInTable="termdrColumn" msprop:Generator_ColumnPropNameInRow="termdr" msprop:Generator_UserColumnName="termdr" msprop:Generator_ColumnVarNameInTable="columntermdr" type="xs:int" minOccurs="0" />
|
||||
<xs:element name="description" msprop:Generator_ColumnPropNameInTable="descriptionColumn" msprop:Generator_ColumnPropNameInRow="description" msprop:Generator_UserColumnName="description" msprop:Generator_ColumnVarNameInTable="columndescription" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="2147483647" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="term" msdata:ReadOnly="true" msprop:Generator_ColumnPropNameInTable="termColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="term" msprop:Generator_UserColumnName="term" msprop:Generator_ColumnVarNameInTable="columnterm" type="xs:int" minOccurs="0" />
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="WorkTableGrp" msprop:Generator_RowEvHandlerName="WorkTableGrpRowChangeEventHandler" msprop:Generator_RowDeletedName="WorkTableGrpRowDeleted" msprop:Generator_RowDeletingName="WorkTableGrpRowDeleting" msprop:Generator_RowEvArgName="WorkTableGrpRowChangeEvent" msprop:Generator_TablePropName="WorkTableGrp" msprop:Generator_RowChangedName="WorkTableGrpRowChanged" msprop:Generator_UserTableName="WorkTableGrp" msprop:Generator_RowChangingName="WorkTableGrpRowChanging" msprop:Generator_RowClassName="WorkTableGrpRow" msprop:Generator_TableClassName="WorkTableGrpDataTable" msprop:Generator_TableVarName="tableWorkTableGrp">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="grp" msprop:Generator_ColumnPropNameInTable="grpColumn" msprop:Generator_ColumnPropNameInRow="grp" msprop:Generator_UserColumnName="grp" msprop:Generator_ColumnVarNameInTable="columngrp">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="100" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="EETGW_WorkTableUser" msprop:Generator_RowEvHandlerName="EETGW_WorkTableUserRowChangeEventHandler" msprop:Generator_RowDeletedName="EETGW_WorkTableUserRowDeleted" msprop:Generator_RowDeletingName="EETGW_WorkTableUserRowDeleting" msprop:Generator_RowEvArgName="EETGW_WorkTableUserRowChangeEvent" msprop:Generator_TablePropName="EETGW_WorkTableUser" msprop:Generator_RowChangedName="EETGW_WorkTableUserRowChanged" msprop:Generator_UserTableName="EETGW_WorkTableUser" msprop:Generator_RowChangingName="EETGW_WorkTableUserRowChanging" msprop:Generator_RowClassName="EETGW_WorkTableUserRow" msprop:Generator_TableClassName="EETGW_WorkTableUserDataTable" msprop:Generator_TableVarName="tableEETGW_WorkTableUser">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_UserColumnName="idx" msprop:Generator_ColumnVarNameInTable="columnidx" type="xs:int" />
|
||||
<xs:element name="gcode" msprop:Generator_ColumnPropNameInTable="gcodeColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="gcode" msprop:Generator_UserColumnName="gcode" msprop:Generator_ColumnVarNameInTable="columngcode">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="grp" msprop:Generator_ColumnPropNameInTable="grpColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="grp" msprop:Generator_UserColumnName="grp" msprop:Generator_ColumnVarNameInTable="columngrp" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="100" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="seq" msprop:Generator_ColumnPropNameInTable="seqColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="seq" msprop:Generator_UserColumnName="seq" msprop:Generator_ColumnVarNameInTable="columnseq" type="xs:int" minOccurs="0" />
|
||||
<xs:element name="grade" msprop:Generator_ColumnPropNameInTable="gradeColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="grade" msprop:Generator_UserColumnName="grade" msprop:Generator_ColumnVarNameInTable="columngrade" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="100" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="empno" msprop:Generator_ColumnPropNameInTable="empnoColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="empno" msprop:Generator_UserColumnName="empno" msprop:Generator_ColumnVarNameInTable="columnempno" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="name" msprop:Generator_ColumnPropNameInTable="nameColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="name" msprop:Generator_UserColumnName="name" msprop:Generator_ColumnVarNameInTable="columnname" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="100" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_UserColumnName="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_UserColumnName="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" type="xs:dateTime" />
|
||||
<xs:element name="indate" msprop:Generator_ColumnPropNameInTable="indateColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="indate" msprop:Generator_UserColumnName="indate" msprop:Generator_ColumnVarNameInTable="columnindate" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="email" msprop:Generator_ColumnPropNameInTable="emailColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="email" msprop:Generator_UserColumnName="email" msprop:Generator_ColumnVarNameInTable="columnemail" minOccurs="0">
|
||||
<xs:element name="package" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="package" msprop:Generator_ColumnVarNameInTable="columnpackage" msprop:Generator_ColumnPropNameInTable="packageColumn" msprop:Generator_UserColumnName="package" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="50" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="vJobReportForUser" msprop:Generator_RowEvHandlerName="vJobReportForUserRowChangeEventHandler" msprop:Generator_RowDeletedName="vJobReportForUserRowDeleted" msprop:Generator_RowDeletingName="vJobReportForUserRowDeleting" msprop:Generator_RowEvArgName="vJobReportForUserRowChangeEvent" msprop:Generator_TablePropName="vJobReportForUser" msprop:Generator_RowChangedName="vJobReportForUserRowChanged" msprop:Generator_UserTableName="vJobReportForUser" msprop:Generator_RowChangingName="vJobReportForUserRowChanging" msprop:Generator_RowClassName="vJobReportForUserRow" msprop:Generator_TableClassName="vJobReportForUserDataTable" msprop:Generator_TableVarName="tablevJobReportForUser">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="idx" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_UserColumnName="idx" msprop:Generator_ColumnVarNameInTable="columnidx" type="xs:int" />
|
||||
<xs:element name="pdate" msprop:Generator_ColumnPropNameInTable="pdateColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="pdate" msprop:Generator_UserColumnName="pdate" msprop:Generator_ColumnVarNameInTable="columnpdate" minOccurs="0">
|
||||
<xs:element name="userProcess" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="userProcess" msprop:Generator_ColumnVarNameInTable="columnuserProcess" msprop:Generator_ColumnPropNameInTable="userProcessColumn" msprop:Generator_UserColumnName="userProcess" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
<xs:maxLength value="50" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="gcode" msprop:Generator_ColumnPropNameInTable="gcodeColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="gcode" msprop:Generator_UserColumnName="gcode" msprop:Generator_ColumnVarNameInTable="columngcode">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="id" msprop:Generator_ColumnPropNameInTable="idColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="id" msprop:Generator_UserColumnName="id" msprop:Generator_ColumnVarNameInTable="columnid" minOccurs="0">
|
||||
<xs:element name="status" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="status" msprop:Generator_ColumnVarNameInTable="columnstatus" msprop:Generator_ColumnPropNameInTable="statusColumn" msprop:Generator_UserColumnName="status" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="name" msprop:Generator_ColumnPropNameInTable="nameColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="name" msprop:Generator_UserColumnName="name" msprop:Generator_ColumnVarNameInTable="columnname" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="100" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="process" msprop:Generator_ColumnPropNameInTable="processColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="process" msprop:Generator_UserColumnName="process" msprop:Generator_ColumnVarNameInTable="columnprocess" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="50" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="type" msprop:Generator_ColumnPropNameInTable="typeColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="type" msprop:Generator_UserColumnName="type" msprop:Generator_ColumnVarNameInTable="columntype" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="50" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="svalue" msdata:ReadOnly="true" msprop:Generator_ColumnPropNameInTable="svalueColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="svalue" msprop:Generator_UserColumnName="svalue" msprop:Generator_ColumnVarNameInTable="columnsvalue" minOccurs="0">
|
||||
<xs:element name="projectName" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="projectName" msprop:Generator_ColumnVarNameInTable="columnprojectName" msprop:Generator_ColumnPropNameInTable="projectNameColumn" msprop:Generator_UserColumnName="projectName" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="255" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="hrs" msprop:Generator_ColumnPropNameInTable="hrsColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="hrs" msprop:Generator_UserColumnName="hrs" msprop:Generator_ColumnVarNameInTable="columnhrs" type="xs:double" minOccurs="0" />
|
||||
<xs:element name="ot" msprop:Generator_ColumnPropNameInTable="otColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="ot" msprop:Generator_UserColumnName="ot" msprop:Generator_ColumnVarNameInTable="columnot" type="xs:double" minOccurs="0" />
|
||||
<xs:element name="requestpart" msprop:Generator_ColumnPropNameInTable="requestpartColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="requestpart" msprop:Generator_UserColumnName="requestpart" msprop:Generator_ColumnVarNameInTable="columnrequestpart" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="50" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="package" msprop:Generator_ColumnPropNameInTable="packageColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="package" msprop:Generator_UserColumnName="package" msprop:Generator_ColumnVarNameInTable="columnpackage" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="50" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="userProcess" msprop:Generator_ColumnPropNameInTable="userProcessColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="userProcess" msprop:Generator_UserColumnName="userProcess" msprop:Generator_ColumnVarNameInTable="columnuserProcess" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="50" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="status" msprop:Generator_ColumnPropNameInTable="statusColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="status" msprop:Generator_UserColumnName="status" msprop:Generator_ColumnVarNameInTable="columnstatus" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="projectName" msprop:Generator_ColumnPropNameInTable="projectNameColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="projectName" msprop:Generator_UserColumnName="projectName" msprop:Generator_ColumnVarNameInTable="columnprojectName" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="255" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="description" msprop:Generator_ColumnPropNameInTable="descriptionColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="description" msprop:Generator_UserColumnName="description" msprop:Generator_ColumnVarNameInTable="columndescription" minOccurs="0">
|
||||
<xs:element name="description" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="description" msprop:Generator_ColumnVarNameInTable="columndescription" msprop:Generator_ColumnPropNameInTable="descriptionColumn" msprop:Generator_UserColumnName="description" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="2147483647" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="ww" msdata:ReadOnly="true" msprop:Generator_ColumnPropNameInTable="wwColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="ww" msprop:Generator_UserColumnName="ww" msprop:Generator_ColumnVarNameInTable="columnww" minOccurs="0">
|
||||
<xs:element name="ww" msdata:ReadOnly="true" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="ww" msprop:Generator_ColumnVarNameInTable="columnww" msprop:Generator_ColumnPropNameInTable="wwColumn" msprop:Generator_UserColumnName="ww" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="6" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="otStart" msprop:Generator_ColumnPropNameInTable="otStartColumn" msprop:Generator_ColumnPropNameInRow="otStart" msprop:Generator_UserColumnName="otStart" msprop:Generator_ColumnVarNameInTable="columnotStart" type="xs:dateTime" minOccurs="0" />
|
||||
<xs:element name="otEnd" msprop:Generator_ColumnPropNameInTable="otEndColumn" msprop:Generator_ColumnPropNameInRow="otEnd" msprop:Generator_UserColumnName="otEnd" msprop:Generator_ColumnVarNameInTable="columnotEnd" type="xs:dateTime" minOccurs="0" />
|
||||
<xs:element name="ot2" msprop:Generator_ColumnPropNameInTable="ot2Column" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="ot2" msprop:Generator_UserColumnName="ot2" msprop:Generator_ColumnVarNameInTable="columnot2" type="xs:double" minOccurs="0" />
|
||||
<xs:element name="otReason" msprop:Generator_ColumnPropNameInTable="otReasonColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="otReason" msprop:Generator_UserColumnName="otReason" msprop:Generator_ColumnVarNameInTable="columnotReason" minOccurs="0">
|
||||
<xs:element name="otStart" msprop:Generator_ColumnVarNameInTable="columnotStart" msprop:Generator_ColumnPropNameInRow="otStart" msprop:Generator_ColumnPropNameInTable="otStartColumn" msprop:Generator_UserColumnName="otStart" type="xs:dateTime" minOccurs="0" />
|
||||
<xs:element name="otEnd" msprop:Generator_ColumnVarNameInTable="columnotEnd" msprop:Generator_ColumnPropNameInRow="otEnd" msprop:Generator_ColumnPropNameInTable="otEndColumn" msprop:Generator_UserColumnName="otEnd" type="xs:dateTime" minOccurs="0" />
|
||||
<xs:element name="ot2" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="ot2" msprop:Generator_ColumnVarNameInTable="columnot2" msprop:Generator_ColumnPropNameInTable="ot2Column" msprop:Generator_UserColumnName="ot2" type="xs:double" minOccurs="0" />
|
||||
<xs:element name="otReason" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="otReason" msprop:Generator_ColumnVarNameInTable="columnotReason" msprop:Generator_ColumnPropNameInTable="otReasonColumn" msprop:Generator_UserColumnName="otReason" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="255" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="grade" msprop:Generator_ColumnPropNameInTable="gradeColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="grade" msprop:Generator_UserColumnName="grade" msprop:Generator_ColumnVarNameInTable="columngrade" minOccurs="0">
|
||||
<xs:element name="grade" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="grade" msprop:Generator_ColumnVarNameInTable="columngrade" msprop:Generator_ColumnPropNameInTable="gradeColumn" msprop:Generator_UserColumnName="grade" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="indate" msprop:Generator_ColumnPropNameInTable="indateColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="indate" msprop:Generator_UserColumnName="indate" msprop:Generator_ColumnVarNameInTable="columnindate" minOccurs="0">
|
||||
<xs:element name="indate" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="indate" msprop:Generator_ColumnVarNameInTable="columnindate" msprop:Generator_ColumnPropNameInTable="indateColumn" msprop:Generator_UserColumnName="indate" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="outdate" msprop:Generator_ColumnPropNameInTable="outdateColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="outdate" msprop:Generator_UserColumnName="outdate" msprop:Generator_ColumnVarNameInTable="columnoutdate" minOccurs="0">
|
||||
<xs:element name="outdate" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="outdate" msprop:Generator_ColumnVarNameInTable="columnoutdate" msprop:Generator_ColumnPropNameInTable="outdateColumn" msprop:Generator_UserColumnName="outdate" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="otPMS" msprop:Generator_ColumnPropNameInTable="otPMSColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="otPMS" msprop:Generator_UserColumnName="otPMS" msprop:Generator_ColumnVarNameInTable="columnotPMS" type="xs:double" minOccurs="0" />
|
||||
<xs:element name="otPMS" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="otPMS" msprop:Generator_ColumnVarNameInTable="columnotPMS" msprop:Generator_ColumnPropNameInTable="otPMSColumn" msprop:Generator_UserColumnName="otPMS" type="xs:double" minOccurs="0" />
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="HolidayLIst" msprop:Generator_RowEvHandlerName="HolidayLIstRowChangeEventHandler" msprop:Generator_RowDeletedName="HolidayLIstRowDeleted" msprop:Generator_RowDeletingName="HolidayLIstRowDeleting" msprop:Generator_RowEvArgName="HolidayLIstRowChangeEvent" msprop:Generator_TablePropName="HolidayLIst" msprop:Generator_RowChangedName="HolidayLIstRowChanged" msprop:Generator_UserTableName="HolidayLIst" msprop:Generator_RowChangingName="HolidayLIstRowChanging" msprop:Generator_RowClassName="HolidayLIstRow" msprop:Generator_TableClassName="HolidayLIstDataTable" msprop:Generator_TableVarName="tableHolidayLIst">
|
||||
<xs:element name="HolidayLIst" msprop:Generator_UserTableName="HolidayLIst" msprop:Generator_RowEvArgName="HolidayLIstRowChangeEvent" msprop:Generator_TableVarName="tableHolidayLIst" msprop:Generator_TablePropName="HolidayLIst" msprop:Generator_RowDeletingName="HolidayLIstRowDeleting" msprop:Generator_RowChangingName="HolidayLIstRowChanging" msprop:Generator_RowDeletedName="HolidayLIstRowDeleted" msprop:Generator_RowEvHandlerName="HolidayLIstRowChangeEventHandler" msprop:Generator_TableClassName="HolidayLIstDataTable" msprop:Generator_RowChangedName="HolidayLIstRowChanged" msprop:Generator_RowClassName="HolidayLIstRow">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_UserColumnName="idx" msprop:Generator_ColumnVarNameInTable="columnidx" type="xs:int" />
|
||||
<xs:element name="pdate" msprop:Generator_ColumnPropNameInTable="pdateColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="pdate" msprop:Generator_UserColumnName="pdate" msprop:Generator_ColumnVarNameInTable="columnpdate" minOccurs="0">
|
||||
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnVarNameInTable="columnidx" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_UserColumnName="idx" type="xs:int" />
|
||||
<xs:element name="pdate" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="pdate" msprop:Generator_ColumnVarNameInTable="columnpdate" msprop:Generator_ColumnPropNameInTable="pdateColumn" msprop:Generator_UserColumnName="pdate" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="10" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="free" msprop:Generator_ColumnPropNameInTable="freeColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="free" msprop:Generator_UserColumnName="free" msprop:Generator_ColumnVarNameInTable="columnfree" type="xs:boolean" minOccurs="0" />
|
||||
<xs:element name="memo" msprop:Generator_ColumnPropNameInTable="memoColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="memo" msprop:Generator_UserColumnName="memo" msprop:Generator_ColumnVarNameInTable="columnmemo" minOccurs="0">
|
||||
<xs:element name="free" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="free" msprop:Generator_ColumnVarNameInTable="columnfree" msprop:Generator_ColumnPropNameInTable="freeColumn" msprop:Generator_UserColumnName="free" type="xs:boolean" minOccurs="0" />
|
||||
<xs:element name="memo" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="memo" msprop:Generator_ColumnVarNameInTable="columnmemo" msprop:Generator_ColumnPropNameInTable="memoColumn" msprop:Generator_UserColumnName="memo" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="255" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_UserColumnName="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid">
|
||||
<xs:element name="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_UserColumnName="wuid">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_UserColumnName="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" type="xs:dateTime" />
|
||||
<xs:element name="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_UserColumnName="wdate" type="xs:dateTime" />
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="HolydayUserList" msprop:Generator_RowEvHandlerName="HolydayUserListRowChangeEventHandler" msprop:Generator_RowDeletedName="HolydayUserListRowDeleted" msprop:Generator_RowDeletingName="HolydayUserListRowDeleting" msprop:Generator_RowEvArgName="HolydayUserListRowChangeEvent" msprop:Generator_TablePropName="HolydayUserList" msprop:Generator_RowChangedName="HolydayUserListRowChanged" msprop:Generator_UserTableName="HolydayUserList" msprop:Generator_RowChangingName="HolydayUserListRowChanging" msprop:Generator_RowClassName="HolydayUserListRow" msprop:Generator_TableClassName="HolydayUserListDataTable" msprop:Generator_TableVarName="tableHolydayUserList">
|
||||
<xs:element name="HolydayUserList" msprop:Generator_UserTableName="HolydayUserList" msprop:Generator_RowEvArgName="HolydayUserListRowChangeEvent" msprop:Generator_TableVarName="tableHolydayUserList" msprop:Generator_TablePropName="HolydayUserList" msprop:Generator_RowDeletingName="HolydayUserListRowDeleting" msprop:Generator_RowChangingName="HolydayUserListRowChanging" msprop:Generator_RowDeletedName="HolydayUserListRowDeleted" msprop:Generator_RowEvHandlerName="HolydayUserListRowChangeEventHandler" msprop:Generator_TableClassName="HolydayUserListDataTable" msprop:Generator_RowChangedName="HolydayUserListRowChanged" msprop:Generator_RowClassName="HolydayUserListRow">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="uid" msprop:Generator_ColumnPropNameInTable="uidColumn" msprop:Generator_ColumnPropNameInRow="uid" msprop:Generator_UserColumnName="uid" msprop:Generator_ColumnVarNameInTable="columnuid">
|
||||
<xs:element name="uid" msprop:Generator_ColumnVarNameInTable="columnuid" msprop:Generator_ColumnPropNameInRow="uid" msprop:Generator_ColumnPropNameInTable="uidColumn" msprop:Generator_UserColumnName="uid">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="20" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="UserName" msdata:ReadOnly="true" msprop:Generator_ColumnPropNameInTable="UserNameColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="UserName" msprop:Generator_UserColumnName="UserName" msprop:Generator_ColumnVarNameInTable="columnUserName" minOccurs="0">
|
||||
<xs:element name="UserName" msdata:ReadOnly="true" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="UserName" msprop:Generator_ColumnVarNameInTable="columnUserName" msprop:Generator_ColumnPropNameInTable="UserNameColumn" msprop:Generator_UserColumnName="UserName" minOccurs="0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="200" />
|
||||
@@ -1444,10 +1291,6 @@ WHERE (gcode = @gcode) AND (uid = @uid) AND (CONVERT(CHAR(10), sdate, 23) >=
|
||||
<xs:selector xpath=".//mstns:minutes" />
|
||||
<xs:field xpath="mstns:idx" />
|
||||
</xs:unique>
|
||||
<xs:unique name="Board_Constraint1" msdata:ConstraintName="Constraint1" msdata:PrimaryKey="true">
|
||||
<xs:selector xpath=".//mstns:Board" />
|
||||
<xs:field xpath="mstns:idx" />
|
||||
</xs:unique>
|
||||
<xs:unique name="Holyday_Constraint1" msdata:ConstraintName="Constraint1" msdata:PrimaryKey="true">
|
||||
<xs:selector xpath=".//mstns:Holyday" />
|
||||
<xs:field xpath="mstns:idx" />
|
||||
|
||||
@@ -4,10 +4,9 @@
|
||||
Changes to this file may cause incorrect behavior and will be lost if
|
||||
the code is regenerated.
|
||||
</autogenerated>-->
|
||||
<DiagramLayout xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ex:showrelationlabel="False" ViewPortX="114" ViewPortY="-10" xmlns:ex="urn:schemas-microsoft-com:xml-msdatasource-layout-extended" xmlns="urn:schemas-microsoft-com:xml-msdatasource-layout">
|
||||
<DiagramLayout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ex:showrelationlabel="False" ViewPortX="-10" ViewPortY="-10" xmlns:ex="urn:schemas-microsoft-com:xml-msdatasource-layout-extended" xmlns="urn:schemas-microsoft-com:xml-msdatasource-layout">
|
||||
<Shapes>
|
||||
<Shape ID="DesignTable:minutes" ZOrder="10" X="70" Y="70" Height="324" Width="192" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:Board" ZOrder="9" X="332" Y="70" Height="267" Width="179" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="216" />
|
||||
<Shape ID="DesignTable:minutes" ZOrder="9" X="70" Y="70" Height="324" Width="192" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:Holyday" ZOrder="4" X="581" Y="70" Height="537" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="410" />
|
||||
<Shape ID="DesignTable:vHoliday_uselist" ZOrder="3" X="916" Y="68" Height="248" Width="250" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="178" />
|
||||
<Shape ID="DesignTable:WorkTableGrp" ZOrder="8" X="257" Y="433" Height="133" Width="289" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="83" />
|
||||
|
||||
1
SubProject/FBS0000/fMinutes.Designer.cs
generated
1
SubProject/FBS0000/fMinutes.Designer.cs
generated
@@ -302,7 +302,6 @@
|
||||
// tam
|
||||
//
|
||||
this.tam.BackupDataSetBeforeUpdate = false;
|
||||
this.tam.BoardTableAdapter = null;
|
||||
this.tam.Connection = null;
|
||||
this.tam.HolydayTableAdapter = null;
|
||||
this.tam.minutesTableAdapter = null;
|
||||
|
||||
File diff suppressed because one or more lines are too long
415
SubProject/FCM0000/Board/fPatchList.Designer.cs
generated
415
SubProject/FCM0000/Board/fPatchList.Designer.cs
generated
@@ -1,415 +0,0 @@
|
||||
namespace FCM0000
|
||||
{
|
||||
partial class fPatchList
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new System.ComponentModel.Container();
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(fPatchList));
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
this.bn = new System.Windows.Forms.BindingNavigator(this.components);
|
||||
this.bindingNavigatorCountItem = new System.Windows.Forms.ToolStripLabel();
|
||||
this.bindingNavigatorDeleteItem = new System.Windows.Forms.ToolStripButton();
|
||||
this.bindingNavigatorMoveFirstItem = new System.Windows.Forms.ToolStripButton();
|
||||
this.bindingNavigatorMovePreviousItem = new System.Windows.Forms.ToolStripButton();
|
||||
this.bindingNavigatorSeparator = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.bindingNavigatorPositionItem = new System.Windows.Forms.ToolStripTextBox();
|
||||
this.bindingNavigatorSeparator1 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.bindingNavigatorMoveNextItem = new System.Windows.Forms.ToolStripButton();
|
||||
this.bindingNavigatorMoveLastItem = new System.Windows.Forms.ToolStripButton();
|
||||
this.bindingNavigatorSeparator2 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.bindingNavigatorAddNewItem = new System.Windows.Forms.ToolStripButton();
|
||||
this.BTsAVE = new System.Windows.Forms.ToolStripButton();
|
||||
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
|
||||
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
|
||||
this.btSearch = new System.Windows.Forms.ToolStripButton();
|
||||
this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.toolStripButton2 = new System.Windows.Forms.ToolStripButton();
|
||||
this.dv1 = new arCtl.arDatagridView();
|
||||
this.bs = new System.Windows.Forms.BindingSource(this.components);
|
||||
this.dsMSSQL = new FCM0000.dsMSSQL();
|
||||
this.tam = new FCM0000.dsMSSQLTableAdapters.TableAdapterManager();
|
||||
this.ta = new FCM0000.dsMSSQLTableAdapters.BoardTableAdapter();
|
||||
this.wdateDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.cateDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.titleDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.close = new System.Windows.Forms.DataGridViewCheckBoxColumn();
|
||||
this.wuid_name = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.urlDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
((System.ComponentModel.ISupportInitialize)(this.bn)).BeginInit();
|
||||
this.bn.SuspendLayout();
|
||||
this.toolStrip1.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dv1)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.bs)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dsMSSQL)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// bn
|
||||
//
|
||||
this.bn.AddNewItem = null;
|
||||
this.bn.BindingSource = this.bs;
|
||||
this.bn.CountItem = this.bindingNavigatorCountItem;
|
||||
this.bn.DeleteItem = this.bindingNavigatorDeleteItem;
|
||||
this.bn.Dock = System.Windows.Forms.DockStyle.Bottom;
|
||||
this.bn.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.bindingNavigatorMoveFirstItem,
|
||||
this.bindingNavigatorMovePreviousItem,
|
||||
this.bindingNavigatorSeparator,
|
||||
this.bindingNavigatorPositionItem,
|
||||
this.bindingNavigatorCountItem,
|
||||
this.bindingNavigatorSeparator1,
|
||||
this.bindingNavigatorMoveNextItem,
|
||||
this.bindingNavigatorMoveLastItem,
|
||||
this.bindingNavigatorSeparator2,
|
||||
this.bindingNavigatorAddNewItem,
|
||||
this.bindingNavigatorDeleteItem,
|
||||
this.BTsAVE});
|
||||
this.bn.Location = new System.Drawing.Point(0, 559);
|
||||
this.bn.MoveFirstItem = this.bindingNavigatorMoveFirstItem;
|
||||
this.bn.MoveLastItem = this.bindingNavigatorMoveLastItem;
|
||||
this.bn.MoveNextItem = this.bindingNavigatorMoveNextItem;
|
||||
this.bn.MovePreviousItem = this.bindingNavigatorMovePreviousItem;
|
||||
this.bn.Name = "bn";
|
||||
this.bn.PositionItem = this.bindingNavigatorPositionItem;
|
||||
this.bn.Size = new System.Drawing.Size(909, 25);
|
||||
this.bn.TabIndex = 0;
|
||||
this.bn.Text = "bindingNavigator1";
|
||||
//
|
||||
// bindingNavigatorCountItem
|
||||
//
|
||||
this.bindingNavigatorCountItem.Name = "bindingNavigatorCountItem";
|
||||
this.bindingNavigatorCountItem.Size = new System.Drawing.Size(27, 22);
|
||||
this.bindingNavigatorCountItem.Text = "/{0}";
|
||||
this.bindingNavigatorCountItem.ToolTipText = "전체 항목 수";
|
||||
//
|
||||
// bindingNavigatorDeleteItem
|
||||
//
|
||||
this.bindingNavigatorDeleteItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorDeleteItem.Image")));
|
||||
this.bindingNavigatorDeleteItem.Name = "bindingNavigatorDeleteItem";
|
||||
this.bindingNavigatorDeleteItem.RightToLeftAutoMirrorImage = true;
|
||||
this.bindingNavigatorDeleteItem.Size = new System.Drawing.Size(78, 22);
|
||||
this.bindingNavigatorDeleteItem.Text = "Delete(&D)";
|
||||
//
|
||||
// bindingNavigatorMoveFirstItem
|
||||
//
|
||||
this.bindingNavigatorMoveFirstItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||
this.bindingNavigatorMoveFirstItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveFirstItem.Image")));
|
||||
this.bindingNavigatorMoveFirstItem.Name = "bindingNavigatorMoveFirstItem";
|
||||
this.bindingNavigatorMoveFirstItem.RightToLeftAutoMirrorImage = true;
|
||||
this.bindingNavigatorMoveFirstItem.Size = new System.Drawing.Size(23, 22);
|
||||
this.bindingNavigatorMoveFirstItem.Text = "처음으로 이동";
|
||||
//
|
||||
// bindingNavigatorMovePreviousItem
|
||||
//
|
||||
this.bindingNavigatorMovePreviousItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||
this.bindingNavigatorMovePreviousItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMovePreviousItem.Image")));
|
||||
this.bindingNavigatorMovePreviousItem.Name = "bindingNavigatorMovePreviousItem";
|
||||
this.bindingNavigatorMovePreviousItem.RightToLeftAutoMirrorImage = true;
|
||||
this.bindingNavigatorMovePreviousItem.Size = new System.Drawing.Size(23, 22);
|
||||
this.bindingNavigatorMovePreviousItem.Text = "이전으로 이동";
|
||||
//
|
||||
// bindingNavigatorSeparator
|
||||
//
|
||||
this.bindingNavigatorSeparator.Name = "bindingNavigatorSeparator";
|
||||
this.bindingNavigatorSeparator.Size = new System.Drawing.Size(6, 25);
|
||||
//
|
||||
// bindingNavigatorPositionItem
|
||||
//
|
||||
this.bindingNavigatorPositionItem.AccessibleName = "위치";
|
||||
this.bindingNavigatorPositionItem.AutoSize = false;
|
||||
this.bindingNavigatorPositionItem.Name = "bindingNavigatorPositionItem";
|
||||
this.bindingNavigatorPositionItem.Size = new System.Drawing.Size(50, 23);
|
||||
this.bindingNavigatorPositionItem.Text = "0";
|
||||
this.bindingNavigatorPositionItem.ToolTipText = "현재 위치";
|
||||
//
|
||||
// bindingNavigatorSeparator1
|
||||
//
|
||||
this.bindingNavigatorSeparator1.Name = "bindingNavigatorSeparator1";
|
||||
this.bindingNavigatorSeparator1.Size = new System.Drawing.Size(6, 25);
|
||||
//
|
||||
// bindingNavigatorMoveNextItem
|
||||
//
|
||||
this.bindingNavigatorMoveNextItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||
this.bindingNavigatorMoveNextItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveNextItem.Image")));
|
||||
this.bindingNavigatorMoveNextItem.Name = "bindingNavigatorMoveNextItem";
|
||||
this.bindingNavigatorMoveNextItem.RightToLeftAutoMirrorImage = true;
|
||||
this.bindingNavigatorMoveNextItem.Size = new System.Drawing.Size(23, 22);
|
||||
this.bindingNavigatorMoveNextItem.Text = "다음으로 이동";
|
||||
//
|
||||
// bindingNavigatorMoveLastItem
|
||||
//
|
||||
this.bindingNavigatorMoveLastItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||
this.bindingNavigatorMoveLastItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveLastItem.Image")));
|
||||
this.bindingNavigatorMoveLastItem.Name = "bindingNavigatorMoveLastItem";
|
||||
this.bindingNavigatorMoveLastItem.RightToLeftAutoMirrorImage = true;
|
||||
this.bindingNavigatorMoveLastItem.Size = new System.Drawing.Size(23, 22);
|
||||
this.bindingNavigatorMoveLastItem.Text = "마지막으로 이동";
|
||||
//
|
||||
// bindingNavigatorSeparator2
|
||||
//
|
||||
this.bindingNavigatorSeparator2.Name = "bindingNavigatorSeparator2";
|
||||
this.bindingNavigatorSeparator2.Size = new System.Drawing.Size(6, 25);
|
||||
//
|
||||
// bindingNavigatorAddNewItem
|
||||
//
|
||||
this.bindingNavigatorAddNewItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorAddNewItem.Image")));
|
||||
this.bindingNavigatorAddNewItem.Name = "bindingNavigatorAddNewItem";
|
||||
this.bindingNavigatorAddNewItem.RightToLeftAutoMirrorImage = true;
|
||||
this.bindingNavigatorAddNewItem.Size = new System.Drawing.Size(65, 22);
|
||||
this.bindingNavigatorAddNewItem.Text = "Add(&A)";
|
||||
this.bindingNavigatorAddNewItem.Click += new System.EventHandler(this.bindingNavigatorAddNewItem_Click);
|
||||
//
|
||||
// BTsAVE
|
||||
//
|
||||
this.BTsAVE.Image = ((System.Drawing.Image)(resources.GetObject("BTsAVE.Image")));
|
||||
this.BTsAVE.Name = "BTsAVE";
|
||||
this.BTsAVE.Size = new System.Drawing.Size(67, 22);
|
||||
this.BTsAVE.Text = "Save(&S)";
|
||||
this.BTsAVE.Click += new System.EventHandler(this.boardBindingNavigatorSaveItem_Click);
|
||||
//
|
||||
// richTextBox1
|
||||
//
|
||||
this.richTextBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "contents", true));
|
||||
this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.richTextBox1.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
|
||||
this.richTextBox1.Location = new System.Drawing.Point(0, 295);
|
||||
this.richTextBox1.Name = "richTextBox1";
|
||||
this.richTextBox1.Size = new System.Drawing.Size(909, 264);
|
||||
this.richTextBox1.TabIndex = 3;
|
||||
this.richTextBox1.Text = "";
|
||||
//
|
||||
// toolStrip1
|
||||
//
|
||||
this.toolStrip1.ImageScalingSize = new System.Drawing.Size(30, 30);
|
||||
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.btSearch,
|
||||
this.toolStripSeparator5,
|
||||
this.toolStripButton2});
|
||||
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
|
||||
this.toolStrip1.Name = "toolStrip1";
|
||||
this.toolStrip1.Size = new System.Drawing.Size(909, 37);
|
||||
this.toolStrip1.TabIndex = 9;
|
||||
this.toolStrip1.Text = "toolStrip1";
|
||||
//
|
||||
// btSearch
|
||||
//
|
||||
this.btSearch.Image = ((System.Drawing.Image)(resources.GetObject("btSearch.Image")));
|
||||
this.btSearch.ImageTransparentColor = System.Drawing.Color.Magenta;
|
||||
this.btSearch.Name = "btSearch";
|
||||
this.btSearch.Size = new System.Drawing.Size(104, 34);
|
||||
this.btSearch.Text = "새로고침(&R)";
|
||||
this.btSearch.Click += new System.EventHandler(this.btSearch_Click_1);
|
||||
//
|
||||
// toolStripSeparator5
|
||||
//
|
||||
this.toolStripSeparator5.Name = "toolStripSeparator5";
|
||||
this.toolStripSeparator5.Size = new System.Drawing.Size(6, 37);
|
||||
//
|
||||
// toolStripButton2
|
||||
//
|
||||
this.toolStripButton2.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
|
||||
this.toolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton2.Image")));
|
||||
this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta;
|
||||
this.toolStripButton2.Name = "toolStripButton2";
|
||||
this.toolStripButton2.Size = new System.Drawing.Size(65, 34);
|
||||
this.toolStripButton2.Text = "닫기";
|
||||
this.toolStripButton2.Click += new System.EventHandler(this.toolStripButton2_Click);
|
||||
//
|
||||
// dv1
|
||||
//
|
||||
this.dv1.A_DelCurrentCell = true;
|
||||
this.dv1.A_EnterToTab = true;
|
||||
this.dv1.A_KoreanField = null;
|
||||
this.dv1.A_UpperField = null;
|
||||
this.dv1.A_ViewRownumOnHeader = true;
|
||||
this.dv1.AllowUserToAddRows = false;
|
||||
this.dv1.AutoGenerateColumns = false;
|
||||
this.dv1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
|
||||
this.dv1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
||||
this.dv1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
|
||||
this.wdateDataGridViewTextBoxColumn,
|
||||
this.cateDataGridViewTextBoxColumn,
|
||||
this.titleDataGridViewTextBoxColumn,
|
||||
this.close,
|
||||
this.wuid_name,
|
||||
this.urlDataGridViewTextBoxColumn});
|
||||
this.dv1.DataSource = this.bs;
|
||||
dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
||||
dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Window;
|
||||
dataGridViewCellStyle2.Font = new System.Drawing.Font("굴림", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
|
||||
dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText;
|
||||
dataGridViewCellStyle2.Padding = new System.Windows.Forms.Padding(3);
|
||||
dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
||||
dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
||||
dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
|
||||
this.dv1.DefaultCellStyle = dataGridViewCellStyle2;
|
||||
this.dv1.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.dv1.Location = new System.Drawing.Point(0, 37);
|
||||
this.dv1.Name = "dv1";
|
||||
this.dv1.RowTemplate.Height = 23;
|
||||
this.dv1.Size = new System.Drawing.Size(909, 258);
|
||||
this.dv1.TabIndex = 10;
|
||||
this.dv1.DataError += new System.Windows.Forms.DataGridViewDataErrorEventHandler(this.dv1_DataError);
|
||||
//
|
||||
// bs
|
||||
//
|
||||
this.bs.DataMember = "Board";
|
||||
this.bs.DataSource = this.dsMSSQL;
|
||||
this.bs.Sort = "close,WDATE DESC";
|
||||
//
|
||||
// dsMSSQL
|
||||
//
|
||||
this.dsMSSQL.DataSetName = "dsMSSQL";
|
||||
this.dsMSSQL.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
|
||||
//
|
||||
// tam
|
||||
//
|
||||
this.tam.BackupDataSetBeforeUpdate = false;
|
||||
this.tam.BoardTableAdapter = this.ta;
|
||||
this.tam.CommonTableAdapter = null;
|
||||
this.tam.CustomsTableAdapter = null;
|
||||
this.tam.EETGW_DocuFormTableAdapter = null;
|
||||
this.tam.HolidayLIstTableAdapter = null;
|
||||
this.tam.InventoryUserTableAdapter = null;
|
||||
this.tam.ItemsTableAdapter = null;
|
||||
this.tam.ProjectsTableAdapter = null;
|
||||
this.tam.PurchaseTableAdapter = null;
|
||||
this.tam.RequestItemTableAdapter = null;
|
||||
this.tam.StaffTableAdapter = null;
|
||||
this.tam.UpdateOrder = FCM0000.dsMSSQLTableAdapters.TableAdapterManager.UpdateOrderOption.InsertUpdateDelete;
|
||||
//
|
||||
// ta
|
||||
//
|
||||
this.ta.ClearBeforeFill = true;
|
||||
//
|
||||
// wdateDataGridViewTextBoxColumn
|
||||
//
|
||||
this.wdateDataGridViewTextBoxColumn.DataPropertyName = "wdate";
|
||||
dataGridViewCellStyle1.Format = "yy-MM-dd HH:mm";
|
||||
this.wdateDataGridViewTextBoxColumn.DefaultCellStyle = dataGridViewCellStyle1;
|
||||
this.wdateDataGridViewTextBoxColumn.HeaderText = "등록일";
|
||||
this.wdateDataGridViewTextBoxColumn.Name = "wdateDataGridViewTextBoxColumn";
|
||||
this.wdateDataGridViewTextBoxColumn.Width = 72;
|
||||
//
|
||||
// cateDataGridViewTextBoxColumn
|
||||
//
|
||||
this.cateDataGridViewTextBoxColumn.DataPropertyName = "cate";
|
||||
this.cateDataGridViewTextBoxColumn.HeaderText = "구분";
|
||||
this.cateDataGridViewTextBoxColumn.Name = "cateDataGridViewTextBoxColumn";
|
||||
this.cateDataGridViewTextBoxColumn.Width = 60;
|
||||
//
|
||||
// titleDataGridViewTextBoxColumn
|
||||
//
|
||||
this.titleDataGridViewTextBoxColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
|
||||
this.titleDataGridViewTextBoxColumn.DataPropertyName = "title";
|
||||
this.titleDataGridViewTextBoxColumn.HeaderText = "화면";
|
||||
this.titleDataGridViewTextBoxColumn.Name = "titleDataGridViewTextBoxColumn";
|
||||
//
|
||||
// close
|
||||
//
|
||||
this.close.DataPropertyName = "close";
|
||||
this.close.FalseValue = "0";
|
||||
this.close.HeaderText = "종료";
|
||||
this.close.IndeterminateValue = "0";
|
||||
this.close.Name = "close";
|
||||
this.close.TrueValue = "1";
|
||||
this.close.Width = 41;
|
||||
//
|
||||
// wuid_name
|
||||
//
|
||||
this.wuid_name.DataPropertyName = "wuid_name";
|
||||
this.wuid_name.HeaderText = "작성자";
|
||||
this.wuid_name.Name = "wuid_name";
|
||||
this.wuid_name.ReadOnly = true;
|
||||
this.wuid_name.Width = 72;
|
||||
//
|
||||
// urlDataGridViewTextBoxColumn
|
||||
//
|
||||
this.urlDataGridViewTextBoxColumn.DataPropertyName = "wuid";
|
||||
this.urlDataGridViewTextBoxColumn.HeaderText = "*";
|
||||
this.urlDataGridViewTextBoxColumn.Name = "urlDataGridViewTextBoxColumn";
|
||||
this.urlDataGridViewTextBoxColumn.Width = 42;
|
||||
//
|
||||
// fPatchList
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(909, 584);
|
||||
this.Controls.Add(this.richTextBox1);
|
||||
this.Controls.Add(this.dv1);
|
||||
this.Controls.Add(this.toolStrip1);
|
||||
this.Controls.Add(this.bn);
|
||||
this.Name = "fPatchList";
|
||||
this.Text = "Patch List";
|
||||
this.Load += new System.EventHandler(this.fRequestItem_Load);
|
||||
((System.ComponentModel.ISupportInitialize)(this.bn)).EndInit();
|
||||
this.bn.ResumeLayout(false);
|
||||
this.bn.PerformLayout();
|
||||
this.toolStrip1.ResumeLayout(false);
|
||||
this.toolStrip1.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dv1)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.bs)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dsMSSQL)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private dsMSSQL dsMSSQL;
|
||||
private System.Windows.Forms.BindingSource bs;
|
||||
private dsMSSQLTableAdapters.TableAdapterManager tam;
|
||||
private System.Windows.Forms.BindingNavigator bn;
|
||||
private System.Windows.Forms.ToolStripButton bindingNavigatorAddNewItem;
|
||||
private System.Windows.Forms.ToolStripLabel bindingNavigatorCountItem;
|
||||
private System.Windows.Forms.ToolStripButton bindingNavigatorDeleteItem;
|
||||
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveFirstItem;
|
||||
private System.Windows.Forms.ToolStripButton bindingNavigatorMovePreviousItem;
|
||||
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator;
|
||||
private System.Windows.Forms.ToolStripTextBox bindingNavigatorPositionItem;
|
||||
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator1;
|
||||
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveNextItem;
|
||||
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveLastItem;
|
||||
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator2;
|
||||
private System.Windows.Forms.ToolStripButton BTsAVE;
|
||||
private dsMSSQLTableAdapters.BoardTableAdapter ta;
|
||||
private System.Windows.Forms.RichTextBox richTextBox1;
|
||||
private System.Windows.Forms.ToolStrip toolStrip1;
|
||||
private System.Windows.Forms.ToolStripButton btSearch;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
|
||||
private System.Windows.Forms.ToolStripButton toolStripButton2;
|
||||
private arCtl.arDatagridView dv1;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn wdateDataGridViewTextBoxColumn;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn cateDataGridViewTextBoxColumn;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn titleDataGridViewTextBoxColumn;
|
||||
private System.Windows.Forms.DataGridViewCheckBoxColumn close;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn wuid_name;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn urlDataGridViewTextBoxColumn;
|
||||
}
|
||||
}
|
||||
@@ -1,101 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using NetOffice;
|
||||
using Outlook = NetOffice.OutlookApi;
|
||||
using NetOffice.OutlookApi.Enums;
|
||||
|
||||
namespace FCM0000
|
||||
{
|
||||
public partial class fPatchList : FCOMMON.fBase
|
||||
{
|
||||
public fPatchList()
|
||||
{
|
||||
InitializeComponent();
|
||||
Properties.Settings.Default["gwcs"] = FCOMMON.info.CS;
|
||||
this.dsMSSQL.Board.TableNewRow += RequestItem_TableNewRow;
|
||||
}
|
||||
|
||||
void RequestItem_TableNewRow(object sender, DataTableNewRowEventArgs e)
|
||||
{
|
||||
e.Row["wuid"] = FCOMMON.info.Login.no;
|
||||
e.Row["wdate"] = DateTime.Now;
|
||||
e.Row["bidx"] = 5;
|
||||
e.Row["pidx"] = -1;
|
||||
e.Row["gcode"] = FCOMMON.info.Login.gcode;
|
||||
}
|
||||
|
||||
private void fRequestItem_Load(object sender, EventArgs e)
|
||||
{
|
||||
EnsureVisibleAndUsableSize();
|
||||
if (FCOMMON.info.Login.level >= 9 || FCOMMON.info.Login.no == "395552")
|
||||
{
|
||||
bn.Enabled = true;
|
||||
BTsAVE.Enabled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
bn.Enabled = false;
|
||||
BTsAVE.Enabled = false;
|
||||
this.dv1.EditMode = DataGridViewEditMode.EditProgrammatically;
|
||||
}
|
||||
refreshData();
|
||||
}
|
||||
|
||||
private void boardBindingNavigatorSaveItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.Validate();
|
||||
this.bs.EndEdit();
|
||||
this.tam.UpdateAll(this.dsMSSQL);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void refreshData()
|
||||
{
|
||||
try
|
||||
{
|
||||
this.ta.Fill(this.dsMSSQL.Board,5, "%");
|
||||
dv1.AutoResizeColumns();
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
System.Windows.Forms.MessageBox.Show(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
private void btSearch_Click(object sender, EventArgs e)
|
||||
{
|
||||
refreshData();
|
||||
}
|
||||
|
||||
private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.bs.AddNew();
|
||||
//var newdr = this.dsMSSQL.Board.NewBoardRow();//.NewRequestItemRow();
|
||||
//fRequestItem_Add f = new fRequestItem_Add(newdr);
|
||||
//if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK) newdr.Delete();
|
||||
//else this.dsMSSQL.RequestItem.AddRequestItemRow(newdr);
|
||||
}
|
||||
|
||||
private void btSearch_Click_1(object sender, EventArgs e)
|
||||
{
|
||||
refreshData();
|
||||
}
|
||||
|
||||
private void toolStripButton2_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.Close();
|
||||
}
|
||||
|
||||
private void dv1_DataError(object sender, DataGridViewDataErrorEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,237 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="bn.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>259, 17</value>
|
||||
</metadata>
|
||||
<metadata name="bs.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>122, 17</value>
|
||||
</metadata>
|
||||
<metadata name="dsMSSQL.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="bindingNavigatorDeleteItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
wwAADsMBx2+oZAAAAW9JREFUOE+1kE0ow2Ecx3dV3krt4oJaOSCTvIRkMqSxyITIzCQHDouEdnFwIOVC
|
||||
DrhIDiQl5UTiNG/z2ppafy1S2gX/uDwfY6i1v7Hie3nqeb7fz+/7/FR/Ilwn0G0Exw4fV5GJlXlEZxXC
|
||||
rIet9bAQvB5Ymgn2sLYAvSZEux7RUQFzE4qQt4bCXAYjPaHvnDoCkLpsRGMB2JqCTGLIijDlwqQ9bEMV
|
||||
i9OIytR3EMNWcJ/BWH8A6j8/bOGFxwXNxYEvGbMQ9XnQ1/K78KfY3/VXzkMY0qFGG2H4RoLGQshJQNbG
|
||||
86CNhdrsX9a/uQZTPhQl4rMY4OLofbl3aX7I8uwPC7y/g1YdjyVJuEvT8e1tfwUYteHUxCCfHChDeHmG
|
||||
QQvokjlOU+PbWA0x3pZnILVVI3uvQyHsbiLnqnGmRCF1NYD8pDhpRxOH7HQoAKZGkFKjceszQbpSrumX
|
||||
bO+G80MFwKUTxgfgcO/b8D9IpXoFiiMDHIQm0skAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="bindingNavigatorMoveFirstItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
wwAADsMBx2+oZAAAASpJREFUOE9jGDygcNbz/00Lnv/PnPj4P1QIA4S3P8Apx5A789n/VUfe/8elKL77
|
||||
wf/ghmu4DciY8vT/wn0fsCqK73n4f+n+///9qy/gNiCh58n/aVveYyiKaL8P1pw56/9/r9ITuA2I7Hr0
|
||||
v3f1BxRFoa33wJpb1wFt7/z73yX/AG4DApsf/q+b/w6uKLjl7v9Fe///7wBqzpjz879d3c//9hnbcRvg
|
||||
UXX/f/60NyiK7Ipv/0+f8/u/f9e3/zqF7/5bJKzHbYB96d3/2ZNfYyjSTzn/36ToxX+VrE//jSOX4TbA
|
||||
Iu/O/9T+11gVGSSd+C+b9vW/bvA83AYYZt3+H9byEqci/dTL/zV8p+E2QCftxn+/6od4Fal4TMBtgFPu
|
||||
lf8gBXgVDULAwAAA8HbAq6XlmnAAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="bindingNavigatorMovePreviousItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
wwAADsMBx2+oZAAAALZJREFUOE9jGDogvP3BfyiTdBDf/eB/cMM18gyI73n4f+n+///9qy+QbkBE+32w
|
||||
5sxZ//97lZ4gzYDQ1ntgza3rgLZ3/v3vkn+AeAOCW+7+X7T3//8OoOaMOT//29X9/G+fsZ00F9gV3/6f
|
||||
Puf3f/+ub/91Ct/9t0hYT3oY6Kec/29S9OK/Stan/8aRy0g3AAQMkk78l037+l83eB55BoCAfurl/xq+
|
||||
08g3AARUPCZQZsBgBQwMANAUYJgEulBVAAAAAElFTkSuQmCC
|
||||
</value>
|
||||
</data>
|
||||
<data name="bindingNavigatorMoveNextItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
wwAADsMBx2+oZAAAAKNJREFUOE9jGHygcNbz/1AmeSB35rP/Cd33yDckY8rT//P2//6f0HWHPEMSep78
|
||||
n73v1//OrX//u5VeJt2QyK5H/6ds+/W/ZOnf/wnT//63yT1LmiGBzQ//t659D9ZsXPLlv3T0tf/GkcuI
|
||||
N8Sj6v7/krnv4JoVXXpIc4F96d3/gS3PyNMMAhZ5d/7bFFwhTzMIGGbdJl8zCOik3SBf81AEDAwAoH5f
|
||||
oAc0QjgAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="bindingNavigatorMoveLastItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
wwAADsMBx2+oZAAAASxJREFUOE9jGFygcNbz/1AmBgDJNS14/j9z4mOcahhyZz77n9B9D6sCkNyqI+//
|
||||
h7c/wG1AxpSn/+ft//0/oesOhiKQ3MJ9H/4HN1zDbUBCz5P/s/f9+t+59e9/t9LLKApBctO2vP/vX30B
|
||||
twGRXY/+T9n263/J0r//E6b//W+TexauGCTXu/rDf6/SE7gNCGx++L917XuwZuOSL/+lo6/9N45cBtYA
|
||||
kqub/+6/S/4B3AZ4VN3/XzL3HVyzoksPXDFILn/am//2GdtxG2Bfevd/YMszDM0gAJLLnvz6v0XCetwG
|
||||
WOTd+W9TcAVDMwiA5FL7X8O9hBUYZt3GqhkEQHJhLS//6wbPw22ATtoNnJIgOb/qh/81fKfhNgAfcMq9
|
||||
8l/FYwIYQ4UGBWBgAAC+0b+zuQxOnAAAAABJRU5ErkJggg==
|
||||
</value>
|
||||
</data>
|
||||
<data name="bindingNavigatorAddNewItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
wwAADsMBx2+oZAAAAUpJREFUOE9jGLzg7gL2/7fmcf6/Oofr/8UZvP+hwsSD60CNfx41/v/zsOH/yckC
|
||||
pBtwfjov3ICDPSKkG3B8kiBQc93/Pw+q/u9oFydswKWZPP/PTuX7fxKo8Ui/0P993SJAzeX//94r+r++
|
||||
Qeb/qhq5/0srFf/PL1X+P6tIFdPAU0B//nlYD9RUC8SV///cKwHivP9/72b+/3sn+f/f23H//92MAOKQ
|
||||
/5NyNDENONQrDHbu3/ulQI0FQI3ZQI2pQI0J///digZqDPv/70bQ/3/X/f53peliGrCzXeL/lmap/+vA
|
||||
zpX/v6RC8f/fWzFAjeH/p+Zp/J+QpfW/O0P3f3uq/v/mREPCYTIb6E+Qc//dCPjfk6FDWAM6APnz3w1/
|
||||
IPb735qsT7oB3em6YP+CcH2cEekGtCQZ/G+IN/xfE2v8vzLahHQD6AQYGAAkI9iedfyIaQAAAABJRU5E
|
||||
rkJggg==
|
||||
</value>
|
||||
</data>
|
||||
<data name="BTsAVE.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
wwAADsMBx2+oZAAAAExJREFUOE9joAr49u3bf1IxVCsEgAWC58Dxh/cf4RhZDETHTNiHaQgpBoAwzBCo
|
||||
dtINAGGiDUDGyGpoawAxeNSAQWkAORiqnRLAwAAA9EMMU8Daa3MAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>608, 17</value>
|
||||
</metadata>
|
||||
<data name="btSearch.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE4SURBVDhPtZPPasJAEMbzPn0FwWA92JtP4NGKB1/DP7ei
|
||||
QSsovkChh7ZBrCfpyR4sikopUgq9StFzM/UbZ5asSS4FfzAkO7vft5udiZMEnSBpk5dhFJmncjdHxXaG
|
||||
A+9K4SbFT1luEwQBbXavVO5d0nI3ovnW5yeiMriiu+kt5asXbABEdgRigAUQDr+aHLU3lxoLl/yPJhvF
|
||||
GsiYJ/vPdX5qPK3bVJ25VFukafztGQNsKHJ791I3w+8KcpNth8XDz5YxACI/gsR1J8sTYcO4UIzwv1gG
|
||||
cTshgJ5IT8hChTMHsHi+v+fvffmxywVwN2FDkdsGEOK2ceu4feQ0tDqKyKMGqDfqjvprLzyswuX7Tf4E
|
||||
dBo6zn/3OB7XHovRyuhQ6+hhYKA9DpL+A1keRebNAhkaJH0OHOcP031C4EjYr6wAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="toolStripButton2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADlSURBVEhL7dQxCsIwFMbxnMrZWatzUXRUCo5ewSs4ewZR
|
||||
DyDeQfEETsUbRL7YYNSXNC/UOiQP/kvzyE9KUcQ7y/VJtlHFvQYPjzf50xKsJsFmq81WHq538swMO9il
|
||||
zhALxkWd7kAOJwsnjjPsYNeGs2B14fR5YTYq5O5c1u7sL987iAUjF+6LIjaMKJyDoiAYmVAvn8lsXHij
|
||||
KBhGwDWof4APihqHqQ+OKhg2X3U/n7+9ah88CKY+pM9ndTgbplDbmQtnwS7UtmPDWfDf/jIRLnKhOuzY
|
||||
UMSGmyrBauKE26jiohshHicE2B3dbRrmAAAAAElFTkSuQmCC
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="close.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="wuid_name.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="tam.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>186, 17</value>
|
||||
</metadata>
|
||||
<metadata name="ta.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>325, 17</value>
|
||||
</metadata>
|
||||
</root>
|
||||
592
SubProject/FCM0000/Board/fRequestItem.Designer.cs
generated
592
SubProject/FCM0000/Board/fRequestItem.Designer.cs
generated
@@ -1,592 +0,0 @@
|
||||
namespace FCM0000
|
||||
{
|
||||
partial class fRequestItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new System.ComponentModel.Container();
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(fRequestItem));
|
||||
this.bn = new System.Windows.Forms.BindingNavigator(this.components);
|
||||
this.bs = new System.Windows.Forms.BindingSource(this.components);
|
||||
this.dsMSSQL = new FCM0000.dsMSSQL();
|
||||
this.bindingNavigatorCountItem = new System.Windows.Forms.ToolStripLabel();
|
||||
this.bindingNavigatorDeleteItem = new System.Windows.Forms.ToolStripButton();
|
||||
this.bindingNavigatorMoveFirstItem = new System.Windows.Forms.ToolStripButton();
|
||||
this.bindingNavigatorMovePreviousItem = new System.Windows.Forms.ToolStripButton();
|
||||
this.bindingNavigatorSeparator = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.bindingNavigatorPositionItem = new System.Windows.Forms.ToolStripTextBox();
|
||||
this.bindingNavigatorSeparator1 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.bindingNavigatorMoveNextItem = new System.Windows.Forms.ToolStripButton();
|
||||
this.bindingNavigatorMoveLastItem = new System.Windows.Forms.ToolStripButton();
|
||||
this.bindingNavigatorSeparator2 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.bindingNavigatorAddNewItem = new System.Windows.Forms.ToolStripButton();
|
||||
this.boardBindingNavigatorSaveItem = new System.Windows.Forms.ToolStripButton();
|
||||
this.dv1 = new System.Windows.Forms.DataGridView();
|
||||
this.pdateDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.titleDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.model = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.sidDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.qtyDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.project = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.bMail = new System.Windows.Forms.DataGridViewCheckBoxColumn();
|
||||
this.memo = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.cm = new System.Windows.Forms.ContextMenuStrip(this.components);
|
||||
this.autoResizeColumnsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.mailPreviewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.mailPreviewAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
|
||||
this.toolStripLabel1 = new System.Windows.Forms.ToolStripLabel();
|
||||
this.dtSD = new System.Windows.Forms.ToolStripTextBox();
|
||||
this.toolStripLabel4 = new System.Windows.Forms.ToolStripLabel();
|
||||
this.toolStripLabel2 = new System.Windows.Forms.ToolStripLabel();
|
||||
this.dtED = new System.Windows.Forms.ToolStripTextBox();
|
||||
this.btSearch = new System.Windows.Forms.ToolStripButton();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.panel1 = new System.Windows.Forms.Panel();
|
||||
this.label7 = new System.Windows.Forms.Label();
|
||||
this.label6 = new System.Windows.Forms.Label();
|
||||
this.label5 = new System.Windows.Forms.Label();
|
||||
this.label4 = new System.Windows.Forms.Label();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.tam = new FCM0000.dsMSSQLTableAdapters.TableAdapterManager();
|
||||
this.ta = new FCM0000.dsMSSQLTableAdapters.RequestItemTableAdapter();
|
||||
((System.ComponentModel.ISupportInitialize)(this.bn)).BeginInit();
|
||||
this.bn.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.bs)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dsMSSQL)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dv1)).BeginInit();
|
||||
this.cm.SuspendLayout();
|
||||
this.toolStrip1.SuspendLayout();
|
||||
this.panel1.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// bn
|
||||
//
|
||||
this.bn.AddNewItem = null;
|
||||
this.bn.BindingSource = this.bs;
|
||||
this.bn.CountItem = this.bindingNavigatorCountItem;
|
||||
this.bn.DeleteItem = this.bindingNavigatorDeleteItem;
|
||||
this.bn.Dock = System.Windows.Forms.DockStyle.Bottom;
|
||||
this.bn.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.bindingNavigatorMoveFirstItem,
|
||||
this.bindingNavigatorMovePreviousItem,
|
||||
this.bindingNavigatorSeparator,
|
||||
this.bindingNavigatorPositionItem,
|
||||
this.bindingNavigatorCountItem,
|
||||
this.bindingNavigatorSeparator1,
|
||||
this.bindingNavigatorMoveNextItem,
|
||||
this.bindingNavigatorMoveLastItem,
|
||||
this.bindingNavigatorSeparator2,
|
||||
this.bindingNavigatorAddNewItem,
|
||||
this.bindingNavigatorDeleteItem,
|
||||
this.boardBindingNavigatorSaveItem});
|
||||
this.bn.Location = new System.Drawing.Point(0, 550);
|
||||
this.bn.MoveFirstItem = this.bindingNavigatorMoveFirstItem;
|
||||
this.bn.MoveLastItem = this.bindingNavigatorMoveLastItem;
|
||||
this.bn.MoveNextItem = this.bindingNavigatorMoveNextItem;
|
||||
this.bn.MovePreviousItem = this.bindingNavigatorMovePreviousItem;
|
||||
this.bn.Name = "bn";
|
||||
this.bn.PositionItem = this.bindingNavigatorPositionItem;
|
||||
this.bn.Size = new System.Drawing.Size(1046, 25);
|
||||
this.bn.TabIndex = 0;
|
||||
this.bn.Text = "bindingNavigator1";
|
||||
//
|
||||
// bs
|
||||
//
|
||||
this.bs.DataMember = "RequestItem";
|
||||
this.bs.DataSource = this.dsMSSQL;
|
||||
//
|
||||
// dsMSSQL
|
||||
//
|
||||
this.dsMSSQL.DataSetName = "dsMSSQL";
|
||||
this.dsMSSQL.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
|
||||
//
|
||||
// bindingNavigatorCountItem
|
||||
//
|
||||
this.bindingNavigatorCountItem.Name = "bindingNavigatorCountItem";
|
||||
this.bindingNavigatorCountItem.Size = new System.Drawing.Size(27, 22);
|
||||
this.bindingNavigatorCountItem.Text = "/{0}";
|
||||
this.bindingNavigatorCountItem.ToolTipText = "전체 항목 수";
|
||||
//
|
||||
// bindingNavigatorDeleteItem
|
||||
//
|
||||
this.bindingNavigatorDeleteItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorDeleteItem.Image")));
|
||||
this.bindingNavigatorDeleteItem.Name = "bindingNavigatorDeleteItem";
|
||||
this.bindingNavigatorDeleteItem.RightToLeftAutoMirrorImage = true;
|
||||
this.bindingNavigatorDeleteItem.Size = new System.Drawing.Size(78, 22);
|
||||
this.bindingNavigatorDeleteItem.Text = "Delete(&D)";
|
||||
//
|
||||
// bindingNavigatorMoveFirstItem
|
||||
//
|
||||
this.bindingNavigatorMoveFirstItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||
this.bindingNavigatorMoveFirstItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveFirstItem.Image")));
|
||||
this.bindingNavigatorMoveFirstItem.Name = "bindingNavigatorMoveFirstItem";
|
||||
this.bindingNavigatorMoveFirstItem.RightToLeftAutoMirrorImage = true;
|
||||
this.bindingNavigatorMoveFirstItem.Size = new System.Drawing.Size(23, 22);
|
||||
this.bindingNavigatorMoveFirstItem.Text = "처음으로 이동";
|
||||
//
|
||||
// bindingNavigatorMovePreviousItem
|
||||
//
|
||||
this.bindingNavigatorMovePreviousItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||
this.bindingNavigatorMovePreviousItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMovePreviousItem.Image")));
|
||||
this.bindingNavigatorMovePreviousItem.Name = "bindingNavigatorMovePreviousItem";
|
||||
this.bindingNavigatorMovePreviousItem.RightToLeftAutoMirrorImage = true;
|
||||
this.bindingNavigatorMovePreviousItem.Size = new System.Drawing.Size(23, 22);
|
||||
this.bindingNavigatorMovePreviousItem.Text = "이전으로 이동";
|
||||
//
|
||||
// bindingNavigatorSeparator
|
||||
//
|
||||
this.bindingNavigatorSeparator.Name = "bindingNavigatorSeparator";
|
||||
this.bindingNavigatorSeparator.Size = new System.Drawing.Size(6, 25);
|
||||
//
|
||||
// bindingNavigatorPositionItem
|
||||
//
|
||||
this.bindingNavigatorPositionItem.AccessibleName = "위치";
|
||||
this.bindingNavigatorPositionItem.AutoSize = false;
|
||||
this.bindingNavigatorPositionItem.Name = "bindingNavigatorPositionItem";
|
||||
this.bindingNavigatorPositionItem.Size = new System.Drawing.Size(50, 23);
|
||||
this.bindingNavigatorPositionItem.Text = "0";
|
||||
this.bindingNavigatorPositionItem.ToolTipText = "현재 위치";
|
||||
//
|
||||
// bindingNavigatorSeparator1
|
||||
//
|
||||
this.bindingNavigatorSeparator1.Name = "bindingNavigatorSeparator1";
|
||||
this.bindingNavigatorSeparator1.Size = new System.Drawing.Size(6, 25);
|
||||
//
|
||||
// bindingNavigatorMoveNextItem
|
||||
//
|
||||
this.bindingNavigatorMoveNextItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||
this.bindingNavigatorMoveNextItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveNextItem.Image")));
|
||||
this.bindingNavigatorMoveNextItem.Name = "bindingNavigatorMoveNextItem";
|
||||
this.bindingNavigatorMoveNextItem.RightToLeftAutoMirrorImage = true;
|
||||
this.bindingNavigatorMoveNextItem.Size = new System.Drawing.Size(23, 22);
|
||||
this.bindingNavigatorMoveNextItem.Text = "다음으로 이동";
|
||||
//
|
||||
// bindingNavigatorMoveLastItem
|
||||
//
|
||||
this.bindingNavigatorMoveLastItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||
this.bindingNavigatorMoveLastItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveLastItem.Image")));
|
||||
this.bindingNavigatorMoveLastItem.Name = "bindingNavigatorMoveLastItem";
|
||||
this.bindingNavigatorMoveLastItem.RightToLeftAutoMirrorImage = true;
|
||||
this.bindingNavigatorMoveLastItem.Size = new System.Drawing.Size(23, 22);
|
||||
this.bindingNavigatorMoveLastItem.Text = "마지막으로 이동";
|
||||
//
|
||||
// bindingNavigatorSeparator2
|
||||
//
|
||||
this.bindingNavigatorSeparator2.Name = "bindingNavigatorSeparator2";
|
||||
this.bindingNavigatorSeparator2.Size = new System.Drawing.Size(6, 25);
|
||||
//
|
||||
// bindingNavigatorAddNewItem
|
||||
//
|
||||
this.bindingNavigatorAddNewItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorAddNewItem.Image")));
|
||||
this.bindingNavigatorAddNewItem.Name = "bindingNavigatorAddNewItem";
|
||||
this.bindingNavigatorAddNewItem.RightToLeftAutoMirrorImage = true;
|
||||
this.bindingNavigatorAddNewItem.Size = new System.Drawing.Size(65, 22);
|
||||
this.bindingNavigatorAddNewItem.Text = "Add(&A)";
|
||||
this.bindingNavigatorAddNewItem.Click += new System.EventHandler(this.bindingNavigatorAddNewItem_Click);
|
||||
//
|
||||
// boardBindingNavigatorSaveItem
|
||||
//
|
||||
this.boardBindingNavigatorSaveItem.Image = ((System.Drawing.Image)(resources.GetObject("boardBindingNavigatorSaveItem.Image")));
|
||||
this.boardBindingNavigatorSaveItem.Name = "boardBindingNavigatorSaveItem";
|
||||
this.boardBindingNavigatorSaveItem.Size = new System.Drawing.Size(67, 22);
|
||||
this.boardBindingNavigatorSaveItem.Text = "Save(&S)";
|
||||
this.boardBindingNavigatorSaveItem.Click += new System.EventHandler(this.boardBindingNavigatorSaveItem_Click);
|
||||
//
|
||||
// dv1
|
||||
//
|
||||
this.dv1.AllowUserToAddRows = false;
|
||||
this.dv1.AllowUserToDeleteRows = false;
|
||||
this.dv1.AutoGenerateColumns = false;
|
||||
this.dv1.ColumnHeadersHeight = 30;
|
||||
this.dv1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
|
||||
this.dv1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
|
||||
this.pdateDataGridViewTextBoxColumn,
|
||||
this.titleDataGridViewTextBoxColumn,
|
||||
this.model,
|
||||
this.sidDataGridViewTextBoxColumn,
|
||||
this.qtyDataGridViewTextBoxColumn,
|
||||
this.project,
|
||||
this.bMail,
|
||||
this.memo});
|
||||
this.dv1.ContextMenuStrip = this.cm;
|
||||
this.dv1.DataSource = this.bs;
|
||||
this.dv1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.dv1.Location = new System.Drawing.Point(0, 25);
|
||||
this.dv1.MultiSelect = false;
|
||||
this.dv1.Name = "dv1";
|
||||
this.dv1.ReadOnly = true;
|
||||
this.dv1.RowTemplate.Height = 23;
|
||||
this.dv1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
|
||||
this.dv1.Size = new System.Drawing.Size(874, 505);
|
||||
this.dv1.TabIndex = 2;
|
||||
this.dv1.DataError += new System.Windows.Forms.DataGridViewDataErrorEventHandler(this.dv1_DataError);
|
||||
this.dv1.DoubleClick += new System.EventHandler(this.boardDataGridView_DoubleClick);
|
||||
//
|
||||
// pdateDataGridViewTextBoxColumn
|
||||
//
|
||||
this.pdateDataGridViewTextBoxColumn.DataPropertyName = "pdate";
|
||||
this.pdateDataGridViewTextBoxColumn.HeaderText = "Pdate";
|
||||
this.pdateDataGridViewTextBoxColumn.Name = "pdateDataGridViewTextBoxColumn";
|
||||
this.pdateDataGridViewTextBoxColumn.ReadOnly = true;
|
||||
//
|
||||
// titleDataGridViewTextBoxColumn
|
||||
//
|
||||
this.titleDataGridViewTextBoxColumn.DataPropertyName = "title";
|
||||
this.titleDataGridViewTextBoxColumn.HeaderText = "Item";
|
||||
this.titleDataGridViewTextBoxColumn.Name = "titleDataGridViewTextBoxColumn";
|
||||
this.titleDataGridViewTextBoxColumn.ReadOnly = true;
|
||||
//
|
||||
// model
|
||||
//
|
||||
this.model.DataPropertyName = "model";
|
||||
this.model.HeaderText = "Model";
|
||||
this.model.Name = "model";
|
||||
this.model.ReadOnly = true;
|
||||
//
|
||||
// sidDataGridViewTextBoxColumn
|
||||
//
|
||||
this.sidDataGridViewTextBoxColumn.DataPropertyName = "sid";
|
||||
this.sidDataGridViewTextBoxColumn.HeaderText = "sid";
|
||||
this.sidDataGridViewTextBoxColumn.Name = "sidDataGridViewTextBoxColumn";
|
||||
this.sidDataGridViewTextBoxColumn.ReadOnly = true;
|
||||
//
|
||||
// qtyDataGridViewTextBoxColumn
|
||||
//
|
||||
this.qtyDataGridViewTextBoxColumn.DataPropertyName = "qty";
|
||||
this.qtyDataGridViewTextBoxColumn.HeaderText = "qty";
|
||||
this.qtyDataGridViewTextBoxColumn.Name = "qtyDataGridViewTextBoxColumn";
|
||||
this.qtyDataGridViewTextBoxColumn.ReadOnly = true;
|
||||
//
|
||||
// project
|
||||
//
|
||||
this.project.DataPropertyName = "projectName";
|
||||
this.project.HeaderText = "project";
|
||||
this.project.Name = "project";
|
||||
this.project.ReadOnly = true;
|
||||
//
|
||||
// bMail
|
||||
//
|
||||
this.bMail.DataPropertyName = "bMail";
|
||||
this.bMail.HeaderText = "Mail";
|
||||
this.bMail.Name = "bMail";
|
||||
this.bMail.ReadOnly = true;
|
||||
//
|
||||
// memo
|
||||
//
|
||||
this.memo.DataPropertyName = "memo";
|
||||
this.memo.HeaderText = "memo";
|
||||
this.memo.Name = "memo";
|
||||
this.memo.ReadOnly = true;
|
||||
//
|
||||
// cm
|
||||
//
|
||||
this.cm.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.autoResizeColumnsToolStripMenuItem,
|
||||
this.toolStripMenuItem1,
|
||||
this.mailPreviewToolStripMenuItem,
|
||||
this.mailPreviewAllToolStripMenuItem});
|
||||
this.cm.Name = "cm";
|
||||
this.cm.Size = new System.Drawing.Size(182, 76);
|
||||
//
|
||||
// autoResizeColumnsToolStripMenuItem
|
||||
//
|
||||
this.autoResizeColumnsToolStripMenuItem.Name = "autoResizeColumnsToolStripMenuItem";
|
||||
this.autoResizeColumnsToolStripMenuItem.Size = new System.Drawing.Size(181, 22);
|
||||
this.autoResizeColumnsToolStripMenuItem.Text = "AutoResizeColumns";
|
||||
this.autoResizeColumnsToolStripMenuItem.Click += new System.EventHandler(this.autoResizeColumnsToolStripMenuItem_Click);
|
||||
//
|
||||
// toolStripMenuItem1
|
||||
//
|
||||
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
|
||||
this.toolStripMenuItem1.Size = new System.Drawing.Size(178, 6);
|
||||
//
|
||||
// mailPreviewToolStripMenuItem
|
||||
//
|
||||
this.mailPreviewToolStripMenuItem.Name = "mailPreviewToolStripMenuItem";
|
||||
this.mailPreviewToolStripMenuItem.Size = new System.Drawing.Size(181, 22);
|
||||
this.mailPreviewToolStripMenuItem.Text = "Mail(Preview_One)";
|
||||
this.mailPreviewToolStripMenuItem.Click += new System.EventHandler(this.mailPreviewToolStripMenuItem_Click);
|
||||
//
|
||||
// mailPreviewAllToolStripMenuItem
|
||||
//
|
||||
this.mailPreviewAllToolStripMenuItem.Name = "mailPreviewAllToolStripMenuItem";
|
||||
this.mailPreviewAllToolStripMenuItem.Size = new System.Drawing.Size(181, 22);
|
||||
this.mailPreviewAllToolStripMenuItem.Text = "Mail(Preview_All)";
|
||||
this.mailPreviewAllToolStripMenuItem.Click += new System.EventHandler(this.mailPreviewAllToolStripMenuItem_Click);
|
||||
//
|
||||
// toolStrip1
|
||||
//
|
||||
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.toolStripLabel1,
|
||||
this.dtSD,
|
||||
this.toolStripLabel4,
|
||||
this.toolStripLabel2,
|
||||
this.dtED,
|
||||
this.btSearch});
|
||||
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
|
||||
this.toolStrip1.Name = "toolStrip1";
|
||||
this.toolStrip1.Size = new System.Drawing.Size(1046, 25);
|
||||
this.toolStrip1.TabIndex = 4;
|
||||
this.toolStrip1.Text = "toolStrip1";
|
||||
//
|
||||
// toolStripLabel1
|
||||
//
|
||||
this.toolStripLabel1.Name = "toolStripLabel1";
|
||||
this.toolStripLabel1.Size = new System.Drawing.Size(32, 22);
|
||||
this.toolStripLabel1.Text = "Start";
|
||||
//
|
||||
// dtSD
|
||||
//
|
||||
this.dtSD.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.dtSD.Name = "dtSD";
|
||||
this.dtSD.Size = new System.Drawing.Size(100, 25);
|
||||
//
|
||||
// toolStripLabel4
|
||||
//
|
||||
this.toolStripLabel4.Name = "toolStripLabel4";
|
||||
this.toolStripLabel4.Size = new System.Drawing.Size(15, 22);
|
||||
this.toolStripLabel4.Text = "~";
|
||||
//
|
||||
// toolStripLabel2
|
||||
//
|
||||
this.toolStripLabel2.Name = "toolStripLabel2";
|
||||
this.toolStripLabel2.Size = new System.Drawing.Size(27, 22);
|
||||
this.toolStripLabel2.Text = "End";
|
||||
//
|
||||
// dtED
|
||||
//
|
||||
this.dtED.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.dtED.Name = "dtED";
|
||||
this.dtED.Size = new System.Drawing.Size(100, 25);
|
||||
//
|
||||
// btSearch
|
||||
//
|
||||
this.btSearch.Image = ((System.Drawing.Image)(resources.GetObject("btSearch.Image")));
|
||||
this.btSearch.ImageTransparentColor = System.Drawing.Color.Magenta;
|
||||
this.btSearch.Name = "btSearch";
|
||||
this.btSearch.Size = new System.Drawing.Size(81, 22);
|
||||
this.btSearch.Text = "Refresh(&R)";
|
||||
this.btSearch.Click += new System.EventHandler(this.btSearch_Click);
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.BackColor = System.Drawing.Color.DeepSkyBlue;
|
||||
this.label1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "url", true));
|
||||
this.label1.Dock = System.Windows.Forms.DockStyle.Bottom;
|
||||
this.label1.ForeColor = System.Drawing.Color.White;
|
||||
this.label1.Location = new System.Drawing.Point(0, 530);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(1046, 20);
|
||||
this.label1.TabIndex = 5;
|
||||
this.label1.Text = "-- URL --";
|
||||
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
this.label1.Click += new System.EventHandler(this.label1_Click);
|
||||
//
|
||||
// panel1
|
||||
//
|
||||
this.panel1.Controls.Add(this.label7);
|
||||
this.panel1.Controls.Add(this.label6);
|
||||
this.panel1.Controls.Add(this.label5);
|
||||
this.panel1.Controls.Add(this.label4);
|
||||
this.panel1.Controls.Add(this.label3);
|
||||
this.panel1.Controls.Add(this.label2);
|
||||
this.panel1.Dock = System.Windows.Forms.DockStyle.Right;
|
||||
this.panel1.Location = new System.Drawing.Point(874, 25);
|
||||
this.panel1.Name = "panel1";
|
||||
this.panel1.Size = new System.Drawing.Size(172, 505);
|
||||
this.panel1.TabIndex = 7;
|
||||
//
|
||||
// label7
|
||||
//
|
||||
this.label7.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "bcclist", true));
|
||||
this.label7.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.label7.Location = new System.Drawing.Point(0, 300);
|
||||
this.label7.Name = "label7";
|
||||
this.label7.Size = new System.Drawing.Size(172, 205);
|
||||
this.label7.TabIndex = 5;
|
||||
this.label7.Text = "--";
|
||||
this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// label6
|
||||
//
|
||||
this.label6.BackColor = System.Drawing.Color.Gray;
|
||||
this.label6.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.label6.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.label6.ForeColor = System.Drawing.Color.White;
|
||||
this.label6.Location = new System.Drawing.Point(0, 270);
|
||||
this.label6.Name = "label6";
|
||||
this.label6.Size = new System.Drawing.Size(172, 30);
|
||||
this.label6.TabIndex = 4;
|
||||
this.label6.Text = "BCC List";
|
||||
this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// label5
|
||||
//
|
||||
this.label5.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "cclist", true));
|
||||
this.label5.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.label5.Location = new System.Drawing.Point(0, 165);
|
||||
this.label5.Name = "label5";
|
||||
this.label5.Size = new System.Drawing.Size(172, 105);
|
||||
this.label5.TabIndex = 3;
|
||||
this.label5.Text = "--";
|
||||
this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// label4
|
||||
//
|
||||
this.label4.BackColor = System.Drawing.Color.Gray;
|
||||
this.label4.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.label4.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.label4.ForeColor = System.Drawing.Color.White;
|
||||
this.label4.Location = new System.Drawing.Point(0, 135);
|
||||
this.label4.Name = "label4";
|
||||
this.label4.Size = new System.Drawing.Size(172, 30);
|
||||
this.label4.TabIndex = 2;
|
||||
this.label4.Text = "CC List";
|
||||
this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "tolist", true));
|
||||
this.label3.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.label3.Location = new System.Drawing.Point(0, 30);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(172, 105);
|
||||
this.label3.TabIndex = 1;
|
||||
this.label3.Text = "--";
|
||||
this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.BackColor = System.Drawing.Color.Gray;
|
||||
this.label2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.label2.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.label2.ForeColor = System.Drawing.Color.White;
|
||||
this.label2.Location = new System.Drawing.Point(0, 0);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(172, 30);
|
||||
this.label2.TabIndex = 0;
|
||||
this.label2.Text = "TO List";
|
||||
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// tam
|
||||
//
|
||||
this.tam.BackupDataSetBeforeUpdate = false;
|
||||
this.tam.BoardTableAdapter = null;
|
||||
this.tam.CommonTableAdapter = null;
|
||||
this.tam.CustomsTableAdapter = null;
|
||||
this.tam.ItemsTableAdapter = null;
|
||||
this.tam.ProjectsTableAdapter = null;
|
||||
this.tam.PurchaseTableAdapter = null;
|
||||
this.tam.RequestItemTableAdapter = this.ta;
|
||||
this.tam.StaffTableAdapter = null;
|
||||
this.tam.UpdateOrder = FCM0000.dsMSSQLTableAdapters.TableAdapterManager.UpdateOrderOption.InsertUpdateDelete;
|
||||
//
|
||||
// ta
|
||||
//
|
||||
this.ta.ClearBeforeFill = true;
|
||||
//
|
||||
// fRequestItem
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(1046, 575);
|
||||
this.Controls.Add(this.dv1);
|
||||
this.Controls.Add(this.panel1);
|
||||
this.Controls.Add(this.label1);
|
||||
this.Controls.Add(this.toolStrip1);
|
||||
this.Controls.Add(this.bn);
|
||||
this.Name = "fRequestItem";
|
||||
this.Text = "Patch List";
|
||||
this.Load += new System.EventHandler(this.fRequestItem_Load);
|
||||
((System.ComponentModel.ISupportInitialize)(this.bn)).EndInit();
|
||||
this.bn.ResumeLayout(false);
|
||||
this.bn.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.bs)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dsMSSQL)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dv1)).EndInit();
|
||||
this.cm.ResumeLayout(false);
|
||||
this.toolStrip1.ResumeLayout(false);
|
||||
this.toolStrip1.PerformLayout();
|
||||
this.panel1.ResumeLayout(false);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private dsMSSQL dsMSSQL;
|
||||
private System.Windows.Forms.BindingSource bs;
|
||||
private dsMSSQLTableAdapters.TableAdapterManager tam;
|
||||
private System.Windows.Forms.BindingNavigator bn;
|
||||
private System.Windows.Forms.ToolStripButton bindingNavigatorAddNewItem;
|
||||
private System.Windows.Forms.ToolStripLabel bindingNavigatorCountItem;
|
||||
private System.Windows.Forms.ToolStripButton bindingNavigatorDeleteItem;
|
||||
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveFirstItem;
|
||||
private System.Windows.Forms.ToolStripButton bindingNavigatorMovePreviousItem;
|
||||
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator;
|
||||
private System.Windows.Forms.ToolStripTextBox bindingNavigatorPositionItem;
|
||||
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator1;
|
||||
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveNextItem;
|
||||
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveLastItem;
|
||||
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator2;
|
||||
private System.Windows.Forms.ToolStripButton boardBindingNavigatorSaveItem;
|
||||
private System.Windows.Forms.DataGridView dv1;
|
||||
private System.Windows.Forms.ToolStrip toolStrip1;
|
||||
private System.Windows.Forms.ToolStripLabel toolStripLabel1;
|
||||
private System.Windows.Forms.ToolStripTextBox dtSD;
|
||||
private System.Windows.Forms.ToolStripLabel toolStripLabel4;
|
||||
private System.Windows.Forms.ToolStripLabel toolStripLabel2;
|
||||
private System.Windows.Forms.ToolStripTextBox dtED;
|
||||
private System.Windows.Forms.ToolStripButton btSearch;
|
||||
private dsMSSQLTableAdapters.RequestItemTableAdapter ta;
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.ContextMenuStrip cm;
|
||||
private System.Windows.Forms.ToolStripMenuItem mailPreviewToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
|
||||
private System.Windows.Forms.ToolStripMenuItem autoResizeColumnsToolStripMenuItem;
|
||||
private System.Windows.Forms.Panel panel1;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.Label label3;
|
||||
private System.Windows.Forms.Label label4;
|
||||
private System.Windows.Forms.Label label6;
|
||||
private System.Windows.Forms.Label label5;
|
||||
private System.Windows.Forms.Label label7;
|
||||
private System.Windows.Forms.ToolStripMenuItem mailPreviewAllToolStripMenuItem;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn pdateDataGridViewTextBoxColumn;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn titleDataGridViewTextBoxColumn;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn model;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn sidDataGridViewTextBoxColumn;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn qtyDataGridViewTextBoxColumn;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn project;
|
||||
private System.Windows.Forms.DataGridViewCheckBoxColumn bMail;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn memo;
|
||||
}
|
||||
}
|
||||
@@ -1,191 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using NetOffice;
|
||||
using Outlook = NetOffice.OutlookApi;
|
||||
using NetOffice.OutlookApi.Enums;
|
||||
|
||||
namespace FCM0000
|
||||
{
|
||||
public partial class fRequestItem : FCOMMON.fBase
|
||||
{
|
||||
public fRequestItem()
|
||||
{
|
||||
InitializeComponent();
|
||||
Properties.Settings.Default["gwcs"] = FCOMMON.info.CS;
|
||||
this.dsMSSQL.RequestItem.TableNewRow += RequestItem_TableNewRow;
|
||||
}
|
||||
|
||||
void RequestItem_TableNewRow(object sender, DataTableNewRowEventArgs e)
|
||||
{
|
||||
e.Row["wuid"] = FCOMMON.info.Login.no;
|
||||
e.Row["wdate"] = DateTime.Now;
|
||||
e.Row["pdate"] = DateTime.Now.ToShortDateString();
|
||||
e.Row["qty"] = 1;
|
||||
}
|
||||
|
||||
private void fRequestItem_Load(object sender, EventArgs e)
|
||||
{
|
||||
EnsureVisibleAndUsableSize();
|
||||
this.dtSD.Text = DateTime.Now.AddDays(-15).ToShortDateString();
|
||||
this.dtED.Text = DateTime.Now.ToShortDateString();
|
||||
refreshData();
|
||||
}
|
||||
|
||||
private void boardBindingNavigatorSaveItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.Validate();
|
||||
this.bs.EndEdit();
|
||||
this.tam.UpdateAll(this.dsMSSQL);
|
||||
}
|
||||
|
||||
|
||||
void refreshData()
|
||||
{
|
||||
try
|
||||
{
|
||||
this.ta.Fill(this.dsMSSQL.RequestItem, dtSD.Text, dtED.Text);
|
||||
this.dv1.AutoResizeColumns();
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
System.Windows.Forms.MessageBox.Show(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
private void btSearch_Click(object sender, EventArgs e)
|
||||
{
|
||||
refreshData();
|
||||
}
|
||||
|
||||
private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
var newdr = this.dsMSSQL.RequestItem.NewRequestItemRow();
|
||||
fRequestItem_Add f = new fRequestItem_Add(newdr);
|
||||
if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK) newdr.Delete();
|
||||
else this.dsMSSQL.RequestItem.AddRequestItemRow(newdr);
|
||||
}
|
||||
|
||||
private void label1_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (label1.Text != "")
|
||||
FCOMMON.Util.RunExplorer(label1.Text);
|
||||
}
|
||||
|
||||
private void boardDataGridView_DoubleClick(object sender, EventArgs e)
|
||||
{
|
||||
var drv = this.bs.Current as DataRowView;
|
||||
if (drv == null) return;
|
||||
var dr = drv.Row as dsMSSQL.RequestItemRow;
|
||||
var f = new fRequestItem_Add(dr);
|
||||
if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK)
|
||||
dr.RejectChanges();
|
||||
}
|
||||
|
||||
private void mailPreviewToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
var drv = this.bs.Current as DataRowView;
|
||||
if (drv == null) return;
|
||||
var dr = drv.Row as dsMSSQL.RequestItemRow;
|
||||
|
||||
|
||||
//자로에서 불러와서 그 값을 가져온다.s
|
||||
string subject = "[AMKOR-K4] 견적문의";
|
||||
var taMF = new DSMailTableAdapters.MailFormTableAdapter();
|
||||
var data = taMF.GetByCate(FCOMMON.info.Login.gcode, "BY");
|
||||
if (data != null && data.Rows.Count > 0)
|
||||
{
|
||||
var drForm = data.Rows[0] as DSMail.MailFormRow;
|
||||
subject = drForm.subject;
|
||||
}
|
||||
|
||||
|
||||
var tolist = 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.Subject = subject; // dr.title;
|
||||
newMail.To = to;
|
||||
newMail.CC = dr.cclist;
|
||||
newMail.BCC = dr.bcclist;
|
||||
newMail.HTMLBody = dr.remark
|
||||
.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}", dr.title)
|
||||
.Replace("{QTY}",dr.qty.ToString())
|
||||
.Replace("{MODEL}", dr.model.ToString())
|
||||
.Replace("%7BURL%7D", dr.url.ToString())
|
||||
.Replace("{URL}",dr.url);
|
||||
|
||||
newMail.BodyFormat = OlBodyFormat.olFormatHTML;
|
||||
newMail.Display();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void autoResizeColumnsToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
dv1.AutoResizeColumns();
|
||||
}
|
||||
|
||||
private void mailPreviewAllToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
var drv = this.bs.Current as DataRowView;
|
||||
if (drv == null) return;
|
||||
var dr = drv.Row as dsMSSQL.RequestItemRow;
|
||||
|
||||
//자로에서 불러와서 그 값을 가져온다.s
|
||||
string subject = "[AMKOR-K4] 견적문의";
|
||||
var taMF = new DSMailTableAdapters.MailFormTableAdapter();
|
||||
var data = taMF.GetByCate(FCOMMON.info.Login.gcode, "BY");
|
||||
if (data != null && data.Rows.Count > 0)
|
||||
{
|
||||
var drForm = data.Rows[0] as DSMail.MailFormRow;
|
||||
subject = drForm.subject;
|
||||
}
|
||||
|
||||
var tolist = 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.Subject = subject; // dr.title;
|
||||
newMail.To = to;
|
||||
newMail.CC = dr.cclist;
|
||||
newMail.BCC = dr.bcclist;
|
||||
newMail.HTMLBody = dr.remark
|
||||
.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}", dr.title)
|
||||
.Replace("{QTY}", dr.qty.ToString())
|
||||
.Replace("{MODEL}", dr.model.ToString())
|
||||
.Replace("%7BURL%7D", dr.url.ToString())
|
||||
.Replace("{URL}", dr.url);
|
||||
|
||||
newMail.BodyFormat = OlBodyFormat.olFormatHTML;
|
||||
newMail.Display();
|
||||
}
|
||||
}
|
||||
|
||||
private void dv1_DataError(object sender, DataGridViewDataErrorEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,236 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="bn.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>259, 17</value>
|
||||
</metadata>
|
||||
<metadata name="bs.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>122, 17</value>
|
||||
</metadata>
|
||||
<metadata name="dsMSSQL.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="bindingNavigatorDeleteItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
wwAADsMBx2+oZAAAAW9JREFUOE+1kE0ow2Ecx3dV3krt4oJaOSCTvIRkMqSxyITIzCQHDouEdnFwIOVC
|
||||
DrhIDiQl5UTiNG/z2ppafy1S2gX/uDwfY6i1v7Hie3nqeb7fz+/7/FR/Ilwn0G0Exw4fV5GJlXlEZxXC
|
||||
rIet9bAQvB5Ymgn2sLYAvSZEux7RUQFzE4qQt4bCXAYjPaHvnDoCkLpsRGMB2JqCTGLIijDlwqQ9bEMV
|
||||
i9OIytR3EMNWcJ/BWH8A6j8/bOGFxwXNxYEvGbMQ9XnQ1/K78KfY3/VXzkMY0qFGG2H4RoLGQshJQNbG
|
||||
86CNhdrsX9a/uQZTPhQl4rMY4OLofbl3aX7I8uwPC7y/g1YdjyVJuEvT8e1tfwUYteHUxCCfHChDeHmG
|
||||
QQvokjlOU+PbWA0x3pZnILVVI3uvQyHsbiLnqnGmRCF1NYD8pDhpRxOH7HQoAKZGkFKjceszQbpSrumX
|
||||
bO+G80MFwKUTxgfgcO/b8D9IpXoFiiMDHIQm0skAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="bindingNavigatorMoveFirstItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
wwAADsMBx2+oZAAAASpJREFUOE9jGDygcNbz/00Lnv/PnPj4P1QIA4S3P8Apx5A789n/VUfe/8elKL77
|
||||
wf/ghmu4DciY8vT/wn0fsCqK73n4f+n+///9qy/gNiCh58n/aVveYyiKaL8P1pw56/9/r9ITuA2I7Hr0
|
||||
v3f1BxRFoa33wJpb1wFt7/z73yX/AG4DApsf/q+b/w6uKLjl7v9Fe///7wBqzpjz879d3c//9hnbcRvg
|
||||
UXX/f/60NyiK7Ipv/0+f8/u/f9e3/zqF7/5bJKzHbYB96d3/2ZNfYyjSTzn/36ToxX+VrE//jSOX4TbA
|
||||
Iu/O/9T+11gVGSSd+C+b9vW/bvA83AYYZt3+H9byEqci/dTL/zV8p+E2QCftxn+/6od4Fal4TMBtgFPu
|
||||
lf8gBXgVDULAwAAA8HbAq6XlmnAAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="bindingNavigatorMovePreviousItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
wwAADsMBx2+oZAAAALZJREFUOE9jGDogvP3BfyiTdBDf/eB/cMM18gyI73n4f+n+///9qy+QbkBE+32w
|
||||
5sxZ//97lZ4gzYDQ1ntgza3rgLZ3/v3vkn+AeAOCW+7+X7T3//8OoOaMOT//29X9/G+fsZ00F9gV3/6f
|
||||
Puf3f/+ub/91Ct/9t0hYT3oY6Kec/29S9OK/Stan/8aRy0g3AAQMkk78l037+l83eB55BoCAfurl/xq+
|
||||
08g3AARUPCZQZsBgBQwMANAUYJgEulBVAAAAAElFTkSuQmCC
|
||||
</value>
|
||||
</data>
|
||||
<data name="bindingNavigatorMoveNextItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
wwAADsMBx2+oZAAAAKNJREFUOE9jGHygcNbz/1AmeSB35rP/Cd33yDckY8rT//P2//6f0HWHPEMSep78
|
||||
n73v1//OrX//u5VeJt2QyK5H/6ds+/W/ZOnf/wnT//63yT1LmiGBzQ//t659D9ZsXPLlv3T0tf/GkcuI
|
||||
N8Sj6v7/krnv4JoVXXpIc4F96d3/gS3PyNMMAhZ5d/7bFFwhTzMIGGbdJl8zCOik3SBf81AEDAwAoH5f
|
||||
oAc0QjgAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="bindingNavigatorMoveLastItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
wwAADsMBx2+oZAAAASxJREFUOE9jGFygcNbz/1AmBgDJNS14/j9z4mOcahhyZz77n9B9D6sCkNyqI+//
|
||||
h7c/wG1AxpSn/+ft//0/oesOhiKQ3MJ9H/4HN1zDbUBCz5P/s/f9+t+59e9/t9LLKApBctO2vP/vX30B
|
||||
twGRXY/+T9n263/J0r//E6b//W+TexauGCTXu/rDf6/SE7gNCGx++L917XuwZuOSL/+lo6/9N45cBtYA
|
||||
kqub/+6/S/4B3AZ4VN3/XzL3HVyzoksPXDFILn/am//2GdtxG2Bfevd/YMszDM0gAJLLnvz6v0XCetwG
|
||||
WOTd+W9TcAVDMwiA5FL7X8O9hBUYZt3GqhkEQHJhLS//6wbPw22ATtoNnJIgOb/qh/81fKfhNgAfcMq9
|
||||
8l/FYwIYQ4UGBWBgAAC+0b+zuQxOnAAAAABJRU5ErkJggg==
|
||||
</value>
|
||||
</data>
|
||||
<data name="bindingNavigatorAddNewItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
wwAADsMBx2+oZAAAAUpJREFUOE9jGLzg7gL2/7fmcf6/Oofr/8UZvP+hwsSD60CNfx41/v/zsOH/yckC
|
||||
pBtwfjov3ICDPSKkG3B8kiBQc93/Pw+q/u9oFydswKWZPP/PTuX7fxKo8Ui/0P993SJAzeX//94r+r++
|
||||
Qeb/qhq5/0srFf/PL1X+P6tIFdPAU0B//nlYD9RUC8SV///cKwHivP9/72b+/3sn+f/f23H//92MAOKQ
|
||||
/5NyNDENONQrDHbu3/ulQI0FQI3ZQI2pQI0J///digZqDPv/70bQ/3/X/f53peliGrCzXeL/lmap/+vA
|
||||
zpX/v6RC8f/fWzFAjeH/p+Zp/J+QpfW/O0P3f3uq/v/mREPCYTIb6E+Qc//dCPjfk6FDWAM6APnz3w1/
|
||||
IPb735qsT7oB3em6YP+CcH2cEekGtCQZ/G+IN/xfE2v8vzLahHQD6AQYGAAkI9iedfyIaQAAAABJRU5E
|
||||
rkJggg==
|
||||
</value>
|
||||
</data>
|
||||
<data name="boardBindingNavigatorSaveItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
wwAADsMBx2+oZAAAAExJREFUOE9joAr49u3bf1IxVCsEgAWC58Dxh/cf4RhZDETHTNiHaQgpBoAwzBCo
|
||||
dtINAGGiDUDGyGpoawAxeNSAQWkAORiqnRLAwAAA9EMMU8Daa3MAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="model.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="project.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="bMail.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="memo.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="cm.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>493, 17</value>
|
||||
</metadata>
|
||||
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>325, 17</value>
|
||||
</metadata>
|
||||
<data name="btSearch.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE4SURBVDhPtZPPasJAEMbzPn0FwWA92JtP4NGKB1/DP7ei
|
||||
QSsovkChh7ZBrCfpyR4sikopUgq9StFzM/UbZ5asSS4FfzAkO7vft5udiZMEnSBpk5dhFJmncjdHxXaG
|
||||
A+9K4SbFT1luEwQBbXavVO5d0nI3ovnW5yeiMriiu+kt5asXbABEdgRigAUQDr+aHLU3lxoLl/yPJhvF
|
||||
GsiYJ/vPdX5qPK3bVJ25VFukafztGQNsKHJ791I3w+8KcpNth8XDz5YxACI/gsR1J8sTYcO4UIzwv1gG
|
||||
cTshgJ5IT8hChTMHsHi+v+fvffmxywVwN2FDkdsGEOK2ceu4feQ0tDqKyKMGqDfqjvprLzyswuX7Tf4E
|
||||
dBo6zn/3OB7XHovRyuhQ6+hhYKA9DpL+A1keRebNAhkaJH0OHOcP031C4EjYr6wAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="tam.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>186, 17</value>
|
||||
</metadata>
|
||||
<metadata name="ta.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>431, 17</value>
|
||||
</metadata>
|
||||
</root>
|
||||
474
SubProject/FCM0000/Board/fRequestItem_Add.Designer.cs
generated
474
SubProject/FCM0000/Board/fRequestItem_Add.Designer.cs
generated
@@ -1,474 +0,0 @@
|
||||
namespace FCM0000
|
||||
{
|
||||
partial class fRequestItem_Add
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new System.ComponentModel.Container();
|
||||
System.Windows.Forms.Label pdateLabel;
|
||||
System.Windows.Forms.Label tolistLabel;
|
||||
System.Windows.Forms.Label cclistLabel;
|
||||
System.Windows.Forms.Label bcclistLabel;
|
||||
System.Windows.Forms.Label titleLabel;
|
||||
System.Windows.Forms.Label remarkLabel;
|
||||
System.Windows.Forms.Label label1;
|
||||
System.Windows.Forms.Label label2;
|
||||
System.Windows.Forms.Label label3;
|
||||
System.Windows.Forms.Label label4;
|
||||
System.Windows.Forms.Label label5;
|
||||
System.Windows.Forms.Label label6;
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(fRequestItem_Add));
|
||||
this.dsMSSQL = new FCM0000.dsMSSQL();
|
||||
this.bs = new System.Windows.Forms.BindingSource(this.components);
|
||||
this.ta = new FCM0000.dsMSSQLTableAdapters.RequestItemTableAdapter();
|
||||
this.tam = new FCM0000.dsMSSQLTableAdapters.TableAdapterManager();
|
||||
this.tbItem = new System.Windows.Forms.TextBox();
|
||||
this.btPDate = new System.Windows.Forms.DateTimePicker();
|
||||
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
|
||||
this.lbTo = new System.Windows.Forms.Label();
|
||||
this.lbCC = new System.Windows.Forms.Label();
|
||||
this.lbBCC = new System.Windows.Forms.Label();
|
||||
this.tbRemark = new YARTE.UI.HtmlEditor();
|
||||
this.tbQty = new System.Windows.Forms.TextBox();
|
||||
this.tbSID = new System.Windows.Forms.TextBox();
|
||||
this.tbURL = new System.Windows.Forms.TextBox();
|
||||
this.cmProject = new System.Windows.Forms.ComboBox();
|
||||
this.btOK = new System.Windows.Forms.Button();
|
||||
this.tbModel = new System.Windows.Forms.TextBox();
|
||||
this.textBox1 = new System.Windows.Forms.TextBox();
|
||||
pdateLabel = new System.Windows.Forms.Label();
|
||||
tolistLabel = new System.Windows.Forms.Label();
|
||||
cclistLabel = new System.Windows.Forms.Label();
|
||||
bcclistLabel = new System.Windows.Forms.Label();
|
||||
titleLabel = new System.Windows.Forms.Label();
|
||||
remarkLabel = new System.Windows.Forms.Label();
|
||||
label1 = new System.Windows.Forms.Label();
|
||||
label2 = new System.Windows.Forms.Label();
|
||||
label3 = new System.Windows.Forms.Label();
|
||||
label4 = new System.Windows.Forms.Label();
|
||||
label5 = new System.Windows.Forms.Label();
|
||||
label6 = new System.Windows.Forms.Label();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dsMSSQL)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.bs)).BeginInit();
|
||||
this.tableLayoutPanel1.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// pdateLabel
|
||||
//
|
||||
pdateLabel.AutoSize = true;
|
||||
pdateLabel.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
pdateLabel.Location = new System.Drawing.Point(5, 2);
|
||||
pdateLabel.Name = "pdateLabel";
|
||||
pdateLabel.Size = new System.Drawing.Size(248, 23);
|
||||
pdateLabel.TabIndex = 4;
|
||||
pdateLabel.Text = "등록일자";
|
||||
pdateLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// tolistLabel
|
||||
//
|
||||
tolistLabel.AutoSize = true;
|
||||
tolistLabel.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
tolistLabel.Location = new System.Drawing.Point(5, 53);
|
||||
tolistLabel.Name = "tolistLabel";
|
||||
tolistLabel.Size = new System.Drawing.Size(248, 25);
|
||||
tolistLabel.TabIndex = 6;
|
||||
tolistLabel.Text = "To";
|
||||
tolistLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// cclistLabel
|
||||
//
|
||||
cclistLabel.AutoSize = true;
|
||||
cclistLabel.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
cclistLabel.Location = new System.Drawing.Point(5, 131);
|
||||
cclistLabel.Name = "cclistLabel";
|
||||
cclistLabel.Size = new System.Drawing.Size(248, 20);
|
||||
cclistLabel.TabIndex = 8;
|
||||
cclistLabel.Text = "CC";
|
||||
cclistLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// bcclistLabel
|
||||
//
|
||||
bcclistLabel.AutoSize = true;
|
||||
bcclistLabel.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
bcclistLabel.Location = new System.Drawing.Point(5, 204);
|
||||
bcclistLabel.Name = "bcclistLabel";
|
||||
bcclistLabel.Size = new System.Drawing.Size(248, 20);
|
||||
bcclistLabel.TabIndex = 10;
|
||||
bcclistLabel.Text = "BCC";
|
||||
bcclistLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// titleLabel
|
||||
//
|
||||
titleLabel.AutoSize = true;
|
||||
titleLabel.Location = new System.Drawing.Point(292, 14);
|
||||
titleLabel.Name = "titleLabel";
|
||||
titleLabel.Size = new System.Drawing.Size(29, 12);
|
||||
titleLabel.TabIndex = 1;
|
||||
titleLabel.Text = "Item";
|
||||
titleLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// remarkLabel
|
||||
//
|
||||
remarkLabel.AutoSize = true;
|
||||
remarkLabel.Location = new System.Drawing.Point(266, 113);
|
||||
remarkLabel.Name = "remarkLabel";
|
||||
remarkLabel.Size = new System.Drawing.Size(55, 12);
|
||||
remarkLabel.TabIndex = 13;
|
||||
remarkLabel.Text = "Contents";
|
||||
remarkLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
remarkLabel.Click += new System.EventHandler(this.remarkLabel_Click);
|
||||
//
|
||||
// label1
|
||||
//
|
||||
label1.AutoSize = true;
|
||||
label1.Location = new System.Drawing.Point(493, 65);
|
||||
label1.Name = "label1";
|
||||
label1.Size = new System.Drawing.Size(24, 12);
|
||||
label1.TabIndex = 7;
|
||||
label1.Text = "Qty";
|
||||
label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// label2
|
||||
//
|
||||
label2.AutoSize = true;
|
||||
label2.Location = new System.Drawing.Point(585, 65);
|
||||
label2.Name = "label2";
|
||||
label2.Size = new System.Drawing.Size(24, 12);
|
||||
label2.TabIndex = 9;
|
||||
label2.Text = "SID";
|
||||
label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// label3
|
||||
//
|
||||
label3.AutoSize = true;
|
||||
label3.Location = new System.Drawing.Point(293, 91);
|
||||
label3.Name = "label3";
|
||||
label3.Size = new System.Drawing.Size(28, 12);
|
||||
label3.TabIndex = 11;
|
||||
label3.Text = "URL";
|
||||
label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// label4
|
||||
//
|
||||
label4.AutoSize = true;
|
||||
label4.Location = new System.Drawing.Point(277, 40);
|
||||
label4.Name = "label4";
|
||||
label4.Size = new System.Drawing.Size(44, 12);
|
||||
label4.TabIndex = 3;
|
||||
label4.Text = "Project";
|
||||
label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// label5
|
||||
//
|
||||
label5.AutoSize = true;
|
||||
label5.Location = new System.Drawing.Point(281, 65);
|
||||
label5.Name = "label5";
|
||||
label5.Size = new System.Drawing.Size(40, 12);
|
||||
label5.TabIndex = 5;
|
||||
label5.Text = "Model";
|
||||
label5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// label6
|
||||
//
|
||||
label6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||
label6.AutoSize = true;
|
||||
label6.Location = new System.Drawing.Point(282, 550);
|
||||
label6.Name = "label6";
|
||||
label6.Size = new System.Drawing.Size(41, 12);
|
||||
label6.TabIndex = 30;
|
||||
label6.Text = "Memo";
|
||||
label6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// dsMSSQL
|
||||
//
|
||||
this.dsMSSQL.DataSetName = "dsMSSQL";
|
||||
this.dsMSSQL.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
|
||||
//
|
||||
// bs
|
||||
//
|
||||
this.bs.DataMember = "RequestItem";
|
||||
this.bs.DataSource = this.dsMSSQL;
|
||||
//
|
||||
// ta
|
||||
//
|
||||
this.ta.ClearBeforeFill = true;
|
||||
//
|
||||
// tam
|
||||
//
|
||||
this.tam.BackupDataSetBeforeUpdate = false;
|
||||
this.tam.BoardTableAdapter = null;
|
||||
this.tam.CommonTableAdapter = null;
|
||||
this.tam.CustomsTableAdapter = null;
|
||||
this.tam.EETGW_DocuFormTableAdapter = null;
|
||||
this.tam.HolidayLIstTableAdapter = null;
|
||||
this.tam.InventoryUserTableAdapter = null;
|
||||
this.tam.ItemsTableAdapter = null;
|
||||
this.tam.ProjectsTableAdapter = null;
|
||||
this.tam.PurchaseTableAdapter = null;
|
||||
this.tam.RequestItemTableAdapter = this.ta;
|
||||
this.tam.StaffTableAdapter = null;
|
||||
this.tam.UpdateOrder = FCM0000.dsMSSQLTableAdapters.TableAdapterManager.UpdateOrderOption.InsertUpdateDelete;
|
||||
//
|
||||
// tbItem
|
||||
//
|
||||
this.tbItem.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "title", true));
|
||||
this.tbItem.Location = new System.Drawing.Point(329, 10);
|
||||
this.tbItem.Name = "tbItem";
|
||||
this.tbItem.Size = new System.Drawing.Size(401, 21);
|
||||
this.tbItem.TabIndex = 2;
|
||||
//
|
||||
// btPDate
|
||||
//
|
||||
this.btPDate.DataBindings.Add(new System.Windows.Forms.Binding("Value", this.bs, "pdate", true));
|
||||
this.btPDate.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.btPDate.Location = new System.Drawing.Point(2, 25);
|
||||
this.btPDate.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.btPDate.Name = "btPDate";
|
||||
this.btPDate.Size = new System.Drawing.Size(254, 21);
|
||||
this.btPDate.TabIndex = 26;
|
||||
//
|
||||
// tableLayoutPanel1
|
||||
//
|
||||
this.tableLayoutPanel1.ColumnCount = 1;
|
||||
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 254F));
|
||||
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
|
||||
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
|
||||
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
|
||||
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
|
||||
this.tableLayoutPanel1.Controls.Add(pdateLabel, 0, 0);
|
||||
this.tableLayoutPanel1.Controls.Add(tolistLabel, 0, 2);
|
||||
this.tableLayoutPanel1.Controls.Add(bcclistLabel, 0, 6);
|
||||
this.tableLayoutPanel1.Controls.Add(this.btPDate, 0, 1);
|
||||
this.tableLayoutPanel1.Controls.Add(cclistLabel, 0, 4);
|
||||
this.tableLayoutPanel1.Controls.Add(this.lbTo, 0, 3);
|
||||
this.tableLayoutPanel1.Controls.Add(this.lbCC, 0, 5);
|
||||
this.tableLayoutPanel1.Controls.Add(this.lbBCC, 0, 7);
|
||||
this.tableLayoutPanel1.Location = new System.Drawing.Point(5, 5);
|
||||
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
|
||||
this.tableLayoutPanel1.Padding = new System.Windows.Forms.Padding(2);
|
||||
this.tableLayoutPanel1.RowCount = 8;
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.32999F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33001F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.34F));
|
||||
this.tableLayoutPanel1.Size = new System.Drawing.Size(258, 281);
|
||||
this.tableLayoutPanel1.TabIndex = 0;
|
||||
//
|
||||
// lbTo
|
||||
//
|
||||
this.lbTo.AutoSize = true;
|
||||
this.lbTo.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.lbTo.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "tolist", true));
|
||||
this.lbTo.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.lbTo.Location = new System.Drawing.Point(2, 78);
|
||||
this.lbTo.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.lbTo.Name = "lbTo";
|
||||
this.lbTo.Size = new System.Drawing.Size(254, 53);
|
||||
this.lbTo.TabIndex = 30;
|
||||
this.lbTo.Text = "--";
|
||||
this.lbTo.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// lbCC
|
||||
//
|
||||
this.lbCC.AutoSize = true;
|
||||
this.lbCC.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.lbCC.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "cclist", true));
|
||||
this.lbCC.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.lbCC.Location = new System.Drawing.Point(2, 151);
|
||||
this.lbCC.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.lbCC.Name = "lbCC";
|
||||
this.lbCC.Size = new System.Drawing.Size(254, 53);
|
||||
this.lbCC.TabIndex = 30;
|
||||
this.lbCC.Text = "--";
|
||||
this.lbCC.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// lbBCC
|
||||
//
|
||||
this.lbBCC.AutoSize = true;
|
||||
this.lbBCC.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.lbBCC.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "bcclist", true));
|
||||
this.lbBCC.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.lbBCC.Location = new System.Drawing.Point(2, 224);
|
||||
this.lbBCC.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.lbBCC.Name = "lbBCC";
|
||||
this.lbBCC.Size = new System.Drawing.Size(254, 55);
|
||||
this.lbBCC.TabIndex = 30;
|
||||
this.lbBCC.Text = "--";
|
||||
this.lbBCC.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// tbRemark
|
||||
//
|
||||
this.tbRemark.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.tbRemark.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.tbRemark.Html = resources.GetString("tbRemark.Html");
|
||||
this.tbRemark.Location = new System.Drawing.Point(329, 113);
|
||||
this.tbRemark.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.tbRemark.Name = "tbRemark";
|
||||
this.tbRemark.ReadOnly = false;
|
||||
this.tbRemark.ShowToolbar = true;
|
||||
this.tbRemark.Size = new System.Drawing.Size(403, 427);
|
||||
this.tbRemark.TabIndex = 14;
|
||||
//
|
||||
// tbQty
|
||||
//
|
||||
this.tbQty.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "qty", true));
|
||||
this.tbQty.Location = new System.Drawing.Point(522, 61);
|
||||
this.tbQty.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.tbQty.Name = "tbQty";
|
||||
this.tbQty.Size = new System.Drawing.Size(58, 21);
|
||||
this.tbQty.TabIndex = 8;
|
||||
this.tbQty.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
||||
//
|
||||
// tbSID
|
||||
//
|
||||
this.tbSID.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "sid", true));
|
||||
this.tbSID.Location = new System.Drawing.Point(615, 61);
|
||||
this.tbSID.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.tbSID.Name = "tbSID";
|
||||
this.tbSID.Size = new System.Drawing.Size(115, 21);
|
||||
this.tbSID.TabIndex = 10;
|
||||
this.tbSID.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
||||
//
|
||||
// tbURL
|
||||
//
|
||||
this.tbURL.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "url", true));
|
||||
this.tbURL.Location = new System.Drawing.Point(329, 87);
|
||||
this.tbURL.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.tbURL.Name = "tbURL";
|
||||
this.tbURL.Size = new System.Drawing.Size(401, 21);
|
||||
this.tbURL.TabIndex = 12;
|
||||
//
|
||||
// cmProject
|
||||
//
|
||||
this.cmProject.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue", this.bs, "project", true));
|
||||
this.cmProject.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.cmProject.FormattingEnabled = true;
|
||||
this.cmProject.Location = new System.Drawing.Point(329, 36);
|
||||
this.cmProject.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.cmProject.Name = "cmProject";
|
||||
this.cmProject.Size = new System.Drawing.Size(401, 20);
|
||||
this.cmProject.TabIndex = 4;
|
||||
//
|
||||
// btOK
|
||||
//
|
||||
this.btOK.Dock = System.Windows.Forms.DockStyle.Bottom;
|
||||
this.btOK.Location = new System.Drawing.Point(5, 569);
|
||||
this.btOK.Name = "btOK";
|
||||
this.btOK.Size = new System.Drawing.Size(730, 33);
|
||||
this.btOK.TabIndex = 29;
|
||||
this.btOK.Text = "OK";
|
||||
this.btOK.UseVisualStyleBackColor = true;
|
||||
this.btOK.Click += new System.EventHandler(this.button1_Click);
|
||||
//
|
||||
// tbModel
|
||||
//
|
||||
this.tbModel.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "model", true));
|
||||
this.tbModel.Location = new System.Drawing.Point(329, 61);
|
||||
this.tbModel.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.tbModel.Name = "tbModel";
|
||||
this.tbModel.Size = new System.Drawing.Size(161, 21);
|
||||
this.tbModel.TabIndex = 6;
|
||||
this.tbModel.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
||||
//
|
||||
// textBox1
|
||||
//
|
||||
this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "memo", true));
|
||||
this.textBox1.Location = new System.Drawing.Point(329, 545);
|
||||
this.textBox1.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.textBox1.Name = "textBox1";
|
||||
this.textBox1.Size = new System.Drawing.Size(403, 21);
|
||||
this.textBox1.TabIndex = 31;
|
||||
//
|
||||
// fRequestItem_Add
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(740, 607);
|
||||
this.Controls.Add(this.textBox1);
|
||||
this.Controls.Add(label6);
|
||||
this.Controls.Add(label5);
|
||||
this.Controls.Add(this.tbModel);
|
||||
this.Controls.Add(this.tableLayoutPanel1);
|
||||
this.Controls.Add(this.tbItem);
|
||||
this.Controls.Add(this.btOK);
|
||||
this.Controls.Add(titleLabel);
|
||||
this.Controls.Add(label4);
|
||||
this.Controls.Add(this.cmProject);
|
||||
this.Controls.Add(label1);
|
||||
this.Controls.Add(this.tbQty);
|
||||
this.Controls.Add(this.tbRemark);
|
||||
this.Controls.Add(remarkLabel);
|
||||
this.Controls.Add(label2);
|
||||
this.Controls.Add(this.tbSID);
|
||||
this.Controls.Add(this.tbURL);
|
||||
this.Controls.Add(label3);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
||||
this.MaximizeBox = false;
|
||||
this.MinimizeBox = false;
|
||||
this.Name = "fRequestItem_Add";
|
||||
this.Padding = new System.Windows.Forms.Padding(5);
|
||||
this.Text = "fRequestItem_Add";
|
||||
this.Load += new System.EventHandler(this.@__Load);
|
||||
((System.ComponentModel.ISupportInitialize)(this.dsMSSQL)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.bs)).EndInit();
|
||||
this.tableLayoutPanel1.ResumeLayout(false);
|
||||
this.tableLayoutPanel1.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private dsMSSQL dsMSSQL;
|
||||
private System.Windows.Forms.BindingSource bs;
|
||||
private dsMSSQLTableAdapters.RequestItemTableAdapter ta;
|
||||
private dsMSSQLTableAdapters.TableAdapterManager tam;
|
||||
public System.Windows.Forms.TextBox tbItem;
|
||||
public System.Windows.Forms.DateTimePicker btPDate;
|
||||
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
|
||||
private YARTE.UI.HtmlEditor tbRemark;
|
||||
private System.Windows.Forms.Button btOK;
|
||||
private System.Windows.Forms.Label lbTo;
|
||||
private System.Windows.Forms.Label lbCC;
|
||||
private System.Windows.Forms.Label lbBCC;
|
||||
public System.Windows.Forms.TextBox tbQty;
|
||||
public System.Windows.Forms.TextBox tbSID;
|
||||
private System.Windows.Forms.TextBox tbURL;
|
||||
private System.Windows.Forms.ComboBox cmProject;
|
||||
public System.Windows.Forms.TextBox tbModel;
|
||||
private System.Windows.Forms.TextBox textBox1;
|
||||
}
|
||||
}
|
||||
@@ -1,104 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using YARTE.UI.Buttons;
|
||||
|
||||
namespace FCM0000
|
||||
{
|
||||
public partial class fRequestItem_Add : FCOMMON.fBase
|
||||
{
|
||||
dsMSSQL.RequestItemRow dr = null;
|
||||
public fRequestItem_Add(dsMSSQL.RequestItemRow dr_)
|
||||
{
|
||||
InitializeComponent();
|
||||
Properties.Settings.Default["gwcs"] = FCOMMON.info.CS;
|
||||
dr = dr_;
|
||||
PredefinedButtonSets.SetupDefaultButtons(this.tbRemark);
|
||||
}
|
||||
|
||||
private void __Load(object sender, EventArgs e)
|
||||
{
|
||||
EnsureVisibleAndUsableSize();
|
||||
//프로젝트 리스트를 가져와서 cmb에 연결해준다.
|
||||
var projectDT = FCOMMON.DBM.getProjectData();
|
||||
this.cmProject.DataSource = projectDT;
|
||||
this.cmProject.DisplayMember = "KeyValue";
|
||||
this.cmProject.ValueMember = "Key";
|
||||
|
||||
|
||||
this.bs.DataSource = this.dr;
|
||||
if (this.dr.RowState == DataRowState.Detached)
|
||||
{
|
||||
//자로에서 불러와서 그 값을 가져온다.
|
||||
var taMF = new DSMailTableAdapters.MailFormTableAdapter();
|
||||
var data = taMF.GetByCate(FCOMMON.info.Login.gcode, "BY");
|
||||
if (data != null && data.Rows.Count > 0)
|
||||
{
|
||||
var drForm = data.Rows[0] as DSMail.MailFormRow;
|
||||
this.tbItem.Text = drForm.title;
|
||||
this.tbRemark.Html = drForm.body;
|
||||
|
||||
dr.tolist = drForm.tolist;
|
||||
dr.bcclist = drForm.bcc;
|
||||
dr.cclist = drForm.cc;
|
||||
dr.EndEdit();
|
||||
}
|
||||
}
|
||||
|
||||
if (this.dr.RowState != DataRowState.Deleted)
|
||||
{
|
||||
lbBCC.Text = dr.bcclist;
|
||||
lbCC.Text = dr.cclist;
|
||||
lbTo.Text = dr.tolist;
|
||||
tbRemark.Html = dr.remark;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void requestItemBindingNavigatorSaveItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.Validate();
|
||||
this.bs.EndEdit();
|
||||
DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
|
||||
}
|
||||
|
||||
private void button1_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (this.dr.cclist != lbCC.Text)
|
||||
this.dr.cclist = lbCC.Text;
|
||||
if (this.dr.tolist != lbTo.Text)
|
||||
this.dr.tolist = lbTo.Text;
|
||||
if (this.dr.bcclist != lbBCC.Text)
|
||||
this.dr.bcclist = lbBCC.Text;
|
||||
if (this.dr.remark != tbRemark.Html)
|
||||
this.dr.remark = tbRemark.Html;
|
||||
|
||||
this.Invalidate();
|
||||
this.bs.EndEdit();
|
||||
|
||||
DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
}
|
||||
|
||||
private void remarkLabel_Click(object sender, EventArgs e)
|
||||
{
|
||||
var dlg = FCOMMON.Util.MsgQ("메일 형식을 초기화 하시겠습니까?");
|
||||
if (dlg != System.Windows.Forms.DialogResult.Yes) return;
|
||||
|
||||
//자로에서 불러와서 그 값을 가져온다.
|
||||
var taMF = new DSMailTableAdapters.MailFormTableAdapter();
|
||||
var data = taMF.GetByCate( FCOMMON.info.Login.gcode, "BY");
|
||||
if (data != null && data.Rows.Count > 0)
|
||||
{
|
||||
var drForm = data.Rows[0] as DSMail.MailFormRow;
|
||||
this.tbRemark.Html = drForm.body;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,176 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="pdateLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="tolistLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="cclistLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="bcclistLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="titleLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="remarkLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="label1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="label2.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="label3.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="label4.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="label5.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="label6.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="dsMSSQL.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<metadata name="bs.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>122, 17</value>
|
||||
</metadata>
|
||||
<metadata name="ta.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>186, 17</value>
|
||||
</metadata>
|
||||
<metadata name="tam.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>248, 17</value>
|
||||
</metadata>
|
||||
<data name="tbRemark.Html" xml:space="preserve">
|
||||
<value><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
<HTML><HEAD>
|
||||
<META content="text/html; charset=unicode" http-equiv=Content-Type>
|
||||
<META name=GENERATOR content="MSHTML 11.00.10570.1001"></HEAD>
|
||||
<BODY></BODY></HTML>
|
||||
</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -106,8 +106,8 @@ namespace FCM0000
|
||||
//제목줄을 처리한다. 181029
|
||||
List<string> cols = new List<string>();
|
||||
|
||||
string sDate = sd.Value.ToShortDateString();
|
||||
string eDate = ed.Value.ToShortDateString();
|
||||
string sDate = sd.Value.ToString("yyyy-MM-dd");
|
||||
string eDate = ed.Value.ToString("yyyy-MM-dd");
|
||||
|
||||
for (int c = MinCol; c <= MaxCol; c++)
|
||||
{
|
||||
|
||||
@@ -127,12 +127,6 @@
|
||||
<Reference Include="WindowsBase" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Board\fPatchList.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Board\fPatchList.Designer.cs">
|
||||
<DependentUpon>fPatchList.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="DSMail.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
@@ -191,30 +185,6 @@
|
||||
<Compile Include="Mail\fJRForm.Designer.cs">
|
||||
<DependentUpon>fJRForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Mail\fMailList.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Mail\fMailList.Designer.cs">
|
||||
<DependentUpon>fMailList.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Mail\fSendMail.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Mail\fSendMail.Designer.cs">
|
||||
<DependentUpon>fSendMail.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Board\fRequestItem.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Board\fRequestItem.Designer.cs">
|
||||
<DependentUpon>fRequestItem.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Board\fRequestItem_Add.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Board\fRequestItem_Add.Designer.cs">
|
||||
<DependentUpon>fRequestItem_Add.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="DSInventory.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
@@ -388,9 +358,6 @@
|
||||
<Compile Include="MethodExtentions.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<EmbeddedResource Include="Board\fPatchList.resx">
|
||||
<DependentUpon>fPatchList.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="fSIDListSelect.resx">
|
||||
<DependentUpon>fSIDListSelect.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
@@ -409,18 +376,6 @@
|
||||
<EmbeddedResource Include="Mail\fJRForm.resx">
|
||||
<DependentUpon>fJRForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Mail\fMailList.resx">
|
||||
<DependentUpon>fMailList.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Mail\fSendMail.resx">
|
||||
<DependentUpon>fSendMail.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Board\fRequestItem.resx">
|
||||
<DependentUpon>fRequestItem.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Board\fRequestItem_Add.resx">
|
||||
<DependentUpon>fRequestItem_Add.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="fCode.resx">
|
||||
<DependentUpon>fCode.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace FCM0000.Inventory
|
||||
this.Show();
|
||||
Application.DoEvents();
|
||||
|
||||
this.tbDate.Text = DateTime.Now.ToShortDateString();
|
||||
this.tbDate.Text = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
this.reportViewer1.PageCountMode = Microsoft.Reporting.WinForms.PageCountMode.Actual;
|
||||
this.reportViewer1.ZoomMode = Microsoft.Reporting.WinForms.ZoomMode.PageWidth;
|
||||
refreshData();
|
||||
|
||||
@@ -112,8 +112,8 @@ namespace FCM0000
|
||||
}
|
||||
cmbUser.SelectedIndex = 0;//전체
|
||||
|
||||
dtED.Text = DateTime.Now.ToShortDateString();
|
||||
dtSD.Text = DateTime.Now.AddYears(-1).ToShortDateString();
|
||||
dtED.Text = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
dtSD.Text = DateTime.Now.AddYears(-1).ToString("yyyy-MM-dd");
|
||||
RefreshData();
|
||||
|
||||
}
|
||||
@@ -159,7 +159,7 @@ namespace FCM0000
|
||||
e.Row["wuid"] = FCOMMON.info.Login.no;
|
||||
e.Row["uid"] = FCOMMON.info.Login.no;
|
||||
e.Row["wdate"] = DateTime.Now;
|
||||
e.Row["pdate"] = DateTime.Now.ToShortDateString();
|
||||
e.Row["pdate"] = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
e.Row["cr_qty"] = 0;
|
||||
e.Row["cr_amt"] = 0;
|
||||
e.Row["dr_qty"] = 0;
|
||||
@@ -436,7 +436,7 @@ namespace FCM0000
|
||||
}
|
||||
|
||||
var newdr = this.dSInventory.vInventory.NewvInventoryRow();
|
||||
newdr.pdate = DateTime.Now.ToShortDateString();
|
||||
newdr.pdate = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
newdr.invtype = "입고";
|
||||
newdr.item = dr.item;
|
||||
//newdr.ItemArray = dr.ItemArray;
|
||||
@@ -473,7 +473,7 @@ namespace FCM0000
|
||||
}
|
||||
|
||||
var newdr = this.dSInventory.vInventory.NewvInventoryRow();
|
||||
newdr.pdate = DateTime.Now.ToShortDateString();
|
||||
newdr.pdate = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
newdr.invtype = "출고";
|
||||
newdr.item = dr.item;
|
||||
//newdr.ItemArray = dr.ItemArray;
|
||||
|
||||
@@ -62,7 +62,7 @@ namespace FCM0000
|
||||
|
||||
updateplace();
|
||||
|
||||
dtSD.Text = DateTime.Now.ToShortDateString();
|
||||
dtSD.Text = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
RefreshData();
|
||||
|
||||
}
|
||||
@@ -233,7 +233,7 @@ namespace FCM0000
|
||||
newdr.wuid = FCOMMON.info.Login.no;
|
||||
newdr.uid = FCOMMON.info.Login.no;
|
||||
newdr.wdate = DateTime.Now;
|
||||
newdr.pdate = DateTime.Now.ToShortDateString();
|
||||
newdr.pdate = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
newdr.cr_qty = 0;
|
||||
newdr.cr_amt = 0;
|
||||
newdr.dr_qty = 0;
|
||||
@@ -278,7 +278,7 @@ namespace FCM0000
|
||||
newdr.wuid = FCOMMON.info.Login.no;
|
||||
newdr.uid = FCOMMON.info.Login.no;
|
||||
newdr.wdate = DateTime.Now;
|
||||
newdr.pdate = DateTime.Now.ToShortDateString();
|
||||
newdr.pdate = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
newdr.cr_qty = 0;
|
||||
newdr.cr_amt = 0;
|
||||
newdr.dr_qty = 0;
|
||||
|
||||
@@ -70,7 +70,7 @@ namespace FCM0000.Inventory
|
||||
FCOMMON.Util.MsgE("품목을 먼저 선택하세요");
|
||||
return;
|
||||
}
|
||||
this.ta.FillByItemIdx(this.dSReport.jagosummaryPlace, FCOMMON.info.Login.gcode, DateTime.Now.ToShortDateString(), itmidx);
|
||||
this.ta.FillByItemIdx(this.dSReport.jagosummaryPlace, FCOMMON.info.Login.gcode, DateTime.Now.ToString("yyyy-MM-dd"), itmidx);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -361,7 +361,6 @@
|
||||
// tam
|
||||
//
|
||||
this.tam.BackupDataSetBeforeUpdate = false;
|
||||
this.tam.BoardTableAdapter = null;
|
||||
this.tam.CommonTableAdapter = null;
|
||||
this.tam.CustomsTableAdapter = null;
|
||||
this.tam.HolidayLIstTableAdapter = null;
|
||||
|
||||
@@ -75,10 +75,10 @@ namespace FCM0000
|
||||
|
||||
//마지막 자료를 가져온날을 찾는다.
|
||||
var dateList = FCOMMON.DBM.getDateList("InventoryUser", "uid='" + FCOMMON.info.Login.no + "'");
|
||||
dtED.Text = DateTime.Now.ToShortDateString();
|
||||
dtED.Text = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
|
||||
if (dateList.Count > 0) dtSD.Text = dateList[dateList.Count - 1];
|
||||
else dtSD.Text = DateTime.Now.AddDays(-7).ToShortDateString();
|
||||
else dtSD.Text = DateTime.Now.AddDays(-7).ToString("yyyy-MM-dd");
|
||||
|
||||
btSearch.PerformClick();
|
||||
|
||||
@@ -126,7 +126,7 @@ namespace FCM0000
|
||||
e.Row["wuid"] = FCOMMON.info.Login.no;
|
||||
e.Row["uid"] = FCOMMON.info.Login.no;
|
||||
e.Row["wdate"] = DateTime.Now;
|
||||
e.Row["pdate"] = DateTime.Now.ToShortDateString();
|
||||
e.Row["pdate"] = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
e.Row["dr_qty"] = 0;
|
||||
e.Row["dr_amt"] = 0;
|
||||
e.Row["invtype"] = "I1";
|
||||
|
||||
@@ -79,7 +79,7 @@ namespace FCM0000
|
||||
|
||||
|
||||
///입력된 데이터를 적용한다.
|
||||
if (dr.pdate == "") dr.pdate = DateTime.Now.ToShortDateString();
|
||||
if (dr.pdate == "") dr.pdate = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
dtPdate.Value = DateTime.Parse(dr.pdate);
|
||||
dtPdate.Value = DateTime.Parse(dr.pdate);
|
||||
// cmbRequest.Text = dr.userName;
|
||||
@@ -265,7 +265,7 @@ namespace FCM0000
|
||||
if (tbPumIDX.Text == "" || tbPumIDX.Text == "-1") dr.SetitemNull();
|
||||
else dr.item = int.Parse(tbPumIDX.Text);
|
||||
dr.sid = tbSID.Text.Trim();
|
||||
dr.pdate = this.dtPdate.Value.ToShortDateString();
|
||||
dr.pdate = this.dtPdate.Value.ToString("yyyy-MM-dd");
|
||||
dr.gcode = FCOMMON.info.Login.gcode;
|
||||
if (cmbRequest.Text.IndexOf("]") != -1)
|
||||
{
|
||||
|
||||
1
SubProject/FCM0000/Item/fItems.Designer.cs
generated
1
SubProject/FCM0000/Item/fItems.Designer.cs
generated
@@ -379,7 +379,6 @@
|
||||
// tam
|
||||
//
|
||||
this.tam.BackupDataSetBeforeUpdate = false;
|
||||
this.tam.BoardTableAdapter = null;
|
||||
this.tam.CommonTableAdapter = null;
|
||||
this.tam.CustomsTableAdapter = null;
|
||||
this.tam.EETGW_DocuFormTableAdapter = null;
|
||||
|
||||
1
SubProject/FCM0000/Item/fLovItem.Designer.cs
generated
1
SubProject/FCM0000/Item/fLovItem.Designer.cs
generated
@@ -451,7 +451,6 @@
|
||||
// tam
|
||||
//
|
||||
this.tam.BackupDataSetBeforeUpdate = false;
|
||||
this.tam.BoardTableAdapter = null;
|
||||
this.tam.CommonTableAdapter = null;
|
||||
this.tam.CustomsTableAdapter = null;
|
||||
this.tam.EETGW_DocuFormTableAdapter = null;
|
||||
|
||||
@@ -152,8 +152,8 @@ namespace FCM0000
|
||||
|
||||
this.dr.fromlist = tbFrom.Text.Trim();
|
||||
this.dr.enable = chkEnb.Checked;
|
||||
this.dr.sdate = dtSd.Value.ToShortDateString();
|
||||
this.dr.edate = dtEd.Value.ToShortDateString();
|
||||
this.dr.sdate = dtSd.Value.ToString("yyyy-MM-dd");
|
||||
this.dr.edate = dtEd.Value.ToString("yyyy-MM-dd");
|
||||
this.dr.stime = string.Format("{0}:{1}",cmbHour.Text,cmbMinute.Text);
|
||||
this.dr.tolist = tbTo.Text.Trim();
|
||||
this.dr.bcc = tbBcc.Text.Trim();
|
||||
|
||||
525
SubProject/FCM0000/Mail/fMailList.Designer.cs
generated
525
SubProject/FCM0000/Mail/fMailList.Designer.cs
generated
@@ -1,525 +0,0 @@
|
||||
namespace FCM0000.Mail
|
||||
{
|
||||
partial class fMailList
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new System.ComponentModel.Container();
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(fMailList));
|
||||
this.bn = new System.Windows.Forms.BindingNavigator(this.components);
|
||||
this.btAdd = new System.Windows.Forms.ToolStripButton();
|
||||
this.bs = new System.Windows.Forms.BindingSource(this.components);
|
||||
this.dSMail = new FCM0000.DSMail();
|
||||
this.bindingNavigatorCountItem = new System.Windows.Forms.ToolStripLabel();
|
||||
this.btDel = new System.Windows.Forms.ToolStripButton();
|
||||
this.bindingNavigatorMoveFirstItem = new System.Windows.Forms.ToolStripButton();
|
||||
this.bindingNavigatorMovePreviousItem = new System.Windows.Forms.ToolStripButton();
|
||||
this.bindingNavigatorSeparator = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.bindingNavigatorPositionItem = new System.Windows.Forms.ToolStripTextBox();
|
||||
this.bindingNavigatorSeparator1 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.bindingNavigatorMoveNextItem = new System.Windows.Forms.ToolStripButton();
|
||||
this.bindingNavigatorMoveLastItem = new System.Windows.Forms.ToolStripButton();
|
||||
this.bindingNavigatorSeparator2 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.btSave = new System.Windows.Forms.ToolStripButton();
|
||||
this.toolStripButton1 = new System.Windows.Forms.ToolStripButton();
|
||||
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.toolStripLabel1 = new System.Windows.Forms.ToolStripLabel();
|
||||
this.tbFind = new System.Windows.Forms.ToolStripTextBox();
|
||||
this.toolStripButton2 = new System.Windows.Forms.ToolStripButton();
|
||||
this.panel1 = new System.Windows.Forms.Panel();
|
||||
this.button1 = new System.Windows.Forms.Button();
|
||||
this.btRefresh = new System.Windows.Forms.Button();
|
||||
this.dtEd = new System.Windows.Forms.DateTimePicker();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.dtSd = new System.Windows.Forms.DateTimePicker();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.arDatagridView1 = new arCtl.arDatagridView();
|
||||
this.tam = new FCM0000.DSMailTableAdapters.TableAdapterManager();
|
||||
this.pdateDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.subjectDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.fromlistDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.tolistDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.ccDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.wuidDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.wdateDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.sendOKDataGridViewCheckBoxColumn = new System.Windows.Forms.DataGridViewCheckBoxColumn();
|
||||
this.suid = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.sdate = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.cateDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.SendMsg2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
((System.ComponentModel.ISupportInitialize)(this.bn)).BeginInit();
|
||||
this.bn.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.bs)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dSMail)).BeginInit();
|
||||
this.panel1.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.arDatagridView1)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// bn
|
||||
//
|
||||
this.bn.AddNewItem = this.btAdd;
|
||||
this.bn.BindingSource = this.bs;
|
||||
this.bn.CountItem = this.bindingNavigatorCountItem;
|
||||
this.bn.DeleteItem = this.btDel;
|
||||
this.bn.Dock = System.Windows.Forms.DockStyle.Bottom;
|
||||
this.bn.ImageScalingSize = new System.Drawing.Size(32, 32);
|
||||
this.bn.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.bindingNavigatorMoveFirstItem,
|
||||
this.bindingNavigatorMovePreviousItem,
|
||||
this.bindingNavigatorSeparator,
|
||||
this.bindingNavigatorPositionItem,
|
||||
this.bindingNavigatorCountItem,
|
||||
this.bindingNavigatorSeparator1,
|
||||
this.bindingNavigatorMoveNextItem,
|
||||
this.bindingNavigatorMoveLastItem,
|
||||
this.bindingNavigatorSeparator2,
|
||||
this.btAdd,
|
||||
this.btDel,
|
||||
this.btSave,
|
||||
this.toolStripButton1,
|
||||
this.toolStripSeparator1,
|
||||
this.toolStripLabel1,
|
||||
this.tbFind,
|
||||
this.toolStripButton2});
|
||||
this.bn.Location = new System.Drawing.Point(0, 514);
|
||||
this.bn.MoveFirstItem = this.bindingNavigatorMoveFirstItem;
|
||||
this.bn.MoveLastItem = this.bindingNavigatorMoveLastItem;
|
||||
this.bn.MoveNextItem = this.bindingNavigatorMoveNextItem;
|
||||
this.bn.MovePreviousItem = this.bindingNavigatorMovePreviousItem;
|
||||
this.bn.Name = "bn";
|
||||
this.bn.PositionItem = this.bindingNavigatorPositionItem;
|
||||
this.bn.Size = new System.Drawing.Size(855, 39);
|
||||
this.bn.TabIndex = 0;
|
||||
this.bn.Text = "bindingNavigator1";
|
||||
//
|
||||
// btAdd
|
||||
//
|
||||
this.btAdd.Image = ((System.Drawing.Image)(resources.GetObject("btAdd.Image")));
|
||||
this.btAdd.Name = "btAdd";
|
||||
this.btAdd.RightToLeftAutoMirrorImage = true;
|
||||
this.btAdd.Size = new System.Drawing.Size(79, 36);
|
||||
this.btAdd.Text = "테스트";
|
||||
this.btAdd.Click += new System.EventHandler(this.btAdd_Click);
|
||||
//
|
||||
// bs
|
||||
//
|
||||
this.bs.DataMember = "MailData";
|
||||
this.bs.DataSource = this.dSMail;
|
||||
this.bs.Sort = "wdate desc,pdate";
|
||||
//
|
||||
// dSMail
|
||||
//
|
||||
this.dSMail.DataSetName = "DSMail";
|
||||
this.dSMail.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
|
||||
//
|
||||
// bindingNavigatorCountItem
|
||||
//
|
||||
this.bindingNavigatorCountItem.Name = "bindingNavigatorCountItem";
|
||||
this.bindingNavigatorCountItem.Size = new System.Drawing.Size(27, 36);
|
||||
this.bindingNavigatorCountItem.Text = "/{0}";
|
||||
this.bindingNavigatorCountItem.ToolTipText = "전체 항목 수";
|
||||
//
|
||||
// btDel
|
||||
//
|
||||
this.btDel.Enabled = false;
|
||||
this.btDel.Image = ((System.Drawing.Image)(resources.GetObject("btDel.Image")));
|
||||
this.btDel.Name = "btDel";
|
||||
this.btDel.RightToLeftAutoMirrorImage = true;
|
||||
this.btDel.Size = new System.Drawing.Size(67, 36);
|
||||
this.btDel.Text = "삭제";
|
||||
//
|
||||
// bindingNavigatorMoveFirstItem
|
||||
//
|
||||
this.bindingNavigatorMoveFirstItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||
this.bindingNavigatorMoveFirstItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveFirstItem.Image")));
|
||||
this.bindingNavigatorMoveFirstItem.Name = "bindingNavigatorMoveFirstItem";
|
||||
this.bindingNavigatorMoveFirstItem.RightToLeftAutoMirrorImage = true;
|
||||
this.bindingNavigatorMoveFirstItem.Size = new System.Drawing.Size(36, 36);
|
||||
this.bindingNavigatorMoveFirstItem.Text = "처음으로 이동";
|
||||
//
|
||||
// bindingNavigatorMovePreviousItem
|
||||
//
|
||||
this.bindingNavigatorMovePreviousItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||
this.bindingNavigatorMovePreviousItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMovePreviousItem.Image")));
|
||||
this.bindingNavigatorMovePreviousItem.Name = "bindingNavigatorMovePreviousItem";
|
||||
this.bindingNavigatorMovePreviousItem.RightToLeftAutoMirrorImage = true;
|
||||
this.bindingNavigatorMovePreviousItem.Size = new System.Drawing.Size(36, 36);
|
||||
this.bindingNavigatorMovePreviousItem.Text = "이전으로 이동";
|
||||
//
|
||||
// bindingNavigatorSeparator
|
||||
//
|
||||
this.bindingNavigatorSeparator.Name = "bindingNavigatorSeparator";
|
||||
this.bindingNavigatorSeparator.Size = new System.Drawing.Size(6, 39);
|
||||
//
|
||||
// bindingNavigatorPositionItem
|
||||
//
|
||||
this.bindingNavigatorPositionItem.AccessibleName = "위치";
|
||||
this.bindingNavigatorPositionItem.AutoSize = false;
|
||||
this.bindingNavigatorPositionItem.Font = new System.Drawing.Font("맑은 고딕", 9F);
|
||||
this.bindingNavigatorPositionItem.Name = "bindingNavigatorPositionItem";
|
||||
this.bindingNavigatorPositionItem.Size = new System.Drawing.Size(50, 23);
|
||||
this.bindingNavigatorPositionItem.Text = "0";
|
||||
this.bindingNavigatorPositionItem.ToolTipText = "현재 위치";
|
||||
//
|
||||
// bindingNavigatorSeparator1
|
||||
//
|
||||
this.bindingNavigatorSeparator1.Name = "bindingNavigatorSeparator1";
|
||||
this.bindingNavigatorSeparator1.Size = new System.Drawing.Size(6, 39);
|
||||
//
|
||||
// bindingNavigatorMoveNextItem
|
||||
//
|
||||
this.bindingNavigatorMoveNextItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||
this.bindingNavigatorMoveNextItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveNextItem.Image")));
|
||||
this.bindingNavigatorMoveNextItem.Name = "bindingNavigatorMoveNextItem";
|
||||
this.bindingNavigatorMoveNextItem.RightToLeftAutoMirrorImage = true;
|
||||
this.bindingNavigatorMoveNextItem.Size = new System.Drawing.Size(36, 36);
|
||||
this.bindingNavigatorMoveNextItem.Text = "다음으로 이동";
|
||||
//
|
||||
// bindingNavigatorMoveLastItem
|
||||
//
|
||||
this.bindingNavigatorMoveLastItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||
this.bindingNavigatorMoveLastItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveLastItem.Image")));
|
||||
this.bindingNavigatorMoveLastItem.Name = "bindingNavigatorMoveLastItem";
|
||||
this.bindingNavigatorMoveLastItem.RightToLeftAutoMirrorImage = true;
|
||||
this.bindingNavigatorMoveLastItem.Size = new System.Drawing.Size(36, 36);
|
||||
this.bindingNavigatorMoveLastItem.Text = "마지막으로 이동";
|
||||
//
|
||||
// bindingNavigatorSeparator2
|
||||
//
|
||||
this.bindingNavigatorSeparator2.Name = "bindingNavigatorSeparator2";
|
||||
this.bindingNavigatorSeparator2.Size = new System.Drawing.Size(6, 39);
|
||||
//
|
||||
// btSave
|
||||
//
|
||||
this.btSave.Enabled = false;
|
||||
this.btSave.Image = ((System.Drawing.Image)(resources.GetObject("btSave.Image")));
|
||||
this.btSave.Name = "btSave";
|
||||
this.btSave.Size = new System.Drawing.Size(67, 36);
|
||||
this.btSave.Text = "저장";
|
||||
this.btSave.Click += new System.EventHandler(this.mailDataBindingNavigatorSaveItem_Click);
|
||||
//
|
||||
// toolStripButton1
|
||||
//
|
||||
this.toolStripButton1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
|
||||
this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image")));
|
||||
this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta;
|
||||
this.toolStripButton1.Name = "toolStripButton1";
|
||||
this.toolStripButton1.Size = new System.Drawing.Size(119, 36);
|
||||
this.toolStripButton1.Text = "목록 내보내기";
|
||||
this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click);
|
||||
//
|
||||
// toolStripSeparator1
|
||||
//
|
||||
this.toolStripSeparator1.Name = "toolStripSeparator1";
|
||||
this.toolStripSeparator1.Size = new System.Drawing.Size(6, 39);
|
||||
//
|
||||
// toolStripLabel1
|
||||
//
|
||||
this.toolStripLabel1.Name = "toolStripLabel1";
|
||||
this.toolStripLabel1.Size = new System.Drawing.Size(31, 36);
|
||||
this.toolStripLabel1.Text = "검색";
|
||||
//
|
||||
// tbFind
|
||||
//
|
||||
this.tbFind.Font = new System.Drawing.Font("맑은 고딕", 9F);
|
||||
this.tbFind.Name = "tbFind";
|
||||
this.tbFind.Size = new System.Drawing.Size(120, 39);
|
||||
this.tbFind.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tbFind_KeyDown_1);
|
||||
//
|
||||
// toolStripButton2
|
||||
//
|
||||
this.toolStripButton2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||
this.toolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton2.Image")));
|
||||
this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta;
|
||||
this.toolStripButton2.Name = "toolStripButton2";
|
||||
this.toolStripButton2.Size = new System.Drawing.Size(36, 36);
|
||||
this.toolStripButton2.Text = "toolStripButton2";
|
||||
this.toolStripButton2.Click += new System.EventHandler(this.toolStripButton2_Click);
|
||||
//
|
||||
// panel1
|
||||
//
|
||||
this.panel1.Controls.Add(this.button1);
|
||||
this.panel1.Controls.Add(this.btRefresh);
|
||||
this.panel1.Controls.Add(this.dtEd);
|
||||
this.panel1.Controls.Add(this.label2);
|
||||
this.panel1.Controls.Add(this.dtSd);
|
||||
this.panel1.Controls.Add(this.label1);
|
||||
this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.panel1.Location = new System.Drawing.Point(0, 0);
|
||||
this.panel1.Name = "panel1";
|
||||
this.panel1.Size = new System.Drawing.Size(855, 36);
|
||||
this.panel1.TabIndex = 3;
|
||||
//
|
||||
// button1
|
||||
//
|
||||
this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.button1.Location = new System.Drawing.Point(785, 7);
|
||||
this.button1.Name = "button1";
|
||||
this.button1.Size = new System.Drawing.Size(64, 21);
|
||||
this.button1.TabIndex = 5;
|
||||
this.button1.Text = "닫기";
|
||||
this.button1.UseVisualStyleBackColor = true;
|
||||
this.button1.Click += new System.EventHandler(this.button1_Click);
|
||||
//
|
||||
// btRefresh
|
||||
//
|
||||
this.btRefresh.Location = new System.Drawing.Point(482, 9);
|
||||
this.btRefresh.Name = "btRefresh";
|
||||
this.btRefresh.Size = new System.Drawing.Size(64, 21);
|
||||
this.btRefresh.TabIndex = 4;
|
||||
this.btRefresh.Text = "조회";
|
||||
this.btRefresh.UseVisualStyleBackColor = true;
|
||||
this.btRefresh.Click += new System.EventHandler(this.btRefresh_Click);
|
||||
//
|
||||
// dtEd
|
||||
//
|
||||
this.dtEd.Location = new System.Drawing.Point(273, 9);
|
||||
this.dtEd.Name = "dtEd";
|
||||
this.dtEd.Size = new System.Drawing.Size(200, 21);
|
||||
this.dtEd.TabIndex = 3;
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Location = new System.Drawing.Point(253, 13);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(14, 12);
|
||||
this.label2.TabIndex = 2;
|
||||
this.label2.Text = "~";
|
||||
//
|
||||
// dtSd
|
||||
//
|
||||
this.dtSd.Location = new System.Drawing.Point(45, 7);
|
||||
this.dtSd.Name = "dtSd";
|
||||
this.dtSd.Size = new System.Drawing.Size(200, 21);
|
||||
this.dtSd.TabIndex = 1;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(10, 12);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(29, 12);
|
||||
this.label1.TabIndex = 0;
|
||||
this.label1.Text = "기간";
|
||||
//
|
||||
// arDatagridView1
|
||||
//
|
||||
this.arDatagridView1.A_DelCurrentCell = true;
|
||||
this.arDatagridView1.A_EnterToTab = true;
|
||||
this.arDatagridView1.A_KoreanField = null;
|
||||
this.arDatagridView1.A_UpperField = null;
|
||||
this.arDatagridView1.A_ViewRownumOnHeader = true;
|
||||
this.arDatagridView1.AllowUserToAddRows = false;
|
||||
this.arDatagridView1.AllowUserToDeleteRows = false;
|
||||
this.arDatagridView1.AutoGenerateColumns = false;
|
||||
this.arDatagridView1.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||
this.arDatagridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
||||
this.arDatagridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
|
||||
this.pdateDataGridViewTextBoxColumn,
|
||||
this.subjectDataGridViewTextBoxColumn,
|
||||
this.fromlistDataGridViewTextBoxColumn,
|
||||
this.tolistDataGridViewTextBoxColumn,
|
||||
this.ccDataGridViewTextBoxColumn,
|
||||
this.wuidDataGridViewTextBoxColumn,
|
||||
this.wdateDataGridViewTextBoxColumn,
|
||||
this.sendOKDataGridViewCheckBoxColumn,
|
||||
this.suid,
|
||||
this.sdate,
|
||||
this.cateDataGridViewTextBoxColumn,
|
||||
this.SendMsg2});
|
||||
this.arDatagridView1.DataSource = this.bs;
|
||||
this.arDatagridView1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.arDatagridView1.Location = new System.Drawing.Point(0, 36);
|
||||
this.arDatagridView1.Name = "arDatagridView1";
|
||||
this.arDatagridView1.ReadOnly = true;
|
||||
this.arDatagridView1.RowTemplate.Height = 23;
|
||||
this.arDatagridView1.Size = new System.Drawing.Size(855, 478);
|
||||
this.arDatagridView1.TabIndex = 4;
|
||||
//
|
||||
// tam
|
||||
//
|
||||
this.tam.BackupDataSetBeforeUpdate = false;
|
||||
this.tam.Connection = null;
|
||||
this.tam.MailAutoTableAdapter = null;
|
||||
this.tam.MailDataTableAdapter = null;
|
||||
this.tam.MailFormTableAdapter = null;
|
||||
this.tam.UpdateOrder = FCM0000.DSMailTableAdapters.TableAdapterManager.UpdateOrderOption.InsertUpdateDelete;
|
||||
//
|
||||
// pdateDataGridViewTextBoxColumn
|
||||
//
|
||||
this.pdateDataGridViewTextBoxColumn.DataPropertyName = "pdate";
|
||||
this.pdateDataGridViewTextBoxColumn.HeaderText = "등록일";
|
||||
this.pdateDataGridViewTextBoxColumn.Name = "pdateDataGridViewTextBoxColumn";
|
||||
this.pdateDataGridViewTextBoxColumn.ReadOnly = true;
|
||||
//
|
||||
// subjectDataGridViewTextBoxColumn
|
||||
//
|
||||
this.subjectDataGridViewTextBoxColumn.DataPropertyName = "subject";
|
||||
this.subjectDataGridViewTextBoxColumn.HeaderText = "제목";
|
||||
this.subjectDataGridViewTextBoxColumn.Name = "subjectDataGridViewTextBoxColumn";
|
||||
this.subjectDataGridViewTextBoxColumn.ReadOnly = true;
|
||||
//
|
||||
// fromlistDataGridViewTextBoxColumn
|
||||
//
|
||||
this.fromlistDataGridViewTextBoxColumn.DataPropertyName = "fromlist";
|
||||
this.fromlistDataGridViewTextBoxColumn.HeaderText = "From";
|
||||
this.fromlistDataGridViewTextBoxColumn.Name = "fromlistDataGridViewTextBoxColumn";
|
||||
this.fromlistDataGridViewTextBoxColumn.ReadOnly = true;
|
||||
//
|
||||
// tolistDataGridViewTextBoxColumn
|
||||
//
|
||||
this.tolistDataGridViewTextBoxColumn.DataPropertyName = "tolist";
|
||||
this.tolistDataGridViewTextBoxColumn.HeaderText = "To";
|
||||
this.tolistDataGridViewTextBoxColumn.Name = "tolistDataGridViewTextBoxColumn";
|
||||
this.tolistDataGridViewTextBoxColumn.ReadOnly = true;
|
||||
//
|
||||
// ccDataGridViewTextBoxColumn
|
||||
//
|
||||
this.ccDataGridViewTextBoxColumn.DataPropertyName = "cc";
|
||||
this.ccDataGridViewTextBoxColumn.HeaderText = "CC";
|
||||
this.ccDataGridViewTextBoxColumn.Name = "ccDataGridViewTextBoxColumn";
|
||||
this.ccDataGridViewTextBoxColumn.ReadOnly = true;
|
||||
//
|
||||
// wuidDataGridViewTextBoxColumn
|
||||
//
|
||||
this.wuidDataGridViewTextBoxColumn.DataPropertyName = "wuid";
|
||||
this.wuidDataGridViewTextBoxColumn.HeaderText = "작성자";
|
||||
this.wuidDataGridViewTextBoxColumn.Name = "wuidDataGridViewTextBoxColumn";
|
||||
this.wuidDataGridViewTextBoxColumn.ReadOnly = true;
|
||||
//
|
||||
// wdateDataGridViewTextBoxColumn
|
||||
//
|
||||
this.wdateDataGridViewTextBoxColumn.DataPropertyName = "wdate";
|
||||
this.wdateDataGridViewTextBoxColumn.HeaderText = "작성일";
|
||||
this.wdateDataGridViewTextBoxColumn.Name = "wdateDataGridViewTextBoxColumn";
|
||||
this.wdateDataGridViewTextBoxColumn.ReadOnly = true;
|
||||
//
|
||||
// sendOKDataGridViewCheckBoxColumn
|
||||
//
|
||||
this.sendOKDataGridViewCheckBoxColumn.DataPropertyName = "SendOK2";
|
||||
this.sendOKDataGridViewCheckBoxColumn.HeaderText = "전송";
|
||||
this.sendOKDataGridViewCheckBoxColumn.Name = "sendOKDataGridViewCheckBoxColumn";
|
||||
this.sendOKDataGridViewCheckBoxColumn.ReadOnly = true;
|
||||
//
|
||||
// suid
|
||||
//
|
||||
this.suid.DataPropertyName = "suid2";
|
||||
this.suid.HeaderText = "전송자";
|
||||
this.suid.Name = "suid";
|
||||
this.suid.ReadOnly = true;
|
||||
//
|
||||
// sdate
|
||||
//
|
||||
this.sdate.DataPropertyName = "sdate2";
|
||||
this.sdate.HeaderText = "전송시간";
|
||||
this.sdate.Name = "sdate";
|
||||
this.sdate.ReadOnly = true;
|
||||
//
|
||||
// cateDataGridViewTextBoxColumn
|
||||
//
|
||||
this.cateDataGridViewTextBoxColumn.DataPropertyName = "cate";
|
||||
this.cateDataGridViewTextBoxColumn.HeaderText = "분류";
|
||||
this.cateDataGridViewTextBoxColumn.Name = "cateDataGridViewTextBoxColumn";
|
||||
this.cateDataGridViewTextBoxColumn.ReadOnly = true;
|
||||
//
|
||||
// SendMsg2
|
||||
//
|
||||
this.SendMsg2.DataPropertyName = "SendMsg2";
|
||||
this.SendMsg2.HeaderText = "Message";
|
||||
this.SendMsg2.Name = "SendMsg2";
|
||||
this.SendMsg2.ReadOnly = true;
|
||||
//
|
||||
// fMailList
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(855, 553);
|
||||
this.Controls.Add(this.arDatagridView1);
|
||||
this.Controls.Add(this.panel1);
|
||||
this.Controls.Add(this.bn);
|
||||
this.Name = "fMailList";
|
||||
this.Text = "메일 발신 내역";
|
||||
this.Load += new System.EventHandler(this.@__Load);
|
||||
((System.ComponentModel.ISupportInitialize)(this.bn)).EndInit();
|
||||
this.bn.ResumeLayout(false);
|
||||
this.bn.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.bs)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dSMail)).EndInit();
|
||||
this.panel1.ResumeLayout(false);
|
||||
this.panel1.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.arDatagridView1)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private DSMail dSMail;
|
||||
private System.Windows.Forms.BindingSource bs;
|
||||
private DSMailTableAdapters.TableAdapterManager tam;
|
||||
private System.Windows.Forms.BindingNavigator bn;
|
||||
private System.Windows.Forms.ToolStripButton btAdd;
|
||||
private System.Windows.Forms.ToolStripLabel bindingNavigatorCountItem;
|
||||
private System.Windows.Forms.ToolStripButton btDel;
|
||||
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveFirstItem;
|
||||
private System.Windows.Forms.ToolStripButton bindingNavigatorMovePreviousItem;
|
||||
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator;
|
||||
private System.Windows.Forms.ToolStripTextBox bindingNavigatorPositionItem;
|
||||
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator1;
|
||||
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveNextItem;
|
||||
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveLastItem;
|
||||
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator2;
|
||||
private System.Windows.Forms.ToolStripButton btSave;
|
||||
private System.Windows.Forms.Panel panel1;
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.DateTimePicker dtEd;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.DateTimePicker dtSd;
|
||||
private System.Windows.Forms.Button btRefresh;
|
||||
private System.Windows.Forms.Button button1;
|
||||
private arCtl.arDatagridView arDatagridView1;
|
||||
private System.Windows.Forms.ToolStripButton toolStripButton1;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
|
||||
private System.Windows.Forms.ToolStripLabel toolStripLabel1;
|
||||
private System.Windows.Forms.ToolStripTextBox tbFind;
|
||||
private System.Windows.Forms.ToolStripButton toolStripButton2;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn pdateDataGridViewTextBoxColumn;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn subjectDataGridViewTextBoxColumn;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn fromlistDataGridViewTextBoxColumn;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn tolistDataGridViewTextBoxColumn;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn ccDataGridViewTextBoxColumn;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn wuidDataGridViewTextBoxColumn;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn wdateDataGridViewTextBoxColumn;
|
||||
private System.Windows.Forms.DataGridViewCheckBoxColumn sendOKDataGridViewCheckBoxColumn;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn suid;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn sdate;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn cateDataGridViewTextBoxColumn;
|
||||
private System.Windows.Forms.DataGridViewTextBoxColumn SendMsg2;
|
||||
}
|
||||
}
|
||||
@@ -1,147 +0,0 @@
|
||||
using FCOMMON;
|
||||
using NetOffice.OutlookApi;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace FCM0000.Mail
|
||||
{
|
||||
public partial class fMailList : fBase
|
||||
{
|
||||
string fn_fpcolsize = "";
|
||||
public fMailList()
|
||||
{
|
||||
InitializeComponent();
|
||||
Properties.Settings.Default["gwcs"] = FCOMMON.info.CS;
|
||||
this.FormClosed += fAutoSendSetting_FormClosed;
|
||||
fn_fpcolsize = System.IO.Path.Combine(FCOMMON.Util.CurrentPath, "formSetting", "fp_" + this.Name + ".ini");
|
||||
}
|
||||
|
||||
void fAutoSendSetting_FormClosed(object sender, FormClosedEventArgs e)
|
||||
{
|
||||
//FCOMMON.Util.FPColsizeSave(this.fpSpread1, fn_fpcolsize);
|
||||
}
|
||||
private void mailDataBindingNavigatorSaveItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.Validate();
|
||||
this.bs.EndEdit();
|
||||
this.tam.UpdateAll(this.dSMail);
|
||||
|
||||
}
|
||||
private void __Load(object sender, EventArgs e)
|
||||
{
|
||||
EnsureVisibleAndUsableSize();
|
||||
this.dtEd.Value = DateTime.Now;
|
||||
this.dtSd.Value = DateTime.Now.AddDays(-10);
|
||||
refreshData();
|
||||
}
|
||||
|
||||
private void fillToolStripButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
void refreshData()
|
||||
{
|
||||
try
|
||||
{
|
||||
var ta = new DSMailTableAdapters.MailDataTableAdapter();
|
||||
ta.Fill(this.dSMail.MailData, FCOMMON.info.Login.gcode, dtSd.Value.ToShortDateString(), dtEd.Value.ToShortDateString(), "%");
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
System.Windows.Forms.MessageBox.Show(ex.Message);
|
||||
}
|
||||
this.arDatagridView1.AutoResizeColumns();
|
||||
// FCOMMON.Util.FPColSizeLoad(ref this.fpSpread1, fn_fpcolsize);
|
||||
}
|
||||
private void btRefresh_Click(object sender, EventArgs e)
|
||||
{
|
||||
refreshData();
|
||||
}
|
||||
|
||||
private void button1_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.Close();
|
||||
}
|
||||
|
||||
private void btFind_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
void find()
|
||||
{
|
||||
var txt = tbFind.Text.Trim();
|
||||
if (txt.isEmpty())
|
||||
{
|
||||
bs.Filter = "";
|
||||
tbFind.BackColor = Color.White;
|
||||
}
|
||||
else
|
||||
{
|
||||
var cols = new string[] { "subject", "fromlist", "tolist", "cate" };
|
||||
var where = string.Join(" like @ or ", cols) + " like @";
|
||||
where = where.Replace("@", $"'%{txt.Replace("'", "''")}%'");
|
||||
|
||||
try
|
||||
{
|
||||
bs.Filter = where;
|
||||
tbFind.BackColor = Color.Lime;
|
||||
}
|
||||
catch
|
||||
{
|
||||
bs.Filter = "";
|
||||
tbFind.BackColor = Color.HotPink;
|
||||
}
|
||||
|
||||
}
|
||||
tbFind.SelectAll();
|
||||
tbFind.Focus();
|
||||
|
||||
}
|
||||
|
||||
private void tbFind_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void button2_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void toolStripButton1_Click(object sender, EventArgs e)
|
||||
{
|
||||
var fn = "export_mail_data.csv";
|
||||
using (var sd = new SaveFileDialog() { FileName = fn, RestoreDirectory = true })
|
||||
{
|
||||
if (sd.ShowDialog() != DialogResult.OK) return;
|
||||
arDatagridView1.ExportData(sd.FileName);
|
||||
var dlg = Util.MsgQ("생성된 파일을 확인 할까요?");
|
||||
if (dlg == DialogResult.Yes) Util.RunExplorer(sd.FileName);
|
||||
}
|
||||
}
|
||||
|
||||
private void toolStripButton2_Click(object sender, EventArgs e)
|
||||
{
|
||||
find();
|
||||
}
|
||||
|
||||
private void tbFind_KeyDown_1(object sender, KeyEventArgs e)
|
||||
{
|
||||
if (e.KeyCode == Keys.Enter) find();
|
||||
}
|
||||
|
||||
private void btAdd_Click(object sender, EventArgs e)
|
||||
{
|
||||
using (var f = new fSendMail())
|
||||
f.ShowDialog();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,250 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="bn.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>245, 17</value>
|
||||
</metadata>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="btAdd.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
vQAADr0BR/uQrQAAAUpJREFUOE9jGLzg7gL2/7fmcf6/Oofr/8UZvP+hwsSD60CNfx41/v/zsOH/yckC
|
||||
pBtwfjov3ICDPSKkG3B8kiBQc93/Pw+q/u9oFydswKWZPP/PTuX7fxKo8Ui/0P993SJAzeX//94r+r++
|
||||
Qeb/qhq5/0srFf/PL1X+P6tIFdPAU0B//nlYD9RUC8SV///cKwHivP9/72b+/3sn+f/f23H//92MAOKQ
|
||||
/5NyNDENONQrDHbu3/ulQI0FQI3ZQI2pQI0J///digZqDPv/70bQ/3/X/f53peliGrCzXeL/lmap/+vA
|
||||
zpX/v6RC8f/fWzFAjeH/p+Zp/J+QpfW/O0P3f3uq/v/mREPCYTIb6E+Qc//dCPjfk6FDWAM6APnz3w1/
|
||||
IPb735qsT7oB3em6YP+CcH2cEekGtCQZ/G+IN/xfE2v8vzLahHQD6AQYGAAkI9iedfyIaQAAAABJRU5E
|
||||
rkJggg==
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="bs.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>179, 17</value>
|
||||
</metadata>
|
||||
<metadata name="dSMail.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>90, 17</value>
|
||||
</metadata>
|
||||
<data name="btDel.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
vQAADr0BR/uQrQAAAW9JREFUOE+1kE0ow2Ecx3dV3krt4oJaOSCTvIRkMqSxyITIzCQHDouEdnFwIOVC
|
||||
DrhIDiQl5UTiNG/z2ppafy1S2gX/uDwfY6i1v7Hie3nqeb7fz+/7/FR/Ilwn0G0Exw4fV5GJlXlEZxXC
|
||||
rIet9bAQvB5Ymgn2sLYAvSZEux7RUQFzE4qQt4bCXAYjPaHvnDoCkLpsRGMB2JqCTGLIijDlwqQ9bEMV
|
||||
i9OIytR3EMNWcJ/BWH8A6j8/bOGFxwXNxYEvGbMQ9XnQ1/K78KfY3/VXzkMY0qFGG2H4RoLGQshJQNbG
|
||||
86CNhdrsX9a/uQZTPhQl4rMY4OLofbl3aX7I8uwPC7y/g1YdjyVJuEvT8e1tfwUYteHUxCCfHChDeHmG
|
||||
QQvokjlOU+PbWA0x3pZnILVVI3uvQyHsbiLnqnGmRCF1NYD8pDhpRxOH7HQoAKZGkFKjceszQbpSrumX
|
||||
bO+G80MFwKUTxgfgcO/b8D9IpXoFiiMDHIQm0skAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="bindingNavigatorMoveFirstItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
vQAADr0BR/uQrQAAASpJREFUOE9jGDygcNbz/00Lnv/PnPj4P1QIA4S3P8Apx5A789n/VUfe/8elKL77
|
||||
wf/ghmu4DciY8vT/wn0fsCqK73n4f+n+///9qy/gNiCh58n/aVveYyiKaL8P1pw56/9/r9ITuA2I7Hr0
|
||||
v3f1BxRFoa33wJpb1wFt7/z73yX/AG4DApsf/q+b/w6uKLjl7v9Fe///7wBqzpjz879d3c//9hnbcRvg
|
||||
UXX/f/60NyiK7Ipv/0+f8/u/f9e3/zqF7/5bJKzHbYB96d3/2ZNfYyjSTzn/36ToxX+VrE//jSOX4TbA
|
||||
Iu/O/9T+11gVGSSd+C+b9vW/bvA83AYYZt3+H9byEqci/dTL/zV8p+E2QCftxn+/6od4Fal4TMBtgFPu
|
||||
lf8gBXgVDULAwAAA8HbAq6XlmnAAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="bindingNavigatorMovePreviousItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
vQAADr0BR/uQrQAAALZJREFUOE9jGDogvP3BfyiTdBDf/eB/cMM18gyI73n4f+n+///9qy+QbkBE+32w
|
||||
5sxZ//97lZ4gzYDQ1ntgza3rgLZ3/v3vkn+AeAOCW+7+X7T3//8OoOaMOT//29X9/G+fsZ00F9gV3/6f
|
||||
Puf3f/+ub/91Ct/9t0hYT3oY6Kec/29S9OK/Stan/8aRy0g3AAQMkk78l037+l83eB55BoCAfurl/xq+
|
||||
08g3AARUPCZQZsBgBQwMANAUYJgEulBVAAAAAElFTkSuQmCC
|
||||
</value>
|
||||
</data>
|
||||
<data name="bindingNavigatorMoveNextItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
vQAADr0BR/uQrQAAAKNJREFUOE9jGHygcNbz/1AmeSB35rP/Cd33yDckY8rT//P2//6f0HWHPEMSep78
|
||||
n73v1//OrX//u5VeJt2QyK5H/6ds+/W/ZOnf/wnT//63yT1LmiGBzQ//t659D9ZsXPLlv3T0tf/GkcuI
|
||||
N8Sj6v7/krnv4JoVXXpIc4F96d3/gS3PyNMMAhZ5d/7bFFwhTzMIGGbdJl8zCOik3SBf81AEDAwAoH5f
|
||||
oAc0QjgAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="bindingNavigatorMoveLastItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
vQAADr0BR/uQrQAAASxJREFUOE9jGFygcNbz/1AmBgDJNS14/j9z4mOcahhyZz77n9B9D6sCkNyqI+//
|
||||
h7c/wG1AxpSn/+ft//0/oesOhiKQ3MJ9H/4HN1zDbUBCz5P/s/f9+t+59e9/t9LLKApBctO2vP/vX30B
|
||||
twGRXY/+T9n263/J0r//E6b//W+TexauGCTXu/rDf6/SE7gNCGx++L917XuwZuOSL/+lo6/9N45cBtYA
|
||||
kqub/+6/S/4B3AZ4VN3/XzL3HVyzoksPXDFILn/am//2GdtxG2Bfevd/YMszDM0gAJLLnvz6v0XCetwG
|
||||
WOTd+W9TcAVDMwiA5FL7X8O9hBUYZt3GqhkEQHJhLS//6wbPw22ATtoNnJIgOb/qh/81fKfhNgAfcMq9
|
||||
8l/FYwIYQ4UGBWBgAAC+0b+zuQxOnAAAAABJRU5ErkJggg==
|
||||
</value>
|
||||
</data>
|
||||
<data name="btSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
vQAADr0BR/uQrQAAAExJREFUOE9joAr49u3bf1IxVCsEgAWC58Dxh/cf4RhZDETHTNiHaQgpBoAwzBCo
|
||||
dtINAGGiDUDGyGpoawAxeNSAQWkAORiqnRLAwAAA9EMMU8Daa3MAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="toolStripButton1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIESURBVFhH7ZXLK0RxFMfnD7GQlY2dmMkMTVnIu6QsyCsb
|
||||
pZTyTLaKGY0xxivlubCY8SwWFEqR8S6xkdyRVyhGKI75HXdu5vqpyT0/G/c7fere0+/c87m3+7tj0CMq
|
||||
pnZTbKItqY6EjpRo+bJ0MdnM+Ua7GbRi6bRCYrv5NN5ujpEvTRMqQe/BFKT3ZNFLUgluSJvg8/voJSkF
|
||||
LwKX9JLUguSSIgRJJUUJkkmKFPwqaWxLOklwpETJYyMPlWDv2gB49rxcOpYdYLJbgM2Sx0YeKsFI0AW1
|
||||
ogtq5f8KNs+1gGvVjaS5M5R6tadGqecPFoT18BAm2DjbDKEMrQ9jzepMhdvALdb89+dgcVi/9akRJsjY
|
||||
lnZQ5un1CZ+ic8WF5yzsBng9aoQKFo+Wwdv7GwqNbo7D9eMNHu+f7+O/BK9HjVBBxvzhAkqF8h78lY1X
|
||||
cNfyEC6Y05+nPEWWxaMl7rqfEC7YMNMkq31GuvdHtDlCCBVkItKdhGKh94/FueziruchVLBrpVtWAqid
|
||||
qgff2RYeB14CkNGbze1RI0wwzZ0JD8+PKHR8dYy7tnKiCs9ZPLtebp8aYYLe3UlZBaBuulGpb51tY41t
|
||||
nMLh4rAeHsIEi0ZKoWSsHPn6zUvvyVbqmX25YT08hAlSoQtqRRfUii6olV8JGm3JccHm1j8hOEseq4c4
|
||||
BsMH9in5LvAGb8kAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="toolStripButton2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAL1SURBVEhLtVZbTxNBFCZeYrxEjY8++KKiMfHFRAgvCv4H
|
||||
o/4Bn9RoDBETzcQgRmjLtrbQVuwFygKloZZud5dLJYZCdxce5NpCQMrFpLyYlKeSCFl7mmlizEB3YPsl
|
||||
XyY7e+b7MufMnN0yPfDC5D/52ui8/q6lpwZGeMav9Mf93t6jjE947hVkMTCeXI/OpLfHUlsqjPDsys0z
|
||||
nZFnCKEjeMnh0dQerPIOKJKS2tqZ/q2qe1FJZXbcvBT/0B6uwksPDsYnPgpP/lwnGe3FoLSwZmaFh1iC
|
||||
HgZ3+HZIWVwliRdjcGL5VxN7gJ1DTSG9JFGthLRT1xwOUrGaFqO8ktmBA4cltcHDSwMkMVp6eVnEksXx
|
||||
0tBxOhhLbJCEaAlXTfM9r238cu3b7OY2SYiW4kw6W9vovoql9wdq7bo3lsoQhWgZW8moyNpdjaX3R53x
|
||||
c/nAzGaWJERLcSqdrTO1XcHS+wMh5ymoDUmIln3x5BpVL4feSxKipUeUeSypDXD/oPeSxLRSTmX+mDv4
|
||||
J1hSG6DjuMTDdS6PII1Td67cgmNGT/9wv7xIFC3G0MTyBnWvfmqxnGjuCHFcfFb1RyfV8MQSUXwvwteJ
|
||||
6eYfYDltgBNt8H4VOWlWFZSEysXn1CZPKObi4hL0XpJRgVBTSK/BFarEctqAGM/53E5jEWkubwqj0R0a
|
||||
hAxAreDAuUVZgCsiTqez8AcCY1BKrkJPhoNEX1NT2wUry49G5Pm8KS/Nq80+boh0B2EOmgyyd1fDeOB/
|
||||
LmTtumjt4hWhYKrMq2Y2MopstjM4RH/UW7yXbX5+is8ZgimYmzvDk5ABHKI/Guy+G3b/4FzeML/ThGpj
|
||||
+SnIAA7RH+8dPbccgWiiYAq0B8QfyNx+CYfoj3pH5x1H3/DSf6aJ3OerHIfoj1cfnedaA9HFf03bgtHk
|
||||
G6v/Jg4pDd4yrsrAiLxbMHXldo4+sRX4denw2Ok8zvi4770j0q6zb2ihoYW9i1+VHmCOTN4KZPGdxVMl
|
||||
RlnZX9i+Wt0gvITgAAAAAElFTkSuQmCC
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="dSMail.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>90, 17</value>
|
||||
</metadata>
|
||||
<metadata name="suid.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="sdate.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="SendMsg2.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="tam.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
</root>
|
||||
295
SubProject/FCM0000/Mail/fSendMail.Designer.cs
generated
295
SubProject/FCM0000/Mail/fSendMail.Designer.cs
generated
@@ -1,295 +0,0 @@
|
||||
namespace FCM0000
|
||||
{
|
||||
partial class fSendMail
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new System.ComponentModel.Container();
|
||||
System.Windows.Forms.Label tolistLabel;
|
||||
System.Windows.Forms.Label bccLabel;
|
||||
System.Windows.Forms.Label ccLabel;
|
||||
System.Windows.Forms.Label subjectLabel;
|
||||
System.Windows.Forms.Label bodyLabel;
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(fSendMail));
|
||||
this.bn = new System.Windows.Forms.BindingNavigator(this.components);
|
||||
this.bs = new System.Windows.Forms.BindingSource(this.components);
|
||||
this.dsMSSQL = new FCM0000.DSMail();
|
||||
this.btSend = new System.Windows.Forms.ToolStripButton();
|
||||
this.btOUtlook = new System.Windows.Forms.ToolStripButton();
|
||||
this.panel1 = new System.Windows.Forms.Panel();
|
||||
this.tbBody = new YARTE.UI.HtmlEditor();
|
||||
this.tbTo = new System.Windows.Forms.TextBox();
|
||||
this.tbBCC = new System.Windows.Forms.TextBox();
|
||||
this.tbCC = new System.Windows.Forms.TextBox();
|
||||
this.tbSubject = new System.Windows.Forms.TextBox();
|
||||
this.tam = new FCM0000.DSMailTableAdapters.TableAdapterManager();
|
||||
this.ta = new FCM0000.DSMailTableAdapters.MailDataTableAdapter();
|
||||
this.toolStripButton1 = new System.Windows.Forms.ToolStripButton();
|
||||
tolistLabel = new System.Windows.Forms.Label();
|
||||
bccLabel = new System.Windows.Forms.Label();
|
||||
ccLabel = new System.Windows.Forms.Label();
|
||||
subjectLabel = new System.Windows.Forms.Label();
|
||||
bodyLabel = new System.Windows.Forms.Label();
|
||||
((System.ComponentModel.ISupportInitialize)(this.bn)).BeginInit();
|
||||
this.bn.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.bs)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dsMSSQL)).BeginInit();
|
||||
this.panel1.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// tolistLabel
|
||||
//
|
||||
tolistLabel.AutoSize = true;
|
||||
tolistLabel.Location = new System.Drawing.Point(30, 15);
|
||||
tolistLabel.Name = "tolistLabel";
|
||||
tolistLabel.Size = new System.Drawing.Size(35, 12);
|
||||
tolistLabel.TabIndex = 0;
|
||||
tolistLabel.Text = "tolist:";
|
||||
//
|
||||
// bccLabel
|
||||
//
|
||||
bccLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
bccLabel.AutoSize = true;
|
||||
bccLabel.Location = new System.Drawing.Point(35, 467);
|
||||
bccLabel.Name = "bccLabel";
|
||||
bccLabel.Size = new System.Drawing.Size(30, 12);
|
||||
bccLabel.TabIndex = 8;
|
||||
bccLabel.Text = "bcc:";
|
||||
//
|
||||
// ccLabel
|
||||
//
|
||||
ccLabel.AutoSize = true;
|
||||
ccLabel.Location = new System.Drawing.Point(42, 43);
|
||||
ccLabel.Name = "ccLabel";
|
||||
ccLabel.Size = new System.Drawing.Size(23, 12);
|
||||
ccLabel.TabIndex = 2;
|
||||
ccLabel.Text = "cc:";
|
||||
//
|
||||
// subjectLabel
|
||||
//
|
||||
subjectLabel.AutoSize = true;
|
||||
subjectLabel.Location = new System.Drawing.Point(15, 71);
|
||||
subjectLabel.Name = "subjectLabel";
|
||||
subjectLabel.Size = new System.Drawing.Size(50, 12);
|
||||
subjectLabel.TabIndex = 4;
|
||||
subjectLabel.Text = "subject:";
|
||||
//
|
||||
// bodyLabel
|
||||
//
|
||||
bodyLabel.AutoSize = true;
|
||||
bodyLabel.Location = new System.Drawing.Point(28, 97);
|
||||
bodyLabel.Name = "bodyLabel";
|
||||
bodyLabel.Size = new System.Drawing.Size(37, 12);
|
||||
bodyLabel.TabIndex = 6;
|
||||
bodyLabel.Text = "body:";
|
||||
//
|
||||
// bn
|
||||
//
|
||||
this.bn.AddNewItem = null;
|
||||
this.bn.BindingSource = this.bs;
|
||||
this.bn.CountItem = null;
|
||||
this.bn.DeleteItem = null;
|
||||
this.bn.Dock = System.Windows.Forms.DockStyle.Bottom;
|
||||
this.bn.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.btSend,
|
||||
this.btOUtlook,
|
||||
this.toolStripButton1});
|
||||
this.bn.Location = new System.Drawing.Point(0, 498);
|
||||
this.bn.MoveFirstItem = null;
|
||||
this.bn.MoveLastItem = null;
|
||||
this.bn.MoveNextItem = null;
|
||||
this.bn.MovePreviousItem = null;
|
||||
this.bn.Name = "bn";
|
||||
this.bn.PositionItem = null;
|
||||
this.bn.Size = new System.Drawing.Size(579, 25);
|
||||
this.bn.TabIndex = 0;
|
||||
this.bn.Text = "bindingNavigator1";
|
||||
//
|
||||
// bs
|
||||
//
|
||||
this.bs.DataMember = "MailData";
|
||||
this.bs.DataSource = this.dsMSSQL;
|
||||
//
|
||||
// dsMSSQL
|
||||
//
|
||||
this.dsMSSQL.DataSetName = "dsMSSQL";
|
||||
this.dsMSSQL.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
|
||||
//
|
||||
// btSend
|
||||
//
|
||||
this.btSend.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
|
||||
this.btSend.Image = ((System.Drawing.Image)(resources.GetObject("btSend.Image")));
|
||||
this.btSend.Name = "btSend";
|
||||
this.btSend.Size = new System.Drawing.Size(69, 22);
|
||||
this.btSend.Text = "Send(&S)";
|
||||
this.btSend.Click += new System.EventHandler(this.mailFormBindingNavigatorSaveItem_Click);
|
||||
//
|
||||
// btOUtlook
|
||||
//
|
||||
this.btOUtlook.Image = global::FCM0000.Properties.Resources.action_refresh;
|
||||
this.btOUtlook.ImageTransparentColor = System.Drawing.Color.Magenta;
|
||||
this.btOUtlook.Name = "btOUtlook";
|
||||
this.btOUtlook.Size = new System.Drawing.Size(90, 22);
|
||||
this.btOUtlook.Text = "To OutLook";
|
||||
this.btOUtlook.Click += new System.EventHandler(this.toolStripButton1_Click_1);
|
||||
//
|
||||
// panel1
|
||||
//
|
||||
this.panel1.Controls.Add(this.tbBody);
|
||||
this.panel1.Controls.Add(tolistLabel);
|
||||
this.panel1.Controls.Add(this.tbTo);
|
||||
this.panel1.Controls.Add(bccLabel);
|
||||
this.panel1.Controls.Add(this.tbBCC);
|
||||
this.panel1.Controls.Add(ccLabel);
|
||||
this.panel1.Controls.Add(this.tbCC);
|
||||
this.panel1.Controls.Add(subjectLabel);
|
||||
this.panel1.Controls.Add(this.tbSubject);
|
||||
this.panel1.Controls.Add(bodyLabel);
|
||||
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.panel1.Location = new System.Drawing.Point(0, 0);
|
||||
this.panel1.Name = "panel1";
|
||||
this.panel1.Size = new System.Drawing.Size(579, 498);
|
||||
this.panel1.TabIndex = 1;
|
||||
//
|
||||
// tbBody
|
||||
//
|
||||
this.tbBody.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.tbBody.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.tbBody.Html = "";
|
||||
this.tbBody.Location = new System.Drawing.Point(74, 97);
|
||||
this.tbBody.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
|
||||
this.tbBody.Name = "tbBody";
|
||||
this.tbBody.ReadOnly = false;
|
||||
this.tbBody.ShowToolbar = true;
|
||||
this.tbBody.Size = new System.Drawing.Size(493, 361);
|
||||
this.tbBody.TabIndex = 7;
|
||||
//
|
||||
// tbTo
|
||||
//
|
||||
this.tbTo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.tbTo.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "tolist", true));
|
||||
this.tbTo.Location = new System.Drawing.Point(74, 12);
|
||||
this.tbTo.Name = "tbTo";
|
||||
this.tbTo.Size = new System.Drawing.Size(493, 21);
|
||||
this.tbTo.TabIndex = 1;
|
||||
//
|
||||
// tbBCC
|
||||
//
|
||||
this.tbBCC.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.tbBCC.BackColor = System.Drawing.Color.SkyBlue;
|
||||
this.tbBCC.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "bcc", true));
|
||||
this.tbBCC.Location = new System.Drawing.Point(74, 464);
|
||||
this.tbBCC.Name = "tbBCC";
|
||||
this.tbBCC.Size = new System.Drawing.Size(493, 21);
|
||||
this.tbBCC.TabIndex = 9;
|
||||
//
|
||||
// tbCC
|
||||
//
|
||||
this.tbCC.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.tbCC.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "cc", true));
|
||||
this.tbCC.Location = new System.Drawing.Point(74, 40);
|
||||
this.tbCC.Name = "tbCC";
|
||||
this.tbCC.Size = new System.Drawing.Size(493, 21);
|
||||
this.tbCC.TabIndex = 3;
|
||||
//
|
||||
// tbSubject
|
||||
//
|
||||
this.tbSubject.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.tbSubject.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "subject", true));
|
||||
this.tbSubject.Location = new System.Drawing.Point(74, 68);
|
||||
this.tbSubject.Name = "tbSubject";
|
||||
this.tbSubject.Size = new System.Drawing.Size(493, 21);
|
||||
this.tbSubject.TabIndex = 5;
|
||||
//
|
||||
// tam
|
||||
//
|
||||
this.tam.BackupDataSetBeforeUpdate = false;
|
||||
this.tam.MailAutoTableAdapter = null;
|
||||
this.tam.MailDataTableAdapter = this.ta;
|
||||
this.tam.MailFormTableAdapter = null;
|
||||
this.tam.UpdateOrder = FCM0000.DSMailTableAdapters.TableAdapterManager.UpdateOrderOption.InsertUpdateDelete;
|
||||
//
|
||||
// ta
|
||||
//
|
||||
this.ta.ClearBeforeFill = true;
|
||||
//
|
||||
// toolStripButton1
|
||||
//
|
||||
this.toolStripButton1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
|
||||
this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image")));
|
||||
this.toolStripButton1.Name = "toolStripButton1";
|
||||
this.toolStripButton1.Size = new System.Drawing.Size(90, 22);
|
||||
this.toolStripButton1.Text = "Direct Send";
|
||||
this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click);
|
||||
//
|
||||
// fSendMail
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(579, 523);
|
||||
this.Controls.Add(this.panel1);
|
||||
this.Controls.Add(this.bn);
|
||||
this.Name = "fSendMail";
|
||||
this.Text = "Send Mail";
|
||||
this.Load += new System.EventHandler(this.fMailform_Load);
|
||||
((System.ComponentModel.ISupportInitialize)(this.bn)).EndInit();
|
||||
this.bn.ResumeLayout(false);
|
||||
this.bn.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.bs)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dsMSSQL)).EndInit();
|
||||
this.panel1.ResumeLayout(false);
|
||||
this.panel1.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private DSMail dsMSSQL;
|
||||
private System.Windows.Forms.BindingSource bs;
|
||||
private DSMailTableAdapters.TableAdapterManager tam;
|
||||
private System.Windows.Forms.BindingNavigator bn;
|
||||
private System.Windows.Forms.ToolStripButton btSend;
|
||||
private System.Windows.Forms.Panel panel1;
|
||||
private System.Windows.Forms.TextBox tbTo;
|
||||
private System.Windows.Forms.TextBox tbBCC;
|
||||
private System.Windows.Forms.TextBox tbCC;
|
||||
private System.Windows.Forms.TextBox tbSubject;
|
||||
private YARTE.UI.HtmlEditor tbBody;
|
||||
private DSMailTableAdapters.MailDataTableAdapter ta;
|
||||
private System.Windows.Forms.ToolStripButton btOUtlook;
|
||||
private System.Windows.Forms.ToolStripButton toolStripButton1;
|
||||
}
|
||||
}
|
||||
@@ -1,145 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using YARTE.UI.Buttons;
|
||||
using NetOffice;
|
||||
using Outlook = NetOffice.OutlookApi;
|
||||
using NetOffice.OutlookApi.Enums;
|
||||
using static System.Windows.Forms.VisualStyles.VisualStyleElement.Tab;
|
||||
|
||||
namespace FCM0000
|
||||
{
|
||||
public partial class fSendMail : FCOMMON.fBase
|
||||
{
|
||||
public fSendMail()
|
||||
{
|
||||
InitializeComponent();
|
||||
Properties.Settings.Default["gwcs"] = FCOMMON.info.CS;
|
||||
PredefinedButtonSets.SetupDefaultButtons(this.tbBody);
|
||||
this.dsMSSQL.MailData.TableNewRow += MailForm_TableNewRow;
|
||||
|
||||
|
||||
}
|
||||
|
||||
void MailForm_TableNewRow(object sender, DataTableNewRowEventArgs e)
|
||||
{
|
||||
e.Row["gcode"] = FCOMMON.info.Login.gcode;
|
||||
e.Row["wuid"] = FCOMMON.info.Login.no;
|
||||
e.Row["wdate"] = DateTime.Now;
|
||||
e.Row["cate"] = "NR";
|
||||
e.Row["pdate"] = DateTime.Now.ToShortDateString();
|
||||
e.Row["fromlist"] = "gw@amkor.co.kr";
|
||||
}
|
||||
|
||||
private void fMailform_Load(object sender, EventArgs e)
|
||||
{
|
||||
EnsureVisibleAndUsableSize();
|
||||
this.bs.AddNew(); //신규메일데이터생성
|
||||
LoadNRData();
|
||||
}
|
||||
|
||||
|
||||
void LoadNRData()
|
||||
{
|
||||
//자로에서 불러와서 그 값을 가져온다.
|
||||
var taMF = new DSMailTableAdapters.MailFormTableAdapter();
|
||||
var data = taMF.GetByCate(FCOMMON.info.Login.gcode, "NR");
|
||||
if (data != null && data.Rows.Count > 0)
|
||||
{
|
||||
var drForm = data.Rows[0] as DSMail.MailFormRow;
|
||||
this.tbSubject.Text = drForm.subject;
|
||||
this.tbBody.Html = drForm.body;
|
||||
this.tbTo.Text = drForm.tolist;
|
||||
//this.tbBCC.Text = drForm.bcc;
|
||||
//this.tbCC.Text = drForm.cc;
|
||||
}
|
||||
}
|
||||
|
||||
private void mailFormBindingNavigatorSaveItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.Validate();
|
||||
var drv = this.bs.Current as DataRowView;
|
||||
|
||||
drv["subject"] = this.tbSubject.Text;
|
||||
drv["body"] = this.tbBody.Html;
|
||||
drv.EndEdit();
|
||||
this.bs.EndEdit();
|
||||
var cnt = this.tam.UpdateAll(this.dsMSSQL);
|
||||
MessageBox.Show($"{cnt}");
|
||||
|
||||
this.bs.AddNew();
|
||||
tbTo.Text = FCOMMON.info.Login.email;
|
||||
}
|
||||
|
||||
private void toolStripButton1_Click_1(object sender, EventArgs e)
|
||||
{
|
||||
var drv = this.bs.Current as DataRowView;
|
||||
if (drv == null) return;
|
||||
|
||||
var dr = drv.Row as DSMail.MailFormRow;
|
||||
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 = this.tbSubject.Text.Trim(); // dr.title;
|
||||
newMail.To = to;
|
||||
newMail.CC = tbCC.Text.Trim();
|
||||
newMail.BCC = tbBCC.Text.Trim();
|
||||
// newMail.BodyFormat = OlBodyFormat.olFormatHTML;
|
||||
newMail.HTMLBody = this.tbBody.Html
|
||||
.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}", tbSubject.Text) + newMail.HTMLBody;
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void toolStripButton1_Click(object sender, EventArgs e)
|
||||
{
|
||||
//direct send
|
||||
var list_from = "gw@amkor.co.kr";
|
||||
var list_to = tbTo.Text;
|
||||
var subject = tbSubject.Text;
|
||||
var body = tbBody.Html;
|
||||
var list_bcc = tbBCC.Text;
|
||||
var list_cc = tbCC.Text;
|
||||
|
||||
//전송을 해야 함
|
||||
var mc = new System.Net.Mail.SmtpClient(FCOMMON.info.mailserver);
|
||||
var msg = new System.Net.Mail.MailMessage
|
||||
(list_from,
|
||||
list_to,
|
||||
subject,
|
||||
body);
|
||||
|
||||
if (list_bcc != "") msg.Bcc.Add(list_bcc);
|
||||
if (list_cc != "") msg.CC.Add(list_cc);
|
||||
msg.IsBodyHtml = true;
|
||||
|
||||
try
|
||||
{
|
||||
mc.Send(msg);
|
||||
MessageBox.Show("ok");
|
||||
}
|
||||
catch (Exception eX)
|
||||
{
|
||||
MessageBox.Show(eX.Message);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,168 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="tolistLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="bccLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="ccLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="subjectLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="bodyLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="bn.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>259, 17</value>
|
||||
</metadata>
|
||||
<metadata name="bs.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>122, 17</value>
|
||||
</metadata>
|
||||
<metadata name="dsMSSQL.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="btSend.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
wgAADsIBFShKgAAAAExJREFUOE9joAr49u3bf1IxVCsEgAWC58Dxh/cf4RhZDETHTNiHaQgpBoAwzBCo
|
||||
dtINAGGiDUDGyGpoawAxeNSAQWkAORiqnRLAwAAA9EMMU8Daa3MAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="toolStripButton1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
wQAADsEBuJFr7QAAAExJREFUOE9joAr49u3bf1IxVCsEgAWC58Dxh/cf4RhZDETHTNiHaQgpBoAwzBCo
|
||||
dtINAGGiDUDGyGpoawAxeNSAQWkAORiqnRLAwAAA9EMMU8Daa3MAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="dsMSSQL.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<metadata name="tam.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>186, 17</value>
|
||||
</metadata>
|
||||
<metadata name="ta.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>325, 17</value>
|
||||
</metadata>
|
||||
</root>
|
||||
4174
SubProject/FCM0000/dsMSSQL.Designer.cs
generated
4174
SubProject/FCM0000/dsMSSQL.Designer.cs
generated
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -4,19 +4,18 @@
|
||||
Changes to this file may cause incorrect behavior and will be lost if
|
||||
the code is regenerated.
|
||||
</autogenerated>-->
|
||||
<DiagramLayout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ex:showrelationlabel="False" ViewPortX="-10" ViewPortY="-12" xmlns:ex="urn:schemas-microsoft-com:xml-msdatasource-layout-extended" xmlns="urn:schemas-microsoft-com:xml-msdatasource-layout">
|
||||
<DiagramLayout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ex:showrelationlabel="False" ViewPortX="185" ViewPortY="-12" xmlns:ex="urn:schemas-microsoft-com:xml-msdatasource-layout-extended" xmlns="urn:schemas-microsoft-com:xml-msdatasource-layout">
|
||||
<Shapes>
|
||||
<Shape ID="DesignTable:Items" ZOrder="3" X="48" Y="30" Height="590" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="387" />
|
||||
<Shape ID="DesignTable:Common" ZOrder="4" X="443" Y="45" Height="267" Width="211" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="216" />
|
||||
<Shape ID="DesignTable:Board" ZOrder="1" X="937" Y="65" Height="438" Width="179" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="370" />
|
||||
<Shape ID="DesignTable:RequestItem" ZOrder="11" X="1499" Y="70" Height="324" Width="219" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:Customs" ZOrder="10" X="1788" Y="70" Height="362" Width="263" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:Staff" ZOrder="9" X="2121" Y="70" Height="286" Width="172" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="235" />
|
||||
<Shape ID="DesignTable:Purchase" ZOrder="8" X="2357" Y="30" Height="664" Width="245" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="556" />
|
||||
<Shape ID="DesignTable:Projects" ZOrder="7" X="2672" Y="70" Height="628" Width="246" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="541" />
|
||||
<Shape ID="DesignTable:HolidayLIst" ZOrder="6" X="2988" Y="70" Height="191" Width="210" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="140" />
|
||||
<Shape ID="DesignTable:InventoryUser" ZOrder="5" X="3268" Y="70" Height="343" Width="278" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:EETGW_DocuForm" ZOrder="2" X="747" Y="396" Height="210" Width="253" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="159" />
|
||||
<Shape ID="DesignTable:Items" ZOrder="2" X="48" Y="30" Height="590" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="387" />
|
||||
<Shape ID="DesignTable:Common" ZOrder="3" X="443" Y="45" Height="267" Width="211" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="216" />
|
||||
<Shape ID="DesignTable:RequestItem" ZOrder="10" X="1499" Y="70" Height="324" Width="219" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:Customs" ZOrder="9" X="1788" Y="70" Height="362" Width="263" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:Staff" ZOrder="8" X="2121" Y="70" Height="286" Width="172" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="235" />
|
||||
<Shape ID="DesignTable:Purchase" ZOrder="7" X="2357" Y="30" Height="664" Width="245" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="556" />
|
||||
<Shape ID="DesignTable:Projects" ZOrder="6" X="2672" Y="70" Height="628" Width="246" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="541" />
|
||||
<Shape ID="DesignTable:HolidayLIst" ZOrder="5" X="2988" Y="70" Height="191" Width="210" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="140" />
|
||||
<Shape ID="DesignTable:InventoryUser" ZOrder="4" X="3268" Y="70" Height="343" Width="278" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
|
||||
<Shape ID="DesignTable:EETGW_DocuForm" ZOrder="1" X="747" Y="396" Height="210" Width="253" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="159" />
|
||||
</Shapes>
|
||||
<Connectors />
|
||||
</DiagramLayout>
|
||||
1
SubProject/FCM0000/fCode.Designer.cs
generated
1
SubProject/FCM0000/fCode.Designer.cs
generated
@@ -377,7 +377,6 @@
|
||||
// tam
|
||||
//
|
||||
this.tam.BackupDataSetBeforeUpdate = false;
|
||||
this.tam.BoardTableAdapter = null;
|
||||
this.tam.CommonTableAdapter = this.ta;
|
||||
this.tam.CustomsTableAdapter = null;
|
||||
this.tam.EETGW_DocuFormTableAdapter = null;
|
||||
|
||||
1
SubProject/FCM0000/fCustoms.Designer.cs
generated
1
SubProject/FCM0000/fCustoms.Designer.cs
generated
@@ -134,7 +134,6 @@
|
||||
// tam
|
||||
//
|
||||
this.tam.BackupDataSetBeforeUpdate = false;
|
||||
this.tam.BoardTableAdapter = null;
|
||||
this.tam.CommonTableAdapter = null;
|
||||
this.tam.CustomsTableAdapter = this.ta;
|
||||
this.tam.HolidayLIstTableAdapter = null;
|
||||
|
||||
@@ -53,7 +53,7 @@ namespace FCM0000
|
||||
var newdr = this.dsMSSQL.HolidayLIst.NewHolidayLIstRow();
|
||||
newdr.wuid = FCOMMON.info.Login.no;
|
||||
newdr.wdate = DateTime.Now;
|
||||
newdr.pdate = dayvalue.ToShortDateString();// textBox1.Text.Trim() + "-" + i.ToString("00");
|
||||
newdr.pdate = dayvalue.ToString("yyyy-MM-dd");// textBox1.Text.Trim() + "-" + i.ToString("00");
|
||||
if (dayvalue.DayOfWeek == DayOfWeek.Saturday )
|
||||
{
|
||||
newdr.free = true;
|
||||
|
||||
1
SubProject/FCM0000/fLovProject.Designer.cs
generated
1
SubProject/FCM0000/fLovProject.Designer.cs
generated
@@ -405,7 +405,6 @@
|
||||
// tam
|
||||
//
|
||||
this.tam.BackupDataSetBeforeUpdate = false;
|
||||
this.tam.BoardTableAdapter = null;
|
||||
this.tam.CommonTableAdapter = null;
|
||||
this.tam.CustomsTableAdapter = null;
|
||||
this.tam.EETGW_DocuFormTableAdapter = null;
|
||||
|
||||
@@ -37,7 +37,7 @@ namespace FCOMMON
|
||||
|
||||
var cmd = new System.Data.SqlClient.SqlCommand(sql1, cn);
|
||||
cmd.Parameters.Add("gcode", SqlDbType.VarChar).Value = gcode;
|
||||
cmd.Parameters.Add("date", SqlDbType.VarChar).Value = DateTime.Now.AddYears(-1).ToShortDateString();
|
||||
cmd.Parameters.Add("date", SqlDbType.VarChar).Value = DateTime.Now.AddYears(-1).ToString("yyyy-MM-dd");
|
||||
cnt1 = (int)cmd.ExecuteScalar();
|
||||
cmd.CommandText = sql2;
|
||||
cnt2 = (int)cmd.ExecuteScalar();
|
||||
@@ -115,9 +115,9 @@ namespace FCOMMON
|
||||
|
||||
|
||||
|
||||
var sql = "select gcode,id,level,isnull(Process,'') as Process ,isnull(name,'') as name,isnull(useUserState,0) as useAccount,isnull(useJobReport,0) as useJobReport "+
|
||||
" from vGroupUser where "+
|
||||
" gcode = @gcode "+
|
||||
var sql = "select gcode,id,level,isnull(Process,'') as Process ,isnull(name,'') as name,isnull(useUserState,0) as useAccount,isnull(useJobReport,0) as useJobReport " +
|
||||
" from vGroupUser where " +
|
||||
" gcode = @gcode " +
|
||||
" and id = @uid";
|
||||
var cmd = new System.Data.SqlClient.SqlCommand(sql, cn);
|
||||
cmd.Parameters.Add("gcode", SqlDbType.VarChar).Value = gcode;
|
||||
@@ -167,7 +167,8 @@ namespace FCOMMON
|
||||
var cnt = 0;
|
||||
while (rdr.Read())
|
||||
{
|
||||
retval.Add(new GroupUserModel {
|
||||
retval.Add(new GroupUserModel
|
||||
{
|
||||
Gcode = rdr["gcode"].ToString(),
|
||||
uid = rdr["id"].ToString(),
|
||||
level = int.Parse(rdr["level"]?.ToString() ?? "0"),
|
||||
@@ -1154,7 +1155,7 @@ namespace FCOMMON
|
||||
|
||||
public static Boolean InsertLog(string cate, string remark, string pdate = "")
|
||||
{
|
||||
if (String.IsNullOrEmpty(pdate)) pdate = DateTime.Now.ToShortDateString();
|
||||
if (String.IsNullOrEmpty(pdate)) pdate = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
|
||||
try
|
||||
{
|
||||
@@ -1572,6 +1573,50 @@ namespace FCOMMON
|
||||
return currentusername;
|
||||
}
|
||||
|
||||
public static bool GetUserGroupUseNR()
|
||||
{
|
||||
var cn = getCn();
|
||||
cn.Open();
|
||||
|
||||
int retval = 0;
|
||||
var cmd2 = new SqlCommand($"select isnull(usenr,1) from UserGroup where gcode = '{FCOMMON.info.Login.gcode}'", cn);
|
||||
try
|
||||
{
|
||||
var value = cmd2.ExecuteScalar();
|
||||
retval = value.ToString().ToLower() == "true" ? 1 : 0;
|
||||
//if (int.TryParse(value.ToString(), out retval))
|
||||
//{
|
||||
|
||||
//}
|
||||
//else retval = 0;
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
}
|
||||
return retval > 0;
|
||||
}
|
||||
public static bool SetUserGroupUseNR(bool a)
|
||||
{
|
||||
var cn = getCn();
|
||||
cn.Open();
|
||||
|
||||
var value = a ? 1 : 0;
|
||||
int retval = 0;
|
||||
var cmd2 = new SqlCommand($"update UserGroup set usenr = {value} where gcode = '{FCOMMON.info.Login.gcode}'", cn);
|
||||
try
|
||||
{
|
||||
retval = cmd2.ExecuteNonQuery();
|
||||
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
|
||||
}
|
||||
return retval == 1;
|
||||
}
|
||||
|
||||
public static int addItem(string pumname, string sid, string model, decimal price, string supply, int supplyidx = -1, byte[] pic = null)
|
||||
{
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user