destination_delivery.class.php 75 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571
  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 category ilike '" . common::check_input($term) . "%'";
  33. $sql .= " order by category";
  34. $rs = common::excuteListSql($sql);
  35. //前端要加上id 从1开始
  36. $retData = array();
  37. foreach($rs as $key => $val){
  38. if(!empty($val['country_code'])){
  39. $retData[] = array("value" =>$val['country_code'] ,"label"=>$val['country_code']);
  40. }
  41. }
  42. common::echo_json_encode(200,$retData);
  43. exit();
  44. }
  45. /**
  46. * select station 选择国家后再展示 station list数据
  47. */
  48. if ($operate == "station") {
  49. $country = common::check_input($_REQUEST['country']);
  50. $sql = "select code from public.kerry_system_code where category = '".$country."' and code NOT LIKE 'Online_%'";
  51. $rs = common::excuteListSql($sql);
  52. foreach($rs as $key => $val){
  53. if(!empty($val['code'])){
  54. $retData[] = array("value" =>$val['code'] ,"label"=>$val['code']);
  55. }
  56. }
  57. common::echo_json_encode(200,$retData);
  58. exit();
  59. }
  60. /**
  61. * select KLN PIC 下拉可供选择的employee帐号,且帐号权限站点包括选中的station ?
  62. */
  63. if ($operate == "employee_account") {
  64. $term = $_POST['term'];
  65. $term = trim($term);
  66. $station = $_REQUEST['station'];
  67. $more_param = common::getInNotInSqlForSearch(utils::implode(';',$station));
  68. $sql = "select email from public.ra_online_user where user_type = 'Employee' and lower(contact_id) in ($more_param)
  69. and email ilike '" . common::check_input($term) . "%' limit 20";
  70. $rs = common::excuteListSql($sql);
  71. $retData = array();
  72. foreach($rs as $key => $val){
  73. if(!empty($val['email'])){
  74. $retData[] = array("value" =>$val['email'] ,"label"=>$val['email']);
  75. }
  76. }
  77. common::echo_json_encode(200,$retData);
  78. exit();
  79. }
  80. /**
  81. * 下拉可供选择的ports
  82. */
  83. if ($operate == "ports") {
  84. $mode = $_POST['mode'];
  85. $term = $_POST['term'];
  86. $term = trim($term);
  87. if ($mode == 'sea'){
  88. $sql = "select DISTINCT uncode from public.ports
  89. where coalesce(uncode,'')<> '' and uncode ilike '" . common::check_input($term) . "%'";
  90. } else {
  91. $sql = "select DISTINCT coalesce(airport.country_abb,'')||airport.airport_code as uncode from sfs.airport
  92. where coalesce(country_abb,'')<>''
  93. and coalesce(airport.country_abb,'')||airport.airport_code ilike '" . common::check_input($term) . "%'";
  94. }
  95. $sql .= " order by uncode limit 20";
  96. $rs = common::excuteListSql($sql);
  97. //前端要加上id 从1开始
  98. $retData = array();
  99. foreach($rs as $key => $val){
  100. if(!empty($val['uncode'])){
  101. $retData[] = array("value" =>$val['uncode'] ,"label"=>$val['uncode'],"checked"=>false);
  102. }
  103. }
  104. common::echo_json_encode(200,$retData);
  105. exit();
  106. }
  107. /**
  108. * 下拉可供选择的carrier
  109. */
  110. if ($operate == "carrier") {
  111. $term = $_POST['term'];
  112. $term = trim($term);
  113. $sql = "select DISTINCT scac from public.vessel_company
  114. where coalesce(scac,'')<> '' and scac ilike '" . common::check_input($term) . "%'";
  115. $sql .= " order by scac limit 20";
  116. $rs = common::excuteListSql($sql);
  117. //前端要加上id 从1开始
  118. $retData = array();
  119. foreach($rs as $key => $val){
  120. if(!empty($val['scac'])){
  121. $retData[] = array("value" =>$val['scac'] ,"label"=>$val['scac'],"checked"=>false);
  122. }
  123. }
  124. common::echo_json_encode(200,$retData);
  125. exit();
  126. }
  127. /**
  128. * Manage Address load
  129. */
  130. if ($operate == "manage_address"){
  131. $consignee = $_REQUEST['consignee'];
  132. $consignee =array('COMGEN38002','FGB050132','ATOZTI35005');
  133. $more_param = common::getInNotInSqlForSearch(utils::implode(';',$consignee));
  134. $country = $_REQUEST['country'];
  135. $country =array('GB','DE');
  136. $more_param_country = common::getInNotInSqlForSearch(utils::implode(';',$country));
  137. $sql = "SELECT * FROM public.contacts_address
  138. WHERE addr_type = 'D'
  139. and lower(contact_id) in ($more_param)
  140. and from_station in (select code from public.kerry_system_code where lower(category) in ($more_param_country))";
  141. $data = common::excuteListSql($sql);
  142. error_log($sql);
  143. $manageAddressList = array();
  144. //Online_D_Address
  145. foreach($data as $d){
  146. $manageAddressList[] = array(
  147. "address_1"=>$d['addr1'],
  148. "address_2"=>$d['addr2'],
  149. "address_3"=>$d['addr3'],
  150. "address_4"=>$d['addr4'],
  151. "country"=>$d['ctry_code'],
  152. "city"=>$d['city_code'],
  153. "postal_code"=>$d['postal_code'],
  154. "contact_person"=>$d['contact_person'],
  155. "contact_number" =>$d['contact_number'],
  156. "create_user" => $d['create_user'], //create_user = Online_D_Address 时,代表對客戶賬號類型自己創建的D類地址
  157. "contact_id" => $d['contact_id'],
  158. "sync_key" => $d['sync_key'], //唯一key
  159. "from_station" => $d['from_station'], //只有是客户新键的才会特殊处理station Online_GE. 好判断是那个国家的
  160. "contact_type" => "Unedit"
  161. );
  162. }
  163. common::echo_json_encode(200,$manageAddressList);
  164. exit();
  165. }
  166. /**
  167. * country and city load
  168. */
  169. if ($operate == "country_city_load") {
  170. $term_type = $_POST['term_type'];
  171. $limit = $_POST['limit'];
  172. $term = $_POST['term'];
  173. $term = trim($term);
  174. $extend_sql_where = "";
  175. if ($term_type == "country" && !empty($limit)){
  176. $extend_sql_where = " and location_code = '$limit'";
  177. }
  178. if ($term_type == "city" && !empty($limit)){
  179. $extend_sql_where = " and country_code = '$limit'";
  180. }
  181. if ($term_type == "country"){
  182. $sql = "select DISTINCT country_code AS code from public.unlocode
  183. where country_code ilike '" . common::check_input($term) . "%'".$extend_sql_where;
  184. $sql .= " order by country_code limit 20";
  185. }
  186. if ($term_type == "city"){
  187. $sql = "select DISTINCT location_code AS code from public.unlocode
  188. where location_code ilike '" . common::check_input($term) . "%'".$extend_sql_where;
  189. $sql .= " order by location_code limit 20";
  190. }
  191. $rs = common::excuteListSql($sql);
  192. //前端要加上id 从1开始
  193. $retData = array();
  194. foreach($rs as $key => $val){
  195. if(!empty($val['code'])){
  196. $retData[] = array("value" =>$val['code'] ,"label"=>$val['code']);
  197. }
  198. }
  199. common::echo_json_encode(200,$retData);
  200. exit();
  201. }
  202. }
  203. /**
  204. * destination_delivery 配置
  205. */
  206. public function destination_delivery_config(){
  207. $operate = utils::_get('operate');
  208. $operate = strtolower($operate);
  209. /**
  210. * 这个是嵌套在destination_delivery的配置查询,
  211. */
  212. if ($operate == "search"){
  213. $cp = common::check_input($_POST ['cp']); //current_page
  214. $ps = common::check_input($_POST ['ps']); //ps
  215. if (empty($ps))
  216. $ps = 100;
  217. if (empty($cp))
  218. $cp = 1;
  219. $rc = $_POST ['rc'];
  220. if ($rc == - 1) {
  221. $sql = "select count(*) from public.kln_destination_delivery_config";
  222. $rc = common::excuteOneSql($sql);
  223. }
  224. $tp = ceil($rc / $ps);
  225. if ($rc > 0) {
  226. $sql = "select * from public.kln_destination_delivery_config";
  227. $sql .= " order by id desc limit " . $ps . " offset " . ($cp - 1) * $ps;
  228. $rs = common::excuteListSql($sql);
  229. foreach($rs as $key => $val){
  230. $rs[$key]["_serial_no"] = common::deCode($val['serial_no'], 'E');
  231. }
  232. $arrTmp = array('searchData' => $rs,
  233. 'rc' => intval($rc),
  234. 'ps' => intval($ps),
  235. 'cp' => intval($cp),
  236. 'tp' => intval($tp));
  237. common::echo_json_encode(200,$arrTmp);
  238. exit();
  239. }else{
  240. $arrTmp = array('searchData' => array());
  241. common::echo_json_encode(200, $arrTmp);
  242. exit();
  243. }
  244. }
  245. if ($operate == "add"){
  246. $serial_no = common::deCode($_REQUEST['a'], 'D');
  247. $data = array();
  248. $rule = array();
  249. if (!empty($serial_no)){
  250. $sql = "select * from public.kln_destination_delivery_config where serial_no = '$serial_no'";
  251. $data = common::excuteObjectSql($sql);
  252. if ($data['recommended_delivery'] == 'Delivery_ETA_ATA') {
  253. $sql = "select * from public.kln_destination_delivery_rule where recommended_delivery_serial_no = '$serial_no'";
  254. $rule = common::excuteListSql($sql);
  255. }
  256. } else{
  257. //代表新加,页面初始
  258. $data['booking_window'] = "No_Restrictions";
  259. $data['booking_window_date_start'] ="";
  260. $data['booking_window_date_end'] ="";
  261. $data['recommended_delivery'] ="No_Recommended";
  262. }
  263. //处理组装返回格式
  264. //RcommendDeliveryDate
  265. $RecommendCheckedAirList = array();
  266. $RecommendCheckedSeaList = array();
  267. $RecommendCheckedList = array();
  268. foreach($rule as $item){
  269. if ($item['mode_type'] == 'sea'){
  270. $RecommendCheckedSeaList[] = array("priority"=>$item['priority'],"rule_type"=>$item['rule_type'],
  271. "ports"=>explode(",", $item['ports']),
  272. "carrier"=>explode(",", $item['carrier']),
  273. "recommended_delivery_from"=>$item['recommended_delivery_from'],
  274. "recommended_delivery_to"=>$item['recommended_delivery_to'],
  275. "mode_type"=>$item['mode_type']);
  276. }
  277. if ($item['mode_type'] == 'air'){
  278. $RecommendCheckedAirList[] = array("priority"=>$item['priority'],"rule_type"=>$item['rule_type'],
  279. "ports"=>explode(",", $item['ports']),
  280. "carrier"=>explode(",", $item['carrier']),
  281. "recommended_delivery_from"=>$item['recommended_delivery_from'],
  282. "recommended_delivery_to"=>$item['recommended_delivery_to'],
  283. "mode_type"=>$item['mode_type']);
  284. }
  285. if (!utils::in_array(ucfirst($item['mode_type']), $RecommendCheckedList)) {
  286. $RecommendCheckedList[] = ucfirst($item['mode_type']);
  287. }
  288. }
  289. $returnData = $data;
  290. $returnData["SetBookingWindow"] = array("windowradio" =>common::destination_delivery_window_radio($data['booking_window']),
  291. "windowBeforeDays"=>$data['booking_window_date_start'],
  292. "windowAfterDays"=>$data['booking_window_date_end']);
  293. $returnData["RcommendDeliveryDate"] = array("Recommendradio" =>common::destination_delivery_recommended($data['recommended_delivery']),
  294. "RecommendCheckedList"=>$RecommendCheckedList,
  295. "RecommendCheckedAirList"=>$RecommendCheckedAirList,
  296. "RecommendCheckedSeaList"=>$RecommendCheckedSeaList);
  297. $returnData["KLNPLCvalue"] = empty($data['kln_pic']) ? array() : explode(";", $data['kln_pic']);
  298. $CountryCheckedList = array();
  299. $sql = "select crm.overeas from public.contract_region_mapping crm
  300. left join ocean.contacts c on c.contact_id = crm.overeas and crm.ksmart_station_new ilike 'ksmart%'
  301. where SUBSTRING(c.country FROM 1 FOR 2) = '".$data['country']."'";
  302. $rs = common::excuteListSql($sql);
  303. foreach($rs as $key => $val){
  304. if(!empty($val['overeas'])){
  305. $CountryCheckedList[] = array("value" =>$val['overeas'] ,"label"=>$val['overeas']);
  306. }
  307. }
  308. $returnData["CountryCheckedList"] = $CountryCheckedList;
  309. $returnData["station"] = explode(",", $returnData["station"]);
  310. $data = array('returnData' =>$returnData);
  311. common::echo_json_encode(200,$data);
  312. exit();
  313. }
  314. if ($operate == "save"){
  315. $serial_no = common::deCode($_POST['serial_no'], 'D');
  316. $country = common::check_input($_POST['country']);
  317. $station = empty($_POST['station']) ? "" : utils::implode(",",$_POST['station']);
  318. $booking_window = common::check_input($_POST['booking_window']);
  319. $booking_window_date_start = common::check_input($_POST['booking_window_date_start']);
  320. $booking_window_date_end = common::check_input($_POST['booking_window_date_end']);
  321. $recommended_delivery = common::check_input($_POST['recommended_delivery']);
  322. $kln_pic = common::check_input($_POST['kln_pic']);
  323. $booking_window_desc = common::check_input($_POST['booking_window_desc']);
  324. $recommended_delivery_date_desc = common::check_input($_POST['recommended_delivery_date_desc']);
  325. //rule
  326. $_mode_type = $_POST['mode_type'];
  327. $_priority = $_POST['priority'];
  328. $_rule_type = $_POST['rule_type'];
  329. $_ports = $_POST['ports'];
  330. $_carrier = $_POST['carrier'];
  331. $_recommended_delivery_from = $_POST['recommended_delivery_from'];
  332. $_recommended_delivery_to = $_POST['recommended_delivery_to'];
  333. $sql = "";
  334. if (!empty($serial_no)){
  335. $updateSqlSet = " modify_by = '"._getLoginName()."',update_time = now()";
  336. if (!empty($country)) {
  337. $updateSqlSet.= ", country = '$country' ";
  338. }
  339. if (!empty($station)) {
  340. $updateSqlSet.= ", station = '$station' ";
  341. }
  342. if (!empty($booking_window)) {
  343. $updateSqlSet.= ", booking_window = '$booking_window' ";
  344. }
  345. if (!empty($booking_window_date_start)) {
  346. $updateSqlSet.= ", booking_window_date_start = '$booking_window_date_start' ";
  347. }
  348. if (!empty($booking_window_date_end)) {
  349. $updateSqlSet.= ", booking_window_date_end = '$booking_window_date_end' ";
  350. }
  351. if (!empty($recommended_delivery)) {
  352. $updateSqlSet.= ", recommended_delivery = '$recommended_delivery' ";
  353. }
  354. if (!empty($kln_pic)) {
  355. $updateSqlSet.= ", kln_pic = '$kln_pic' ";
  356. }
  357. if (!empty($booking_window_desc)) {
  358. $updateSqlSet.= ", booking_window_desc = '$booking_window_desc' ";
  359. }
  360. if (!empty($recommended_delivery_date_desc)) {
  361. $updateSqlSet.= ", recommended_delivery_date_desc = '$recommended_delivery_date_desc' ";
  362. }
  363. //代表update
  364. $sql .= "update public.kln_destination_delivery_config set ".$updateSqlSet."
  365. where serial_no = '$serial_no';";
  366. } else {
  367. //检查配置的站点是否于以前的配置的,是否重合
  368. $exist = common::excuteListSql("select country,station from public.kln_destination_delivery_config WHERE string_to_array('$station', ',') && string_to_array(station, ',')");
  369. if(!empty($exist)){
  370. $data = array("msg" =>"The station has been reconfigured. Please check ".$exist[0]['country'] ." - " .$exist[0]['station']);
  371. common::echo_json_encode(200,$data);
  372. exit();
  373. }
  374. //代表更新
  375. $serial_no = common::uuid();
  376. $sql .="INSERT INTO public.kln_destination_delivery_config(
  377. serial_no, country, station, booking_window, booking_window_date_start,
  378. booking_window_date_end, recommended_delivery, kln_pic, booking_window_desc,recommended_delivery_date_desc,
  379. create_by, created_time, modify_by, update_time)
  380. VALUES ('$serial_no', '$country', '$station', '$booking_window', '$booking_window_date_start',
  381. '$booking_window_date_end', '$recommended_delivery', '$kln_pic','$booking_window_desc','$recommended_delivery_date_desc',
  382. '"._getLoginName()."', now(), '"._getLoginName()."', now());";
  383. }
  384. $errmsg = "";
  385. //柜子是先删除,后添加
  386. $sql .= "delete from public.kln_destination_delivery_rule where recommended_delivery_serial_no = '$serial_no';";
  387. if ($recommended_delivery == "Delivery_ETA_ATA"){
  388. // 用于统计每种类型是否存在,以及是否满足 rule_type = 'all'
  389. $typeExists = ['air' => false, 'sea' => false];
  390. $typeHasAllRule = ['air' => false, 'sea' => false];
  391. //检查判断规则不能重合
  392. $seaRule = [];
  393. $airRule = [];
  394. foreach($_mode_type as $key => $v){
  395. $mode_type = $v;
  396. $priority = $_priority[$key];
  397. $rule_type = $_rule_type[$key];
  398. $ports = $_ports[$key];
  399. $carrier = $_carrier[$key];
  400. if( $mode_type == 'sea'){
  401. $seaRule[] = explode(",",$_ports[$key]);
  402. ///$sea_carrier_index += 1;
  403. } else {
  404. $airRule[] = explode(",",$_ports[$key]);
  405. }
  406. $recommended_delivery_from = $_recommended_delivery_from[$key];
  407. $recommended_delivery_to = $_recommended_delivery_to[$key];
  408. $sql .= "INSERT INTO public.kln_destination_delivery_rule(
  409. recommended_delivery_serial_no, mode_type, priority,
  410. rule_type, ports, carrier, recommended_delivery_from, recommended_delivery_to,
  411. create_by, created_time, modify_by, update_time)
  412. VALUES ('$serial_no', '$mode_type', '$priority',
  413. '$rule_type', '$ports', '$carrier', '$recommended_delivery_from', '$recommended_delivery_to',
  414. '"._getLoginName()."', now(), '"._getLoginName()."', now());";
  415. $typeExists[$mode_type] = true;
  416. if ($rule_type == '*Default Rule') {
  417. $typeHasAllRule[$mode_type] = true;
  418. }
  419. }
  420. // 检查缺失的 rule_type = 'all'
  421. $missingTypes = [];
  422. foreach (['air', 'sea'] as $type) {
  423. if ($typeExists[$type] && !$typeHasAllRule[$type]) {
  424. $missingTypes[] = $type;
  425. }
  426. }
  427. if (!empty($missingTypes)) {
  428. $errmsg = "The Default Rule must exist.";
  429. }
  430. //检查规则不能重复
  431. $errmsg .= common::checkOverlap($seaRule,"Sea Rule");
  432. $errmsg .= common::checkOverlap($airRule,"Air Rule");
  433. }
  434. if (empty($errmsg) && !empty($sql)){
  435. common::excuteUpdateSql($sql);
  436. $data = array("msg" =>"success");
  437. } else {
  438. $data = array("msg" =>$errmsg);
  439. }
  440. common::echo_json_encode(200,$data);
  441. exit();
  442. }
  443. if ($operate == "delete"){
  444. $serial_no = common::deCode($_POST['a'], 'D');
  445. $sql = "delete from public.kln_destination_delivery_config where serial_no = '$serial_no';";
  446. $sql .= "delete from public.kln_destination_delivery_rule where recommended_delivery_serial_no = '$serial_no';";
  447. error_log($sql);
  448. common::excuteUpdateSql($sql);
  449. $data = array("msg" =>"success");
  450. common::echo_json_encode(200,$data);
  451. exit();
  452. }
  453. }
  454. /**
  455. * booking
  456. */
  457. public function destination_delivery_booking(){
  458. $operate = utils::_get('operate');
  459. $operate = strtolower($operate);
  460. if ($operate == "destination_delivery_search") {
  461. //search
  462. //栏位信息
  463. $column = column::getInstance()->getDisplayColumn('Destination_Delivery_Search');
  464. $BookingTableColumns = column::getInstance()->tableColumns('Destination_Delivery_Search',$column);
  465. $data['TrackingTableColumns'] = $BookingTableColumns;
  466. common::echo_json_encode(200,$data);
  467. exit();
  468. }
  469. if ($operate == "destination_delivery_shipment_search") {
  470. //search
  471. //栏位信息
  472. $column = column::getInstance()->getDisplayColumn('destination_delivery_shipment_search');
  473. $BookingTableColumns = column::getInstance()->tableColumns('destination_delivery_shipment_search',$column);
  474. $data['TrackingTableColumns'] = $BookingTableColumns;
  475. common::echo_json_encode(200,$data);
  476. exit();
  477. }
  478. /**
  479. * select shipment,
  480. * Pending Approval Approve Reject Cancel Modify Submit
  481. */
  482. if ($operate == "search"){
  483. $cp = common::check_input($_POST ['cp']); //current_page
  484. $ps = common::check_input($_POST ['ps']); //ps
  485. if (empty($ps))
  486. $ps = 100;
  487. if (empty($cp))
  488. $cp = 1;
  489. $sqlWhere = ' where ' . common::searchExtendHand_KLN("ocean", $_SESSION["ONLINE_USER"]);
  490. //兜底规则
  491. //$sqlWhere .= " and eta >= now() - INTERVAL '6 months' and eta <= now() + INTERVAL '6 months'";
  492. //代表employee
  493. if(_isApexLogin()){
  494. //$sqlWhere .= " and kln_pic = '"._getLoginEamil()."'";
  495. }
  496. //条件带入
  497. $text_search = $_REQUEST['text_search'];
  498. if (!empty($text_search)){
  499. $sqlWhere .= " and (booking_no ilike '%".strtolower($text_search)."%'
  500. or h_bol ilike '%".strtolower($text_search)."%'
  501. or m_bol ilike '%".strtolower($text_search)."%'
  502. or ctnr ilike '%".strtolower($text_search)."%'
  503. or consignee ilike '%".strtolower($text_search)."%')";
  504. }
  505. if (isset($_REQUEST['delivery_date_start']) && !empty($_REQUEST['delivery_date_start']))
  506. $sqlWhere .= " and delivery_date >= '" . common::usDate2sqlDate($_REQUEST['delivery_date_start']) . " 00:00:00'";
  507. if (isset($_REQUEST['delivery_date_end']) && !empty($_REQUEST['delivery_date_end']))
  508. $sqlWhere .= " and delivery_date <= '" . common::usDate2sqlDate($_REQUEST['delivery_date_end']) . " 23:59:59'";
  509. if(!empty($_POST['delivery_mode'])){
  510. $sqlWhere .= " and delivery_mode ='". common::check_input($_REQUEST['delivery_mode'])."'";
  511. }
  512. if (isset($_REQUEST['created_time_start']) && !empty($_REQUEST['created_time_start']))
  513. $sqlWhere .= " and created_time >= '" . common::usDate2sqlDate($_REQUEST['created_time_start']) . " 00:00:00'";
  514. if (isset($_REQUEST['created_time_end']) && !empty($_REQUEST['created_time_end']))
  515. $sqlWhere .= " and created_time <= '" . common::usDate2sqlDate($_REQUEST['created_time_end']) . " 23:59:59'";
  516. //移除filterTag
  517. $sqlWhere_befrom_filterTag = $sqlWhere;
  518. $filterTag_param = "";
  519. if (!empty($_POST["filterTag"])) {
  520. if (utils::count($_POST['filterTag']) == 1){
  521. $filterTag = $_POST['filterTag'][0];
  522. }else{
  523. $filterTag = utils::implode(",", $_POST['filterTag']);
  524. }
  525. $filterTag_param = "1<>1";
  526. if(strtolower($filterTag) == "all"){
  527. $filterTag_param = "1=1";
  528. }
  529. if (stripos($filterTag, "Pending Approval") !== FALSE) {
  530. $filterTag_param .= " or (status = 'Pending Approval')";
  531. }
  532. if (stripos($filterTag, "Approve") !== FALSE) {
  533. $filterTag_param .= " or (status = 'Approve')";
  534. }
  535. if (stripos($filterTag, "Reject") !== FALSE) {
  536. $filterTag_param .= " or (status = 'Reject')";
  537. }
  538. if (stripos($filterTag, "Cancel") !== FALSE) {
  539. $filterTag_param .= " or (status = 'Cancel')";
  540. }
  541. if(strtolower($filterTag) <> "all" && !empty($filterTag)){
  542. $filterTag_param = " ($filterTag_param)";
  543. }
  544. }
  545. if(empty($filterTag_param)){
  546. $filterTag_param = "1=1";
  547. }
  548. $tag_and_mode_param = $filterTag_param;
  549. $rc = $_POST ['rc'];
  550. if ($rc == - 1 || true) {
  551. $sql = "select count(1) as rc,
  552. sum(case when $tag_and_mode_param then 1 else 0 end) as seach_rc,
  553. sum(case when status ='Pending Approval' then 1 else 0 end) as pending_approval_rc,
  554. sum(case when status ='Approve' then 1 else 0 end) as approved_rc,
  555. sum(case when status ='Reject' then 1 else 0 end) as rejected_rc,
  556. sum(case when status ='Cancel' then 1 else 0 end) as cancelled_rc
  557. from public.kln_destination_delivery
  558. where exists(select 1 from public.kln_ocean oo ". $sqlWhere_befrom_filterTag." and oo.serial_no = any(h_serial_no))";
  559. error_log("kln_destination_delivery_count:".$sql);
  560. $statusRc = common::excuteObjectSql($sql);
  561. $rc = $statusRc['rc'];
  562. $search_rc = $statusRc['seach_rc'];
  563. $pending_approval_rc = $statusRc['pending_approval_rc'];
  564. $approved_rc = $statusRc['approved_rc'];
  565. $rejected_rc = $statusRc['rejected_rc'];
  566. $cancelled_rc = $statusRc['cancelled_rc'];
  567. }
  568. $tp = ceil($rc / $ps);
  569. if ($rc > 0) {
  570. $sql = "select *,to_char((recommended_delivery_window_date_from)::date, 'YYYY-MM-DD')
  571. || ';' ||
  572. to_char((recommended_delivery_window_date_to)::date, 'YYYY-MM-DD') AS date_range
  573. from public.kln_destination_delivery
  574. where ".$tag_and_mode_param."
  575. and exists(select 1 from public.kln_ocean oo ". $sqlWhere." and oo.serial_no = any(h_serial_no))";
  576. $sql .= " order by id desc limit " . $ps . " offset " . ($cp - 1) * $ps;
  577. error_log("kln_destination_delivery_search:".$sql);
  578. $rs = common::excuteListSql($sql);
  579. foreach($rs as $key => $val){
  580. $rs[$key]["_serial_no"] = common::deCode($val['serial_no'], 'E');
  581. $rs[$key]["status"] = common::deliveryStatusConvert($val['status']);
  582. $rs[$key]["h_bol"] = json_decode($val['h_bol_multiple_link']);
  583. }
  584. $arrTmp = array('searchData' => $rs,
  585. 'is_employee' => _isApexLogin(),
  586. 'All' =>$rc,
  587. 'pending_approval_rc' =>$pending_approval_rc,
  588. 'approved_rc' =>$approved_rc,
  589. 'rejected_rc' =>$rejected_rc,
  590. 'cancelled_rc' =>$cancelled_rc,
  591. 'rc' => $search_rc,
  592. 'ps' => $ps,
  593. 'cp' => $cp,
  594. 'tp' => $tp);
  595. common::echo_json_encode(200,$arrTmp);
  596. exit();
  597. }else{
  598. $arrTmp = array('searchData' => array(),
  599. 'is_employee' => _isApexLogin(),
  600. 'All' =>$rc,
  601. 'pending_approval_rc' =>$pending_approval_rc,
  602. 'approved_rc' =>$approved_rc,
  603. 'rejected_rc' =>$rejected_rc,
  604. 'cancelled_rc' =>$cancelled_rc,
  605. 'rc' => $search_rc,
  606. 'ps' => $ps,
  607. 'cp' => $cp,
  608. 'tp' => $tp);
  609. common::echo_json_encode(200,$arrTmp);
  610. exit();
  611. }
  612. }
  613. if ($operate == "search_shipment"){
  614. $data = $this->search_shipment();
  615. if(!empty($data['msg'])){
  616. $arrTmp = array("msg" =>$data['msg']);
  617. }else{
  618. $arrTmp = array("msg" =>"success","data"=>$data['data']);
  619. }
  620. common::echo_json_encode(200, $arrTmp);
  621. exit();
  622. }
  623. if ($operate == "add"){
  624. $serial_no = common::deCode($_POST['serial_no'], 'D');
  625. //前端按钮 后台权限拦截
  626. if(!empty($serial_no)){
  627. common::checkedActionLegal($serial_no,$operate);
  628. }else{
  629. if(!_isApexLogin()){
  630. //$data = array("msg" =>"Employees cannot create booking");
  631. //common::echo_json_encode(200,$data);
  632. //exit();
  633. }
  634. }
  635. $booking_data = array();
  636. if(!empty($serial_no)){
  637. $sql = "select * from public.kln_destination_delivery where serial_no = '$serial_no'";
  638. $booking_data = common::excuteObjectSql($sql);
  639. $shipments = $this->search_shipment_with_booking($booking_data['serial_no'],$booking_data['h_serial_no'],$booking_data['ctnr']);
  640. } else {
  641. $shipments = $this->search_shipment();
  642. }
  643. if(!empty($shipments['msg'])){
  644. $data = array("msg" =>$shipments['msg']);
  645. common::echo_json_encode(200,$data);
  646. exit();
  647. }
  648. $booking_data['tableData'] = $shipments['data'];
  649. $data = array("msg" =>"success","data"=>$booking_data);
  650. common::echo_json_encode(200,$data);
  651. exit();
  652. }
  653. if ($operate == "save"){
  654. $serial_no = common::deCode($_POST['serial_no'], 'D');
  655. $booking_no = $_POST['booking_no'];
  656. $manifest_type = $_POST['manifest_type'];
  657. $h_bol = $_POST['h_bol'];
  658. $h_serial_no = $_POST['serial_no'];
  659. $order_from = $_POST['order_from'];
  660. $m_bol = $_POST['m_bol'];
  661. $ctnr = $_POST['ctnr'];
  662. $kln_pic = $_POST['dc_kln_pic'];
  663. $consignee = $_POST['consignee'];
  664. $consignee_id = $_POST['consignee_id'];
  665. $dc_country = $_POST['dc_country'];
  666. $recommended_delivery_window_date_from = $_POST['recommended_delivery_from_date'];
  667. $recommended_delivery_window_date_to = $_POST['recommended_delivery_to_date'];
  668. $recommended_delivery_from = $_POST['recommended_delivery_from'];
  669. $recommended_delivery_to = $_POST['recommended_delivery_to'];
  670. $modify_reason = common::check_input($_POST['modify_reason']);
  671. $delivery_date = $_POST['delivery_date'];
  672. $delivery_time = $_POST['delivery_time'];
  673. $delivery_mode = common::check_input($_POST['delivery_mode']);
  674. //这status 编辑只有两种情况,新加,和在拒绝后 用户重新编辑 状态都是Pending Approval
  675. $status = "Pending Approval";
  676. $is_new = false;
  677. if(empty($serial_no)){
  678. $is_new = true;
  679. }
  680. $delivery_address = common::check_input($_POST['delivery_address']);
  681. $special_requirements = common::check_input($_POST['special_requirements']);
  682. //检查不能重复添加booking 这里空运没问题,但是会遇到相同hbol 不同的柜子情况,本质上来说就是一条
  683. //$sqlWhere = ' where ' . common::searchExtendHand_KLN("ocean", $_SESSION["ONLINE_USER"]);
  684. //兜底规则
  685. //$sqlWhere .= " and eta >= now() - INTERVAL '6 months' and eta <= now() + INTERVAL '6 months'";
  686. // $ckeckedSql = "with save_table as (select regexp_split_to_table('".utils::implode(',',$h_serial_no)."', ',') as serial_no)
  687. // select string_agg(h_bol, ';') as h_bol from public.kln_destination_delivery kde
  688. // where exists(select 1 from save_table where save_table.serial_no = any(kde.h_serial_no))
  689. // and exists(select 1 from public.kln_ocean oo ". $sqlWhere." and oo.serial_no = any(kde.h_serial_no))";
  690. // //代表编辑
  691. // if(!empty($serial_no)){
  692. // $ckeckedSql .=" and kde.serial_no <> '$serial_no'";
  693. // }
  694. // $checkeData = common::excuteObjectSql($ckeckedSql);
  695. // if(!empty($checkeData['h_bol'])){
  696. // $data = array("msg" =>"The ".$checkeData['h_bol'] ." already exists");
  697. // common::echo_json_encode(200,$data);
  698. // exit();
  699. // }
  700. $sql = "";
  701. //代表修改
  702. if(!empty($serial_no)){
  703. $updateSqlSet = " modify_by = '"._getLoginName()."',update_time = now()";
  704. if (!empty($status)) {
  705. $updateSqlSet.= ", status = '$status' ";
  706. }
  707. $delivery_address = $_POST['location_name']."\n".$_POST['address_1']."\n".$_POST['address_2']."\nContact:".$_POST['contact_person']." ".$_POST['contact_number'];
  708. $delivery_address = common::check_input($delivery_address);
  709. if (!empty($delivery_address)) {
  710. $updateSqlSet.= ", delivery_address = '$delivery_address' ";
  711. }
  712. if (!empty($special_requirements)) {
  713. $updateSqlSet.= ", special_requirements = '$special_requirements' ";
  714. }
  715. if (!empty($modify_reason)) {
  716. $updateSqlSet.= ", modify_reason = '$modify_reason' ";
  717. }
  718. if (!empty($delivery_date)) {
  719. $delivery_date = empty($_POST['delivery_date']) ? "null": "'".common::usDate2sqlDate($_POST['delivery_date'])." ".$delivery_time."'";
  720. //$updateSqlSet.= ", delivery_date = $delivery_date";
  721. }
  722. $addressSql = common::returnDAddressRecord($dc_country,$consignee_id);
  723. if (!empty($addressSql)) {
  724. $updateSqlSet.= ", d_address_change_log = d_address_change_log ||';'||'".common::check_input($addressSql)."' ";
  725. }
  726. //代表update
  727. $sql .= "update public.kln_destination_delivery set ".$updateSqlSet."
  728. where serial_no = '$serial_no';";
  729. //记录log
  730. $sql .="INSERT INTO public.kln_destination_delivery_operation_log(
  731. serial_no, action,notes, create_by, created_time, created_zone)
  732. VALUES ('$serial_no', 'Submit','".$modify_reason."', '"._getLoginName()."', now(), ''); ";
  733. } else {
  734. $saveData = $this->groupShipments($booking_no,$manifest_type,$h_bol,$h_serial_no,$order_from,$m_bol,$ctnr,$kln_pic,$consignee,$consignee_id,
  735. $recommended_delivery_window_date_from, $recommended_delivery_window_date_to,
  736. $recommended_delivery_from,$recommended_delivery_to,$dc_country);
  737. $delivery_address = $_POST['location_name']."\n".$_POST['address_1']."\n".$_POST['address_2']."\nContact:".$_POST['contact_person']." ".$_POST['contact_number'];
  738. $delivery_address = common::check_input($delivery_address);
  739. foreach($saveData as $sData){
  740. $serial_no = common::uuid();
  741. // 使用 PostgreSQL 的 ARRAY 语法
  742. $tags_sql = "ARRAY['" . implode("','", array_map('pg_escape_string', $sData['h_serial_no'])) . "']";
  743. // 使用 PostgreSQL 的 ARRAY 语法
  744. $country_sql = "ARRAY['" . implode("','", array_map('pg_escape_string', $sData['dc_country'])) . "']";
  745. $recommended_delivery_window_date_from = "";
  746. if(empty($sData['recommended_delivery_window_date_from'])){
  747. $recommended_delivery_window_date_from = "null";
  748. } else {
  749. $recommended_delivery_window_date_from = "'".$sData['recommended_delivery_window_date_from']."'";
  750. }
  751. $recommended_delivery_window_date_to = "";
  752. if(empty($sData['recommended_delivery_window_date_to'])){
  753. $recommended_delivery_window_date_to = "null";
  754. } else {
  755. $recommended_delivery_window_date_to = "'".$sData['recommended_delivery_window_date_to']."'";
  756. }
  757. $delivery_date = empty($_POST['delivery_date']) ? "null": "'".common::usDate2sqlDate($_POST['delivery_date'])." ".$delivery_time."'";
  758. $addressSql = common::check_input(common::returnDAddressRecord($sData['dc_country'],$sData['consignee_id']));
  759. $sql .= "INSERT INTO public.kln_destination_delivery(
  760. serial_no, h_serial_no,address_country,
  761. booking_no, h_bol,h_bol_multiple_link,
  762. m_bol, ctnr,
  763. consignee, delivery_date, delivery_mode, status, delivery_address, special_requirements,
  764. recommended_delivery_window_date_from, recommended_delivery_window_date_to, d_address_change_log,
  765. recommended_delivery_from, recommended_delivery_to,kln_pic,
  766. create_by, created_time, modify_by, update_time)
  767. VALUES ('$serial_no', ".$tags_sql.",".$country_sql.",
  768. '".$sData['booking_no']."', '".utils::implode(',',$sData['h_bol'])."','".common::check_input(json_encode($sData['h_bol_multiple_link']))."',
  769. '".utils::implode(',',$sData['m_bol'])."', '".utils::implode(',',$sData['ctnr'])."',
  770. '".$sData['consignee']."', $delivery_date,'$delivery_mode','$status', '$delivery_address', '$special_requirements',
  771. $recommended_delivery_window_date_from, $recommended_delivery_window_date_to,'$addressSql',
  772. '".$sData['recommended_delivery_from']."', '".$sData['recommended_delivery_to']."','".$sData['kln_pic']."',
  773. '"._getLoginName()."', now(), '"._getLoginName()."', now());";
  774. //记录log
  775. $sql .="INSERT INTO public.kln_destination_delivery_operation_log(
  776. serial_no, action,notes, create_by, created_time, created_zone)
  777. VALUES ('$serial_no', 'Submit','', '"._getLoginName()."', now(), ''); ";
  778. }
  779. }
  780. if(!empty($sql)){
  781. $rs = common::excuteUpdateSql($sql);
  782. if ($rs === FALSE){
  783. $data = array("msg" =>"error");
  784. common::echo_json_encode(200,$data);
  785. exit();
  786. }
  787. }
  788. if(!$is_new){
  789. //状态变更时,发送邮件提醒
  790. $status = "Modify";
  791. $data = common::excuteObjectSql("select *, TO_CHAR(delivery_date, 'Mon-DD-YYYY') as _delivery_date,
  792. TO_CHAR(created_time, 'Mon-DD-YYYY') as _created_time,
  793. TO_CHAR(update_time, 'Mon-DD-YYYY') as _update_time
  794. from public.kln_destination_delivery where serial_no = '$serial_no'");
  795. $shipmentsData = $this->search_shipment_with_booking($data['serial_no'],$data['h_serial_no'],$data['ctnr']);
  796. $email_sql = common::sendDestinationDeliveryReminder($data,$shipmentsData,$status);
  797. if(!empty($email_sql)){
  798. common::excuteUpdateSql($email_sql);
  799. }
  800. } else {
  801. $status = "Submit";
  802. $data = common::excuteObjectSql("select *, TO_CHAR(delivery_date, 'Mon-DD-YYYY') as _delivery_date,
  803. TO_CHAR(created_time, 'Mon-DD-YYYY') as _created_time,
  804. TO_CHAR(update_time, 'Mon-DD-YYYY') as _update_time
  805. from public.kln_destination_delivery where serial_no = '$serial_no'");
  806. $shipmentsData = $this->search_shipment_with_booking($data['serial_no'],$data['h_serial_no'],$data['ctnr']);
  807. $email_sql = common::sendDestinationDeliveryReminder($data,$shipmentsData,$status);
  808. if(!empty($email_sql)){
  809. common::excuteUpdateSql($email_sql);
  810. }
  811. }
  812. $data = array("msg" =>"success");
  813. common::echo_json_encode(200,$data);
  814. exit();
  815. }
  816. /**
  817. * 审核 approved or rejected cancelled
  818. */
  819. if ($operate == "review"){
  820. $serial_no = common::deCode($_POST['serial_no'], 'D');
  821. $status = common::check_input($_POST['status']);
  822. $notes = common::check_input($_POST['notes']);
  823. $action_user = _getLoginName();
  824. //前端按钮 后台权限拦截
  825. common::checkedActionLegal($serial_no,$operate);
  826. $sql = "";
  827. $update_str = "";
  828. //审核通过时,才取下放当时应用修改的地址
  829. if ($status == "Approve") {
  830. $addressSql = common::excuteOneSql("select d_address_change_log from public.kln_destination_delivery where serial_no = '$serial_no'");
  831. if(!empty($addressSql)){
  832. $sql .=$addressSql;
  833. }
  834. $update_str = "d_address_change_log = null";
  835. }
  836. $sql .= "update public.kln_destination_delivery set ".$update_str.",status = '$status', modify_by = '"._getLoginName()."',update_time = now() where serial_no = '$serial_no';";
  837. $sql .="INSERT INTO public.kln_destination_delivery_operation_log(
  838. serial_no, action,notes, create_by, created_time, created_zone)
  839. VALUES ('$serial_no', '$status','$notes', '$action_user', now(), ''); ";
  840. common::excuteUpdateSql($sql);
  841. //状态变更时,发送邮件提醒
  842. $data = common::excuteObjectSql("select *,
  843. TO_CHAR(delivery_date, 'Mon-DD-YYYY') as _delivery_date,
  844. TO_CHAR(created_time, 'Mon-DD-YYYY') as _created_time,
  845. TO_CHAR(update_time, 'Mon-DD-YYYY') as _update_time
  846. from public.kln_destination_delivery where serial_no = '$serial_no'");
  847. $shipmentsData = $this->search_shipment_with_booking($data['serial_no'],$data['h_serial_no'],$data['ctnr']);
  848. $email_sql = common::sendDestinationDeliveryReminder($data,$shipmentsData,$status);
  849. if(!empty($email_sql)){
  850. common::excuteUpdateSql($email_sql);
  851. }
  852. $data = array("msg" =>"success");
  853. common::echo_json_encode(200,$data);
  854. }
  855. /**
  856. * 邮件留言初始
  857. */
  858. if ($operate == "email_message_init"){
  859. try {
  860. $email_uuid = common::deCode($_POST['serial_no'], 'D');
  861. $emailRecords = $this->getCommunicationNew($email_uuid);
  862. common::echo_json_encode(200,array("msg" => "Sent Successfully", "emailRecords" => $emailRecords));
  863. exit();
  864. } catch (Exception $e) {
  865. common::echo_json_encode(500,array("msg" => "Sent Error."));
  866. exit();
  867. }
  868. }
  869. /**
  870. * 邮件留言
  871. */
  872. if ($operate == "email_message_board"){
  873. //前端按钮 后台权限拦截
  874. $email_uuid = common::deCode($_POST['serial_no'], 'D');
  875. common::checkedActionLegal($email_uuid,$operate);
  876. try {
  877. $content = $_POST["content"];
  878. $content = common::check_input($content);
  879. $content = urldecode($content);
  880. $text = $_POST["text"];
  881. $web_content = urldecode($text);
  882. $serial_no = common::uuid();
  883. $email_uuid = common::deCode($_POST['serial_no'], 'D');
  884. $add_by = _getLoginName();
  885. $refer_id = 0;
  886. $from_email = "US.KApex.Online@kerryapex.com";
  887. $to_email = $_POST["kln_pic"];
  888. $cc_email = "";
  889. $communication_cc = $_POST["communication_cc"];
  890. $communication_cc = trim($communication_cc);
  891. if (!empty($communication_cc)) {
  892. $communication_cc = common::check_input($communication_cc);
  893. $cc_email = $communication_cc;
  894. }
  895. $user_from = _getLoginName();
  896. //邮件发送
  897. $title = "Destination Delivery from " . _getLoginName() . ", Shipment No: " . $_POST["h_bol"];
  898. $emailContent = $content;
  899. 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());");
  900. $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)
  901. VALUES ('$serial_no', '$email_uuid', '$emailContent','$web_content', '$user_from', '$to_email', '$cc_email', $refer_id, '$add_by', now(), '$communication_cc');");
  902. $emailRecords = $this->getCommunicationNew($email_uuid);
  903. common::echo_json_encode(200,array("msg" => "Sent Successfully", "emailRecords" => $emailRecords));
  904. exit();
  905. } catch (Exception $e) {
  906. common::echo_json_encode(500,array("msg" => "Sent Error."));
  907. exit();
  908. }
  909. }
  910. /**
  911. * view detail and log
  912. */
  913. if ($operate == "view_detail"){
  914. $serial_no = common::deCode($_POST['serial_no'], 'D');
  915. //前端按钮 后台权限拦截
  916. common::checkedActionLegal($serial_no,$operate);
  917. $data = common::excuteObjectSql("select * from public.kln_destination_delivery where serial_no = '$serial_no'");
  918. $_shipmentsData = array();
  919. $shipmentsData = $this->search_shipment_with_booking($data['serial_no'],$data['h_serial_no'],$data['ctnr']);
  920. foreach($shipmentsData["data"] as $shipment){
  921. $_shipmentsData[] = array("HBOL No." => $shipment['h_bol'],"Container No." => $shipment['ctnr'],
  922. "Service Type" => $shipment['service'],"ETA" => $shipment['eta'],
  923. "Recommended Delivery Date" => $shipment['date_range']);
  924. }
  925. $_operation_log = array();
  926. $operation_log = common::excuteListSql("select * from public.kln_destination_delivery_operation_log where serial_no = '$serial_no' order by id desc");
  927. foreach($operation_log as $log){
  928. $action = $log['action'] == "Pending Approval" ? "Submit" : $log['action'];
  929. $_operation_log[] = array("time" => $log['created_time'],"timezone" => $log['created_zone'],
  930. "label" => $action,"createdBy" => $log['create_by'],
  931. "tips" => $log['notes']);
  932. }
  933. $retData = $data;
  934. $retData["status"] = common::deliveryStatusConvert($retData["status"]);
  935. $retData['shipmentsData'] = $_shipmentsData;
  936. $retData['operation_log'] = $_operation_log;
  937. $data = array("msg" =>"success","data"=>$retData);
  938. common::echo_json_encode(200,$data);
  939. exit();
  940. }
  941. /**
  942. * Delivery date
  943. */
  944. if ($operate == "delivery_date_load"){
  945. $sqlWhere = ' where ' . common::searchExtendHand_KLN("ocean", $_SESSION["ONLINE_USER"]);
  946. //兜底规则
  947. //$sqlWhere .= " and eta >= now() - INTERVAL '6 months' and eta <= now() + INTERVAL '6 months'";
  948. //代表employee
  949. if(_isApexLogin()){
  950. //$sqlWhere .= " and kln_pic = '"._getLoginEamil()."'";
  951. }
  952. $sqlWhere_befrom_filterTag = $sqlWhere;
  953. $sql = "select delivery_date::date as delivery_date,
  954. sum(case when status ='Pending Approval' then 1 else 0 end) as pending_approval_rc,
  955. sum(case when status ='Approve' then 1 else 0 end) as approved_rc
  956. from public.kln_destination_delivery
  957. where exists(select 1 from public.kln_ocean oo ". $sqlWhere_befrom_filterTag." and oo.serial_no = any(h_serial_no))
  958. group by delivery_date::date order by delivery_date::date desc";
  959. $rs = common::excuteListSql($sql);
  960. $dateArr = new stdClass();
  961. foreach($rs as $val){
  962. //$dateArr[] = array($val['delivery_date'] => array("pending"=>$val['pending_approval_rc'],"approved"=>$val['approved_rc']));
  963. $dateArr->{$val['delivery_date']} = new stdClass();
  964. $dateArr->{$val['delivery_date']}->pending = $val['pending_approval_rc'];
  965. $dateArr->{$val['delivery_date']}->approved = $val['approved_rc'];
  966. }
  967. $data = array("msg" =>"success","data"=>$dateArr);
  968. common::echo_json_encode(200,$data);
  969. }
  970. }
  971. private function getCommunicationNew($serial_no) {
  972. $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");
  973. $emialRecords =array();
  974. foreach ($list as $k => $v) {
  975. $msg =array();
  976. $msg["name"] = $v["add_by"];
  977. $msg["creatTime"] = $v["add_times"];
  978. $msg["content"] = urldecode($v["web_content"]);
  979. $emialRecords[] = $msg;
  980. }
  981. return $emialRecords;
  982. }
  983. function search_shipment(){
  984. $sqlWhere_common = ' where ' . common::searchExtendHand_KLN("ocean", $_SESSION["ONLINE_USER"]);
  985. //根據用戶的賬號權限所能看到的全部shipment數據的目的地站點,去匹配是否有開通destination delivery的服務,如果未開通,則展示此提示頁面
  986. //兜底规则
  987. $sqlWhere = $sqlWhere_common;
  988. //$sqlWhere .= " and eta >= now() - INTERVAL '6 months' and eta <= now() + INTERVAL '6 months'";
  989. // $checkOpenSql = "with oo as ( select DISTINCT agent from public.kln_ocean oo ". $sqlWhere.")
  990. // select agent from oo
  991. // where exists(select 1 from public.kln_destination_delivery_config where oo.agent in (select regexp_split_to_table(station, E',')))
  992. // limit 1";
  993. $checkOpenSql = "select station from public.kln_destination_delivery_config dc
  994. where exists(select 1 from
  995. public.kln_ocean oo ". $sqlWhere."
  996. and oo.agent in (select regexp_split_to_table(dc.station, E',')) limit 1
  997. )";
  998. $config = common::excuteListSql($checkOpenSql);
  999. if(empty($config)){
  1000. return array("msg"=>"Destination Delivery Service Not Available","data"=>"");
  1001. }
  1002. //根據用戶的賬號權限所能看到的全部shipment數據的目的地站點,去匹配是否有開通destination delivery的服務,如果有開通,但沒有符合條件的shipment,則展示此提示頁面
  1003. $sqlWhere = $sqlWhere_common;
  1004. //$sqlWhere .= " and eta >= now() - INTERVAL '6 months' and eta <= now() + INTERVAL '6 months'";
  1005. $text_search = $_REQUEST['text_search'];
  1006. if (!empty($text_search)){
  1007. $sqlWhere .= " and (oo.h_bol ilike '%".strtolower($text_search)."%'
  1008. or oo.po_no ilike '%".strtolower($text_search)."%'
  1009. or oo.ctnrs ilike '%".strtolower($text_search)."%')";
  1010. }
  1011. //vessel name
  1012. $vessel = $_REQUEST['vessel'];
  1013. if (!empty($vessel)){
  1014. $sqlWhere .= " and vessel ilike '%".strtolower($vessel)."'%";
  1015. }
  1016. $consignee = $_REQUEST['consignee'];
  1017. if (!empty($vessel)){
  1018. $sqlWhere .= " and consignee ilike '%".strtolower($consignee)."'%";
  1019. }
  1020. $shipper = $_REQUEST['shipper'];
  1021. if (!empty($vessel)){
  1022. $sqlWhere .= " and shipper ilike '%".strtolower($shipper)."'%";
  1023. }
  1024. if (isset($_REQUEST['eta_start']) && !empty($_REQUEST['eta_start']))
  1025. $sqlWhere .= " and eta >= '" . common::usDate2sqlDate($_REQUEST['eta_start']) . " 00:00:00'";
  1026. if (isset($_REQUEST['eta_end']) && !empty($_REQUEST['eta_end']))
  1027. $sqlWhere .= " and eta <= '" . common::usDate2sqlDate($_REQUEST['eta_end']) . " 23:59:59'";
  1028. if (isset($_REQUEST['ata_start']) && !empty($_REQUEST['ata_start']))
  1029. $sqlWhere .= " and ata >= '" . common::usDate2sqlDate($_REQUEST['ata_start']) . " 00:00:00'";
  1030. if (isset($_REQUEST['ata_end']) && !empty($_REQUEST['ata_end']))
  1031. $sqlWhere .= " and ata <= '" . common::usDate2sqlDate($_REQUEST['ata_end']) . " 23:59:59'";
  1032. $sql = "with oo as(
  1033. select * from public.kln_ocean oo ". $sqlWhere ."
  1034. ),
  1035. ooc as (
  1036. select oo.*,
  1037. dc.serial_no as dc_serial_no,
  1038. dc.country as dc_country,
  1039. dc.kln_pic as dc_kln_pic
  1040. from public.kln_destination_delivery_config dc
  1041. Inner Join oo
  1042. on oo.agent in (select regexp_split_to_table(dc.station, ','))
  1043. where 1=1 --and
  1044. --case when dc.booking_window = 'Restrictions_ETD_ATD' and COALESCE(dc.booking_window_date_start,'')<>'' and COALESCE(dc.booking_window_date_end,'')<>''
  1045. -- 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
  1046. -- when dc.booking_window = 'Restrictions_ETA_ATA' and COALESCE(dc.booking_window_date_start,'')<>'' and COALESCE(dc.booking_window_date_end,'')<>''
  1047. -- 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
  1048. --else 1=1 end
  1049. ),
  1050. matched_data as (
  1051. select
  1052. ooc.serial_no,
  1053. ooc.h_bol,
  1054. ooc.m_bol,
  1055. oc.ctnr,
  1056. ooc.service,
  1057. ooc.po_no,
  1058. (select reference_no from public.ocean o where o.serial_no = ooc.serial_no limit 1) as reference_no,
  1059. ooc.transport_mode,
  1060. oc.qty::text as pakages,
  1061. oc.unit as package_type ,
  1062. oc.grs_kgs::text as kgw,
  1063. oc.cbm as volume,
  1064. ooc.vessel,
  1065. ooc.voyage,
  1066. ooc.carrier,
  1067. ooc.fport_of_loading_un,
  1068. ooc.mport_of_discharge_un,
  1069. ooc.eta,
  1070. ooc.ata,
  1071. ooc.shipper,
  1072. ooc.consignee_id,
  1073. ooc.consignee,
  1074. (select customer_name from public.ocean_extend ex where ex.serial_no = ooc.serial_no limit 1) as controlling_customer,
  1075. ooc.booking_no,
  1076. (select manifest_type from public.ocean o where o.serial_no = ooc.serial_no limit 1) as manifest_type,
  1077. dc_serial_no,
  1078. dc_country,
  1079. dc_kln_pic,
  1080. ooc.agent,
  1081. ooc.order_from
  1082. from ooc
  1083. LEFT JOIN public.oc_container oc ON oc.serial_no::text = ooc.serial_no::text
  1084. where ooc.order_from = 'public' and transport_mode = 'sea'
  1085. union all
  1086. select
  1087. ooc.serial_no,
  1088. ooc.h_bol,
  1089. ooc.m_bol,
  1090. oc.ctnr,
  1091. ooc.service,
  1092. ooc.po_no,
  1093. (select reference_no from sfs.ocean o where o.serial_no = ooc.serial_no limit 1) as reference_no,
  1094. ooc.transport_mode,
  1095. oc.qty::text as pakages,
  1096. oc.unit as package_type ,
  1097. oc.grs_kgs::text as kgw,
  1098. oc.cbm as volume,
  1099. ooc.vessel,
  1100. ooc.voyage,
  1101. ooc.carrier,
  1102. ooc.fport_of_loading_un,
  1103. ooc.mport_of_discharge_un,
  1104. ooc.eta,
  1105. ooc.ata,
  1106. ooc.shipper,
  1107. ooc.consignee_id,
  1108. ooc.consignee,
  1109. (select customer_name from ocean_extend ex where ex.serial_no = ooc.serial_no limit 1) as controlling_customer,
  1110. ooc.booking_no,
  1111. (select manifest_type from sfs.ocean o where o.serial_no = ooc.serial_no limit 1) as manifest_type,
  1112. dc_serial_no,
  1113. dc_country,
  1114. dc_kln_pic,
  1115. ooc.agent,
  1116. ooc.order_from
  1117. from ooc
  1118. LEFT JOIN sfs.oc_container oc ON oc.serial_no::text = ooc.serial_no::text
  1119. where ooc.order_from = 'sfs' and transport_mode = 'sea'
  1120. union all
  1121. select
  1122. ooc.serial_no,
  1123. ooc.h_bol,
  1124. ooc.m_bol,
  1125. '' as ctnr,
  1126. ooc.service,
  1127. ooc.po_no,
  1128. '' as reference_no,
  1129. ooc.transport_mode,
  1130. ooc.qty as pakages,
  1131. ooc.qty_uom as package_type ,
  1132. ooc.piece_count as kgw,
  1133. ooc.cbm as volume,
  1134. ooc.vessel,
  1135. ooc.voyage,
  1136. ooc.carrier,
  1137. ooc.fport_of_loading_un,
  1138. ooc.mport_of_discharge_un,
  1139. ooc.eta,
  1140. ooc.ata,
  1141. ooc.shipper,
  1142. ooc.consignee_id,
  1143. ooc.consignee,
  1144. '' as controlling_customer,
  1145. ooc.booking_no,
  1146. '' as manifest_type,
  1147. dc_serial_no,
  1148. dc_country,
  1149. dc_kln_pic,
  1150. ooc.agent,
  1151. ooc.order_from
  1152. from ooc
  1153. where ooc.transport_mode = 'air'
  1154. )
  1155. select md.*,
  1156. CASE
  1157. WHEN r.recommended_delivery_from IS NOT NULL AND r.recommended_delivery_to IS NOT NULL THEN
  1158. to_char((COALESCE(ata, eta) - (r.recommended_delivery_from ||' days')::INTERVAL)::date, 'YYYY.MM.DD')
  1159. || '-' ||
  1160. to_char((COALESCE(ata, eta) + (r.recommended_delivery_to ||' days')::INTERVAL)::date, 'YYYY.MM.DD')
  1161. WHEN r.recommended_delivery_from IS NULL AND r.recommended_delivery_to IS NOT NULL THEN
  1162. '-' ||
  1163. to_char((COALESCE(ata, eta) + (r.recommended_delivery_to || ' days')::INTERVAL)::date, 'YYYY.MM.DD')
  1164. WHEN r.recommended_delivery_from IS NOT NULL AND r.recommended_delivery_to IS NULL THEN
  1165. to_char((COALESCE(ata, eta) - (r.recommended_delivery_from || ' days')::INTERVAL)::date, 'YYYY.MM.DD')
  1166. || '-'
  1167. ELSE '' END
  1168. AS date_range,
  1169. r.recommended_delivery_from,
  1170. r.recommended_delivery_to,
  1171. CASE
  1172. WHEN r.recommended_delivery_from IS NOT NULL THEN
  1173. (COALESCE(ata, eta) - (r.recommended_delivery_from ||' days')::INTERVAL)::date
  1174. ELSE null END
  1175. AS recommended_delivery_from_date,
  1176. CASE
  1177. WHEN r.recommended_delivery_to IS NOT NULL THEN
  1178. (COALESCE(ata, eta) + (r.recommended_delivery_to ||' days')::INTERVAL)::date
  1179. ELSE null END
  1180. AS recommended_delivery_to_date
  1181. from matched_data md
  1182. LEFT JOIN LATERAL (
  1183. SELECT
  1184. r.*
  1185. FROM public.kln_destination_delivery_rule r
  1186. WHERE md.transport_mode = r.mode_type
  1187. and r.recommended_delivery_serial_no = md.dc_serial_no
  1188. AND ((md.transport_mode = 'sea' AND (
  1189. (r.ports ilike '%'|| md.mport_of_discharge_un ||'%' AND r.carrier ilike '%'|| md.carrier ||'%')
  1190. OR (r.ports ilike '%'|| md.mport_of_discharge_un ||'%' AND r.carrier = 'ALL')
  1191. OR (r.ports = 'ALL' AND r.carrier ilike '%'|| md.carrier ||'%')
  1192. OR (r.ports = 'ALL' AND r.carrier = 'ALL'))
  1193. )
  1194. OR (md.transport_mode = 'air' AND (
  1195. r.ports ilike '%'|| md.mport_of_discharge_un ||'%'
  1196. OR r.ports = 'ALL')
  1197. )
  1198. )
  1199. ORDER BY priority asc
  1200. LIMIT 1
  1201. ) r ON true
  1202. order by md.eta desc limit 100";
  1203. $rs = common::excuteListSql($sql);
  1204. error_log($sql);
  1205. if(empty($rs)){
  1206. return array("msg"=>"No Eligible Shipments for Booking","data"=>"");
  1207. }
  1208. return array("msg"=>"","data"=>$rs);
  1209. }
  1210. /**
  1211. * 不依赖配置的规则查询,如果规则已经移除或者修改不在查询范围内,開通期間創建的booking數據正常保留和展示
  1212. */
  1213. function search_shipment_with_booking($serial_no,$h_serial_no,$ctnr){
  1214. $sqlWhere = "where oo.serial_no = ANY('".$h_serial_no."'::TEXT[])";
  1215. $sql = "with ooc as(
  1216. select * from public.kln_ocean oo ". $sqlWhere ."
  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. (select customer_name from public.ocean_extend ex where ex.serial_no = ooc.serial_no limit 1) as controlling_customer,
  1243. ooc.booking_no,
  1244. (select manifest_type from public.ocean o where o.serial_no = ooc.serial_no limit 1) as manifest_type,
  1245. ooc.agent,
  1246. ooc.order_from
  1247. from ooc
  1248. LEFT JOIN public.oc_container oc ON oc.serial_no::text = ooc.serial_no::text
  1249. where ooc.order_from = 'public' and transport_mode = 'sea' and oc.ctnr in (select regexp_split_to_table('".$ctnr."', ','))
  1250. union all
  1251. select
  1252. ooc.serial_no,
  1253. ooc.h_bol,
  1254. ooc.m_bol,
  1255. oc.ctnr,
  1256. ooc.service,
  1257. ooc.po_no,
  1258. (select reference_no from sfs.ocean o where o.serial_no = ooc.serial_no limit 1) as reference_no,
  1259. ooc.transport_mode,
  1260. oc.qty::text as pakages,
  1261. oc.unit as package_type ,
  1262. oc.grs_kgs::text as kgw,
  1263. oc.cbm as volume,
  1264. ooc.vessel,
  1265. ooc.voyage,
  1266. ooc.carrier,
  1267. ooc.fport_of_loading_un,
  1268. ooc.mport_of_discharge_un,
  1269. ooc.eta,
  1270. ooc.ata,
  1271. ooc.shipper,
  1272. ooc.consignee_id,
  1273. ooc.consignee,
  1274. (select customer_name from ocean_extend ex where ex.serial_no = ooc.serial_no limit 1) as controlling_customer,
  1275. ooc.booking_no,
  1276. (select manifest_type from sfs.ocean o where o.serial_no = ooc.serial_no limit 1) as manifest_type,
  1277. ooc.agent,
  1278. ooc.order_from
  1279. from ooc
  1280. LEFT JOIN sfs.oc_container oc ON oc.serial_no::text = ooc.serial_no::text
  1281. where ooc.order_from = 'sfs' and transport_mode = 'sea' and oc.ctnr in (select regexp_split_to_table('".$ctnr."', ','))
  1282. union all
  1283. select
  1284. ooc.serial_no,
  1285. ooc.h_bol,
  1286. ooc.m_bol,
  1287. '' as ctnr,
  1288. ooc.service,
  1289. ooc.po_no,
  1290. '' as reference_no,
  1291. ooc.transport_mode,
  1292. ooc.qty as pakages,
  1293. ooc.qty_uom as package_type ,
  1294. ooc.piece_count as kgw,
  1295. ooc.cbm as volume,
  1296. ooc.vessel,
  1297. ooc.voyage,
  1298. ooc.carrier,
  1299. ooc.fport_of_loading_un,
  1300. ooc.mport_of_discharge_un,
  1301. ooc.eta,
  1302. ooc.ata,
  1303. ooc.shipper,
  1304. ooc.consignee_id,
  1305. ooc.consignee,
  1306. '' as controlling_customer,
  1307. ooc.booking_no,
  1308. '' as manifest_type,
  1309. ooc.agent,
  1310. ooc.order_from
  1311. from ooc
  1312. where ooc.transport_mode = 'air'
  1313. )
  1314. select md.*,
  1315. CASE
  1316. WHEN kd.recommended_delivery_window_date_from IS NOT NULL AND kd.recommended_delivery_window_date_to IS NOT NULL THEN
  1317. to_char((recommended_delivery_window_date_from)::date, 'YYYY-MM-DD')
  1318. || ';' ||
  1319. to_char((recommended_delivery_window_date_to)::date, 'YYYY-MM-DD')
  1320. WHEN kd.recommended_delivery_window_date_from IS NULL AND kd.recommended_delivery_window_date_to IS NOT NULL THEN
  1321. ';' ||
  1322. to_char((recommended_delivery_window_date_to)::date, 'YYYY-MM-DD')
  1323. WHEN kd.recommended_delivery_window_date_from IS NOT NULL AND kd.recommended_delivery_window_date_to IS NULL THEN
  1324. to_char((recommended_delivery_window_date_from)::date, 'YYYY-MM-DD')
  1325. || ';'
  1326. ELSE ''
  1327. END AS date_range,
  1328. kd.recommended_delivery_from,
  1329. kd.recommended_delivery_to,
  1330. kd.recommended_delivery_window_date_from as recommended_delivery_from_date,
  1331. kd.recommended_delivery_window_date_to as recommended_delivery_to_date,
  1332. (select dc.country from public.kln_destination_delivery_config dc where md.agent in (select regexp_split_to_table(dc.station, ','))) as dc_country
  1333. from matched_data md
  1334. LEFT join public.kln_destination_delivery kd on kd.serial_no = '$serial_no'
  1335. order by md.eta desc";
  1336. //error_log($sql);
  1337. $rs = common::excuteListSql($sql);
  1338. return array("msg"=>"","data"=>$rs);
  1339. }
  1340. function groupShipments($booking_no, $manifest_type, $h_bol,$h_serial_no, $order_from,$m_bol, $ctnr,$kln_pic,$consignee,$consignee_id,
  1341. $recommended_delivery_window_date_from, $recommended_delivery_window_date_to,
  1342. $recommended_delivery_from,$recommended_delivery_to,$dc_country){
  1343. // Combine the data into an array of shipments
  1344. $shipments = [];
  1345. foreach ($h_bol as $index => $_h_bol) {
  1346. $shipments[] = [
  1347. 'booking_no' =>$booking_no[$index],
  1348. 'manifest_type' => $manifest_type[$index],
  1349. 'h_bol' => $h_bol[$index],
  1350. 'h_serial_no' => $h_serial_no[$index],
  1351. 'order_from' => $order_from[$index],
  1352. 'm_bol' => $m_bol[$index],
  1353. 'ctnr' => $ctnr[$index],
  1354. 'kln_pic' => $kln_pic[$index],
  1355. 'consignee' => $consignee[$index],
  1356. 'consignee_id' => $consignee_id[$index],
  1357. 'dc_country' => $dc_country[$index],
  1358. 'recommended_delivery_window_date_from' => $recommended_delivery_window_date_from[$index],
  1359. 'recommended_delivery_window_date_to' => $recommended_delivery_window_date_to[$index],
  1360. 'recommended_delivery_from' => $recommended_delivery_from[$index],
  1361. 'recommended_delivery_to' => $recommended_delivery_to[$index]
  1362. ];
  1363. }
  1364. // 按 MBOL 分组
  1365. $groupedByMbol = [];
  1366. // 按 ShipmentID 分组
  1367. $groupedByShipmentId = [];
  1368. foreach ($shipments as $item) {
  1369. $m_bol = $item['m_bol'];
  1370. $h_serial_no = $item['h_serial_no'];
  1371. $h_bol = $item['h_bol'];
  1372. $order_from = $item['order_from'];
  1373. $ctnr = $item['ctnr'];
  1374. $dc_country = $item['dc_country'];
  1375. $consignee_id = $item['consignee_id'];
  1376. if($item['manifest_type'] == 'BCN'){
  1377. if (!isset($groupedByMbol[$m_bol])) {
  1378. $item['h_bol'] = array();
  1379. $item['h_bol_multiple_link'] = array();
  1380. $item['h_serial_no'] = array();
  1381. $item['ctnr'] = array();
  1382. $item['dc_country'] = array();
  1383. $item['consignee_id'] = array();
  1384. $item['m_bol'] = array($item['m_bol']);
  1385. $groupedByMbol[$m_bol] = $item;
  1386. }
  1387. if (!in_array($h_serial_no, $groupedByMbol[$m_bol]['h_serial_no'])) {
  1388. $groupedByMbol[$m_bol]['h_bol'][] = $h_bol;
  1389. $groupedByMbol[$m_bol]['h_bol_multiple_link'][] = array("key"=>$h_bol,"value" =>$h_serial_no,"order_from"=>$order_from);
  1390. $groupedByMbol[$m_bol]['h_serial_no'][] = $h_serial_no;
  1391. $groupedByMbol[$m_bol]['dc_country'][] = $dc_country;
  1392. $groupedByMbol[$m_bol]['consignee_id'][] = $consignee_id;
  1393. }
  1394. if (!in_array($ctnr, $groupedByMbol[$m_bol]['ctnr'])) {
  1395. $groupedByMbol[$m_bol]['ctnr'][] = $ctnr;
  1396. }
  1397. } else {
  1398. if (!isset($groupedByShipmentId[$h_serial_no])) {
  1399. $item['m_bol'] = array();
  1400. $item['ctnr'] = array();
  1401. $item['dc_country'] = array($item['dc_country']);
  1402. $item['consignee_id'] = array($item['consignee_id']);
  1403. $item['h_serial_no'] = array($item['h_serial_no']);
  1404. $item['h_bol'] = array($item['h_bol']);
  1405. $item['h_bol_multiple_link'] = array(array("key"=>$h_bol,"value" =>$h_serial_no,"order_from"=>$order_from));
  1406. $groupedByShipmentId[$h_serial_no] = $item;
  1407. }
  1408. if (!in_array($m_bol, $groupedByShipmentId[$h_serial_no]['m_bol'])) {
  1409. $groupedByShipmentId[$h_serial_no]['m_bol'][] = $m_bol;
  1410. }
  1411. if (!in_array($ctnr, $groupedByShipmentId[$h_serial_no]['ctnr'])) {
  1412. $groupedByShipmentId[$h_serial_no]['ctnr'][] = $ctnr;
  1413. }
  1414. }
  1415. }
  1416. $result = array();
  1417. foreach($groupedByMbol as $mb){
  1418. $result[] = $mb;
  1419. }
  1420. foreach($groupedByShipmentId as $hb){
  1421. $result[] = $hb;
  1422. }
  1423. return $result;
  1424. }
  1425. }
  1426. ?>