견적서

This commit is contained in:
basssy 2024-11-18 08:43:55 +09:00
parent f1bede7bd3
commit 7ffe95b73e
2 changed files with 143 additions and 55 deletions

View File

@ -20,6 +20,7 @@ import ProductFeaturesPop from './popup/ProductFeaturesPop'
import { v4 as uuidv4 } from 'uuid' import { v4 as uuidv4 } from 'uuid'
export default function Estimate({ params }) { export default function Estimate({ params }) {
const fixedKey = 'itemKey'
const [itemChangeYn, setItemChangeYn] = useState(false) const [itemChangeYn, setItemChangeYn] = useState(false)
const { session } = useContext(SessionContext) const { session } = useContext(SessionContext)
const [objectNo, setObjectNo] = useState('') // const [objectNo, setObjectNo] = useState('') //
@ -304,8 +305,70 @@ export default function Estimate({ params }) {
setSelection(newSelection) setSelection(newSelection)
} }
//
const onChangeAmount = (value, dispOrder, index) => {
//itemChangeFlg = 1, partAdd = 0
let amount = value
amount = Number(value.replaceAll(',', ''))
if (isNaN(amount)) {
amount = 0
} else {
amount = amount.toLocaleString()
}
let updateList = []
let updates = {}
updates.amount = amount
updates.itemChangeFlg = '1'
updates.partAdd = '0'
updates.saleTotPrice = (Number(value.replaceAll(',', '')) * state.itemList[index].salePrice).toLocaleString()
updateList = state.itemList.map((item) => {
if (item.dispOrder === dispOrder) {
return { ...item, ...updates }
} else {
return item
}
})
setState({
itemList: updateList,
})
setItemChangeYn(true)
}
//
const onChangeSalePrice = (value, dispOrder, index) => {
//itemChangeFlg, partAdd
let salePrice
salePrice = Number(value.replaceAll(',', ''))
if (isNaN(salePrice)) {
salePrice = 0
} else {
salePrice = salePrice.toLocaleString()
}
let updateList = []
let updates = {}
updates.salePrice = salePrice
updates.saleTotPrice = (Number(value.replaceAll(',', '')) * state.itemList[index].amount).toLocaleString()
updateList = state.itemList.map((item) => {
if (item.dispOrder === dispOrder) {
return { ...item, ...updates }
} else {
return item
}
})
setState({
itemList: updateList,
})
setItemChangeYn(true)
}
// //
const onChangeDisplayItem = (itemId, dispOrder) => { const onChangeDisplayItem = (itemId, dispOrder, index) => {
const param = { const param = {
itemId: itemId, itemId: itemId,
} }
@ -333,17 +396,37 @@ export default function Estimate({ params }) {
updates.specialNoteCd = res.spnAttrCds updates.specialNoteCd = res.spnAttrCds
updates.itemGroup = res.itemGroup updates.itemGroup = res.itemGroup
updates.delFlg = '0' // 0 updates.delFlg = '0' // 0
updates.saleTotPrice = res.salePrice * state.itemList[index].amount
//104671
let bomList = res.itemBomList
updateList = state.itemList.map((item) => { updateList = state.itemList.map((item) => {
if (item.dispOrder === dispOrder) { if (item.dispOrder === dispOrder) {
return { ...item, ...updates } return { ...item, ...updates }
} else if (item.paDispOrder === dispOrder) {
return { ...item, delFlg: '1' }
} else { } else {
return item return item
} }
}) })
//paDispOrder
if (bomList) {
bomList.map((bomItem, index) => {
let newItemDispOrder = Math.max(...state.itemList.map((item) => item.dispOrder))
bomItem.dispOrder = index + 1 + newItemDispOrder
bomItem.delFlg = '0'
bomItem.objectNo = objectNo
bomItem.planNo = planNo
})
setState({
itemList: [...updateList, ...bomList],
})
} else {
setState({ setState({
itemList: updateList, itemList: updateList,
}) })
}
setItemChangeYn(true) setItemChangeYn(true)
}) })
@ -358,6 +441,9 @@ export default function Estimate({ params }) {
if (row2 === row.dispOrder) { if (row2 === row.dispOrder) {
delList.push({ ...row }) delList.push({ ...row })
} }
if (row2 === row.paDispOrder) {
delList.push({ ...row })
}
}) })
}) })
@ -390,14 +476,16 @@ export default function Estimate({ params }) {
useEffect(() => { useEffect(() => {
if (itemChangeYn) { if (itemChangeYn) {
// console.log(' ', itemChangeYn) console.log('아이템 상태 가져오기::::::::::', state.itemList)
console.log('아이템상태가져오기::::::::::', state.itemList) // console.log(' ::::::', itemList)
} //delFlg 0 ..
// false ..
setItemChangeYn(false) setItemChangeYn(false)
// settingToalInfo(state.itemList)
}
}, [itemChangeYn]) }, [itemChangeYn])
// const settingToalInfo = (itemList) => {}
return ( return (
<div className="sub-content estimate"> <div className="sub-content estimate">
<div className="sub-content-inner"> <div className="sub-content-inner">
@ -588,10 +676,10 @@ export default function Estimate({ params }) {
<> <>
<div className={`form-flex-wrap ${style}`} key={uuidv4()}> <div className={`form-flex-wrap ${style}`} key={uuidv4()}>
<div className="input-wrap mr5" style={{ width: '610px' }} key={`roof${index}`}> <div className="input-wrap mr5" style={{ width: '610px' }} key={`roof${index}`}>
<input type="text" className="input-light" defaultValue={roofList} readOnly /> <input type="text" className="input-light" value={roofList} readOnly />
</div> </div>
<div className="input-wrap" style={{ width: '200px' }}> <div className="input-wrap" style={{ width: '200px' }}>
<input type="text" className="input-light" defaultValue={constructSpecificationMulti[index]} readOnly /> <input type="text" className="input-light" value={constructSpecificationMulti[index]} readOnly />
</div> </div>
</div> </div>
</> </>
@ -880,7 +968,7 @@ export default function Estimate({ params }) {
type="button" type="button"
onClick={() => { onClick={() => {
addItem() addItem()
setItemChangeYn(true) // setItemChangeYn(true)
}} }}
> >
<span className="plus"></span> <span className="plus"></span>
@ -926,16 +1014,17 @@ export default function Estimate({ params }) {
</thead> </thead>
<tbody> <tbody>
{state?.itemList.length > 0 && {state?.itemList.length > 0 &&
state.itemList.map((item) => { state.itemList.map((item, index) => {
if (item.delFlg === '0') { if (item.delFlg === '0') {
return ( return (
<> <>
<tr key={uuidv4()}> <tr key={fixedKey}>
<td className="al-c"> <td className="al-c">
<div className="d-check-box light no-text"> <div className="d-check-box light no-text">
<input <input
type="checkbox" type="checkbox"
id={item?.dispOrder} id={item?.dispOrder}
disabled={item?.paDispOrder ? true : false}
onChange={() => onChangeSelect(item.dispOrder)} onChange={() => onChangeSelect(item.dispOrder)}
checked={selection.has(item.dispOrder) ? true : false} checked={selection.has(item.dispOrder) ? true : false}
/> />
@ -955,13 +1044,13 @@ export default function Estimate({ params }) {
options={displayItemList} options={displayItemList}
onChange={(e) => { onChange={(e) => {
if (isObjectNotEmpty(e)) { if (isObjectNotEmpty(e)) {
onChangeDisplayItem(e.itemId, item.dispOrder) onChangeDisplayItem(e.itemId, item.dispOrder, index)
} }
}} }}
getOptionLabel={(x) => x.itemName} getOptionLabel={(x) => x.itemName}
getOptionValue={(x) => x.itemId} getOptionValue={(x) => x.itemId}
isClearable={true} isClearable={false}
isDisabled={false} isDisabled={item?.paDispOrder ? true : false}
value={displayItemList.filter(function (option) { value={displayItemList.filter(function (option) {
return option.itemId === item.itemId return option.itemId === item.itemId
})} })}
@ -997,11 +1086,10 @@ export default function Estimate({ params }) {
<input <input
type="text" type="text"
className="input-light al-r" className="input-light al-r"
defaultValue={convertNumberToPriceDecimal(item?.amount)} value={item?.amount}
disabled={item.itemId === '' ? true : item?.paDispOrder ? true : false}
onChange={(e) => { onChange={(e) => {
//onChangeDisplayItem onChangeAmount(e.target.value, item.dispOrder, index)
//itemChangeFlg = 1, partAdd = 0
console.log('수량변경::::::::', e.target.value)
}} }}
/> />
</div> </div>
@ -1013,12 +1101,22 @@ export default function Estimate({ params }) {
<input <input
type="text" type="text"
className="input-light al-r" className="input-light al-r"
value={convertNumberToPriceDecimal(item?.salePrice)} value={item?.salePrice}
disabled={state?.estimateType === 'YJSS' ? (item.pkgMaterialFlg === '1' ? false : true) : false} disabled={
state?.estimateType === 'YJSS'
? item?.paDispOrder
? true
: item.pkgMaterialFlg === '1'
? false
: true
: item.itemdId === ''
? true
: item?.paDispOrder
? true
: false
}
onChange={(e) => { onChange={(e) => {
//onChangeDisplayItem onChangeSalePrice(e.target.value, item.dispOrder, index)
//itemChangeFlg, partAdd
console.log('단가변경:::::::', e.target.value)
}} }}
/> />
</div> </div>
@ -1027,7 +1125,7 @@ export default function Estimate({ params }) {
</div> */} </div> */}
</div> </div>
</td> </td>
<td className="al-r">{convertNumberToPriceDecimal(item?.saleTotPrice)}</td> <td className="al-r">{item?.saleTotPrice}</td>
</tr> </tr>
</> </>
) )

View File

@ -82,7 +82,9 @@ export const useEstimateController = (planNo) => {
} }
const addItem = () => { const addItem = () => {
const newItemDispOrder = Math.max(...state.itemList.map((item) => item.dispOrder)) + 1 // const newItemDispOrder = (Math.max(...state.itemList.map((item) => item.dispOrder)) / 100 + 1) * 100
let newItemDispOrder = Math.max(...state.itemList.map((item) => item.dispOrder))
newItemDispOrder = (Math.floor(newItemDispOrder / 100) + 1) * 100
setState({ setState({
itemList: [ itemList: [
...state.itemList, ...state.itemList,
@ -96,8 +98,8 @@ export const useEstimateController = (planNo) => {
amount: '', //수량 amount: '', //수량
unitPrice: '0', unitPrice: '0',
unit: '', //단위 unit: '', //단위
salePrice: '0', //단가 salePrice: '', //단가
saleTotPrice: '0', //금액(부가세별도) saleTotPrice: '', //금액(부가세별도)
itemChangeFlg: '1', //추가시 체인지플래그 1로 itemChangeFlg: '1', //추가시 체인지플래그 1로
partAdd: '1', //NEW 체인지 플래그 partAdd: '1', //NEW 체인지 플래그
delFlg: '0', //삭제 플래그 0 삭제하면 1 delFlg: '0', //삭제 플래그 0 삭제하면 1
@ -143,18 +145,18 @@ export const useEstimateController = (planNo) => {
// console.log('첨부파일:::::', estimateData.fileList) // console.log('첨부파일:::::', estimateData.fileList)
//첨부파일을 첨부안했는데 //첨부파일을 첨부안했는데
//아이템 fileUploadFlg가1(첨부파일 필수)이 1개라도 있는데 후일 자료 제출(fileFlg) 체크안했으면(0) alert 저장안돼 //아이템 fileUploadFlg가1(첨부파일 필수)이 1개라도 있는데 후일 자료 제출(fileFlg) 체크안했으면(0) alert 저장안돼
// if (estimateData.fileList.length < 1) { if (estimateData.fileList.length < 1) {
// if (estimateData.itemList.length > 1) { if (estimateData.itemList.length > 1) {
// estimateData.itemList.map((row) => { estimateData.itemList.map((row) => {
// if (row.fileUploadFlg === '1') { if (row.fileUploadFlg === '1') {
// if (estimateData.fileFlg === '0') { if (estimateData.fileFlg === '0') {
// alert(getMessage('estimate.detail.save.requiredMsg')) alert(getMessage('estimate.detail.save.requiredMsg'))
// flag = false flag = false
// } }
// } }
// }) })
// } }
// } }
if (flag) { if (flag) {
//1. 첨부파일 저장시작 //1. 첨부파일 저장시작
@ -184,24 +186,12 @@ export const useEstimateController = (planNo) => {
console.log('최종 정보::;', estimateData) console.log('최종 정보::;', estimateData)
console.log('최종 남은 아이템정보:::', estimateData.itemList) console.log('최종 남은 아이템정보:::', estimateData.itemList)
//2. 상세데이터 저장 //2. 상세데이터 저장
return // return
await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => { await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => {
if (res) { if (res) {
alert(getMessage('estimate.detail.save.alertMsg')) alert(getMessage('estimate.detail.save.alertMsg'))
} }
}) })
// try {
// const result = await promisePost({
// url: ESTIMATE_API_ENDPOINT,
// data: estimateData,
// })
// alert(getMessage('estimate.detail.save.alertMsg'))
// return result
// } catch (error) {
// console.error('Failed to submit estimate:', error)
// throw error
// }
} }
} }