StatementBill.cshtml 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549
  1. @using System.Text
  2. @using Abp.Timing
  3. @using Org.BouncyCastle.Asn1.X509
  4. @using ShwasherSys.Authorization.Permissions
  5. @using ShwasherSys.BasicInfo
  6. @using ShwasherSys.Models.Layout
  7. @using ShwasherSys.Views.Shared.New.Modals
  8. @using ShwasherSys.Views.Shared.New.Table
  9. @{
  10. ViewBag.Title = "对账单信息维护";
  11. string activeMenu = PermissionNames.PagesInvoiceInfoStatementBill; //The menu item will be active for this page.
  12. ViewBag.ActiveMenu = activeMenu;
  13. List<SelectListItem> customerItems = ViewBag.CustomerList;
  14. StringBuilder strOptionCustomer = new StringBuilder();
  15. strOptionCustomer.Append("<option value=\"\">请选择</option>");
  16. foreach (var c in customerItems)
  17. {
  18. strOptionCustomer.Append(string.Format("<option value=\"{0}\">{1}</option>", c.Value, c.Value));
  19. }
  20. List<SelectListItem> stateItems = new List<SelectListItem>()
  21. {
  22. new SelectListItem()
  23. {
  24. Value = "0",
  25. Text = "未开票"
  26. }, new SelectListItem()
  27. {
  28. Value = "1",
  29. Text = "已开票"
  30. }
  31. };
  32. string newStatementNo = "S" + Clock.Now.ToString("yyMMddHHmmss");
  33. var searchForm = new SearchFormViewModal(new List<SearchItem>()
  34. {
  35. new SearchItem("statementBillNo","对账单号"),
  36. new SearchItem("customerId","客户编号").SetSearchIcon("query_customer_modal","SearchForm"),
  37. new SearchItem("statementState","是否开票",FiledType.Inull,ExpType.Equal).SetSearchItem(stateItems,isAddBlank:true),
  38. new SearchItem("orderStickBillNo","发票号"),
  39. });
  40. var table = new TableViewModel("/api/services/app/StatementBill/GetAll", activeMenu, searchForm)
  41. .SetFields(new List<FieldItem>()
  42. {
  43. new FieldItem("statementBillNo", "对账单编号"),
  44. new FieldItem("customerId", "客户编号"),
  45. new FieldItem("customerName", "客户名称"),
  46. new FieldItem("description", "备注"),
  47. new FieldItem("creationTime", "创建时间","DateFormatter"),
  48. new FieldItem("billMan", "对账人员"),
  49. new FieldItem("statementState", "是否开票","StatementStateFormatter"),
  50. new FieldItem("orderStickBillNo", "发票号"),
  51. });
  52. }
  53. @section css{
  54. <style>
  55. .form-box {
  56. min-height: 50px;
  57. }
  58. .form-box .input-group-addon {
  59. background: #d1dcf9;
  60. border-color: #d1dcf9;
  61. color: #563d7c;
  62. }
  63. .form-box .form-control {
  64. border-color: #d1dcf9;
  65. }
  66. .form-box .form-box-column {
  67. float: left;
  68. min-width: 250px;
  69. width: 18%;
  70. margin: 0 5px;
  71. }
  72. .btn-action {
  73. margin-left: 20px;
  74. width: 100px;
  75. margin-top: 0px;
  76. }
  77. .guide > i {
  78. display: inline-block;
  79. color: #ffffff;
  80. transition: all 1s ease;
  81. }
  82. .down-direction2 {
  83. transform: rotate(180deg);
  84. }
  85. .selectedRecord {
  86. position: fixed;
  87. min-width: 86vw;
  88. bottom: 51px;
  89. display: flex;
  90. flex-flow: column nowrap;
  91. }
  92. .selectedRecord .header-arrow {
  93. height: 25px;
  94. background: #563d7c;
  95. display: flex;
  96. justify-content: center;
  97. align-items: center;
  98. color: #ffffff;
  99. cursor: pointer;
  100. border-radius: 5px 5px 0 0;
  101. }
  102. .selectedRecord .header-arrow .guide {
  103. font-size: 1rem;
  104. padding: 2px;
  105. }
  106. .selected-content {
  107. display: none;
  108. border: 1px solid #563d7c;
  109. padding: 0!important;
  110. height: auto;
  111. }
  112. .selected-content .fixed-table-body {
  113. height: 90% !important;
  114. }
  115. </style>
  116. }
  117. <div class="row" style="margin: 0 0;">
  118. <div class="col-xs-12" style="padding: 0 5px;">
  119. <div class="nav-tabs-custom" style="margin-bottom: 5px;">
  120. <ul class="nav nav-tabs" id="tabIndex">
  121. <li class="active"><a href="#createInvoice_tab" data-toggle="tab">填开对账单页</a></li>
  122. <li><a href="#query_tab" data-toggle="tab">查询信息页</a></li>
  123. </ul>
  124. <div class="tab-content form-box">
  125. <div class="tab-pane active" id="createInvoice_tab" style="width: 100%; ">
  126. <div style="width: 100%; height:25px;margin: 1px 0 5px 0;">
  127. <form id="formInvoice">
  128. <div class="form-box-column">
  129. <div class="form-group-sm input-group">
  130. <div class="input-group-addon" style="">
  131. <span>客户编号</span>
  132. </div>
  133. @*<select class="form-control" Required id="customerId" name="customerId" placeholder="请输入..." value="" style="width: 100%;" type="text" onchange="RefreshCustomer(this)">
  134. @Html.Raw(strOptionCustomer)
  135. </select>*@
  136. <input type="text" class="form-control KeyWords" style="border-radius: 0 0 0 0 !important;" id="customerId" name="customerId" data-keyField="customerId" data-fieldType="0" data-expType="0" readonly="readonly" onchange="RefreshCustomer(this)"/>
  137. <div class="input-group-addon" style="cursor: pointer;" onclick="ShowQueryModal('query_customer_modal','formInvoice')">
  138. <i class="iconfont icon-search"></i>
  139. </div>
  140. </div>
  141. </div>
  142. <div class="form-box-column">
  143. <div class="form-group-sm input-group">
  144. <div class="input-group-addon">
  145. <span>发货日期</span>
  146. </div>
  147. <input type="text" class="form-control iwb-date-range" style="border-radius: 0 0 0 0 !important;" id="queryDateRange" name="queryDateRange" data-keyField="queryDateRange" data-fieldType="0" data-expType="0" readonly="readonly" onchange="RefreshCustomer(this)"/>
  148. <div class="input-group-addon" style="cursor: pointer;" onclick="$('#queryDateRange').val('')">
  149. <i class="iconfont icon-close"></i>
  150. </div>
  151. </div>
  152. </div>
  153. <div class="form-box-column">
  154. <div class="form-group-sm input-group">
  155. <div class="input-group-addon">
  156. <span>对账单号</span>
  157. </div>
  158. <input type="text" class="form-control" id="statementBillNo" name="statementBillNo" value="@newStatementNo" onchange="RefreshCustomer(this)"/>
  159. </div>
  160. </div>
  161. <div class="form-box-column">
  162. <div class="form-group-sm input-group">
  163. <div class="input-group-addon">
  164. <span>备注</span>
  165. </div>
  166. <input type="text" class="form-control" id="description" name="description" value="" />
  167. </div>
  168. </div>
  169. <div class="form-box-column">
  170. <button type="button" class="btn btn-block btn-info btn-sm" id="createStickBillBtn" style="width: 360px;" onclick="CreateBill()"><i class="iconfont icon-fapiao"></i><span style="font-size: 1.3rem;"><strong>生成对账单</strong></span></button>
  171. </div>
  172. </form>
  173. </div>
  174. <div class="table-box iwb-bootstrap-table">
  175. <table id="tableSendItem"
  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="orderSendBillNo">发货单号</th>
  192. <th data-align="center" data-field="customerId">客户编号</th>
  193. <th data-align="center" data-field="productNo">产品编号</th>
  194. <th data-align="center" data-field="productDesc">产品描述</th>
  195. <th data-align="center" data-field="partNo">零件号</th>
  196. <th data-align="center" data-field="productName">产品名称</th>
  197. <th data-align="center" data-field="model">规格</th>
  198. <th data-align="center" data-field="surfaceColor">表色</th>
  199. <th data-align="center" data-field="rigidity">硬度</th>
  200. <th data-align="center" data-field="sendQuantity">数量</th>
  201. <th data-align="center" data-field="orderUnitName">单位</th>
  202. <th data-align="center" data-field="orderDate">订单日期</th>
  203. <th data-align="center" data-field="sendActionDate">送货日期</th>
  204. <th data-align="center" data-field="linkName">联系人</th>
  205. </tr>
  206. </thead>
  207. </table>
  208. </div>
  209. <div class="selectedRecord">
  210. <div class="header-arrow">
  211. <span class="guide">查看选中明细 <i class="iconfont icon-up"></i></span>
  212. </div>
  213. <div class="table-box mr-4 iwb-bootstrap-table selected-content">
  214. <table id="selectedTable" data-click-to-select="false" data-height="300"
  215. data-single-select="false">
  216. <thead>
  217. <tr class="row" >
  218. @*<th data-field="state" data-checkbox="true"></th>*@
  219. <th data-align="center" data-field="id"></th>
  220. <th data-align="center" data-field="orderNo">流水号</th>
  221. <th data-align="center" data-field="stockNo">客户订单号 </th>
  222. <th data-align="center" data-field="orderSendBillNo">发货单号</th>
  223. <th data-align="center" data-field="customerId">客户编号</th>
  224. <th data-align="center" data-field="productNo">产品编号</th>
  225. <th data-align="center" data-field="productDesc">产品描述</th>
  226. <th data-align="center" data-field="partNo">零件号</th>
  227. <th data-align="center" data-field="productName">产品名称</th>
  228. <th data-align="center" data-field="model">规格</th>
  229. <th data-align="center" data-field="surfaceColor">表色</th>
  230. <th data-align="center" data-field="rigidity">硬度</th>
  231. <th data-align="center" data-field="sendQuantity">数量</th>
  232. <th data-align="center" data-field="orderUnitName">单位</th>
  233. <th data-align="center" data-field="orderDate">订单日期</th>
  234. <th data-align="center" data-field="sendActionDate">送货日期</th>
  235. <th data-align="center" data-field="linkName">联系人</th>
  236. </tr>
  237. </thead>
  238. </table>
  239. </div>
  240. </div>
  241. </div>
  242. <div class="tab-pane" id="query_tab" style="width: 100%;">
  243. @Html.Partial("New/Table/_Table", table)
  244. </div>
  245. </div>
  246. </div>
  247. </div>
  248. </div>
  249. @section modal{
  250. <!--Main Modal-->
  251. @{
  252. // var modal = new ModalViewModel("人员", new ModalBodyViewModel(new List<Input>()
  253. //{
  254. // new InputHide("id"),
  255. // new Input("no", "人员编号"),
  256. // new Input("name", "人员姓名"),
  257. // new Input("phoneNumber", "手机号").SetNotRequired(),
  258. // new Input("cardId", "身份证号").SetNotRequired(),
  259. // new InputTextarea("description", "详情").SetNotRequired(),
  260. // }));
  261. var modal = new ModalViewModel("修改备注", new ModalBodyViewModel(new List<Input>()
  262. {
  263. new InputHide("id"),
  264. //new Input("gender", "性别").SetSelectOptions(gender),
  265. //new Input("departmentNo", "部门").SetNotRequired().SetSelectOptions(depart),
  266. //new Input("dutyNo", "职务").SetNotRequired().SetSelectOptions(duty),
  267. new InputTextarea("description", "备注").SetNotRequired()
  268. //new Input("userName", "登陆账号").SetNotRequired(),
  269. }));
  270. // var accountModal = new ModalViewModel("绑定账号", new ModalBodyViewModel(new List<Input>()
  271. //{
  272. // new InputHide("id"),
  273. // new Input("userName", "登陆账号",InputTypes.List),
  274. // }), "Account_Modal");
  275. }
  276. @Html.Partial("New/Modals/_Modal", modal)
  277. @*@Html.Partial("New/Modals/_Modal", accountModal)*@
  278. <section>
  279. @Html.Partial("Modals/Query/_Customer", "KeyWords-2|customerId")
  280. </section>
  281. }
  282. @section scripts
  283. {
  284. <script src="~/Content/Plugins/jquery-ui/jquery-ui.js"></script>
  285. <script type="text/javascript">
  286. var $table=$('#table');
  287. $(function () {
  288. LoadTable();
  289. var funs = window.funs || { none: function () { console.log("No type"); } };
  290. funs["btnShow"] = function () {
  291. var row = $table.bootstrapTable("getSelections")[0];
  292. if (row) {
  293. window.open("@Url.Action("StatementBillDetail","InvoiceInfo")/" + row.statementBillNo, "_blank");
  294. }
  295. @*window.open("@Url.Action("InvoiceDetail","InvoiceInfo")/" + row.id, "_blank");*@
  296. }
  297. funs["btnUpdateDesc"] = function (url) {
  298. var rows = $("#table").bootstrapTable("getSelections");
  299. if (rows.length === 1) {
  300. var data = rows[0];
  301. OpenModal(url, { modal: $("#modal"), modaltitle: "修改备注", data: data });
  302. } else
  303. abp.message.warn(abp.localization.localize("ChooseOneToOp"));
  304. }
  305. $("#tableSendItem").hide();
  306. $('#queryDateRange').iwbDateRange();
  307. $(".guide").on('click',
  308. function () {
  309. $(".guide i").toggleClass("down-direction2");
  310. if ($(".guide i").hasClass('down-direction2')) {
  311. $('.selected-content').show();
  312. } else {
  313. $('.selected-content').hide();
  314. }
  315. });
  316. $(".selectedRecord ").draggable({ handle: ".header-arrow" });
  317. });
  318. function reloadSelectedTable() {
  319. $("#selectedTable").bootstrapTable("destroy");
  320. $("#selectedTable").bootstrapTable({
  321. data: [],
  322. onPostBody: OnPostBody,
  323. onLoadSuccess: OnLoadSuccess
  324. });
  325. $('#selectedTable tbody').sortable({ containment: "#selectedTable tbody", cursor: "move" });
  326. }
  327. function RefreshCustomer(that) {
  328. let cId = $('#customerId').val();
  329. let dateRange = $('#queryDateRange').val();
  330. let startDate, endDate;
  331. if (dateRange && /\s-\s/.test(dateRange)) {
  332. var dArr = dateRange.split(/\s-\s/);
  333. startDate = dArr[0];
  334. endDate = dArr[1];
  335. }
  336. QueryOrderSend(cId, startDate, endDate);
  337. }
  338. function QueryOrderSend(customerId, startDate, endDate) {
  339. if (customerId) {
  340. $("#tableSendItem").show();
  341. } else {
  342. $("#tableSendItem").hide();
  343. return;
  344. }
  345. SaveAjax({
  346. url: window.appUrl + "StatementBill/GetOrderSendByCustomerId",
  347. data: {
  348. CustomerId: customerId,
  349. SendDateStart: startDate,
  350. SendDateEnd: endDate
  351. },
  352. dataType: "json",
  353. isValidate: false,
  354. isAlert: false,
  355. success: function(res) {
  356. $("#tableSendItem").bootstrapTable("destroy");
  357. reloadSelectedTable();
  358. $("#tableSendItem").bootstrapTable({
  359. data: res,
  360. onPostBody: OnPostBody,
  361. onAll: function() {
  362. $("#createInvoice_tab .btn-action").prop('disabled', !$("#tableSendItem").bootstrapTable('getSelections').length);
  363. },
  364. onLoadSuccess: OnLoadSuccess,
  365. onCheck: OnCheck2,
  366. onUncheck: OnUnCheck2,
  367. onUncheckAll: OnUnCheckAll,
  368. onCheckAll: OnCheckAll
  369. });
  370. $("#createInvoice_tab .bs-checkbox").find("input").addClass("filled-in").after("<label></label");
  371. $("#createInvoice_tab .btn-action").prop('disabled', !$("#tableSendItem").bootstrapTable('getSelections').length);
  372. $("#tableSendItem thead th.bs-checkbox ").off("click.checkOnTable").on("click.checkOnTable",
  373. function() {
  374. $(this).find("input").click();
  375. });
  376. }
  377. });
  378. }
  379. function CreateBill() {
  380. var customerId = $("#customerId").val();
  381. var statementBillNo = $("#statementBillNo").val();
  382. var desc = $("#description").val();
  383. //var rows = $("#tableSendItem").bootstrapTable("getSelections");
  384. var $trs = $("#selectedTable tbody tr");
  385. var sids = [];
  386. $.each($trs,
  387. function (i, item) {
  388. sids.push($(item).find('td').eq(0).text());
  389. }
  390. );
  391. //console.log('---------------', sids.join());
  392. if (sids.length > 0) {
  393. //var sendIds = "";
  394. //for (var i = 0; i < rows.length; i++) {
  395. // sendIds += "," + rows[i].id;
  396. //}
  397. //if (sendIds) {
  398. // sendIds = sendIds.substr(1);
  399. //}
  400. SaveAjax({
  401. url: window.appUrl + "StatementBill/Create",
  402. data: {
  403. OrderSendIds: sids.join(),
  404. CustomerId: customerId,
  405. StatementBillNo: statementBillNo,
  406. Description: desc
  407. },
  408. dataType: "json",
  409. isValidate: false,
  410. isAlert: false,
  411. success: function (res) {
  412. QueryOrderSend(customerId);
  413. @*abp.message.success("创建成功!").done(function() {
  414. window.open("@Url.Action("OrderSendBillDetail")/" + res.id, "_blank");
  415. });*@
  416. $('#tabIndex li:eq(1) a').tab('show');
  417. RefreshTable();
  418. }
  419. });
  420. } else
  421. abp.message.warn(abp.localization.localize("ChooseOneToOp"));
  422. }
  423. function OnCheck2(row, $element) {
  424. //$("#selectedTable").bootstrapTable("destroy");
  425. $("#selectedTable").bootstrapTable('append', [row]);
  426. $("#selectedTable").bootstrapTable('scrollTo','bottom');
  427. }
  428. function OnUnCheck2(row, $element) {
  429. //console.table(row)
  430. $("#selectedTable").bootstrapTable('remove', { field: 'id', values: [row.id] });
  431. }
  432. function OnUnCheckAll(rowsAfter, rowsBefore) {
  433. $("#selectedTable").bootstrapTable('removeAll');
  434. }
  435. function OnCheckAll(rowsAfter, rowsBefore) {
  436. //console.log(rowsAfter, rowsBefore)
  437. $("#selectedTable").bootstrapTable('load', rowsAfter);
  438. $("#selectedTable").bootstrapTable('scrollTo','bottom');
  439. }
  440. function KeepClock() {
  441. SaveAjax({
  442. url: window.appUrl + "Common/KeepClock",
  443. async:false,
  444. isValidate: false,
  445. isAlert: false,
  446. success: function(res) {
  447. console.log('页面与服务器交户:'+res);
  448. }
  449. });
  450. setTimeout(KeepClock, 3 * 60 * 1000);
  451. }
  452. setTimeout(KeepClock, 3 * 60 * 1000);
  453. </script>
  454. <!--格式化-->
  455. <script id="formatter-script" type="text/javascript">
  456. function DutyFormatter(v) {
  457. var name = $('#hid-du option[value="' + v + '"]').text();
  458. if (name) {
  459. return '<span class="label label-info">' + name + '</span>';
  460. }
  461. return '';
  462. }
  463. function DepartmentFormatter(v) {
  464. var name = $('#hid-de option[value="' + v + '"]').text();
  465. if (name) {
  466. return '<span class="label label-info">' + name + '</span>';
  467. }
  468. return '';
  469. }
  470. function UserNameFormatter(v) {
  471. if (v) {
  472. return '<span class="label label-info">' + v + '</span>';
  473. } else {
  474. return '<span class="label label-warning">暂无账号</span>';
  475. }
  476. }
  477. function GenderFormatter(v) {
  478. var name = $('#hid-gender option[value="' + v + '"]').text();
  479. switch (v) {
  480. case 1:
  481. return '<span class="label label-info">' + name + '</span>';
  482. case 2:
  483. return '<span class="label label-danger">' + name + '</span>';
  484. default:
  485. return '<span class="label label-info">' + name + '</span>';
  486. }
  487. }
  488. function StatementStateFormatter(v) {
  489. if (v==1) {
  490. return '<span class="label label-info">已开票</span>';
  491. } else {
  492. return '<span class="label label-warning">未开票</span>';
  493. }
  494. }
  495. </script>
  496. }
  497. <section style="display: none">
  498. <select id="hid-type">
  499. <option value=""></option>
  500. </select>
  501. @*@Html.DropDownList("hid-du", duty)
  502. @Html.DropDownList("hid-de", depart)
  503. @Html.DropDownList("hid-gender", gender)*@
  504. </section>