견적서
This commit is contained in:
parent
f1bede7bd3
commit
7ffe95b73e
@ -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>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
|
|||||||
@ -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
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user