Browse Source

Merge remote-tracking branch 'origin/yan' into gary

gary
gary_chen\gary_chen 1 year ago
parent
commit
5721447be5
  1. 13
      .env
  2. 6768
      app/assets/sass/style.css
  3. 1
      app/assets/sass/style.css.map
  4. 21
      formbuilder/test.php
  5. 6768
      mkt/assets/sass/style.css
  6. 1
      mkt/assets/sass/style.css.map
  7. 6768
      prv/assets/sass/style.css
  8. 1
      prv/assets/sass/style.css.map
  9. 6768
      wms/assets/sass/style.css
  10. 1
      wms/assets/sass/style.css.map
  11. 59
      wms/contract/api/getComboNo.php
  12. 40
      wms/contract/api/getContractData.php
  13. 4
      wms/contract/api/getFacilityNo.php
  14. 383
      wms/contract/api/postContractData.php
  15. 8
      wms/contract/contract-download.php
  16. 554
      wms/contract/contract-input.php
  17. 35
      wms/contract/export-pdf.php
  18. BIN
      wms/contract/images/contracts/c202311081429488338k8338202204260238d952-c57d-4306-98fc-2a0a92278382.jpg
  19. BIN
      wms/contract/images/contracts/c202311081434191255r1255202204260238d952-c57d-4306-98fc-2a0a92278382.jpg
  20. BIN
      wms/contract/images/contracts/c202311081434539019c9019202204260238d952-c57d-4306-98fc-2a0a92278382.jpg
  21. BIN
      wms/contract/images/contracts/c202311081435583265z3265202204260238d952-c57d-4306-98fc-2a0a92278382.jpg
  22. BIN
      wms/contract/images/contracts/c202311081438444055k4055202204260238d952-c57d-4306-98fc-2a0a92278382.jpg
  23. BIN
      wms/contract/images/contracts/c202311081438445230g52301697165865064.jpg
  24. BIN
      wms/contract/images/contracts/c202311081438448320u83201697599065970.jpg
  25. BIN
      wms/contract/images/contracts/c202311081444122858a28581697599065970.jpg
  26. BIN
      wms/contract/images/contracts/c202311081444124981q4981202204260238d952-c57d-4306-98fc-2a0a92278382.jpg
  27. BIN
      wms/contract/images/contracts/c202311081444126049x60491697165865064.jpg
  28. BIN
      wms/contract/images/contracts/c202311081444483652o3652202204260238d952-c57d-4306-98fc-2a0a92278382.jpg
  29. BIN
      wms/contract/images/contracts/c202311081444484116d41161697599065970.jpg
  30. BIN
      wms/contract/images/contracts/c202311081444489890p98901697165865064.jpg
  31. BIN
      wms/contract/images/contracts/c202311090947427180t71804OlaIEQjXAZDasK9Pd1Jxb.jpg
  32. BIN
      wms/contract/images/contracts/c202311090954176835l68354OlaIEQjXAZDasK9Pd1Jxb.jpg
  33. BIN
      wms/contract/images/contracts/c202311090954583134s31344OlaIEQjXAZDasK9Pd1Jxb.jpg
  34. BIN
      wms/contract/images/contracts/c202311091004414235g42354OlaIEQjXAZDasK9Pd1Jxb.jpg
  35. BIN
      wms/contract/images/contracts/c202311101747315948u59481697165865064.jpg
  36. BIN
      wms/contract/images/contracts/c202311101747319269t92691697599065970.jpg
  37. BIN
      wms/contract/images/contracts/c202311101747481959u19591697165865064.jpg
  38. BIN
      wms/contract/images/contracts/c202311101747483858a38581697599065970.jpg
  39. BIN
      wms/contract/images/contracts/c202311101750548465f84651697599065970.jpg
  40. BIN
      wms/contract/images/contracts/c202311101758595752g57521697599065970.jpg
  41. 59
      wms/contract/js/alpine.js
  42. 8
      wms/contract/prviewPdf.php
  43. 28
      wms/contract/styles/style.css
  44. 2
      wms/contract/styles/style.css.map
  45. 28
      wms/contract/styles/style.scss
  46. 514
      wms/contract/twzip.json
  47. 33
      wms/database.php
  48. 15
      workflow/lib/DB.php

13
.env

@ -0,0 +1,13 @@
# DB_CONNECTION=mysql
# DB_HOST=db-104.coowo.com:3306
# DB_PORT=3306
# DB_DATABASE=appwms
# DB_USERNAME=masadaroot
# DB_PASSWORD=x6h5E5p#u8y
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=appwms
DB_USERNAME=root
DB_PASSWORD=

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

21
formbuilder/test.php

@ -2,12 +2,25 @@
require_once 'vendor/autoload.php'; require_once 'vendor/autoload.php';
use Doctrine\DBAL\DriverManager; use Doctrine\DBAL\DriverManager;
$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");
}
}
}
$connectionParams = [ $connectionParams = [
'dbname' => 'masada_test', 'dbname' => getenv('DB_HOST'),
'user' => 'masadaroot', 'user' => getenv('DB_USERNAME'),
'password' => 'x6h5E5p#u8y', 'password' => getenv('DB_PASSWORD'),
'host' => 'db-104.coowo.com:3306', 'host' => getenv('DB_HOST'),
'driver' => 'pdo_mysql', 'driver' => 'pdo_mysql',
]; ];
$conn = DriverManager::getConnection($connectionParams); $conn = DriverManager::getConnection($connectionParams);

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

59
wms/contract/api/getComboNo.php

@ -0,0 +1,59 @@
<?php
class CreateComboNo{
private $comboarr = [
'week'=>'BW002',
'month'=>'EM002',
'quarter'=>'EQ002',
'half'=>'HY002',
'year'=>'EY002'
];
private $bwarr = [
'week','month','week','month','week','quarter',
'week','month','week','month','week','half',
'week','month','week','month','week','quarter',
'week','month','week','month','week','year'
];
private $emarr = [
'month','month','quarter','month','month','half',
'month','month','quarter','month','month','year'
];
private $combo;
private $startdate;
private $enddate;
public function __construct($combo, $startdate, $enddate){
$this->combo = $combo;
$this->startdate = $startdate;
$this->enddate = $enddate;
}
public function getComboNo(){
$comboarr = (array) $this->combo === 'bw' ? $this->bwarr : $this->emarr;
$startdate = new DateTime($this->startdate);
$enddate = new DateTime($this->enddate);
$interval = date_diff($startdate, $enddate);
$months = $interval->y * 12 + $interval->m;
$months = $this->combo === 'bw' ? $months*2 : $months;
$newarr = [];
$idx = 0;
$ori_first_month = date('m', strtotime($this->startdate));
$first_day = date('Y-m-d', strtotime($this->startdate. ' + 3 days'));
$new_first_month = date('m', strtotime($first_day));
if($ori_first_month != $new_first_month){
$first_day = date('Y-m-t', strtotime($this->startdate));
}
$scheduleDate = new DateTime($first_day);
for ($i = 0; $i < $months; $i++){
$newarr[] = [$this->comboarr[$comboarr[$idx]], $scheduleDate->format("Y-m-d")];
$idx ++;
$scheduleDate = $startdate->modify("+1 month");
if($idx >= count($comboarr)){
$idx = 0;
}
}
return json_encode($newarr);
}
}

40
wms/contract/api/getContractData.php

@ -0,0 +1,40 @@
<?php
require_once('../conn.php');
if(isset($_GET['contractno']) && $_GET['contractno']!=''){
try{
$contractno = $_GET['contractno'];
$sql_str = "SELECT con_maintance_examine_apply.*, con_maintance_examine_clear.* FROM con_maintance_examine_apply
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 ;";
$sql_str = "SELECT * FROM con_maintance_examine_apply WHERE vol_no = :vol_no ORDER BY create_at DESC;";
$stmt = $conn->prepare($sql_str);
$stmt->bindParam(':vol_no', $contractno);
$stmt->execute();
$contract= $stmt->fetch(PDO::FETCH_ASSOC);
if(empty($contract)){
echo false;
exit;
}
$apply_key = $contract['apply_key'];
$sql_str = "SELECT * FROM con_maintance_examine_clear WHERE apply_key = :apply_key";
$stmt = $conn->prepare($sql_str);
$stmt->bindParam(':apply_key', $apply_key);
$stmt->execute();
$elevators= $stmt->fetchAll(PDO::FETCH_ASSOC);
$count = COUNT($elevators);
$contract['elevators'] = $elevators;
$contract['num'] = $count;
$contractResponse = json_encode($contract);
// 設定回應標頭為 JSON
header('Content-Type: application/json');
// 將 JSON 回應返回給客戶端
echo $contractResponse;
// echo json_encode($contractResponse);
}catch (PDOException $e ){
die("ERROR!!!: ". $e->getMessage());
}
}

4
wms/contract/api/getFacilityNo.php

