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

View File

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

View File

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

View File

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

View File

@@ -54,7 +54,7 @@ const params = reactive({
{ key: 'deptNm', label: '부서' },
{ key: 'sabun', label: '사번' },
{ key: 'name', label: '이름' },
{ key: 'attendNm', label: '비고' },
{ key: 'attendNm', label: '근태' },
{ key: 'apprStat', label: '결재상태'},
{ key: 'apprDt', label: '승인일자'},
],
@@ -425,7 +425,7 @@ function minAmtCalc (est) {
<td>최소견적서</td>
<td colspan="7">
<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>
</td>

View File

@@ -38,9 +38,6 @@ const params = reactive({
})
async function getPriceListData(){
const today = new Date()
searchParamsList.regSdt = new Date().setDate(today.getDate() - 30)
const priceBase = {
params:{
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)
}
}