destination_delivery.class.php 92 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901
  1. <?php
  2. if (!defined('IN_ONLINE')) {
  3. exit('Access Denied');
  4. }
  5. /**
  6. * Description of operation_log
  7. *
  8. * @author Administrator
  9. */
  10. class destination_delivery {
  11. private static $_destination_delivery;
  12. public static function getInstance() {
  13. if (!self::$_destination_delivery) {
  14. $c = __CLASS__;
  15. self::$_destination_delivery = new $c;
  16. }
  17. return self::$_destination_delivery;
  18. }
  19. /**
  20. * 关于destination_delivery 页面的所有的静态加载数据查询
  21. */
  22. public function destination_delivery_load(){
  23. $operate = utils::_get('operate');
  24. $operate = strtolower($operate);
  25. /**
  26. * select country
  27. */
  28. if ($operate == "country") {
  29. $term = $_POST['term'];
  30. $term = trim($term);
  31. $sql = "select DISTINCT category AS country_code from public.kerry_system_code
  32. where description='COUNTRY-STATION'
  33. and category ilike '" . common::check_input($term) . "%'";
  34. $sql .= " order by category";
  35. $rs = common::excuteListSql($sql);
  36. //前端要加上id 从1开始
  37. $retData = array();
  38. foreach($rs as $key => $val){
  39. if(!empty($val['country_code'])){
  40. $retData[] = array("value" =>$val['country_code'] ,"label"=>$val['country_code']);
  41. }
  42. }
  43. common::echo_json_encode(200,$retData);
  44. exit();
  45. }
  46. /**
  47. * select station 选择国家后再展示 station list数据
  48. */
  49. if ($operate == "station") {
  50. $country = common::check_input($_REQUEST['country']);
  51. $sql = "select code from public.kerry_system_code
  52. where description='COUNTRY-STATION'
  53. and category = '".$country."'
  54. and code NOT LIKE 'ONLINE_%' order by code";
  55. $rs = common::excuteListSql($sql);
  56. foreach($rs as $key => $val){
  57. if(!empty($val['code'])){
  58. $retData[] = array("value" =>$val['code'] ,"label"=>$val['code']);
  59. }
  60. }
  61. common::echo_json_encode(200,$retData);
  62. exit();
  63. }
  64. /**
  65. * select KLN PIC 下拉可供选择的employee帐号,且帐号权限站点包括选中的station ?
  66. */
  67. if ($operate == "employee_account") {
  68. $term = $_POST['term'];
  69. $term = trim($term);
  70. $station = $_REQUEST['station'];
  71. $sqlwhere = '';
  72. if(!empty($station)){
  73. $more_param = common::getInNotInSqlForSearch(utils::implode(';',$station));
  74. $sqlwhere = " and lower(e.contact_id) in ($more_param) ";
  75. }
  76. $sql = "select e.email from public.ra_online_user r, employee e
  77. where r.employee_id=e.employee_id
  78. and r.online_active = true
  79. and r.user_type = 'Employee'
  80. and e.active = true
  81. ".$sqlwhere."
  82. and coalesce(e.email,'') <>''
  83. and e.email ilike '" . common::check_input($term) . "%' order by e.email limit 50";
  84. $rs = common::excuteListSql($sql);
  85. $retData = array();
  86. foreach($rs as $key => $val){
  87. if(!empty($val['email'])){
  88. $retData[] = array("value" =>$val['email'] ,"label"=>$val['email']);
  89. }
  90. }
  91. common::echo_json_encode(200,$retData);
  92. exit();
  93. }
  94. /**
  95. * 下拉可供选择的ports
  96. */
  97. if ($operate == "ports") {
  98. $mode = $_POST['mode'];
  99. $term = $_POST['term'];
  100. $term = trim($term);
  101. if ($mode == 'sea'){
  102. $sql = "select DISTINCT uncode from public.ports
  103. where coalesce(uncode,'')<> '' and uncode ilike '" . common::check_input($term) . "%'";
  104. } else {
  105. $sql = "select DISTINCT coalesce(airport.country_abb,'')||airport.airport_code as uncode from sfs.airport
  106. where coalesce(country_abb,'')<>''
  107. and coalesce(airport.country_abb,'')||airport.airport_code ilike '" . common::check_input($term) . "%'";
  108. }
  109. $sql .= " order by uncode limit 50";
  110. $rs = common::excuteListSql($sql);
  111. //前端要加上id 从1开始
  112. $retData = array();
  113. foreach($rs as $key => $val){
  114. if(!empty($val['uncode'])){
  115. $retData[] = array("value" =>$val['uncode'] ,"label"=>$val['uncode'],"checked"=>false);
  116. }
  117. }
  118. common::echo_json_encode(200,$retData);
  119. exit();
  120. }
  121. /**
  122. * 下拉可供选择的carrier
  123. */
  124. if ($operate == "carrier") {
  125. $term = $_POST['term'];
  126. $term = trim($term);
  127. $sql = "select DISTINCT scac from public.vessel_company
  128. where coalesce(scac,'')<> '' and scac ilike '" . common::check_input($term) . "%'";
  129. $sql .= " order by scac limit 50";
  130. $rs = common::excuteListSql($sql);
  131. //前端要加上id 从1开始
  132. $retData = array();
  133. foreach($rs as $key => $val){
  134. if(!empty($val['scac'])){
  135. $retData[] = array("value" =>$val['scac'] ,"label"=>$val['scac'],"checked"=>false);
  136. }
  137. }
  138. common::echo_json_encode(200,$retData);
  139. exit();
  140. }
  141. /**
  142. * Manage Address load
  143. */
  144. if ($operate == "manage_address"){
  145. $consignee = $_REQUEST['consignee_id'];
  146. //$consignee =array('COMGEN38002','FGB050132','ATOZTI35005','WILSON80001');
  147. $more_param = common::getInNotInSqlForSearch(utils::implode(';',$consignee));
  148. $country = $_REQUEST['country'];
  149. //$country =array('GB','DE','US');
  150. $more_param_country = common::getInNotInSqlForSearch(utils::implode(';',$country));
  151. $delivery_serial_no = common::deCode($_REQUEST['delivery_serial_no'], 'D');
  152. //contact_person,contact_number, 现在系统还没有把这两个字段接入
  153. //if(!empty($delivery_serial_no)){
  154. $sql = "SELECT addr1,addr2,addr3,addr4,
  155. ctry_code,city_code,postal_code,
  156. attn as contact_person,tel as contact_number,
  157. create_user,contact_id,sync_key,
  158. from_station,
  159. 'from Ksmart' as op_action
  160. FROM public.contacts_address ca
  161. WHERE addr_type = 'D'
  162. and lower(ca.contact_id) in (".$more_param.")
  163. and ca.from_station in (select code from public.kerry_system_code where lower(category) in (".$more_param_country."))
  164. and ca.sync_key not in (select sync_key from public.contacts_address_online where lower(contact_id) in (".$more_param."))
  165. union all
  166. SELECT addr1,addr2,addr3,addr4,
  167. ctry_code,city_code,postal_code,
  168. attn as contact_person,
  169. tel as contact_number,
  170. create_user,contact_id,sync_key,
  171. from_station,
  172. action as op_action
  173. FROM public.contacts_address_online
  174. where is_delete = false
  175. and lower(contact_id) in (".$more_param.")";
  176. // }else{
  177. // $sql = "SELECT addr1,addr2,addr3,addr4,
  178. // ctry_code,city_code,postal_code,
  179. // '' as contact_person,'' as contact_number,
  180. // create_user,contact_id,sync_key,
  181. // from_station,
  182. // 'from Ksmart' as op_action
  183. // FROM public.contacts_address ca
  184. // WHERE addr_type = 'D'
  185. // and lower(ca.contact_id) in (".$more_param.")
  186. // and ca.from_station in (select code from public.kerry_system_code where lower(category) in (".$more_param_country."))";
  187. // }
  188. $data = common::excuteListSql($sql);
  189. error_log($sql);
  190. $manageAddressList = array();
  191. //Online_D_Address
  192. foreach($data as $d){
  193. if ($d['op_action'] == "from Ksmart" && $d['create_user'] <> "Online_D_Address"){
  194. $address_remark = "read-only";
  195. } elseif ($d['op_action'] == "from Ksmart" && $d['create_user'] == "Online_D_Address"){
  196. $address_remark = "reviewed";
  197. } elseif ($d['op_action'] == "Add" && $d['create_user'] == "Online_D_Address"){
  198. $address_remark = "unreviewed";
  199. } elseif ($d['op_action'] == "Modify" && $d['create_user'] == "Online_D_Address"){
  200. $address_remark = "unreviewed";
  201. } else {
  202. $address_remark = "deletion";
  203. }
  204. $manageAddressList[] = array(
  205. "address_1"=>$d['addr1'],
  206. "address_2"=>$d['addr2'],
  207. "address_3"=>$d['addr3'],
  208. "address_4"=>$d['addr4'],
  209. "country"=>$d['ctry_code'],
  210. "city"=>$d['city_code'],
  211. "postal_code"=>$d['postal_code'],
  212. "contact_person"=>$d['contact_person'] === null ? '' : $d['contact_person'],
  213. "contact_number" =>$d['contact_number'] === null ? '' : $d['contact_number'],
  214. "create_user" => $d['create_user'], //create_user = Online_D_Address 时,代表對客戶賬號類型自己創建的D類地址
  215. "contact_id" => $d['contact_id'],
  216. "sync_key" => $d['sync_key'], //唯一key
  217. "from_station" => $d['from_station'], //只有是客户新键的才会特殊处理station Online_GE. 好判断是那个国家的
  218. "contact_type" => "Unedit", //这个前端控制的
  219. "op_action" => $d['op_action'],
  220. "address_remark" => $address_remark
  221. );
  222. }
  223. common::echo_json_encode(200,$manageAddressList);
  224. exit();
  225. }
  226. /**
  227. * country and city load
  228. */
  229. if ($operate == "country_city_load") {
  230. $term_type = $_POST['term_type'];
  231. $limit = $_POST['limit'];
  232. $term = $_POST['term'];
  233. $term = trim($term);
  234. $extend_sql_where = "";
  235. if ($term_type == "country" && !empty($limit)){
  236. $extend_sql_where = " and location_code = '$limit'";
  237. }
  238. if ($term_type == "city" && !empty($limit)){
  239. $extend_sql_where = " and country_code = '$limit'";
  240. }
  241. if ($term_type == "country"){
  242. $sql = "select DISTINCT country_code AS code from public.unlocode
  243. where country_code ilike '" . common::check_input($term) . "%'".$extend_sql_where;
  244. $sql .= " order by country_code limit 50";
  245. }
  246. if ($term_type == "city"){
  247. $sql = "select DISTINCT location_code AS code from public.unlocode
  248. where location_code ilike '" . common::check_input($term) . "%'".$extend_sql_where;
  249. $sql .= " order by location_code limit 50";
  250. }
  251. $rs = common::excuteListSql($sql);
  252. //前端要加上id 从1开始
  253. $retData = array();
  254. foreach($rs as $key => $val){
  255. if(!empty($val['code'])){
  256. $retData[] = array("value" =>$val['code'] ,"label"=>$val['code']);
  257. }
  258. }
  259. common::echo_json_encode(200,$retData);
  260. exit();
  261. }
  262. }
  263. /**
  264. * destination_delivery 配置
  265. */
  266. public function destination_delivery_config(){
  267. $operate = utils::_get('operate');
  268. $operate = strtolower($operate);
  269. /**
  270. * 这个是嵌套在destination_delivery的配置查询,
  271. */
  272. if ($operate == "search"){
  273. $cp = common::check_input($_POST ['cp']); //current_page
  274. $ps = common::check_input($_POST ['ps']); //ps
  275. if (empty($ps))
  276. $ps = 100;
  277. if (empty($cp))
  278. $cp = 1;
  279. $rc = $_POST ['rc'];
  280. if ($rc == - 1) {
  281. $sql = "select count(*) from public.kln_destination_delivery_config";
  282. $rc = common::excuteOneSql($sql);
  283. }
  284. $tp = ceil($rc / $ps);
  285. if ($rc > 0) {
  286. $sql = "select * from public.kln_destination_delivery_config";
  287. $sql .= " order by id desc limit " . $ps . " offset " . ($cp - 1) * $ps;
  288. $rs = common::excuteListSql($sql);
  289. foreach($rs as $key => $val){
  290. $rs[$key]["_serial_no"] = common::deCode($val['serial_no'], 'E');
  291. }
  292. $arrTmp = array('searchData' => $rs,
  293. 'rc' => intval($rc),
  294. 'ps' => intval($ps),
  295. 'cp' => intval($cp),
  296. 'tp' => intval($tp));
  297. common::echo_json_encode(200,$arrTmp);
  298. exit();
  299. }else{
  300. $arrTmp = array('searchData' => array());
  301. common::echo_json_encode(200, $arrTmp);
  302. exit();
  303. }
  304. }
  305. if ($operate == "add"){
  306. $serial_no = common::deCode($_REQUEST['a'], 'D');
  307. $data = array();
  308. $rule = array();
  309. if (!empty($serial_no)){
  310. $sql = "select * from public.kln_destination_delivery_config where serial_no = '$serial_no'";
  311. $data = common::excuteObjectSql($sql);
  312. if ($data['recommended_delivery'] == 'Delivery_ETA_ATA') {
  313. $sql = "select * from public.kln_destination_delivery_rule where recommended_delivery_serial_no = '$serial_no'";
  314. $rule = common::excuteListSql($sql);
  315. }
  316. } else{
  317. //代表新加,页面初始
  318. $data['booking_window'] = "No_Restrictions";
  319. $data['booking_window_date_start'] ="";
  320. $data['booking_window_date_end'] ="";
  321. $data['recommended_delivery'] ="No_Recommended";
  322. }
  323. //处理组装返回格式
  324. //RcommendDeliveryDate
  325. $RecommendCheckedAirList = array();
  326. $RecommendCheckedSeaList = array();
  327. $RecommendCheckedList = array();
  328. foreach($rule as $item){
  329. if ($item['mode_type'] == 'sea'){
  330. $RecommendCheckedSeaList[] = array("priority"=>$item['priority'],"rule_type"=>$item['rule_type'],
  331. "ports"=>explode(",", $item['ports']),
  332. "carrier"=>explode(",", $item['carrier']),
  333. "recommended_delivery_from"=>$item['recommended_delivery_from'],
  334. "recommended_delivery_to"=>$item['recommended_delivery_to'],
  335. "mode_type"=>$item['mode_type']);
  336. }
  337. if ($item['mode_type'] == 'air'){
  338. $RecommendCheckedAirList[] = array("priority"=>$item['priority'],"rule_type"=>$item['rule_type'],
  339. "ports"=>explode(",", $item['ports']),
  340. "carrier"=>explode(",", $item['carrier']),
  341. "recommended_delivery_from"=>$item['recommended_delivery_from'],
  342. "recommended_delivery_to"=>$item['recommended_delivery_to'],
  343. "mode_type"=>$item['mode_type']);
  344. }
  345. if (!utils::in_array(ucfirst($item['mode_type']), $RecommendCheckedList)) {
  346. $RecommendCheckedList[] = ucfirst($item['mode_type']);
  347. }
  348. }
  349. $returnData = $data;
  350. $returnData["SetBookingWindow"] = array("windowradio" =>common::destination_delivery_window_radio($data['booking_window']),
  351. "windowBeforeDays"=>$data['booking_window_date_start'],
  352. "windowAfterDays"=>$data['booking_window_date_end']);
  353. $returnData["RcommendDeliveryDate"] = array("Recommendradio" =>common::destination_delivery_recommended($data['recommended_delivery']),
  354. "RecommendCheckedList"=>$RecommendCheckedList,
  355. "RecommendCheckedAirList"=>$RecommendCheckedAirList,
  356. "RecommendCheckedSeaList"=>$RecommendCheckedSeaList);
  357. $returnData["KLNPLCvalue"] = empty($data['kln_pic']) ? array() : explode(";", $data['kln_pic']);
  358. $CountryCheckedList = array();
  359. $sql = "select code from public.kerry_system_code
  360. where description='COUNTRY-STATION'
  361. and category = '".$data['country']."'
  362. and code NOT LIKE 'Online_%'";
  363. $rs = common::excuteListSql($sql);
  364. foreach($rs as $key => $val){
  365. if(!empty($val['code'])){
  366. $CountryCheckedList[] = array("value" =>$val['code'] ,"label"=>$val['code']);
  367. }
  368. }
  369. $returnData["CountryCheckedList"] = $CountryCheckedList;
  370. $returnData["station"] = explode(",", $returnData["station"]);
  371. $data = array('returnData' =>$returnData);
  372. common::echo_json_encode(200,$data);
  373. exit();
  374. }
  375. if ($operate == "save"){
  376. $serial_no = common::deCode($_POST['serial_no'], 'D');
  377. $country = common::check_input($_POST['country']);
  378. $station = empty($_POST['station']) ? "" : utils::implode(",",$_POST['station']);
  379. $booking_window = common::check_input($_POST['booking_window']);
  380. $booking_window_date_start = common::check_input($_POST['booking_window_date_start']);
  381. $booking_window_date_end = common::check_input($_POST['booking_window_date_end']);
  382. $recommended_delivery = common::check_input($_POST['recommended_delivery']);
  383. $kln_pic = $_POST['kln_pic'];
  384. $kln_pic = utils::implode(";",$kln_pic);
  385. $booking_window_desc = common::check_input($_POST['booking_window_desc']);
  386. $recommended_delivery_date_desc = common::check_input($_POST['recommended_delivery_date_desc']);
  387. //rule
  388. $_mode_type = $_POST['mode_type'];
  389. $_priority = $_POST['priority'];
  390. $_rule_type = $_POST['rule_type'];
  391. $_ports = $_POST['ports'];
  392. $_carrier = $_POST['carrier'];
  393. $_recommended_delivery_from = $_POST['recommended_delivery_from'];
  394. $_recommended_delivery_to = $_POST['recommended_delivery_to'];
  395. $sql = "";
  396. if (!empty($serial_no)){
  397. $updateSqlSet = " modify_by = '"._getLoginName()."',update_time = now()";
  398. if (!empty($country)) {
  399. $updateSqlSet.= ", country = '$country' ";
  400. }
  401. if (!empty($station)) {
  402. $updateSqlSet.= ", station = '$station' ";
  403. }
  404. if (!empty($booking_window)) {
  405. $updateSqlSet.= ", booking_window = '$booking_window' ";
  406. }
  407. if (!empty($booking_window_date_start)) {
  408. $updateSqlSet.= ", booking_window_date_start = '$booking_window_date_start' ";
  409. }
  410. if (!empty($booking_window_date_end)) {
  411. $updateSqlSet.= ", booking_window_date_end = '$booking_window_date_end' ";
  412. }
  413. if (!empty($recommended_delivery)) {
  414. $updateSqlSet.= ", recommended_delivery = '$recommended_delivery' ";
  415. }
  416. if (!empty($kln_pic)) {
  417. $updateSqlSet.= ", kln_pic = '$kln_pic' ";
  418. }
  419. if (!empty($booking_window_desc)) {
  420. $updateSqlSet.= ", booking_window_desc = '$booking_window_desc' ";
  421. }
  422. if (!empty($recommended_delivery_date_desc)) {
  423. $updateSqlSet.= ", recommended_delivery_date_desc = '$recommended_delivery_date_desc' ";
  424. }
  425. //代表update
  426. $sql .= "update public.kln_destination_delivery_config set ".$updateSqlSet."
  427. where serial_no = '$serial_no';";
  428. } else {
  429. //检查配置的站点是否于以前的配置的,是否重合
  430. $exist = common::excuteListSql("select country,station from public.kln_destination_delivery_config WHERE string_to_array('$station', ',') && string_to_array(station, ',')");
  431. if(!empty($exist)){
  432. $data = array("msg" =>"The station has been reconfigured. Please check ".$exist[0]['country'] ." - " .$exist[0]['station']);
  433. common::echo_json_encode(200,$data);
  434. exit();
  435. }
  436. //代表更新
  437. $serial_no = common::uuid();
  438. $sql .="INSERT INTO public.kln_destination_delivery_config(
  439. serial_no, country, station, booking_window, booking_window_date_start,
  440. booking_window_date_end, recommended_delivery, kln_pic, booking_window_desc,recommended_delivery_date_desc,
  441. create_by, created_time, modify_by, update_time)
  442. VALUES ('$serial_no', '$country', '$station', '$booking_window', '$booking_window_date_start',
  443. '$booking_window_date_end', '$recommended_delivery', '$kln_pic','$booking_window_desc','$recommended_delivery_date_desc',
  444. '"._getLoginName()."', now(), '"._getLoginName()."', now());";
  445. }
  446. $errmsg = "";
  447. //柜子是先删除,后添加
  448. $sql .= "delete from public.kln_destination_delivery_rule where recommended_delivery_serial_no = '$serial_no';";
  449. if ($recommended_delivery == "Delivery_ETA_ATA"){
  450. // 用于统计每种类型是否存在,以及是否满足 rule_type = 'all'
  451. $typeExists = ['air' => false, 'sea' => false];
  452. $typeHasAllRule = ['air' => false, 'sea' => false];
  453. //检查判断规则不能重合
  454. $seaRule = [];
  455. $airRule = [];
  456. foreach($_mode_type as $key => $v){
  457. $mode_type = $v;
  458. $priority = $_priority[$key];
  459. $rule_type = $_rule_type[$key];
  460. $ports = $_ports[$key];
  461. $carrier = $_carrier[$key];
  462. if( $mode_type == 'sea'){
  463. $seaRule[] = explode(",",$_ports[$key]);
  464. ///$sea_carrier_index += 1;
  465. } else {
  466. $airRule[] = explode(",",$_ports[$key]);
  467. }
  468. $recommended_delivery_from = $_recommended_delivery_from[$key];
  469. $recommended_delivery_to = $_recommended_delivery_to[$key];
  470. $sql .= "INSERT INTO public.kln_destination_delivery_rule(
  471. recommended_delivery_serial_no, mode_type, priority,
  472. rule_type, ports, carrier, recommended_delivery_from, recommended_delivery_to,
  473. create_by, created_time, modify_by, update_time)
  474. VALUES ('$serial_no', '$mode_type', '$priority',
  475. '$rule_type', '$ports', '$carrier', '$recommended_delivery_from', '$recommended_delivery_to',
  476. '"._getLoginName()."', now(), '"._getLoginName()."', now());";
  477. $typeExists[$mode_type] = true;
  478. if ($rule_type == '*Default Rule') {
  479. $typeHasAllRule[$mode_type] = true;
  480. }
  481. }
  482. // 检查缺失的 rule_type = 'all'
  483. $missingTypes = [];
  484. foreach (['air', 'sea'] as $type) {
  485. if ($typeExists[$type] && !$typeHasAllRule[$type]) {
  486. $missingTypes[] = $type;
  487. }
  488. }
  489. if (!empty($missingTypes)) {
  490. $errmsg = "The Default Rule must exist.";
  491. }
  492. //检查规则不能重复
  493. $errmsg .= common::checkOverlap($seaRule,"Sea Rule");
  494. $errmsg .= common::checkOverlap($airRule,"Air Rule");
  495. }
  496. if (empty($errmsg) && !empty($sql)){
  497. common::excuteUpdateSql($sql);
  498. $data = array("msg" =>"success");
  499. } else {
  500. $data = array("msg" =>$errmsg);
  501. }
  502. common::echo_json_encode(200,$data);
  503. exit();
  504. }
  505. if ($operate == "delete"){
  506. $serial_no = common::deCode($_POST['a'], 'D');
  507. $sql = "delete from public.kln_destination_delivery_config where serial_no = '$serial_no';";
  508. $sql .= "delete from public.kln_destination_delivery_rule where recommended_delivery_serial_no = '$serial_no';";
  509. error_log($sql);
  510. common::excuteUpdateSql($sql);
  511. $data = array("msg" =>"success");
  512. common::echo_json_encode(200,$data);
  513. exit();
  514. }
  515. }
  516. /**
  517. * booking
  518. */
  519. public function destination_delivery_booking(){
  520. $operate = utils::_get('operate');
  521. $operate = strtolower($operate);
  522. if ($operate == "destination_delivery_search") {
  523. //search
  524. //栏位信息
  525. $column = column::getInstance()->getDisplayColumn('Destination_Delivery_Search');
  526. $BookingTableColumns = column::getInstance()->tableColumns('Destination_Delivery_Search',$column);
  527. $data['TrackingTableColumns'] = $BookingTableColumns;
  528. common::echo_json_encode(200,$data);
  529. exit();
  530. }
  531. if ($operate == "destination_delivery_shipment_search") {
  532. //search
  533. //栏位信息
  534. $column = column::getInstance()->getDisplayColumn('destination_delivery_shipment_search');
  535. $BookingTableColumns = column::getInstance()->tableColumns('destination_delivery_shipment_search',$column);
  536. //Packing List 和 Commercial Invoice 顺序处理,以后自定义了可以移除这个函数
  537. $BookingTableColumns = common::destination_delivery_shipment_search_sort($BookingTableColumns);
  538. $data['TrackingTableColumns'] = $BookingTableColumns;
  539. common::echo_json_encode(200,$data);
  540. exit();
  541. }
  542. /**
  543. * select shipment,
  544. * Pending Approval Approve Reject Cancel Modify Submit
  545. */
  546. if ($operate == "search"){
  547. $cp = common::check_input($_POST ['cp']); //current_page
  548. $ps = common::check_input($_POST ['ps']); //ps
  549. if (empty($ps))
  550. $ps = 100;
  551. if (empty($cp))
  552. $cp = 1;
  553. $sqlWhere = ' where ' . common::searchExtendHand_KLN("ocean", $_SESSION["ONLINE_USER"]);
  554. //兜底规则
  555. $sqlWhere .= " and eta >= now() - INTERVAL '6 months' and eta <= now() + INTERVAL '6 months'";
  556. //代表employee
  557. $sqlDeliveryWhere = " 1=1";
  558. if(_isApexLogin()){
  559. //$sqlDeliveryWhere .= " and '".strtolower("CATHY.LEE@APEXSHIPPING.COM")."' = ANY(regexp_split_to_array(LOWER(kd.kln_pic), ','))";
  560. //$sqlDeliveryWhere .= " and '".strtolower(_getLoginEmployeeEamil())."' = ANY(regexp_split_to_array(LOWER(kd.kln_pic), ','))";
  561. }
  562. //条件带入
  563. $text_search = $_REQUEST['text_search'];
  564. if (!empty($text_search)){
  565. $sqlDeliveryWhere .= " and (lower(booking_no) like '%".strtolower($text_search)."%'
  566. or lower(h_bol) like '%".strtolower($text_search)."%'
  567. or lower(m_bol) like '%".strtolower($text_search)."%'
  568. or lower(ctnr) like '%".strtolower($text_search)."%'
  569. or lower(consignee) like '%".strtolower($text_search)."%')";
  570. }
  571. if (isset($_REQUEST['delivery_date_start']) && !empty($_REQUEST['delivery_date_start']))
  572. $sqlDeliveryWhere .= " and kd.delivery_date >= '" . common::usDate2sqlDate($_REQUEST['delivery_date_start']) . " 00:00:00'";
  573. if (isset($_REQUEST['delivery_date_end']) && !empty($_REQUEST['delivery_date_end']))
  574. $sqlDeliveryWhere .= " and kd.delivery_date <= '" . common::usDate2sqlDate($_REQUEST['delivery_date_end']) . " 23:59:59'";
  575. if(!empty($_POST['delivery_mode'])){
  576. $sqlDeliveryWhere .= " and kd.delivery_mode ='". common::check_input($_REQUEST['delivery_mode'])."'";
  577. }
  578. if (isset($_REQUEST['created_time_start']) && !empty($_REQUEST['created_time_start']))
  579. $sqlDeliveryWhere .= " and kd.created_time >= '" . common::usDate2sqlDate($_REQUEST['created_time_start']) . " 00:00:00'";
  580. if (isset($_REQUEST['created_time_end']) && !empty($_REQUEST['created_time_end']))
  581. $sqlDeliveryWhere .= " and kd.created_time <= '" . common::usDate2sqlDate($_REQUEST['created_time_end']) . " 23:59:59'";
  582. //移除filterTag
  583. //$sqlWhere_befrom_filterTag = $sqlWhere;
  584. $filterTag_param = "";
  585. if (!empty($_POST["filterTag"])) {
  586. if (utils::count($_POST['filterTag']) == 1){
  587. $filterTag = $_POST['filterTag'][0];
  588. }else{
  589. $filterTag = utils::implode(",", $_POST['filterTag']);
  590. }
  591. $filterTag_param = "1<>1";
  592. if(strtolower($filterTag) == "all"){
  593. $filterTag_param = "1=1";
  594. }
  595. if (stripos($filterTag, "Pending Approval") !== FALSE) {
  596. $filterTag_param .= " or (kd.status = 'Pending Approval')";
  597. }
  598. if (stripos($filterTag, "Approve") !== FALSE) {
  599. $filterTag_param .= " or (kd.status = 'Approve')";
  600. }
  601. if (stripos($filterTag, "Reject") !== FALSE) {
  602. $filterTag_param .= " or (kd.status = 'Reject')";
  603. }
  604. if (stripos($filterTag, "Cancel") !== FALSE) {
  605. $filterTag_param .= " or (kd.status = 'Cancel')";
  606. }
  607. if(strtolower($filterTag) <> "all" && !empty($filterTag)){
  608. $filterTag_param = " ($filterTag_param)";
  609. }
  610. }
  611. if(empty($filterTag_param)){
  612. $filterTag_param = "1=1";
  613. }
  614. $tag_and_mode_param = $filterTag_param;
  615. $rc = $_POST ['rc'];
  616. if ($rc == - 1 || true) {
  617. $sql = "select count(1) as rc,
  618. sum(case when $tag_and_mode_param then 1 else 0 end) as seach_rc,
  619. sum(case when kd.status ='Pending Approval' then 1 else 0 end) as pending_approval_rc,
  620. sum(case when kd.status ='Approve' then 1 else 0 end) as approved_rc,
  621. sum(case when kd.status ='Reject' then 1 else 0 end) as rejected_rc,
  622. sum(case when kd.status ='Cancel' then 1 else 0 end) as cancelled_rc
  623. from public.kln_destination_delivery kd
  624. where ".$sqlDeliveryWhere."
  625. and exists(select 1 from public.kln_ocean oo ". $sqlWhere." and oo.serial_no = any(kd.h_serial_no) limit 1)";
  626. error_log("kln_destination_delivery_count:".$sql);
  627. $statusRc = common::excuteObjectSql($sql);
  628. $rc = $statusRc['rc'];
  629. $search_rc = $statusRc['seach_rc'];
  630. $pending_approval_rc = $statusRc['pending_approval_rc'];
  631. $approved_rc = $statusRc['approved_rc'];
  632. $rejected_rc = $statusRc['rejected_rc'];
  633. $cancelled_rc = $statusRc['cancelled_rc'];
  634. }
  635. $tp = ceil($rc / $ps);
  636. if ($rc > 0) {
  637. $sql = "select *,to_char((recommended_delivery_window_date_from)::date, 'YYYY-MM-DD')
  638. || ';' ||
  639. to_char((recommended_delivery_window_date_to)::date, 'YYYY-MM-DD') AS date_range
  640. from public.kln_destination_delivery kd
  641. where ".$tag_and_mode_param."
  642. and ".$sqlDeliveryWhere."
  643. and exists(select 1 from public.kln_ocean oo ". $sqlWhere." and oo.serial_no = any(h_serial_no) limit 1)";
  644. $sql .= " order by id desc limit " . $ps . " offset " . ($cp - 1) * $ps;
  645. error_log("kln_destination_delivery_search:".$sql);
  646. $rs = common::excuteListSql($sql);
  647. foreach($rs as $key => $val){
  648. $rs[$key]["_serial_no"] = common::deCode($val['serial_no'], 'E');
  649. $rs[$key]["status"] = common::deliveryStatusConvert($val['status']);
  650. $rs[$key]["h_bol"] = json_decode($val['h_bol_multiple_link']);
  651. $rs[$key]["kln_pic"] = empty($val['kln_pic']) ? array() : explode(";", $val['kln_pic']);
  652. }
  653. $arrTmp = array('searchData' => $rs,
  654. 'is_employee' => _isApexLogin(),
  655. 'All' =>$rc,
  656. 'pending_approval_rc' =>$pending_approval_rc,
  657. 'approved_rc' =>$approved_rc,
  658. 'rejected_rc' =>$rejected_rc,
  659. 'cancelled_rc' =>$cancelled_rc,
  660. 'rc' => $search_rc,
  661. 'ps' => $ps,
  662. 'cp' => $cp,
  663. 'tp' => $tp);
  664. common::echo_json_encode(200,$arrTmp);
  665. exit();
  666. }else{
  667. $arrTmp = array('searchData' => array(),
  668. 'is_employee' => _isApexLogin(),
  669. 'All' =>$rc,
  670. 'pending_approval_rc' =>$pending_approval_rc,
  671. 'approved_rc' =>$approved_rc,
  672. 'rejected_rc' =>$rejected_rc,
  673. 'cancelled_rc' =>$cancelled_rc,
  674. 'rc' => $search_rc,
  675. 'ps' => $ps,
  676. 'cp' => $cp,
  677. 'tp' => $tp);
  678. common::echo_json_encode(200,$arrTmp);
  679. exit();
  680. }
  681. }
  682. if ($operate == "search_shipment"){
  683. $data = $this->search_shipment();
  684. if(!empty($data['msg'])){
  685. $arrTmp = array("msg" =>$data['msg']);
  686. }else{
  687. $arrTmp = array("msg" =>"success","data"=>$data['data']);
  688. }
  689. common::echo_json_encode(200, $arrTmp);
  690. exit();
  691. }
  692. if ($operate == "add"){
  693. $serial_no = common::deCode($_POST['serial_no'], 'D');
  694. //前端按钮 后台权限拦截
  695. if(!empty($serial_no)){
  696. common::checkedActionLegal($serial_no,$operate);
  697. }else{
  698. if(_isApexLogin()){
  699. $data = array("msg" =>"Employees cannot create booking");
  700. common::echo_json_encode(200,$data);
  701. exit();
  702. }
  703. }
  704. $booking_data = array();
  705. if(!empty($serial_no)){
  706. //to_char(delivery_date, 'MM/DD/YYYY') AS _delivery_date,
  707. $sql = "select *,
  708. to_char(delivery_date, 'HH24:MI') AS _delivery_time
  709. from public.kln_destination_delivery where serial_no = '$serial_no'";
  710. $booking_data = common::excuteObjectSql($sql);
  711. $booking_data["delivery_time"] = $booking_data["_delivery_time"];
  712. $booking_data["delivery_address_detail"] = json_decode($booking_data["delivery_address_detail"],true);
  713. $shipments = $this->search_shipment_with_booking($booking_data['serial_no'],$booking_data['h_serial_no'],$booking_data['ctnr']);
  714. } else {
  715. $shipments = $this->search_shipment();
  716. }
  717. if(!empty($shipments['msg'])){
  718. $data = array("msg" =>$shipments['msg']);
  719. common::echo_json_encode(200,$data);
  720. exit();
  721. }
  722. $booking_data['tableData'] = $shipments['data'];
  723. $data = array("msg" =>"success","data"=>$booking_data);
  724. common::echo_json_encode(200,$data);
  725. exit();
  726. }
  727. if ($operate == "save"){
  728. $serial_no = common::deCode($_POST['serial_no'], 'D');
  729. //DB2510210001-->DB+年+月+日+自增序號四位
  730. //获取自然序列
  731. $sequence = common::getDeliveryBookingSequence();
  732. $booking_no_new = "DB".date("ymd").$sequence;
  733. $booking_no = $_POST['booking_no'];
  734. $manifest_type = $_POST['manifest_type'];
  735. $h_bol = $_POST['h_bol'];
  736. $h_serial_no = $_POST['serial_no'];
  737. $order_from = $_POST['order_from'];
  738. $m_bol = $_POST['m_bol'];
  739. $ctnr = $_POST['ctnr'];
  740. $kln_pic = $_POST['dc_kln_pic'];
  741. $consignee = $_POST['consignee'];
  742. $consignee_id = $_POST['consignee_id'];
  743. $dc_country = $_POST['dc_country'];
  744. $recommended_delivery_window_date_from = $_POST['recommended_delivery_from_date'];
  745. $recommended_delivery_window_date_to = $_POST['recommended_delivery_to_date'];
  746. $recommended_delivery_from = $_POST['recommended_delivery_from'];
  747. $recommended_delivery_to = $_POST['recommended_delivery_to'];
  748. $modify_reason = common::check_input($_POST['modify_reason']);
  749. $delivery_date = $_POST['delivery_date'];
  750. $delivery_time = $_POST['delivery_time'];
  751. $delivery_mode = common::check_input($_POST['delivery_mode']);
  752. //这status 编辑只有两种情况,新加,和在拒绝后 用户重新编辑 状态都是Pending Approval
  753. $status = "Pending Approval";
  754. $is_new = false;
  755. if(empty($serial_no)){
  756. $is_new = true;
  757. }
  758. $delivery_address = common::check_input($_POST['delivery_address']);
  759. $special_requirements = common::check_input($_POST['special_requirements']);
  760. $delivery_reference = common::check_input($_POST['delivery_reference']);
  761. //检查不能重复添加booking 这里空运没问题,但是会遇到相同hbol 不同的柜子情况,本质上来说就是一条
  762. //$sqlWhere = ' where ' . common::searchExtendHand_KLN("ocean", $_SESSION["ONLINE_USER"]);
  763. //兜底规则
  764. //$sqlWhere .= " and eta >= now() - INTERVAL '6 months' and eta <= now() + INTERVAL '6 months'";
  765. //and exists(select 1 from public.kln_ocean oo ". $sqlWhere." and oo.serial_no = any(kde.h_serial_no) limit 1)
  766. $ckeckedSql = "with save_table as (
  767. select regexp_split_to_table('".utils::implode(',',$h_serial_no)."', ',') as serial_no
  768. ),
  769. save_table_ctnr as (
  770. select regexp_split_to_table('".utils::implode(',',$ctnr)."', ',') as ctnr
  771. )
  772. select h_bol,ctnr from public.kln_destination_delivery kde
  773. where status not in ('Cancel','Reject')
  774. and exists(select 1 from save_table where save_table.serial_no = any(kde.h_serial_no))
  775. and (exists(select 1 from save_table_ctnr where save_table_ctnr.ctnr = ANY(regexp_split_to_array(kde.ctnr, ','))
  776. or COALESCE(kde.ctnr,'') = ''))";
  777. //代表编辑
  778. if(!empty($serial_no)){
  779. $ckeckedSql .=" and kde.serial_no <> '$serial_no'";
  780. }
  781. $checkeData = common::excuteObjectSql($ckeckedSql);
  782. if(!empty($checkeData['h_bol'])){
  783. $data = array("msg" =>"The HBOL NO: ".$checkeData['h_bol'] .", Destination Delivery cannot be created repeatedly.");
  784. common::echo_json_encode(200,$data);
  785. exit();
  786. }
  787. $sql = "";
  788. //代表修改
  789. if(!empty($serial_no)){
  790. $updateSqlSet = " modify_by = '"._getLoginName()."',update_time = now()";
  791. if (!empty($status)) {
  792. $updateSqlSet.= ", status = '$status' ";
  793. }
  794. if (!empty($delivery_address)) {
  795. $delivery_address_detail = common::check_input(json_encode(common::returnDAddress(),JSON_UNESCAPED_UNICODE));
  796. $updateSqlSet.= ", delivery_address = '$delivery_address' ";
  797. $updateSqlSet.= ", delivery_address_detail = '$delivery_address_detail' ";
  798. }
  799. if (!empty($special_requirements)) {
  800. $updateSqlSet.= ", special_requirements = '$special_requirements' ";
  801. }
  802. if (!empty($delivery_reference)) {
  803. $updateSqlSet.= ", delivery_reference = '$delivery_reference' ";
  804. }
  805. if (!empty($modify_reason)) {
  806. $updateSqlSet.= ", modify_reason = '$modify_reason' ";
  807. }
  808. if (!empty($delivery_date)) {
  809. $delivery_date = empty($_POST['delivery_date']) ? "null": "'".common::usDate2sqlDate($_POST['delivery_date'])." ".$delivery_time."'";
  810. $updateSqlSet.= ", delivery_date = $delivery_date";
  811. }
  812. //修改记录临时表
  813. common::saveDAddressTempTable($serial_no,$consignee_id);
  814. //代表update
  815. $sql .= "update public.kln_destination_delivery set ".$updateSqlSet."
  816. where serial_no = '$serial_no';";
  817. //记录log
  818. $sql .="INSERT INTO public.kln_destination_delivery_operation_log(
  819. serial_no, action,notes, create_by, created_time, created_zone)
  820. VALUES ('$serial_no', 'Submit','".$modify_reason."', '"._getLoginName()."', now(), ''); ";
  821. } else {
  822. //array("msg"=>"","result"=>$result);
  823. $saveDataArr = $this->groupShipments($booking_no,$manifest_type,$h_bol,$h_serial_no,$order_from,$m_bol,$ctnr,$kln_pic,$consignee,$consignee_id,
  824. $recommended_delivery_window_date_from, $recommended_delivery_window_date_to,
  825. $recommended_delivery_from,$recommended_delivery_to,$dc_country);
  826. if(!empty($saveDataArr['msg'])){
  827. $data = array("msg" =>$saveDataArr['msg']);
  828. common::echo_json_encode(200,$data);
  829. exit();
  830. }
  831. $saveData = $saveDataArr['result'];
  832. foreach($saveData as $sData){
  833. $serial_no = common::uuid();
  834. // 使用 PostgreSQL 的 ARRAY 语法
  835. $tags_sql = "ARRAY['" . implode("','", array_map('pg_escape_string', $sData['h_serial_no'])) . "']";
  836. // 使用 PostgreSQL 的 ARRAY 语法
  837. $country_sql = "ARRAY['" . implode("','", array_map('pg_escape_string', $sData['dc_country'])) . "']";
  838. $recommended_delivery_window_date_from = "";
  839. if(empty($sData['recommended_delivery_window_date_from'])){
  840. $recommended_delivery_window_date_from = "null";
  841. } else {
  842. $recommended_delivery_window_date_from = "'".$sData['recommended_delivery_window_date_from']."'";
  843. }
  844. $recommended_delivery_window_date_to = "";
  845. if(empty($sData['recommended_delivery_window_date_to'])){
  846. $recommended_delivery_window_date_to = "null";
  847. } else {
  848. $recommended_delivery_window_date_to = "'".$sData['recommended_delivery_window_date_to']."'";
  849. }
  850. $delivery_date = empty($_POST['delivery_date']) ? "null": "'".common::usDate2sqlDate($_POST['delivery_date'])." ".$delivery_time."'";
  851. //修改记录临时表,有值代表选择的add
  852. $_sync_key_add = common::saveDAddressTempTable($serial_no,$sData['consignee_id']);
  853. $delivery_address_detail = common::check_input(json_encode(common::returnDAddress($_sync_key_add),JSON_UNESCAPED_UNICODE));
  854. $sql .= "INSERT INTO public.kln_destination_delivery(
  855. serial_no, h_serial_no,address_country,
  856. booking_no, h_bol,h_bol_multiple_link,
  857. m_bol, ctnr,
  858. consignee, delivery_date, delivery_mode, status, delivery_address,delivery_address_detail, special_requirements,delivery_reference,
  859. recommended_delivery_window_date_from, recommended_delivery_window_date_to, d_address_change_log,
  860. recommended_delivery_from, recommended_delivery_to,kln_pic,
  861. create_by, created_time, modify_by, update_time)
  862. VALUES ('$serial_no', ".$tags_sql.",".$country_sql.",
  863. '".$booking_no_new."', '".utils::implode(',',$sData['h_bol'])."','".common::check_input(json_encode($sData['h_bol_multiple_link']))."',
  864. '".utils::implode(',',$sData['m_bol'])."', '".utils::implode(',',$sData['ctnr'])."',
  865. '".$sData['consignee']."', $delivery_date,'$delivery_mode','$status', '$delivery_address','$delivery_address_detail', '$special_requirements','$delivery_reference',
  866. $recommended_delivery_window_date_from, $recommended_delivery_window_date_to,'',
  867. '".$sData['recommended_delivery_from']."', '".$sData['recommended_delivery_to']."','".$sData['kln_pic']."',
  868. '"._getLoginName()."', now(), '"._getLoginName()."', now());";
  869. //记录log
  870. $sql .="INSERT INTO public.kln_destination_delivery_operation_log(
  871. serial_no, action,notes, create_by, created_time, created_zone)
  872. VALUES ('$serial_no', 'Submit','', '"._getLoginName()."', now(), ''); ";
  873. }
  874. }
  875. if(!empty($sql)){
  876. $rs = common::excuteUpdateSql($sql);
  877. if ($rs === FALSE){
  878. $data = array("msg" =>"error");
  879. common::echo_json_encode(200,$data);
  880. exit();
  881. }
  882. }
  883. if(!$is_new){
  884. //状态变更时,发送邮件提醒
  885. $status = "Modify";
  886. $data = common::excuteObjectSql("select *, TO_CHAR(delivery_date, 'Mon-DD-YYYY') as _delivery_date,
  887. TO_CHAR(created_time, 'Mon-DD-YYYY') as _created_time,
  888. TO_CHAR(update_time, 'Mon-DD-YYYY') as _update_time
  889. from public.kln_destination_delivery where serial_no = '$serial_no'");
  890. $shipmentsData = $this->search_shipment_with_booking($data['serial_no'],$data['h_serial_no'],$data['ctnr']);
  891. $email_sql = common::sendDestinationDeliveryReminder($data,$shipmentsData,$status);
  892. if(!empty($email_sql)){
  893. common::excuteUpdateSql($email_sql);
  894. }
  895. } else {
  896. $status = "Submit";
  897. $data = common::excuteObjectSql("select *, TO_CHAR(delivery_date, 'Mon-DD-YYYY') as _delivery_date,
  898. TO_CHAR(created_time, 'Mon-DD-YYYY') as _created_time,
  899. TO_CHAR(update_time, 'Mon-DD-YYYY') as _update_time
  900. from public.kln_destination_delivery where serial_no = '$serial_no'");
  901. $shipmentsData = $this->search_shipment_with_booking($data['serial_no'],$data['h_serial_no'],$data['ctnr']);
  902. $email_sql = common::sendDestinationDeliveryReminder($data,$shipmentsData,$status);
  903. if(!empty($email_sql)){
  904. common::excuteUpdateSql($email_sql);
  905. }
  906. }
  907. $data = array("msg" =>"success");
  908. common::echo_json_encode(200,$data);
  909. exit();
  910. }
  911. /**
  912. * 审核 Approve or Reject Cancel Pending Approval
  913. */
  914. if ($operate == "review"){
  915. $serial_no = common::deCode($_POST['serial_no'], 'D');
  916. $status = common::check_input($_POST['status']);
  917. $notes = common::check_input($_POST['notes']);
  918. $action_user = _getLoginName();
  919. //前端按钮 后台权限拦截
  920. common::checkedActionLegal($serial_no,$operate);
  921. global $db;
  922. $db->StartTrans();
  923. try {
  924. $sql = "";
  925. //审核通过时,才取下放当时应用修改的地址
  926. if ($status == "Approve") {
  927. $delivery_booking = common::excuteObjectSql("select *,array_to_json(address_country) as address_country,
  928. array_to_json(h_serial_no) as h_serial_no_json,
  929. TO_CHAR( delivery_date, 'HH24:MI') AS _delivery_time,
  930. delivery_date::date AS _delivery_date
  931. from public.kln_destination_delivery where serial_no = '$serial_no'");
  932. $delivery_address_detail = json_decode($delivery_booking["delivery_address_detail"],true);
  933. $onine_address = common::excuteListSql("select * from public.contacts_address_online
  934. where (delivery_serial_no = '$serial_no' or sync_key = '".$delivery_address_detail['sync_key']."')");
  935. //$sql .= "delete from public.contacts_address_online where delivery_serial_no = '$serial_no';";
  936. $sql .=common::returnDAddressRecord($delivery_booking["address_country"],$onine_address,$delivery_address_detail);
  937. //Booking自動同步到Ksmart WO 的逻辑 保存在do_header和do_details表里
  938. common::saveWorkOrder($delivery_booking);
  939. }
  940. if ($status == "Reject" || $status == "Cancel") {
  941. //这种情况,清除当前用户对这一票的修改和添加的信息
  942. $sql .= "delete from public.contacts_address_online where delivery_serial_no = '$serial_no';";
  943. }
  944. $sql .= "update public.kln_destination_delivery set status = '$status', modify_by = '"._getLoginName()."',update_time = now() where serial_no = '$serial_no';";
  945. $sql .= "INSERT INTO public.kln_destination_delivery_operation_log(
  946. serial_no, action,notes, create_by, created_time, created_zone)
  947. VALUES ('$serial_no', '$status','$notes', '$action_user', now(), ''); ";
  948. $db->Execute($sql) or ((!$db->ErrorMsg()) or error_log(common::dbLog($db, $sql), 0));
  949. $rs = $db->CompleteTrans();
  950. } catch (Exception $e) {
  951. $db->RollbackTrans();
  952. }
  953. if ($rs === FALSE){
  954. $data = array("msg" => "Update Error");
  955. common::echo_json_encode(200,$data);
  956. } else{
  957. //状态变更时,发送邮件提醒
  958. $data = common::excuteObjectSql("select *,
  959. TO_CHAR(delivery_date, 'Mon-DD-YYYY') as _delivery_date,
  960. TO_CHAR(created_time, 'Mon-DD-YYYY') as _created_time,
  961. TO_CHAR(update_time, 'Mon-DD-YYYY') as _update_time
  962. from public.kln_destination_delivery where serial_no = '$serial_no'");
  963. $shipmentsData = $this->search_shipment_with_booking($data['serial_no'],$data['h_serial_no'],$data['ctnr']);
  964. $email_sql = common::sendDestinationDeliveryReminder($data,$shipmentsData,$status);
  965. if(!empty($email_sql)){
  966. common::excuteUpdateSql($email_sql);
  967. }
  968. $data = array("msg" =>"success");
  969. common::echo_json_encode(200,$data);
  970. }
  971. }
  972. /**
  973. * 邮件留言初始
  974. */
  975. if ($operate == "email_message_init"){
  976. try {
  977. $email_uuid = common::deCode($_POST['serial_no'], 'D');
  978. $emailRecords = $this->getCommunicationNew($email_uuid);
  979. common::echo_json_encode(200,array("msg" => "Sent Successfully", "emailRecords" => $emailRecords));
  980. exit();
  981. } catch (Exception $e) {
  982. common::echo_json_encode(500,array("msg" => "Sent Error."));
  983. exit();
  984. }
  985. }
  986. /**
  987. * 邮件留言
  988. */
  989. if ($operate == "email_message_board"){
  990. //前端按钮 后台权限拦截
  991. $email_uuid = common::deCode($_POST['serial_no'], 'D');
  992. common::checkedActionLegal($email_uuid,$operate);
  993. try {
  994. $content = $_POST["content"];
  995. $content = common::check_input($content);
  996. $content = urldecode($content);
  997. $text = $_POST["text"];
  998. $web_content = urldecode($text);
  999. $serial_no = common::uuid();
  1000. $email_uuid = common::deCode($_POST['serial_no'], 'D');
  1001. $add_by = _getLoginName();
  1002. $refer_id = 0;
  1003. $from_email = "US.KApex.Online@kerryapex.com";
  1004. $to_email = $_POST["kln_pic"];
  1005. $cc_email = "";
  1006. $communication_cc = $_POST["communication_cc"];
  1007. $communication_cc = trim($communication_cc);
  1008. if (!empty($communication_cc)) {
  1009. $communication_cc = common::check_input($communication_cc);
  1010. $cc_email = $communication_cc;
  1011. }
  1012. $user_from = _getLoginName();
  1013. $h_bol_str = array();
  1014. foreach($_POST["h_bol"] as $obj){
  1015. $h_bol_str[] = $obj['key'];
  1016. }
  1017. //邮件发送
  1018. $title = "Destination Delivery from " . _getLoginName() . ", Shipment No: " . utils::implode(',',$h_bol_str);
  1019. $emailContent = $content;
  1020. common::excuteUpdateSql("insert into public.email_record (type,title,from_email,to_email,cc_email,content,insert_date)values('Delivery_Comm','$title','$from_email','$to_email','$cc_email','$emailContent',now());");
  1021. $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)
  1022. VALUES ('$serial_no', '$email_uuid', '$emailContent','$web_content', '$user_from', '$to_email', '$cc_email', $refer_id, '$add_by', now(), '$communication_cc');");
  1023. $emailRecords = $this->getCommunicationNew($email_uuid);
  1024. common::echo_json_encode(200,array("msg" => "Sent Successfully", "emailRecords" => $emailRecords));
  1025. exit();
  1026. } catch (Exception $e) {
  1027. common::echo_json_encode(500,array("msg" => "Sent Error."));
  1028. exit();
  1029. }
  1030. }
  1031. /**
  1032. * view detail and log
  1033. */
  1034. if ($operate == "view_detail"){
  1035. $serial_no = common::deCode($_POST['serial_no'], 'D');
  1036. //前端按钮 后台权限拦截
  1037. common::checkedActionLegal($serial_no,$operate);
  1038. $data = common::excuteObjectSql("select * from public.kln_destination_delivery where serial_no = '$serial_no'");
  1039. $_shipmentsData = array();
  1040. $shipmentsData = $this->search_shipment_with_booking($data['serial_no'],$data['h_serial_no'],$data['ctnr']);
  1041. foreach($shipmentsData["data"] as $shipment){
  1042. $_shipmentsData[] = array("HBOL No." => $shipment['h_bol'],"Container No." => $shipment['ctnr'],
  1043. "Service Type" => $shipment['service'],"ETA" => $shipment['eta'],
  1044. "Recommended Delivery Date" => $shipment['date_range']);
  1045. }
  1046. $_operation_log = array();
  1047. $operation_log = common::excuteListSql("select * from public.kln_destination_delivery_operation_log where serial_no = '$serial_no' order by id desc");
  1048. foreach($operation_log as $log){
  1049. $action = $log['action'] == "Pending Approval" ? "Submit" : $log['action'];
  1050. $_operation_log[] = array("time" => $log['created_time'],"timezone" => $log['created_zone'],
  1051. "label" => $action,"createdBy" => $log['create_by'],
  1052. "tips" => $log['notes']);
  1053. }
  1054. $retData = $data;
  1055. $retData["status"] = common::deliveryStatusConvert($retData["status"]);
  1056. $retData['shipmentsData'] = $_shipmentsData;
  1057. $retData['operation_log'] = $_operation_log;
  1058. $data = array("msg" =>"success","data"=>$retData);
  1059. common::echo_json_encode(200,$data);
  1060. exit();
  1061. }
  1062. /**
  1063. * Delivery date
  1064. */
  1065. if ($operate == "delivery_date_load"){
  1066. $sqlWhere = ' where ' . common::searchExtendHand_KLN("ocean", $_SESSION["ONLINE_USER"]);
  1067. //兜底规则
  1068. $sqlWhere .= " and eta >= now() - INTERVAL '6 months' and eta <= now() + INTERVAL '6 months'";
  1069. $sqlDeliveryWhere = " 1=1";
  1070. //$sqlWhere_befrom_filterTag = $sqlWhere;
  1071. $sql = "select delivery_date::date as delivery_date,
  1072. sum(case when status ='Pending Approval' then 1 else 0 end) as pending_approval_rc,
  1073. sum(case when status ='Approve' then 1 else 0 end) as approved_rc
  1074. from public.kln_destination_delivery kd
  1075. where ".$sqlDeliveryWhere."
  1076. and exists(select 1 from public.kln_ocean oo ". $sqlWhere." and oo.serial_no = any(h_serial_no) limit 1)
  1077. group by delivery_date::date order by delivery_date::date desc";
  1078. $rs = common::excuteListSql($sql);
  1079. error_log("delivery_date_load:".$sql);
  1080. $dateArr = new stdClass();
  1081. foreach($rs as $val){
  1082. //$dateArr[] = array($val['delivery_date'] => array("pending"=>$val['pending_approval_rc'],"approved"=>$val['approved_rc']));
  1083. $dateArr->{$val['delivery_date']} = new stdClass();
  1084. $dateArr->{$val['delivery_date']}->pending = $val['pending_approval_rc'];
  1085. $dateArr->{$val['delivery_date']}->approved = $val['approved_rc'];
  1086. }
  1087. $data = array("msg" =>"success","data"=>$dateArr);
  1088. common::echo_json_encode(200,$data);
  1089. }
  1090. /*
  1091. * download batch P AND CI document
  1092. */
  1093. if ($operate == "batch_download_ci_p_file") {
  1094. $this->_batch_download_ci_p_file();
  1095. }
  1096. }
  1097. private function getCommunicationNew($serial_no) {
  1098. $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");
  1099. $emialRecords =array();
  1100. foreach ($list as $k => $v) {
  1101. $msg =array();
  1102. $msg["name"] = $v["add_by"];
  1103. $msg["creatTime"] = $v["add_times"];
  1104. $msg["content"] = urldecode($v["web_content"]);
  1105. $emialRecords[] = $msg;
  1106. }
  1107. return $emialRecords;
  1108. }
  1109. function search_shipment(){
  1110. $sqlWhere_common = ' where ' . common::searchExtendHand_KLN("ocean", $_SESSION["ONLINE_USER"]);
  1111. //根據用戶的賬號權限所能看到的全部shipment數據的目的地站點,去匹配是否有開通destination delivery的服務,如果未開通,則展示此提示頁面
  1112. //兜底规则
  1113. $sqlWhere = $sqlWhere_common;
  1114. $sqlWhere .= " and eta >= now() - INTERVAL '6 months' and eta <= now() + INTERVAL '6 months'";
  1115. $checkOpenSql = "select station from public.kln_destination_delivery_config dc
  1116. where exists(select 1 from
  1117. public.kln_ocean oo ". $sqlWhere."
  1118. and oo.agent in (select regexp_split_to_table(dc.station, E',')) limit 1
  1119. )";
  1120. $config = common::excuteListSql($checkOpenSql);
  1121. if(empty($config)){
  1122. return array("msg"=>"Destination Delivery Service Not Available","data"=>"");
  1123. }
  1124. //根據用戶的賬號權限所能看到的全部shipment數據的目的地站點,去匹配是否有開通destination delivery的服務,如果有開通,但沒有符合條件的shipment,則展示此提示頁面
  1125. $sqlWhere = $sqlWhere_common;
  1126. $sqlWhere .= " and eta >= now() - INTERVAL '6 months' and eta <= now() + INTERVAL '6 months'";
  1127. $text_search = $_REQUEST['text_search'];
  1128. if (!empty($text_search)){
  1129. $sqlWhere .= " and (lower(oo.h_bol) like '%".strtolower($text_search)."%'
  1130. or lower(oo.po_no) like '%".strtolower($text_search)."%'
  1131. or lower(oo.ctnrs) like '%".strtolower($text_search)."%')";
  1132. }
  1133. //vessel name
  1134. $vessel = $_REQUEST['vessel'];
  1135. if (!empty($vessel)){
  1136. $sqlWhere .= " and lower(vessel) like '%".strtolower($vessel)."%'";
  1137. }
  1138. $consignee = $_REQUEST['consignee'];
  1139. if (!empty($consignee)){
  1140. $sqlWhere .= " and lower(consignee) like '%".strtolower($consignee)."%'";
  1141. }
  1142. $shipper = $_REQUEST['shipper'];
  1143. if (!empty($shipper)){
  1144. $sqlWhere .= " and lower(shipper) like '%".strtolower($shipper)."%'";
  1145. }
  1146. if (isset($_REQUEST['eta_start']) && !empty($_REQUEST['eta_start']))
  1147. $sqlWhere .= " and eta >= '" . common::usDate2sqlDate($_REQUEST['eta_start']) . " 00:00:00'";
  1148. if (isset($_REQUEST['eta_end']) && !empty($_REQUEST['eta_end']))
  1149. $sqlWhere .= " and eta <= '" . common::usDate2sqlDate($_REQUEST['eta_end']) . " 23:59:59'";
  1150. if (isset($_REQUEST['ata_start']) && !empty($_REQUEST['ata_start']))
  1151. $sqlWhere .= " and ata >= '" . common::usDate2sqlDate($_REQUEST['ata_start']) . " 00:00:00'";
  1152. if (isset($_REQUEST['ata_end']) && !empty($_REQUEST['ata_end']))
  1153. $sqlWhere .= " and ata <= '" . common::usDate2sqlDate($_REQUEST['ata_end']) . " 23:59:59'";
  1154. $recommended_delivery_sql = ' 1=1 ';
  1155. if (isset($_REQUEST['recommended_delivery_date']) && !empty($_REQUEST['recommended_delivery_date']))
  1156. $recommended_delivery_sql .= " and ((recommended_delivery_from_date is not null and recommended_delivery_from_date <= '" . common::usDate2sqlDate($_REQUEST['recommended_delivery_date']) . " 00:00:00')
  1157. OR
  1158. recommended_delivery_from_date is null)";
  1159. if (isset($_REQUEST['recommended_delivery_date']) && !empty($_REQUEST['recommended_delivery_date']))
  1160. $recommended_delivery_sql .= " and ((recommended_delivery_to_date is not null and recommended_delivery_to_date >= '" . common::usDate2sqlDate($_REQUEST['recommended_delivery_date']) . " 00:00:00')
  1161. OR
  1162. recommended_delivery_to_date is null)";
  1163. $sql = "with oo as(
  1164. select oo.serial_no,
  1165. oo.h_bol,
  1166. oo.m_bol,
  1167. oo.service,
  1168. oo.po_no,
  1169. oo.transport_mode,
  1170. oo.qty,
  1171. oo.qty_uom,
  1172. oo.piece_count,
  1173. oo.cbm,
  1174. oo.vessel,
  1175. oo.voyage,
  1176. oo.carrier,
  1177. oo.fport_of_loading_un,
  1178. oo.mport_of_discharge_un,
  1179. oo.eta,
  1180. oo.ata,
  1181. oo.etd,
  1182. oo.atd,
  1183. oo.shipper,
  1184. oo.consignee_id,
  1185. oo.consignee,
  1186. oo.booking_no,
  1187. oo.agent,
  1188. oo.order_from
  1189. from public.kln_ocean oo ". $sqlWhere ."
  1190. ),
  1191. -- 2. 预解析station字段
  1192. station_list AS (
  1193. SELECT
  1194. serial_no,
  1195. country,
  1196. kln_pic,
  1197. booking_window,
  1198. booking_window_date_start,
  1199. booking_window_date_end,
  1200. unnest(string_to_array(station, ',')) as station_code
  1201. FROM public.kln_destination_delivery_config
  1202. ),
  1203. ooc as (
  1204. select oo.*,
  1205. dc.serial_no as dc_serial_no,
  1206. dc.country as dc_country,
  1207. dc.kln_pic as dc_kln_pic
  1208. from station_list dc
  1209. Inner Join oo
  1210. on oo.agent = dc.station_code
  1211. where 1=1 and
  1212. case when dc.booking_window = 'Restrictions_ETD_ATD' and COALESCE(dc.booking_window_date_start,'')<>'' and COALESCE(dc.booking_window_date_end,'')<>''
  1213. then COALESCE(atd, etd) >= (NOW() - (dc.booking_window_date_start ||' days')::INTERVAL)::date and COALESCE(atd, etd) <= (NOW() + (dc.booking_window_date_end ||' days')::INTERVAL)::date
  1214. when dc.booking_window = 'Restrictions_ETA_ATA' and COALESCE(dc.booking_window_date_start,'')<>'' and COALESCE(dc.booking_window_date_end,'')<>''
  1215. then COALESCE(ata, eta) >= (NOW() - (dc.booking_window_date_start ||' days')::INTERVAL)::date and COALESCE(ata, eta) <= (NOW() + (dc.booking_window_date_end ||' days')::INTERVAL)::date
  1216. else 1=1 end
  1217. ),
  1218. matched_data as (
  1219. select
  1220. ooc.serial_no,
  1221. ooc.h_bol,
  1222. ooc.m_bol,
  1223. oc.ctnr,
  1224. ooc.service,
  1225. ooc.po_no,
  1226. (select reference_no from public.ocean o where o.serial_no = ooc.serial_no limit 1) as reference_no,
  1227. ooc.transport_mode,
  1228. oc.qty::text as pakages,
  1229. oc.unit as package_type ,
  1230. oc.grs_kgs::text as kgw,
  1231. oc.cbm as volume,
  1232. ooc.vessel,
  1233. ooc.voyage,
  1234. ooc.carrier,
  1235. ooc.fport_of_loading_un,
  1236. ooc.mport_of_discharge_un,
  1237. ooc.eta,
  1238. ooc.ata,
  1239. ooc.shipper,
  1240. ooc.consignee_id,
  1241. ooc.consignee,
  1242. ooc.booking_no,
  1243. (select manifest_type from public.ocean o where o.serial_no = ooc.serial_no limit 1) as manifest_type,
  1244. dc_serial_no,
  1245. dc_country,
  1246. dc_kln_pic,
  1247. ooc.agent,
  1248. ooc.order_from
  1249. from ooc
  1250. LEFT JOIN public.oc_container oc ON oc.serial_no::text = ooc.serial_no::text
  1251. where ooc.order_from = 'public' and transport_mode = 'sea'
  1252. union all
  1253. select
  1254. ooc.serial_no,
  1255. ooc.h_bol,
  1256. ooc.m_bol,
  1257. oc.ctnr,
  1258. ooc.service,
  1259. ooc.po_no,
  1260. (select reference_no from sfs.ocean o where o.serial_no = ooc.serial_no limit 1) as reference_no,
  1261. ooc.transport_mode,
  1262. oc.qty::text as pakages,
  1263. oc.unit as package_type ,
  1264. oc.grs_kgs::text as kgw,
  1265. oc.cbm as volume,
  1266. ooc.vessel,
  1267. ooc.voyage,
  1268. ooc.carrier,
  1269. ooc.fport_of_loading_un,
  1270. ooc.mport_of_discharge_un,
  1271. ooc.eta,
  1272. ooc.ata,
  1273. ooc.shipper,
  1274. ooc.consignee_id,
  1275. ooc.consignee,
  1276. ooc.booking_no,
  1277. (select manifest_type from sfs.ocean o where o.serial_no = ooc.serial_no limit 1) as manifest_type,
  1278. dc_serial_no,
  1279. dc_country,
  1280. dc_kln_pic,
  1281. ooc.agent,
  1282. ooc.order_from
  1283. from ooc
  1284. LEFT JOIN sfs.oc_container oc ON oc.serial_no::text = ooc.serial_no::text
  1285. where ooc.order_from = 'sfs' and transport_mode = 'sea'
  1286. union all
  1287. select
  1288. ooc.serial_no,
  1289. ooc.h_bol,
  1290. ooc.m_bol,
  1291. '' as ctnr,
  1292. ooc.service,
  1293. ooc.po_no,
  1294. '' as reference_no,
  1295. ooc.transport_mode,
  1296. ooc.qty as pakages,
  1297. ooc.qty_uom as package_type ,
  1298. ooc.piece_count as kgw,
  1299. ooc.cbm as volume,
  1300. ooc.vessel,
  1301. ooc.voyage,
  1302. ooc.carrier,
  1303. ooc.fport_of_loading_un,
  1304. ooc.mport_of_discharge_un,
  1305. ooc.eta,
  1306. ooc.ata,
  1307. ooc.shipper,
  1308. ooc.consignee_id,
  1309. ooc.consignee,
  1310. ooc.booking_no,
  1311. '' as manifest_type,
  1312. dc_serial_no,
  1313. dc_country,
  1314. dc_kln_pic,
  1315. ooc.agent,
  1316. ooc.order_from
  1317. from ooc
  1318. where ooc.transport_mode = 'air'
  1319. ),
  1320. shipment_table as(
  1321. select md.*,
  1322. CASE
  1323. WHEN md.manifest_type = 'BCN' THEN (select string_agg(trim(COALESCE(h_bol,'')), ';'::text ORDER BY h_bol) from public.kln_ocean where m_bol = md.m_bol)
  1324. ELSE '' END
  1325. As same_mbol,
  1326. CASE
  1327. WHEN r.recommended_delivery_from IS NOT NULL AND r.recommended_delivery_to IS NOT NULL THEN
  1328. to_char((COALESCE(ata, eta) + (r.recommended_delivery_from ||' days')::INTERVAL)::date, 'YYYY.MM.DD')
  1329. || '-' ||
  1330. to_char((COALESCE(ata, eta) + (r.recommended_delivery_to ||' days')::INTERVAL)::date, 'YYYY.MM.DD')
  1331. WHEN r.recommended_delivery_from IS NULL AND r.recommended_delivery_to IS NOT NULL THEN
  1332. '-' ||
  1333. to_char((COALESCE(ata, eta) + (r.recommended_delivery_to || ' days')::INTERVAL)::date, 'YYYY.MM.DD')
  1334. WHEN r.recommended_delivery_from IS NOT NULL AND r.recommended_delivery_to IS NULL THEN
  1335. to_char((COALESCE(ata, eta) + (r.recommended_delivery_from || ' days')::INTERVAL)::date, 'YYYY.MM.DD')
  1336. || '-'
  1337. ELSE '' END
  1338. AS date_range,
  1339. r.recommended_delivery_from,
  1340. r.recommended_delivery_to,
  1341. CASE
  1342. WHEN r.recommended_delivery_from IS NOT NULL THEN
  1343. (COALESCE(ata, eta) + (r.recommended_delivery_from ||' days')::INTERVAL)::date
  1344. ELSE null END
  1345. AS recommended_delivery_from_date,
  1346. CASE
  1347. WHEN r.recommended_delivery_to IS NOT NULL THEN
  1348. (COALESCE(ata, eta) + (r.recommended_delivery_to ||' days')::INTERVAL)::date
  1349. ELSE null END
  1350. AS recommended_delivery_to_date
  1351. from matched_data md
  1352. LEFT JOIN LATERAL (
  1353. SELECT
  1354. r.*
  1355. FROM public.kln_destination_delivery_rule r
  1356. WHERE md.transport_mode = r.mode_type
  1357. and r.recommended_delivery_serial_no = md.dc_serial_no
  1358. AND ((md.transport_mode = 'sea' AND (
  1359. (r.ports ilike '%'|| md.mport_of_discharge_un ||'%' AND r.carrier ilike '%'|| md.carrier ||'%')
  1360. OR (r.ports ilike '%'|| md.mport_of_discharge_un ||'%' AND r.carrier = 'ALL')
  1361. OR (r.ports = 'ALL' AND r.carrier ilike '%'|| md.carrier ||'%')
  1362. OR (r.ports = 'ALL' AND r.carrier = 'ALL'))
  1363. )
  1364. OR (md.transport_mode = 'air' AND (
  1365. r.ports ilike '%'|| md.mport_of_discharge_un ||'%'
  1366. OR r.ports = 'ALL')
  1367. )
  1368. )
  1369. ORDER BY priority asc
  1370. LIMIT 1
  1371. ) r ON true
  1372. order by md.eta desc,md.h_bol asc
  1373. )
  1374. select * from shipment_table where ".$recommended_delivery_sql;
  1375. $rs = common::excuteListSql($sql);
  1376. error_log($sql);
  1377. if(empty($rs)){
  1378. return array("msg"=>"No Eligible Shipments for Booking","data"=>"");
  1379. }
  1380. return array("msg"=>"","data"=>$rs);
  1381. }
  1382. /**
  1383. * 不依赖配置的规则查询,如果规则已经移除或者修改不在查询范围内,開通期間創建的booking數據正常保留和展示
  1384. */
  1385. function search_shipment_with_booking($serial_no,$h_serial_no,$ctnr){
  1386. $sqlCtnr = "";
  1387. if(!empty($ctnr)){
  1388. $sqlCtnr = "and oc.ctnr in (select regexp_split_to_table('".$ctnr."', ','))";
  1389. }
  1390. $sqlWhere = "where oo.serial_no = ANY('".$h_serial_no."'::TEXT[])";
  1391. $sql = "with ooc as(
  1392. select * from public.kln_ocean oo ". $sqlWhere ."
  1393. ),
  1394. matched_data as (
  1395. select
  1396. ooc.serial_no,
  1397. ooc.h_bol,
  1398. ooc.m_bol,
  1399. oc.ctnr,
  1400. ooc.service,
  1401. ooc.po_no,
  1402. (select reference_no from public.ocean o where o.serial_no = ooc.serial_no limit 1) as reference_no,
  1403. ooc.transport_mode,
  1404. oc.qty::text as pakages,
  1405. oc.unit as package_type ,
  1406. oc.grs_kgs::text as kgw,
  1407. oc.cbm as volume,
  1408. ooc.vessel,
  1409. ooc.voyage,
  1410. ooc.carrier,
  1411. ooc.fport_of_loading_un,
  1412. ooc.mport_of_discharge_un,
  1413. ooc.eta,
  1414. ooc.ata,
  1415. ooc.shipper,
  1416. ooc.consignee_id,
  1417. ooc.consignee,
  1418. (select customer_name from public.ocean_extend ex where ex.serial_no = ooc.serial_no limit 1) as controlling_customer,
  1419. ooc.booking_no,
  1420. (select manifest_type from public.ocean o where o.serial_no = ooc.serial_no limit 1) as manifest_type,
  1421. ooc.agent,
  1422. ooc.order_from
  1423. from ooc
  1424. LEFT JOIN public.oc_container oc ON oc.serial_no::text = ooc.serial_no::text
  1425. where ooc.order_from = 'public' and transport_mode = 'sea' ".$sqlCtnr."
  1426. union all
  1427. select
  1428. ooc.serial_no,
  1429. ooc.h_bol,
  1430. ooc.m_bol,
  1431. oc.ctnr,
  1432. ooc.service,
  1433. ooc.po_no,
  1434. (select reference_no from sfs.ocean o where o.serial_no = ooc.serial_no limit 1) as reference_no,
  1435. ooc.transport_mode,
  1436. oc.qty::text as pakages,
  1437. oc.unit as package_type ,
  1438. oc.grs_kgs::text as kgw,
  1439. oc.cbm as volume,
  1440. ooc.vessel,
  1441. ooc.voyage,
  1442. ooc.carrier,
  1443. ooc.fport_of_loading_un,
  1444. ooc.mport_of_discharge_un,
  1445. ooc.eta,
  1446. ooc.ata,
  1447. ooc.shipper,
  1448. ooc.consignee_id,
  1449. ooc.consignee,
  1450. (select customer_name from ocean_extend ex where ex.serial_no = ooc.serial_no limit 1) as controlling_customer,
  1451. ooc.booking_no,
  1452. (select manifest_type from sfs.ocean o where o.serial_no = ooc.serial_no limit 1) as manifest_type,
  1453. ooc.agent,
  1454. ooc.order_from
  1455. from ooc
  1456. LEFT JOIN sfs.oc_container oc ON oc.serial_no::text = ooc.serial_no::text
  1457. where ooc.order_from = 'sfs' and transport_mode = 'sea' ".$sqlCtnr."
  1458. union all
  1459. select
  1460. ooc.serial_no,
  1461. ooc.h_bol,
  1462. ooc.m_bol,
  1463. '' as ctnr,
  1464. ooc.service,
  1465. ooc.po_no,
  1466. '' as reference_no,
  1467. ooc.transport_mode,
  1468. ooc.qty as pakages,
  1469. ooc.qty_uom as package_type ,
  1470. ooc.piece_count as kgw,
  1471. ooc.cbm as volume,
  1472. ooc.vessel,
  1473. ooc.voyage,
  1474. ooc.carrier,
  1475. ooc.fport_of_loading_un,
  1476. ooc.mport_of_discharge_un,
  1477. ooc.eta,
  1478. ooc.ata,
  1479. ooc.shipper,
  1480. ooc.consignee_id,
  1481. ooc.consignee,
  1482. '' as controlling_customer,
  1483. ooc.booking_no,
  1484. '' as manifest_type,
  1485. ooc.agent,
  1486. ooc.order_from
  1487. from ooc
  1488. where ooc.transport_mode = 'air'
  1489. )
  1490. select md.*,
  1491. CASE
  1492. WHEN kd.recommended_delivery_window_date_from IS NOT NULL AND kd.recommended_delivery_window_date_to IS NOT NULL THEN
  1493. to_char((recommended_delivery_window_date_from)::date, 'YYYY-MM-DD')
  1494. || ';' ||
  1495. to_char((recommended_delivery_window_date_to)::date, 'YYYY-MM-DD')
  1496. WHEN kd.recommended_delivery_window_date_from IS NULL AND kd.recommended_delivery_window_date_to IS NOT NULL THEN
  1497. ';' ||
  1498. to_char((recommended_delivery_window_date_to)::date, 'YYYY-MM-DD')
  1499. WHEN kd.recommended_delivery_window_date_from IS NOT NULL AND kd.recommended_delivery_window_date_to IS NULL THEN
  1500. to_char((recommended_delivery_window_date_from)::date, 'YYYY-MM-DD')
  1501. || ';'
  1502. ELSE ''
  1503. END AS date_range,
  1504. kd.recommended_delivery_from,
  1505. kd.recommended_delivery_to,
  1506. kd.recommended_delivery_window_date_from as recommended_delivery_from_date,
  1507. kd.recommended_delivery_window_date_to as recommended_delivery_to_date,
  1508. (select dc.country from public.kln_destination_delivery_config dc where md.agent in (select regexp_split_to_table(dc.station, ','))) as dc_country
  1509. from matched_data md
  1510. LEFT join public.kln_destination_delivery kd on kd.serial_no = '$serial_no'
  1511. order by md.eta desc";
  1512. //error_log($sql);
  1513. $rs = common::excuteListSql($sql);
  1514. return array("msg"=>"","data"=>$rs);
  1515. }
  1516. function groupShipments($booking_no, $manifest_type, $h_bol,$h_serial_no, $order_from,$m_bol, $ctnr,$kln_pic,$consignee,$consignee_id,
  1517. $recommended_delivery_window_date_from, $recommended_delivery_window_date_to,
  1518. $recommended_delivery_from,$recommended_delivery_to,$dc_country){
  1519. // Combine the data into an array of shipments
  1520. $shipments = [];
  1521. foreach ($h_bol as $index => $_h_bol) {
  1522. $shipments[] = [
  1523. 'booking_no' =>$booking_no[$index],
  1524. 'manifest_type' => $manifest_type[$index],
  1525. 'h_bol' => $h_bol[$index],
  1526. 'h_serial_no' => $h_serial_no[$index],
  1527. 'order_from' => $order_from[$index],
  1528. 'm_bol' => $m_bol[$index],
  1529. 'ctnr' => $ctnr[$index],
  1530. 'kln_pic' => $kln_pic[$index],
  1531. 'consignee' => $consignee[$index],
  1532. 'consignee_id' => $consignee_id[$index],
  1533. 'dc_country' => $dc_country[$index],
  1534. 'recommended_delivery_window_date_from' => $recommended_delivery_window_date_from[$index],
  1535. 'recommended_delivery_window_date_to' => $recommended_delivery_window_date_to[$index],
  1536. 'recommended_delivery_from' => $recommended_delivery_from[$index],
  1537. 'recommended_delivery_to' => $recommended_delivery_to[$index]
  1538. ];
  1539. }
  1540. // 按 MBOL 分组
  1541. $groupedByMbol = [];
  1542. // 按 ShipmentID 分组
  1543. $groupedByShipmentId = [];
  1544. foreach ($shipments as $item) {
  1545. $m_bol = $item['m_bol'];
  1546. $h_serial_no = $item['h_serial_no'];
  1547. $h_bol = $item['h_bol'];
  1548. $order_from = $item['order_from'];
  1549. $ctnr = $item['ctnr'];
  1550. $dc_country = $item['dc_country'];
  1551. $consignee_id = $item['consignee_id'];
  1552. if(strtoupper($item['manifest_type']) == 'BCN'){
  1553. if (!isset($groupedByMbol[$m_bol])) {
  1554. $item['h_bol'] = array();
  1555. $item['h_bol_multiple_link'] = array();
  1556. $item['h_serial_no'] = array();
  1557. $item['ctnr'] = array();
  1558. $item['dc_country'] = array();
  1559. $item['consignee_id'] = array();
  1560. $item['m_bol'] = array($item['m_bol']);
  1561. $groupedByMbol[$m_bol] = $item;
  1562. }
  1563. if (!in_array($h_serial_no, $groupedByMbol[$m_bol]['h_serial_no'])) {
  1564. $groupedByMbol[$m_bol]['h_bol'][] = $h_bol;
  1565. $groupedByMbol[$m_bol]['h_bol_multiple_link'][] = array("key"=>$h_bol,"value" =>$h_serial_no,"order_from"=>$order_from);
  1566. $groupedByMbol[$m_bol]['h_serial_no'][] = $h_serial_no;
  1567. $groupedByMbol[$m_bol]['dc_country'][] = $dc_country;
  1568. $groupedByMbol[$m_bol]['consignee_id'][] = $consignee_id;
  1569. }
  1570. if (!in_array($ctnr, $groupedByMbol[$m_bol]['ctnr'])) {
  1571. $groupedByMbol[$m_bol]['ctnr'][] = $ctnr;
  1572. }
  1573. } else {
  1574. if (!isset($groupedByShipmentId[$h_serial_no])) {
  1575. $item['m_bol'] = array();
  1576. $item['ctnr'] = array();
  1577. $item['dc_country'] = array($item['dc_country']);
  1578. $item['consignee_id'] = array($item['consignee_id']);
  1579. $item['h_serial_no'] = array($item['h_serial_no']);
  1580. $item['h_bol'] = array($item['h_bol']);
  1581. $item['h_bol_multiple_link'] = array(array("key"=>$h_bol,"value" =>$h_serial_no,"order_from"=>$order_from));
  1582. $groupedByShipmentId[$h_serial_no] = $item;
  1583. }
  1584. if (!in_array($m_bol, $groupedByShipmentId[$h_serial_no]['m_bol'])) {
  1585. $groupedByShipmentId[$h_serial_no]['m_bol'][] = $m_bol;
  1586. }
  1587. if (!in_array($ctnr, $groupedByShipmentId[$h_serial_no]['ctnr'])) {
  1588. $groupedByShipmentId[$h_serial_no]['ctnr'][] = $ctnr;
  1589. }
  1590. }
  1591. }
  1592. //检查是否选中所有的BCN
  1593. foreach($groupedByMbol as $mkey => $mval){
  1594. $mcount = common::excuteOneSql("select count(*) from kln_ocean where m_bol = '".common::check_input($mkey)."'");
  1595. $hcount = count($mval['h_serial_no']);
  1596. if($mcount <> $hcount){
  1597. return array("msg"=>"MBL No.: ".$mkey.",The shipment of BCN has not been fully selected");
  1598. }
  1599. }
  1600. $result = array();
  1601. foreach($groupedByMbol as $mb){
  1602. $result[] = $mb;
  1603. }
  1604. foreach($groupedByShipmentId as $hb){
  1605. $result[] = $hb;
  1606. }
  1607. return array("msg"=>"","result"=>$result);
  1608. }
  1609. /**
  1610. * 批量选着文件下载 CI & P
  1611. */
  1612. private function _batch_download_ci_p_file(){
  1613. //ocean的相关配置参数
  1614. $OutFileURL = common::excuteOneSql("select item_value from config where item='OutFileURL'");
  1615. $ocean_can_view_file = common::excuteOneSql("select ocean_can_view_file from ra_online_user where user_login='".$_SESSION['ONLINE_USER']['user_login']."'");
  1616. //$ocean_can_view_file = '{"HBL":[{"type":"TELEX","value":""}],"MBL":[{"type":"TELEX","value":""}]}';
  1617. $tar = json_decode($ocean_can_view_file,true);
  1618. $sqlFiterWhere = "1<>1 ";
  1619. foreach($tar as $_tar){
  1620. foreach($_tar as $dkey => $dvalue){
  1621. $sqlFiterWhere.= " or (lower(format_serailno) in ('".strtolower(str_replace(";","','",$dvalue['value']))."')
  1622. and upper((string_to_array((string_to_array(file_name,'.'))[1], '_'))[2]) = '".$dvalue['type']."')";
  1623. }
  1624. }
  1625. //air的相关配置参数
  1626. $air_can_view_file = common::excuteOneSql("select air_can_view_file from ra_online_user where lower(user_login)='".strtolower($_SESSION['ONLINE_USER']['user_login'])."'");
  1627. $air_tar = json_decode($air_can_view_file,true);
  1628. $air_sqlFiterWhere = "1<>1 ";
  1629. foreach($air_tar as $_air_tar){
  1630. foreach($_air_tar as $air_dkey => $air_dvalue){
  1631. $air_sqlFiterWhere.= " or (lower(format_serailno) in ('".strtolower(str_replace(";","','",$air_dvalue['value']))."')
  1632. and upper((string_to_array((string_to_array(file_name,'.'))[1], '_'))[2]) = '".$air_dvalue['type']."')";
  1633. }
  1634. }
  1635. $serial_no_arr = array($_POST['serial_no']);
  1636. $file_type = $_POST['file_type'];
  1637. $file_arr = array();
  1638. foreach($serial_no_arr as $key =>$serial_no){
  1639. $ocean = common::excuteObjectSql("select m_bol as _m_bol,
  1640. h_bol as _h_bol,
  1641. transport_mode,
  1642. order_from,
  1643. case when transport_mode = 'sea' and order_from = 'public' then (select job_no from public.ocean o where o.serial_no = oo.serial_no)
  1644. when transport_mode = 'sea' and order_from = 'sfs' then (select job_no from sfs.ocean o where o.serial_no = oo.serial_no)
  1645. else ''::text end as _job_bol
  1646. from public.kln_ocean oo where oo.serial_no = '$serial_no'");
  1647. $_schemas = $ocean["order_from"];
  1648. if ($ocean["transport_mode"] == 'sea'){
  1649. //ocean 能看的文件类型
  1650. $document = _getViewDocType($_schemas);
  1651. $file_serial_nos = array();
  1652. foreach ($document as $v) {
  1653. $types = $v['serial_no'];
  1654. $types = strtolower($types);
  1655. $types = explode(";", $types);
  1656. foreach ($types as $k => $type) {
  1657. $file_serial_nos[] = $type;
  1658. }
  1659. }
  1660. $file_serial_nos = utils::implode(';',$file_serial_nos);
  1661. $formatSerailnoWhere = "";
  1662. if($file_type == 'Packing List'){
  1663. $formatSerailnoWhere = " and lower(format_serailno) = '".strtolower('abfee0ffac630983976b336b37624c73')."'";
  1664. } else if ($file_type == 'C/I'){
  1665. $formatSerailnoWhere = " and lower(format_serailno) = '".strtolower('4f0a5400c6829')."'";
  1666. }
  1667. $filefilter = " ('TELEX') ";
  1668. $fileSql = "SELECT file_path, file_name from $_schemas.ra_online_doc_upload doc
  1669. left join $_schemas.ra_online_file_format ff on ff.serial_no = doc.format_serailno
  1670. where (lower(bol) = '" . strtolower($ocean['_m_bol']) . "' or lower(bol) = '" . strtolower($ocean['_h_bol']) . "' or lower(bol) = '".strtolower($ocean['_job_bol'])."' )
  1671. and (
  1672. (upper(coalesce((string_to_array((string_to_array(file_name,'.'))[1], '_'))[2],'')) not in ".$filefilter.")
  1673. or ".$sqlFiterWhere."
  1674. ) and lower(format_serailno) " . common::getInNotInSql($file_serial_nos) . " ". $formatSerailnoWhere." order by ff.format_name ASC,doc.id desc";
  1675. $rss = common::excuteListSql($fileSql);
  1676. foreach ($rss as $rs) {
  1677. if ($rs['from_system']=="TOPOCEAN"||$rs['from_system']=="KSMART") {
  1678. //这种类型现在没有了
  1679. }else {
  1680. $file_arr[] = $rs['file_path'] . DS . $rs['file_name'];
  1681. }
  1682. }
  1683. }
  1684. if ($ocean["transport_mode"] == 'air'){
  1685. //air能看的文件类型
  1686. $document = _getAirViewDocType($_schemas);
  1687. $file_serial_nos = array();
  1688. foreach ($document as $v) {
  1689. $types = $v['serial_no'];
  1690. $types = strtolower($types);
  1691. $types = explode(";", $types);
  1692. foreach ($types as $k => $type) {
  1693. $file_serial_nos[] = $type;
  1694. }
  1695. }
  1696. $file_serial_nos = utils::implode(';',$file_serial_nos);
  1697. $formatSerailnoWhere = "";
  1698. if($file_type == 'Packing List'){
  1699. $formatSerailnoWhere = " and lower(format_serailno) = '".strtolower('abfee0ffac630983976b336b37624c73')."'";
  1700. } else if ($file_type == 'C/I'){
  1701. $formatSerailnoWhere = " and lower(format_serailno) = '".strtolower('4f0a5400c6829')."'";
  1702. }
  1703. $filefilter = " ('TELEX') ";
  1704. $fileSql = "SELECT file_path, file_name from $_schemas.air_doc_upload
  1705. left join $_schemas.air_file_format ff on ff.serial_no = air_doc_upload.format_serailno
  1706. where (lower(bol) = '" . strtolower($ocean['_m_bol']) . "' or lower(bol) = '" . strtolower($ocean['_h_bol']) . "')
  1707. and (
  1708. (upper(coalesce((string_to_array((string_to_array(file_name,'.'))[1], '_'))[2],'')) not in ".$filefilter.")
  1709. or ".$sqlFiterWhere."
  1710. ) and lower(format_serailno) " . common::getInNotInSql($file_serial_nos) . " order by ff.format_name ASC,air_doc_upload.id desc";
  1711. $rss = common::excuteListSql($fileSql);
  1712. foreach ($rss as $rs) {
  1713. $file_arr[] = $rs['file_path'] . DS . $rs['file_name'];
  1714. }
  1715. }
  1716. }
  1717. if($file_type == 'Packing List'){
  1718. $zipName = "Packing_List";
  1719. } else if ($file_type == 'C/I'){
  1720. $zipName = "C/I";
  1721. }
  1722. if(empty($file_arr)){
  1723. $data = array('msg' => 'No file to download','data' => '');
  1724. common::echo_json_encode(500, $data);
  1725. exit();
  1726. }
  1727. common::downloadFilesAsSimapleZip($file_arr,$zipName);
  1728. }
  1729. }
  1730. ?>