วิธีการเชื่อมโยงข้อมูลประกาศจัดซื้อจัดจ้างจากระบบ e-GP มาจัดเก็บในฐานข้อมูลเว็บไซต์ของหน่วยงาน (แก้ไขล่าสุด 31 มี.ค. 65)

วิธีการเชื่อมโยงข้อมูลประกาศจัดซื้อจัดจ้างจากระบบ e-GP หรือ eGP มาจัดเก็บในฐานข้อมูลเว็บไซต์ของหน่วยงาน

ทำความเข้าใจก่อน 2 ข้อ หลักๆ คือ

  1. ทำไมต้องดึงข้อมูลมาเก็บในฐานข้อมูลเว็บไซต์ของหน่วยงาน ?
    เพราะตามคู่มือการเชื่อมโยงของกรมบัญชีกลางบอกว่า สามารถเรียกข้อมูลย้อนหลังได้แค่ 20 รายการ (ซึ่งในวันที่เรียกข้อมูลจะต้องมีการบันทึกข้อมูลด้วย) จึงจำเป็นที่แต่ละหน่วยงานจะต้องทำการจัดเก็บข้อมูลไว้เองเพื่อดูข้อมูลย้อนหลังเองครับ
  2. เมื่อพัฒนาเว็บไซต์จนสามารถเชื่อมโยงข้อมูลจากกรมบัญชีกลางมายังเว็บไซต์หน่วยงานได้สำเร็จแล้ว จบงานเลยหรือไม่?
    ไม่จบครับ จะต้องมีคนที่ทำการรีเฟรสเว็บไซต์หรือรีเฟรสโปรแกรมเชื่อมโยงข้อมูลอย่างน้อย 1 ครั้ง ในวันที่มีการบันทึกข้อมูลในระบบของกรมบัญชีกลาง เพื่อจะได้ดึงข้อมูลในวันนั้นๆมาลงในฐานข้อมูลเว็บไซต์ของเรา (เวลาที่เปิดให้เชื่อมโยงคือ 12.01-12.59 และ 17.01-08.59 น. สะดวกสุดก็ 17.01 น. ครับ ชัวร์)

ถ้าเข้าใจแล้วเริ่มกันเลยครับ ตอนนี้ขอแบ่งเว็บไซต์เป็น 3 อย่าง คือ เว็บทั่วไป, WordPress และ Joomla เลือกใช้ตามแบบของหน่วยงานตัวเองครับ หลักๆก็คือ สร้างฐานข้อมูลและเขียนโค้ดเชื่อมข้อมูลครับ (***เนื่องจากแสดงบนเว็บไซต์ โค้ดอาจไม่ย่อหน้าเข้าไปตามที่ควรจะเป็น ขออภัยด้วยนะครับ) ซึ่งในที่นี้เป็นวิธีการตามแนวของผม บางท่านอาจทำไม่เหมือนกันก็ได้ครับ

**** เวลาก้อปโค้ดไป ตัว ‘ หรือตัว ” อาจไม่ถูกอักขระมัน ต้องแก้ไขด้วยการ replace ให้เป็น ‘ หรือ ” ในเครื่องของเราอีกครั้งนะครับ

1. เว็บทั่วไป เขียนด้วย html, DreamWeaver หรืออื่น ๆ ที่ใช้ PHP ได้ มี 2 ขั้นตอนครับ คือ

1.1 ต้องสร้างฐานข้อมูลขึ้นมา ง่ายๆก็ 2 ตารางครับ ตามนี้

