Browse Source

合約入力 11/2

gary
10994015 1 year ago
parent
commit
a9ee576846
  1. 6768
      app/assets/sass/style.css
  2. 1
      app/assets/sass/style.css.map
  3. 6768
      mkt/assets/sass/style.css
  4. 1
      mkt/assets/sass/style.css.map
  5. 6768
      prv/assets/sass/style.css
  6. 1
      prv/assets/sass/style.css.map
  7. 6768
      wms/assets/sass/style.css
  8. 1
      wms/assets/sass/style.css.map
  9. 23
      wms/contract/api/getContractData.php
  10. 65
      wms/contract/api/postContractData.php
  11. 8
      wms/contract/contract-download.php
  12. 268
      wms/contract/contract-input.php
  13. 32
      wms/contract/export-pdf.php
  14. 59
      wms/contract/js/alpine.js
  15. 4
      wms/contract/prviewPdf.php
  16. 6
      wms/contract/styles/style.css
  17. 2
      wms/contract/styles/style.css.map
  18. 3
      wms/contract/styles/style.scss
  19. 23
      wms/database.php
  20. 15
      workflow/lib/DB.php

6768
app/assets/sass/style.css

File diff suppressed because it is too large

1
app/assets/sass/style.css.map

File diff suppressed because one or more lines are too long

6768
mkt/assets/sass/style.css

File diff suppressed because it is too large

1
mkt/assets/sass/style.css.map

File diff suppressed because one or more lines are too long

6768
prv/assets/sass/style.css

File diff suppressed because it is too large

1
prv/assets/sass/style.css.map

File diff suppressed because one or more lines are too long

6768
wms/assets/sass/style.css

File diff suppressed because it is too large

1
wms/assets/sass/style.css.map

File diff suppressed because one or more lines are too long

23
wms/contract/api/getContractData.php

@ -0,0 +1,23 @@
<?php
require_once('../conn.php');
if(isset($_GET['contractno']) && $_GET['contractno']!=''){
try{
$contractno = $_GET['contractno'];
$sql_str = "SELECT * FROM con_maintance_examine_apply
LEFT JOIN con_maintance_examine_clear on con_maintance_examine_apply.apply_key=con_maintance_examine_clear.apply_key
WHERE con_maintance_examine_apply.vol_no = :vol_no";
$stmt = $conn->prepare($sql_str);
$stmt->bindParam(':vol_no', $contractno);
$stmt->execute();
$contract = $stmt->fetch(PDO::FETCH_ASSOC);
$contractResponse = json_encode($contract);
// 設定回應標頭為 JSON
header('Content-Type: application/json');
// 將 JSON 回應返回給客戶端
echo json_encode($contract);
}catch (PDOException $e ){
die("ERROR!!!: ". $e->getMessage());
}
}

65
wms/contract/api/postContractData.php

@ -0,0 +1,65 @@
<?php
require_once("../conn.php");
ini_set ( 'date.timezone' , 'Asia/Taipei' );
if(isset($_POST["contractno"]) && $_POST["contractno"] != "") {
try{
$conn->beginTransaction();
$contractno = $_POST['contractno'] ?? '';
$total_price = $_POST['total_price'] ?? '';
$vat = $_POST['vat'] ?? '';
$mtype = $_POST['mtype'] ?? '';
$opendoor = $_POST['opendoor'] ?? '';
$phone = $_POST['phone'] ?? '';
$email = $_POST['email'] ?? '';
$mworker = $_POST['mworker'] ?? '';
$mcycle = $_POST['mcycle'] ?? '';
$salesman = $_POST['salesman'] ?? '';
$contract_begin_date = $_POST['contract_begin_date'] ?? '';
$contract_end_date = $_POST['contract_end_date'] ?? '';
$address = $_POST['address'] ?? '';
$customer = $_POST['customer'] ?? '';
$partyA = $_POST['partyA'] ?? '';
$partyAaddress = $_POST['partyAaddress'] ?? '';
$partyAphone = $_POST['partyAphone'] ?? '';
$partyAemail = $_POST['partyAemail'] ?? '';
$user_id = $_POST['user_id'] ?? '';
$files = $_FILES['files'] ?? '';
//create account table
$accounttype = "A";
$accountid = $vat;
$pwd = "123";
$name = $partyA;
$tel = $phone ?? '';
$repairerid = $mworker;
$creater = $user_id;
$create_at = date('Y-m-d H:i:s');
$sql_str = "INSERT INTO account (accounttype, accountid, pwd, name, tel, address, email, repairerid, creater, create_at) VALUES (:accounttype, :accountid, :pwd, :name, :tel, :address, :email, :repairerid, :creater, :create_at)";
$stmt = $conn -> prepare($sql_str);
$stmt -> bindParam(':accounttype' ,$accounttype);
$stmt -> bindParam(':accountid' ,$accountid);
$stmt -> bindParam(':pwd' ,$pwd);
$stmt -> bindParam(':name' ,$name);
$stmt -> bindParam(':tel' ,$tel);
$stmt -> bindParam(':address' ,$address);
$stmt -> bindParam(':email' ,$email);
$stmt -> bindParam(':repairerid' ,$repairerid);
$stmt -> bindParam(':creater' ,$creater);
$stmt -> bindParam(':create_at' ,$create_at);
$stmt -> execute();
header('Content-Type: application/json');
$jsonData = json_encode($files);
echo $jsonData;
$conn->commit();
}catch(PDOException $e){
$conn->rollBack();
die('Error!:'.$e->getMessage());
}
}

