견적서
This commit is contained in:
parent
f1bede7bd3
commit
7ffe95b73e
@ -20,6 +20,7 @@ import ProductFeaturesPop from './popup/ProductFeaturesPop'
|
||||
import { v4 as uuidv4 } from 'uuid'
|
||||
|
||||
export default function Estimate({ params }) {
|
||||
const fixedKey = 'itemKey'
|
||||
const [itemChangeYn, setItemChangeYn] = useState(false)
|
||||
const { session } = useContext(SessionContext)
|
||||
const [objectNo, setObjectNo] = useState('') //물건번호
|
||||
@ -304,8 +305,70 @@ export default function Estimate({ params }) {
|
||||
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 = {
|
||||
itemId: itemId,
|
||||
}
|
||||
@ -333,17 +396,37 @@ export default function Estimate({ params }) {
|
||||
updates.specialNoteCd = res.spnAttrCds
|
||||
updates.itemGroup = res.itemGroup
|
||||
updates.delFlg = '0' // 삭제플래그 0
|
||||
updates.saleTotPrice = res.salePrice * state.itemList[index].amount
|
||||
//104671
|
||||
let bomList = res.itemBomList
|
||||
|
||||
updateList = state.itemList.map((item) => {
|
||||
if (item.dispOrder === dispOrder) {
|
||||
return { ...item, ...updates }
|
||||
} else if (item.paDispOrder === dispOrder) {
|
||||
return { ...item, delFlg: '1' }
|
||||
} else {
|
||||
return item
|
||||
}
|
||||
})
|
||||
setState({
|
||||
itemList: updateList,
|
||||
})
|
||||
//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({
|
||||
itemList: updateList,
|
||||
})
|
||||
}
|
||||
|
||||
setItemChangeYn(true)
|
||||
})
|
||||
@ -358,6 +441,9 @@ export default function Estimate({ params }) {
|
||||
if (row2 === row.dispOrder) {
|
||||
delList.push({ ...row })
|
||||
}
|
||||
if (row2 === row.paDispOrder) {
|
||||
delList.push({ ...row })
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
@ -390,14 +476,16 @@ export default function Estimate({ params }) {
|
||||
|
||||
useEffect(() => {
|
||||
if (itemChangeYn) {
|
||||
// console.log('아이템에 뭔가 변화가 일어났어', itemChangeYn)
|
||||
console.log('아이템상태가져오기::::::::::', state.itemList)
|
||||
}
|
||||
console.log('아이템 상태 가져오기::::::::::', state.itemList)
|
||||
// console.log('토탈쪽 셋팅해주기위한 함수::::::', itemList)
|
||||
//delFlg 0인거 중에..
|
||||
setItemChangeYn(false)
|
||||
|
||||
//다시 false로 돌리기 여기서할지 가격정보 변경하는거 끝나고할지..
|
||||
setItemChangeYn(false)
|
||||
// settingToalInfo(state.itemList)
|
||||
}
|
||||
}, [itemChangeYn])
|
||||
|
||||
// const settingToalInfo = (itemList) => {}
|
||||
return (
|
||||
<div className="sub-content estimate">
|
||||
<div className="sub-content-inner">
|
||||
@ -588,10 +676,10 @@ export default function Estimate({ params }) {
|
||||
<>
|
||||
<div className={`form-flex-wrap ${style}`} key={uuidv4()}>
|
||||
<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 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>
|
||||
</>
|
||||
@ -880,7 +968,7 @@ export default function Estimate({ params }) {
|
||||
type="button"
|
||||
onClick={() => {
|
||||
addItem()
|
||||
setItemChangeYn(true)
|
||||
// setItemChangeYn(true)
|
||||
}}
|
||||
>
|
||||
<span className="plus"></span>
|
||||
@ -926,16 +1014,17 @@ export default function Estimate({ params }) {
|
||||
</thead>
|
||||
<tbody>
|
||||
{state?.itemList.length > 0 &&
|
||||
state.itemList.map((item) => {
|
||||
state.itemList.map((item, index) => {
|
||||
if (item.delFlg === '0') {
|
||||
return (
|
||||
<>
|
||||
<tr key={uuidv4()}>
|
||||
<tr key={fixedKey}>
|
||||
<td className="al-c">
|
||||
<div className="d-check-box light no-text">
|
||||
<input
|
||||
type="checkbox"
|
||||
id={item?.dispOrder}
|
||||
disabled={item?.paDispOrder ? true : false}
|
||||
onChange={() => onChangeSelect(item.dispOrder)}
|
||||
checked={selection.has(item.dispOrder) ? true : false}
|
||||
/>
|
||||
@ -955,13 +1044,13 @@ export default function Estimate({ params }) {
|
||||
options={displayItemList}
|
||||
onChange={(e) => {
|
||||
if (isObjectNotEmpty(e)) {
|
||||
onChangeDisplayItem(e.itemId, item.dispOrder)
|
||||
onChangeDisplayItem(e.itemId, item.dispOrder, index)
|
||||
}
|
||||
}}
|
||||
getOptionLabel={(x) => x.itemName}
|
||||
getOptionValue={(x) => x.itemId}
|
||||
isClearable={true}
|
||||
isDisabled={false}
|
||||
isClearable={false}
|
||||
isDisabled={item?.paDispOrder ? true : false}
|
||||
value={displayItemList.filter(function (option) {
|
||||
return option.itemId === item.itemId
|
||||
})}
|
||||
@ -997,11 +1086,10 @@ export default function Estimate({ params }) {
|
||||
<input
|
||||
type="text"
|
||||
className="input-light al-r"
|
||||
defaultValue={convertNumberToPriceDecimal(item?.amount)}
|
||||
value={item?.amount}
|
||||
disabled={item.itemId === '' ? true : item?.paDispOrder ? true : false}
|
||||
onChange={(e) => {
|
||||
//onChangeDisplayItem참고
|
||||
//itemChangeFlg = 1, partAdd = 0 셋팅
|
||||
console.log('수량변경::::::::', e.target.value)
|
||||
onChangeAmount(e.target.value, item.dispOrder, index)
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
@ -1013,12 +1101,22 @@ export default function Estimate({ params }) {
|
||||
<input
|
||||
type="text"
|
||||
className="input-light al-r"
|
||||
value={convertNumberToPriceDecimal(item?.salePrice)}
|
||||
disabled={state?.estimateType === 'YJSS' ? (item.pkgMaterialFlg === '1' ? false : true) : false}
|
||||
value={item?.salePrice}
|
||||
disabled={
|
||||
state?.estimateType === 'YJSS'
|
||||
? item?.paDispOrder
|
||||
? true
|
||||
: item.pkgMaterialFlg === '1'
|
||||
? false
|
||||
: true
|
||||
: item.itemdId === ''
|
||||
? true
|
||||
: item?.paDispOrder
|
||||
? true
|
||||
: false
|
||||
}
|
||||
onChange={(e) => {
|
||||
//onChangeDisplayItem참고
|
||||
//itemChangeFlg, partAdd 받아온 그대로
|
||||
console.log('단가변경:::::::', e.target.value)
|
||||
onChangeSalePrice(e.target.value, item.dispOrder, index)
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
@ -1027,7 +1125,7 @@ export default function Estimate({ params }) {
|
||||
</div> */}
|
||||
</div>
|
||||
</td>
|
||||
<td className="al-r">{convertNumberToPriceDecimal(item?.saleTotPrice)}</td>
|
||||
<td className="al-r">{item?.saleTotPrice}</td>
|
||||
</tr>
|
||||
</>
|
||||
)
|
||||
|
||||
@ -82,7 +82,9 @@ export const useEstimateController = (planNo) => {
|
||||
}
|
||||
|
||||
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({
|
||||
itemList: [
|
||||
...state.itemList,
|
||||
@ -96,8 +98,8 @@ export const useEstimateController = (planNo) => {
|
||||
amount: '', //수량
|
||||
unitPrice: '0',
|
||||
unit: '', //단위
|
||||
salePrice: '0', //단가
|
||||
saleTotPrice: '0', //금액(부가세별도)
|
||||
salePrice: '', //단가
|
||||
saleTotPrice: '', //금액(부가세별도)
|
||||
itemChangeFlg: '1', //추가시 체인지플래그 1로
|
||||
partAdd: '1', //NEW 체인지 플래그
|
||||
delFlg: '0', //삭제 플래그 0 삭제하면 1
|
||||
@ -143,18 +145,18 @@ export const useEstimateController = (planNo) => {
|
||||
// console.log('첨부파일:::::', estimateData.fileList)
|
||||
//첨부파일을 첨부안했는데
|
||||
//아이템 fileUploadFlg가1(첨부파일 필수)이 1개라도 있는데 후일 자료 제출(fileFlg) 체크안했으면(0) alert 저장안돼
|
||||
// if (estimateData.fileList.length < 1) {
|
||||
// if (estimateData.itemList.length > 1) {
|
||||
// estimateData.itemList.map((row) => {
|
||||
// if (row.fileUploadFlg === '1') {
|
||||
// if (estimateData.fileFlg === '0') {
|
||||
// alert(getMessage('estimate.detail.save.requiredMsg'))
|
||||
// flag = false
|
||||
// }
|
||||
// }
|
||||
// })
|
||||
// }
|
||||
// }
|
||||
if (estimateData.fileList.length < 1) {
|
||||
if (estimateData.itemList.length > 1) {
|
||||
estimateData.itemList.map((row) => {
|
||||
if (row.fileUploadFlg === '1') {
|
||||
if (estimateData.fileFlg === '0') {
|
||||
alert(getMessage('estimate.detail.save.requiredMsg'))
|
||||
flag = false
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
if (flag) {
|
||||
//1. 첨부파일 저장시작
|
||||
@ -184,24 +186,12 @@ export const useEstimateController = (planNo) => {
|
||||
console.log('최종 정보::;', estimateData)
|
||||
console.log('최종 남은 아이템정보:::', estimateData.itemList)
|
||||
//2. 상세데이터 저장
|
||||
return
|
||||
// return
|
||||
await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => {
|
||||
if (res) {
|
||||
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
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user