Merge branch 'featrue/0526-update'

# Conflicts:
#	src/pages/app/contractDetail.vue
This commit is contained in:
Yesol Choi
2025-05-27 15:56:05 +09:00
4 changed files with 127 additions and 103 deletions

View File

@@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import {deletePrcsFile, getPrcsFileDown, savePrice} from '/src/service/priceApi' import {savePrice} from '/src/service/priceApi'
import {type iPbAtt, Person} from '/@src/utils/types' import {type iPbAtt, Person} from '/@src/utils/types'
import {formatBizNum,formatDatefromString} from "/@src/utils/common/comfunc.ts"; import {formatBizNum,formatDatefromString} from "/@src/utils/common/comfunc.ts";
@@ -204,10 +204,12 @@ const onFileChange = (e: any) => {
} }
const onFilDelete = async ( index: number, fileOrd: number) => { const onFilDelete = async ( index: number, fileOrd: number) => {
notyf.dismissAll() const confirmed = confirm('삭제하시겠습니까?')
if (index) { if (index) {
if (confirmed){
pbAtts.value.splice(index, 1) pbAtts.value.splice(index, 1)
} }
}
} }
function onInput(row, column){ function onInput(row, column){
@@ -239,7 +241,7 @@ function onInput(row, column){
<tr> <tr>
<td>분야</td> <td>분야</td>
<td colspan="2"> <td colspan="2">
<span class="column"> <span class="column is-7">
<VField class="pr-2"> <VField class="pr-2">
<VCodeSelect <VCodeSelect
cd_grp=5 cd_grp=5
@@ -308,7 +310,7 @@ function onInput(row, column){
<VControl> <VControl>
<input <input
v-model="row[column.key]" v-model="row[column.key]"
class="editable-input" class="input custom-text-filter"
ref="prcsBizsRef" ref="prcsBizsRef"
@blur="onInput(row, column)" @blur="onInput(row, column)"
/> />
@@ -353,7 +355,9 @@ function onInput(row, column){
@close="detailActionsOpen = false" @close="detailActionsOpen = false"
> >
<template #content> <template #content>
<div class="form-label">
<VButton color="success">일괄업로드</VButton> <VButton color="success">일괄업로드</VButton>
</div>
<ComVFlexTable <ComVFlexTable
:key="params.dtlSpecs.length" :key="params.dtlSpecs.length"
:data="params.dtlSpecs" :data="params.dtlSpecs"
@@ -364,11 +368,11 @@ function onInput(row, column){
> >
<template #body-cell="{ row, column, index, value }"> <template #body-cell="{ row, column, index, value }">
<!-- : 특정 컬럼이면 input, 아니면 그냥 출력 --> <!-- : 특정 컬럼이면 input, 아니면 그냥 출력 -->
<div> <div class="control w-100" :class="column.key === 'delete'? 'text-center': ''">
<input <input
v-if="column.editable" v-if="column.editable"
v-model="row[column.key]" v-model="row[column.key]"
class="editable-input" class="input custom-text-filter"
/> />
<span v-else-if="column.key=='num'">{{index+1}}</span> <span v-else-if="column.key=='num'">{{index+1}}</span>
<span v-else-if="column.key=='delete'" class="lnil lnil-close" <span v-else-if="column.key=='delete'" class="lnil lnil-close"
@@ -396,7 +400,7 @@ function onInput(row, column){
<td>등록기간</td> <td>등록기간</td>
<td colspan="6"> <td colspan="6">
<div class="columns"> <div class="columns">
<div class="column is-5"> <div class="column is-4">
<VDatePicker <VDatePicker
v-model="generalParams.regSdat" v-model="generalParams.regSdat"
color="green" color="green"
@@ -418,7 +422,7 @@ function onInput(row, column){
</VDatePicker> </VDatePicker>
</div> </div>
<div style="transform: translateY(15px)">~</div> <div style="transform: translateY(15px)">~</div>
<div class="column is-5"> <div class="column is-4">
<VDatePicker <VDatePicker
v-model="generalParams.regEdat" v-model="generalParams.regEdat"
color="green" color="green"
@@ -540,6 +544,56 @@ function onInput(row, column){
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">
/*css 추가 start*/
.flex-table {
.flex-table-header {
padding: 0.1rem !important;
min-height: 40px;
border-top-left-radius: .75rem;
border-top-right-radius: .75rem;
}
.flex-table-cell {
.w-100 {
width: 100%;
}
}
.flex-table-item {
padding: 0.1rem !important;
min-height: 40px;
.column {
min-height: 40px;
padding: 0.1rem !important;
}
&:last-child {
border-bottom-left-radius: .75rem;
border-bottom-right-radius: .75rem;
}
}
}
.table-container {
overflow:hidden;
.control {
width: 100%;
}
td {
padding: 10px 10px !important;
.columns {
margin-left: 10px !important;
padding-top: 10px;
}
.column {
padding: 0 !important;
}
}
}
.text-center {
text-align:center;
}
.table tbody td { .table tbody td {
color: var(--smoke-white); color: var(--smoke-white);
} }

View File

@@ -58,7 +58,7 @@ function getContractDetail(){
if(params.sessionUser.sabun == arguments[0].regSabun && arguments[0].contStatCd == '0000'){ if(params.sessionUser.sabun == arguments[0].regSabun && arguments[0].contStatCd == '0000'){
router.push({ path: '/app/contractUpdate', state: { key: arguments[0].contNo}}) router.push({ path: '/app/contractUpdate', state: { key: arguments[0].contNo}})
}else{ }else{
//router.push({ path: '/app/priceDetail', state: { key: arguments[0].prcsNo }}) router.push({ path: '/app/contractDetail', state: { key: arguments[0].contNo }})
} }
} }
</script> </script>

View File

@@ -179,6 +179,7 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
v-model="params.cateSelect" v-model="params.cateSelect"
class="input custom-text-filter" class="input custom-text-filter"
placeholder="제목" placeholder="제목"
disabled
> >
</span> </span>
</td> </td>
@@ -192,6 +193,7 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
v-model="generalParams.title" v-model="generalParams.title"
class="input custom-text-filter" class="input custom-text-filter"
placeholder="제목" placeholder="제목"
disabled
> >
</VControl> </VControl>
</VField> </VField>
@@ -209,6 +211,7 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
v-model="generalParams.content" v-model="generalParams.content"
class="input custom-text-filter" class="input custom-text-filter"
placeholder="내용" placeholder="내용"
disabled
/> />
</VControl> </VControl>
</VField> </VField>
@@ -218,6 +221,7 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
<tr> <tr>
<td>규격입력</td> <td>규격입력</td>
<td colspan="2"> <td colspan="2">
<span class="column is-7">
<VButton <VButton
color='success' color='success'
icon="fas" icon="fas"
@@ -249,7 +253,8 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
:readonly=true :readonly=true
v-if="column.editable" v-if="column.editable"
v-model="row[column.key]" v-model="row[column.key]"
class="editable-input" class="input custom-text-filter"
disabled
/> />
<span v-else-if="column.key=='num'">{{index+1}}</span> <span v-else-if="column.key=='num'">{{index+1}}</span>
<span v-else>{{ value }}</span> <span v-else>{{ value }}</span>
@@ -260,68 +265,26 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
<template #cancel> <template #cancel>
</template> </template>
</VModal> </VModal>
</span>
</td> </td>
<td>등록기간</td> <td>등록기간</td>
<td colspan="5"> <td colspan="5">
<div class="columns"> <div class="columns">
<div class="column is-5"> <div class="column is-5">
<!-- <VDatePicker-->
<!-- v-model="generalParams.regSdat"-->
<!-- color="green"-->
<!-- disabled-->
<!-- trim-weeks-->
<!-- style="pointer-events: none;"-->
<!-- >-->
<!-- <template #default="{ inputValue, inputEvents }">-->
<!-- <VField>-->
<!-- <VControl icon="lucide:calendar">-->
<!-- <input-->
<!-- :readonly=true-->
<!-- class="input v-input"-->
<!-- type="text"-->
<!-- :value="inputValue"-->
<!-- v-on="inputEvents"-->
<!-- placeholder="시작일"-->
<!-- >-->
<!-- </VControl>-->
<!-- </VField>-->
<!-- </template>-->
<!-- </VDatePicker>-->
<input <input
:readonly=true :readonly=true
v-model="generalParams.regSdat" v-model="generalParams.regSdat"
class="input custom-text-filter" class="input custom-text-filter"
placeholder="제목" disabled
> >
</div> </div>
<div style="transform: translateY(15px)">~</div> <div style="transform: translateY(15px)">~</div>
<div class="column is-5"> <div class="column is-5">
<!-- <VDatePicker-->
<!-- v-model="generalParams.regEdat"-->
<!-- color="green"-->
<!-- trim-weeks-->
<!-- disabledDates=""-->
<!-- >-->
<!-- <template #default="{ inputValue, inputEvents }">-->
<!-- <VField>-->
<!-- <VControl icon="lucide:calendar">-->
<!-- <input-->
<!-- :readonly=true-->
<!-- class="input v-input"-->
<!-- type="text"-->
<!-- :value="inputValue"-->
<!-- v-on="inputEvents"-->
<!-- placeholder="종료일"-->
<!-- >-->
<!-- </VControl>-->
<!-- </VField>-->
<!-- </template>-->
<!-- </VDatePicker>-->
<input <input
:readonly=true :readonly=true
v-model="generalParams.regEdat" v-model="generalParams.regEdat"
class="input custom-text-filter" class="input custom-text-filter"
placeholder="제목" disabled
> >
</div> </div>
</div> </div>
@@ -359,14 +322,7 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
<td colspan="6"> <td colspan="6">
<slot name="status" v-if="!params.svyYn"> <slot name="status" v-if="!params.svyYn">
<div style="display: flex; justify-content: flex-end; gap: 8px;"> <div style="display: flex; justify-content: flex-end; gap: 8px;">
<!-- <VButton-->
<!-- color="primary"-->
<!-- icon="fas"-->
<!-- elevated-->
<!-- @click="showTable = !showTable"-->
<!-- >-->
<!-- 견적사 확인-->
<!-- </VButton>-->
<VButton <VButton
color="primary" color="primary"
icon="fas fa-circle" icon="fas fa-circle"

View File

@@ -222,16 +222,22 @@ const onFileChange = (e: any) => {
const onFilDelete = async (prcsNo: string, index: number, fileOrd: number) => { const onFilDelete = async (prcsNo: string, index: number, fileOrd: number) => {
notyf.dismissAll() notyf.dismissAll()
console.log(prcsNo) const confirmed = confirm('삭제하시겠습니까?')
if (prcsNo === undefined || prcsNo === null) { if (!prcsNo) {
if (confirmed){
pbAtts.value.splice(index, 1) pbAtts.value.splice(index, 1)
} }
else { } else {
await deletePrcsFile(params.prcsNo, fileOrd).then((res: string) => { if (confirmed) {
await deletePrcsFile(prcsNo, fileOrd).then((res: string) => {
notyf.success(res) notyf.success(res)
pbAtts.value.splice(index, 1) pbAtts.value.splice(index, 1)
}).catch((err) => {
notyf.error('삭제 중 오류가 발생했습니다.')
console.error(err)
}) })
} }
}
} }
const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: string) => { const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: string) => {
@@ -334,7 +340,7 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
<input <input
v-if="column.editable" v-if="column.editable"
v-model="row[column.key]" v-model="row[column.key]"
class="input editable-input" class="input custom-text-filter"
@blur="onInput(row, column)" @blur="onInput(row, column)"
/> />
<span v-else-if="column.key=='num'">{{index + 1}}</span> <span v-else-if="column.key=='num'">{{index + 1}}</span>
@@ -377,7 +383,9 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
@close="detailActionsOpen = false" @close="detailActionsOpen = false"
> >
<template #content> <template #content>
<div class="form-label">
<VButton color="success">일괄업로드</VButton> <VButton color="success">일괄업로드</VButton>
</div>
<ComVFlexTable <ComVFlexTable
:key="params.dtlSpecs.length" :key="params.dtlSpecs.length"
:data="params.dtlSpecs" :data="params.dtlSpecs"
@@ -391,7 +399,7 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
<input <input
v-if="column.editable" v-if="column.editable"
v-model="row[column.key]" v-model="row[column.key]"
class="editable-input input" class="input custom-text-filter"
/> />
<span v-else-if="column.key=='num'">{{index+1}}</span> <span v-else-if="column.key=='num'">{{index+1}}</span>
<span v-else-if="column.key=='delete'" class="lnil lnil-close" <span v-else-if="column.key=='delete'" class="lnil lnil-close"
@@ -514,9 +522,12 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
<div class="estimate-file-name"> <div class="estimate-file-name">
{{ f.logiFnm }}{{" ("}}{{Math.ceil(f.size / 1024)}}kb{{")"}} {{ f.logiFnm }}{{" ("}}{{Math.ceil(f.size / 1024)}}kb{{")"}}
</div> </div>
<div> <span>
<i class="fa fa-download estimate-file-download" @click="onPrcsFileDownload(f.prcsNo, f.fileOrd, f.logiFnm)" /> <i class="fa fa-download estimate-file-download" @click="onPrcsFileDownload(f.prcsNo, f.fileOrd, f.logiFnm)" />
</div> </span>
<span>
<i class="fa fa-trash estimate-file-delete" @click="onFilDelete(f.prcsNo, i, f.fileOrd)" />
</span>
</div> </div>
</VControl> </VControl>
</VField> </VField>
@@ -557,6 +568,9 @@ const onPrcsFileDownload = async (prcsNo: string, fileOrd: number, logiFnm: stri
placeholder="재중" placeholder="재중"
cd_grp=6 cd_grp=6
v-model="row.attendCd"> v-model="row.attendCd">
<!-- <template #code>-->
<!-- <span v-if="!row.attendCd">{{"재중"}}</span>-->
<!-- </template>-->
</VCodeSelect> </VCodeSelect>
</VField> </VField>
</span> </span>