From 09e3cc2cb004696301dee8c1ad985ee43b7a3ba1 Mon Sep 17 00:00:00 2001 From: Yesol Choi Date: Wed, 4 Jun 2025 19:48:54 +0900 Subject: [PATCH] =?UTF-8?q?func=20:=20=EA=B3=84=EC=95=BD=EC=A2=85=EB=A3=8C?= =?UTF-8?q?,=20=EB=8C=80=EA=B8=88=EC=A7=80=EA=B8=89=EC=A0=84.=EC=A4=91=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EB=B6=84=EA=B8=B0=20=EC=B2=98=EB=A6=AC=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/app/contractManagement.vue | 4 +- .../app/documentManagementInsertUpdate.vue | 398 +++++++++++++++--- 2 files changed, 333 insertions(+), 69 deletions(-) diff --git a/src/pages/app/contractManagement.vue b/src/pages/app/contractManagement.vue index cadf914..baec9ea 100644 --- a/src/pages/app/contractManagement.vue +++ b/src/pages/app/contractManagement.vue @@ -121,7 +121,9 @@ function getContractDetail(){ function getBilling(row){ if(params.sessionUser.sabun == row.regSabun && (row.contStatCd == '0200' || row.contStatCd == '0300')){ //대금지급 전 - router.push({ path: '/app/documentManagementInsertUpdate', state: { key: row.contNo}}) + + const statusFlag = row.contStatCd + router.push({ path: '/app/documentManagementInsertUpdate', state: { key: row.contNo, status: statusFlag}}) }else if(params.sessionUser.sabun == row.regSabun && (row.contStatCd == '0400' || row.contStatCd == '0500')){ //대금지급중, 대금지급완료 router.push({ path: '/app/documentManagementDetail', state: { key: row.contNo}}) diff --git a/src/pages/app/documentManagementInsertUpdate.vue b/src/pages/app/documentManagementInsertUpdate.vue index 7df0bb0..c4b4681 100644 --- a/src/pages/app/documentManagementInsertUpdate.vue +++ b/src/pages/app/documentManagementInsertUpdate.vue @@ -2,39 +2,25 @@ import {getBeforeSlipDetail, saveTempSlip} from "/@src/service/slipApi.ts"; import {formatDatefromStringDate} from "/@src/utils/common/comfunc.ts"; -import {ApprsList} from "/@src/utils/types.ts"; -import {VTabsItem} from "/@src/components/app-vuero/VCustomTabs.vue"; +import {ApprsList, type iPbAtt, type Person} from "/@src/utils/types.ts"; +import {VTabsItem} from "/src/components/app-vuero/VCustomTabs.vue"; +import {getContractDetail} from "/@src/service/contractApi.ts"; +import {deletePrcsFile} from "/@src/service/priceApi.ts"; onBeforeMount(async ()=>{ - const result = await getBeforeSlipDetail(history.state.key) - getDetailList(result) + let result; + if(history.state.status == '0200'){ + // 계약종료는 contract api 결재선 추가해야 됨 + result = await getContractDetail(history.state.key) + getDetailBeforeList(result) + }else if(history.state.status == '0300'){ + // 대금지급 전 slip api 에서 결재선까지 받아옴 + result = await getBeforeSlipDetail(history.state.key) + getDetailList(result) + } + }) const notyf = useNotyf() -//결재선 담아오는 변수 -const apprsList = ref() - -const getDetailList = (item) => { - console.log("getDetailList",item) - params.contNo = item.contNo - affiliationCode.value = item.bukrs//소속 - params.title = item.bktxt //계약명 - params.regNm = item.lifnr //계약상대자 - params.place = ''// 업체명 bupla - formattedNumber.value = item.wrbtrS //공급가액 - taxCode.value= item.mwskz //세금코드 ->세금계산서랑 같이 ? - currencyCode.value = item.waers //통화 - params.regSdt = formatDatefromStringDate(item.bldat) //증빙일 - params.regSdt2 = formatDatefromStringDate(item.budat)//전기일 - params.bankl = item.bankl //계좌관리 은행코드 - params.bankn = item.bankn//계좌관리 계좌번호 - //taxInvoiceCode.value = item.mwskz //세금계산서 따로 연계 태워야됨 todo - // item.hkont G/L 계정 - selectCostCode.value = ''//코스트센터 kostl wbs요소코드 projk -//코드 - //첨부파일 - params.apprList = item.zwf0011t.apprs - console.log("apprsList.value",apprsList.value) -} const affiliationCode = ref() const taxCode = ref('') @@ -42,23 +28,43 @@ const currencyCode = ref('KRW') const taxInvoiceCode = ref() const accountSubjectCode = ref() const params = reactive({ + //샘플 데이터 형식으로 맞춤 + // https://git.hmsn.ink/kospo/svcm/api/-/blob/main/api/slip/%EC%9E%84%EC%8B%9C%EC%A0%84%ED%91%9C%EC%A0%80%EC%9E%A5.http?ref_type=heads cateCd: '', contNo: '', - title: '', + bldat: '', + budat: '', + regSdt: '', + regSdt2: '', + //waers => currencyCode ref + bktxt: '', //계약명 + lifnr: '', //계약상대자 + //wrbtr => formattedNumber ref + //mwskz => taxCode ref + //gsber => affiliationCode ref + //bupla => affiliationCode ref + zterm: '', + banks: '', + bankl:'', + bankn:'', + hkont: '', + wrbtrS: '', //공급가액 체크 필요 todo + kostl: '', + projk: '', + trtGubun: '', + txBillSeq: '', + slipAtts: [], + //apprList:[], ==> apprLine 변수로 변경 // 결재선 데이터 키: 값(배열 들어감) + compNm: '', signDt: '', contAmt: 0, contStatCd: '', contStat: '', regsabun: '', - regNm: '', place: '', regDt: '', reason: '', - regSdt: '', - regSdt2: '', - bankl:'', - bankn:'', page: 1, row: 10, flexColumn: [ @@ -66,11 +72,50 @@ const params = reactive({ { key: 'lineclsf', label: '구분', value: {} }, { key: 'bname', label: '사원번호', value: {} }, { key: 'abscd', label: '근태관리', value: {} }, + { key: 'actions', label: '동작' }, ], - apprList:[], modalColumn: [], }) +const pbAtts = ref(params.slipAtts) const formattedNumber = ref(0) +const apprLine = ref([]) +const getDetailList = (item) => { + console.log("getDetailList",item) + params.contNo = item.contNo + params.regSdt = formatDatefromStringDate(item.bldat) //증빙일 + params.regSdt2 = formatDatefromStringDate(item.budat)//전기일 + params.place = ''// 업체명 bupla + currencyCode.value = item.waers //통화 + params.bktxt = item.bktxt //계약명 + params.lifnr = item.lifnr //계약상대자 + formattedNumber.value = item.wrbtrS //공급가액 + taxCode.value= item.mwskz //세금코드 ->세금계산서랑 같이 ? + affiliationCode.value = item.bupla//소속 gsber bupla + params.zterm = item.zterm + params.banks = item.banks + params.bankl = item.bankl //계좌관리 은행코드 + params.bankn = item.bankn//계좌관리 계좌번호 + //taxInvoiceCode.value = item.mwskz //세금계산서 따로 연계 태워야됨 todo + params.hkont = item.hkont //G/L 계정 + selectCostCode.value = ''//코스트센터 kostl wbs요소코드 projk + params.wrbtrS = item.wrbtrS + params.kostl = item.kostl + params.projk = item.projk + params.trtGubun = item.trtGubun + params.txBillSeq = item.txBillSeq + params.slipAtts = item.slipAtts//첨부파일 + console.log("params.slipAtts",params.slipAtts) + apprLine.value = item.zwf0011t.apprs + console.log("apprsList.value",apprLine.value) +} + +const getDetailBeforeList = (item) => { + console.log("item before",item) + params.contNo = item.contNo + params.place = item.compNm// !!!!!!업체명 bupla + params.bktxt = item.title //!!!!!!계약명 + params.lifnr = item.bizNo //!!!!!계약상대자 +} function onInput(event) { let onlyNumber = event.target.value.replace(/[^0-9]/g, '') @@ -93,28 +138,40 @@ const createChit = async () => { try{ loading.value = true const createParams = { - contNo : params.contNo, - bldat : '20250602',//params.regSdt.replace("-",""), - budat : '20250602',//params.regSdt2.replace("-",""), - waers : currencyCode.value, - bktxt : params.title, - lifnr : params.regNm, - wrbtr : formattedNumber.value, //수정필요 - mwskz : taxCode.value, - gsber : affiliationCode.value, //무슨 값인지 모름 gsber bukrs bupla - bupla : affiliationCode.value, - zterm : '', //어떤 값인지 모름 - banks : '' , //어떤 값인지 모름 - bankl : params.bankl, - bankn : params.bankn, - hkont : '',//G/L 계정 - wrbtrS : formattedNumber.value, - kostl : selectCostCode.value, - projk : selectCostCode.value, - trtGubun : '',//어떤 값인지 모름 - txBillSeq : '',//어떤 값인지 모름 - slipAtts: '', // 파일 업로드 - //zwf0011t : { params.apprList} + contNo : params.contNo, //"CONT-0000000005", + bldat : '20250602',//params.regSdt.replace("-",""), // "20250501", + budat : '20250610',//params.regSdt2.replace("-",""), // "20250502", + waers : "KRW", //currencyCode.value, //"KRW", + bktxt : params.bktxt,//"전표 생성 테스트1", + lifnr : params.lifnr, //999-99-99999", + wrbtr : "1203", //formattedNumber.value, //!!!!!수정필요 "1203", + mwskz : "V4", //taxCode.value, //"V4", + gsber : '1000', //affiliationCode.value, //무슨 값인지 모름 gsber bukrs bupla 같다고 함 1000 + bupla : '1000', //affiliationCode.value, //1000 + zterm : 'PF00', //params.zterm, //!!!!!!어떤 값인지 모름 PF00 + banks : 'KR', //params.banks , //어떤 값인지 모름 KR + bankl : '012', //params.bankl, //012 + bankn : '3510876657453', //params.bankn, //3510876657453 + hkont : '5366010', //params.hkont,//G/L 계정 5366010 + wrbtrS : formattedNumber.value, //1102 + kostl : "12330", //!!!!!!12330 + projk : selectCostCode.value, //빈값 + trtGubun : '11', //params.trtGubun,//!!!!!!어떤 값인지 모름 11 + txBillSeq : '202503231', //params.txBillSeq,//!!!!!!어떤 값인지 모름 202503231 + slipAtts: pbAtts.value.map(req => ({ + logiFnm: req.logiFnm, + data: req.data})),//첨부파일 데이터, + zwf0011t : { + wkftx : "결재 테스트11", //!!!!!!어떤 값인지 모름 + apprs : [{ + label: apprLine.value[0].label, + value: apprLine.value[0].value.map((req) => ({ + lineclsf : req.lineclsf, + bname : req.bname, + abscd : req.abscd + })) + }] + } } notyf.dismissAll() res = await saveTempSlip(createParams) @@ -129,11 +186,162 @@ const createChit = async () => { } } +const updateChit = async () => { + let res = null + try{ + loading.value = true + const createParams = { + contNo : params.contNo, //"CONT-0000000005", + bldat : '20250602',//params.regSdt.replace("-",""), // "20250501", + budat : '20250610',//params.regSdt2.replace("-",""), // "20250502", + waers : currencyCode.value, //"KRW", + bktxt : params.bktxt,//"전표 생성 테스트1", + lifnr : params.lifnr, //999-99-99999", + wrbtr : formattedNumber.value, //수정필요 "1203", + mwskz : taxCode.value, //"V4", + gsber : affiliationCode.value, //무슨 값인지 모름 gsber bukrs bupla 같다고 함 1000 + bupla : affiliationCode.value, //1000 + zterm : params.zterm, //어떤 값인지 모름 PF00 + banks : params.banks , //어떤 값인지 모름 KR + bankl : params.bankl, //012 + bankn : params.bankn, //3510876657453 + hkont : params.hkont,//G/L 계정 5366010 + wrbtrS : formattedNumber.value, //1102 + kostl : "12330", //12330 + projk : selectCostCode.value, //빈값 + trtGubun : params.trtGubun,//어떤 값인지 모름 11 + txBillSeq : params.txBillSeq,//어떤 값인지 모름 202503231 + slipAtts: pbAtts.value.map(req => ({ + logiFnm: req.logiFnm, + data: req.data})),//첨부파일 데이터, + zwf0011t : { + wkftx : "결재 테스트11", //어떤 값인지 모름 + apprs : [{ + label: apprLine.value[0].label, + value: apprLine.value[0].value.map((req) => ({ + lineclsf : req.lineclsf, + bname : req.bname, + abscd : req.abscd + })) + }] + } + } + notyf.dismissAll() + res = await saveTempSlip(createParams) + if(res.request.status == '200'){ + notyf.primary('등록 되었습니다.') + router.push({path: '/app/priceManagement'}) + } + }catch(e){ + notyf.error(e.message) + }finally { + loading.value = false + } +} const selectedTab = ref() const addTabFromRow =()=>{ console.log("row",row) console.log("row",index) } + +const onFileClick = () => { + const input = document.querySelector('.file-input') + input.click() +} + +const onFileChange = (e: any) => { + Array.from(e.target.files).forEach((file: any) => { + const reader = new FileReader() + reader.onload = () => { + const result = reader.result + const pbAtt = { // todo 여기 첨부파일로 변경 필요 + prcsNo: params.prcsNo, + logiFnm: file.name, + size: file.size, + data: result.split(',')[1], + } + notyf.dismissAll() + if(pbAtt.logiFnm.includes('.pdf')) { //todo 여러개 올릴 때 이슈 발생 확인 필요 + pbAtts.value.push(pbAtt) + }else{ + notyf.error("pdf 파일만 업로드 가능합니다.") + } + } + + reader.readAsDataURL(file) + }) +} + +const onFilDelete = async (prcsNo: string, index: number, fileOrd: number) => { + notyf.dismissAll() + const confirmed = confirm('삭제하시겠습니까?') + if (!prcsNo) { + if (confirmed){ + pbAtts.value.splice(index, 1) + } + } else { + if (confirmed) { + await deletePrcsFile(prcsNo, fileOrd).then((res: string) => { + notyf.success(res) + pbAtts.value.splice(index, 1) + }).catch((err) => { + notyf.error('삭제 중 오류가 발생했습니다.') + console.error(err) + }) + } + } +} + +const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: string) => { + const link = document.createElement('a') + link.href = `https://svcm.hmsn.ink/api/prcs/${prcsNo}/${fileOrd}` //todo + link.setAttribute('download', logiFnm) + link.setAttribute('target', '_blank') + document.body.appendChild(link) + link.click() +} + +const selectUser = ref([]) + +const isDuplicate = (person: Person) =>{ + console.log("value[0].value", apprLine.value) + return apprLine.value.some((p) => p.lineclsf === person.sabun)} + +watch( + selectUser, + (newPersons) => { + console.log("newPersons",newPersons) + if (Array.isArray(newPersons) && newPersons.length > 0) { + const filtered = newPersons.filter((p) => !isDuplicate(p)) + apprLine.value = [...apprLine.value, ...filtered] + selectUser.value = [] + } + }, + { deep: true } +) + +const onPriceDelete = (index: number) => { + + if(apprLine.value.length-1 !== params.flexColumn.length + || (params.flexColumn.length == 8 && apprLine.value.length-1 == params.flexColumn.length)) + { + apprLine.value.splice(index, 1) + } +} + +const moveUp = (index: number) => { + if (index <= 0) return + let temp = apprLine.value[index] + apprLine.value[index] = apprLine.value[index - 1] + apprLine.value[index - 1] = temp +} + +const moveDown = (index: number) => { + if (index >= apprLine.value.length - 1) return + let temp = apprLine.value[index] + apprLine.value[index] = apprLine.value[index + 1] + apprLine.value[index + 1] = temp +}