업무일지 프로젝트 선택 시 이전 기록 기반 기본값 자동 설정 기능 추가
- MachineBridge에 Jobreport_GetLastByProject API 추가 (pidx 또는 projectName 기반 마지막 업무일지 조회) - WebSocket 서버에 JOBREPORT_GET_LAST_BY_PROJECT 핸들러 추가 - communication.ts에 getLastJobReportByProject 메서드 추가 - JobreportEditModal에서 프로젝트 선택 시 자동으로 이전 기록의 요청부서, 패키지, 업무형태, 공정, 상태 값을 기본값으로 설정 - 윈폼(fJobReport_Add.cs)의 동일한 로직을 웹앱에 구현
This commit is contained in:
@@ -432,6 +432,80 @@ namespace Project.Web
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 특정 프로젝트의 마지막 업무일지 조회 (프로젝트 선택 시 기본값 설정용)
|
||||||
|
/// </summary>
|
||||||
|
public string Jobreport_GetLastByProject(int pidx, string projectName)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var currentUserId = info.Login.no;
|
||||||
|
var sql = "";
|
||||||
|
|
||||||
|
if (pidx > 0)
|
||||||
|
{
|
||||||
|
// pidx로 조회
|
||||||
|
sql = @"SELECT TOP 1 requestpart, package, type, jobgrp, process, status
|
||||||
|
FROM JobReport WITH (nolock)
|
||||||
|
WHERE gcode = @gcode AND uid = @uid AND ISNULL(pidx, -1) = @pidx
|
||||||
|
ORDER BY pdate DESC, idx DESC";
|
||||||
|
}
|
||||||
|
else if (!string.IsNullOrEmpty(projectName))
|
||||||
|
{
|
||||||
|
// projectName으로 조회
|
||||||
|
sql = @"SELECT TOP 1 requestpart, package, type, jobgrp, process, status
|
||||||
|
FROM JobReport WITH (nolock)
|
||||||
|
WHERE gcode = @gcode AND uid = @uid AND ISNULL(projectName, '') LIKE @projectName
|
||||||
|
ORDER BY pdate DESC, idx DESC";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return JsonConvert.SerializeObject(new { Success = false, Message = "프로젝트 정보가 없습니다." });
|
||||||
|
}
|
||||||
|
|
||||||
|
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("@uid", currentUserId);
|
||||||
|
if (pidx > 0)
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("@pidx", pidx);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("@projectName", projectName);
|
||||||
|
}
|
||||||
|
|
||||||
|
using (var da = new SqlDataAdapter(cmd))
|
||||||
|
{
|
||||||
|
var dt = new DataTable();
|
||||||
|
da.Fill(dt);
|
||||||
|
|
||||||
|
if (dt.Rows.Count > 0)
|
||||||
|
{
|
||||||
|
var row = dt.Rows[0];
|
||||||
|
var data = new Dictionary<string, object>();
|
||||||
|
foreach (DataColumn col in dt.Columns)
|
||||||
|
{
|
||||||
|
data[col.ColumnName] = row[col] == DBNull.Value ? null : row[col];
|
||||||
|
}
|
||||||
|
return JsonConvert.SerializeObject(new { Success = true, Data = data });
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return JsonConvert.SerializeObject(new { Success = false, Message = "이전 기록이 없습니다." });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -696,6 +696,16 @@ namespace Project.Web
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "JOBREPORT_GET_LAST_BY_PROJECT":
|
||||||
|
{
|
||||||
|
int pidx = json.pidx ?? -1;
|
||||||
|
string projectName = json.projectName ?? "";
|
||||||
|
string result = _bridge.Jobreport_GetLastByProject(pidx, projectName);
|
||||||
|
var response = new { type = "JOBREPORT_LAST_BY_PROJECT", data = JsonConvert.DeserializeObject(result) };
|
||||||
|
await Send(socket, JsonConvert.SerializeObject(response));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case "JOBREPORT_GET_JOBTYPES":
|
case "JOBREPORT_GET_JOBTYPES":
|
||||||
{
|
{
|
||||||
string process = json.process ?? "";
|
string process = json.process ?? "";
|
||||||
|
|||||||
@@ -788,6 +788,15 @@ class CommunicationLayer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async getLastJobReportByProject(pidx: number, projectName: string): Promise<ApiResponse<any>> {
|
||||||
|
if (isWebView && machine) {
|
||||||
|
const result = await machine.Jobreport_GetLastByProject(pidx, projectName);
|
||||||
|
return JSON.parse(result);
|
||||||
|
} else {
|
||||||
|
return this.wsRequest<ApiResponse<any>>('JOBREPORT_GET_LAST_BY_PROJECT', 'JOBREPORT_LAST_BY_PROJECT', { pidx, projectName });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async getJobReportTypeList(sd: string, ed: string, uid: string = ''): Promise<ApiResponse<JobReportTypeItem[]>> {
|
public async getJobReportTypeList(sd: string, ed: string, uid: string = ''): Promise<ApiResponse<JobReportTypeItem[]>> {
|
||||||
if (isWebView && machine) {
|
if (isWebView && machine) {
|
||||||
const result = await machine.Jobreport_GetTypeList(sd, ed, uid);
|
const result = await machine.Jobreport_GetTypeList(sd, ed, uid);
|
||||||
|
|||||||
@@ -75,6 +75,8 @@ export function JobreportEditModal({
|
|||||||
const [processList, setProcessList] = useState<CommonCode[]>([]);
|
const [processList, setProcessList] = useState<CommonCode[]>([]);
|
||||||
const [statusList, setStatusList] = useState<CommonCode[]>([]);
|
const [statusList, setStatusList] = useState<CommonCode[]>([]);
|
||||||
const [loadingCodes, setLoadingCodes] = useState(false);
|
const [loadingCodes, setLoadingCodes] = useState(false);
|
||||||
|
// 프로젝트 변경 추적 (이전 기록 불러오기 여부 판단)
|
||||||
|
const [previousProjectIdx, setPreviousProjectIdx] = useState<number | null>(null);
|
||||||
|
|
||||||
// ESC 키로 닫기
|
// ESC 키로 닫기
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -515,12 +517,70 @@ export function JobreportEditModal({
|
|||||||
<ProjectSearchDialog
|
<ProjectSearchDialog
|
||||||
isOpen={showProjectSearch}
|
isOpen={showProjectSearch}
|
||||||
onClose={() => setShowProjectSearch(false)}
|
onClose={() => setShowProjectSearch(false)}
|
||||||
onSelect={(project) => {
|
onSelect={async (project) => {
|
||||||
|
// 프로젝트가 변경된 경우에만 이전 기록 불러오기
|
||||||
|
if (previousProjectIdx !== project.idx) {
|
||||||
|
try {
|
||||||
|
// 해당 프로젝트의 마지막 업무일지 조회
|
||||||
|
const lastReport = await comms.getLastJobReportByProject(project.idx, project.name);
|
||||||
|
if (lastReport.Success && lastReport.Data) {
|
||||||
|
// 이전 기록의 값들을 기본값으로 설정
|
||||||
|
const updatedFormData = {
|
||||||
|
...formData,
|
||||||
|
projectName: project.name,
|
||||||
|
pidx: project.idx > 0 ? project.idx : -1
|
||||||
|
};
|
||||||
|
|
||||||
|
// 이전 기록에서 값 가져오기 (null이 아닌 경우에만)
|
||||||
|
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(project.idx);
|
||||||
|
} else {
|
||||||
|
// 이전 기록이 없어도 프로젝트는 설정
|
||||||
onFormChange({
|
onFormChange({
|
||||||
...formData,
|
...formData,
|
||||||
projectName: project.name,
|
projectName: project.name,
|
||||||
pidx: project.idx > 0 ? project.idx : -1,
|
pidx: project.idx > 0 ? project.idx : -1
|
||||||
});
|
});
|
||||||
|
setPreviousProjectIdx(project.idx);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('이전 기록 불러오기 오류:', error);
|
||||||
|
// 오류가 나도 프로젝트는 설정
|
||||||
|
onFormChange({
|
||||||
|
...formData,
|
||||||
|
projectName: project.name,
|
||||||
|
pidx: project.idx > 0 ? project.idx : -1
|
||||||
|
});
|
||||||
|
setPreviousProjectIdx(project.idx);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 동일한 프로젝트면 그냥 설정만
|
||||||
|
onFormChange({
|
||||||
|
...formData,
|
||||||
|
projectName: project.name,
|
||||||
|
pidx: project.idx > 0 ? project.idx : -1
|
||||||
|
});
|
||||||
|
}
|
||||||
|
setShowProjectSearch(false);
|
||||||
}}
|
}}
|
||||||
initialSearchKey={formData.projectName}
|
initialSearchKey={formData.projectName}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -362,6 +362,7 @@ export interface MachineBridgeInterface {
|
|||||||
Jobreport_Edit(idx: number, pdate: string, projectName: string, pidx: number, requestpart: string, package_: string, type: string, process: string, status: string, description: string, hrs: number, ot: number, jobgrp: string, tag: string, otStart: string, otEnd: string): Promise<string>;
|
Jobreport_Edit(idx: number, pdate: string, projectName: string, pidx: number, requestpart: string, package_: string, type: string, process: string, status: string, description: string, hrs: number, ot: number, jobgrp: string, tag: string, otStart: string, otEnd: string): Promise<string>;
|
||||||
Jobreport_Delete(id: number): Promise<string>;
|
Jobreport_Delete(id: number): Promise<string>;
|
||||||
Jobreport_GetPermission(targetUserId: string): Promise<string>;
|
Jobreport_GetPermission(targetUserId: string): Promise<string>;
|
||||||
|
Jobreport_GetLastByProject(pidx: number, projectName: string): Promise<string>;
|
||||||
Jobreport_GetJobTypes(process: string): Promise<string>;
|
Jobreport_GetJobTypes(process: string): Promise<string>;
|
||||||
|
|
||||||
// App Info API
|
// App Info API
|
||||||
|
|||||||
Reference in New Issue
Block a user