shipLogistic.jsp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. <%@ page contentType="text/html;charset=UTF-8" %>
  2. <%@ include file="/WEB-INF/views/include/taglib.jsp"%>
  3. <html>
  4. <head>
  5. <title>订单列表-添加物流</title>
  6. <meta name="decorator" content="default"/>
  7. <style type="text/css">
  8. *{margin: 0;padding: 0}
  9. a{list-style: none;text-decoration: none}
  10. i{font-style: normal}
  11. body{background-color: rgb(255,255,255);}
  12. h3{line-height: 20px;padding:20px 0 20px 15px; border-bottom: 1px solid #CCCCCC;font-weight: normal}
  13. .body-margin{margin:26px}
  14. .left-span{width: 3px;height: 20px;margin-right:10px;background-color: #00A6C7;display: inline-block;vertical-align: bottom}
  15. .bj{position: fixed;width: 100%;height: 100%;bottom: 0;top:0;left: 0;z-index: 99;}
  16. .delivery-info{padding: 15px;background-color: #f5f5f5;}
  17. .shop-title{ color: #000;border-bottom: 1px solid #ccc;padding: 20px;margin-bottom: 20px;}
  18. .table{width: 100%;border-collapse: collapse;}
  19. .table th{color: #000;font-weight: normal}
  20. .table th,.table td{width: 25%;height: 35px;border: 1px solid #CCCCCC;text-align: center;padding: 5px 0;}
  21. .table td img{width: 60px;height: 60px;vertical-align: middle}
  22. .express-delivery{font-size: 14px;}
  23. .express-div{padding:10px 0;}
  24. .express-div label{width: 100px;line-height: 35px;display: inline-block;vertical-align: middle}
  25. .select-btn{display: inline-block;}
  26. .select-btn input{width: 210px;height: 35px; vertical-align: top;box-sizing: border-box !important;}
  27. .the-span{display: inline-block;float: none;margin-left: 0; width: 35px;height: 35px;line-height: 33px; box-sizing: border-box; vertical-align: top; border: 1px solid #ccc;cursor: pointer; text-align: center;font-size: 24px;border-radius: 4px;}
  28. input::-webkit-input-placeholder {text-align: center}
  29. .mask{padding:20px 20px 20px 120px;font-size: 14px;position:relative;}
  30. .mask label{position:absolute;left:20px;width: 100px;}
  31. .mask textarea{resize: none;width: 260px;height: 130px;vertical-align: middle}
  32. .cencal-btn{margin-left: 130px;}
  33. .cencal-btn span{display: inline-block;padding: 7px 25px;border: 1px solid #CCCCCC;border-radius: 5px; cursor: pointer;}
  34. .cencal-btn span:last-child{background-color: #00A6C7;border-color: #00A6C7;margin-left: 30px;color: #fff}
  35. .border-express{border-top: 1px solid #ccc;margin-top: 15px;}
  36. .logistic-already{font-size: 14px;width: 600px;border-bottom: 1px solid #CCCCCC}
  37. .logistic-already h3{border: 0}
  38. .have-logistic{font-size: 0;}
  39. .logistic-item{width: 50%;display: inline-block;font-size: 14px;vertical-align: text-top}
  40. .logistic-item div{margin-bottom: 15px;}
  41. .logistic-item div label{display: inline-block;margin-right: 15px;}
  42. .input{height: 100%;border: 0}
  43. .change-info{position: fixed;top: 20%;left: 50%;transform:translateX(-50%);z-index: 999;padding: 50px;background-color: #fff;box-shadow: 0px 0px 15px #ccc;}
  44. .mar-css{margin-left: 5px !important;}
  45. .controls{font-size:0}
  46. .upload-content{position:relative;}
  47. .upload-content *{margin:0;padding:0;}
  48. .upload-content .conList{display:inline-block;margin-right:5px;width:90px;height:90px;background:#e6e6e6;border-radius:5px;position:relative;overflow:hidden}
  49. .upload-content .conList li{position:relative;padding:18px 0}
  50. .upload-content .conList li img{width:100%;margin:0 !important;padding:0 !important}
  51. .upload-content img.cancel-upload{position:absolute;top:0;right:0;cursor:pointer;z-index:100}
  52. .upload-content .conList .btn{position:absolute;width:100%;height:100%;top:0;left:0;background:#e6e6e6}
  53. .upload-content .conList .btn div{padding-top:20px}
  54. .upload-content .conList .btn div span{font-size:35px}
  55. .hide-pic{display:none !important}
  56. .upload-tips{margin:10px 0}
  57. </style>
  58. </head>
  59. <body>
  60. <ul class="nav nav-tabs">
  61. <li><a href="${ctx}/order/orderList">订单列表</a></li>
  62. <li><a href="${ctx}/order/toDeliveryPage?id=${orderID}">发货</a></li>
  63. <li class="active"><a href="${ctx}/order/toShipLogistic?orderID=${orderID}">添加物流</a></li>
  64. </ul>
  65. <div class="change-info" style="display: none">发货数量大于总数量</div>
  66. <div class="bj" style="display: none"></div>
  67. <div class="body-margin">
  68. <div class="shop-info">
  69. <table class="table">
  70. <tr class="first-tr">
  71. <th>供应商</th>
  72. <th>商品图片</th>
  73. <th>商品名称</th>
  74. <th>购买数量</th>
  75. <th>赠品数量</th>
  76. <th>已发数量</th>
  77. <th>本次发货</th>
  78. </tr>
  79. </table>
  80. </div>
  81. <div class="delivery-info">
  82. <div class="express-delivery">
  83. <div class="express-div">
  84. <label><i>*</i>快递公司</label>
  85. <div class="select-btn" id="qqq">
  86. <select class="express-input required input-xlarge" style="width:300px;">
  87. <c:forEach items="${fns:getDictList('kd_type')}" var="kd">
  88. <option value="${kd.label}">${kd.label}</option>
  89. </c:forEach>
  90. </select>
  91. <span onclick="input(this)" class="span_jia the-span">+</span>
  92. </div>
  93. </div>
  94. <div class="express-div ship-num">
  95. <label><i>*</i>物流编号</label>
  96. <div class="select-btn">
  97. <input class="single-num" type="text" placeholder="请输入单号" style="width:300px;">
  98. <span onclick="input(this)" class="dan_jia the-span">+</span>
  99. </div>
  100. </div>
  101. </div>
  102. <div class="mask">
  103. <label>图片备注:</label>
  104. <div class="imgbox">
  105. <div class="controls upload-content" id="remarkImageBox">
  106. <div class="conList">
  107. <input type="hidden" id="image1" maxlength="150" class="imagesInput">
  108. <sys:ckfinder input="image1" type="images" uploadPath="/photo" selectMultiple="false" maxWidth="100" maxHeight="100"/>
  109. </div>
  110. <div class="conList hide-pic">
  111. <input type="hidden" id="image2" maxlength="150" class="imagesInput">
  112. <sys:ckfinder input="image2" type="images" uploadPath="/photo" selectMultiple="false" maxWidth="100" maxHeight="100"/>
  113. </div>
  114. <div class="conList hide-pic">
  115. <input type="hidden" id="image3" maxlength="150" class="imagesInput">
  116. <sys:ckfinder input="image3" type="images" uploadPath="/photo" selectMultiple="false" maxWidth="100" maxHeight="100"/>
  117. </div>
  118. <div class="conList hide-pic">
  119. <input type="hidden" id="image4" maxlength="150" class="imagesInput">
  120. <sys:ckfinder input="image4" type="images" uploadPath="/photo" selectMultiple="false" maxWidth="100" maxHeight="100"/>
  121. </div>
  122. <div class="conList hide-pic">
  123. <input type="hidden" id="image5" maxlength="150" class="imagesInput">
  124. <sys:ckfinder input="image5" type="images" uploadPath="/photo" selectMultiple="false" maxWidth="100" maxHeight="100"/>
  125. </div>
  126. <div class="conList hide-pic">
  127. <input type="hidden" id="image6" maxlength="150" class="imagesInput">
  128. <sys:ckfinder input="image6" type="images" uploadPath="/photo" selectMultiple="false" maxWidth="100" maxHeight="100"/>
  129. </div>
  130. <div class="conList hide-pic">
  131. <input type="hidden" id="image7" maxlength="150" class="imagesInput">
  132. <sys:ckfinder input="image7" type="images" uploadPath="/photo" selectMultiple="false" maxWidth="100" maxHeight="100"/>
  133. </div>
  134. <div class="conList hide-pic">
  135. <input type="hidden" id="image8" maxlength="150" class="imagesInput">
  136. <sys:ckfinder input="image8" type="images" uploadPath="/photo" selectMultiple="false" maxWidth="100" maxHeight="100"/>
  137. </div>
  138. <div class="conList hide-pic">
  139. <input type="hidden" id="image9" maxlength="150" class="imagesInput">
  140. <sys:ckfinder input="image9" type="images" uploadPath="/photo" selectMultiple="false" maxWidth="100" maxHeight="100"/>
  141. </div>
  142. <div class="conList hide-pic">
  143. <input type="hidden" id="image10" maxlength="150" class="imagesInput">
  144. <sys:ckfinder input="image10" type="images" uploadPath="/photo" selectMultiple="false" maxWidth="100" maxHeight="100"/>
  145. </div>
  146. </div>
  147. <div class="conList upload-tips"><span style="color:red;">注意:请上传jpg / png格式的图片,最大不超过5M,最多可上传10张</span></div>
  148. </div>
  149. </div>
  150. <div class="mask">
  151. <label>备注:</label>
  152. <textarea class="mask-text" placeholder="请输入备注文字,200字以内..." maxlength="200" style="width:300px;"></textarea>
  153. <p style="width:300px;text-align:right;"><span id="remarkLen" style="color:red;">0</span>/200</p>
  154. </div>
  155. <div class="cencal-btn">
  156. <span><a href="javascript:history.go(-1)">取消</a></span>
  157. <span class="confirm">确认</span>
  158. </div>
  159. </div>
  160. </div>
  161. <script>
  162. var op_html = "";
  163. window.onload = function () {
  164. var spanjia_ = document.getElementsByClassName('span_jia');
  165. var express_ = document.getElementsByClassName('express-delivery');
  166. var danjia_ = document.getElementsByClassName('dan_jia');
  167. var shipnum_ = document.getElementsByClassName('ship-num');
  168. var input_ = document.getElementsByClassName('input')//数量输入框
  169. var confirm_ = document.getElementsByClassName('confirm');//确定按钮
  170. var expressDelivery_ = document.getElementsByClassName('express-delivery');//循环物流
  171. var masktext_ = document.getElementsByClassName('mask-text');//备注
  172. var singlenum_= document.getElementsByClassName('single-num');//新建输入框判断
  173. var obj = {};
  174. // var valuearr = {};
  175. var expressval = document.getElementsByTagName('select');//物流快递
  176. var index = expressval[0].selectedIndex ;//索引值
  177. var value = expressval[0].options[index].value;
  178. var arr = [];
  179. for(var i=0;i<expressval[0].options.length;i++){
  180. var valuearr = {};
  181. valuearr['name'] = expressval[0].options[i].text;
  182. valuearr['value'] = expressval[0].options[i].value;
  183. arr.push(valuearr);
  184. }
  185. //新建输入框判断
  186. for(var i=0;i<singlenum_.length;i++){
  187. }
  188. //输入框判断
  189. for(var i=0;i<input_.length;i++){
  190. input_[i].onchange = function () {
  191. var intval = this.value;
  192. var buynum = this.parentNode.parentNode.getElementsByClassName('buy-num');//购买数量
  193. var sent_ = this.parentNode.parentNode.getElementsByClassName('sent');//已发数量
  194. if(parseInt(intval)+parseInt(sent_[0].innerHTML) >=parseInt(buynum[0].innerHTML)){
  195. document.getElementsByClassName('bj')[0].style.cssText = 'display:block';
  196. document.getElementsByClassName('change-info')[0].style.cssText = 'display:block';
  197. setTimeout(function () {
  198. document.getElementsByClassName('bj')[0].style.cssText = 'display:none';
  199. document.getElementsByClassName('change-info')[0].style.cssText = 'display:none';
  200. },1000);
  201. this.value = 0
  202. }
  203. }
  204. }
  205. //物流加减
  206. for(var i=0;i<spanjia_.length;i++){
  207. spanjia_[i].onclick =function () {
  208. var html=''
  209. html+='<div class="express-delivery border-express">';
  210. html+='<div class="express-div">';
  211. html+='<label><i>*</i>快递公司</label>';
  212. html+='<div class="select-btn">';
  213. html+='<select class="express-input required input-xlarge">';
  214. for(var i=0;i<arr.length;i++){
  215. html+='<option value="'+arr[i].value+'">'+arr[i].name;
  216. html+='</option>';
  217. }
  218. html+='</select>';
  219. html+='<span onclick="jian(this)" class="span_jian mar-css the-span">-</span>';
  220. html+='</div>';
  221. html+='</div>';
  222. html+='<div class="express-div">';
  223. html+='<label><i>*</i>物流编号</label>';
  224. html+='<div class="select-btn">';
  225. html+='<input class="single-num" type="text" placeholder="请输入单号">';
  226. html+='<span onclick="danjia(this)" class="dan_jia mar-css the-span">+</span>';
  227. html+='</div>';
  228. html+='</div>';
  229. html+='</div>';
  230. express_[0].insertAdjacentHTML('afterend', html);
  231. }
  232. }
  233. //物流单号
  234. for(var i=0;i<spanjia_.length;i++){
  235. danjia_[i].onclick =function () {
  236. danjia(this)
  237. }
  238. }
  239. //列表信息展示
  240. var resdata = JSON.parse(localStorage.getItem('jsonstring'));
  241. console.log(resdata)
  242. var html = '';
  243. for(var i=0;i<resdata.length;i++){
  244. html+='<tr>';
  245. html+='<td>'+resdata[i].shopName+'</td>'
  246. html+='<td>';
  247. html+='<img src="'+resdata[i].image+'">';
  248. html+='</td>';
  249. html+='<td>';
  250. html+=resdata[i].name;
  251. html+='</td>';
  252. html+='<td class="buy-num">';
  253. html+=resdata[i].num;
  254. html+='</td>';
  255. html+='<td>';
  256. html+=resdata[i].presentNum;
  257. html+='</td>';
  258. html+='<td class="sent">';
  259. html+=resdata[i].num + resdata[i].presentNum - resdata[i].notOutStore;
  260. html+='</td>';
  261. html+='<td>';
  262. html+='<span data-id='+resdata[i].orderProductID+' data-type='+resdata[i].shopOrderID+' class="input">';
  263. html+=''+resdata[i].deliveryNum+'';
  264. html+='</span>';
  265. html+='</td>';
  266. html+='</tr>';
  267. obj['orderProductID_'+resdata[i].orderProductID+''] = resdata[i].deliveryNum;
  268. obj['shopOrderID'] = resdata[i].shopOrderID;
  269. }
  270. $('.table').append(html);
  271. //确认点击获取物流以及物流单号
  272. confirm_[0].onclick = function () {
  273. var _masktext = masktext_[0].value;
  274. obj['remarks'] = _masktext;
  275. for(var i=0;i<expressDelivery_.length;i++){
  276. var expressval = expressDelivery_[i].getElementsByTagName('select');//物流快递
  277. if(!expressval[0].value){
  278. $.jBox.info('请选择物流快递!');
  279. return false;
  280. }
  281. var index = expressval[0].selectedIndex ;//索引值
  282. var singlenum_ = expressDelivery_[i].getElementsByClassName('single-num');//物流单号
  283. console.log(expressval[0].value + singlenum_[0].value);
  284. var list_ = '';
  285. for(var j=0;j<singlenum_.length;j++){
  286. if(!singlenum_[j].value){
  287. $.jBox.info('请填写物流单号!');
  288. return false;
  289. }
  290. list_+= singlenum_[j].value+'_';
  291. obj['logisticsInfo_'+expressval[0].options[index].value+''] = list_.substring(0,list_.length - 1);
  292. }
  293. }
  294. var imgArr = [];
  295. if($('#image1').val()){ imgArr.push($('#image1').val()); }
  296. if($('#image2').val()){ imgArr.push($('#image2').val()); }
  297. if($('#image3').val()){ imgArr.push($('#image3').val()); }
  298. if($('#image4').val()){ imgArr.push($('#image4').val()); }
  299. if($('#image5').val()){ imgArr.push($('#image5').val()); }
  300. if($('#image6').val()){ imgArr.push($('#image6').val()); }
  301. if($('#image7').val()){ imgArr.push($('#image7').val()); }
  302. if($('#image8').val()){ imgArr.push($('#image8').val()); }
  303. if($('#image9').val()){ imgArr.push($('#image9').val()); }
  304. if($('#image10').val()){ imgArr.push($('#image10').val()); }
  305. obj['remarkImages'] = imgArr.join("##");
  306. console.log(obj);
  307. $.ajax({
  308. url : "${ctx}/order/delivery",
  309. contentType:'application/json',
  310. data : JSON.stringify(obj),
  311. type : 'post',
  312. success : function(data){
  313. if (data.success) {
  314. window.location.href = "${ctx}/order/qualificationList?logisticsBatchId="+data.logisticsBatchId;
  315. } else {
  316. alert(data.msg);
  317. }
  318. },
  319. error : function(){
  320. alert("服务器内部错误");
  321. }
  322. })
  323. }
  324. };
  325. //物流单号
  326. function danjia(that) {
  327. if(that.parentNode.getElementsByClassName('single-num')[0].value ==''){return}
  328. var html=''
  329. html+='<div class="express-div">';
  330. html+='<label><i>*</i>物流编号</label>';
  331. html+='<div class="select-btn">';
  332. html+='<input class="single-num" type="text" placeholder="请输入单号">';
  333. html+='<span onclick="shipjian(this)" class="span_jian mar-css the-span">-</span>';
  334. html+='</div>';
  335. html+='</div>';
  336. that.parentNode.parentNode.insertAdjacentHTML('afterend', html);
  337. }
  338. //减物流
  339. function jian(that) {
  340. var that_ = that.parentNode.parentNode.parentNode;
  341. that.parentNode.parentNode.parentNode.parentNode.removeChild(that_);
  342. }
  343. //减单号
  344. function shipjian(that) {
  345. var that_ = that.parentNode.parentNode;
  346. that.parentNode.parentNode.parentNode.removeChild(that_);
  347. }
  348. //判断输入框不能为空
  349. function input(that) {
  350. if(that.parentNode.getElementsByClassName('single-num')[0].value == ''){return}
  351. }
  352. $(function () {
  353. $('.upload-content .conList .btn:nth-of-type(1)').html('<div><span>+</span><h5>选择图片</h5></div>');
  354. $('.upload-content .conList .btn:nth-of-type(2)').after('<img class="cancel-upload" src="/static/images/close-btn1.png">').remove();
  355. $('.upload-content .conList').find('.cancel-upload').hide();
  356. var observeEle = document.getElementsByClassName('upload-content')[0];
  357. var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
  358. var MutationObserverConfig={
  359. childList: true,
  360. subtree: true,
  361. characterData: true
  362. };
  363. var observer = new MutationObserver(function(mutations){
  364. $.each(mutations, function(index,item) {
  365. if (item.type === 'childList') {
  366. // 在创建新的 element 时调用
  367. var target = $(item.target),
  368. thisWrapper = target.closest('.conList'),
  369. nextEle = thisWrapper.next();
  370. thisWrapper.find('li').css('z-index',99);
  371. thisWrapper.find('.cancel-upload').show();
  372. if(nextEle.hasClass('hide-pic')) {
  373. nextEle.removeClass('hide-pic');
  374. }
  375. }
  376. })
  377. });
  378. observer.observe(observeEle,MutationObserverConfig);
  379. $('body').on('click', '.cancel-upload',function() {
  380. var wrapper = $(this).closest('.conList');
  381. wrapper.find('li').css('z-index','-1');
  382. wrapper.find('input').val('');
  383. $(this).hide();
  384. if ($('.cancel-upload:visible').length < 9) {
  385. wrapper.addClass("hide-pic");
  386. }else{
  387. wrapper.removeClass("hide-pic");
  388. }
  389. wrapper.parent().append(wrapper.clone());
  390. wrapper.remove();
  391. $(".conList").each(function(i,ele){
  392. if($(ele).find("input.imagesInput").val()){
  393. $(ele).next().removeClass("hide-pic")
  394. }
  395. })
  396. });
  397. $(window).on("load", function(){
  398. setTimeout(function(){
  399. $("#remarkImageBox").find("input.imagesInput").each(function(i,ele){
  400. if($(ele).val()){
  401. $(ele).next().find("li").css("z-index","99");
  402. $(ele).parents(".conList").find(".cancel-upload").show();
  403. $(ele).parents(".conList").next().removeClass("hide-pic")
  404. }
  405. })
  406. },500);
  407. });
  408. $('body').on('keyup', '.mask-text',function() {
  409. $('#remarkLen').text($(this).val().length);
  410. });
  411. });
  412. </script>
  413. </body>
  414. </html>