8
wms/contract/contract-download.php

@ -92,7 +92,7 @@ if(isset($_GET['id']) && $_GET['id']!=""){
<div class="inputDiv" x-show="isbuyShow && isBuyInputIng"> <div class="inputDiv" x-show="isbuyShow && isBuyInputIng">
<label for=""> <label for="">
<p>交貨期限(日)</p> <p>交貨期限(日)</p>
<input type="number" x-model="buyfill1" /> <input type="number" x-model="buyfill1" @keyup="sendBuyInputKeyupFn($event)" />
</label> </label>
<?php if($buyNo2Pay){ ?> <?php if($buyNo2Pay){ ?>
<label for=""> <label for="">
@ -219,15 +219,15 @@ if(isset($_GET['id']) && $_GET['id']!=""){
<div class="inputDiv" x-show="!isbuyShow && isInstallInputIng"> <div class="inputDiv" x-show="!isbuyShow && isInstallInputIng">
<label for=""> <label for="">
<p>安裝試車期限(日)</p> <p>安裝試車期限(日)</p>
<input type="number" x-model="installfill1" /> <input type="number" x-model="installfill1" @keyup="sendInstallInputKeyupFn($event)" />
</label> </label>
<label for=""> <label for="">
<p>免費保養月數(月)</p> <p>免費保養月數(月)</p>
<input type="number" x-model="installfill2" /> <input type="number" x-model="installfill2" @keyup="sendInstallInputKeyupFn($event)" />
</label> </label>
<label for=""> <label for="">
<p>附件數</p> <p>附件數</p>
<select x-model="installAffix"> <select x-model="installAffix" @keyup="sendInstallInputKeyupFn($event)">
<option value="1">1</option> <option value="1">1</option>
<option value="2">2</option> <option value="2">2</option>
<option value="3">3</option> <option value="3">3</option>

268
wms/contract/contract-input.php

@ -1,6 +1,18 @@
<?php <?php
include("../header.php"); include("../header.php");
require_once("./conn.php"); require_once("./conn.php");
$accounttype = "B";
$sql_str = "SELECT accountid, name FROM account WHERE accounttype = :accounttype";
$stmt = $conn->prepare($sql_str);
$stmt->bindParam(':accounttype',$accounttype);
$stmt->execute();
$workers = $stmt->fetchAll(PDO::FETCH_ASSOC);
$accounttype = "M";
$sql_str = "SELECT id,accountid, name FROM account WHERE accounttype = :accounttype";
$stmt = $conn->prepare($sql_str);
$stmt->bindParam(':accounttype',$accounttype);
$stmt->execute();
$contractpersons = $stmt->fetchAll(PDO::FETCH_ASSOC);
?> ?>
<link rel="stylesheet" href="./styles/style.css"> <link rel="stylesheet" href="./styles/style.css">
<link rel="stylesheet" href="semantic/dist/semantic.min.css"> <link rel="stylesheet" href="semantic/dist/semantic.min.css">
@ -11,14 +23,127 @@ require_once("./conn.php");
init(){ init(){
$('select.dropdown') $('select.dropdown')
.dropdown(); .dropdown();
console.log(12345678);
}, },
data:{
contractno:'',
total_price:'', //合約總價
vat:'', //統一編號
mtype:'A', //維修型態
opendoor:'', //開門方式
phone:'', //客戶電話
email:'', //Email
mworker:'', //保養員
mcycle:'', //保養頻率
salesman:'', //營業員
contract_begin_date:'', //合約開始時間
contract_end_date:'', //合約終止時間
address:'', //地址
customer:'', //立約人
partyA:'', //業務聯繫人
partyAaddress:'', //業務聯繫人地址
partyAphone:'', //業務聯繫人電話
partyAemail:'', //業務聯繫人email
files:[], //附件檔案
},
customize:false,
step:1,
isLoading:false, isLoading:false,
nextStepFn(){
this.isLoading = true
axios.get('./api/getContractData.php?contractno=' + this.data.contractno).then(res=>{
console.log(res)
if(!this.customize){
this.data.total_price = res.data.sold_price
this.data.salesman = res.data.salesman
this.data.contract_begin_date = res.data.contract_begin_date
this.data.contract_end_date = res.data.contract_end_date
this.data.address = res.data.address
this.data.customer = res.data.customer
this.data.partyA = res.data.customer
this.data.partyAaddress = res.data.address
}
this.step = 2
this.isLoading = false
}).catch(err=>{
console.error(err)
this.isLoading = false
})
},
nextStepKeyupFn(e){
if(e.keyCode !== 13) return
this.isLoading = true
axios.get('./api/getContractData.php?contractno=' + this.data.contractno).then(res=>{
console.log(res)
if(!this.customize){
this.data.total_price = res.data.sold_price
this.data.salesman = res.data.salesman
this.data.contract_begin_date = res.data.contract_begin_date
this.data.contract_end_date = res.data.contract_end_date
this.data.address = res.data.address
this.data.customer = res.data.customer
this.data.partyA = res.data.customer
this.data.partyAaddress = res.data.address
}
this.step = 2
this.isLoading = false
}).catch(err=>{
console.error(err)
this.isLoading = false
})
},
preStepFn(){
this.data.total_price = ''
this.data.salesman = ''
this.data.contract_begin_date = ''
this.data.contract_end_date = ''
this.data.address = ''
this.data.customer = ''
this.data.partyA = ''
this.data.step = 1
},
save(){ save(){
this.isLoading = true this.isLoading = true
console.log(this.data.files[0] instanceof File);
const form = new FormData();
form.append('contractno', this.data.contractno);
form.append('total_price', this.data.total_price);
form.append('vat', this.data.vat);
form.append('mtype', this.data.mtype);
form.append('opendoor', this.data.opendoor);
form.append('phone', this.data.phone);
form.append('email', this.data.email);
form.append('mworker', this.data.mworker);
form.append('mcycle', this.data.mcycle);
form.append('salesman', this.data.salesman);
form.append('contract_begin_date', this.data.contract_begin_date);
form.append('contract_end_date', this.data.contract_end_date);
form.append('address', this.data.address);
form.append('customer', this.data.customer);
form.append('partyA', this.data.partyA);
form.append('partyAaddress', this.data.partyAaddress);
form.append('partyAphone', this.data.partyAphone);
form.append('partyAemail', this.data.partyAemail);
form.append('user_id', '<?php echo $user_id; ?>');
// 如果有附件檔案,可以逐一加入
for (var i = 0; i < this.data.files.length; i++) {
form.append('files[]', this.data.files[i]);
}
axios.post('./api/postContractData.php', form).then(res=>{
console.log(res);
this.isLoading = false
}).catch(error=>{
console.log(error);
this.isLoading = false
})
},
uploadFiles(e){
this.data.files = e.target.files
} }
}"> }">
<form method="post" id="form" enctype="multipart/form-data">
<div class="form" method="post" id="form" enctype="multipart/form-data" >
<input type="hidden" name='form_name' value="main_form" /> <input type="hidden" name='form_name' value="main_form" />
<div> <div>
<table class="table table-bordered query-table table-striped table-bordered display compact" style="width:99%;margin-left:.5%"> <table class="table table-bordered query-table table-striped table-bordered display compact" style="width:99%;margin-left:.5%">
@ -29,7 +154,25 @@ require_once("./conn.php");
</td> </td>
</tr> </tr>
</thead> </thead>
<tbody style="font-weight: bolder;margin-bottom: 20px"> <template x-if="step==1">
<tbody style="font-weight: bolder;margin-bottom: 20px" x-show="step==1">
<tr>
<td style="vertical-align: middle">合約號</td>
<td>
<input class="form-control" @keyup="nextStepKeyupFn($event)" type="text" name="contractno" x-model="data.contractno" >
</td>
<td style="vertical-align: middle">
<label for="customize">
<input type="checkbox" x-model="customize" id="customize" />自定義欄位
</label>
</td>
</tr>
</tbody>
</template>
<template x-if="step==2">
<tbody style="font-weight: bolder;margin-bottom: 20px" x-show="step==2">
<tr> <tr>
<td colspan="7" style='vertical-align: middle;border-right:0px;'> <td colspan="7" style='vertical-align: middle;border-right:0px;'>
<h4>業務確認項</h4> <h4>業務確認項</h4>
@ -40,30 +183,28 @@ require_once("./conn.php");
</td> </td>
</tr> </tr>
<tr> <tr>
<td style="vertical-align: middle">合約</td> <td style="vertical-align: middle">合約總價</td>
<td> <td>
<input class="form-control " type="text" name="contractno" value="" > <input class="form-control " type="number" name="total_pirce" x-model="data.total_price" >
</td> </td>
<td style="vertical-align: middle">統一編號/身分證</td> <td style="vertical-align: middle">統一編號/身分證</td>
<td> <td>
<input class="form-control disabled_select" type="text" name="uscc" value="" > <input class="form-control disabled_select" type="text" name="uscc" x-model="data.vat" >
</td> </td>
<td style="vertical-align: middle">維修型態</td> <td style="vertical-align: middle">維修型態</td>
<td style="vertical-align: middle"> <td style="vertical-align: middle">
<select class="ui search dropdown" name="repairtype"> <select class="ui search dropdown" name="repairtype" x-model="data.mtype">
<option value="">選擇維修型態</option> <option value="" >選擇維修型態</option>
<option value="A">定期保養</option> <option value="A">定期保養</option>
<option value="B">單次保養</option>
<option value="C">單次維修</option>
</select> </select>
</td> </td>
<td style="vertical-align: middle"> <td style="vertical-align: middle">
開門方式 開門方式
</td> </td>
<td style="vertical-align: middle"> <td style="vertical-align: middle">
<select class="ui search dropdown" name="repairtype"> <select class="ui search dropdown" name="repairtype" x-model="data.opendoor">
<option value="">選擇開門方式</option> <option value="">選擇開門方式</option>
<option value="2PCO">2PCO</option> <option value="2PCO">2PCO</option>
<option value="2S">2S</option> <option value="2S">2S</option>
@ -80,96 +221,77 @@ require_once("./conn.php");
<tr> <tr>
<td style="vertical-align: middle">客戶電話</td> <td style="vertical-align: middle">客戶電話</td>
<td> <td>
<input class="form-control disabled_select" type="text" name="tel" value="" > <input class="form-control disabled_select" type="text" name="tel" x-model="data.phone" >
</td> </td>
<td style="vertical-align: middle">Email</td> <td style="vertical-align: middle">Email</td>
<td style="vertical-align: middle"> <td style="vertical-align: middle">
<input class="form-control disabled_select" type="text" name="email" value="" > <input class="form-control disabled_select" type="text" name="email" x-model="data.email" >
</td> </td>
<td style="vertical-align: middle">保養員</td> <td style="vertical-align: middle">保養員</td>
<td> <td>
<select class="ui search dropdown" name="repairer_name"> <select class="ui search dropdown" name="repairer_name" x-model="data.mworker">
<option value="">選擇保養員</option> <option value="">選擇保養員</option>
<option value="AF">阿兵哥</option> <?php foreach($workers as $worker){ ?>
<option value="AX">哈哈</option> <option value="<?php echo $worker['accountid']; ?>"><?php echo $worker['name'] ?></option>
<option value="AL">嘿嘿</option> <?php } ?>
<option value="DZ">嗚嗚</option>
<option value="AS">ㄚㄚ</option>
</select> </select>
</td> </td>
<td style="vertical-align: middle">保養</td> <td style="vertical-align: middle">保養頻率</td>
<td> <td>
<select class="ui search dropdown" name="repairer_name"> <select class="ui search dropdown" name="repairer_name" x-model="data.mcycle">
<option value="">選擇保養別</option> <option value="">選擇保養頻率</option>
<option value="A">全包</option> <option value="A">雙週保</option>
<option value="B">半包</option> <option value="B">月保</option>
<option value="C">清包</option>
<option value="D">半包兩個月保養一次</option>
<option value="E">半包一個月保養兩次</option>
</select> </select>
</td> </td>
</tr> </tr>
<tr> <tr>
<td style="vertical-align: middle">業務聯繫人</td> <td style="vertical-align: middle">業務聯繫人</td>
<td> <td>
<select class="ui search dropdown" name="contractperson"> <input type="text" x-model="data.partyA" name="partyA" />
<option value="">選擇保養員</option>
<option value="AF">阿兵哥</option>
<option value="AX">哈哈</option>
<option value="AL">嘿嘿</option>
<option value="DZ">嗚嗚</option>
<option value="AS">ㄚㄚ</option>
</select>
</td> </td>
<td style="vertical-align: middle">業務聯繫人地址</td> <td style="vertical-align: middle">業務聯繫人地址</td>
<td> <td>
<input class="form-control disabled_select" type="text" name="contractaddress" value="" > <input class="form-control disabled_select" x-model="data.partyAaddress" type="text" name="contractaddress" value="" >
</td> </td>
<td style="vertical-align: middle">業務聯繫人電話</td> <td style="vertical-align: middle">業務聯繫人電話</td>
<td> <td>
<input class="form-control disabled_select" type="text" name="contracttel" value="" > <input class="form-control disabled_select" type="text" name="contracttel" x-model="data.partyAphone" >
</td> </td>
<td style="vertical-align: middle">業務聯繫人Email</td> <td style="vertical-align: middle">業務聯繫人Email</td>
<td> <td>
<input class="form-control disabled_select" type="text" name="contracttel" value="" > <input class="form-control disabled_select" type="text" name="contracttel" x-model="data.partyAemail" >
</td> </td>
</tr> </tr>
<tr> <tr>
<td style="vertical-align: middle">立約人</td> <td style="vertical-align: middle">立約人</td>
<td> <td>
<select class="ui search dropdown" name="promiser"> <input type="text" x-model="data.customer" />
<option value="">選擇立約人</option>
<option value="AF">呼呼</option>
<option value="AX">哈哈</option>
<option value="AL">嘿嘿</option>
<option value="DZ">嗚嗚</option>
<option value="AS">ㄚㄚ</option>
</select>
</td> </td>
<td style="vertical-align: middle">契約人</td> <td style="vertical-align: middle">營業員</td>
<td> <td>
<select class="ui search dropdown" name="promiser"> <select class="ui search dropdown" name="promiser" x-model="data.salesman">
<option value="">選擇契約人</option> <option value="">選擇營業員</option>
<option value="AF">呼呼</option> <?php foreach($contractpersons as $person){ ?>
<option value="AX">哈哈</option> <option value="<?php echo $person['accountid'] ?>"><?php echo $person['name'] ?></option>
<option value="AL">嘿嘿</option> <?php } ?>
<option value="DZ">嗚嗚</option>
<option value="AS">ㄚㄚ</option>
</select> </select>
</td> </td>
<td style="vertical-align: middle">合約開始時間</td> <td style="vertical-align: middle">合約開始時間</td>
<td> <td>
<input class="form-control disabled_select" type="date" name="start_date" value="" > <input class="form-control disabled_select" type="date" name="start_date" x-model="data.contract_begin_date" >
</td> </td>
<td style="vertical-align: middle">合約終止時間</td> <td style="vertical-align: middle">合約終止時間</td>
<td> <td>
<input class="form-control disabled_select" type="date" name="end_date" value="" > <input class="form-control disabled_select" type="date" name="end_date" x-model="data.contract_end_date" >
</td> </td>
</tr> </tr>
<tr> <tr>
<td style="vertical-align: middle">地址</td> <td style="vertical-align: middle">地址</td>
<td> <td colspan="3">
<select class="ui search dropdown" name="contractperson"> <input type="text" x-model="data.address" />
<!-- <select class="ui search dropdown" name="contractperson">
<option value="">選擇地址</option> <option value="">選擇地址</option>
<option value="基隆市">基隆市</option> <option value="基隆市">基隆市</option>
<option value="台北市">台北市</option> <option value="台北市">台北市</option>
@ -193,21 +315,28 @@ require_once("./conn.php");
<option value="澎湖縣">澎湖縣</option> <option value="澎湖縣">澎湖縣</option>
<option value="金門縣">金門縣</option> <option value="金門縣">金門縣</option>
<option value="連江縣">連江縣</option> <option value="連江縣">連江縣</option>
</select> </select> -->
</td> </td>
<td style="vertical-align: middle"></td> <td style="vertical-align: middle">附件</td>
<td>
</td>
<td style="vertical-align: middle"></td>
<td> <td>
<input type="file" name="file[]" multiple draggable="true" @change="uploadFiles($event)" />
</td> </td>
<td style="vertical-align: middle"></td> <td style="vertical-align: middle"></td>
<td> <td>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</template>
</table> </table>
<button @click="save()" :disabled="isLoading ? true : false" type="button" class="btn btn-primary btn-lg pull-right savebtn"> <button x-show="step==1" @click="nextStepFn()" type="button" class="btn btn-primary btn-lg pull-right savebtn" :disabled="isLoading ? true : false">
<template x-if="!isLoading">
<span>下一步</span>
</template>
<template x-if="isLoading">
<div class="loader"></div>
</template>
</button>
<button x-show="step==2" @click="save()" :disabled="isLoading ? true : false" type="button" class="btn btn-primary btn-lg pull-right savebtn">
<template x-if="!isLoading"> <template x-if="!isLoading">
<span>存檔</span> <span>存檔</span>
</template> </template>
@ -215,8 +344,17 @@ require_once("./conn.php");
<div class="loader"></div> <div class="loader"></div>
</template> </template>
</button> </button>
<button x-show="step>1" @click="preStepFn()" :disabled="isLoading ? true : false" type="button" class="btn btn-primary btn-lg pull-right savebtn">
<template x-if="!isLoading">
<span>上一步</span>
</template>
<template x-if="isLoading">
<div class="loader"></div>
</template>
</button>
</div> </div>
</form> </div>
</div> </div>
<script <script
src="https://code.jquery.com/jquery-3.1.1.min.js" src="https://code.jquery.com/jquery-3.1.1.min.js"

32
wms/contract/export-pdf.php

@ -16,6 +16,7 @@ $party_b = "永佳捷科技股份有限公司"; // 4
$total_price = $_POST['total_price']; // 5 $total_price = $_POST['total_price']; // 5
$token = $_POST['token']; $token = $_POST['token'];
$formattedDate = $_POST['formattedDate']; $formattedDate = $_POST['formattedDate'];
$footerText = '';
if(isset($_POST['html'])){ if(isset($_POST['html'])){
class MYPDF extends TCPDF { class MYPDF extends TCPDF {
private $showFooterText = false; private $showFooterText = false;
@ -40,21 +41,21 @@ if(isset($_POST['html'])){
$cols = intval($width / $textWidth)/0.85 + 1; $cols = intval($width / $textWidth)/0.85 + 1;
$rows = intval($height / $textHeight)/0.75 ; $rows = intval($height / $textHeight)/0.75 ;
for ($i = 0; $i < $rows; $i++) { // for ($i = 0; $i < $rows; $i++) {
for ($j = 0; $j < $cols; $j++) { // for ($j = 0; $j < $cols; $j++) {
$x = $j * $textWidth *0.83; //每段文字間距 // $x = $j * $textWidth *0.83; //每段文字間距
$y = $i * $textHeight * 0.75; // 行高 // $y = $i * $textHeight * 0.75; // 行高
$this->StartTransform(); // $this->StartTransform();
$this->Rotate(8, $x + ($textWidth / 2), $y + ($textHeight / 2)); // 在文本的中心点处旋转 // $this->Rotate(8, $x + ($textWidth / 2), $y + ($textHeight / 2)); // 在文本的中心点处旋转
$this->Text($x, $y, $watermarkText); // $this->Text($x, $y, $watermarkText);
$this->StopTransform(); // $this->StopTransform();
} // }
} // }
} }
public function Footer() { public function Footer() {
// 設置字體 // 設置字體
global $customFont; global $customFont, $token, $footerText;
$this->SetFont($customFont, '', 12); // 設置字體12pt,不使用斜體 $this->SetFont($customFont, '', 12); // 設置字體12pt,不使用斜體
@ -64,10 +65,15 @@ if(isset($_POST['html'])){
$this->writeHTMLCell(0, 10, '', '', $footerText, 0, 1, 0, true, 'C', true); $this->writeHTMLCell(0, 10, '', '', $footerText, 0, 1, 0, true, 'C', true);
} }
// 添加頁碼 // 添加頁碼
$pageNumText = '頁 '.$this->getAliasNumPage().' 之 '.$this->getAliasNbPages(); $pageNumText = $this->getAliasNumPage().' / '.$this->getAliasNbPages();
$this->SetY(-15); $this->SetY(-15);
$this->SetX(48); $this->SetX(48);
$this->Cell(0, 10, $pageNumText, 0, false, 'C', 0, '', 0, false, 'T', 'M'); $this->Cell(0, 10, $pageNumText, 0, false, 'C', 0, '', 0, false, 'T', 'M');
$this->SetTextColor(225, 225, 225);
$this->SetY(-23); // 设置Y坐标到页面底部
$this->SetFont($customFont, '', 12);
$this->Cell(0, 10, $token, 0, 0, 'R'); // 在右下角添加浮水印文本
} }
} }
@ -183,7 +189,7 @@ if(isset($_POST['html'])){
$pdf->setCellHeightRatio(1.8); $pdf->setCellHeightRatio(1.8);
$pdf->setShowFooterText(false); $pdf->setShowFooterText(false);
$pdf->writeHTML($_POST['affix1'], true, false, true, false, ''); $pdf->writeHTML($_POST['affix1'], true, false, true, false, '');
$pdf->setPrintFooter(false); $pdf->setPrintFooter(true);
// 設置 HTTP header以輸出 PDF 文件 // 設置 HTTP header以輸出 PDF 文件
header('Content-Type: application/pdf'); header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="tcpdf10.pdf"'); header('Content-Disposition: attachment; filename="tcpdf10.pdf"');

59
wms/contract/js/alpine.js

@ -704,6 +704,35 @@ const alpineData = {
this.standardData.list.plaintext[10].text = '電梯保養:<br>一、乙方完工交車後,期後&nbsp;'+this.installfill2+'&nbsp;個月內應負責免費定期保養,及履行免費保固,於免費保養期間屆至後,雙方再協商嗣後保養事宜。<br>二、如因可歸責乙方因素致安裝產品有所瑕疵時,乙方應負責修復或修繕,惟非因乙方因素致有修復產品需要時,乙方仍負責修復或修繕,惟得向甲方酌收基本材料與人工費用。<br>三、另依法令規定,非經竣工檢查合格後取得使用許可證之電梯,依法不得使用。' this.standardData.list.plaintext[10].text = '電梯保養:<br>一、乙方完工交車後,期後&nbsp;'+this.installfill2+'&nbsp;個月內應負責免費定期保養,及履行免費保固,於免費保養期間屆至後,雙方再協商嗣後保養事宜。<br>二、如因可歸責乙方因素致安裝產品有所瑕疵時,乙方應負責修復或修繕,惟非因乙方因素致有修復產品需要時,乙方仍負責修復或修繕,惟得向甲方酌收基本材料與人工費用。<br>三、另依法令規定,非經竣工檢查合格後取得使用許可證之電梯,依法不得使用。'
this.onstandardViewData.list.plaintext[10].text = '電梯保養:<br>一、乙方完工交車後,期後&nbsp;'+this.installfill2+'&nbsp;個月內應負責免費定期保養,及履行免費保固,於免費保養期間屆至後,雙方再協商嗣後保養事宜。<br>二、如因可歸責乙方因素致安裝產品有所瑕疵時,乙方應負責修復或修繕,惟非因乙方因素致有修復產品需要時,乙方仍負責修復或修繕,惟得向甲方酌收基本材料與人工費用。<br>三、另依法令規定,非經竣工檢查合格後取得使用許可證之電梯,依法不得使用。' this.onstandardViewData.list.plaintext[10].text = '電梯保養:<br>一、乙方完工交車後,期後&nbsp;'+this.installfill2+'&nbsp;個月內應負責免費定期保養,及履行免費保固,於免費保養期間屆至後,雙方再協商嗣後保養事宜。<br>二、如因可歸責乙方因素致安裝產品有所瑕疵時,乙方應負責修復或修繕,惟非因乙方因素致有修復產品需要時,乙方仍負責修復或修繕,惟得向甲方酌收基本材料與人工費用。<br>三、另依法令規定,非經竣工檢查合格後取得使用許可證之電梯,依法不得使用。'
}, },
sendInstallInputKeyupFn(e){
if(e.keyCode !== 13) return
if(this.installfill1 == ''){
alert('請輸入安裝試車期限');
return;
}
if(this.installfill2 == ''){
alert('請輸入免費保養月數');
return;
}
if(this.installfill1 < 45){
alert('安裝試車期限不得低於45日');
return;
}
if(this.installfill1 < 1){
alert('免費保養月數不得低於1個月');
return;
}
this.isInstallInputIng = false
this.data.list.plaintext[1].text = '安裝產品規格:如附表'+ this.affixArr[Number(this.installAffix)] +'。'
this.standardData.list.plaintext[1].text = '安裝產品規格:如附表'+ this.affixArr[Number(this.installAffix)] +'。'
this.onstandardViewData.list.plaintext[1].text = '安裝產品規格:如附表'+ this.affixArr[Number(this.installAffix)] +'。'
this.data.list.plaintext[5].text = '安裝試車事項:<br>一、甲方應於實際出貨日期前七日,清理升降設備之建築物升降道,及完成底坑防水之處理,上述事項完成後,甲方即以書面或電話通知乙方進場安裝,乙方應於貨抵工地後每台&nbsp;'+this.installfill1+'&nbsp;日內安裝完成。<br>二、甲方接到乙方電梯安裝完成通知之日起,倘因甲方因素致無法於四十五日內交車時,甲方應付清總價款全部餘額。<br>三、如因非關乙方因素致乙方無法進場施作時,於該因素或障礙排除前,甲方應對已進場之材料或設備負保管責任及整修費用。'
this.standardData.list.plaintext[5].text = '安裝試車事項:<br>一、甲方應於實際出貨日期前七日,清理升降設備之建築物升降道,及完成底坑防水之處理,上述事項完成後,甲方即以書面或電話通知乙方進場安裝,乙方應於貨抵工地後每台&nbsp;'+this.installfill1+'&nbsp;日內安裝完成。<br>二、甲方接到乙方電梯安裝完成通知之日起,倘因甲方因素致無法於四十五日內交車時,甲方應付清總價款全部餘額。<br>三、如因非關乙方因素致乙方無法進場施作時,於該因素或障礙排除前,甲方應對已進場之材料或設備負保管責任及整修費用。'
this.onstandardViewData.list.plaintext[5].text = '安裝試車事項:<br>一、甲方應於實際出貨日期前七日,清理升降設備之建築物升降道,及完成底坑防水之處理,上述事項完成後,甲方即以書面或電話通知乙方進場安裝,乙方應於貨抵工地後每台&nbsp;'+this.installfill1+'&nbsp;日內安裝完成。<br>二、甲方接到乙方電梯安裝完成通知之日起,倘因甲方因素致無法於四十五日內交車時,甲方應付清總價款全部餘額。<br>三、如因非關乙方因素致乙方無法進場施作時,於該因素或障礙排除前,甲方應對已進場之材料或設備負保管責任及整修費用。'
this.data.list.plaintext[10].text = '電梯保養:<br>一、乙方完工交車後,期後&nbsp;'+this.installfill2+'&nbsp;個月內應負責免費定期保養,及履行免費保固,於免費保養期間屆至後,雙方再協商嗣後保養事宜。<br>二、如因可歸責乙方因素致安裝產品有所瑕疵時,乙方應負責修復或修繕,惟非因乙方因素致有修復產品需要時,乙方仍負責修復或修繕,惟得向甲方酌收基本材料與人工費用。<br>三、另依法令規定,非經竣工檢查合格後取得使用許可證之電梯,依法不得使用。'
this.standardData.list.plaintext[10].text = '電梯保養:<br>一、乙方完工交車後,期後&nbsp;'+this.installfill2+'&nbsp;個月內應負責免費定期保養,及履行免費保固,於免費保養期間屆至後,雙方再協商嗣後保養事宜。<br>二、如因可歸責乙方因素致安裝產品有所瑕疵時,乙方應負責修復或修繕,惟非因乙方因素致有修復產品需要時,乙方仍負責修復或修繕,惟得向甲方酌收基本材料與人工費用。<br>三、另依法令規定,非經竣工檢查合格後取得使用許可證之電梯,依法不得使用。'
this.onstandardViewData.list.plaintext[10].text = '電梯保養:<br>一、乙方完工交車後,期後&nbsp;'+this.installfill2+'&nbsp;個月內應負責免費定期保養,及履行免費保固,於免費保養期間屆至後,雙方再協商嗣後保養事宜。<br>二、如因可歸責乙方因素致安裝產品有所瑕疵時,乙方應負責修復或修繕,惟非因乙方因素致有修復產品需要時,乙方仍負責修復或修繕,惟得向甲方酌收基本材料與人工費用。<br>三、另依法令規定,非經竣工檢查合格後取得使用許可證之電梯,依法不得使用。'
},
sendBuyInputFn(){ sendBuyInputFn(){
if(this.buyfill1 == ''){ if(this.buyfill1 == ''){
alert('請輸入交貨期限'); alert('請輸入交貨期限');
@ -733,6 +762,36 @@ const alpineData = {
this.buystandardData.list.plaintext[15].text = this.buystandardData.list.plaintext[15].text + buyAffixHtml this.buystandardData.list.plaintext[15].text = this.buystandardData.list.plaintext[15].text + buyAffixHtml
this.buyonstandardViewData.list.plaintext[15].text = this.buyonstandardViewData.list.plaintext[15].text + buyAffixHtml this.buyonstandardViewData.list.plaintext[15].text = this.buyonstandardViewData.list.plaintext[15].text + buyAffixHtml
}, },
sendBuyInputKeyupFn(e){
if(e.keyCode !== 13) return
if(this.buyfill1 == ''){
alert('請輸入交貨期限');
return;
}
if(this.buyfill1 < 1){
alert('交貨期限不得低於1日');
return;
}
if(buyArr[1].installment == 2){
this.buydata.list.plaintext[4].text = this.buydata.list.plaintext[4].text.replace('____', this.buyfill2);
this.buystandardData.list.plaintext[4].text = this.buydata.list.plaintext[4].text.replace('____', this.buyfill2);
this.buyonstandardViewData.list.plaintext[4].text = this.buydata.list.plaintext[4].text.replace('____', this.buyfill2);
}
this.isBuyInputIng = false
this.buydata.list.plaintext[1].text = '產品規格:如附表'+ this.affixArr[Number(this.buyAffix)] +'。'
this.buystandardData.list.plaintext[1].text = '產品規格:如附表'+ this.affixArr[Number(this.buyAffix)] +'。'
this.buyonstandardViewData.list.plaintext[1].text = '產品規格:如附表'+ this.affixArr[Number(this.buyAffix)] +'。'
this.buydata.list.plaintext[5].text = '交貨期限及甲方配合事項:<br>乙方應於接獲甲方圖色確認第&nbsp;'+this.buyfill1+'&nbsp;日(應於合約簽訂日起兩年內),將本工程所需之全部設備、器材 運抵工地,甲方應提供適當的場所供乙方貯放設備、器材。'
this.buystandardData.list.plaintext[5].text = '交貨期限及甲方配合事項:<br>乙方應於接獲甲方圖色確認第&nbsp;'+this.buyfill1+'&nbsp;日(應於合約簽訂日起兩年內),將本工程所需之全部設備、器材 運抵工地,甲方應提供適當的場所供乙方貯放設備、器材。'
this.buyonstandardViewData.list.plaintext[5].text = '交貨期限及甲方配合事項:<br>乙方應於接獲甲方圖色確認第&nbsp;'+this.buyfill1+'&nbsp;日(應於合約簽訂日起兩年內),將本工程所需之全部設備、器材 運抵工地,甲方應提供適當的場所供乙方貯放設備、器材。'
let buyAffixHtml = ''
for(let i=0;i<Number(this.buyAffix);i++){
buyAffixHtml += `<br>${numberToSmallChinese(i+1)}、附表${numberToSmallChinese(i+1)}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;共&nbsp;1&nbsp;張`
}
this.buydata.list.plaintext[15].text = this.buydata.list.plaintext[15].text + buyAffixHtml
this.buystandardData.list.plaintext[15].text = this.buystandardData.list.plaintext[15].text + buyAffixHtml
this.buyonstandardViewData.list.plaintext[15].text = this.buyonstandardViewData.list.plaintext[15].text + buyAffixHtml
},
affixArr:['', '一', '一、二','一、二、三', '一、二、三、四', '一、二、三、四、五'], affixArr:['', '一', '一、二','一、二、三', '一、二、三、四', '一、二、三、四、五'],
isBuyInputIng:true, isBuyInputIng:true,
isInstallInputIng:true, isInstallInputIng:true,

4
wms/contract/prviewPdf.php

@ -190,7 +190,7 @@ function removeTrailingBr($string) {
const formattedDate = `${year}${month}${day}${hours}${minutes}${seconds}`; const formattedDate = `${year}${month}${day}${hours}${minutes}${seconds}`;
let token = formattedDate + '<?php echo $partyAcontractno; ?><?php echo $partyA; ?>永佳捷<?php echo $total_price; ?>' let token = formattedDate + '<?php echo $partyAcontractno; ?><?php echo $partyA; ?>永佳捷<?php echo $total_price; ?>'
let newtoken = formattedDate + '-' + CryptoJS.MD5(CryptoJS.SHA256(CryptoJS.SHA256(CryptoJS.MD5(token).toString()).toString() + this.random).toString()).toString() + '.' let newtoken = formattedDate + '-' + CryptoJS.MD5(CryptoJS.SHA256(CryptoJS.SHA256(CryptoJS.MD5(token).toString()).toString() + this.random).toString()).toString()
console.log(newtoken); console.log(newtoken);
let html = this.$refs.prview.innerHTML let html = this.$refs.prview.innerHTML
let footer = this.$refs.footer.innerHTML let footer = this.$refs.footer.innerHTML
@ -487,7 +487,7 @@ function removeTrailingBr($string) {
</tr> </tr>
</table> --> </table> -->
</div> </div>
<div class="affix1" x-ref="affix1" x-show="true"> <div class="affix1" x-ref="affix1" x-show="false">
<h1 style="text-align:center">升降設備除外工程表</h1> <h1 style="text-align:center">升降設備除外工程表</h1>
<table> <table>
<tr> <tr>

6
wms/contract/styles/style.css

@ -541,14 +541,14 @@ main table td, main table th {
transform: rotate(360deg); transform: rotate(360deg);
} }
} }
.contract-input-component form { .contract-input-component .form {
margin: 0 auto; margin: 0 auto;
} }
.contract-input-component form .dropdown { .contract-input-component .form .dropdown {
width: 100%; width: 100%;
margin-top: 7px; margin-top: 7px;
} }
.contract-input-component form .savebtn { .contract-input-component .form .savebtn {
margin-right: 13px; margin-right: 13px;
display: flex; display: flex;
justify-content: center; justify-content: center;

2
wms/contract/styles/style.css.map

File diff suppressed because one or more lines are too long

3
wms/contract/styles/style.scss

@ -563,7 +563,7 @@ main{
100% { transform: rotate(360deg); } 100% { transform: rotate(360deg); }
} }
.contract-input-component{ .contract-input-component{
form{ .form{
margin:0 auto; margin:0 auto;
.dropdown{ .dropdown{
width:100%; width:100%;
@ -583,7 +583,6 @@ main{
font-size: 16px; font-size: 16px;
} }
@media screen and (max-width: 600px) { @media screen and (max-width: 600px) {
table { table {
border: 0; border: 0;
} }

23
wms/database.php

@ -1,9 +1,24 @@
<?php <?php
date_default_timezone_set("Asia/Taipei"); date_default_timezone_set("Asia/Taipei");
$host = '127.0.0.1:3306'; $envFile = __DIR__ . '/../.env'; // .env 文件的路径
$dbuser ='root';
$dbpassword = ''; if (file_exists($envFile)) {
$dbname = 'appwms0921-2'; $lines = file($envFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
if ($lines !== false) {
foreach ($lines as $line) {
list($key, $value) = explode('=', $line, 2);
$key = trim($key);
$value = trim($value);
// 设置环境变量
putenv("$key=$value");
}
}
}
date_default_timezone_set("Asia/Taipei");
$host = getenv('DB_HOST');
$dbuser = getenv('DB_USERNAME');
$dbpassword = getenv('DB_PASSWORD');
$dbname = getenv('DB_DATABASE');
$link = mysqli_connect($host,$dbuser,$dbpassword,$dbname); $link = mysqli_connect($host,$dbuser,$dbpassword,$dbname);
if($link){ if($link){

15
workflow/lib/DB.php

@ -1,6 +1,21 @@
<?php <?php
error_reporting(E_ALL); error_reporting(E_ALL);
ini_set("display_errors", ""); ini_set("display_errors", "");
date_default_timezone_set("Asia/Taipei");
$envFile = __DIR__ . '/../.env'; // .env 文件的路径
if (file_exists($envFile)) {
$lines = file($envFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
if ($lines !== false) {
foreach ($lines as $line) {
list($key, $value) = explode('=', $line, 2);
$key = trim($key);
$value = trim($value);
// 设置环境变量
putenv("$key=$value");
}
}
}
class DB class DB
{ {
private static $ds = array( private static $ds = array(

Loading…
Cancel
Save