@ -496,7 +496,7 @@ class CreateFacilityNo
* @param int $seq_name : 幾個案場 0-99 * @param int $seq_name : 幾個案場 0-99
* @return array $new_facilityno : 作番號 * @return array $new_facilityno : 作番號
*/ */
function makeBFacilityNo($sale_type, $make_type, $num) function makeBFacilityNo($sale_type, $make_type, $num=1)
{ {
if (count($sale_type) !== $num) if (count($sale_type) !== $num)
return "陣列數量不一致!"; return "陣列數量不一致!";
@ -512,7 +512,7 @@ class CreateFacilityNo
} }
$cfn = new CreateFacilityNo; // $cfn = new CreateFacilityNo;
// // 建立作番號 - 新梯 // // 建立作番號 - 新梯
print_r($cfn->makeMFacilityNo(["M", "E"], ["X", "W"], 2)); print_r($cfn->makeMFacilityNo(["M", "E"], ["X", "W"], 2));
echo "<br/><br/>"; echo "<br/><br/>";

383
wms/contract/api/postContractData.php

@ -0,0 +1,383 @@
<?php
require_once("../conn.php");
include_once("./getFacilityNo.php");
include_once("./getComboNo.php");
ini_set ( 'date.timezone' , 'Asia/Taipei' );
if(isset($_POST["contractno"]) && $_POST["contractno"] != "") {
try{
$created_at = date('Y-m-d H:i:s');
$contractno = !empty($_POST['contractno'])? $_POST['contractno'] : null;
$total_price = !empty($_POST['total_price']) ? $_POST['total_price'] : null;
$vat = !empty($_POST['vat']) ? $_POST['vat'] : null;
$mtype = !empty($_POST['mtype']) ? $_POST['mtype'] :null;
$opendoor = !empty($_POST['opendoor']) ? $_POST['opendoor']: null;
$phone = !empty($_POST['phone']) ? $_POST['phone'] : null;
$email = !empty($_POST['email']) ? $_POST['email'] : null;
$mworker = !empty($_POST['mworker']) ? $_POST['mworker'] : null;
$mcycle = !empty($_POST['mcycle']) ? $_POST['mcycle'] : null;
$salesman = !empty($_POST['salesman']) ?$_POST['salesman'] : null;
$contract_begin_date = !empty($_POST['contract_begin_date']) ? $_POST['contract_begin_date'] : null;
$contract_end_date = !empty($_POST['contract_end_date']) ? $_POST['contract_end_date'] : null;
$address = !empty($_POST['address']) ? $_POST['address'] : null;
$area = !empty($_POST['area']) ? $_POST['area'] : null;
$customer = !empty($_POST['customer']) ? $_POST['customer'] : null;
$partyA = !empty($_POST['partyA']) ? $_POST['partyA'] : null;
$partyAaddress = !empty($_POST['partyAaddress']) ? $_POST['partyAaddress'] : null;
$partyAphone = !empty($_POST['partyAphone']) ? $_POST['partyAphone'] : null;
$partyAemail = !empty($_POST['partyAemail']) ? $_POST['partyAemail'] : null;
$user_id = !empty($_POST['user_id']) ? $_POST['user_id'] : null;
$user_name = !empty($_POST['user_name']) ? $_POST['user_name'] : null;
$spec = !empty($_POST['spec']) ? $_POST['spec'] : null;
$weight = !empty($_POST['weight']) ? $_POST['weight'] : null;
$numberofpassenger = !empty($_POST['numberofpassenger']) ? $_POST['numberofpassenger'] : null;
$numberofstop = !empty($_POST['numberofstop']) ? $_POST['numberofstop'] : null;
$numberoffloor = !empty($_POST['numberoffloor']) ? $_POST['numberoffloor'] : null;
$speed = !empty($_POST['speed']) ? $_POST['speed'] : null;
$takecertificatedate = !empty($_POST['takecertificatedate']) ? $_POST['takecertificatedate'] : null;
$maintainance = !empty($_POST['maintainance']) ? $_POST['maintainance'] : null;
$licensedate = !empty($_POST['licensedate']) ? $_POST['licensedate'] : null;
$latitude = !empty($_POST['latitude']) ? $_POST['latitude'] : null;
$longitude = !empty($_POST['longitude']) ? $_POST['longitude'] : null;
$num = !empty($_POST['num']) ? $_POST['num'] : null;
$files = !empty($_FILES['files']) ? $_FILES['files'] : null;
$elevators = !empty($_POST['elevators']) ? json_decode($_POST['elevators'], true) : [];
// validate
$fail_arr = [];
if($contractno === '') return $fail_arr[] = '合約號為必填';
if($total_price == '') $fail_arr[] = '合約總價為必填';
if($vat == '') $fail_arr[] = '統一編號為必填';
if($mtype == '') $fail_arr[] = '維修型態為必填';
if($phone == '') $fail_arr[] = '客戶電話為必填';
if($email == '') $fail_arr[] = 'Email為必填';
if($mworker == '') $fail_arr[] = '保養員為必填';
if($mcycle == '') $fail_arr[] = '保養頻率為必填';
if($salesman == '') $fail_arr[] = '營業員為必填';
if($contract_begin_date == '') $fail_arr[] = '合約開始時間為必填';
if($contract_end_date == '') $fail_arr[] = '合約結束時間為必填';
if($address == '') $fail_arr[] = '地址為必填';
if($area == '') $fail_arr[] = '區域為必填';
if($customer == '') $fail_arr[] = '客戶為必填';
if($partyA == '') $fail_arr[] = '業務聯繫人為必填';
if($partyAaddress == '') $fail_arr[] = '業務聯繫人地址為必填';
if($partyAphone == '') $fail_arr[] = '業務聯繫人電話為必填';
if($partyAemail == '') $fail_arr[] = '業務聯繫人Email為必填';
if($num == '') $fail_arr[] = '電梯數量為必填';
if(count($fail_arr) > 0) {
header("HTTP/1.1 422 Unprocessable Entity");
echo json_encode($fail_arr);
exit();
}
//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');
$conn->beginTransaction();
$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();
//create contract table
$contracttype = $mtype;
$company = $partyA;
$taxid = $vat;
$tel = $phone;
$promiser = $partyA;
$contractperson = $partyA;
$contractaddress = $address;
$contracttel = $phone;
$contractemail = $email;
$contract_employee = $salesman;
$start_date = $contract_begin_date;
$end_date = $contract_end_date;
$sql_str = "INSERT INTO contract (contracttype, contractno, company, taxid, address, tel, promiser, contractperson, contractaddress, contracttel, contractemail, contract_employee, start_date, end_date, creater, create_at) VALUES (:contracttype, :contractno, :company, :taxid, :address, :tel, :promiser, :contractperson, :contractaddress, :contracttel, :contractemail, :contract_employee, :start_date, :end_date, :creater, :create_at)";
$stmt = $conn -> prepare($sql_str);
$stmt -> bindParam(':contracttype' ,$contracttype);
$stmt -> bindParam(':contractno' ,$contractno);
$stmt -> bindParam(':company' ,$company);
$stmt -> bindParam(':taxid' ,$taxid);
$stmt -> bindParam(':address' ,$address);
$stmt -> bindParam(':tel' ,$tel);
$stmt -> bindParam(':promiser' ,$promiser);
$stmt -> bindParam(':contractperson' ,$contractperson);
$stmt -> bindParam(':contractaddress' ,$contractaddress);
$stmt -> bindParam(':contracttel' ,$contracttel);
$stmt -> bindParam(':contractemail' ,$contractemail);
$stmt -> bindParam(':contract_employee' ,$contract_employee);
$stmt -> bindParam(':start_date' ,$start_date);
$stmt -> bindParam(':end_date' ,$end_date);
$stmt -> bindParam(':creater' ,$creater);
$stmt -> bindParam(':create_at' ,$create_at);
$stmt -> execute();
//create facility table
$createFacilityNo = new CreateFacilityNo();
$dailyNecessities = [
'MAE100'=>'X',
'MAM200'=>'W',
'MAH100'=>'H',
'MAQ100'=>'Z',
'MAF100'=>'F',
'MAZ100'=>'B',
];
$facility_arr = [];
foreach($elevators as $elevator){
$facility_arr[] = $elevator['spec'];
}
echo $dailyNecessities[$elevator['spec']];
$facilityno = $createFacilityNo->makeBFacilityNo("T", $facility_arr, (int)$num);
$sql_str = "SELECT accountid, name FROM account WHERE accountid = :accountid";
$stmt = $conn->prepare($sql_str);
$stmt->bindParam(':accountid',$mworker);
$stmt->execute();
$worker = $stmt->fetch(PDO::FETCH_ASSOC);
$customerid = $vat;
$define = "B";
$repairtype = "A";
$repairerid = $mworker;
$repairername = $worker['name'];
foreach($elevators as $idx=>$elevator){
$sql_str = "INSERT INTO facility (contractno, define, facilityno, latitude, longitude, customerid, weight, numberofpassenger, numberofstop, numberoffloor, opentype, speed, repairtype, maintainance, facility_kind, address, repairerid, repairername, creater, create_at, area, takecertificatedate, licensedate)
VALUES (:contractno, :define, :facilityno, :latitude, :longitude, :customerid, :weight, :numberofpassenger, :numberofstop, :numberoffloor, :opentype, :speed, :repairtype, :maintainance, :facility_kind, :address, :repairerid, :repairername, :creater, :create_at, :area, :takecertificatedate, :licensedate)";
$stmt = $conn -> prepare($sql_str);
$stmt -> bindParam(':contractno' ,$contractno);
$stmt -> bindParam(':define' ,$define);
$stmt -> bindParam(':facilityno' ,$facilityno[$idx]);
$stmt -> bindParam(':latitude' ,$elevator['latitude']);
$stmt -> bindParam(':longitude' ,$elevator['longitude']);
$stmt -> bindParam(':customerid' ,$customerid);
$stmt -> bindParam(':weight' ,$elevator['weight']);
$stmt -> bindParam(':numberofpassenger' ,$elevator['persons']);
$stmt -> bindParam(':numberofstop' ,$elevator['stop']);
$stmt -> bindParam(':numberoffloor' ,$elevator['floors']);
$stmt -> bindParam(':opentype' ,$elevator['opendoor']);
$stmt -> bindParam(':speed' ,$elevator['speed']);
$stmt -> bindParam(':repairtype' ,$repairtype);
$stmt -> bindParam(':maintainance' ,$maintainance);
$stmt -> bindParam(':facility_kind' ,$elevator['spec']);
$stmt -> bindParam(':address' ,$address);
$stmt -> bindParam(':repairerid' ,$repairerid);
$stmt -> bindParam(':repairername' ,$repairername);
$stmt -> bindParam(':creater' ,$creater);
$stmt -> bindParam(':create_at' ,$create_at);
$stmt -> bindParam(':area' ,$area);
$stmt -> bindParam(':takecertificatedate' ,$elevator['takecertificatedate']);
$stmt -> bindParam(':licensedate' ,$elevator['licensedateeeee']);
$result = $stmt -> execute();
}
//create schedule table
$comboNo = new CreateComboNo($mcycle, $contract_begin_date, $contract_end_date);
$comboArr = json_decode($comboNo->getComboNo(), true);
foreach($facilityno as $no){
foreach($comboArr as $combo){
$sql_str = 'INSERT INTO schedule (contractno, facilityno, combono, repairerid, repairername, duedate, creater, create_at) VALUES (:contractno, :facilityno, :combono, :repairerid, :repairername, :duedate, :creater, :create_at)';
$stmt = $conn -> prepare($sql_str);
$stmt -> bindParam(':contractno' ,$contractno);
$stmt -> bindParam(':facilityno' ,$no);
$stmt -> bindParam(':combono' ,$combo[0]);
$stmt -> bindParam(':repairerid' ,$repairerid);
$stmt -> bindParam(':repairername' ,$repairername);
$stmt -> bindParam(':duedate' ,$combo[1]);
$stmt -> bindParam(':creater' ,$creater);
$stmt -> bindParam(':create_at' ,$create_at);
$result = $stmt -> execute();
}
}
// create contract_b_signed_back table
$contract_type = $mtype;
$company = $customer;
$customer_no = $vat;
$salesperson = $salesman;
$customer_phone = $phone;
$customer_email = $email;
$repairman = $mworker;
$cycle = $mcycle;
$contact_person = $partyA;
$contact_address = $partyAaddress;
$contact_phone = $partyAphone;
$contract_email = $partyAemail;
$elevators_number = $num;
$bonus = 1000;
$max_bonus = 2000;
if(!empty($files)){
$englisharr = range('a', 'z');
$file = $_FILES['files'];
$file_name = $file['name'];
$file_type = $file['type'];
$tmp_name = $file['tmp_name'];
$file_size = $file['size'];
$error = $file['error'];
$newfiles = [];
foreach( $files as $file ){
$i = 0; //新陣列的索引編號
foreach( $file as $key => $val ){
$newfiles[$i]['name'] = $files['name'][$key];
$newfiles[$i]['type'] = $files['type'][$key];
$newfiles[$i]['tmp_name'] = $files['tmp_name'][$key];
$newfiles[$i]['error'] = $files['error'][$key];
$newfiles[$i]['size'] = $files['size'][$key];
$i++;
} //foreach 第2層 end
}
$max_size = 4096*4096; //設定允許上傳檔案容量的最大值(1M)
$allow_ext = array('jpeg', 'jpg', 'png','JPG','JPEG','PNG','GIF'); //設定允許上傳檔案的類型
$path = '../images/contracts/';
if (!file_exists($path)) { mkdir($path); }
$msg_result = ''; //負責接收所有檔案檢測後的回傳訊息
$datetime = (string)date('YmdHis');
$files_id = 'c' . $datetime;
foreach( $newfiles as $key => $file ){
$randNum = rand(1000,9999);
$randEnglish = $englisharr[rand(0,25)];
$file_name = 'c' . (string)date('YmdHis') . $randNum . $randEnglish . $randNum.$file['name'];
$msg = upload_chk( $file,$path, $max_size, $allow_ext, $file_name );
if($msg==1){
$msg = '檔案傳送成功!';
$sql_str = "INSERT INTO contract_back_files (files_id, file_name, file_mime, file_size, created_at, created_by) VALUES (:files_id, :file_name, :file_mime, :file_size, :created_at, :created_by)";
$stmt = $conn -> prepare($sql_str);
$stmt -> bindParam(':files_id' ,$files_id);
$stmt -> bindParam(':file_name' ,$file_name);
$stmt -> bindParam(':file_mime' ,$file['type']);
$stmt -> bindParam(':file_size' ,$file['size']);
$stmt -> bindParam(':created_at' ,$created_at);
$stmt -> bindParam(':created_by' ,$user_id);
$stmt ->execute();
}
$msg_result .= '第' . ($key+1) . '個上傳檔案的結果:' . $msg . '<br/>';
$src_name = $path.$file['name'];
if( file_exists($src_name) ){
//副檔名
$extname = pathinfo($src_name, PATHINFO_EXTENSION);
//主檔名
$basename = basename($src_name, '.'.$extname);
}
}
}else{
$files = null;
}
$sql_str = "INSERT INTO contract_b_signed_back (contract_no, contract_type, company, customer_no, salesperson, contract_start_date, contract_end_date, total_price, customer_phone, customer_email, repairman, cycle, contact_person, contact_address, contact_phone, contact_email, elevators_number, area, address, files_id, bonus, max_bonus, created_at, created_by)
VALUES (:contract_no, :contract_type, :company, :customer_no, :salesperson, :contract_start_date, :contract_end_date, :total_price, :customer_phone, :customer_email, :repairman, :cycle, :contact_person, :contact_address, :contact_phone, :contact_email, :elevators_number, :area, :address, :files_id, :bonus, :max_bonus, :created_at, :created_by)";
$stmt = $conn -> prepare($sql_str);
$stmt -> bindParam(":contract_no",$contractno);
$stmt -> bindParam(":contract_type",$contract_type);
$stmt -> bindParam(":company",$company);
$stmt -> bindParam(":customer_no",$customer_no);
$stmt -> bindParam(":salesperson",$salesperson);
$stmt -> bindParam(":contract_start_date",$contract_begin_date);
$stmt -> bindParam(":contract_end_date",$contract_end_date);
$stmt -> bindParam(":total_price",$total_price);
$stmt -> bindParam(":customer_phone",$customer_phone);
$stmt -> bindParam(":customer_email",$customer_email);
$stmt -> bindParam(":repairman",$repairman);
$stmt -> bindParam(":cycle",$cycle);
$stmt -> bindParam(":contact_person",$contact_person);
$stmt -> bindParam(":contact_address",$contact_address);
$stmt -> bindParam(":contact_phone",$contact_phone);
$stmt -> bindParam(":contact_email",$contact_email);
$stmt -> bindParam(":elevators_number",$elevators_number);
$stmt -> bindParam(":area",$area);
$stmt -> bindParam(":address",$address);
$stmt -> bindParam(":files_id",$files_id);
$stmt -> bindParam(":bonus",$bonus);
$stmt -> bindParam(":max_bonus",$max_bonus);
$stmt -> bindParam(":created_at", $created_at);
$stmt -> bindParam(":created_by",$user_id);
$stmt -> execute();
header('Content-Type: application/json');
$jsonData = json_encode($files);
$conn->commit();
}catch(PDOException $e){
$conn->rollback();
echo $e->getMessage();
die('Error!:'.$e->getMessage());
}
}
function upload_chk( $file, $path, $max_size, $allow_ext, $file_name ){
$source_file_name = $file['name']; //上傳檔案的原來檔案名稱
$file_type = $file['type']; //上傳檔案的類型(副檔名)
$tmp_name = $file['tmp_name']; //上傳到暫存空間的路徑/檔名
$file_size = $file['size']; //上傳檔案的檔案大小(容量)
$error = $file['error']; //上傳工作傳回的錯誤訊息編號
$msg = ''; //負責記錄回傳的訊息
//1.判斷錯誤編號只有為0時表示沒有錯誤發生,才表示上傳成功 =================
if( $error == 0 ){
//取得檔案延伸的副檔名, 以下函數可以取得檔案延伸的副檔名
//pathinfo(上傳檔案的原來檔案名稱, PATHINFO_EXTENSION)
$ext = pathinfo($source_file_name, PATHINFO_EXTENSION);
$ext = strtolower($ext); //將延伸的副檔名轉小寫
//2.判斷上傳檔案的大小 ====================================
if( $file_size > $max_size ){
//當目前檔案容量超過容量限制時, 以下準備顯示的資訊
if( $max_size >= 4096*4096 ){
$max_size /= (4096*4096);
$max_size .= 'M';
}elseif( $max_size >= 4096 ){
$max_size /= 4096;
$max_size .= 'K';
}
$msg ='上傳檔案過大,請選擇容量小於 '.$max_size.' 的檔案';
//3.判斷檔案類型 ===========================================
//in_array($ext, $allow_ext) 判斷 $ext變數的值 是否在 $allow_ext 這個陣列變數中
}elseif( !in_array( $ext, $allow_ext ) ){
$allow_str = ''; //準備將允許檔案類型的陣列內容, 組合成字串
foreach( $allow_ext as $key=>$value ){
//if的縮寫語法:條件?成立執行的工作:不成立執行的工作;
$key==0? $allow_str.= $value : $allow_str.=', '.$value;
}
$msg = '檔案類型不符合,請選擇 '.$allow_str.' 檔案';
//4.以上條件都沒問題的話, 則進行最後else中的工作===============
}else{
//搬移檔案 move_uploaded_file(要搬移的檔案, 目的地位置及目的檔案名稱), 成功傳回true(1)
$msg = @move_uploaded_file($tmp_name, $path.$file_name);
}
}else{
//這裡表示上傳有錯誤, 匹配錯誤編號顯示對應的訊息 ======================================
switch ($error) {
case 1: $msg = '上傳檔案超過 upload_max_filesize 容量最大值'; break;
case 2: $msg = '上傳檔案超過 post_max_size 總容量最大值'; break;
case 3: $msg = '檔案只有部份被上傳'; break;
case 4: $msg = '沒有檔案被上傳'; break;
case 6: $msg = '找不到主機端暫存檔案的目錄位置'; break;
case 7: $msg = '檔案寫入失敗'; break;
case 8: $msg = '上傳檔案被PHP程式中斷,表示主機端系統錯誤'; break;
}
} //if( $error == 0 ){ ..... end
return $msg; //回傳$msg的結果
}

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>