CREATE TABLE `tbl_category` (
`cat_id` int(4) NOT NULL,
`cat_alias` varchar(50) NOT NULL,
`cat_name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `tbl_category` (`cat_id`, `cat_alias`, `cat_name`) VALUES
(1, 'P0', 'แผนการจัดซื้อจัดจ้าง'),
(2, '15', 'ประกาศราคากลาง'),
(3, 'B0', 'ร่างเอกสารประกวดราคา ( e-Bidding) และร่างเอกสารซื้อหรือจ้างด้วยวิธีสอบราคา'),
(4, 'D0', 'ประกาศเชิญชวน'),
(5, 'W0', 'ประกาศรายชื่อผู้ชนะการเสนอราคา / ประกาศผู้ได้รับการคัดเลือก'),
(6, 'D1', 'ยกเลิกประกาศเชิญชวน'),
(7, 'W1', 'ยกเลิกประกาศรายชื่อผู้ชนะการเสนอราคา/ประกาศผู้ได้รับการคัดเลือก'),
(8, 'D2', 'เปลี่ยนแปลงประกาศเชิญชวน'),
(9, 'W2', 'เปลี่ยนแปลงประกาศรายชื่อผู้ชนะการเสนอราคา');

CREATE TABLE `tbl_egp` (
`id` int(11) NOT NULL,
`egp_title` text NOT NULL,
`egp_detail` text NOT NULL,
`cat_id` int(4) NOT NULL,
`create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `tbl_category`
ADD PRIMARY KEY (`cat_id`);

ALTER TABLE `tbl_egp`
ADD PRIMARY KEY (`id`);

ALTER TABLE `tbl_category`
MODIFY `cat_id` int(4) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10;

ALTER TABLE `tbl_egp`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

2.2 เขียนโค้ด php ไว้ที่หน้าเว็บแสดงข้อมูล ดังนี้ครับ (อย่าลืมเปลี่ยนค่าตัวแปรที่ไฮไลท์ให้ตรงกับรหัสหน่วยงานของตนเองนะครับ)

<?php
$serverName = "localhost";
$userName = "username";
$userPassword = "password";
$dbName = "dbname";

$conn = mysqli_connect($serverName, $userName, $userPassword, $dbName);
// Check connection
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$depid = "4520101";
$aType = array('P0', '15', 'B0', 'D0', 'W0', 'D1', 'W1', 'D2', 'W2');
$aCat = array(1, 2, 3, 4, 5, 6, 7, 8, 9); //รหัสหมวดหมู่ สำหรับแยกประเภทประกาศ anounceType

date_default_timezone_set('Asia/Bangkok');

$begintime1 = strtotime("12:01:01");
$endtime1 = strtotime("12:59:00");

$begintime2 = strtotime("17:01:01");
$endtime2 = strtotime("24:00:00");

$begintime3 = strtotime("00:00:01");
$endtime3 = strtotime("08:59:59");

$now = time();

if (($now >= $begintime1 && $now <= $endtime1) || ($now >= $begintime2 && $now <= $endtime2) || ($now >= $begintime3 && $now <= $endtime3)) {
$i = 0;
foreach ($aType as $newsType) { //ประเภทประกาศ
//$url = "http://www.tungpheung.go.th/newsfeed.xml"; //ไฟล์ xml สำหรับใช้ทดสอบ
$url = "http://process3.gprocurement.go.th/EPROCRssFeedWeb/egpannouncerss.xml?deptId=" . $depid . "&anounceType=" . $newsType;
libxml_use_internal_errors(true);
$doc = simplexml_load_string(file_get_contents($url));
if ($doc === false) {
libxml_clear_errors();
libxml_use_internal_errors($doc);
} else {
$items = $doc->xpath("/rss/channel/item");
foreach ($items as $item) {
//ตรวจสอบข่าวที่มีอยู่แล้ว
$sql = "SELECT * FROM tbl_egp WHERE TRIM(egp_detail)=TRIM('".$item->link."') AND cat_id=".$aCat[$i];
$result = $conn->query($sql);
$numrows = $result->num_rows; //ขอโทษด้วยครับ โค้ดเดิม $conn->num_rows มันผิดครับ
if(!$numrows) { //ถ้าไม่ซ้ำ (มี Feed ข่าวใหม่)
$sql = "INSERT INTO tbl_egp (egp_title, egp_detail, cat_id) VALUES ('".trim($item->title)."' , '".trim($item->link)."', ".$aCat[$i].")";
$query = $conn->query($sql) ;
}
$i++;
} //for each ($item
} // else if ($doc
} //foreach ($aType
} // if (in time

$sql = "SELECT a.*, b.cat_name FROM tbl_egp a, tbl_category b WHERE a.cat_id=b.cat_id ORDER BY id DESC";
$result =$conn->query($sql);
if($result->num_rows) { //ถ้ามี Feed ข่าวในฐานข้อมูล
echo "<ul>";
while($row=$result->fetch_array(MYSQLI_ASSOC)) {
echo "<li>(".$row["cat_name"].") ".$row["egp_title"]." -> <a href=\"".$row["egp_detail"]."\" targer=\"_blank\">คลิกอ่าน..</a></li>";
}
echo "</ul>";
} else {
echo "-- ยังไม่มีข้อมูล -- <br>โปรดค้นหาจากเว็บไซต์กรมบัญชีกลางโดยตรง -> <a href='http://www.gprocurement.go.th' target='_blank'>คลิก</a>";
}

?>

จบแล้วสำหรับ เว็บไซต์ทั่วๆไป แล้วถ้าเว็บไม่มีฐานข้อมูลทำอย่างไร แฮะๆอันนี้ขอบอกว่า ควรทำเป็นฐานข้อมูลอย่างยิ่งครับ ทำได้แล้วตกแต่งเอาเองนะครับ

2. เว็บไซต์ประเภทเวิร์ดเพรส (WordPress) อันนี้ก็ดูตัวอย่างของเว็บเทศบาลเรานะครับ วิธีของผมคือ เราต้องดึงข้อมูลจาก e-GP มาสร้างเป็น post (เรื่อง) เพื่อแสดงบนเว็บ มีวิธีการดังนี้ 

2.1  ที่หน้าเว็บ

  • สร้างหมวดหมู่หลัก e-GP จากนั้นสร้างหมวดหมู่รองเป็นประเภทของประกาศในระบบ e-GP (anounceType ดูในคู่มือเชื่อมโยงของ e-GP ครับ จะมี P0, 15, B0, D0, W0, D1, W1, D2, W2) * จดรหัสหมวดหมู่รองแต่ละอันไว้ด้วยนะครับ
  • สร้างบล็อกหรือวิดเจ็ตในหน้าเว็บ สำหรับแสดงข้อมูลในหมวดหมู่ e-GP
    * เสร็จขั้นตอนหน้าเว็บ จะยังไม่มีข้อมูลอะไรแสดงผล ไม่ต้องตกใจครับ เพราะเราจะต้องไปโค้ดดิ้งกันต่อ

2.2 แก้ไขโค้ดครับ ต้องเปิดไฟล์ index.php ของ WordPress (ไฟล์หลักอันเดียวนะครับ) เพื่อแก้ไขโค้ด โดยก็อปปี้โค้ดข้างล่างนี้ไปไว้บรรทัดบนสุดของไฟล์ index.php (แต่ต้องอยู่ในแท็ก <?php นะครับ) โดยมีตัวแปรที่ต้องแก้ไขคือ $depid คือรหัสหน่วยงาน กับตัวแปร $aCat ให้เปลี่ยนรหัสหมวดหมู่ตามที่เราจดไว้ในข้อ 2.1 ครับ
* เสร็จขั้นตอนนี้ เราก็จะดึงข้อมูลจาก e-GP ได้แล้ว โดยมันจะเช็คเวลาที่เปิดหน้าเว็บเองว่าอยู่ในช่วงเวลาที่กำหนดหรือไม่ คือ 12.01 – 12.59 กับ 17.01 – 08.59 ถ้าใช่มันจะดึงข้อมูลมาสร้างเป็น post ให้ครับ

<?php
// Load WordPress
require_once 'wp-load.php';
require_once ABSPATH . 'wp-admin/includes/taxonomy.php';

date_default_timezone_set('Asia/Bangkok');

$begintime1 = strtotime("12:01:01");
$endtime1 = strtotime("12:59:00");

$begintime2 = strtotime("17:01:01");
$endtime2 = strtotime("24:00:00");

$begintime3 = strtotime("00:00:01");
$endtime3 = strtotime("08:59:59");

$now = time();

$cnt_new_row = 0;

//echo "/".$now."/".$begintime1."/".$endtime1."/".$begintime2."/".$now."/".$endtime2."/<br>";

if (($now >= $begintime1 && $now <= $endtime1) || ($now >= $begintime2 && $now <= $endtime2) || ($now >= $begintime3 && $now <= $endtime3)) {
//echo "Yes, this time for e-GP";

global $wpdb;
$aType = array('P0', '15', 'B0', 'D0', 'W0', 'D1', 'W1', 'D2', 'W2');
$aCat = array(118, 119, 120, 121, 122, 123, 124, 125, 126); //รหัสหมวดหมู่ใน WordPress สำหรับแยกประเภทประกาศ anounceType
$i = 0;

foreach ($aType as $newsType) { //ประเภทประกาศ
//$url = "http://www.tungpheung.go.th/newsfeed.xml"; //ไฟล์ xml สำหรับใช้ทดสอบ
//เทศบาลเมืองเขลางค์นคร=4520101
$depid = '4520101';
$url = 'http://process3.gprocurement.go.th/EPROCRssFeedWeb/egpannouncerss.xml?deptId=' . $depid . '&anounceType=' . $newsType;

libxml_use_internal_errors(true);

$doc = simplexml_load_string(file_get_contents($url));

if ($doc === false) {
libxml_clear_errors();
libxml_use_internal_errors($doc);
} else {

$items = $doc->xpath('/rss/channel/item');
foreach ($items as $item) {
$itemtitle = wp_strip_all_tags($item->title);
$wpdb->show_errors(true);
$sql = $wpdb->prepare("SELECT $wpdb->posts.ID FROM $wpdb->posts LEFT JOIN $wpdb->term_relationships ON $wpdb->posts.ID = $wpdb->term_relationships.object_id WHERE $wpdb->term_relationships.term_taxonomy_id=" . $aCat[$i] . " AND post_status='publish' AND post_title LIKE '%s'", $itemtitle);
//echo $sql;

$result = $wpdb->get_results($sql);

if (!$result) {
$itemcontent = "<a href=\"" . TRIM($item->link) . "\" targer=\"_blank\">".$itemtitle." คลิกอ่านที่นี่</a>";

$id = wp_insert_post(array(
'post_title' => $itemtitle,
'post_content' => $itemcontent,
'post_date' => date('Y-m-d H:i:s'),
'post_author' => 1,
'post_type' => 'post',
'post_status' => 'publish',
));
if ($id) {
$cnt_new_row += 1;
$cat = array($aCat[$i]);
$setcat = wp_set_post_categories($id, $cat);
} else {
echo "WARNING: Failed to insert post into WordPress\n";
}
}
}
$i++;
}
}

} else {
//echo "Not time to e-GP";
}

?>

3. เว็บไซต์ประเภทจูมลา (Joomla)  ตามนี้นะครับ 

อันนี้ต้องออกตัวก่อนว่าไม่เคยจับ Joomla เลยครับ เคยแต่ Nuke ที่เป็น ASP กับ PHP กับ WordPress แต่ก็คงพอจะใช้งานได้ครับ วิธีการก็เหมือนกับ WordPress แต่โค้ดแตกต่างกันนิดหน่อย

3.1  ที่หน้าเว็บ

  • สร้างหมวดหมู่หลัก e-GP จากนั้นสร้างหมวดหมู่รองเป็นประเภทของประกาศในระบบ e-GP (anounceType ดูในคู่มือเชื่อมโยงของ e-GP ครับ จะมี P0, 15, B0, D0, W0, D1, W1, D2, W2) * จดรหัสหมวดหมู่รองแต่ละอันไว้ด้วยนะครับ
  • สร้างเมนู (หรือบล็อก-ไม่ทราบว่าเรียกอะไรครับ) สำหรับแสดงข้อมูล Article (Content) ในหมวดหมู่ e-GP
    * เสร็จขั้นตอนหน้าเว็บ จะยังไม่มีข้อมูลอะไรแสดงผล ไม่ต้องตกใจครับ เพราะเราจะต้องไปโค้ดดิ้งกันต่อ

3.2 แก้ไขโค้ดครับ ต้องเปิดไฟล์ index.php ของ Joomla (ไฟล์หลักอันเดียวนะครับ) เพื่อแก้ไขโค้ด โดยก็อปปี้โค้ดข้างล่างนี้ไปไว้ตรงก่อนบรรทัดรันแอพ (echo $app; หรือ $app->execute(); จะอยู่บรรทัดสุดท้ายครับ) โดยมีตัวแปรที่ต้องแก้ไขคือ $depid คือรหัสหน่วยงาน กับตัวแปร $aCat ให้เปลี่ยนรหัสหมวดหมู่ตามที่เราจดไว้ในข้อ 3.1 ครับ
* เสร็จขั้นตอนนี้ เราก็จะดึงข้อมูลจาก e-GP ได้แล้ว โดยมันจะเช็คเวลาที่เปิดหน้าเว็บเองว่าอยู่ในช่วงเวลาที่กำหนดหรือไม่ คือ 12.01 – 12.59 กับ 17.01 – 08.59 ถ้าใช่มันจะดึงข้อมูลมาสร้างเป็น Article (Content) ให้ครับ (อย่าลืมแก้บรรทัดที่ผมไฮไลท์ให้ตรงกับของท่านด้วยนะครับ)

//***** ส่วนที่เพิ่มเข้ามา ******* //
$depid = "5520101";
$aType = array('P0', '15', 'B0', 'D0', 'W0', 'D1', 'W1', 'D2', 'W2');
$aCat = array(30, 31, 32, 33, 34, 35, 36, 37, 38); //รหัสหมวดหมู่ สำหรับแยกประเภทประกาศ anounceType

date_default_timezone_set('Asia/Bangkok');

$begintime1 = strtotime("12:01:01");
$endtime1 = strtotime("12:59:00");

$begintime2 = strtotime("17:01:01");
$endtime2 = strtotime("24:00:00");

$begintime3 = strtotime("00:00:01");
$endtime3 = strtotime("08:59:59");

$now = time();

if (($now >= $begintime1 && $now <= $endtime1) || ($now >= $begintime2 && $now <= $endtime2) || ($now >= $begintime3 && $now <= $endtime3)) {
    $i = 0; 
    foreach ($aType as $newsType) { 
        //ประเภทประกาศ 
        $url = "http://process3.gprocurement.go.th/EPROCRssFeedWeb/egpannouncerss.xml?deptId=" . $depid . "&anounceType=" . $newsType; 
        libxml_use_internal_errors(true); 
        $doc = simplexml_load_string(file_get_contents($url)); 
        if ($doc === false) { 
            libxml_clear_errors(); 
            libxml_use_internal_errors($doc); 
        } else { 
            $items = $doc->xpath("/rss/channel/item");
            foreach ($items as $item) {
                $db = & JFactory::getDBO();
                $sql = "SELECT * FROM #__content WHERE `introtext` LIKE '%" . TRIM($item->link) . "%' AND catid = " . $aCat[$i];                
                $db->setQuery($sql);
                $db->query();
                if (!$db->getNumRows()) {
                    $item_title = $item->title;
                    $item_alias = preg_replace("/\s+/", "_", $item_title);
                    $item_content = "<a href=\"" . TRIM($item->link) . "\" targer=\"_blank\">".$item_title."</a>";

                    $article['title'] = $item_title;
                    $article['alias'] = $item_alias;
                    $article['introtext'] = $item_content;
                    $article['catid'] = $aCat[$i];
                    $article['created'] = JFactory::getDate()->format('Y-m-d-H-i-s');
		    $article['created_by'] = 542; /*** 542 หมายถึง ID ของ User ครับ ***/
                    $article['created_by_alias'] = 'Super User';
                    $article['state'] = 1;
                    $article['access'] = 1;
                    $article['metadata'] = '{"page_title":"","author":"","robots":""}';
                    $article['language'] = '*';

                    if (version_compare(JVERSION, '3.0', 'lt')) {
                        JTable::addIncludePath(JPATH_PLATFORM . 'joomla/database/table');
                    }
                    $table = JTable::getInstance('Content', 'JTable', array());

                    $table->bind($article);
                    $table->check();
                    $store = $table->store();

                    if ($store == true) {
                        $db = & JFactory::getDBO();
                        $sql = "UPDATE #__content SET `title`='" . $item_title . "' WHERE id = " . $table->id;
                        $db->setQuery($sql);
                        $db->query();
                    }
                }
            }
            $i++;
        }
    }
} else {
    
}

//********************************//

ตัวอย่างเว็บ Joomla ที่ดึงข้อมูล https://www.pichaicity.go.th/old_web/  

หมายเหตุ วิธีการของ WordPress กับ Joomla ถ้าไม่ต้องการให้เว็บทำงานหนักเกิน (เนื่องจากทุกครั้งที่เปิดเว็บมันจะต้องเช็คเวลาว่าอยู่ในเงื่อนไขหรือเปล่า หากอยู่ในเงื่อนไขก็จะทำงานโดยดึงข้อมูลจาก e-GP มาเปรียบเทียบกับฐานข้อมูล ซึ่งมันก็ทำให้เว็บเราจะทำงานเพิ่มขึ้นนั่นเอง) วิธีการแก้อีกวิธี คือสร้างไฟล์ใหม่เลยครับ [filename].php แล้วก็ใส่โค้ดเฉพาะที่ให้แก้ลงไป ปรับแต่งนิดหน่อยก็ใช้งานได้ แล้วที่สำคัญต้องรันไฟล์นี้ทุกวันเพื่อดึงข้อมูลจากระบบ e-GP ด้วยนะครับ


สุดท้าย หากทำเสร็จแล้ว ยังไงก็ต้องพึ่งคนในการรีเฟรสหน้าจอเว็บไซต์เพื่อดึงข้อมูลทุกวันนะครับ อย่าลืม!!!!! แต่ของเทศบาลเราใช้อุปกรณ์ IoT แทนคนครับ ประหยัดคน ประหยัดไฟฟ้าที่ใช้กับคอมพิวเตอร์ โดยใช้บอร์ด Arduino ต่อกับโมดูลแลน เอาลงกล่องปลั๊กไฟเพื่อให้สวยหน่อย เสียบไฟโดยผ่านอะแดปเตอร์ 7.5 โวลต์ แล้วก็เสียบสายแลน (จะใช้บอร์ด ESP8266 เป็น WiFi ก็สะดวกดีแต่กลัวไม่เสถียร) เปิดทิ้งไว้ 24 ชั่วโมง ให้มันทำงานแทนคนครับ อุปกรณ์ชิ้นลงทุนไม่เกิน 1,000 บาท

(อุปกรณ์ IoT ตัวนี้ ได้แนวทางมาจากที่เข้าร่วมฝึกหลักสูตร IoT จัดโดยมหาวิทยาลัยราชภัฏลำปาง จัดฝึกอบรมให้ฟรีๆครับ)

คู่มือจากเว็บไซต์กรมบัญชีกลาง

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • เปิดใช้งานตลอด

บันทึกการตั้งค่า