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.
 
 
 
 
 
 

1130 lines
48 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,
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,
attatch1:"",
attatch2:"",
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.id == null || res.data.id == ""){
console.log("公司並無提供此規格!!");
}
this.elevators[idx].price = res.data.price
this.elevators[idx].facility_id = res.data.id
}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.id == null || res.data.id == ""){
console.log("公司並無提供此規格!!");
}
this.modalElevatorInfo.price = res.data.price
this.modalElevatorInfo.facility_id = res.data.id
}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 ++;
this.hideCreateOtherOptionModal();
},
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.hideCreateMaintainModal();
},
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: [],
validation(){
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 false;
}
},
submit(){
const validation = this.validation();
if(!validation) 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 validation = this.validation();
if(!validation) 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', "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, //&amp;lt;br&amp;gt;()
'item_spec': option.item_spec.trim().replaceAll('&amp;', '').replaceAll('lt;', '').replaceAll('br', '').replaceAll('gt;', '').replaceAll('()', ''),
'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,
reviewcomment:'',
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);
form.append('reviewcomment', this.reviewcomment);
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 ;
},
}
}