ocean_booking.class.php 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  1. <?php
  2. if (!defined('IN_ONLINE')) {
  3. exit('Access Denied');
  4. }
  5. /**
  6. * Description of ocean
  7. *
  8. * @author Administrator
  9. */
  10. class ocean_booking {
  11. private static $_ocean;
  12. function __construct() {
  13. }
  14. public static function getInstance() {
  15. global $memory_limit;
  16. $memory_limit = ini_get("memory_limit");
  17. ini_set("memory_limit", '2048M');
  18. if (!self::$_ocean) {
  19. $c = __CLASS__;
  20. self::$_ocean = new $c;
  21. }
  22. return self::$_ocean;
  23. }
  24. public function ocean_booking() {
  25. $operate = utils::_get('operate');
  26. $operate = strtolower($operate);
  27. /*
  28. * index page
  29. */
  30. if (empty($operate)) {
  31. $data = array();
  32. if (_isCustomerLogin())
  33. $data['is_customer'] = "yes";
  34. else
  35. $data['is_customer'] = "no";
  36. //栏位信息
  37. $column = column::getInstance()->getDisplayColumn('Booking_Search');
  38. $BookingTableColumns = column::getInstance()->tableColumns('Booking_Search',$column);
  39. $data['BookingTableColumns'] = $BookingTableColumns;
  40. common::echo_json_encode(200,$data);
  41. exit();
  42. }
  43. /*
  44. * ocean order search
  45. */
  46. if ($operate == "search") {
  47. $this->_booking_search();
  48. }
  49. if ($operate == "setting_display") {
  50. column::getInstance()->settingDisplay('Booking_Search', 'main_new_version.php?action=ocean_booking');
  51. }
  52. if ($operate == "detail") {
  53. $serial_no = common::deCode($_GET['a'], 'D');
  54. $transport_mode = common::excuteOneSql("SELECT transport_mode FROM public.kln_booking ob WHERE ob.serial_no = '$serial_no'");
  55. if ($transport_mode == "sea"){
  56. $this->_booking_detail();
  57. } elseif ($transport_mode == "air"){
  58. $this->_air_booking_detail();
  59. } else {
  60. $this->_booking_detail();
  61. }
  62. }
  63. if ($operate == "excel") {
  64. $this->_booking_excel();
  65. }
  66. if ($operate == "save_communication") {
  67. try {
  68. $content = $_POST["content"];
  69. $content = common::check_input($content);
  70. $text = $_POST["text"];
  71. $content = urldecode($content);
  72. $web_content = urldecode($text);
  73. $communication_cc = $_POST["communication_cc"];
  74. $serial_no = common::uuid();
  75. $email_uuid = $_POST["serial_no"];
  76. $add_by = _getLoginName();
  77. $refer_id = 0;
  78. $email = $this->getEmail($email_uuid);
  79. $from_email = "US.KApex.Online@kerryapex.com";
  80. $to_email = $email["email"];
  81. $cc_email = $_SESSION['ONLINE_USER']['email'] . ";ApexOnlineCommunication@apexshipping.com";
  82. $communication_cc = trim($communication_cc);
  83. if (!empty($communication_cc)) {
  84. $communication_cc = common::check_input($communication_cc);
  85. $cc_email .= ";" . $communication_cc;
  86. }
  87. $user_from = _getLoginName();
  88. $user_to = $email["name"];
  89. $user_cc = $_SESSION['ONLINE_USER']['first_name'];
  90. if (empty($user_cc)) {
  91. $user_cc = _getLoginName();
  92. }
  93. $user_cc .= ";ApexOnlineCommunication";
  94. //邮件发送
  95. $poKey = "<br><br>Important note: when you reply this email, do not remove ApexOnlineCommunication@apexshipping.com<br>Below is system code, do not delete.<br>@@";
  96. $emailSql = "select encode(public.pgp_sym_encrypt('" . $serial_no . "','pom_key'), 'base64')::text;";
  97. $key = common::excuteOneSql($emailSql);
  98. $historyEmails = "";
  99. $title = "Communication from " . _getLoginName() . ", HBOL: " . $email["h_bol"] . ", Consignee: " . $email["consignee"];
  100. $emailContent = $content . $poKey . $key . ";" . "@@<br>For your convenience weblink: https://ra.kerryapex.com/<br><br>" . $historyEmails;
  101. common::excuteUpdateSql("insert into public.email_record (type,title,from_email,to_email,cc_email,content,insert_date)values('Communication','$title','$from_email','$to_email','$cc_email','$emailContent',now());");
  102. $rs = common::excuteUpdateSql("INSERT INTO public.online_ocean_communication(serial_no, email_uuid, content,web_content,user_from, user_to, user_cc, refer_id, add_by, add_time, cc_email)
  103. VALUES ('$serial_no', '$email_uuid', '$emailContent','$web_content', '$user_from', '$to_email', '$cc_email', $refer_id, '$add_by', now(), '$communication_cc');");
  104. $emailRecords = $this->getCommunicationNew($email_uuid);
  105. common::echo_json_encode(200,array("msg" => "Sent Successfully", "emailRecords" => $emailRecords));
  106. exit();
  107. } catch (Exception $e) {
  108. common::echo_json_encode(500,array("msg" => "Sent Error."));
  109. exit();
  110. }
  111. }
  112. }
  113. private function _booking_search() {
  114. //分担查询
  115. include ONLINE_ROOT . 'libs' . DS . 'map_config.ini.php';
  116. $cp = common::check_input($_POST ['cp']); //current_page
  117. $ps = common::check_input($_POST ['ps']); //ps
  118. if (empty($ps)){
  119. $ps = 100;
  120. }
  121. $sqlWhere = ' where ' . common::searchExtendHand_KLN("booking", $_SESSION["ONLINE_USER"]);
  122. $sqlWhere .= search::getInstance()->getSearchSQL("Booking_Search");
  123. //移除掉全文检索 但保留代码
  124. // if (!empty($_POST["_textSearch"])) {
  125. // $sqlWhere .= " and text_search @@ (str_to_tsquery('" . common::check_input($_POST["_textSearch"]) . "'))";
  126. // }
  127. //处理reference类型的组合查询 Search booking No./HBL No./PO No./Carrier Booking No.
  128. if (!empty($_POST["_textSearch"])) {
  129. $textSearch_arr = $_POST['_textSearch'];
  130. if(!is_array($textSearch_arr)){
  131. $textSearch_arr = str_replace(",", ";", $textSearch_arr);
  132. $textSearch_arr = array($textSearch_arr);
  133. }
  134. $more_param = common::getInNotInSqlForSearch(strtolower(utils::implode(';',$textSearch_arr)));
  135. $sqlWhere .= " and ((ARRAY[$more_param] && array_append(array[lower(booking_no)::text,lower(h_bol)::text, lower(po_no),lower(carrier_booking)],''))
  136. or lower(po_no) like '%" . strtolower(common::check_input($_POST["_textSearch"])) . "%')";
  137. }
  138. //为了移除filterTag条件
  139. $sqlWhere_befrom_filterTag = $sqlWhere;
  140. $filterTag_param = "";
  141. $mode_param = "";
  142. $transport_mode = empty($_POST["transport_mode"]) ? "all" : $_POST["transport_mode"];
  143. if(!is_array($transport_mode)){
  144. $transport_mode = array($transport_mode);
  145. }
  146. if(utils::count($transport_mode) == 1 && strtolower($transport_mode[0]) == 'all'){
  147. $transport_mode = array("sea","air","road","rail");
  148. }
  149. $transport_mode = utils::implode(";",$transport_mode);
  150. $mode_param = common::getInNotInSqlForSearch($transport_mode);
  151. $sqlWhere .= " and transport_mode_extend in ($mode_param)";
  152. $transport_mode_search = " and transport_mode_extend in ($mode_param)";
  153. //前端提交是数组
  154. if (!empty($_POST['filterTag']) && utils::count($_POST['filterTag']) < 4) {
  155. if (utils::count($_POST['filterTag']) == 1){
  156. $filterTag = $_POST['filterTag'][0];
  157. }else{
  158. $filterTag = utils::implode(",", $_POST['filterTag']);
  159. }
  160. $_sqlwhere = "1<>1";
  161. $filterTag_param = "1<>1";
  162. if(strtolower($filterTag) == "all"){
  163. $filterTag_param = "1=1";
  164. }
  165. if (stripos($filterTag, "Confirmed") !== FALSE) {
  166. $_sqlwhere .= " or (bol_type != 'BOOKING')";
  167. $filterTag_param .= " or (bol_type != 'BOOKING')";
  168. }
  169. if (stripos($filterTag, "Cancelled") !== FALSE) {
  170. $_sqlwhere .= " or (status='Cancelled')";
  171. $filterTag_param .= " or (status='Cancelled')";
  172. }
  173. if (stripos($filterTag, "Created") !== FALSE) {
  174. $_sqlwhere .= " or (bol_type = 'BOOKING' and status!='Cancelled')";
  175. $filterTag_param .= " or (bol_type = 'BOOKING' and status!='Cancelled')";
  176. }
  177. if(strtolower($filterTag) <> "all" && !empty($filterTag)){
  178. $sqlWhere .= " and ($_sqlwhere)";
  179. $filterTag_param = " ($filterTag_param)";
  180. }
  181. }
  182. if(empty($filterTag_param)){
  183. $filterTag_param = "1=1";
  184. }
  185. $tag_and_mode_param = $filterTag_param.$transport_mode_search;
  186. $mode_param_search = "1=1 ".$transport_mode_search;
  187. $rc = $_POST ['rc'];
  188. //这里都要查询,除非多传几个参数回来
  189. if ($rc == - 1 || true) {
  190. $sql_all_status = "SELECT count(1) as rc,
  191. sum(case when (1<>1 or (transport_mode_extend='sea')) then 1 else 0 end) as sea_rc,
  192. sum(case when (1<>1 or (transport_mode_extend='air')) then 1 else 0 end) as air_rc,
  193. sum(case when (1<>1 or (transport_mode_extend='road')) then 1 else 0 end) as road_rc,
  194. sum(case when (1<>1 or (transport_mode_extend='rail')) then 1 else 0 end) as rail_rc,
  195. sum(case when $tag_and_mode_param then 1 else 0 end) as seach_rc,
  196. sum(case when (1<>1 or ($mode_param_search and bol_type = 'BOOKING' and status!='Cancelled')) then 1 else 0 end) as creatd,
  197. sum(case when (1<>1 or ($mode_param_search and bol_type != 'BOOKING')) then 1 else 0 end) as confirmed,
  198. sum(case when (1<>1 or ($mode_param_search and status='Cancelled')) then 1 else 0 end) as concelled
  199. from public.kln_booking" . $sqlWhere_befrom_filterTag;
  200. error_log($sql_all_status );
  201. //$sql_all_status_data = common::excuteObjectSql($sql_all_status);
  202. $sql_all_status_data = $mapdb->GetRow($sql_all_status) or ( (!$mapdb->ErrorMsg()) or error_log(common::dbLog($mapdb, $sql_all_status), 0));
  203. $seach_rc = $sql_all_status_data['seach_rc'];
  204. $rc = $sql_all_status_data['rc'];
  205. $sea_rc = $sql_all_status_data['sea_rc'];
  206. $air_rc = $sql_all_status_data['air_rc'];
  207. $road_rc = $sql_all_status_data['road_rc'];
  208. $rail_rc = $sql_all_status_data['rail_rc'];
  209. $Creatd = $sql_all_status_data['creatd'];
  210. $Confirmed = $sql_all_status_data['confirmed'];
  211. $Concelled = $sql_all_status_data['concelled'];
  212. //前端数据返回,不管有无数据
  213. if (!empty($_POST["filterTag"])) {
  214. $tagsList = array(array("name"=>"All","number"=>intval($rc),"type"=>"all","checked"=>utils::in_array('All', $_POST["filterTag"])? true : false),
  215. array("name"=>"Created","number"=>intval($Creatd),"type"=>"created","checked"=>utils::in_array('Created', $_POST["filterTag"])? true : false),
  216. array("name"=>"Confirmed","number"=>intval($Confirmed),"type"=>"confirmed","checked"=>utils::in_array('Confirmed', $_POST["filterTag"])? true : false),
  217. array("name"=>"Cancelled","number"=>intval($Concelled),"type"=>"cancelled","checked"=>utils::in_array('Cancelled', $_POST["filterTag"])? true : false));
  218. }else{
  219. //初始,前端有选择着带入选择
  220. $tagsList = array(array("name"=>"All","number"=>intval($rc),"type"=>"all","checked"=>true),
  221. array("name"=>"Created","number"=>intval($Creatd),"type"=>"created","checked"=>false),
  222. array("name"=>"Confirmed","number"=>intval($Confirmed),"type"=>"confirmed","checked"=>false),
  223. array("name"=>"Cancelled","number"=>intval($Concelled),"type"=>"cancelled","checked"=>false));
  224. }
  225. $TransportList = array(
  226. array("name"=>"Ocean Freight","sname"=>"Sea","number"=>intval($sea_rc),"checked"=>false,"icon"=>"#icon-icon_ocean_b"),
  227. array("name"=>"Air Freight","sname"=>"Air","number"=>intval($air_rc),"checked"=>false,"icon"=>"#icon-icon_airplane_b"),
  228. array("name"=>"Rail Freight","sname"=>"Rail","number"=>intval($rail_rc),"checked"=>false,"icon"=>"#icon-icon_railway_b"),
  229. array("name"=>"Road Freight","sname"=>"Road","number"=>intval($road_rc),"checked"=>false,"icon"=>"#icon-icon_truck_b"));
  230. $transport_mode_arr = explode(";", $transport_mode);
  231. foreach($transport_mode_arr as $mode){
  232. foreach($TransportList as $tkey => $transport){
  233. if(strtolower(trim($mode)) == strtolower($TransportList[$tkey]["sname"])){
  234. $TransportList[$tkey]["checked"] = true;
  235. }
  236. }
  237. }
  238. //现在下载交给前端,后台预先只返回全部字段的列,
  239. $allColumn = column::getInstance()->getDisplayColumnAllReomveDefault('Booking_Search');
  240. $allBookingColumns = column::getInstance()->tableColumns('Booking_Search',$allColumn);
  241. }
  242. $tp = ceil($rc / $ps);
  243. if ($rc > 0 ) {
  244. $order_by = " f_etd desc";
  245. //TopOcean的不用考虑
  246. $ocean_dest_sql = "";
  247. //合并显示两个特殊字段 voyage_m_voyage/vessel_m_vessel
  248. $sql = "SELECT order_from as _schemas, serial_no as __serial_no,
  249. color,transport_mode,transport_mode_extend, bol_type, m_voyage as _m_voyage, m_vessel as _m_vessel,f_eta as _f_eta," .
  250. column::getInstance()->getSearchSqlForDisplay('Booking_Search') . " from public.kln_booking $ocean_dest_sql " . $sqlWhere . " order by $order_by limit " . $ps . " offset " . ($cp - 1) * $ps;
  251. //$rs = common::excuteListSql($sql);
  252. $rs = $mapdb->GetAll($sql) or ( (!$mapdb->ErrorMsg()) or error_log(common::dbLog($mapdb, $sql), 0));
  253. error_log("online_booking_search_SQL: ".$sql);
  254. //对查询的结果做特殊处理,比如要拼接某个值,合并值等
  255. foreach($rs as $index => $val) {
  256. //合并显示 vessel
  257. if(array_key_exists("f_vessel", $val)){
  258. $rs[$index]["f_vessel"] = utils::outDisplayForMerge($val['f_vessel'],$val['_m_vessel']);
  259. }
  260. //合并显示 voyage
  261. if(array_key_exists("f_voyage", $val)){
  262. $rs[$index]["f_voyage"] = utils::outDisplayForMerge($val['f_voyage'],$val['_m_voyage']);
  263. }
  264. //显示 eta
  265. if(array_key_exists("m_eta", $val)){
  266. $rs[$index]["m_eta"] = !empty($val['m_eta']) ? $val['m_eta'] : $val['_f_eta'];
  267. }
  268. //返回加密serial_no
  269. $rs[$index]["__serial_no"] = common::deCode($val['__serial_no'], 'E');
  270. //按新逻辑处理status,现在是管理员权限,客户权限少了一种状态,先设置默认值防止出错
  271. // $status = "Created";
  272. // if ($val['color'] == "FF00FF00" || $val['color'] == "FF0000FF"){
  273. // $status = "Confirmed";
  274. // }
  275. // if ($val['color'] == "FFFF0000"){
  276. // $status = "Cancelled";
  277. // }
  278. // $rs[$index]["Status"] = $status;
  279. if($val['bol_type'] == 'BOOKING' and $val['Status']!='Cancelled'){
  280. $status = "Created";
  281. }
  282. if ($val['bol_type'] != 'BOOKING'){
  283. $status = "Confirmed";
  284. }
  285. if ($val['Status']=='Cancelled'){
  286. $status = "Cancelled";
  287. }
  288. $rs[$index]["Status"] = $status;
  289. $rs[$index]["Mode"] = $val['transport_mode_extend'] == 'sea' ? "Ocean Freight" : ($val['transport_mode_extend'] == 'air' ? "Air Freight":
  290. ($val['transport_mode_extend'] == 'rail' ? "Rail Freight":
  291. ($val['transport_mode_extend'] == 'road' ? "Road Freight": "")));;
  292. }
  293. $arrTmp = array('searchData' => $rs,
  294. 'tagsList' => $tagsList,
  295. 'TransportList' => $TransportList,
  296. 'allColums' => $allBookingColumns,
  297. 'rc' => $seach_rc,
  298. 'ps' => $ps,
  299. 'cp' => $cp,
  300. 'tp' => $tp,
  301. 'tmp_search' => common::deCode($sql, 'E'),
  302. 'type' => common::check_input($_POST ['_ntype']));
  303. } else {
  304. $arrTmp = array('searchData' => array(),
  305. 'tagsList' => $tagsList,
  306. 'TransportList' => $TransportList,
  307. 'allColums' => $allBookingColumns,
  308. 'rc' => $seach_rc,
  309. 'ps' => $ps,
  310. 'cp' => $cp,
  311. 'tp' => $tp,
  312. 'tmp_search' => "",
  313. 'type' => common::check_input($_POST ['_ntype']));
  314. }
  315. common::echo_json_encode(200,$arrTmp);
  316. exit();
  317. }
  318. private function _booking_detail() {
  319. $serial_no = common::deCode($_GET['a'], 'D');
  320. $status = $_GET['status'];
  321. $_schemas = $_GET['_schemas'];
  322. if($_schemas == 'public'){
  323. $_schemas = "ocean";
  324. }
  325. $sql = "with o as(
  326. SELECT o.*,'' as incoterms from ocean o where serial_no = '" .$serial_no . "'
  327. )
  328. SELECT o.booking_no as _booking_no,
  329. o.* ,sh.*, cn.* ,aa.*,dd.*,ob.*
  330. from o
  331. LEFT JOIN LATERAL ( SELECT shippr_uncode,shipper_city,
  332. consignee_uncode,consignee_city,
  333. place_of_receipt_uncode,place_of_delivery_uncode,
  334. fport_of_loading_uncode,mport_of_discharge_uncode,po_no as _po_no,transport_mode,transport_mode_extend
  335. FROM public.kln_booking ob WHERE o.serial_no::text = ob.serial_no::text) ob ON true
  336. LEFT JOIN LATERAL ( SELECT company as cn_company,
  337. address_1 as cn_address_1,
  338. address_2 as cn_address_2,
  339. address_3 as cn_address_3,
  340. address_4 as cn_address_4,
  341. city as cn_city, state as cn_state, zipcode as cn_zipcode, country as cn_country,
  342. phone_1 as cn_phone
  343. FROM $_schemas.contacts c WHERE o.consignee::text = c.contact_id::text) cn ON true
  344. LEFT JOIN LATERAL ( SELECT company as sh_company,
  345. address_1 as sh_address_1,
  346. address_2 as sh_address_2,
  347. address_3 as sh_address_3,
  348. address_4 as sh_address_4,
  349. city as sh_city, state as sh_state, zipcode as sh_zipcode, country as sh_country,
  350. phone_1 as sh_phone
  351. FROM $_schemas.contacts c WHERE o.shipper::text = c.contact_id::text) sh ON true
  352. LEFT JOIN LATERAL ( SELECT company as aa_company,
  353. address_1 as aa_address_1,
  354. address_2 as aa_address_2,
  355. address_3 as aa_address_3,
  356. address_4 as aa_address_4,
  357. city as aa_city, state as aa_state, zipcode as aa_zipcode, country as aa_country,
  358. phone_1 as aa_phone
  359. FROM $_schemas.contacts c WHERE o.origin_station::text = c.contact_id::text) aa ON true
  360. LEFT JOIN LATERAL ( SELECT company as dd_company,
  361. address_1 as dd_address_1,
  362. address_2 as dd_address_2,
  363. address_3 as dd_address_3,
  364. address_4 as dd_address_4,
  365. city as dd_city, state as dd_state, zipcode as dd_zipcode, country as dd_country,
  366. phone_1 as dd_phone
  367. FROM $_schemas.contacts c WHERE o.destination_station::text = c.contact_id::text) dd ON true";
  368. $ocean = common::excuteObjectSql($sql);
  369. error_log($sql);
  370. $vueData = $this->returnBookingDetailData($ocean,$status);
  371. //处理transportInfo信息数据
  372. $transportInfo = $vueData["transportInfo"];
  373. //处理basicInfo信息数据
  374. $basicInfo = $vueData["basicInfo"];
  375. //处理 拼接地址 ocean表单exp 字段无法精准分割电话和地址信息,只能从contacts表里查询
  376. $businessPartners = $vueData["businessPartners"];
  377. $marksAndDescription = $vueData["marksAndDescription"];
  378. //处理ocean_reference
  379. $ref_no = array();
  380. $ref_arr = common::excuteListSql("select * from ocean_reference where lower(serial_no) = '" . strtolower($serial_no) . "'");
  381. if(!empty($ref_arr)){
  382. foreach($ref_arr as $ref) {
  383. $ref_no[] = array("label"=>$ref["ref_code"],"value"=>$ref["ref_value"]);
  384. }
  385. }
  386. //处理返回booking的 Container 信息数据
  387. $booking_container_column = array();
  388. $container_column = column::getInstance()->getDisplayColumnAll('Booking_Container');
  389. $booking_Container_config = array("QTY" => array("formatter"=>"number","digits"=>0),
  390. "KGS" => array("formatter"=>"number","digits"=>3),
  391. "CBM" => array("formatter"=>"number","digits"=>3));
  392. foreach($container_column as $cc){
  393. if(!empty($booking_Container_config[$cc['name']])){
  394. $booking_container_column[] =array("field" =>$cc['database_column_name'],"title" =>$cc['name'],
  395. "formatter" =>$booking_Container_config[$cc['name']]["formatter"],
  396. "digits" =>$booking_Container_config[$cc['name']]["digits"],
  397. "type" =>"normal");
  398. }else{
  399. $booking_container_column[] =array("field" =>$cc['database_column_name'],"title" =>$cc['name'],
  400. "formatter" =>"",
  401. "digits" =>"",
  402. "type" =>"normal");
  403. }
  404. }
  405. if (!empty($ocean['_booking_no'])) {
  406. $sql = "SELECT " . column::getInstance()->getSearchSql('Booking_Container') . " from ocean_booking_container where lower(serial_no) = '" . strtolower($serial_no) . "'";
  407. $rss = common::excuteListSql($sql);
  408. } else {
  409. $sql = "SELECT " . column::getInstance()->getSearchSql('Booking_Container') . " from oc_container_booking_v where lower(serial_no) = '" . strtolower($serial_no) . "'";
  410. $rss = common::excuteListSql($sql);
  411. }
  412. $containers = array("container_column"=>$booking_container_column,"container_data" =>$rss);
  413. //packing
  414. $quantity_unit = array();
  415. $packages = "CTN";
  416. $g_weight_tolal = 0;
  417. $ch_weight_tolal = 0;
  418. $cbm_tolal = 0;
  419. foreach($rss as $pk => $pv){
  420. //相同的unit 的合并成一个
  421. $unit = $pv['unit'];
  422. if (array_key_exists($unit, $quantity_unit)) {
  423. $quantity_unit[$unit] = $quantity_unit[$unit] + $pv['qty'];
  424. } else {
  425. $quantity_unit[$unit] = $pv['qty'];
  426. }
  427. $g_weight_tolal += $pv['kgs'];
  428. $ch_weight_tolal += $pv['kgs'];
  429. $cbm_tolal += $pv['cbm'];
  430. }
  431. $quantity_tolal = "";
  432. foreach($quantity_unit as $uk => $uv){
  433. $quantity_tolal.=$uv." ".$uk." ";
  434. }
  435. //$packing = array("Quantity/Unit"=>"47 CTN","G. Weight" => "480.25 KGS","Ch. Weight" => "689.26 KGS","Volume" => "3.801 CBM");
  436. $g_weight_tolal = sprintf("%.3f", $g_weight_tolal);
  437. if (!empty($ocean['_booking_no'])) {
  438. $cbm_tolal = sprintf("%.3f", $cbm_tolal);
  439. }else{
  440. $cbm_tolal = sprintf("%.4f", $cbm_tolal);
  441. }
  442. $packing = array("Quantity/Unit"=>$quantity_tolal,"G. Weight" => $g_weight_tolal." KGS","Ch. Weight" => $g_weight_tolal." KGS","Volume" => $cbm_tolal." CBM");
  443. //处理邮件信息返回
  444. $emailRecords = $this->getCommunicationNew($ocean["serial_no"]);
  445. $cc_email = common::excuteOneSql("select cc_email from public.online_ocean_communication where email_uuid='" . $ocean["serial_no"] . "' order by id desc limit 1");
  446. $email = $this->getEmail($ocean["serial_no"]);
  447. $email['cc_email'] = $cc_email;
  448. $email['emailRecords'] = $emailRecords;
  449. global $_COPYRIGHT;
  450. $data = array('transportInfo' => $transportInfo,
  451. 'basicInfo' => $basicInfo,
  452. 'businessPartners' => $businessPartners,
  453. 'ref_no' => $ref_no,
  454. 'packing' => $packing,
  455. 'marksAndDescription' => $marksAndDescription,
  456. 'containers' => $containers,
  457. 'email' => $email,
  458. 'serial_no' => $serial_no,
  459. '_schemas' => $_GET['_schemas'],
  460. '__serial_no' => common::deCode($ocean['serial_no'], 'E'),
  461. 'copyright' =>$_COPYRIGHT);
  462. common::echo_json_encode(200,$data);
  463. exit();
  464. }
  465. /**
  466. * 信息从kln_booking表里获取(查询全部数据),信息不够在从对应模式里的air_booking取部分数据。
  467. */
  468. private function _air_booking_detail(){
  469. $serial_no = common::deCode($_GET['a'], 'D');
  470. $status = $_GET['status'];
  471. $_schemas = $_GET['_schemas'];
  472. if($_schemas == 'public'){
  473. $_schemas = "ocean";
  474. }
  475. //air要关联ata_date as ata, atd没有对应字段
  476. $sql = "with o as(
  477. SELECT o.* from public.kln_booking o where serial_no = '" . $serial_no . "'
  478. )
  479. SELECT *, po_no as _po_no,'' as incoterms,null as atd,
  480. sh.*, cn.*, aa.*, dd.*
  481. from o
  482. LEFT JOIN LATERAL ( SELECT company as cn_company,
  483. address_1 as cn_address_1,
  484. address_2 as cn_address_2,
  485. address_3 as cn_address_3,
  486. address_4 as cn_address_4,
  487. city as cn_city, state as cn_state, zipcode as cn_zipcode, country as cn_country,
  488. phone_1 as cn_phone
  489. FROM $_schemas.contacts c WHERE o.consignee_id::text = c.contact_id::text) cn ON true
  490. LEFT JOIN LATERAL ( SELECT company as sh_company,
  491. address_1 as sh_address_1,
  492. address_2 as sh_address_2,
  493. address_3 as sh_address_3,
  494. address_4 as sh_address_4,
  495. city as sh_city, state as sh_state, zipcode as sh_zipcode, country as sh_country,
  496. phone_1 as sh_phone
  497. FROM $_schemas.contacts c WHERE o.shipper_id::text = c.contact_id::text) sh ON true
  498. LEFT JOIN LATERAL ( SELECT company as aa_company,
  499. address_1 as aa_address_1,
  500. address_2 as aa_address_2,
  501. address_3 as aa_address_3,
  502. address_4 as aa_address_4,
  503. city as aa_city, state as aa_state, zipcode as aa_zipcode, country as aa_country,
  504. phone_1 as aa_phone
  505. FROM $_schemas.contacts c WHERE o.origin::text = c.contact_id::text) aa ON true
  506. LEFT JOIN LATERAL ( SELECT company as dd_company,
  507. address_1 as dd_address_1,
  508. address_2 as dd_address_2,
  509. address_3 as dd_address_3,
  510. address_4 as dd_address_4,
  511. city as dd_city, state as dd_state, zipcode as dd_zipcode, country as dd_country,
  512. phone_1 as dd_phone
  513. FROM $_schemas.contacts c WHERE o.agent::text = c.contact_id::text) dd ON true";
  514. $ocean = common::excuteObjectSql($sql);
  515. $vueData = $this->returnBookingDetailData($ocean,$status);
  516. //处理transportInfo信息数据
  517. $transportInfo = $vueData["transportInfo"];
  518. //处理basicInfo信息数据
  519. $basicInfo = $vueData["basicInfo"];
  520. //处理 拼接地址 ocean表单exp 字段无法精准分割电话和地址信息,只能从contacts表里查询
  521. $businessPartners = $vueData["businessPartners"];
  522. $marksAndDescription = $vueData["marksAndDescription"];
  523. //处理ocean_reference: air没有这个信息
  524. $ref_no = array();
  525. //处理返回booking的 Container 信息数据
  526. $containers = array();
  527. //packing
  528. //$packing = array("Quantity/Unit"=>"47 CTN","G. Weight" => "480.25 KGS","Ch. Weight" => "689.26 KGS","Volume" => "3.801 CBM");
  529. $quantity_tolal = empty($ocean['qty']) ? "" : $ocean['qty'].$ocean['qty_uom'];
  530. $g_weight_tolal = empty($ocean['piece_count']) ? "" : sprintf("%.3f", $ocean['piece_count'])." KGS";
  531. $ch_weight_tolal = empty($ocean['piece_count']) ? "": sprintf("%.3f", $ocean['weight'])." KGS";
  532. $cbm_tolal = empty($ocean['cbm']) ? "" : sprintf("%.4f", $ocean['cbm'])." CBM";
  533. $packing = array("Quantity/Unit"=>$quantity_tolal,"G. Weight" => $g_weight_tolal,"Ch. Weight" => $ch_weight_tolal,"Volume" => $cbm_tolal);
  534. //处理邮件信息返回
  535. $emailRecords = $this->getCommunicationNew($ocean["serial_no"]);
  536. $cc_email = common::excuteOneSql("select cc_email from public.online_ocean_communication where email_uuid='" . $ocean["serial_no"] . "' order by id desc limit 1");
  537. $email = $this->getEmail($ocean["serial_no"]);
  538. $email['cc_email'] = $cc_email;
  539. $email['emailRecords'] = $emailRecords;
  540. global $_COPYRIGHT;
  541. $data = array('transportInfo' => $transportInfo,
  542. 'basicInfo' => $basicInfo,
  543. 'businessPartners' => $businessPartners,
  544. 'ref_no' => $ref_no,
  545. 'packing' => $packing,
  546. 'marksAndDescription' => $marksAndDescription,
  547. 'containers' => $containers,
  548. 'email' => $email,
  549. 'serial_no' => $serial_no,
  550. '_schemas' => $_GET['_schemas'],
  551. '__serial_no' => common::deCode($ocean['serial_no'], 'E'),
  552. 'copyright' =>$_COPYRIGHT);
  553. common::echo_json_encode(200,$data);
  554. exit();
  555. }
  556. private function _booking_excel() {
  557. $sql = common::deCode($_POST['tmp_search'], 'D');
  558. $sql = substr($sql, 0, strripos($sql, " limit"));
  559. if(!empty($sql)){
  560. $rs = common::excuteListSql($sql);
  561. }
  562. //去除null
  563. foreach($rs as $index => $val) {
  564. foreach($val as $index_2 => $_val) {
  565. if(empty($rs[$index][$index_2]) || $rs[$index][$index_2] == null){
  566. $rs[$index][$index_2] = "";
  567. }
  568. }
  569. }
  570. foreach($rs as $index => $val) {
  571. //合并显示 vessel
  572. if(array_key_exists("f_vessel", $val)){
  573. $rs[$index]["f_vessel"] = utils::outDisplayForMerge($val['f_vessel'],$val['_m_vessel']);
  574. }
  575. //合并显示 voyage
  576. if(array_key_exists("f_voyage", $val)){
  577. $rs[$index]["f_voyage"] = utils::outDisplayForMerge($val['f_voyage'],$val['_m_voyage']);
  578. }
  579. //显示 eta
  580. if(array_key_exists("m_eta", $val)){
  581. $rs[$index]["m_eta"] = !empty($val['m_eta']) ? $val['m_eta'] : $val['_f_eta'];
  582. }
  583. //返回加密serial_no
  584. $rs[$index]["__serial_no"] = common::deCode($val['__serial_no'], 'E');
  585. //按新逻辑处理status,现在是管理员权限,客户权限少了一种状态,先设置默认值防止出错
  586. if($val['bol_type'] == 'BOOKING' and $val['Status']!='Cancelled'){
  587. $status = "Created";
  588. }
  589. if ($val['bol_type'] != 'BOOKING'){
  590. $status = "Confirmed";
  591. }
  592. if ($val['Status']=='Cancelled'){
  593. $status = "Cancelled";
  594. }
  595. $rs[$index]["Status"] = $status;
  596. $rs[$index]["Mode"] = $val['transport_mode_extend'] == 'sea' ? "Ocean Freight" :
  597. ($val['transport_mode_extend'] == 'air' ? "Air Freight":
  598. ($val['transport_mode_extend'] == 'rail' ? "Rail Freight":
  599. ($val['transport_mode_extend'] == 'road' ? "Road Freight": "")));
  600. }
  601. common::echo_json_encode(200,array("msg"=>"success","Data" => $rs));
  602. exit;
  603. }
  604. private function getEmail($serial_no) {
  605. return utils::getEmail($serial_no);
  606. }
  607. private function getCommunicationNew($serial_no) {
  608. $list = common::excuteListSql("select to_char(add_time, 'MM/dd/yyyy hh24:MI:ss') as add_times, * from public.online_ocean_communication where email_uuid='$serial_no' and refer_id = 0 order by id");
  609. $emialRecords =array();
  610. foreach ($list as $k => $v) {
  611. $msg =array();
  612. $msg["name"] = $v["add_by"];
  613. $msg["creatTime"] = $v["add_times"];
  614. $msg["content"] = urldecode($v["web_content"]);
  615. $emialRecords[] = $msg;
  616. }
  617. return $emialRecords;
  618. }
  619. private function retStationInfo($address_1,$address_2,$address_3,$address_4,$city,$state,$country,$zipcode){
  620. $stationInfo = "";
  621. if(!empty($address_1)){
  622. $stationInfo .= $address_1;
  623. }
  624. if(!empty($address_2)){
  625. $stationInfo .= " ".$address_2;
  626. }
  627. if(!empty($address_3)){
  628. $stationInfo .= " ".$address_3;
  629. }
  630. if(!empty($address_4)){
  631. $stationInfo .= " ".$address_4;
  632. }
  633. $temp_str = "";
  634. if(!empty($city)){
  635. $temp_str .= $city." ";
  636. }
  637. if(!empty($state)){
  638. $temp_str .= $state." ";
  639. }
  640. if(!empty($zipcode)){
  641. $temp_str .= $zipcode." ";
  642. }
  643. if(!empty($country)){
  644. $temp_str .= $country." ";
  645. }
  646. if(!empty($temp_str)){
  647. return $stationInfo." ".trim($temp_str);
  648. }
  649. return $stationInfo;
  650. }
  651. private function returnBookingDetailData($ocean,$status){
  652. $data = array();
  653. //由于这些基础数据还待完善,而且现在提单样式改版也没有显示客户自身的地址数据,所以我们这边的这个取值也要麻烦调整一下:
  654. //1.Shipment detail顶部的Origin和Destination的取值换成Place of Receipt、Place of Delivery的UNCODE
  655. //2.Tracking列表页里面字段Origin和Destination先隐藏(客户地址),不做展示
  656. $ocean['shippr_uncode'] = $ocean['place_of_receipt_uncode'];
  657. $ocean['consignee_uncode'] = $ocean['place_of_delivery_uncode'];
  658. //booking对 eta的处理
  659. $ocean['m_eta'] = !empty($ocean['m_eta']) ? $ocean['m_eta'] : $ocean['_f_eta'];
  660. //获取对应uncode 对应的时间
  661. $uncodes = $ocean['fport_of_loading_uncode'].";".$ocean['mport_of_discharge_uncode'];
  662. $codeinfo = common::getCityPortsInfo($uncodes);
  663. //处理transportInfo信息数据
  664. $_mode = $ocean['transport_mode_extend'] == 'sea' ? "Ocean Freight" :
  665. ($ocean['transport_mode_extend'] == 'air' ? "Air Freight":
  666. ($ocean['transport_mode_extend'] == 'rail' ? "Rail Freight":
  667. ($ocean['transport_mode_extend'] == 'road' ? "Road Freight": "")));
  668. $transportInfo = array("bookingNo." =>$ocean['booking_no'],"status"=>$status,"mode" => $_mode,
  669. "origin" =>$ocean['shippr_uncode'],"destination" =>$ocean['consignee_uncode'],
  670. "etd" =>$ocean['f_etd'],"atd" =>$ocean['atd'],
  671. "etd_timezone" =>$codeinfo[$ocean['fport_of_loading_uncode']],
  672. "atd_timezone" =>$codeinfo[$ocean['fport_of_loading_uncode']],
  673. "eta" =>$ocean['m_eta'],"ata" =>$ocean['ata'],
  674. "eta_timezone" =>$codeinfo[$ocean['mport_of_discharge_uncode']],
  675. "ata_timezone" =>$codeinfo[$ocean['mport_of_discharge_uncode']]);
  676. $data["transportInfo"] = $transportInfo;
  677. //处理basicInfo信息数据
  678. $vessel = utils::outDisplayForMerge($ocean['f_vessel'],$ocean['m_vessel']);
  679. $voyage = utils::outDisplayForMerge($ocean['f_voyage'],$ocean['m_voyage']);
  680. $basicInfo = array("bookingNo." =>$ocean['booking_no'],"HAWB/HBOL" => $ocean['h_bol'],"Carrier_Booking_No" =>$ocean['carrier_booking'],
  681. "PO_NO" =>$ocean['_po_no'],"Vessel/Airline" =>$vessel,"Voyage/Filght" =>$voyage,
  682. "Incoterm" =>$ocean['incoterms'],"Service_Type" =>$ocean['service']);
  683. $data["basicInfo"] = $basicInfo;
  684. //处理 拼接地址 ocean表单exp 字段无法精准分割电话和地址信息,只能从contacts表里查询
  685. $shipper_address = common::retStationInfo($ocean['sh_address_1'], $ocean['sh_address_2'], $ocean['sh_address_3'], $ocean['sh_address_4'],
  686. $ocean['sh_city'], $ocean['sh_state'], $ocean['sh_zipcode'], $ocean['sh_country']);
  687. $consignee_address = common::retStationInfo($ocean['cn_address_1'], $ocean['cn_address_2'], $ocean['cn_address_3'], $ocean['cn_address_4'],
  688. $ocean['cn_city'], $ocean['cn_state'], $ocean['cn_zipcode'], $ocean['cn_country']);
  689. $origin_address = common::retStationInfo($ocean['aa_address_1'], $ocean['aa_address_2'], $ocean['aa_address_3'], $ocean['aa_address_4'],
  690. $ocean['aa_city'], $ocean['aa_state'], $ocean['aa_zipcode'], $ocean['aa_country']);
  691. $destination_address = common::retStationInfo($ocean['dd_address_1'], $ocean['dd_address_2'], $ocean['dd_address_3'], $ocean['dd_address_4'],
  692. $ocean['dd_city'], $ocean['dd_state'], $ocean['dd_zipcode'], $ocean['dd_country']);
  693. $shipperPartners = array("company" =>$ocean['sh_company'],"address"=>$shipper_address,"phone"=>$ocean['sh_phone']);
  694. $consigneePartners = array("company" =>$ocean['cn_company'],"address"=>$consignee_address,"phone"=>$ocean['cn_phone']);
  695. $originPartners = array("company" =>$ocean['aa_company'],"address"=>$origin_address,"phone"=>$ocean['aa_phone']);
  696. $destinationPartners = array("company" =>$ocean['dd_company'],"address"=>$destination_address,"phone"=>$ocean['dd_phone']);
  697. $businessPartners = array("shipper"=>$shipperPartners,"consignee" => $consigneePartners,"origin" => $originPartners,"destination" => $destinationPartners);
  698. $data["businessPartners"] = $businessPartners;
  699. $marksAndDescription = array("marks"=>$ocean['marks'],"description"=>$ocean['description']);
  700. $data["marksAndDescription"] = $marksAndDescription;
  701. return $data;
  702. }
  703. }
  704. ?>