destination_delivery.class.php 101 KB

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