Merge branch 'refs/heads/main' into featrue/0526-update

This commit is contained in:
Yesol Choi
2025-05-29 19:21:38 +09:00
5 changed files with 97 additions and 105 deletions

View File

@@ -281,12 +281,12 @@ const columns = computed(() => {
</div> </div>
</template> </template>
<style lang="scss"> <style scoped lang="scss">
.flex-table { .flex-table {
.flex-table-header { .flex-table-header {
display: flex; display: flex;
align-items: center; align-items: center;
padding: 20px 10px; padding: 0.5rem 10px;
background-color: var(--primary); background-color: var(--primary);
> span, > span,
@@ -360,7 +360,7 @@ const columns = computed(() => {
min-height: 60px; min-height: 60px;
background: var(--white); background: var(--white);
border: 1px solid color-mix(in oklab, var(--fade-grey), black 3%); border: 1px solid color-mix(in oklab, var(--fade-grey), black 3%);
padding: 8px; padding: 4px;
margin-bottom: 6px; margin-bottom: 6px;
&.is-row { &.is-row {

View File

@@ -36,7 +36,7 @@ const links = ref<NavbarItem[]>([
</script> </script>
<template> <template>
<NavbarLayout size="large" :links> <NavbarLayout size="wide" :links>
<!-- Propagating the context to the default slot --> <!-- Propagating the context to the default slot -->
<template #default="context"> <template #default="context">
<slot v-bind="context" /> <slot v-bind="context" />

View File

@@ -65,6 +65,7 @@ const params = reactive({
title: '', title: '',
priceData: [], priceData: [],
flexColumn: [ flexColumn: [
{ key: 'process', label: '구분', cellClass: 'paymentColumn5' },
{ key: 'apprNo', label: '결재번호', cellClass: 'paymentColumn1' }, { key: 'apprNo', label: '결재번호', cellClass: 'paymentColumn1' },
{ key: 'title', label: '제목', cellClass: 'paymentColumn2' }, { key: 'title', label: '제목', cellClass: 'paymentColumn2' },
{ key: 'name', label: '작성자', cellClass: 'paymentColumn3' }, { key: 'name', label: '작성자', cellClass: 'paymentColumn3' },
@@ -74,7 +75,6 @@ const params = reactive({
cellClass: 'paymentColumn4', cellClass: 'paymentColumn4',
format: formatRegDt, format: formatRegDt,
}, },
{ key: 'process', label: '구분', cellClass: 'paymentColumn5' },
], ],
approvalParams: [], approvalParams: [],
rowData: [], rowData: [],
@@ -147,37 +147,6 @@ const searchApproval = async () => {
type User = (typeof users)[0] type User = (typeof users)[0]
// duplicate user data to grow the array
const data: User[] = []
for (let i = 0; i < 1000; i++) {
data.push(...users)
}
// this is a sample for custom sort function
const locationSorter: VFlexTableWrapperSortFunction<User> = ({ order, a, b }) => {
if (order === 'asc') {
return a.location.localeCompare(b.location)
}
else if (order === 'desc') {
return b.location.localeCompare(a.location)
}
return 0
}
// this is a sample for custom filter function
const userFilter: VFlexTableWrapperFilterFunction<User> = ({ searchTerm, row }) => {
if (!searchTerm) {
return true
}
// search either in the name or the bio
return (
row.name.toLocaleLowerCase().includes(searchTerm.toLocaleLowerCase())
|| row.bio.toLocaleLowerCase().includes(searchTerm.toLocaleLowerCase())
)
}
const onRowClick = async (row) => { const onRowClick = async (row) => {
params.rowData = row params.rowData = row
try { try {
@@ -205,14 +174,6 @@ const onRowClick = async (row) => {
} }
} }
const onRowClick2 = (row: any) => {
selectedRow.value = row
isModalOpen.value = true
prcsNo.value = row.prcsNo
// prcsNo.value = 'PRCS-20250527049'
console.log(row.apprNo)
}
</script> </script>
@@ -319,11 +280,11 @@ const onRowClick2 = (row: any) => {
> >
<template #payment-header> <template #payment-header>
<div class="flex-table-header"> <div class="flex-table-header">
<span class="flex-table-item paymentColumn5">구분</span>
<span class="flex-table-item paymentColumn1">결재번호</span> <span class="flex-table-item paymentColumn1">결재번호</span>
<span class="flex-table-item paymentColumn2">제목</span> <span class="flex-table-item paymentColumn2">제목</span>
<span class="flex-table-item paymentColumn3">작성자</span> <span class="flex-table-item paymentColumn3">작성자</span>
<span class="flex-table-item paymentColumn4">등록일</span> <span class="flex-table-item paymentColumn4">등록일</span>
<span class="flex-table-item paymentColumn5">구분</span>
</div> </div>
</template> </template>
</ComVFlexTable> </ComVFlexTable>
@@ -364,7 +325,9 @@ const onRowClick2 = (row: any) => {
} }
.flex-table .flex-table-item { .flex-table .flex-table-item {
min-height: 3rem; min-height: 2rem;
background-color: var(--primary);
border: 0px;
} }
input[readonly] { input[readonly] {
@@ -380,12 +343,8 @@ input[readonly] {
margin-top: 1rem; // 필요 시 간격 추가 margin-top: 1rem; // 필요 시 간격 추가
} }
.flex-table .flex-table-item {
background-color: var(--primary);
border: 0px;
}
.flex-table .flex-table-header { .flex-table .flex-table-header {
padding: 0px; padding: 0.5rem;
} }
.flex-table.is-table-clickable .flex-table-item:hover, .flex-table.is-table-clickable .flex-table-item:focus-within a:hover { .flex-table.is-table-clickable .flex-table-item:hover, .flex-table.is-table-clickable .flex-table-item:focus-within a:hover {
background-color: var(--primary)!important; background-color: var(--primary)!important;

View File

@@ -11,6 +11,7 @@ const isSelectOpen = ref(false)
const notyf = useNotyf() const notyf = useNotyf()
const router = useRouter() const router = useRouter()
const selectedCode = ref() const selectedCode = ref()
const selectedContractCompCode = ref()
const priceSearchCheckBoxStatus = ref(false) const priceSearchCheckBoxStatus = ref(false)
const isLoading = ref(false) const isLoading = ref(false)
@@ -169,6 +170,7 @@ function handlePriceRowClick(row) {
registerFormOpen.value = false registerFormOpen.value = false
completedPriceDataParams.estimates = row.estimates completedPriceDataParams.estimates = row.estimates
// priceSearchCheckBoxStatus.value = "false"
console.log(row) console.log(row)
console.log(completedPriceDataParams.estimates) console.log(completedPriceDataParams.estimates)
} }
@@ -198,10 +200,12 @@ const saveContOne = async () => {
return return
} }
} }
console.log(selectedContractCompCode)
const paramsCont ={ const paramsCont ={
prcsNo: completedPriceDataParams.prcsNo, prcsNo: completedPriceDataParams.prcsNo,
bizNo: completedPriceDataParams.bizNo, bizNo: completedPriceDataParams.bizNo,
bizGubunCd: selectedContractCompCode.value,
bizGubunName: '',
cateCd: priceSearchCheckBoxStatus.value ? selectedCode.value : completedPriceDataParams.cateCd, cateCd: priceSearchCheckBoxStatus.value ? selectedCode.value : completedPriceDataParams.cateCd,
compNm: completedPriceDataParams.compNm, compNm: completedPriceDataParams.compNm,
title: completedPriceDataParams.title, title: completedPriceDataParams.title,
@@ -359,7 +363,7 @@ function onBizNoChange() {
<VField class="is-flex"> <VField class="is-flex">
<VControl raw subcontrol> <VControl raw subcontrol>
<VCheckbox <VCheckbox
label="예외사유" label="예외"
color="info" color="info"
v-model="priceSearchCheckBoxStatus" v-model="priceSearchCheckBoxStatus"
/> />
@@ -370,6 +374,7 @@ function onBizNoChange() {
<div class="column is-fullhd"> <div class="column is-fullhd">
<VField> <VField>
<VControl> <VControl>
<span class="">사유:</span>
<input <input
v-model="completedPriceDataParams.reason" v-model="completedPriceDataParams.reason"
class="input custom-text-filter " class="input custom-text-filter "
@@ -485,15 +490,13 @@ function onBizNoChange() {
</VControl> </VControl>
</VField> </VField>
</td> </td>
<td colspan="1"> <td>
<span class="colum"> <span class="colum">
<VField> <VField class="">
<VSelect> <VCodeSelect
<VOption value=""> v-model="selectedContractCompCode"
수의계약 사유 cd_grp="15"
</VOption> /></VField>
</VSelect>
</VField>
</span> </span>
</td> </td>
<td> <td>

View File

@@ -76,10 +76,14 @@ const params = reactive({
{ key: '', label: '금액(VAT별도)', editable: false }, { key: '', label: '금액(VAT별도)', editable: false },
], ],
dtlSpecs: [], //상세 규격 입력 데이터 dtlSpecs: [], //상세 규격 입력 데이터
minAmt: null,
minAmtComp: [],
}) })
function getDetailList(arg){ function getDetailList(arg){
console.log("arg",arg)//svy_yn console.log("arg",arg)//svy_yn
if(!props.prcsNo){ if(!props.prcsNo){
params.stCdFalg = true params.stCdFalg = true
} }
@@ -107,6 +111,8 @@ function getDetailList(arg){
})) //비고 데이터 없음, 승인일자 없음 todo })) //비고 데이터 없음, 승인일자 없음 todo
params.prcsAtts = arg.prcsAtts params.prcsAtts = arg.prcsAtts
params.svyYn = arg.svyYn params.svyYn = arg.svyYn
minAmtCalc(params.prcsBizs)
} }
const updateState = async () => { const updateState = async () => {
@@ -155,6 +161,17 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
link.click() link.click()
} }
function minAmtCalc (est) {
const totAmts = est.map(value => value.totAmt)
if(totAmts.length === 0) {
return {minAmt : null, bizNo : []};
}
const minAmt = Math.min(...totAmts);
const bizNo = est.filter(value => value.totAmt === minAmt).map(value => value.bizNo);
params.minAmt = minAmt;
params.minAmtComp = bizNo;
}
</script> </script>
@@ -164,6 +181,7 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
<div class="table-container"> <div class="table-container">
<table class="table datatable-table is-fullwidth"> <table class="table datatable-table is-fullwidth">
<colgroup> <colgroup>
<col style="width: 7%;">
<col style="width: 10%;"> <col style="width: 10%;">
<col style="width: 10%;"> <col style="width: 10%;">
<col style="width: 10%;"> <col style="width: 10%;">
@@ -172,8 +190,7 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
<col style="width: 10%;"> <col style="width: 10%;">
<col style="width: 10%;"> <col style="width: 10%;">
<col style="width: 10%;"> <col style="width: 10%;">
<col style="width: 10%;"> <col style="width: 13%;">
<col style="width: 10%;">
</colgroup> </colgroup>
<tbody> <tbody>
<tr> <tr>
@@ -275,7 +292,7 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
<td>등록기간</td> <td>등록기간</td>
<td colspan="6"> <td colspan="6">
<div class="columns"> <div class="columns">
<div class="column is-4"> <div class="column is-2">
<input <input
:readonly=true :readonly=true
v-model="generalParams.regSdat" v-model="generalParams.regSdat"
@@ -283,8 +300,8 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
disabled disabled
> >
</div> </div>
<div style="transform: translateY(9px)">~</div> <span style="margin: 0.5rem 0.5rem">~</span>
<div class="column is-4"> <div class="column is-2">
<input <input
:readonly=true :readonly=true
v-model="generalParams.regEdat" v-model="generalParams.regEdat"
@@ -297,46 +314,32 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
</tr> </tr>
<tr> <tr>
<td>첨부파일</td> <td>첨부파일</td>
<td colspan="9"> <td colspan="3">
<div class="column is-12"> <div class="column is-12">
<VField> <VField>
<VLabel>첨부파일</VLabel>
<VControl> <VControl>
<div <div
v-for="f in params.prcsAtts" v-for="f in params.prcsAtts"
:key="f.logiFnm" :key="f.logiFnm"
class="content estimate-file-wrapper" class="content estimate-file-wrapper"
> >
<div class="estimate-file-name"> <div class="estimate-file-name ml-2">
{{ f.logiFnm }}{{" ("}}{{Math.ceil(f.size / 1024)}}kb{{")"}} {{ f.logiFnm }}{{" ("}}{{Math.ceil(f.size / 1024)}}kb{{")"}}
</div> </div>
<div> <div>
<i class="fa fa-download estimate-file-download" @click="onPrcsFileDownload(f.prcsNo, f.fileOrd, f.logiFnm)" /> <i class="fa fa-download estimate-file-download pr-2" @click="onPrcsFileDownload(f.prcsNo, f.fileOrd, f.logiFnm)" />
</div> </div>
</div> </div>
</VControl> </VControl>
</VField> </VField>
</div> </div>
</td> </td>
<td colspan="6"></td>
</tr> </tr>
<tr> <tr>
<td>견적서확인</td> <td>견적서확인</td>
<td colspan="9"> <td colspan="6">
<slot name="status" <div>
v-if="params.stCd == '0200'"
>
<div style="display: flex; justify-content: flex-end; gap: 8px;">
<VButton
color="primary"
icon="fas fa-circle"
elevated
@click="onChangeFinal"
>
가격조사 완료
</VButton>
</div>
</slot>
<div class="mt-2">
<VFlexTableCustomize <VFlexTableCustomize
:key="params.prcsBizs.length" :key="params.prcsBizs.length"
:data="params.prcsBizs" :data="params.prcsBizs"
@@ -377,12 +380,39 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
</VFlexTableCustomize> </VFlexTableCustomize>
</div> </div>
</td> </td>
<td colspan="3">
<slot name="status"
v-if="params.stCd == '0200'"
>
<div>
<VButton
color="info"
icon="fas fa-circle"
elevated
@click="onChangeFinal"
>
가격조사 완료
</VButton>
</div>
</slot>
</td>
</tr>
<tr>
<td>최소견적서</td>
<td colspan="7">
<div class="columns">
<div class="column is-2">사업자명 : {{params.minAmtComp.join(',')}}</div>
<div class="column is-2">견적 금액 : {{formatCurrency(params.minAmt)}}</div>
</div>
</td>
<td colspan="2">
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="column is-12"> <div class="is-12">
<VField class="pr-2"> <VField class="">
<VLabel class="has-fullwidth"> <VLabel class="has-fullwidth">
결재선 결재선
</VLabel> </VLabel>
@@ -425,19 +455,18 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
<style scoped lang="scss"> <style scoped lang="scss">
/*css 추가 start*/ /*css 추가 start*/
.flex-table { .estimate-file-wrapper{
.flex-table-header { padding: 0;
padding: 0.1rem !important; margin: 0.25rem 0;
min-height: 40px;
border-top-left-radius: .75rem;
border-top-right-radius: .75rem;
} }
.flex-table-cell { .flex-table {
.w-100 { .flex-table-header {
width: 100%; padding: 1rem !important;
} min-height: 40px;
} }
.flex-table-item { .flex-table-item {
padding: 0.1rem !important; padding: 0.1rem !important;
min-height: 40px; min-height: 40px;
@@ -460,13 +489,12 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
width: 100%; width: 100%;
} }
td { td {
padding: 10px 10px !important; padding: 4px 10px;
.columns { .columns {
margin-left: 10px !important; margin-inline-start : 0
padding-top: 10px;
} }
.column { .column {
padding: 0 !important; padding: 0
} }
} }
} }
@@ -478,15 +506,17 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
color: var(--smoke-white); color: var(--smoke-white);
} }
.datatable-table {
padding: 12px 12px;
.datatable-table {
td:nth-child(1) { td:nth-child(1) {
background-color: var(--primary); background-color: var(--primary);
} }
td:nth-child(3) { tr:nth-child(1) > td:nth-child(3) {
background-color: var(--primary);
}
tr:nth-child(3) > td:nth-child(3) {
background-color: var(--primary); background-color: var(--primary);
} }
} }
</style> </style>