You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1120 lines
47 KiB
1120 lines
47 KiB
const pricereviewCreate = () => {
|
|
return {
|
|
init() {
|
|
this.elevators = elevators;
|
|
this.is_renovation = is_renovation
|
|
this.selectedOptions = selectedOptions;
|
|
this.otherOptions = otherOptions;
|
|
console.log(this.selectedOptions);
|
|
},
|
|
openFn:{
|
|
4:'2U',
|
|
5:"4PCO",
|
|
7:"6PCO",
|
|
8:"2S",
|
|
9:"CO"
|
|
},
|
|
optionalArr: {
|
|
1: '標配',
|
|
2: '選配',
|
|
3: '選配',
|
|
},
|
|
total_spec: total_spec,
|
|
options: options,
|
|
// orioptions: options,
|
|
searchtext: '',
|
|
kind: 1,
|
|
subkind: 1,
|
|
buttons: [],
|
|
modalSelectedOptions: {},
|
|
selectedOptions: [],
|
|
elevators: [],
|
|
toElevators: [],
|
|
toElevatorNo: '',
|
|
currentOptionKey: '',
|
|
currentOtherOptionKey: '',
|
|
currentMaintainOptionKey: '',
|
|
currentDemolishOptionKey: '',
|
|
optionKey: optionKey,
|
|
otherOptionKey: otherOptionKey,
|
|
maintainOptionKey:1,
|
|
demolishOptionKey: demolishOptionKey,
|
|
modalElevatorInfo:{
|
|
spec:'',
|
|
person:'',
|
|
stop:'',
|
|
speed:'',
|
|
open:'CO',
|
|
num: 1,
|
|
price: '',
|
|
sale_price: '',
|
|
facility_id: '',
|
|
model:'',
|
|
},
|
|
otherOptions: [],
|
|
modalOtherOptionInfo: {
|
|
pr_no: "",
|
|
name: "",
|
|
price: 0,
|
|
num: "",
|
|
},
|
|
maintainOptions: [],
|
|
modalMaintainInfo: {
|
|
price: 0,
|
|
num: "",
|
|
memo: "",
|
|
},
|
|
demolishOptions: demolishOptions,
|
|
modalDemolishOptionsInfo:{
|
|
person:"",
|
|
floor:"",
|
|
price: 0,
|
|
qty:"",
|
|
},
|
|
paymentRatio:paymentRatio,
|
|
serviceFee: serviceFee,
|
|
transactionDate: transactionDate,
|
|
shippingDate: shippingDate,
|
|
remark: remark,
|
|
penalty: penalty,
|
|
deposit_rate: deposit_rate,
|
|
keep_rate: keep_rate,
|
|
warranty_rate: warranty_rate,
|
|
customerInfo:{
|
|
contractno: contractno,
|
|
company: customer,
|
|
manager: manager,
|
|
address: address,
|
|
case_name: case_name,
|
|
uscc: uscc,
|
|
person: salesman,
|
|
},
|
|
weightArr: {
|
|
6: 450,
|
|
8: 550,
|
|
9: 600,
|
|
10: 700,
|
|
11:750,
|
|
12:800,
|
|
13:900,
|
|
15:1000,
|
|
17:1150,
|
|
20:1350,
|
|
24:1600,
|
|
},
|
|
is_renovation: is_renovation,
|
|
async getElevatorPrice(idx){
|
|
const spec = this.elevators[idx].specifications
|
|
const person = this.elevators[idx].person
|
|
const stop = this.elevators[idx].stop
|
|
const open_converted = this.elevators[idx].open_converted
|
|
const speed = this.elevators[idx].speed
|
|
let model= "";
|
|
if(spec == 'M1' || spec=='M1+M4(1:1)' || spec == 'M1+M4(2:1)'){
|
|
model = "P" + person + "-" + this.weightArr[person] + "-" + open_converted + "-" + speed + "-" + stop
|
|
this.elevators[idx].model = model
|
|
}
|
|
else{
|
|
model = spec + '-' + person + '*' + stop + '-' + open_converted + speed;
|
|
this.elevators[idx].model = model
|
|
}
|
|
|
|
try{
|
|
const res = await axios.get("./api/getElevatorPrice.php", {params: {model: model, kind: spec}})
|
|
console.log(res.data);
|
|
if (res.data == null || res.data == "") {
|
|
console.log("公司並無提供此規格!!");
|
|
}
|
|
this.elevators[idx].price = res.data
|
|
} catch (error) {
|
|
console.error("Error fetching elevator price:", error);
|
|
}
|
|
|
|
},
|
|
async getModalElevatorPrice(){
|
|
let model = "";
|
|
let kind = this.modalElevatorInfo.spec;
|
|
if(kind == 'M1' || kind=='M1+M4(1:1)' || kind == 'M1+M4(2:1)'){
|
|
model = "P" + this.modalElevatorInfo.person + "-" + this.weightArr[this.modalElevatorInfo.person] + "-" + this.modalElevatorInfo.open + "-" + this.modalElevatorInfo.speed + "-" + this.modalElevatorInfo.stop
|
|
this.modalElevatorInfo.model = "P" + this.modalElevatorInfo.person + "-" + this.weightArr[this.modalElevatorInfo.person] + "-" + this.modalElevatorInfo.open + "-" + this.modalElevatorInfo.speed + "-" + this.modalElevatorInfo.stop
|
|
}else{
|
|
model = this.modalElevatorInfo.spec + '-' + this.modalElevatorInfo.person + '*' + this.modalElevatorInfo.stop + '-' + this.modalElevatorInfo.open + this.modalElevatorInfo.speed;
|
|
this.modalElevatorInfo.model = this.modalElevatorInfo.spec + '-' + this.modalElevatorInfo.person + '*' + this.modalElevatorInfo.stop + '-' + this.modalElevatorInfo.open + this.modalElevatorInfo.speed;
|
|
}
|
|
try{
|
|
const res = await axios.get("./api/getElevatorPrice.php", {params: {model: model, kind:kind}})
|
|
console.log(res.data);
|
|
if (res.data == null || res.data == "") {
|
|
console.log("公司並無提供此規格!!");
|
|
}
|
|
this.modalElevatorInfo.price = res.data
|
|
} catch (error) {
|
|
console.error("Error fetching elevator price:", error);
|
|
}
|
|
},
|
|
async getModalDemolishPrice(){
|
|
let person = this.modalDemolishOptionsInfo.person
|
|
let floor = this.modalDemolishOptionsInfo.floor
|
|
try{
|
|
const res = await axios.get('./api/getDemolishPrice.php', {params: {person:person, floor:floor}});
|
|
console.log(res.data);
|
|
if(!res.data){
|
|
this.modalDemolishOptionsInfo.price = 0
|
|
this.modalDemolishOptionsInfo.demolish_id = ''
|
|
return;
|
|
}
|
|
this.modalDemolishOptionsInfo.price = res.data.price
|
|
this.modalDemolishOptionsInfo.demolish_id = res.data.id
|
|
}catch (error) {
|
|
console.error("Error fetching demolish price:", error);
|
|
}
|
|
},
|
|
async getDemolishPrice(idx){
|
|
let person = this.demolishOptions[idx].person
|
|
let floor = this.demolishOptions[idx].floor
|
|
try{
|
|
const res = await axios.get('./api/getDemolishPrice.php', {params: {person:person, floor:floor}});
|
|
console.log(res.data);
|
|
if(!res.data){
|
|
this.demolishOptions[idx].price = 0
|
|
this.demolishOptions[idx].demolish_id = ''
|
|
return;
|
|
}
|
|
this.demolishOptions[idx].price = res.data.price
|
|
this.demolishOptions[idx].demolish_id = res.data.id
|
|
}catch (error) {
|
|
console.error("Error fetching demolish price:", error);
|
|
}
|
|
},
|
|
initButtons(kind) {
|
|
if (kind == 'A') {
|
|
this.buttons = [
|
|
{ name: '車廂意匠', type: 'A1' }
|
|
]
|
|
} else if (kind == 'B') {
|
|
this.buttons = [
|
|
{ name: '天井', type: 'B1' },
|
|
{ name: '地板', type: 'B2' },
|
|
{ name: '操縱盤', type: 'B3' },
|
|
{ name: '扶手', type: 'B4' },
|
|
{ name: '車廂門與層門(轎門/層門)', type: 'B5' },
|
|
{ name: '轎壁(車廂側板)', type: 'B6' },
|
|
{ name: '其他車廂內裝配件', type: 'B7' },
|
|
]
|
|
} else if (kind == 'C') {
|
|
this.buttons = [
|
|
{ name: '框', type: 'C1' },
|
|
{ name: '乘場指示器', type: 'C2' },
|
|
{ name: '燈', type: 'C3' },
|
|
{ name: '方式與門', type: 'C4' },
|
|
]
|
|
} else if (kind == 'D') {
|
|
this.buttons = [
|
|
{ name: '功能與配置', type: 'D1' },
|
|
{ name: 'OH與樓高', type: 'D2' },
|
|
]
|
|
} else if (kind == 'E') {
|
|
this.buttons = [
|
|
{ name: '平台梯', type: 'E1' },
|
|
]
|
|
} else if (kind == 'F') {
|
|
this.buttons = [
|
|
{ name: '汰改', type: 'F1' },
|
|
]
|
|
} else if (kind == 1) {
|
|
this.buttons = []
|
|
}
|
|
},
|
|
optionSubCategory: 1,
|
|
initOptinos() {
|
|
this.options.forEach(option => {
|
|
option.isShow = 1;
|
|
})
|
|
},
|
|
searchOptions(kind = this.kind, subkind = this.subkind) {
|
|
if (kind != null) this.kind = kind;
|
|
if (subkind != null) this.subkind = subkind;
|
|
this.initOptinos();
|
|
this.initButtons(kind);
|
|
this.options.forEach(option => {
|
|
if (option.kind != this.kind && this.kind != 1) {
|
|
option.isShow = 0;
|
|
} else {
|
|
if (option.subkind != this.subkind && this.subkind != 1) {
|
|
option.isShow = 0;
|
|
}
|
|
}
|
|
if (option.isShow == 1) {
|
|
if (option.group_name == null) option.group_name = ''
|
|
if (option.spec == null) option.spec = ''
|
|
if (option.memo == null) option.memo = ''
|
|
if (option.price == null) option.price = 0
|
|
if (option.unit == null) option.unit = ''
|
|
if (String(option.id).includes(this.searchtext) || option.group_name.includes(this.searchtext) || option.memo.toLowerCase().includes(this.searchtext) || option.spec.toLowerCase().includes(this.searchtext) || option.unit.includes(this.searchtext) || String(option.price).includes(this.searchtext)) {
|
|
option.isShow = 1
|
|
} else {
|
|
option.isShow = 0
|
|
}
|
|
}
|
|
})
|
|
},
|
|
selectOption(idx, id, name, price, memo) {
|
|
this.options[idx].selected = this.options[idx].selected == 1 ? 0 : 1;
|
|
|
|
if (this.modalSelectedOptions.hasOwnProperty(idx)) {
|
|
delete this.modalSelectedOptions[idx];
|
|
} else {
|
|
//this.optionKey => 已選option 流水號, idx:option表內的流水號, id:option 資料庫的ID
|
|
this.modalSelectedOptions[idx] = { key: this.optionKey, 'idx': idx, 'id': id, 'name': name, 'price': price, qty: 1, 'memo': memo, 'toElevator': [] }
|
|
}
|
|
this.optionKey++;
|
|
},
|
|
initModalSelectedOptions() {
|
|
this.modalSelectedOptions = {}
|
|
this.options.forEach(option => {
|
|
option.selected = 0
|
|
})
|
|
this.$refs.optionsModal.style.display = "block"
|
|
body.style.overflow = 'hidden'
|
|
},
|
|
chkOptions() {
|
|
Object.keys(this.modalSelectedOptions).forEach(option => {
|
|
this.selectedOptions.push(this.modalSelectedOptions[option])
|
|
})
|
|
console.log(this.selectedOptions);
|
|
this.hideOptionsModal();
|
|
},
|
|
hideOptionsModal() {
|
|
this.$refs.optionsModal.style.display = 'none';
|
|
body.style.overflow = 'auto'
|
|
},
|
|
hideToElevatorModal(){
|
|
this.$refs.toElevatorModal.style.display = 'none';
|
|
body.style.overflow = 'auto'
|
|
},
|
|
hideToOtherOptionElevatorModal(){
|
|
this.$refs.toOtherOptionElevatorModal.style.display = 'none';
|
|
body.style.overflow = 'auto'
|
|
},
|
|
hideToMaintainOptionElevatorModal(){
|
|
this.$refs.toMaintainOptionElevatorModal.style.display = 'none';
|
|
body.style.overflow = 'auto'
|
|
},
|
|
hideToDemolishOptionElevatorModal(){
|
|
this.$refs.toDemolishOptionElevatorModal.style.display = 'none';
|
|
body.style.overflow = 'auto'
|
|
},
|
|
hideCreateElevatorModal(){
|
|
this.$refs.createElevatorModal.style.display = 'none';
|
|
body.style.overflow = 'auto'
|
|
this.modalElevatorInfo = {
|
|
spec:'',
|
|
person:'',
|
|
stop:'',
|
|
speed:'',
|
|
open:'CO',
|
|
num: 1,
|
|
price:'',
|
|
sale_price:'',
|
|
model:'',
|
|
};
|
|
},
|
|
hideCreateOtherOptionModal(){
|
|
this.$refs.createOtherOptionModal.style.display = 'none';
|
|
body.style.overflow = 'auto'
|
|
},
|
|
hideCreateMaintainModal(){
|
|
this.$refs.createMaintainModal.style.display = 'none';
|
|
body.style.overflow = 'auto'
|
|
},
|
|
hideCreateDemolishModal(){
|
|
this.$refs.createDemolishModal.style.display = 'none';
|
|
body.style.overflow = 'auto'
|
|
},
|
|
openCreateElevatorModal(){
|
|
this.$refs.createElevatorModal.style.display = 'block';
|
|
body.style.overflow = 'hidden'
|
|
},
|
|
openCreateOtherOptionFn(){
|
|
this.$refs.createOtherOptionModal.style.display = 'block';
|
|
body.style.overflow = 'hidden'
|
|
},
|
|
openCreateMaintainModal(){
|
|
this.$refs.createMaintainModal.style.display = 'block';
|
|
body.style.overflow = 'hidden'
|
|
},
|
|
openCreateDemolishOptionModal(){
|
|
this.$refs.createDemolishModal.style.display = 'block';
|
|
body.style.overflow = 'hidden'
|
|
},
|
|
totalElevatorsPrice(){
|
|
return this.elevators.reduce((total, elevator) => {
|
|
return total + (elevator.spec_num * elevator.price);
|
|
}, 0);
|
|
},
|
|
totalElevatorsNum() {
|
|
return this.elevators.reduce((total, elevator) => {
|
|
return total + Number(elevator.spec_num);
|
|
}, 0)
|
|
},
|
|
totalElevatorsSalePrice() {
|
|
return this.elevators.reduce((total, elevator) => {
|
|
return total + (elevator.spec_num * elevator.spec_price);
|
|
}, 0);
|
|
},
|
|
totalOptionsPrice() {
|
|
return this.selectedOptions.reduce((total, option) => {
|
|
return total + (option.qty * option.price);
|
|
}, 0);
|
|
},
|
|
openAddElevatorFn() {
|
|
|
|
},
|
|
createElevatorFn() {
|
|
if (this.modalElevatorInfo.spec == '') return alert("請選擇電梯規格");
|
|
if (this.modalElevatorInfo.stop == '') return alert("請填入停數");
|
|
if (this.modalElevatorInfo.speed == '') return alert("請選擇速度");
|
|
if (this.modalElevatorInfo.open == '') return alert("請選擇開梯方式");
|
|
if (this.modalElevatorInfo.person == '') return alert("請填入人乘/載重");
|
|
if (this.modalElevatorInfo.num == '') return alert("請填入數量");
|
|
if (this.modalElevatorInfo.sale_price == '') return alert("請填入售價");
|
|
this.total_spec++;
|
|
this.elevators.push({
|
|
id: this.total_spec,
|
|
specifications: this.modalElevatorInfo.spec,
|
|
person: this.modalElevatorInfo.person,
|
|
stop: this.modalElevatorInfo.stop,
|
|
speed: this.modalElevatorInfo.speed,
|
|
open_converted: this.modalElevatorInfo.open,
|
|
spec_price: this.modalElevatorInfo.sale_price,
|
|
price: this.modalElevatorInfo.price,
|
|
open: '',
|
|
spec_num: this.modalElevatorInfo.num,
|
|
facility_id: this.modalElevatorInfo.facility_id,
|
|
model: this.modalElevatorInfo.model,
|
|
});
|
|
console.log(this.elevators);
|
|
this.hideCreateElevatorModal();
|
|
},
|
|
copyElevator(idx) {
|
|
const spec = this.elevators[idx].specifications
|
|
const person = this.elevators[idx].person
|
|
const stop = this.elevators[idx].stop
|
|
const open_converted = this.elevators[idx].open_converted
|
|
const speed = this.elevators[idx].speed
|
|
const spec_price = this.elevators[idx].spec_price
|
|
const open = this.elevators[idx].open
|
|
const spec_num = this.elevators[idx].spec_num
|
|
const price = this.elevators[idx].price
|
|
const facility_id = this.elevators[idx].facility_id
|
|
const model = this.elevators[idx].model
|
|
|
|
this.total_spec++;
|
|
this.elevators.push({
|
|
id: this.total_spec,
|
|
specifications: spec,
|
|
person: person,
|
|
stop: stop,
|
|
speed: speed,
|
|
open_converted: open_converted,
|
|
spec_price: spec_price,
|
|
price: price,
|
|
open: open,
|
|
spec_num: spec_num,
|
|
facility_id: facility_id,
|
|
model: model,
|
|
});
|
|
console.log(this.elevators);
|
|
},
|
|
copyOption(key){
|
|
const copyOption = this.selectedOptions.filter(option=> option.key === key)[0]
|
|
console.log(copyOption);
|
|
this.selectedOptions.push({
|
|
id: copyOption.id,
|
|
idx: copyOption.idx,
|
|
name: copyOption.name,
|
|
price: copyOption.price,
|
|
memo: copyOption.memo,
|
|
toElevator: [],
|
|
key: this.optionKey,
|
|
qty: copyOption.qty
|
|
})
|
|
|
|
this.optionKey++
|
|
console.log(this.selectedOptions);
|
|
},
|
|
copyOtherOption(id){
|
|
const copyOption = this.otherOptions.filter(option=> option.id === id)[0]
|
|
console.log(copyOption);
|
|
this.otherOptions.push({
|
|
id: this.otherOptionKey,
|
|
name: copyOption.name,
|
|
price: copyOption.price,
|
|
num: copyOption.num,
|
|
toElevator: [],
|
|
pr_no: copyOption.pr_no
|
|
})
|
|
console.log(this.otherOptions);
|
|
this.otherOptionKey++;
|
|
},
|
|
addOptionToElevator(key){
|
|
this.currentOptionKey = key;
|
|
this.toElevators = [];
|
|
this.toElevatorNo = "";
|
|
const matchElevators = this.selectedOptions.filter(option=> option.key == key)[0].toElevator.map(elevator=> elevator.id)
|
|
this.toElevatorNo = matchElevators[0]
|
|
this.elevators.forEach(elevator=>{
|
|
if(elevator.price > 0){
|
|
let bool = elevator.specifications=='M1' || elevator.specifications=='M1+M4(1:1)' || elevator.specifications=='M1+M4(2:1)' ;
|
|
let model = ''
|
|
if(bool){
|
|
model = 'P' + elevator.person + '-' + this.weightArr[elevator.person] + '-' + elevator.open_converted + '-' + elevator.speed + '-' + elevator.stop
|
|
}else{
|
|
model = elevator.specifications + '-' + elevator.person + '*' + elevator.stop + '-' + elevator.open_converted + elevator.speed
|
|
}
|
|
this.toElevators.push({
|
|
id: elevator.id,
|
|
model: model ,
|
|
checked: matchElevators.includes(elevator.id) ? 1: 0,
|
|
})
|
|
}
|
|
})
|
|
this.$refs.toElevatorModal.style.display = 'block';
|
|
body.style.overflow = 'hidden'
|
|
},
|
|
addOtherOptionToElevator(id) {
|
|
this.currentOtherOptionKey = id;
|
|
this.toElevators = [];
|
|
this.toElevatorNo = "";
|
|
const matchElevators = this.otherOptions.filter(option => option.id == id)[0].toElevator.map(elevator => elevator.id)
|
|
this.toElevatorNo = matchElevators[0]
|
|
this.elevators.forEach(elevator=>{
|
|
if(elevator.price > 0){
|
|
let bool = elevator.specifications=='M1' || elevator.specifications=='M1+M4(1:1)' || elevator.specifications=='M1+M4(2:1)' ;
|
|
let model = ''
|
|
if(bool){
|
|
model = 'P' + elevator.person + '-' + this.weightArr[elevator.person] + '-' +elevator.open_converted + '-' + elevator.speed + '-' + elevator.stop
|
|
}else{
|
|
model = elevator.specifications + '-' + elevator.person + '*' + elevator.stop + '-' + elevator.open_converted + elevator.speed
|
|
}
|
|
this.toElevators.push({
|
|
id: elevator.id,
|
|
model: model,
|
|
checked: matchElevators.includes(elevator.id) ? 1: 0,
|
|
})
|
|
}
|
|
})
|
|
|
|
this.$refs.toOtherOptionElevatorModal.style.display = 'block';
|
|
body.style.overflow = 'hidden'
|
|
},
|
|
chkOptionToElevators() {
|
|
const checkedOptions = [];
|
|
const matchElevators = this.elevators.filter(elevator=> elevator.id == this.toElevatorNo)[0]
|
|
|
|
checkedOptions.push({
|
|
id: this.toElevatorNo,
|
|
model: matchElevators['model'] ,
|
|
})
|
|
this.selectedOptions.forEach(option => {
|
|
if (option.key == this.currentOptionKey) {
|
|
option.toElevator = [];
|
|
option.toElevator.push(...checkedOptions)
|
|
}
|
|
})
|
|
this.currentOptionKey = ''
|
|
this.hideToElevatorModal();
|
|
},
|
|
chkOtherOptionToElevators() {
|
|
const checkedOptions = [];
|
|
|
|
const matchElevators = this.elevators.filter(elevator=> elevator.id == this.toElevatorNo)[0]
|
|
checkedOptions.push({
|
|
id: this.toElevatorNo,
|
|
model: matchElevators['model'],
|
|
})
|
|
this.otherOptions.forEach(option => {
|
|
if (option.id == this.currentOtherOptionKey) {
|
|
option.toElevator = [];
|
|
option.toElevator.push(...checkedOptions)
|
|
}
|
|
})
|
|
|
|
this.currentOtherOptionKey = ''
|
|
|
|
this.hideToOtherOptionElevatorModal();
|
|
},
|
|
removeElevator(id) {
|
|
if (!confirm("確定刪除嗎?")) return;
|
|
this.elevators = this.elevators.filter(elevator => elevator.id != id)
|
|
const issetElevators = [];
|
|
this.elevators.forEach(elevator => {
|
|
issetElevators.push(elevator.id);
|
|
})
|
|
|
|
this.selectedOptions.forEach(option => {
|
|
option.toElevator = option.toElevator.filter(el => {
|
|
return issetElevators.includes(el.id)
|
|
})
|
|
})
|
|
console.log(this.selectedOptions);
|
|
},
|
|
removeOption(key) {
|
|
console.log(this.selectedOptions);
|
|
this.selectedOptions = this.selectedOptions.filter(option => option.key != key)
|
|
},
|
|
removeOtherOption(id) {
|
|
this.otherOptions = this.otherOptions.filter(option => option.id != id)
|
|
},
|
|
createOtherOptionFn() {
|
|
this.otherOptions.push({
|
|
id: this.otherOptionKey,
|
|
pr_no: this.modalOtherOptionInfo.pr_no,
|
|
name: this.modalOtherOptionInfo.name,
|
|
price: this.modalOtherOptionInfo.price,
|
|
num: this.modalOtherOptionInfo.num,
|
|
toElevator: [],
|
|
})
|
|
this.modalOtherOptionInfo = {
|
|
pr_no: '',
|
|
name: '',
|
|
price: 0,
|
|
num: '',
|
|
}
|
|
this.otherOptionKey++;
|
|
console.log(this.otherOptions);
|
|
this.$refs.closeCreateOtherOptionModalBtn.click();
|
|
},
|
|
totalOtherOptionsPrice() {
|
|
return this.otherOptions.reduce((total, option) => {
|
|
return total + (Number(option.num) * Number(option.price));
|
|
}, 0);
|
|
},
|
|
totalOtherOptionsNum() {
|
|
return this.otherOptions.reduce((total, option) => {
|
|
return total + Number(option.num);
|
|
}, 0);
|
|
},
|
|
createMaintainOptionFn() {
|
|
this.maintainOptions.push({
|
|
id: this.maintainOptionKey,
|
|
price: this.modalMaintainInfo.price,
|
|
num: this.modalMaintainInfo.num,
|
|
memo: this.modalMaintainInfo.memo,
|
|
toElevator: [],
|
|
})
|
|
this.modalMaintainInfo = {
|
|
price: 0,
|
|
num: "",
|
|
memo: "",
|
|
}
|
|
this.maintainOptionKey++;
|
|
this.$refs.closeCreateMaintainOptionModalBtn.click();
|
|
},
|
|
createDemolishOptionFn(){
|
|
this.demolishOptions.push({
|
|
id: this.demolishOptionKey,
|
|
price: this.modalDemolishOptionsInfo.price,
|
|
qty: this.modalDemolishOptionsInfo.qty,
|
|
person: this.modalDemolishOptionsInfo.person,
|
|
floor: this.modalDemolishOptionsInfo.floor,
|
|
demolish_id: this.modalDemolishOptionsInfo.demolish_id,
|
|
toElevator:[],
|
|
})
|
|
this.modalDemolishOptionsInfo = {
|
|
person:"",
|
|
floor:"",
|
|
price: 0,
|
|
qty:"",
|
|
}
|
|
this.demolishOptionKey ++;
|
|
this.hideCreateDemolishModal();
|
|
},
|
|
totalMaintainOptionsPrice(){
|
|
return this.maintainOptions.reduce((total, option) => {
|
|
return total + (Number(option.num) * Number(option.price));
|
|
}, 0);
|
|
},
|
|
totalMaintainOptionsNum() {
|
|
return this.maintainOptions.reduce((total, option) => {
|
|
return total + Number(option.num);
|
|
}, 0);
|
|
},
|
|
totalDemolishOptionsPrice(){
|
|
return this.demolishOptions.reduce((total, option) => {
|
|
return total + (Number(option.qty) * Number(option.price));
|
|
}, 0);
|
|
},
|
|
totalDemolishOptionsNum(){
|
|
return this.demolishOptions.reduce((total, option) => {
|
|
return total + Number(option.qty);
|
|
}, 0);
|
|
},
|
|
chkMaintainOptionToElevators(){
|
|
const checkedOptions = [];
|
|
|
|
const matchElevators = this.elevators.filter(elevator=> elevator.id == this.toElevatorNo)[0]
|
|
checkedOptions.push({
|
|
id: this.toElevatorNo,
|
|
model: matchElevators['model'],
|
|
})
|
|
this.maintainOptions.forEach(option => {
|
|
if (option.id == this.currentMaintainOptionKey) {
|
|
option.toElevator = [];
|
|
option.toElevator.push(...checkedOptions)
|
|
}
|
|
})
|
|
this.currentMaintainOptionKey = ''
|
|
this.hideToMaintainOptionElevatorModal();
|
|
},
|
|
chkDemolishOptionToElevators(){
|
|
const checkedOptions = [];
|
|
const matchElevators = this.elevators.filter(elevator=> elevator.id == this.toElevatorNo)[0]
|
|
checkedOptions.push({
|
|
id: this.toElevatorNo,
|
|
model: matchElevators['model'],
|
|
})
|
|
this.demolishOptions.forEach(option=>{
|
|
if(option.id == this.currentDemolishOptionKey){
|
|
option.toElevator = [];
|
|
option.toElevator.push(...checkedOptions)
|
|
}
|
|
})
|
|
this.currentDemolishOptionKey = ''
|
|
this.hideToDemolishOptionElevatorModal();
|
|
},
|
|
addMaintainOptionToElevator(id){
|
|
this.currentMaintainOptionKey = id;
|
|
this.toElevators = [];
|
|
this.toElevatorNo = "";
|
|
const matchElevators = this.maintainOptions.filter(option => option.id == id)[0].toElevator.map(elevator => elevator.id)
|
|
this.toElevatorNo = matchElevators[0]
|
|
this.elevators.forEach(elevator=>{
|
|
if(elevator.price > 0){
|
|
let bool = elevator.specifications=='M1' || elevator.specifications=='M1+M4(1:1)' || elevator.specifications=='M1+M4(2:1)' ;
|
|
let model = ''
|
|
if(bool){
|
|
model = 'P' + elevator.person + '-' + this.weightArr[elevator.person] + '-' +elevator.open_converted + '-' + elevator.speed + '-' + elevator.stop
|
|
}else{
|
|
model = elevator.specifications + '-' + elevator.person + '*' + elevator.stop + '-' + elevator.open_converted + elevator.speed
|
|
}
|
|
this.toElevators.push({
|
|
id: elevator.id,
|
|
model: model,
|
|
checked: matchElevators.includes(elevator.id) ? 1: 0,
|
|
})
|
|
}
|
|
})
|
|
|
|
this.$refs.toMaintainOptionElevatorModal.style.display = 'block';
|
|
body.style.overflow = 'hidden'
|
|
},
|
|
addDemolishOptionToElevator(id){
|
|
this.currentDemolishOptionKey = id;
|
|
this.toElevators = [];
|
|
this.toElevatorNo = "";
|
|
const matchElevators = this.demolishOptions.filter(option=> option.id == id)[0].toElevator.map(elevator=> elevator.id)
|
|
this.toElevatorNo = matchElevators[0]
|
|
this.elevators.forEach(elevator=>{
|
|
if(elevator.price > 0){
|
|
let bool = elevator.specifications=='M1' || elevator.specifications=='M1+M4(1:1)' || elevator.specifications=='M1+M4(2:1)' ;
|
|
let model = ''
|
|
if(bool){
|
|
model = 'P' + elevator.person + '-' + this.weightArr[elevator.person] + '-' +elevator.open_converted + '-' + elevator.speed + '-' + elevator.stop
|
|
}else{
|
|
model = elevator.specifications + '-' + elevator.person + '*' + elevator.stop + '-' + elevator.open_converted + elevator.speed
|
|
}
|
|
this.toElevators.push({
|
|
id: elevator.id,
|
|
model: model,
|
|
checked: matchElevators.includes(elevator.id) ? 1: 0,
|
|
})
|
|
}
|
|
})
|
|
|
|
this.$refs.toDemolishOptionElevatorModal.style.display = 'block';
|
|
body.style.overflow = 'hidden'
|
|
},
|
|
removeMaintainOption(id){
|
|
this.maintainOptions = this.maintainOptions.filter(option=> option.id != id)
|
|
},
|
|
removeDemolishOption(id){
|
|
this.demolishOptions = this.demolishOptions.filter(option=> option.id != id)
|
|
},
|
|
totalPrice(){
|
|
return this.totalElevatorsPrice() + this.totalOptionsPrice() + this.totalOtherOptionsPrice() + this.totalMaintainOptionsPrice();
|
|
},
|
|
totalSalePrice() {
|
|
return this.elevators.reduce((total, elevator) => {
|
|
return total + (elevator.spec_num * elevator.spec_price);
|
|
}, 0);
|
|
},
|
|
scalePrice(scale) {
|
|
if (scale === '') return 0;
|
|
return this.totalSalePrice() * scale / 100;
|
|
},
|
|
totalScale() {
|
|
let total = 0;
|
|
Object.keys(this.paymentRatio).forEach(pay => {
|
|
if (this.paymentRatio[pay].scale != '' && this.paymentRatio[pay].scale > 0) {
|
|
total += Number(this.paymentRatio[pay].scale)
|
|
}
|
|
})
|
|
|
|
return total;
|
|
},
|
|
error: [],
|
|
submit(){
|
|
this.error = []
|
|
for(let i=0;i<this.elevators.length;i++){
|
|
if(this.elevators[i].specifications =='') this.error.push("整機單價:規格不能為空");
|
|
if(this.elevators[i].person =='') this.error.push("整機單價:人數不能為空");
|
|
if(this.elevators[i].stop =='') this.error.push("整機單價:梯數不能為空");
|
|
if(this.elevators[i].speed =='') this.error.push("整機單價:速度不能為空");
|
|
if(this.elevators[i].open_converted =='') this.error.push("整機單價:開梯方式不能為空");
|
|
if(this.elevators[i].price =='') this.error.push("整機單價:公司發布價無此規格");
|
|
if(this.elevators[i].spec_price <= 0) this.error.push("整機單價:售價需大於0");
|
|
if(this.elevators[i].spec_num <= 0) this.error.push("整機單價:電梯數量需大於0");
|
|
}
|
|
|
|
for(let i=0;i<this.selectedOptions.length;i++){
|
|
if(this.selectedOptions[i].qty =='' ) this.error.push("Option:數量需大於0")
|
|
if(this.selectedOptions[i].toElevator.length <= 0) this.error.push("Option:需配對至電梯")
|
|
}
|
|
for(let i=0;i<this.otherOptions.length;i++){
|
|
if(this.otherOptions[i].name == '' ) this.error.push("除外項目:名稱不得為空");
|
|
if(this.otherOptions[i].price == '' ) this.error.push("除外項目:價錢需大於0");
|
|
if(this.otherOptions[i].num == '' ) this.error.push("除外項目:數量需大於0");
|
|
if(this.otherOptions[i].toElevator.length <= 0) this.error.push("除外項目:需配對至電梯")
|
|
}
|
|
for(let i=0;i<this.maintainOptions.length;i++){
|
|
if(this.maintainOptions[i].price == '' ) this.error.push("保固延長:價錢需大於0");
|
|
if(this.maintainOptions[i].num == '' ) this.error.push("保固延長:數量需大於0");
|
|
if(this.maintainOptions[i].toElevator.length <= 0) this.error.push("保固延長:需配對至電梯")
|
|
}
|
|
if(this.totalScale() != 100) this.error.push('付款辦法比例需等於100%')
|
|
if(this.transactionDate == '') this.error.push('預定成交日不得為空')
|
|
if(this.shippingDate == '') this.error.push('預定出貨日不得為空')
|
|
|
|
if(this.error.length > 0){
|
|
let errortext = '';
|
|
this.error.forEach(err=>{
|
|
errortext += err+'\n';
|
|
})
|
|
alert(errortext)
|
|
return;
|
|
}
|
|
|
|
const form = new FormData();
|
|
form.append('contractno', contractno);
|
|
form.append('ekind', (is_renovation=="Y") ? "汰改" : "新梯");
|
|
form.append('person', this.customerInfo.person);
|
|
form.append('company', this.customerInfo.company);
|
|
form.append('case_name', this.customerInfo.case_name);
|
|
form.append('address', this.customerInfo.address);
|
|
form.append('price_lowest', this.totalPrice());
|
|
form.append('price_total', this.totalSalePrice());
|
|
form.append('price_rate', Math.round(this.totalSalePrice() / this.totalPrice() * 100 * 10) / 10);
|
|
form.append('special_fee', this.serviceFee);
|
|
form.append('predeal_date', this.transactionDate);
|
|
form.append('facilitok_date', this.shippingDate);
|
|
form.append('penalty', this.penalty);
|
|
form.append('deposit_rate', this.deposit_rate);
|
|
form.append('keep_rate', this.keep_rate);
|
|
form.append('warranty_rate', this.warranty_rate);
|
|
form.append('memo', this.remark);
|
|
form.append('status', "YS");
|
|
form.append('attatch1', "");
|
|
form.append('attatch2', "");
|
|
form.append('user_id', user_id);
|
|
|
|
form.append('elevators', JSON.stringify(this.elevators));
|
|
|
|
form.append('options', JSON.stringify(this.selectedOptions));
|
|
form.append('otherOptions', JSON.stringify(this.otherOptions));
|
|
form.append('maintainOptions', JSON.stringify(this.maintainOptions));
|
|
form.append('demolishOptions', JSON.stringify(this.demolishOptions));
|
|
|
|
form.append('paymentRatio', JSON.stringify(this.paymentRatio));
|
|
|
|
axios.post('./api/postNewElevatorPricereview.php', form).then(res => {
|
|
console.log(res.data);
|
|
if (res.data == "success") {
|
|
alert("送審成功!");
|
|
window.location.href = './pricereview-index.php?' + token_link;
|
|
}
|
|
}).catch(err => {
|
|
console.error(err);
|
|
})
|
|
},
|
|
save(){
|
|
const form = new FormData();
|
|
form.append('contractno', contractno);
|
|
form.append('ekind', (is_renovation=="Y") ? "汰改" : "新梯");
|
|
form.append('person', this.customerInfo.person);
|
|
form.append('company', this.customerInfo.company);
|
|
form.append('case_name', this.customerInfo.case_name);
|
|
form.append('address', this.customerInfo.address);
|
|
form.append('price_lowest', this.totalPrice());
|
|
form.append('price_total', this.totalSalePrice());
|
|
form.append('price_rate', Math.round(this.totalSalePrice() / this.totalPrice() * 100 *10) / 10);
|
|
form.append('special_fee', this.serviceFee);
|
|
form.append('predeal_date', this.transactionDate);
|
|
form.append('facilitok_date', this.shippingDate);
|
|
form.append('penalty', this.penalty);
|
|
form.append('deposit_rate', this.deposit_rate);
|
|
form.append('keep_rate', this.keep_rate);
|
|
form.append('warranty_rate', this.warranty_rate);
|
|
form.append('memo', this.remark);
|
|
form.append('status', "Y1");
|
|
form.append('attatch1', "");
|
|
form.append('attatch2', "");
|
|
form.append('user_id', user_id);
|
|
|
|
form.append('elevators', JSON.stringify(this.elevators));
|
|
|
|
form.append('options', JSON.stringify(this.selectedOptions));
|
|
form.append('otherOptions', JSON.stringify(this.otherOptions));
|
|
form.append('maintainOptions', JSON.stringify(this.maintainOptions));
|
|
form.append('demolishOptions', JSON.stringify(this.demolishOptions));
|
|
|
|
form.append('paymentRatio', JSON.stringify(this.paymentRatio));
|
|
|
|
axios.post('./api/postNewElevatorPricereview.php', form).then(res=>{
|
|
console.log(res.status);
|
|
if(res.data == "success"){
|
|
alert("保存成功!");
|
|
window.location.reload();
|
|
// window.location.href = './pricereview-index.php?' + token_link;
|
|
}
|
|
}).catch(err=>{
|
|
console.error(err);
|
|
})
|
|
},
|
|
}
|
|
}
|
|
const pricereviewCheck = () => {
|
|
return {
|
|
init(){
|
|
this.elevators = elevators
|
|
this.elevators.forEach(el=>{
|
|
el.options = []
|
|
el.optionsTotalPrice = 0;
|
|
el.otherOptions = []
|
|
el.otherOptionsTotalPrice = 0;
|
|
el.maintainOptions = []
|
|
el.maintainOptionsTotalPrice = 0;
|
|
el.demolishOptions = []
|
|
el.demolishOptionsTotalPrice = 0;
|
|
})
|
|
this.options = options;
|
|
this.demolishOptions = items.filter(item=> item.item_group =='C');
|
|
this.maintainOptions = items.filter(item=> item.item_group =='D');
|
|
this.otherOptions = items.filter(item=> item.item_group =='E');
|
|
console.log("optionnnn=>", this.options);
|
|
this.elevators.forEach((elevator, idx)=>{
|
|
this.options.forEach(option=>{
|
|
if(option.option_relate_spec == elevator.item_no){
|
|
elevator.optionsTotalPrice += option.option_mi * option.item_qty
|
|
this.elevators[idx].options.push({
|
|
'id': option.id,
|
|
'item_spec': option.item_spec.trim(),
|
|
'item_unit_price': option.item_unit_price,
|
|
'item_qty': option.item_qty,
|
|
'mi': Math.round(option.option_mi),
|
|
'option_memo': option.option_memo,
|
|
})
|
|
}
|
|
})
|
|
|
|
this.otherOptions.forEach(option => {
|
|
if (option.option_relate_spec == elevator.item_no) {
|
|
elevator.otherOptionsTotalPrice += option.item_unit_price * option.item_qty
|
|
this.elevators[idx].otherOptions.push({
|
|
'id': option.id,
|
|
'item_spec': option.item_spec.trim(),
|
|
'item_unit_price': option.item_unit_price,
|
|
'item_qty': option.item_qty,
|
|
'mi': Math.round(option.item_unit_price),
|
|
})
|
|
}
|
|
})
|
|
|
|
this.maintainOptions.forEach(option => {
|
|
if (option.option_relate_spec == elevator.item_no) {
|
|
elevator.maintainOptionsTotalPrice += option.item_unit_price * option.item_qty
|
|
this.elevators[idx].maintainOptions.push({
|
|
'id': option.id,
|
|
'item_spec': option.item_spec.trim(),
|
|
'item_unit_price': option.item_unit_price,
|
|
'item_qty': option.item_qty,
|
|
'mi': Math.round(option.item_unit_price),
|
|
})
|
|
}
|
|
})
|
|
this.demolishOptions.forEach(option=>{
|
|
if(option.option_relate_spec == elevator.item_no){
|
|
elevator.demolishOptionsTotalPrice += option.item_unit_price * option.item_qty
|
|
this.elevators[idx].demolishOptions.push({
|
|
'id': option.id,
|
|
'item_spec': option.item_spec.trim(),
|
|
'item_unit_price': option.item_unit_price,
|
|
'item_qty': option.item_qty,
|
|
'mi': Math.round(option.item_unit_price),
|
|
})
|
|
}
|
|
})
|
|
this.qty += Number(elevator.item_qty);
|
|
this.elevators_total_price += Number(elevator.item_qty) * Number(elevator.price);
|
|
//MAE100-15*24-CO105
|
|
const model = elevator.item_spec;
|
|
let spec = model.split('-')[0];
|
|
let person = model.split('-')[1].split('*')[0];
|
|
let stop = model.split('-')[1].split('*')[1].split('-')[0];
|
|
let open = model.split('-')[2];
|
|
let speed = '';
|
|
for (let i = 0; i < this.openFn.length; i++) {
|
|
if (open.includes(this.openFn[i])) {
|
|
speed = open.replace(this.openFn[i], '')
|
|
open = this.openFn[i];
|
|
break;
|
|
}
|
|
}
|
|
|
|
this.getElevatorMi(idx, spec, person, stop, open, speed, elevator.item_weight)
|
|
|
|
});
|
|
this.sign1 = this.getUsername(sign1)
|
|
this.sign2 = this.getUsername(sign2)
|
|
this.sign3 = this.getUsername(sign3)
|
|
this.sign4 = this.getUsername(sign4)
|
|
|
|
console.log(this.elevators);
|
|
},
|
|
async getElevatorMi(idx, spec, person, stop, open, speed, item_weight){
|
|
console.log("載重=====>",item_weight);
|
|
try{
|
|
const res = await axios.get('./api/getElevatorMi.php', {params: {
|
|
spec: spec,
|
|
person: person,
|
|
stop: stop,
|
|
open: open,
|
|
speed: speed,
|
|
weight: item_weight
|
|
}})
|
|
console.log('---->',res.data);
|
|
if(res.data){
|
|
this.elevators[idx].mi = res.data
|
|
this.elevators[idx].totalMi = res.data['equipment_fee'] + res.data['customs_shipping_fee'] + res.data['free1y_fee'] + res.data['install_fee'] + res.data['other_fee'] + res.data['transport_site_fee'] + res.data['unloading_fee'] + res.data['add_price'];
|
|
}else{
|
|
this.isNotfoundMi = true;
|
|
this.elevators[idx].mi = {
|
|
'equipment_fee': 0,
|
|
'customs_shipping_fee': 0,
|
|
'free1y_fee': 0,
|
|
'install_fee': 0,
|
|
'other_fee': 0,
|
|
'transport_site_fee': 0,
|
|
'unloading_fee': 0,
|
|
'add_price':0,
|
|
}
|
|
}
|
|
|
|
|
|
console.log(this.elevators[idx]);
|
|
|
|
} catch (error) {
|
|
console.error("Error fetching elevator price:", error);
|
|
}
|
|
},
|
|
isNotfoundMi: false,
|
|
openFn: [
|
|
'CO', '2S', '2U', '4PCO', '6PCO'
|
|
],
|
|
sign1: '',
|
|
sign2: '',
|
|
sign3: '',
|
|
sign4: '',
|
|
is_renovate: false,
|
|
elevators_total_price: 0,
|
|
contractno: contractno,
|
|
person_name: person_name,
|
|
company: company,
|
|
case_name: case_name,
|
|
address: address,
|
|
price_lowest: price_lowest,
|
|
price_total: price_total,
|
|
special_fee: special_fee,
|
|
predeal_date: predeal_date,
|
|
facilitok_date: facilitok_date,
|
|
penalty: penalty,
|
|
deposit_rate: deposit_rate,
|
|
keep_rate: keep_rate,
|
|
warranty_rate: warranty_rate,
|
|
memo: memo,
|
|
qty: 0,
|
|
pays: pays,
|
|
elevators: [],
|
|
options: [],
|
|
otherOptions: [],
|
|
maintainOptions: [],
|
|
demolishOptions:[],
|
|
mid: mid,
|
|
user_id: user_id,
|
|
optionsTotalPrice() {
|
|
return this.options.reduce((total, option) => {
|
|
return total + (option.item_qty * option.item_unit_price);
|
|
}, 0);
|
|
},
|
|
otherOptionsTotalPrice() {
|
|
return this.otherOptions.reduce((total, option) => {
|
|
return total + (option.item_qty * option.item_unit_price);
|
|
}, 0);
|
|
},
|
|
maintainOptionsTotalPrice() {
|
|
return this.maintainOptions.reduce((total, option) => {
|
|
return total + (option.item_qty * option.item_unit_price);
|
|
}, 0);
|
|
},
|
|
demolishOptionsTotalPrice(){
|
|
return this.demolishOptions.reduce((total, option) => {
|
|
return total + (option.item_qty * option.item_unit_price);
|
|
}, 0);
|
|
},
|
|
totalScale(){
|
|
return this.pays.reduce((total, option) => {
|
|
return total + Number(option.pay_scale);
|
|
}, 0);
|
|
},
|
|
totalElevatorsPrice(){
|
|
return this.elevators.reduce((total, elevator) => {
|
|
return total + (elevator.item_qty * elevator.price);
|
|
}, 0);
|
|
},
|
|
totalStandardPrice(){
|
|
return this.totalElevatorsPrice() + this.otherOptionsTotalPrice() + this.optionsTotalPrice() + this.maintainOptionsTotalPrice() + this.demolishOptionsTotalPrice();
|
|
},
|
|
check(sign, status){
|
|
console.log(sign);
|
|
const form = new FormData();
|
|
form.append('sign', sign);
|
|
form.append('mid', this.mid);
|
|
form.append('result', status);
|
|
form.append('user_id', this.user_id);
|
|
axios.post('./api/postPricereviewSign.php', form).then(res => {
|
|
console.log(res.data);
|
|
if (res.data == 1) {
|
|
alert("簽核成功!");
|
|
window.location.reload()
|
|
}
|
|
})
|
|
},
|
|
|
|
async getUsername(user_id){
|
|
if(user_id == '') return '---'
|
|
const res = await axios.get('./api/getUsername.php', {params: {user_id: user_id}})
|
|
return res.data ;
|
|
},
|
|
|
|
}
|
|
}
|