OrderSendBillCreate.cshtml 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. @using System.Text
  2. @using ShwasherSys.Authorization.Permissions
  3. @using ShwasherSys.BasicInfo
  4. @using ShwasherSys.Models.Layout
  5. @{
  6. /**/
  7. ViewBag.ActiveMenu = PermissionNames.PagesSendGoodsOrderSendBillCreate; //The menu item will be active for this page.
  8. ViewBag.Title = "发货单创建";
  9. List<SelectListItem> customerItems = ViewBag.CustomerList;
  10. List<ExpressLogistics> expressList = ViewBag.ExpressList;
  11. StringBuilder strOptionCustomer = new StringBuilder();
  12. StringBuilder strOptionExpress= new StringBuilder();
  13. strOptionCustomer.Append("<option value=\"\">请选择</option>");
  14. strOptionExpress.Append("<option value=\"\">请选择</option>");
  15. foreach (var c in customerItems)
  16. {
  17. strOptionCustomer.Append(string.Format("<option value=\"{0}\">{1}</option>",c.Value,c.Value));
  18. }
  19. foreach (var c in expressList)
  20. {
  21. strOptionExpress.Append(string.Format("<option value=\"{0}\">{1}</option>",c.Id,c.ExpressName));
  22. }
  23. }
  24. @section css{
  25. <link href="~/Content/Plugins/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css" rel="stylesheet" />
  26. <style>
  27. .iwb-label {
  28. color: #fff;
  29. }
  30. /*.form-horizontal .control-label {
  31. text-align: left
  32. }*/
  33. .btn-action {
  34. margin-left: 20px;
  35. width: 100px;
  36. margin-top: 0px;
  37. }
  38. .btn-block + .btn-block {
  39. margin-top: 0px;
  40. }
  41. input:not(.KeyWords).valid {
  42. background: #ffffff!important;
  43. }
  44. .accordion-toggle {
  45. font-size: 1.5rem;
  46. color: #ffffff;
  47. cursor: pointer;
  48. }
  49. .accordion-toggle > i, .guide > i {
  50. display: inline-block;
  51. color: #ffffff;
  52. transition: all 1s ease;
  53. }
  54. .accordion-toggle .down-direction {
  55. transform: rotate(-90deg);
  56. }
  57. .down-direction2 {
  58. transform: rotate(180deg);
  59. }
  60. .selectedRecord {
  61. position: fixed;
  62. min-width: 86vw;
  63. bottom: 51px;
  64. display: flex;
  65. flex-flow: column nowrap;
  66. }
  67. .selectedRecord .header-arrow {
  68. height: 25px;
  69. background: #563d7c;
  70. display: flex;
  71. justify-content: center;
  72. align-items: center;
  73. color: #ffffff;
  74. cursor: pointer;
  75. border-radius: 5px 5px 0 0;
  76. }
  77. .selectedRecord .header-arrow .guide {
  78. font-size: 1rem;
  79. padding: 2px;
  80. }
  81. .selected-content {
  82. display: none;
  83. border: 1px solid #563d7c;
  84. padding: 0!important;
  85. height: auto;
  86. }
  87. .selected-content .fixed-table-body {
  88. height: 90% !important;
  89. }
  90. </style>
  91. }
  92. <div class="table-box mr-4 iwb-bootstrap-table">
  93. @*@Html.Action("ToolMenu", "Layout", new { pageName = ViewBag.ActiveMenu })*@
  94. <div class="btn-toolbar row" id="tableTool" role="toolbar" aria-label="Toolbar with button groups">
  95. <div class="col-sm-12 col-lg-12 pull-left" style="padding: 0">
  96. <form class="form-horizontal" style="padding: 0 10px" id="form">
  97. <div class="form-group-sm row">
  98. <label class="iwb-label col-md-1 control-label iwb-label-required" for="customerId">客户编号:</label>
  99. <div class="col-md-2">
  100. <select class="form-control" Required id="customerId" name="customerId" placeholder="请输入..." value="" style="width: 100%;" type="text" onchange="RefreshCustomerSend(this)">
  101. @Html.Raw(strOptionCustomer.ToString())
  102. </select>
  103. </div>
  104. <label class="iwb-label col-md-1 control-label iwb-label-required" for="customerSendId">地址:</label>
  105. <div class="col-md-2" style="padding: 0 5px">
  106. <select class="form-control" style="width: 100%" id="customerSendId" name="customerSendId" value="" style="" type="text" onchange="ChangeCustomerSend(this)"></select>
  107. </div>
  108. <label class="iwb-label col-md-1 control-label " for="linkName">联系人:</label>
  109. <div class="col-md-2">
  110. <input class="form-control" disabled="disabled" style="width: 100%" id="linkName" name="linkName" placeholder="请输入..." value="" type="text">
  111. </div>
  112. <label class="iwb-label col-md-1 control-label " for="telephone">电话:</label>
  113. <div class="col-md-2" style="padding: 0 5px">
  114. <input class="form-control" disabled="disabled" style="width: 100%" id="telephone" name="telephone" placeholder="请输入..." value="" type="text">
  115. </div>
  116. </div>
  117. <div class="form-group-sm row">
  118. <label class="iwb-label col-md-1 control-label" for="sendAdress">送货地址:</label>
  119. <div class="col-md-2">
  120. <input class="form-control" disabled="disabled" style="width: 100%" id="sendAdress" name="sendAdress" placeholder="请输入..." value="" type="text">
  121. </div>
  122. <label class="iwb-label col-md-1 control-label" for="expressId">快递物流:</label>
  123. <div class="col-md-2" style="padding: 0 5px">
  124. <select class="form-control" style="width: 100%" id="expressId" name="expressId" placeholder="请输入..." value="" type="text">
  125. @Html.Raw(strOptionExpress.ToString())
  126. </select>
  127. </div>
  128. <label class="iwb-label col-md-1 control-label" for="expressBillNo">物流单号:</label>
  129. <div class="col-md-2">
  130. <input class="form-control" style="width: 100%;background: #ffffff!important;" id="expressBillNo" name="expressBillNo" placeholder="请输入..." value="" type="text">
  131. </div>
  132. <div class="col-md-3" style="text-align: center;">
  133. <button type="button" class="btn btn-block btn-success btn-sm btn-action" onclick="CreateSendOrderBill()">生成发货单</button>
  134. <button type="button" class="btn btn-block btn-danger btn-sm btn-action" onclick="CancelSendOrder()">撤销发货</button>
  135. </div>
  136. </div>
  137. </form>
  138. </div>
  139. <div class="col-sm-12 col-lg-12 pull-left accordion" style="padding: 0; border-top: 2px dotted #ffffff;">
  140. <div class="accordion-group">
  141. <div class="accordion-heading" style="background: #3744dc; padding: 4px;">
  142. <label class="accordion-toggle" data-toggle="collapse" data-parent="#accordion2" href="#collapseOne" >
  143. 详细查询 <i class="iconfont icon-left down-direction " ></i>
  144. </label>
  145. </div>
  146. <div id="collapseOne" class="accordion-body collapse in" style="height: auto; ">
  147. <div class="accordion-inner" style="display: flex;justify-content: flex-start;flex-direction: row;">
  148. <div class="form-box-column" style="width: 300px; height: 30px; margin: 20px 20px; display: inline-block;">
  149. <div class="form-group-sm input-group">
  150. <div class="input-group-addon">
  151. <span>送货日期</span>
  152. </div>
  153. <input type="text" class="form-control KeyWords iwb-date" id="startDate" style="border-radius: 0 0 0 0 !important;" name="startDate" data-keyField="orderDate" data-fieldType="5" data-expType="2" />
  154. <div class="input-group-addon" style="cursor: pointer;" onclick="BtnSearch()">
  155. <i class="iconfont icon-search"></i>
  156. </div>
  157. </div>
  158. </div>
  159. <div class="form-box-column" style="width: 300px; height: 30px; margin: 20px 20px;">
  160. <div class="form-group-sm input-group">
  161. <div class="input-group-addon">
  162. <span>至</span>
  163. </div>
  164. <input type="text" class="form-control KeyWords iwb-date" id="endDate" name="endDate" style="border-radius: 0 0 0 0 !important;" data-keyField="orderDate" data-fieldType="5" data-expType="5" />
  165. <div class="input-group-addon" style="cursor: pointer;" onclick="BtnSearch()">
  166. <i class="iconfont icon-search"></i>
  167. </div>
  168. </div>
  169. </div>
  170. </div>
  171. </div>
  172. </div>
  173. </div>
  174. </div>
  175. <table id="table"
  176. data-striped="true" data-id-field="id" data-unique-id="id"
  177. data-method="post"
  178. data-side-pagination="server"
  179. data-content-type="application/x-www-form-urlencoded; charset=UTF-8"
  180. data-cache="false"
  181. data-pagination="false" data-page-size="30" data-page-number="1" data-page-list="[30,50,100,200]" data-pagination-detail-h-align="right" data-pagination-h-align="left"
  182. data-query-params="QueryParams"
  183. data-response-handler="ResponseHandler"
  184. data-click-to-select="true"
  185. data-single-select="false">
  186. <thead>
  187. <tr class="row" id="header">
  188. <th data-field="state" data-checkbox="true"></th>
  189. <th data-align="center" data-field="orderNo">流水号</th>
  190. <th data-align="center" data-field="stockNo">客户订单号 </th>
  191. <th data-align="center" data-field="customerId">客户编号</th>
  192. <th data-align="center" data-field="productNo">产品编号</th>
  193. <th data-align="center" data-field="productDesc">产品描述</th>
  194. <th data-align="center" data-field="partNo">零件号</th>
  195. <th data-align="center" data-field="productName">产品名称</th>
  196. <th data-align="center" data-field="model">规格</th>
  197. <th data-align="center" data-field="surfaceColor">表色</th>
  198. <th data-align="center" data-field="rigidity">硬度</th>
  199. <th data-align="center" data-field="sendQuantity">数量</th>
  200. <th data-align="center" data-field="orderUnitName">单位</th>
  201. <th data-align="center" data-field="orderDate">订单日期</th>
  202. <th data-align="center" data-field="sendDate">送货日期</th>
  203. <th data-align="center" data-field="linkName">联系人</th>
  204. </tr>
  205. </thead>
  206. </table>
  207. </div>
  208. <div class="selectedRecord">
  209. <div class="header-arrow">
  210. <span class="guide">查看选中明细 <i class="iconfont icon-up"></i></span>
  211. </div>
  212. <div class="table-box mr-4 iwb-bootstrap-table selected-content">
  213. <table id="selectedTable" data-click-to-select="false" data-height="300"
  214. data-single-select="false">
  215. <thead>
  216. <tr class="row" >
  217. @*<th data-field="state" data-checkbox="true"></th>*@
  218. <th data-align="center" data-field="id"></th>
  219. <th data-align="center" data-field="orderNo">流水号</th>
  220. <th data-align="center" data-field="stockNo">客户订单号 </th>
  221. <th data-align="center" data-field="customerId">客户编号</th>
  222. <th data-align="center" data-field="productNo">产品编号</th>
  223. <th data-align="center" data-field="productDesc">产品描述</th>
  224. <th data-align="center" data-field="partNo">零件号</th>
  225. <th data-align="center" data-field="productName">产品名称</th>
  226. <th data-align="center" data-field="model">规格</th>
  227. <th data-align="center" data-field="surfaceColor">表色</th>
  228. <th data-align="center" data-field="rigidity">硬度</th>
  229. <th data-align="center" data-field="sendQuantity">数量</th>
  230. <th data-align="center" data-field="orderUnitName">单位</th>
  231. <th data-align="center" data-field="orderDate">订单日期</th>
  232. <th data-align="center" data-field="sendDate">送货日期</th>
  233. <th data-align="center" data-field="linkName">联系人</th>
  234. </tr>
  235. </thead>
  236. </table>
  237. </div>
  238. </div>
  239. @section scripts
  240. {
  241. <script src="~/Content/Plugins/jquery-ui/jquery-ui.js"></script>
  242. <script type="text/javascript">
  243. $(function() {
  244. RefreshCustomerSend();
  245. $(".btn-action").prop('disabled', true);
  246. $(".accordion-toggle").on('click',
  247. function() {
  248. $(".accordion-toggle i").toggleClass("down-direction");
  249. });
  250. $(".guide").on('click',
  251. function() {
  252. $(".guide i").toggleClass("down-direction2");
  253. if ($(".guide i").hasClass('down-direction2')) {
  254. $('.selected-content').show();
  255. } else {
  256. $('.selected-content').hide();
  257. }
  258. });
  259. //reloadSelectedTable();
  260. $(".selectedRecord ").draggable({ handle: ".header-arrow" });
  261. });
  262. function reloadSelectedTable() {
  263. $("#selectedTable").bootstrapTable("destroy");
  264. $("#selectedTable").bootstrapTable({
  265. data: [],
  266. onPostBody: OnPostBody,
  267. onAll: OnAllItem,
  268. onLoadSuccess: OnLoadSuccess
  269. });
  270. $('#selectedTable tbody').sortable({ containment: "#selectedTable tbody", cursor: "move" });
  271. }
  272. function RefreshCustomerSend() {
  273. var customerId = $("#customerId").val();
  274. if (!customerId) {
  275. $("#customerSendId").empty();
  276. $("#linkName").val("");
  277. $("#telephone").val("");
  278. $("#sendAdress").val("");
  279. $("#table").hide(300);
  280. return;
  281. }
  282. $("#table").show(300);
  283. abp.ajax({
  284. url: window.appUrl + "Query/GetCustomerSendDtoByCustomerId",
  285. async: true,
  286. type: "Post",
  287. data: { customerId: customerId },
  288. contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
  289. isValidate: false,
  290. dataType: "json",
  291. success: function(res) {
  292. if (res && res.length > 0) {
  293. //$("#customerSendId").off("change.ChangeCustomerSend");
  294. $("#customerSendId").empty();
  295. //$("#customerSendId").on("change.ChangeCustomerSend", ChangeCustomerSend);
  296. var options = "";
  297. console.log(res);
  298. res.forEach(function(value, index) {
  299. console.log(value, index);
  300. if (index === 0) {
  301. options += '<option value=\"' +
  302. value.id +
  303. '\" selected=\"selected\">' +
  304. value.customerSendName +
  305. '</option>';
  306. } else {
  307. options += '<option value=\"' + value.id + '\">' + value.customerSendName + '</option>';
  308. }
  309. });
  310. $("#customerSendId").html(options);
  311. $("#startDate").val('');
  312. $("#endDate").val('');
  313. $("#customerSendId").trigger("change");
  314. }
  315. }
  316. });
  317. }
  318. function ChangeCustomerSend() {
  319. console.log('Id:' + $("#customerSendId").val());
  320. var customerId = $("#customerId").val();
  321. var customerSendId = $("#customerSendId").val();
  322. if (!customerSendId) {
  323. customerSendId = 0;
  324. }
  325. abp.ajax({
  326. url: window.appUrl + "Query/GetCustomerSendInfo",
  327. async: false,
  328. type: "Post",
  329. data: { Id: customerSendId },
  330. contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
  331. isValidate: false,
  332. dataType: "json",
  333. success: function(res) {
  334. if (res) {
  335. $("#linkName").val(res.linkMan);
  336. $("#telephone").val(res.telephone);
  337. $("#sendAdress").val(res.sendAdress);
  338. QueryOrderSend(customerId, customerSendId);
  339. }
  340. }
  341. });
  342. }
  343. function QueryOrderSend(customerId, customerSendId, SendDateStart, SendDateEnd) {
  344. if (SendDateEnd) {
  345. var endDate = new Date(SendDateEnd);
  346. var qDate = new Date(endDate.getTime() + 24 * 60 * 60 * 1000);
  347. SendDateEnd = qDate.Format("yyyy-MM-dd");
  348. }
  349. SaveAjax({
  350. url: window.appUrl + "OrderSendBill/GetOrderSendByCustomerId",
  351. data: {
  352. CustomerId: customerId,
  353. customerSendId: customerSendId,
  354. SendDateStart: SendDateStart,
  355. SendDateEnd: SendDateEnd
  356. },
  357. dataType: "json",
  358. isValiate: false,
  359. isAlert: false,
  360. success: function(res) {
  361. $("#table").bootstrapTable("destroy");
  362. reloadSelectedTable();
  363. $("#table").bootstrapTable({
  364. data: res,
  365. onPostBody: OnPostBody,
  366. onAll: OnAllItem,
  367. onCheck: OnCheck,
  368. onUncheck: OnUnCheck,
  369. onUncheckAll: OnUnCheckAll,
  370. onCheckAll: OnCheckAll,
  371. onLoadSuccess: OnLoadSuccess
  372. });
  373. $(".bs-checkbox").find("input").addClass("filled-in").after("<label></label");
  374. $(".btn-action").prop('disabled', !$("#table").bootstrapTable('getSelections').length);
  375. $("#table thead th.bs-checkbox ").off("click.checkOnTable").on("click.checkOnTable",
  376. function() {
  377. $(this).find("input").click();
  378. /*var that = $(this).find("input");
  379. if (that.is(":checked")) {
  380. that.prop("checked", false);
  381. $("#table").bootstrapTable("uncheckAll");
  382. $("#table tbody tr").removeClass("selected");
  383. } else {
  384. that.prop("checked", true);
  385. $("#table").bootstrapTable("checkAll");
  386. $("#table tbody tr").addClass("selected");
  387. }*/
  388. });
  389. }
  390. });
  391. }
  392. function BtnSearch() {
  393. let startDate = $("#startDate").val();
  394. let endDate = $("#endDate").val();
  395. var customerId = $("#customerId").val();
  396. var customerSendId = $("#customerSendId").val();
  397. if (!customerId || !customerSendId) {
  398. abp.message.warn("客户编码或者客户收货地址不能为空!");
  399. return;
  400. }
  401. QueryOrderSend(customerId, customerSendId, startDate, endDate);
  402. }
  403. function OnPostBodyTable() {
  404. OnPostBody();
  405. //$(".btn-action").prop('disabled', !$("#table").bootstrapTable('getSelections').length);
  406. }
  407. function OnAllItem() {
  408. $(".btn-action").prop('disabled', !$("#table").bootstrapTable('getSelections').length);
  409. }
  410. function CancelSendOrder() {
  411. var customerId = $("#customerId").val();
  412. var customerSendId = $("#customerSendId").val();
  413. var rows = $("#table").bootstrapTable("getSelections");
  414. if (rows.length > 0) {
  415. var sendIds = "";
  416. for (var i = 0; i < rows.length; i++) {
  417. sendIds += "," + rows[i].id;
  418. }
  419. if (sendIds) {
  420. sendIds = sendIds.substr(1);
  421. }
  422. SaveAjax({
  423. url: window.appUrl + "OrderSendBill/CancelOrderSend",
  424. data: {
  425. Id: sendIds
  426. },
  427. dataType: "json",
  428. isValiate: false,
  429. isAlert: false,
  430. success: function(res) {
  431. if (res) {
  432. QueryOrderSend(customerId, customerSendId);
  433. abp.message.success("取消发货成功!");
  434. }
  435. }
  436. });
  437. } else
  438. abp.message.warn(abp.localization.localize("ChooseOneToOp"));
  439. }
  440. function CreateSendOrderBill() {
  441. var customerId = $("#customerId").val();
  442. var customerSendId = $("#customerSendId").val();
  443. var sendAddress = $("#sendAdress").val();
  444. var linkName = $("#linkName").val();
  445. var telephone = $("#telephone").val();
  446. var expressId = $("#expressId").val();
  447. var expressBillNo = $("#expressBillNo").val();
  448. //var rows = $("#table").bootstrapTable("getSelections");
  449. var $trs = $("#selectedTable tbody tr");
  450. var sids = [];
  451. $.each($trs,
  452. function (i, item) {
  453. sids.push($(item).find('td').eq(0).text());
  454. }
  455. );
  456. console.log('---------------', sids.join());
  457. //var rows = $("#selectedTable").bootstrapTable("getData", true);
  458. if (sids.length > 0) {
  459. //var sendIds = "";
  460. //for (var i = 0; i < rows.length; i++) {
  461. // sendIds += "," + rows[i].id;
  462. //}
  463. //if (sendIds) {
  464. // sendIds = sendIds.substr(1);
  465. //}
  466. SaveAjax({
  467. url: window.appUrl + "OrderSendBill/Create",
  468. data: {
  469. OrderSendIds: sids.join(),
  470. CustomerId: customerId,
  471. SendAddress: sendAddress,
  472. ContactTels: telephone,
  473. ContactMan: linkName,
  474. ExpressId: expressId,
  475. ExpressBillNo: expressBillNo
  476. },
  477. dataType: "json",
  478. isValiate: false,
  479. isAlert: false,
  480. success: function(res) {
  481. if (res) {
  482. QueryOrderSend(customerId, customerSendId);
  483. abp.message.success("创建成功!").done(function() {
  484. window.open("@Url.Action("OrderSendBillDetail")/" + res.id, "_blank");
  485. });
  486. }
  487. }
  488. });
  489. } else
  490. abp.message.warn(abp.localization.localize("ChooseOneToOp"));
  491. }
  492. function OnCheck(row, $element) {
  493. //$("#selectedTable").bootstrapTable("destroy");
  494. $("#selectedTable").bootstrapTable('append', [row]);
  495. $("#selectedTable").bootstrapTable('scrollTo','bottom');
  496. }
  497. function OnUnCheck(row, $element) {
  498. //console.table(row)
  499. $("#selectedTable").bootstrapTable('remove', { field: 'id', values: [row.id] });
  500. }
  501. function OnUnCheckAll(rowsAfter, rowsBefore) {
  502. $("#selectedTable").bootstrapTable('removeAll');
  503. }
  504. function OnCheckAll(rowsAfter, rowsBefore) {
  505. //console.log(rowsAfter, rowsBefore)
  506. $("#selectedTable").bootstrapTable('load', rowsAfter);
  507. $("#selectedTable").bootstrapTable('scrollTo','bottom');
  508. }
  509. </script>
  510. }