견적서 상세

This commit is contained in:
basssy 2024-11-14 11:27:40 +09:00
parent cda5b1c1dd
commit c3f03d86c2
5 changed files with 64 additions and 29 deletions

View File

@ -55,7 +55,7 @@ export default function Estimate({ params }) {
const objectRecoil = useRecoilValue(floorPlanObjectState) const objectRecoil = useRecoilValue(floorPlanObjectState)
// //
const { state, setState, addItem } = useEstimateController(params.pid) const { state, setState, addItem, handleEstimateFileDownload } = useEstimateController(params.pid)
// List // List
const [specialNoteList, setSpecialNoteList] = useState([]) const [specialNoteList, setSpecialNoteList] = useState([])
@ -170,7 +170,6 @@ export default function Estimate({ params }) {
objectNo: objectNo, objectNo: objectNo,
no: no, no: no,
} }
await promisePost({ url: 'api/file/fileDelete', data: delParams }).then((res) => { await promisePost({ url: 'api/file/fileDelete', data: delParams }).then((res) => {
if (res.status === 204) { if (res.status === 204) {
setOriginFiles(originFiles.filter((file) => file.objectNo === objectNo && file.no !== no)) setOriginFiles(originFiles.filter((file) => file.objectNo === objectNo && file.no !== no))
@ -181,13 +180,6 @@ export default function Estimate({ params }) {
}) })
} }
//
// useEffect(() => {
// if (isNotEmptyArray(state.itemList)) {
// setItemList(state.itemList)
// }
// }, [state?.itemList])
// option // option
useEffect(() => { useEffect(() => {
if (state.estimateType !== '') { if (state.estimateType !== '') {
@ -267,7 +259,7 @@ export default function Estimate({ params }) {
setSelection(newSelection) setSelection(newSelection)
} }
// //
const onChangeDisplayItem = (itemId, dispOrder) => { const onChangeDisplayItem = (itemId, dispOrder) => {
const param = { const param = {
itemId: itemId, itemId: itemId,
@ -282,7 +274,8 @@ export default function Estimate({ params }) {
updates.itemId = res.itemId updates.itemId = res.itemId
updates.itemNo = '' // updates.itemNo = '' //
updates.itemName = res.itemName updates.itemName = res.itemName
updates.itemChangeFlg = '1' //1 updates.itemChangeFlg = '1' // 1
updates.partAdd = '1' //1 NEW
updates.fileUploadFlg = res.fileUploadFlg updates.fileUploadFlg = res.fileUploadFlg
updates.unit = res.unit updates.unit = res.unit
updates.unitPrice = res.salePrice //unitPrice salePrice updates.unitPrice = res.salePrice //unitPrice salePrice
@ -294,6 +287,7 @@ export default function Estimate({ params }) {
updates.unit = res.unit updates.unit = res.unit
updates.specialNoteCd = res.spnAttrCds updates.specialNoteCd = res.spnAttrCds
updates.itemGroup = res.itemGroup updates.itemGroup = res.itemGroup
updates.delFlg = '0' // 0
updateList = state.itemList.map((item) => { updateList = state.itemList.map((item) => {
if (item.dispOrder === dispOrder) { if (item.dispOrder === dispOrder) {
@ -619,9 +613,16 @@ export default function Estimate({ params }) {
originFiles.map((originFile) => { originFiles.map((originFile) => {
return ( return (
<li className="file-item"> <li className="file-item">
<span> <span onClick={() => handleEstimateFileDownload(originFile)}>
{originFile.faileName} {originFile.faileName}
<button className="delete" onClick={() => deleteOriginFile(originFile.objectNo, originFile.no)}></button> <button
type="button"
className="delete"
onClick={(e) => {
deleteOriginFile(originFile.objectNo, originFile.no)
e.stopPropagation()
}}
></button>
</span> </span>
</li> </li>
) )
@ -888,7 +889,8 @@ export default function Estimate({ params }) {
})} })}
/> />
</div> </div>
{item?.itemChangeFlg === '1' && ( {/* {item?.itemChangeFlg === '1' && ( */}
{item?.partAdd === '1' && (
<div className="btn-area"> <div className="btn-area">
<span className="tb_ico change_check"></span> <span className="tb_ico change_check"></span>
</div> </div>
@ -921,6 +923,7 @@ export default function Estimate({ params }) {
defaultValue={convertNumberToPriceDecimal(item?.amount)} defaultValue={convertNumberToPriceDecimal(item?.amount)}
onChange={(e) => { onChange={(e) => {
//onChangeDisplayItem //onChangeDisplayItem
//itemChangeFlg = 1, partAdd = 0
console.log('수량변경::::::::', e.target.value) console.log('수량변경::::::::', e.target.value)
}} }}
/> />
@ -936,6 +939,7 @@ export default function Estimate({ params }) {
value={convertNumberToPriceDecimal(item?.salePrice)} value={convertNumberToPriceDecimal(item?.salePrice)}
onChange={(e) => { onChange={(e) => {
//onChangeDisplayItem //onChangeDisplayItem
//itemChangeFlg, partAdd
console.log('단가변경:::::::', e.target.value) console.log('단가변경:::::::', e.target.value)
}} }}
/> />

View File

@ -22,7 +22,7 @@ export default function StuffHeader() {
if (res != null && res != '') { if (res != null && res != '') {
setHeaderData(res) setHeaderData(res)
} else { } else {
alert(getMessage('stuff.detail.header.message1')) alert(getMessage('stuff.detail.header.notExistObjectNo'))
router.push('/management/stuff') router.push('/management/stuff')
} }
}) })

View File

@ -93,6 +93,8 @@ export const useEstimateController = (planNo) => {
salePrice: '0', //단가 salePrice: '0', //단가
saleTotPrice: '0', //금액(부가세별도) saleTotPrice: '0', //금액(부가세별도)
itemChangeFlg: '1', //추가시 체인지플래그 1로 itemChangeFlg: '1', //추가시 체인지플래그 1로
partAdd: '1', //NEW 체인지 플래그
delFlg: '0', //삭제 플래그 0 삭제하면 1
}, },
], ],
}) })
@ -102,34 +104,62 @@ export const useEstimateController = (planNo) => {
setEstimateData({ ...state, userId: session.userId, sapSalesStoreCd: session.custCd }) setEstimateData({ ...state, userId: session.userId, sapSalesStoreCd: session.custCd })
}, [state]) }, [state])
// 첨부파일 다운로드
const handleEstimateFileDownload = async (originFile) => {
const options = { responseType: 'blob' }
console.log('첨부파일 다운로드 호출:::::::', originFile)
await promisePost({ url: `/api/file/fileDownload`, data: originFile, option: options })
.then((resultData) => {
if (resultData) {
const blob = new Blob([resultData.data], { type: resultData.headers['content-type'] || 'application/octet-stream' })
const fileUrl = window.URL.createObjectURL(blob)
const link = document.createElement('a')
link.href = fileUrl
link.download = file.srcFileNm
document.body.appendChild(link)
link.click()
link.remove()
window.URL.revokeObjectURL(fileUrl)
}
})
.catch((error) => {
alert('File does not exist.')
})
}
//견적서 저장 //견적서 저장
const handleEstimateSubmit = async () => { const handleEstimateSubmit = async () => {
//0. 필수체크 //0. 필수체크
let flag = true let flag = true
console.log('::담긴 estimateData:::', estimateData) console.log('::담긴 estimateData:::', estimateData)
// console.log('첨부파일:::::', estimateData.fileList)
//첨부파일을 첨부안했는데
//아이템 fileUploadFlg가1(첨부파일 필수)이 1개라도 있는데 후일 자료 제출(fileFlg) 체크안했으면(0) alert 저장안돼 //아이템 fileUploadFlg가1(첨부파일 필수)이 1개라도 있는데 후일 자료 제출(fileFlg) 체크안했으면(0) alert 저장안돼
if (estimateData.itemList.length > 1) { if (estimateData.fileList.length < 1) {
estimateData.itemList.map((row) => { if (estimateData.itemList.length > 1) {
if (row.fileUploadFlg === '1') { estimateData.itemList.map((row) => {
if (estimateData.fileFlg === '0') { if (row.fileUploadFlg === '1') {
alert(getMessage('estimate.detail.save.requiredMsg')) if (estimateData.fileFlg === '0') {
flag = false alert(getMessage('estimate.detail.save.requiredMsg'))
flag = false
}
} }
} })
}) }
} }
if (flag) { if (flag) {
//1. 첨부파일 저장 //1. 첨부파일 저장
const formData = new FormData() const formData = new FormData()
console.log('첨부파일:!!!', estimateData.fileList)
formData.append('file', estimateData.fileList) formData.append('file', estimateData.fileList)
formData.append('objectNo', estimateData.objectNo) formData.append('objectNo', estimateData.objectNo)
formData.append('planNo', estimateData.planNo) formData.append('planNo', estimateData.planNo)
formData.append('category', '10') formData.append('category', '10')
formData.append('userId', estimateData.userId) formData.append('userId', estimateData.userId)
// for (const value of formData.values()) {
// console.log('formData::', value)
// }
await post({ url: '/api/file/fileUpload', data: formData }) await post({ url: '/api/file/fileUpload', data: formData })
@ -162,5 +192,6 @@ export const useEstimateController = (planNo) => {
addItem, addItem,
handleEstimateSubmit, handleEstimateSubmit,
fetchSetting, fetchSetting,
handleEstimateFileDownload,
} }
} }

View File

@ -616,7 +616,7 @@
"stuff.planReqPopup.title": "設計依頼のインポート", "stuff.planReqPopup.title": "設計依頼のインポート",
"stuff.temp.subTitle": "商品情報", "stuff.temp.subTitle": "商品情報",
"stuff.temp.subTitle2": "作図", "stuff.temp.subTitle2": "作図",
"stuff.detail.header.message1": "存在しないものです。", "stuff.detail.header.notExistObjectNo": "存在しないものです。",
"stuff.detail.header.message2": "商品番号がコピーされました。", "stuff.detail.header.message2": "商品番号がコピーされました。",
"stuff.detail.header.message3": "存在しないものです。", "stuff.detail.header.message3": "存在しないものです。",
"stuff.detail.header.objectNo": "商品番号のコピーに失敗しました。", "stuff.detail.header.objectNo": "商品番号のコピーに失敗しました。",

View File

@ -626,7 +626,7 @@
"stuff.planReqPopup.title": "설계의뢰 불러오기", "stuff.planReqPopup.title": "설계의뢰 불러오기",
"stuff.temp.subTitle": "물건정보", "stuff.temp.subTitle": "물건정보",
"stuff.temp.subTitle2": "도면작성", "stuff.temp.subTitle2": "도면작성",
"stuff.detail.header.message1": "존재하지 않는 물건입니다.", "stuff.detail.header.notExistObjectNo": "존재하지 않는 물건입니다.",
"stuff.detail.header.message2": "물건번호가 복사되었습니다.", "stuff.detail.header.message2": "물건번호가 복사되었습니다.",
"stuff.detail.header.message3": "물건번호 복사에 실패했습니다.", "stuff.detail.header.message3": "물건번호 복사에 실패했습니다.",
"stuff.detail.header.objectNo": "물건번호", "stuff.detail.header.objectNo": "물건번호",