Merge branch 'main' into featrue/0526-update

This commit is contained in:
Yesol Choi
2025-06-05 16:27:13 +09:00
8 changed files with 138 additions and 228 deletions

View File

@@ -1,6 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { getIntegratedApproval } from '/src/service/integratedApproval' import { getIntegratedApproval } from '/src/service/integratedApproval'
import type { VFlexTableWrapperSortFunction, VFlexTableWrapperFilterFunction } from '/src/components/app-vuero/ComVFlexTableWrapper.vue'
import { users } from '/src/data/layouts/card-grid-v1' import { users } from '/src/data/layouts/card-grid-v1'
import PriceDetail from "/@src/pages/app/priceDetail.vue"; import PriceDetail from "/@src/pages/app/priceDetail.vue";
import {conveterNo, updateApprovalStatus} from "/@src/service/approvalApi.ts"; import {conveterNo, updateApprovalStatus} from "/@src/service/approvalApi.ts";
@@ -69,8 +68,6 @@ function formatRegDt(value) {
} }
async function getIntegratedApprovalList() { async function getIntegratedApprovalList() {
const today = new Date()
searchParamsList.regSdt = new Date().setDate(today.getDate() - 30)
const approvalParams = { const approvalParams = {
title: params.title, title: params.title,
@@ -160,18 +157,23 @@ const onRowClick = async (row) => {
sabun: row.sabun sabun: row.sabun
} }
console.log(params) console.log(params)
let result;
// API 호출 // API 호출
const result = await conveterNo(params) if(row.gubun=== 'SVCM') {
result = await conveterNo(params)
// 모달 무조건 열기
isModalOpen.value = true
// prcsNo 설정 (응답 구조에 맞게 수정) // prcsNo 설정 (응답 구조에 맞게 수정)
if (result?.prcsNo) { if (result?.prcsNo) {
prcsNo.value = result.prcsNo prcsNo.value = result.prcsNo
} else { } else {
notyf.error('가격조사번호를 찾을 수 없습니다.') notyf.error('가격조사번호를 찾을 수 없습니다.')
} }
}
// 모달 무조건 열기
isModalOpen.value = true
} catch (e) { } catch (e) {
isModalOpen.value = true // 에러 시에도 모달 열기 isModalOpen.value = true // 에러 시에도 모달 열기

View File

@@ -275,56 +275,56 @@ const onPrcsFileDownload = async (contNo: string, fileOrd: number, logiFnm: stri
</span> </span>
</td> </td>
<td> <td>
<VButton <!-- <VButton-->
color="primary" <!-- color="primary"-->
@click="registerFormOpen = true" <!-- @click="registerFormOpen = true"-->
> <!-- >-->
가격조사 가져오기 <!-- 가격조사 가져오기-->
</VButton> <!-- </VButton>-->
<VModal <!-- <VModal-->
is="form" <!-- is="form"-->
:open="registerFormOpen" <!-- :open="registerFormOpen"-->
title="계약관리 등록" <!-- title="계약관리 등록"-->
size="contract-big" <!-- size="contract-big"-->
actions="right" <!-- actions="right"-->
> <!-- >-->
<template #content> <!-- <template #content>-->
<div class="modal-form"> <!-- <div class="modal-form">-->
<ComVFlexTable <!-- <ComVFlexTable-->
:data="data.completedPriceSearchData" <!-- :data="data.completedPriceSearchData"-->
:columns="params.modalColumn" <!-- :columns="params.modalColumn"-->
:compact="true" <!-- :compact="true"-->
:separators="true" <!-- :separators="true"-->
@row-click="handlePriceRowClick" <!-- @row-click="handlePriceRowClick"-->
clickable <!-- clickable-->
/> <!-- />-->
</div> <!-- </div>-->
</template> <!-- </template>-->
</VModal> <!-- </VModal>-->
</td> </td>
<td> <td>
<VField class="is-flex"> <!-- <VField class="is-flex">-->
<VControl raw subcontrol> <!-- <VControl raw subcontrol>-->
<VCheckbox <!-- <VCheckbox-->
label="가격조사여부" <!-- label="가격조사여부"-->
color="info" <!-- color="info"-->
v-model="priceSeachCheckBoxStatus" <!-- v-model="priceSeachCheckBoxStatus"-->
/> <!-- />-->
</VControl> <!-- </VControl>-->
</VField> <!-- </VField>-->
</td> </td>
<td colspan="3"> <td colspan="3">
<div class="column is-fullhd"> <div class="column is-fullhd">
<VField> <!-- <VField>-->
<VControl> <!-- <VControl>-->
<input <!-- <input-->
v-model="completedPriceDataParams.reason" <!-- v-model="completedPriceDataParams.reason"-->
class="input custom-text-filter" <!-- class="input custom-text-filter"-->
placeholder="가격조사 안했을 시 예외 사유 입력(필수)" <!-- placeholder="가격조사 안했을 시 예외 사유 입력(필수)"-->
disabled <!-- disabled-->
> <!-- >-->
</VControl> <!-- </VControl>-->
</VField> <!-- </VField>-->
</div> </div>
</td> </td>
</tr> </tr>
@@ -410,22 +410,6 @@ const onPrcsFileDownload = async (contNo: string, fileOrd: number, logiFnm: stri
> >
</VButton> </VButton>
<VModal
actions="center"
title="계약금액"
>
<template #content>
<VPlaceholderSection
title="Go Premium"
subtitle="Unlock more features and business tools by going premium"
/>
</template>
<template #action>
<VButton color="primary" raised>
등록
</VButton>
</template>
</VModal>
</td> </td>
<td colspan="2"> <td colspan="2">
<VField> <VField>

View File

@@ -24,8 +24,6 @@ onBeforeMount(async () => {
}) })
async function getContractListView() { async function getContractListView() {
const today = new Date()
params.signSdt = new Date().setDate(today.getDate() - 30)
const contractParams = { const contractParams = {
params:{ params:{
@@ -37,7 +35,6 @@ async function getContractListView() {
} }
const result = await getContractList(contractParams) const result = await getContractList(contractParams)
data.contractData = result.content data.contractData = result.content
console.log('result', data.contractData)
//페이지 관련 값 설정 //페이지 관련 값 설정
totalItems.value = result.totalElements totalItems.value = result.totalElements
totalPages.value = result.totalPages totalPages.value = result.totalPages
@@ -277,7 +274,7 @@ watch(currentPage, (newParams) => {
<div> <div>
<VButton <VButton
v-if="row.contStatCd==='0200'" v-if="row.contStatCd==='0200'"
color="danger" color="info"
size="big" size="big"
@click.stop="getBilling(row)" @click.stop="getBilling(row)"
> >
@@ -285,7 +282,7 @@ watch(currentPage, (newParams) => {
</VButton> </VButton>
<VButton <VButton
v-else-if="['0300', '0400', '0500'].includes(row.contStatCd)" v-else-if="['0300', '0400', '0500'].includes(row.contStatCd)"
color="info" color="danger"
size="big" size="big"
@click.stop="getBilling(row)" @click.stop="getBilling(row)"
> >

View File

@@ -305,12 +305,20 @@ const showReasonError = computed(() =>
(!completedPriceDataParams.reason || !completedPriceDataParams.reason.trim()) (!completedPriceDataParams.reason || !completedPriceDataParams.reason.trim())
) )
const estimateBizNoOptions = computed(() =>
completedPriceDataParams.estimates.map(est => ({ const estimateBizNoOptions = computed(() => {
if (completedPriceDataParams.compNm) {
return [{
value: completedPriceDataParams.bizNo,
text: completedPriceDataParams.bizNo
}]
}
return completedPriceDataParams.estimates.map(est => ({
value: est.bizNo, value: est.bizNo,
text: est.bizNo text: est.bizNo
})) }))
) })
function onBizNoChange() { function onBizNoChange() {
const selected = completedPriceDataParams.estimates.find(est => est.bizNo === completedPriceDataParams.bizNo) const selected = completedPriceDataParams.estimates.find(est => est.bizNo === completedPriceDataParams.bizNo)

View File

@@ -3,17 +3,20 @@
import {getSlipDetail, saveTempSlip} from "/@src/service/slipApi.ts"; import {getSlipDetail, saveTempSlip} from "/@src/service/slipApi.ts";
import {formatDatefromStringDate} from "/@src/utils/common/comfunc.ts"; import {formatDatefromStringDate} from "/@src/utils/common/comfunc.ts";
import {VTabsItem} from "/@src/components/app-vuero/VCustomTabs.vue"; import {VTabsItem} from "/@src/components/app-vuero/VCustomTabs.vue";
import {sapApprConveterNo} from "/@src/service/sapApprovalApi.ts";
const props = defineProps<{apprNo : string}>(); const props = defineProps<{apprNo : string}>();
console.log(props.apprNo) console.log(props)
onBeforeMount(async ()=>{ onBeforeMount(async ()=>{
let result; let result;
if(history.state.key){ if(history.state.key){
result = await getSlipDetail(history.state.key) result = await getSlipDetail(history.state.key)
}else if(props.apprNo){ }else if(props.apprNo){
result = await getSlipDetail(props.apprNo) const sapApprNo = await sapApprConveterNo(props.apprNo)
result = await getSlipDetail(sapApprNo.data.contNo)
} }
getDetailList(result) getDetailList(result)
apprLine.value = result.zwf0011t.apprs apprLine.value = result.zwf0011t.apprs
@@ -129,10 +132,7 @@ const addTabFromRow = (row,index) => {
<td>소속</td> <td>소속</td>
<td colspan="2"> <td colspan="2">
<VField> <VField>
<VCodeSelect <span>{{affiliationCode}}</span>
v-model="affiliationCode"
cd_grp=11 >
</VCodeSelect>
</VField> </VField>
</td> </td>
<td colspan="7" /> <td colspan="7" />
@@ -141,47 +141,30 @@ const addTabFromRow = (row,index) => {
<td>계약명</td> <td>계약명</td>
<td colspan="9"> <td colspan="9">
<VField> <VField>
<VControl> <span>{{params.title}}</span>
<input
v-model="params.title"
class="input custom-text-filter"
placeholder="계약명"
>
</VControl>
</VField> </VField>
</td> </td>
</tr> </tr>
<tr> <tr>
<td>계약상대자</td> <td>계약상대자</td>
<td colspan="2"> <td colspan="1" style="text-align: left">
<VField> <VField>
<VControl> <span>{{params.regNm}}</span>
<input
v-model="params.regNm"
class="input custom-text-filter"
placeholder="사업자번호"
>
</VControl>
</VField> </VField>
</td> </td>
<td colspan="2"> <td colspan="2">
<VField> <VField>
<VControl> <span>업체명 : {{params.place}}</span>
<input
v-model="params.place"
class="input custom-text-filter"
placeholder="업체명"
>
</VControl>
</VField> </VField>
</td> </td>
<td> <td></td>
<VButton color="danger"> <td colspan="2">
<VButton color="danger" disabled>
구매처 확인 구매처 확인
</VButton> </VButton>
</td> </td>
<td> <td>
<VButton color="success"> <VButton color="success" disabled>
정상 정상
</VButton> </VButton>
</td> </td>
@@ -191,14 +174,7 @@ const addTabFromRow = (row,index) => {
<td>공급가액</td> <td>공급가액</td>
<td colspan="2"> <td colspan="2">
<VField> <VField>
<VControl> <span>{{formattedNumber}}</span>
<input
:value="formattedNumber"
placeholder="금액"
@input="onInput"
class="input custom-text-filter"
>
</VControl>
</VField> </VField>
</td> </td>
<td style="color: black">(부가세 별도)</td> <td style="color: black">(부가세 별도)</td>
@@ -207,121 +183,61 @@ const addTabFromRow = (row,index) => {
</td> </td>
<td colspan="2"> <td colspan="2">
<VField> <VField>
<VCodeSelect v-model="taxCode" cd_grp="12"> <span>{{taxCode}}</span>
<template #code="{ item }">
{{ item.cd }}
</template>
</VCodeSelect>
</VField> </VField>
</td> </td>
<td style="background-color: var(--primary); text-align: center">통화</td> <td style="background-color: var(--primary); text-align: center">통화</td>
<td colspan="2"> <td colspan="2">
<VField> <VField>
<VCodeSelect v-model="currencyCode" cd_grp="13"> <span>{{currencyCode}}</span>
<template #code="{ item }">
{{ item.cd }}
</template>
</VCodeSelect>
</VField> </VField>
</td> </td>
</tr> </tr>
<tr> <tr>
<td>증빙일</td> <td>증빙일</td>
<td colspan="2"> <td colspan="2">
<div>
<VDatePicker
v-model="params.regSdt"
color="green"
trim-weeks
>
<template #default="{ inputValue, inputEvents }">
<VField> <VField>
<VControl icon="lucide:calendar"> <span>{{ params.regSdt }}</span>
<input
class="input v-input"
type="text"
:value="inputValue"
placeholder="증빙일"
v-on="inputEvents"
>
</VControl>
</VField> </VField>
</template>
</VDatePicker>
</div>
</td> </td>
<td /> <td />
<td style="background-color: var(--primary); text-align: center"> <td style="background-color: var(--primary); text-align: center">
<span>전기일</span> <span>전기일</span>
</td> </td>
<td colspan="2"> <td colspan="5">
<div>
<VDatePicker
v-model="params.regSdt2"
color="green"
trim-weeks
>
<template #default="{ inputValue, inputEvents }">
<VField> <VField>
<VControl icon="lucide:calendar"> <span>{{ params.regSdt2 }}</span>
<input
class="input v-input"
type="text"
:value="inputValue"
placeholder="전기일"
v-on="inputEvents"
>
</VControl>
</VField> </VField>
</template>
</VDatePicker>
</div>
</td> </td>
</tr> </tr>
<tr> <tr>
<td>계좌관리</td> <td>계좌관리</td>
<td> <td>
<VField> <VField>
<VControl> <span>{{params.bankl}}</span>
<input
v-model="params.bankl"
class="input custom-text-filter"
placeholder="계약번호"
>
</VControl>
</VField> </VField>
</td> </td>
<td colspan="2"> <td colspan="2">
<VField> <VField>
<VControl> <span>{{params.bankn}}</span>
<input
v-model="params.bankn"
class="input custom-text-filter"
placeholder="계좌번호"
>
</VControl>
</VField> </VField>
</td> </td>
<td> <td colspan="2">
<VButton color="info"> <VButton color="info" disabled>
계좌조회 계좌조회
</VButton> </VButton>
</td> </td>
<td> <td>
<VButton color="success"> <VButton color="success" disabled>
정상 정상
</VButton> </VButton>
</td> </td>
<td></td>
<td style="background-color: var(--primary); text-align: center"> <td style="background-color: var(--primary); text-align: center">
<span>세금계산서</span> <span>세금계산서</span>
</td> </td>
<td colspan="2"> <td colspan="2">
<VField> <VField>
<VCodeSelect <span>{{taxInvoiceCode}}</span>
v-model="taxInvoiceCode"
cd_grp=12 >
</VCodeSelect>
</VField> </VField>
</td> </td>
</tr> </tr>
@@ -331,36 +247,24 @@ const addTabFromRow = (row,index) => {
<VButton <VButton
color="primary" color="primary"
@click="centeredActionsOpen = true" @click="centeredActionsOpen = true"
disabled
> >
G/L계정// 설정필요 G/L계정// 설정필요
</VButton> </VButton>
</td> </td>
<td colspan="2"> <td colspan="2">
<VField> <VField>
<VCodeSelect <span>{{accountSubjectCode}}</span>
v-model="accountSubjectCode"
cd_grp=12 >
</VCodeSelect>
</VField> </VField>
</td> </td>
<td> <td>
<VField> <VField>
<VSelect v-model="selectCostCode"> <span>코스트센터/WBS{{selectCostCode}}</span>
<option v-for="opt in selectCostCodeOptions" :key="opt.key">
{{ opt.text }}
</option>
</VSelect>
</VField> </VField>
</td> </td>
<td colspan="2"> <td colspan="2">
<VField> <VField>
<VControl> <span>코스트센터/WBS코드예정</span>
<input
v-model="params.title"
class="input custom-text-filter"
placeholder="코드"
>
</VControl>
</VField> </VField>
</td> </td>
<td colspan="4"></td> <td colspan="4"></td>
@@ -427,9 +331,6 @@ const addTabFromRow = (row,index) => {
text-align: center; text-align: center;
} }
tr:nth-child(3) {
text-align: center;
}
tr td button{ tr td button{
width: 100%; width: 100%;
@@ -462,13 +363,8 @@ button:nth-child(3) {
.field { .field {
margin: 0px 0px; margin: 0px 0px;
} }
.button[disabled], fieldset[disabled] .button {
opacity: 1.0;
.disabled-button { }
//opacity: 0.5;
background-color: #ccc;
cursor: not-allowed;
//transition: all 0.2s;
}
</style> </style>

View File

@@ -54,7 +54,7 @@ const params = reactive({
{ key: 'deptNm', label: '부서' }, { key: 'deptNm', label: '부서' },
{ key: 'sabun', label: '사번' }, { key: 'sabun', label: '사번' },
{ key: 'name', label: '이름' }, { key: 'name', label: '이름' },
{ key: 'attendNm', label: '비고' }, { key: 'attendNm', label: '근태' },
{ key: 'apprStat', label: '결재상태'}, { key: 'apprStat', label: '결재상태'},
{ key: 'apprDt', label: '승인일자'}, { key: 'apprDt', label: '승인일자'},
], ],
@@ -425,7 +425,7 @@ function minAmtCalc (est) {
<td>최소견적서</td> <td>최소견적서</td>
<td colspan="7"> <td colspan="7">
<div class="columns"> <div class="columns">
<div class="column is-2">사업자명 : {{params.minAmtComp.join(',')}}</div> <div class="column is-4">사업자명 : {{params.minAmtComp.join(', ')}}</div>
<div class="column is-2">견적 금액 : {{formatCurrency(params.minAmt)}}</div> <div class="column is-2">견적 금액 : {{formatCurrency(params.minAmt)}}</div>
</div> </div>
</td> </td>

View File

@@ -38,9 +38,6 @@ const params = reactive({
}) })
async function getPriceListData(){ async function getPriceListData(){
const today = new Date()
searchParamsList.regSdt = new Date().setDate(today.getDate() - 30)
const priceBase = { const priceBase = {
params:{ params:{
regSdt: formatDatefromString(searchParamsList.regSdt), regSdt: formatDatefromString(searchParamsList.regSdt),

View File

@@ -0,0 +1,26 @@
import axios from 'axios'
/**
* SAP결재번호를 계약결재번호로 변경
* @param {object} params
* @property {string} params.apprNo - 결재번호
* @returns
*/
export async function sapApprConveterNo(params = {}) {
try {
console.log(params)
const result = await axios.get(`/api/sap/appr/converter/${params}`)
return result
}
catch (e) {
if (e.response) {
if (e.response.status >= 500) {
throw new Error('서버 오류가 발생했습니다.')
} else if (e.response.status >= 400) {
throw new Error('잘못된 요청입니다.')
}
}
throw new Error(e.message)
}
}