554
wms/contract/contract-input.php

@ -1,23 +1,239 @@
<?php <?php
include("../header.php"); include("../header.php");
require_once("./conn.php"); require_once("./conn.php");
include_once("./api/getFacilityNo.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">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css" integrity="sha512-z3gLpd7yknf1YoNbCzqRKc4qyor8gaKU1qmn+CShxbuBusANI9QpRohGBreCFkKxLhei6S9CQXFEbbKuqLg0DA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script> <script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.5.0/axios.min.js" integrity="sha512-aoTNnqZcT8B4AmeCFmiSnDlc4Nj/KPaZyB5G7JnOnUEkdNpCZs1LCankiYi01sLTyWy+m2P+W4XM+BuQ3Q4/Dg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.5.0/axios.min.js" integrity="sha512-aoTNnqZcT8B4AmeCFmiSnDlc4Nj/KPaZyB5G7JnOnUEkdNpCZs1LCankiYi01sLTyWy+m2P+W4XM+BuQ3Q4/Dg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<div class="contract-input-component" x-data="{ <div class="contract-input-component" x-data="{
init(){ init(){
$('select.dropdown') $('.contract-input-component .form .dropdown').dropdown();
.dropdown();
axios.get('./twzip.json').then(res=>{
this.cities = res.data.cities
})
},
cities:[],
data:{
contractno:'B23100060',
total_price:'', //合約總價
vat:'', //統一編號
mtype:'A', //維修型態
phone:'', //客戶電話
email:'', //Email
mworker:'', //保養員
mcycle:'', //保養頻率
salesman:'', //營業員
contract_begin_date:'', //合約開始時間
contract_end_date:'', //合約終止時間
area:'', //區域
zip:'', //郵遞區號
address:'', //地址
customer:'', //立約人
partyA:'', //業務聯繫人
partyAaddress:'', //業務聯繫人地址
partyAphone:'', //業務聯繫人電話
partyAemail:'', //業務聯繫人email
files:[], //附件檔案
num:'', //電梯數量
disabled:false, //資料庫是否有電梯數量資料
elevators:[], //機種、載重、人乘、樓停、樓層、速度、緯度、經度、開門方式、保養別、廠牌、竣檢日、許可證日期
}, },
customize:false,
step:1,
isLoading:false, isLoading:false,
fail_arr:[],
nextStepFn(){
if(this.step==1){
if(this.data.contractno == '') return alert('請輸入合約號');
this.isLoading = true
this.getContractDate();
}else if(this.step == 2){
if(this.data.num <= 0) return alert('請填寫電梯數量!')
if(!this.data.disabled){
this.createElevator();
}
this.step = 3
}
},
nextStepKeyupFn(e){
if(e.keyCode !== 13) return
if(this.step==1){
if(this.data.contractno == '') return alert('請輸入合約號');
this.isLoading = true
this.getContractDate();
}else if(this.step == 2){
this.step = 3
}
},
createElevator(){
for(let i=0;i<this.data.num;i++){
this.data.elevators.push({
spec:'', //規格
weight:'', //載重
speed:'', //速度
persons:'', //人乘
stop:'', //樓停
floors:'', //樓層
latitude:'', //緯度
longitude:'', //經度
brand:'', //廠牌
opendoor:'', //開門方式
maintainance:'', //保養別
takecertificatedate:'', //竣檢日
licensedate:'', //許可證有效日期
})
}
},
getContractDate(){
axios.get('./api/getContractData.php?contractno=' + this.data.contractno).then(res=>{
if(!res.data){
this.step = 2
this.isLoading = false
return
}
if(!this.customize){
console.log(res.data);
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.data.spec = res.data.spec
this.data.weight = res.data.weight
this.data.numberofpassenger = res.data.persons
this.data.numberofstop = res.data.stop
this.data.numberoffloor = res.data.floors
this.data.speed = res.data.speed
this.data.takecertificatedate = res.data.contract_begin_date
this.data.num = res.data.num
this.data.disabled = (res.data.num > 0) ? true : false;
this.data.elevators = res.data.elevators
let cityIndex = this.data.address.indexOf('市');
console.log(cityIndex);
if(cityIndex == -1) {
cityIndex = this.data.address.indexOf('縣');
}
if (cityIndex > 1) {
// 獲取''市''前面的兩個字
let city = this.data.address.substring(cityIndex - 2, cityIndex + 1);
this.data.area = city;
} else {
this.data.area = ''
}
}
this.step = 2
this.isLoading = false
}).catch(err=>{
console.error(err)
this.isLoading = false
})
},
preStepFn(){
if(this.step==2){
if(confirm('回到上一頁會將會初始化資料,確定返回嗎?')){
this.step = 1
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.partyAaddress = ''
this.data.spec = ''
this.data.weight = ''
this.data.numberofpassenger = ''
this.data.numberofstop = ''
this.data.numberoffloor = ''
this.data.speed = ''
this.data.takecertificatedate = ''
this.step = 1
this.data.num = ''
this.data.disabled = false
this.data.elevators = []
return;
}
}else if(this.step == 3){
this.step = 2
}
},
save(){ save(){
this.isLoading = true this.isLoading = true
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('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('area', this.data.area);
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; ?>');
form.append('user_name', '<?php echo $user_name; ?>');
form.append('num', this.data.num);
console.log(this.data.elevators);
form.append('elevators', JSON.stringify(this.data.elevators));
// 如果有附件檔案,可以逐一加入
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=>{
let code = error.response.status;
if(code == 422){
this.fail_arr = error.response.data
this.errorFn();
}
this.isLoading = false
})
},
errorFn(){
let msg = ''
for(let i = 0; i < this.fail_arr.length; i++){
msg += this.fail_arr[i] + '、'
} }
alert(msg)
},
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%">
@ -28,7 +244,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>
@ -39,174 +273,260 @@ 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 type="text" x-model="data.customer" />
<p class="alerttext" x-show="data.customer==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</td>
<td style="vertical-align: middle">營業員</td>
<td>
<select class="ui fluid search dropdown" name="promiser" x-model="data.salesman">
<option value="">選擇營業員</option>
<?php foreach($contractpersons as $person){ ?>
<option value="<?php echo $person['accountid'] ?>"><?php echo $person['name'] ?></option>
<?php } ?>
</select>
<p class="alerttext" x-show="data.salesman==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</td>
<td style="vertical-align: middle">合約開始時間</td>
<td>
<input class="form-control disabled_select" type="date" name="start_date" x-model="data.contract_begin_date" >
<p class="alerttext" x-show="data.contract_begin_date==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</td>
<td style="vertical-align: middle">合約終止時間</td>
<td>
<input class="form-control disabled_select" type="date" name="end_date" x-model="data.contract_end_date" >
<p class="alerttext" x-show="data.contract_end_date==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</td>
</tr>
<tr>
<td style="vertical-align: middle">電梯台數</td>
<td>
<input class="form-control disabled_select" type="number" x-model="data.num" :disabled="data.disabled">
<p class="alerttext" x-show="data.num==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
<p class="alerttext" x-show="data.num==0 && data.num!=''"><i class="fa-solid fa-circle-xmark"></i>電梯數量需大於0</p>
</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" >
<p class="alerttext" x-show="data.vat==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</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>
</td>
<td style="vertical-align: middle">
開門方式
</td>
<td style="vertical-align: middle">
<select class="ui search dropdown" name="repairtype">
<option value="">選擇開門方式</option>
<option value="2PCO">2PCO</option>
<option value="2S">2S</option>
<option value="2SL">2SL</option>
<option value="2SR">2SR</option>
<option value="2U">2U</option>
<option value="3S">3S</option>
<option value="4PCO">4PCO</option>
<option value="6PCO">6PCO</option>
<option value="CO">CO</option>
</select> </select>
<p class="alerttext" x-show="data.mtype==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</td> </td>
<td></td>
<td></td>
</tr> </tr>
<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" >
<p class="alerttext" x-show="data.phone==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</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" >
<p class="alerttext" x-show="data.email==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</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>
<p class="alerttext" x-show="data.mworker==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</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="bw">雙週保</option>
<option value="B">半包</option> <option value="em">月保</option>
<option value="C">清包</option>
<option value="D">半包兩個月保養一次</option>
<option value="E">半包一個月保養兩次</option>
</select> </select>
<p class="alerttext" x-show="data.mcycle==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</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> <p class="alerttext" x-show="data.partyA==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
<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="" >
<p class="alerttext" x-show="data.partyAaddress==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</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" >
<p class="alerttext" x-show="data.partyAphone==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</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" >
<p class="alerttext" x-show="data.partyAemail==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</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"> <select class="ui search dropdown" x-model="data.area">
<option value="">選擇立約人</option> <option value="">選擇區域</option>
<option value="AF">呼呼</option> <template x-for="city in cities" :key="city.code">
<option value="AX">哈哈</option> <option x-bind:selected="city.name === data.area" x-text="city.name" :value="city.name"></option>
<option value="AL">嘿嘿</option> </template>
<option value="DZ">嗚嗚</option>
<option value="AS">ㄚㄚ</option>
</select> </select>
<p class="alerttext" x-show="data.area==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</td>
<td style="vertical-align: middle">詳細地址</td>
<td colspan="3">
<input type="text" x-model="data.address" />
<p class="alerttext" x-show="data.address==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</td>
<td style="vertical-align: middle">附件</td>
<td >
<input type="file" name="file[]" multiple draggable="true" @change="uploadFiles($event)" />
<p class="alerttext" x-show="data.files==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</td> </td>
<td style="vertical-align: middle">契約人</td> </tr>
<tr>
</tr>
</tbody>
</template>
<template x-if="step==3">
<template x-for="(elevator, idx) in data.elevators" :key="elevator.apply_key + elevator.register_code">
<tbody style="font-weight: bolder;margin-bottom: 20px" x-show="step==3">
<tr>
<td colspan=8><p x-text="'電梯' + Number(idx+1)"></p></td>
</tr>
<tr>
<td style="vertical-align: middle">機種</td>
<td> <td>
<select class="ui search dropdown" name="promiser"> <select class="ui search dropdown" name="spec" x-model="data.elevators[idx].spec" >
<option value="">選擇契約人</option> <option value="">選擇規格</option>
<option value="AF">呼呼</option> <option value="MAE100">MAE100</option>
<option value="AX">哈哈</option> <option value="MAM200">MAM200</option>
<option value="AL">嘿嘿</option> <option value="MAH100">MAH100</option>
<option value="DZ">嗚嗚</option> <option value="MAQ100">MAQ100</option>
<option value="AS">ㄚㄚ</option> <option value="MAF100">MAF100</option>
<option value="MAZ100">MAZ100</option>
</select> </select>
<p class="alerttext" x-show="!(data.elevators[idx].spec=='MAE100' || data.elevators[idx].spec=='MAM200' || data.elevators[idx].spec=='MAH100' || data.elevators[idx].spec=='MAQ100' || data.elevators[idx].spec=='MAF100' || data.elevators[idx].spec=='MAZ100')"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</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 type="text" x-model="data.elevators[idx].weight" />
<p class="alerttext" x-show="data.elevators[idx].weight==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</td> </td>
<td style="vertical-align: middle">合約終止時間</td> <td style="vertical-align: middle">速度</td>
<td>
<input type="text" x-model="data.elevators[idx].speed" />
<p class="alerttext" x-show="data.elevators[idx].speed==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</td>
<td style="vertical-align: middle">人乘</td>
<td> <td>
<input class="form-control disabled_select" type="date" name="end_date" value="" > <input type="text" x-model="data.elevators[idx].persons" />
<p class="alerttext" x-show="data.elevators[idx].persons==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</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="number" class="form-control" x-model="data.elevators[idx].stop" />
<option value="">選擇地址</option> <p class="alerttext" x-show="data.elevators[idx].stop==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
<option value="基隆市">基隆市</option> </td>
<option value="台北市">台北市</option> <td style="vertical-align: middle">樓層</td>
<option value="新北市">新北市</option> <td>
<option value="桃園市">桃園市</option> <input type="text" x-model="data.elevators[idx].floors" />
<option value="新竹市">新竹市</option> <p class="alerttext" x-show="data.elevators[idx].floors==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
<option value="新竹縣">新竹縣</option> </td>
<option value="苗栗縣">苗栗縣</option> <td style="vertical-align: middle">緯度</td>
<option value="台中市">台中市</option> <td>
<option value="彰化縣">彰化縣</option> <input type="text" x-model="data.elevators[idx].latitude" />
<option value="南投縣">南投縣</option> <p class="alerttext" x-show="data.elevators[idx].latitude=='' || !data.elevators[idx].latitude"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
<option value="雲林縣">雲林縣</option> </td>
<option value="嘉義市">嘉義市</option>
<option value="嘉義縣">嘉義縣</option> <td style="vertical-align: middle">經度</td>
<option value="台南市">台南市</option> <td>
<option value="高雄市">高雄市</option> <input type="text" x-model="data.elevators[idx].longitude" />
<option value="屏東縣">屏東縣</option> <p class="alerttext" x-show="data.elevators[idx].longitude=='' || !data.elevators[idx].longitude"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
<option value="台東縣">台東縣</option> </td>
<option value="花蓮縣">花蓮縣</option> </tr>
<option value="宜蘭縣">宜蘭縣</option> <tr>
<option value="澎湖縣">澎湖縣</option> <td style="vertical-align: middle">廠牌</td>
<option value="金門縣">金門縣</option> <td>
<option value="連江縣">連江縣</option> <input type="text" x-model="data.elevators[idx].brand" class="form-control" />
<p class="alerttext" x-show="data.elevators[idx].brand==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</td>
<td style="vertical-align: middle">
開門方式
</td>
<td style="vertical-align: middle">
<select class="ui search dropdown" name="repairtype" x-model="data.elevators[idx].opendoor">
<option value="">選擇開門方式</option>
<option value="2PCO">2PCO</option>
<option value="2S">2S</option>
<option value="2SL">2SL</option>
<option value="2SR">2SR</option>
<option value="2U">2U</option>
<option value="3S">3S</option>
<option value="4PCO">4PCO</option>
<option value="6PCO">6PCO</option>
<option value="CO">CO</option>
</select> </select>
<p class="alerttext" x-show="data.elevators[idx].opendoor==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</td> </td>
<td style="vertical-align: middle"></td> <td style="vertical-align: middle">保養別</td>
<td> <td>
<select class="ui search dropdown" x-model="data.elevators[idx].maintainance">
<option value="">選擇保養別</option>
<option value="A">全包</option>
<option value="B">半包</option>
<option value="C">清包</option>
</select>
<p class="alerttext" x-show="data.elevators[idx].maintainance==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</td> </td>
<td style="vertical-align: middle"></td> <td style="vertical-align: middle">竣檢日</td>
<td> <td>
<input class="form-control disabled_select" type="date" x-model="data.elevators[idx].takecertificatedate">
<p class="alerttext" x-show="data.elevators[idx].takecertificatedate==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</td> </td>
<td style="vertical-align: middle"></td> </tr>
<tr>
<td style="vertical-align: middle">許可證有效時間</td>
<td> <td>
<input class="form-control disabled_select" type="date" x-model="data.elevators[idx].licensedate">
<p class="alerttext" x-show="data.elevators[idx].licensedate==''"><i class="fa-solid fa-circle-xmark"></i>未填寫</p>
</td> </td>
</tr> </tr>
<tr><td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td></tr>
</tbody> </tbody>
</template>
</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==3" @click="save()" :disabled="isLoading" 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>
@ -214,11 +534,31 @@ require_once("./conn.php");
<div class="loader"></div> <div class="loader"></div>
</template> </template>
</button> </button>
<button x-show="step<=2" @click="nextStepFn()" type="button" class="btn btn-primary btn-lg pull-right savebtn" :disabled="isLoading">
<template x-if="!isLoading">
<span>下一步</span>
</template>
<template x-if="isLoading">
<div class="loader"></div>
</template>
</button>
<button x-show="step>1" @click="preStepFn()" :disabled="isLoading" 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> </div>
</form>
</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"
integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
crossorigin="anonymous"></script> crossorigin="anonymous"></script>
<script src="semantic/dist/semantic.min.js" ></script> <script src="semantic/dist/semantic.min.js" ></script>
<script>
</script>

35
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'); // 在右下角添加浮水印
} }
} }
@ -94,7 +100,6 @@ if(isset($_POST['html'])){
// 加入 HTML 和 CSS // 加入 HTML 和 CSS
$html = $_POST['css'] . $_POST['html']; $html = $_POST['css'] . $_POST['html'];
// 使用正則表達式找到 <u>xxxx</u>
$footer = $_POST['footer']; $footer = $_POST['footer'];
@ -162,7 +167,7 @@ if(isset($_POST['html'])){
$width = $pdf->getPageWidth(); $width = $pdf->getPageWidth();
$height = $pdf->getPageHeight(); $height = $pdf->getPageHeight();
// 加入 HTML 和 CSS // 加入footer
$footer = $_POST['footer']; $footer = $_POST['footer'];
// 寫入 HTML 到 PDF // 寫入 HTML 到 PDF
@ -183,7 +188,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"');

BIN
wms/contract/images/contracts/c202311081429488338k8338202204260238d952-c57d-4306-98fc-2a0a92278382.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
wms/contract/images/contracts/c202311081434191255r1255202204260238d952-c57d-4306-98fc-2a0a92278382.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
wms/contract/images/contracts/c202311081434539019c9019202204260238d952-c57d-4306-98fc-2a0a92278382.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
wms/contract/images/contracts/c202311081435583265z3265202204260238d952-c57d-4306-98fc-2a0a92278382.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
wms/contract/images/contracts/c202311081438444055k4055202204260238d952-c57d-4306-98fc-2a0a92278382.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
wms/contract/images/contracts/c202311081438445230g52301697165865064.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

BIN
wms/contract/images/contracts/c202311081438448320u83201697599065970.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 KiB

BIN
wms/contract/images/contracts/c202311081444122858a28581697599065970.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 KiB

BIN
wms/contract/images/contracts/c202311081444124981q4981202204260238d952-c57d-4306-98fc-2a0a92278382.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
wms/contract/images/contracts/c202311081444126049x60491697165865064.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

BIN
wms/contract/images/contracts/c202311081444483652o3652202204260238d952-c57d-4306-98fc-2a0a92278382.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
wms/contract/images/contracts/c202311081444484116d41161697599065970.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 KiB

BIN
wms/contract/images/contracts/c202311081444489890p98901697165865064.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

BIN
wms/contract/images/contracts/c202311090947427180t71804OlaIEQjXAZDasK9Pd1Jxb.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
wms/contract/images/contracts/c202311090954176835l68354OlaIEQjXAZDasK9Pd1Jxb.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
wms/contract/images/contracts/c202311090954583134s31344OlaIEQjXAZDasK9Pd1Jxb.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
wms/contract/images/contracts/c202311091004414235g42354OlaIEQjXAZDasK9Pd1Jxb.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
wms/contract/images/contracts/c202311101747315948u59481697165865064.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

BIN
wms/contract/images/contracts/c202311101747319269t92691697599065970.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 KiB

BIN
wms/contract/images/contracts/c202311101747481959u19591697165865064.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

BIN
wms/contract/images/contracts/c202311101747483858a38581697599065970.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 KiB

BIN
wms/contract/images/contracts/c202311101750548465f84651697599065970.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 KiB

BIN
wms/contract/images/contracts/c202311101758595752g57521697599065970.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 KiB

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,

8
wms/contract/prviewPdf.php

@ -61,7 +61,7 @@ function numberToChinese($num) {
} elseif ($num < 100) { } elseif ($num < 100) {
return $chineseNumbers[intval($num / 10)] . $units[1] . ($num % 10 > 0 ? $chineseNumbers[$num % 10] : ''); return $chineseNumbers[intval($num / 10)] . $units[1] . ($num % 10 > 0 ? $chineseNumbers[$num % 10] : '');
} else { } else {
// 处理大于 99 的数字 // 處理大於 99 的数字
$result = ''; $result = '';
$strNum = strval($num); $strNum = strval($num);
$length = strlen($strNum); $length = strlen($strNum);
@ -77,7 +77,7 @@ function numberToChinese($num) {
} }
} }
function removeTrailingBr($string) { function removeTrailingBr($string) {
//使用正則表達式刪除字串尾巴的<br><br /> //刪除字串尾巴的<br><br />
return preg_replace('/(<br\s*\/?>)+$/', '', $string); return preg_replace('/(<br\s*\/?>)+$/', '', $string);
} }
@ -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>

28
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;
@ -557,6 +557,28 @@ main table td, main table th {
height: 45px; height: 45px;
font-size: 15px; font-size: 15px;
} }
.contract-input-component .form table .alerttext {
font-size: 13px;
color: #a00;
font-weight: 500;
margin: 3px;
font-weight: 900;
padding: 0;
}
.contract-input-component .form input[type=file] {
padding: 12px 20px;
margin: 8px 0;
}
.contract-input-component .error {
display: flex;
flex-direction: column;
margin: 15px;
}
.contract-input-component .error .errortext {
font-size: 16px;
font-weight: 500;
color: #a00;
}
.contract-input-component .input-group-btn { .contract-input-component .input-group-btn {
font-size: 16px; font-size: 16px;
} }

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

File diff suppressed because one or more lines are too long

28
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%;
@ -578,12 +578,36 @@ main{
height: 45px; height: 45px;
font-size: 15px; font-size: 15px;
} }
table{
.alerttext{
font-size: 13px;
color:#a00;
font-weight: 500;
margin: 3px;
font-weight: 900;
padding: 0;
}
}
input[type="file"]{
padding: 12px 20px;
margin: 8px 0;
}
}
.error{
display: flex;
flex-direction: column;
margin:15px ;
.errortext{
font-size: 16px;
font-weight: 500;
color: #a00;
} }
}
.input-group-btn{ .input-group-btn{
font-size: 16px; font-size: 16px;
} }
@media screen and (max-width: 600px) { @media screen and (max-width: 600px) {
table { table {
border: 0; border: 0;
} }

514
wms/contract/twzip.json

@ -0,0 +1,514 @@
{
"cities": [
{
"name": "台北市",
"code": 100,
"region": [
{ "name": "中山區", "code": 104 },
{ "name": "大安區", "code": 106 },
{ "name": "信義區", "code": 110 },
{ "name": "內湖區", "code": 114 },
{ "name": "士林區", "code": 111 },
{ "name": "中正區", "code": 100 },
{ "name": "松山區", "code": 105 },
{ "name": "北投區", "code": 112 },
{ "name": "大同區", "code": 103 },
{ "name": "文山區", "code": 116 },
{ "name": "南港區", "code": 115 },
{ "name": "萬華區", "code": 108 }
]
},
{
"name": "新北市",
"code": 207,
"region": [
{ "name": "板橋區", "code": 220 },
{ "name": "新莊區", "code": 242 },
{ "name": "中和區", "code": 235 },
{ "name": "永和區", "code": 234 },
{ "name": "淡水區", "code": 251 },
{ "name": "三重區", "code": 241 },
{ "name": "汐止區", "code": 221 },
{ "name": "新店區", "code": 231 },
{ "name": "土城區", "code": 236 },
{ "name": "蘆洲區", "code": 247 },
{ "name": "三峽區", "code": 237 },
{ "name": "樹林區", "code": 238 },
{ "name": "鶯歌區", "code": 239 },
{ "name": "林口區", "code": 244 },
{ "name": "五股區", "code": 248 },
{ "name": "泰山區", "code": 243 },
{ "name": "八里區", "code": 249 },
{ "name": "三芝區", "code": 252 },
{ "name": "萬里區", "code": 207 },
{ "name": "金山區", "code": 208 },
{ "name": "石門區", "code": 253 },
{ "name": "深坑區", "code": 222 },
{ "name": "石碇區", "code": 223 },
{ "name": "瑞芳區", "code": 224 },
{ "name": "平溪區", "code": 226 },
{ "name": "雙溪區", "code": 227 },
{ "name": "貢寮區", "code": 228 },
{ "name": "坪林區", "code": 232 },
{ "name": "烏來區", "code": 233 }
]
},
{
"name": "桃園市",
"code": 320,
"region": [
{ "name": "中壢區", "code": 320 },
{ "name": "平鎮區", "code": 324 },
{ "name": "楊梅區", "code": 326 },
{ "name": "桃園區", "code": 330 },
{ "name": "龜山區", "code": 333 },
{ "name": "八德區", "code": 334 },
{ "name": "蘆竹區", "code": 338 },
{ "name": "大園區", "code": 337 },
{ "name": "龍潭區", "code": 325 },
{ "name": "新屋區", "code": 327 },
{ "name": "觀音區", "code": 328 },
{ "name": "大溪區", "code": 335 },
{ "name": "復興區", "code": 336 }
]
},
{
"name": "新竹市",
"code": 300,
"region": [
{ "name": "東區", "code": 30069 },
{ "name": "北區", "code": 30042 },
{ "name": "香山區", "code": 30093 }
]
},
{
"name": "新竹縣",
"code": 302,
"region": [
{ "name": "竹北市", "code": 302 },
{ "name": "湖口鄉", "code": 303 },
{ "name": "新豐鄉", "code": 304 },
{ "name": "新埔鎮", "code": 305 },
{ "name": "關西鎮", "code": 306 },
{ "name": "芎林鄉", "code": 307 },
{ "name": "寶山鄉", "code": 308 },
{ "name": "竹東鎮", "code": 310 },
{ "name": "五峰鄉", "code": 311 },
{ "name": "橫山鄉", "code": 312 },
{ "name": "尖石鄉", "code": 313 },
{ "name": "北埔鄉", "code": 314 },
{ "name": "峨嵋鄉", "code": 315 }
]
},
{
"name": "基隆市",
"code": 200,
"region": [
{ "name": "仁愛區", "code": 200 },
{ "name": "信義區", "code": 201 },
{ "name": "中正區", "code": 202 },
{ "name": "中山區", "code": 203 },
{ "name": "安樂區", "code": 204 },
{ "name": "暖暖區", "code": 205 },
{ "name": "七堵區", "code": 206 }
]
},
{
"name": "宜蘭縣",
"code": 260,
"region": [
{ "name": "宜蘭市", "code": 260 },
{ "name": "頭城鎮", "code": 261 },
{ "name": "礁溪鄉", "code": 262 },
{ "name": "壯圍鄉", "code": 263 },
{ "name": "員山鄉", "code": 264 },
{ "name": "羅東鎮", "code": 265 },
{ "name": "三星鄉", "code": 266 },
{ "name": "大同鄉", "code": 267 },
{ "name": "五結鄉", "code": 268 },
{ "name": "冬山鄉", "code": 269 },
{ "name": "蘇澳鎮", "code": 270 },
{ "name": "南澳鄉", "code": 272 }
]
},
{
"name": "台中市",
"code": 400,
"region": [
{ "name": "西屯區", "code": 407 },
{ "name": "北區", "code": 404 },
{ "name": "北屯區", "code": 406 },
{ "name": "西區", "code": 403 },
{ "name": "南區", "code": 402 },
{ "name": "南屯區", "code": 408 },
{ "name": "大里區", "code": 412 },
{ "name": "中區", "code": 400 },
{ "name": "東區", "code": 401 },
{ "name": "太平區", "code": 411 },
{ "name": "沙鹿區", "code": 433 },
{ "name": "龍井區", "code": 434 },
{ "name": "豐原區", "code": 420 },
{ "name": "潭子區", "code": 427 },
{ "name": "大雅區", "code": 428 },
{ "name": "霧峰區", "code": 413 },
{ "name": "烏日區", "code": 414 },
{ "name": "后里區", "code": 421 },
{ "name": "石岡區", "code": 422 },
{ "name": "東勢區", "code": 423 },
{ "name": "和平區", "code": 424 },
{ "name": "新社區", "code": 426 },
{ "name": "神岡區", "code": 429 },
{ "name": "大肚區", "code": 432 },
{ "name": "梧棲區", "code": 435 },
{ "name": "清水區", "code": 436 },
{ "name": "大甲區", "code": 437 },
{ "name": "外埔區", "code": 438 },
{ "name": "大安區", "code": 439 }
]
},
{
"name": "彰化縣",
"code": 500,
"region": [
{ "name": "彰化市", "code": 500 },
{ "name": "員林鎮", "code": 510 },
{ "name": "鹿港鎮", "code": 505 },
{ "name": "和美鎮", "code": 508 },
{ "name": "大村鄉", "code": 515 },
{ "name": "北斗鎮", "code": 521 },
{ "name": "溪湖鎮", "code": 514 },
{ "name": "芬園鄉", "code": 502 },
{ "name": "花壇鄉", "code": 503 },
{ "name": "秀水鄉", "code": 504 },
{ "name": "福興鄉", "code": 506 },
{ "name": "線西鄉", "code": 507 },
{ "name": "伸港鄉", "code": 509 },
{ "name": "社頭鄉", "code": 511 },
{ "name": "永靖鄉", "code": 512 },
{ "name": "埔心鄉", "code": 513 },
{ "name": "埔鹽鄉", "code": 516 },
{ "name": "田中鎮", "code": 520 },
{ "name": "田尾鄉", "code": 522 },
{ "name": "埤頭鄉", "code": 523 },
{ "name": "溪州鄉", "code": 524 },
{ "name": "竹塘鄉", "code": 525 },
{ "name": "二林鎮", "code": 526 },
{ "name": "大城鄉", "code": 527 },
{ "name": "芳苑鄉", "code": 528 },
{ "name": "二水鄉", "code": 530 }
]
},
{
"name": "雲林縣",
"code": 630,
"region": [
{ "name": "斗南鎮", "code": 630 },
{ "name": "大埤鄉", "code": 631 },
{ "name": "虎尾鎮", "code": 632 },
{ "name": "土庫鎮", "code": 633 },
{ "name": "褒忠鄉", "code": 634 },
{ "name": "東勢鄉", "code": 635 },
{ "name": "臺西鄉", "code": 636 },
{ "name": "崙背鄉", "code": 637 },
{ "name": "麥寮鄉", "code": 638 },
{ "name": "斗六市", "code": 640 },
{ "name": "林內鄉", "code": 643 },
{ "name": "古坑鄉", "code": 646 },
{ "name": "莿桐鄉", "code": 647 },
{ "name": "西螺鎮", "code": 648 },
{ "name": "二崙鄉", "code": 649 },
{ "name": "北港鎮", "code": 651 },
{ "name": "水林鄉", "code": 652 },
{ "name": "口湖鄉", "code": 653 },
{ "name": "四湖鄉", "code": 654 },
{ "name": "元長鄉", "code": 655 }
]
},
{
"name": "苗栗縣",
"code": 350,
"region": [
{ "name": "竹南鎮", "code": 350 },
{ "name": "頭份鎮", "code": 351 },
{ "name": "三灣鄉", "code": 352 },
{ "name": "南莊鄉", "code": 353 },
{ "name": "獅潭鄉", "code": 354 },
{ "name": "後龍鎮", "code": 356 },
{ "name": "通霄鎮", "code": 357 },
{ "name": "苑裡鎮", "code": 358 },
{ "name": "苗栗市", "code": 360 },
{ "name": "造橋鄉", "code": 361 },
{ "name": "頭屋鄉", "code": 362 },
{ "name": "公館鄉", "code": 363 },
{ "name": "大湖鄉", "code": 364 },
{ "name": "泰安鄉", "code": 365 },
{ "name": "銅鑼鄉", "code": 366 },
{ "name": "三義鄉", "code": 367 },
{ "name": "西湖鄉", "code": 368 },
{ "name": "卓蘭鎮", "code": 369 }
]
},
{
"name": "南投縣",
"code": 540,
"region": [
{ "name": "南投市", "code": 540 },
{ "name": "中寮鄉", "code": 541 },
{ "name": "草屯鎮", "code": 542 },
{ "name": "國姓鄉", "code": 544 },
{ "name": "埔里鎮", "code": 545 },
{ "name": "仁愛鄉", "code": 546 },
{ "name": "名間鄉", "code": 551 },
{ "name": "集集鎮", "code": 552 },
{ "name": "水里鄉", "code": 553 },
{ "name": "魚池鄉", "code": 555 },
{ "name": "信義鄉", "code": 556 },
{ "name": "竹山鎮", "code": 557 },
{ "name": "鹿谷鄉", "code": 558 }
]
},
{
"name": "台南市",
"code": 700,
"region": [
{ "name": "東區", "code": 701 },
{ "name": "北區", "code": 704 },
{ "name": "永康區", "code": 710 },
{ "name": "中西區", "code": 700 },
{ "name": "善化區", "code": 741 },
{ "name": "新市區", "code": 744 },
{ "name": "安平區", "code": 708 },
{ "name": "南區", "code": 702 },
{ "name": "安南區", "code": 709 },
{ "name": "仁德區", "code": 717 },
{ "name": "新營區", "code": 730 },
{ "name": "安定區", "code": 745 },
{ "name": "麻豆區", "code": 721 },
{ "name": "佳里區", "code": 722 },
{ "name": "歸仁區", "code": 711 },
{ "name": "新化區", "code": 712 },
{ "name": "左鎮區", "code": 713 },
{ "name": "玉井區", "code": 714 },
{ "name": "楠西區", "code": 715 },
{ "name": "南化區", "code": 716 },
{ "name": "關廟區", "code": 718 },
{ "name": "龍崎區", "code": 719 },
{ "name": "官田區", "code": 720 },
{ "name": "西港區", "code": 723 },
{ "name": "七股區", "code": 724 },
{ "name": "將軍區", "code": 725 },
{ "name": "學甲區", "code": 726 },
{ "name": "北門區", "code": 727 },
{ "name": "後壁區", "code": 731 },
{ "name": "白河區", "code": 732 },
{ "name": "東山區", "code": 733 },
{ "name": "六甲區", "code": 734 },
{ "name": "下營區", "code": 735 },
{ "name": "柳營區", "code": 736 },
{ "name": "鹽水區", "code": 737 },
{ "name": "大內區", "code": 742 },
{ "name": "山上區", "code": 743 }
]
},
{
"name": "高雄市",
"code": 800,
"region": [
{ "name": "三民區", "code": 807 },
{ "name": "左營區", "code": 813 },
{ "name": "苓雅區", "code": 802 },
{ "name": "鼓山區", "code": 804 },
{ "name": "楠梓區", "code": 811 },
{ "name": "前鎮區", "code": 806 },
{ "name": "鳳山區", "code": 830 },
{ "name": "新興區", "code": 800 },
{ "name": "前金區", "code": 801 },
{ "name": "小港區", "code": 812 },
{ "name": "大寮區", "code": 831 },
{ "name": "岡山區", "code": 820 },
{ "name": "鹽埕區", "code": 803 },
{ "name": "仁武區", "code": 814 },
{ "name": "大社區", "code": 815 },
{ "name": "旗津區", "code": 805 },
{ "name": "路竹區", "code": 821 },
{ "name": "阿蓮區", "code": 822 },
{ "name": "田寮區", "code": 823 },
{ "name": "燕巢區", "code": 824 },
{ "name": "橋頭區", "code": 825 },
{ "name": "梓官區", "code": 826 },
{ "name": "彌陀區", "code": 827 },
{ "name": "永安區", "code": 828 },
{ "name": "湖內區", "code": 829 },
{ "name": "林園區", "code": 832 },
{ "name": "鳥松區", "code": 833 },
{ "name": "大樹區", "code": 840 },
{ "name": "旗山區", "code": 842 },
{ "name": "美濃區", "code": 843 },
{ "name": "六龜區", "code": 844 },
{ "name": "內門區", "code": 845 },
{ "name": "杉林區", "code": 846 },
{ "name": "甲仙區", "code": 847 },
{ "name": "桃源區", "code": 848 },
{ "name": "那瑪夏區", "code": 849 },
{ "name": "茂林區", "code": 851 },
{ "name": "茄萣區", "code": 852 }
]
},
{
"name": "嘉義市",
"code": 600,
"region": [
{ "name": "東區", "code": 60070 },
{ "name": "西區", "code": 60085 }
]
},
{
"name": "嘉義縣",
"code": 602,
"region": [
{ "name": "番路鄉", "code": 602 },
{ "name": "梅山鄉", "code": 603 },
{ "name": "竹崎鄉", "code": 604 },
{ "name": "阿里山", "code": 605 },
{ "name": "中埔鄉", "code": 606 },
{ "name": "大埔鄉", "code": 607 },
{ "name": "水上鄉", "code": 608 },
{ "name": "鹿草鄉", "code": 611 },
{ "name": "太保市", "code": 612 },
{ "name": "朴子市", "code": 613 },
{ "name": "東石鄉", "code": 614 },
{ "name": "六腳鄉", "code": 615 },
{ "name": "新港鄉", "code": 616 },
{ "name": "民雄鄉", "code": 621 },
{ "name": "大林鎮", "code": 622 },
{ "name": "溪口鄉", "code": 623 },
{ "name": "義竹鄉", "code": 624 },
{ "name": "布袋鎮", "code": 625 }
]
},
{
"name": "屏東縣",
"code": 900,
"region": [
{ "name": "屏東市", "code": 900 },
{ "name": "三地門", "code": 901 },
{ "name": "霧臺鄉", "code": 902 },
{ "name": "瑪家鄉", "code": 903 },
{ "name": "九如鄉", "code": 904 },
{ "name": "里港鄉", "code": 905 },
{ "name": "高樹鄉", "code": 906 },
{ "name": "鹽埔鄉", "code": 907 },
{ "name": "長治鄉", "code": 908 },
{ "name": "麟洛鄉", "code": 909 },
{ "name": "竹田鄉", "code": 911 },
{ "name": "內埔鄉", "code": 912 },
{ "name": "萬丹鄉", "code": 913 },
{ "name": "潮州鎮", "code": 920 },
{ "name": "泰武鄉", "code": 921 },
{ "name": "來義鄉", "code": 922 },
{ "name": "萬巒鄉", "code": 923 },
{ "name": "崁頂鄉", "code": 924 },
{ "name": "新埤鄉", "code": 925 },
{ "name": "南州鄉", "code": 926 },
{ "name": "林邊鄉", "code": 927 },
{ "name": "東港鎮", "code": 928 },
{ "name": "琉球鄉", "code": 929 },
{ "name": "佳冬鄉", "code": 931 },
{ "name": "新園鄉", "code": 932 },
{ "name": "枋寮鄉", "code": 940 },
{ "name": "枋山鄉", "code": 941 },
{ "name": "春日鄉", "code": 942 },
{ "name": "獅子鄉", "code": 943 },
{ "name": "車城鄉", "code": 944 },
{ "name": "牡丹鄉", "code": 945 },
{ "name": "恆春鎮", "code": 946 },
{ "name": "滿州鄉", "code": 947 }
]
},
{
"name": "台東縣",
"code": 950,
"region": [
{ "name": "臺東市", "code": 950 },
{ "name": "綠島鄉", "code": 951 },
{ "name": "蘭嶼鄉", "code": 952 },
{ "name": "延平鄉", "code": 953 },
{ "name": "卑南鄉", "code": 954 },
{ "name": "鹿野鄉", "code": 955 },
{ "name": "關山鎮", "code": 956 },
{ "name": "海端鄉", "code": 957 },
{ "name": "池上鄉", "code": 958 },
{ "name": "東河鄉", "code": 959 },
{ "name": "成功鎮", "code": 961 },
{ "name": "長濱鄉", "code": 962 },
{ "name": "太麻里鄉", "code": 963 },
{ "name": "金峰鄉", "code": 964 },
{ "name": "大武鄉", "code": 965 },
{ "name": "達仁鄉", "code": 966 }
]
},
{
"name": "花蓮縣",
"code": 970,
"region": [
{ "name": "花蓮市", "code": 970 },
{ "name": "新城鄉", "code": 971 },
{ "name": "秀林鄉", "code": 972 },
{ "name": "吉安鄉", "code": 973 },
{ "name": "壽豐鄉", "code": 974 },
{ "name": "鳳林鎮", "code": 975 },
{ "name": "光復鄉", "code": 976 },
{ "name": "豐濱鄉", "code": 977 },
{ "name": "瑞穗鄉", "code": 978 },
{ "name": "萬榮鄉", "code": 979 },
{ "name": "玉里鎮", "code": 981 },
{ "name": "卓溪鄉", "code": 982 },
{ "name": "富里鄉", "code": 983 }
]
},
{
"name": "澎湖縣",
"code": 880,
"region": [
{ "name": "馬公市", "code": 880 },
{ "name": "西嶼鄉", "code": 881 },
{ "name": "望安鄉", "code": 882 },
{ "name": "七美鄉", "code": 883 },
{ "name": "白沙鄉", "code": 884 },
{ "name": "湖西鄉", "code": 885 }
]
},
{
"name": "金門縣",
"code": 890,
"region": [
{ "name": "金沙鎮", "code": 890 },
{ "name": "金湖鎮", "code": 891 },
{ "name": "金寧鄉", "code": 892 },
{ "name": "金城鎮", "code": 893 },
{ "name": "烈嶼鄉", "code": 894 },
{ "name": "烏坵鄉", "code": 896 }
]
},
{
"name": "連江縣",
"code": 209,
"region": [
{ "name": "南竿鄉", "code": 209 },
{ "name": "北竿鄉", "code": 210 },
{ "name": "莒光鄉", "code": 211 },
{ "name": "東引鄉", "code": 212 }
]
}
]
}

33
wms/database.php

@ -0,0 +1,33 @@
<?php
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");
}
}
}
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);
if($link){
mysqli_query($link,'SET NAMES utf8');
// echo "正確連接資料庫";
}
else {
echo "不正確連接資料庫</br>" . mysqli_connect_error();
}
?>

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