NotCompleteOrderItem.cshtml 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  1. @using System.Web.UI.HtmlControls
  2. @using Abp.Authorization
  3. @using Microsoft.Ajax.Utilities
  4. @using ShwasherSys.Authorization.Permissions
  5. @using ShwasherSys.Models.Layout
  6. @using ShwasherSys.Models.Modal
  7. @{
  8. /**/
  9. ViewBag.ActiveMenu = PermissionNames.PagesOrderInfoNotCompleteOrderItem; //The menu item will be active for this page.
  10. ViewBag.Title = "未完成订单明细查询";
  11. bool isCanViewPrice = IsGranted(PermissionNames.PagesOrderInfoOrderMgQueryOrderPrice);
  12. List<SelectListItem> OrderStatusList = ViewBag.OrderStatus;
  13. List<SelectListItem> emergencyLevelList = ViewBag.EmergencyLevel;
  14. List<SelectListItem> OrderSaleTypeList = ViewBag.OrderSaleType;
  15. List<SelectListItem> OrderItemStatusList = new List<SelectListItem>()
  16. {
  17. new SelectListItem()
  18. {
  19. Text = "未完成",
  20. Value = "N"
  21. }
  22. };//ViewBag.OrderItemStatus;
  23. OrderItemStatusList.AddRange((List<SelectListItem>)ViewBag.OrderItemStatus);
  24. List<SelectListItem> isOverdue = new List<SelectListItem>()
  25. {
  26. new SelectListItem()
  27. {
  28. Text = "未超期",
  29. Value = "0"
  30. }
  31. ,
  32. new SelectListItem()
  33. {
  34. Text = "超期",
  35. Value = "1"
  36. }
  37. };
  38. List<SelectListItem> storeCompleteState = new List<SelectListItem>()
  39. {
  40. new SelectListItem()
  41. {
  42. Text = "货物不齐全",
  43. Value = "0"
  44. }
  45. ,
  46. new SelectListItem()
  47. {
  48. Text = "货物已齐",
  49. Value = "1"
  50. },
  51. new SelectListItem()
  52. {
  53. Text = "货物已齐,待改包",
  54. Value = "2"
  55. }
  56. };
  57. var searchForm = new SearchFormViewModal(new List<SearchItem>()
  58. {
  59. new SearchItem("sendDate", "发货日期",FiledType.D,ExpType.GreaterOrEqual),
  60. new SearchItem("sendDate", "到",FiledType.D,ExpType.LessOrEqual),
  61. new SearchItem("customerId", "客户编号").SetSearchIcon("query_customer_modal"),
  62. new SearchItem("isOverdue", "已超过送货日期").SetSearchItem(isOverdue),
  63. new SearchItem("orderNo", "订单流水号"),
  64. new SearchItem("saleType", "内销/外销",FiledType.Inull,ExpType.Equal).SetSearchItem(OrderSaleTypeList),
  65. new SearchItem("orderItemStatusId", "订单明细状态",FiledType.Inull,ExpType.Equal).SetSearchItem(OrderItemStatusList,isAddBlank:false),
  66. new SearchItem("productName", "产品名称"),
  67. new SearchItem("model", "规格"),
  68. new SearchItem("material", "材质"),
  69. new SearchItem("surfaceColor", "表色"),
  70. new SearchItem("partNo", "零件号"),
  71. new SearchItem("stockNo", "客户订单号"),
  72. new SearchItem("StoreCompleteState", "是否库齐",FiledType.I,ExpType.Equal).SetSearchItem(storeCompleteState),
  73. }, false);
  74. }
  75. @section css{
  76. <link href="~/Content/Plugins/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css" rel="stylesheet" />
  77. <style>
  78. #cbkLabel:after, #cbkLabel:before {
  79. top: -8px;
  80. }
  81. #cbkLabel:after {
  82. width: 15px;
  83. height: 15px;
  84. }
  85. </style>
  86. }
  87. <div class="table-box mr-4 iwb-bootstrap-table">
  88. @*@Html.Action("ToolMenu", "Layout", new { pageName = ViewBag.ActiveMenu, searchForm })*@
  89. <div class="btn-toolbar row" role="toolbar" id="tableTool" aria-label="Toolbar with button groups">
  90. <div class="col-sm-8 col-lg-9 pull-left" style="padding: 0">
  91. <div class="btn-group btn-group-sm" id="Tool1" role="group" aria-label="First group">
  92. @if (PermissionChecker.IsGranted(PermissionNames.PagesOrderInfoOrderQueryMgExportExcel))
  93. {
  94. <div style="display: inline-block;"><input type="checkbox" class="filled-in" id="ckbExportId" name="ckbExportId" /><label for="ckbExportId" style="margin-left: 10px; color: #f5f5f5;" id="cbkLabel">导出选中明细</label></div>
  95. <button type="button" class="btn btn-default" data-type="_btnExportExcel" data-url="/api/services/app/OrderItems/ExportExcel" >
  96. <i class="iconfont icon-download">导出Excel</i>
  97. </button>
  98. }
  99. </div>
  100. </div>
  101. <div class="col-sm-4 col-lg-3 pull-right" style="padding: 0">
  102. @*@Html.Action("SearchForm_Sig", "Layout", new { SelectList = selectList })*@
  103. @Html.Partial("_SearchForm", searchForm)
  104. </div>
  105. </div>
  106. <table id="table"
  107. data-url="/api/services/app/OrderItems/GetViewAllNot"
  108. data-striped="true" data-id-field="id" data-unique-id="id"
  109. data-method="post"
  110. data-side-pagination="server"
  111. data-content-type="application/x-www-form-urlencoded; charset=UTF-8"
  112. data-cache="false"
  113. data-pagination="true" data-page-size="50" data-page-number="1" data-page-list="[30,50,100,200]" data-pagination-detail-h-align="right" data-pagination-h-align="left" data-resizable="true"
  114. data-query-params="QueryParams"
  115. data-response-handler="ResponseHandler"
  116. data-click-to-select="true"
  117. data-single-select="false"
  118. data-show-jumpto="true">
  119. <thead>
  120. <tr class="row" id="header">
  121. <th data-field="state" data-checkbox="true"></th>
  122. <th data-align="center" data-field="orderNo" data-width="100">订单流水号</th>
  123. <th data-align="center" data-field="stockNo">客户订单号</th>
  124. <th data-align="center" data-field="customerName">客户</th>
  125. <th data-align="center" data-field="orderDate" data-formatter="OrderDateFormatter">订单日期</th>
  126. <th data-align="center" data-field="partNo">零件号</th>
  127. <th data-align="center" data-field="productName">产品名称</th>
  128. <th data-align="center" data-field="model">型号</th>
  129. <th data-align="center" data-field="material">材质</th>
  130. <th data-align="center" data-field="surfaceColor">表色</th>
  131. <th data-align="center" data-field="rigidity">硬度</th>
  132. <th data-align="center" data-field="quantity" data-formatter="QuantityFormatter">数量</th>
  133. <th data-align="center" data-field="isSendQuantity">已发数量</th>
  134. <th data-align="center" data-field="remainingQuantity">剩余数</th>
  135. <th data-align="center" data-field="sendDate" data-formatter="SendDateFormatter">送货日期</th>
  136. @*<th data-align="center" data-field="saleType" data-formatter="SaleTypeFormatter">外销/内销</th>
  137. <th data-align="center" data-field="isReport" data-formatter="IsReportFormatter">检验报告</th>*@
  138. @*<th data-align="center" data-field="isPartSend" data-formatter="IsPartSendFormatter">部分送货</th>*@
  139. <th data-align="center" data-field="emergencyLevel" data-formatter="EmergencyLevelFormatter">紧急程度</th>
  140. <th data-align="center" data-field="orderItemStatusName" data-formatter="OrderItemStatusFormatter">状态</th>
  141. <th data-align="center" data-field="storeCompleteState" data-formatter="StoreCompleteStateFormatter">是否库齐</th>
  142. <th data-align="center" data-field="productNo">产品编号</th>
  143. @if (isCanViewPrice)
  144. {
  145. <th data-align="center" data-field="currencyId">货币</th>
  146. <th data-align="center" data-field="totalPrice" data-formatter="TotalPriceFormatter">含税总价</th>
  147. <th data-align="center" data-field="afterTaxTotalPrice" data-formatter="TotalPriceFormatter">不含税总价</th>
  148. }
  149. </tr>
  150. </thead>
  151. </table>
  152. </div>
  153. @section modal{
  154. <section>
  155. @*@Html.Hidden("isForSearch", "0");*@
  156. @Html.Partial("Modals/Query/_Customer", "KeyWords-3")
  157. </section>
  158. }
  159. @section scripts
  160. {
  161. @*<script src="~/Content/Plugins/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js"></script>
  162. <script src="~/Content/Plugins/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js"></script>*@
  163. <script src="~/Content/Plugins/bootstrap-table/extensions/resizable/colResizable-1.6.min.js"></script>
  164. <script src="~/Content/Plugins/bootstrap-table/extensions/resizable/bootstrap-table-resizable.js"></script>
  165. <script type="text/javascript">
  166. var isExportById = false;
  167. $(function () {
  168. //show完毕前执行
  169. var nowDate = new Date();
  170. var preDate = new Date(nowDate.getTime() - 30 * 24 * 60 * 60 * 1000);
  171. var endDate = new Date(nowDate.getTime() + 30 * 24 * 60 * 60 * 1000);
  172. $("#KeyWords-1").val(preDate.Format("yyyy-MM-dd"));
  173. $("#KeyWords-2").val(endDate.Format("yyyy-MM-dd"));
  174. LoadTable();
  175. //LoadQueryCustomerTable();
  176. var funs = window.funs || { none: function () { console.log("No type"); } };
  177. //funs["btnUpdate"] = function () { BtnUpdate({ readonly: "standardName" }); };
  178. funs["btnExportExcel"] = function (url) {
  179. BtnExportExcel(url);
  180. }
  181. $("#table thead th.bs-checkbox ").off("click.checkOnTable").on("click.checkOnTable",
  182. function() {
  183. $(this).find("input").click();
  184. });
  185. $("#ckbExportId").on('change',function(e) {
  186. if ($(this).is(":checked")) {
  187. isExportById = true;
  188. } else {
  189. isExportById = false;
  190. }
  191. });
  192. /*funs["btnCreate"] = function () {
  193. abp.ajax({
  194. url: window.appUrl + 'OrderHeaders/GetNewOrderNo',
  195. async: true,
  196. type: "Post",
  197. contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
  198. isValidate: false,
  199. dataType: "json",
  200. success: function (res) {
  201. BtnCreate({ readonly: "id,sendAdress,customerId ", disabled: "orderStatusId", data: { orderStatusId: "2", id: res, orderDate: GetNowFormatDate() } });
  202. //$("#OrderStatusId").val("2").select2();
  203. }
  204. });
  205. }
  206. */
  207. //$("#KeyWords-4").on('init.change',function(e) {
  208. // var v = $(this).val();
  209. // if (v) {
  210. // $(".search-unit [data-index='1']").hide();
  211. // } else {
  212. // $(".search-unit [data-index='1']").show();
  213. // }
  214. //});
  215. });
  216. function BtnExportExcel(url) {
  217. if (isExportById) {
  218. window._searchList = [];
  219. var rows = $("#table").bootstrapTable("getSelections");
  220. if (rows.length === 0) {
  221. abp.message.warn("未选中任何一条记录进行导出!");
  222. }
  223. rows.forEach(function(r) {
  224. _searchList.push({
  225. KeyWords: r.id,
  226. KeyField: "id",
  227. FieldType: "1",
  228. ExpType: "0",
  229. LogicType:"1"
  230. });
  231. });
  232. } else {
  233. GetSearchList();
  234. }
  235. console.log(_searchList);
  236. abp.ajax({
  237. url: url,
  238. async: true,
  239. data: JSON.stringify(_searchList),
  240. type: "Post",
  241. contentType: 'application/json',
  242. isValidate: false,
  243. dataType: "json",
  244. success: function (res) {
  245. window.location.href = "/" + res;
  246. }
  247. });
  248. /*SaveAjax({
  249. url: url,
  250. data: _searchList,
  251. isValidate: false,
  252. isAlert: false,
  253. success: function(res) {
  254. window.location.href = res;
  255. }
  256. });*/
  257. }
  258. function GetSearchList() {
  259. var count = $("#SearchForm").find(".KeyWords").length;
  260. var isHasIsOverdue = $("#KeyWords-4").val();
  261. window._searchList = [];
  262. for (var i = 1; i <= count; i++) {
  263. var keyWords = $("#KeyWords-" + i).val();
  264. var keyField = $("#KeyField-" + i).val();
  265. if (keyWords) {
  266. var fieldType = $("#FieldType-" + i).val();
  267. var expType = $("#ExpType-" + i).val();
  268. //if (fieldType === "5" && expType === "5") {
  269. // var endDate = new Date(keyWords);
  270. // var qDate = new Date(endDate.getTime() + 24 * 60 * 60 * 1000);
  271. // keyWords = qDate.Format("yyyy-MM-dd");
  272. //}
  273. if (isHasIsOverdue && keyField === "sendDate") {
  274. continue;
  275. }
  276. if (keyField === "isOverdue") {
  277. var nowDate = new Date();
  278. if (keyWords === "0") {
  279. _searchList.push({
  280. KeyWords: nowDate.Format("yyyy-MM-dd"),
  281. KeyField: "sendDate",
  282. FieldType: "5",
  283. ExpType: "4"
  284. });
  285. continue;
  286. } else if (keyWords === "1") {
  287. _searchList.push({
  288. KeyWords: nowDate.Format("yyyy-MM-dd"),
  289. KeyField: "sendDate",
  290. FieldType: "5",
  291. ExpType: "3"
  292. });
  293. continue;
  294. }
  295. }
  296. if (keyField === "orderItemStatusId") {
  297. if (keyWords === "N") {
  298. _searchList.push({
  299. KeyWords: "11",
  300. KeyField: "orderItemStatusId",
  301. FieldType: "2",
  302. ExpType: "1"
  303. });
  304. continue;
  305. }
  306. }
  307. _searchList.push({
  308. KeyWords: keyWords,
  309. KeyField: keyField,
  310. FieldType: fieldType,
  311. ExpType: expType
  312. });
  313. }
  314. }
  315. }
  316. function StoreCompleteStateFormatter(v, r) {
  317. var str = "";
  318. if (v === 0) {
  319. str = '<span class="label label-danger">货物不齐全</span>';
  320. } else if (v === 1) {
  321. str = '<span class="label label-success">货物已齐</span>';
  322. } else if (v === 2) {
  323. str = '<span class="label label-success">货物已齐,待改包</span>';;
  324. }
  325. return str;
  326. }
  327. function OrderItemStatusFormatter(v, r) {
  328. if (r.orderItemStatusId === 15) {
  329. return '<span class="label label-success">完成审核</span>';
  330. } else if (r.orderItemStatusId === 9) {
  331. return '<span class="label label-danger">发货</span>';
  332. } else if (r.orderItemStatusId === 11) {
  333. return '<span class="label label-primary">结束</span>';
  334. } else if (r.orderItemStatusId === 2) {
  335. return '<span class="label label-info">新建</span>';
  336. }
  337. return v;
  338. }
  339. function IsReportFormatter(v, r) {
  340. var str = "";
  341. if (v === "Y") {
  342. str = '<span class="table-action">需要</span>';
  343. } else if (v === "N") {
  344. str = '<span class="table-action">不需要</span>';;
  345. }
  346. return str;
  347. }
  348. function SaleTypeFormatter(v, r) {
  349. var str = "";
  350. if (v === 1) {
  351. str = '<span class="table-action">内销</span>';
  352. } else if (v === 2) {
  353. str = '<span class="table-action">外销</span>';;
  354. }
  355. return str;
  356. }
  357. function SendDateFormatter(v, r) {
  358. var dataNow = abp.clock.now();
  359. var sendDate = new Date(v);
  360. var s1 = dataNow.getTime(), s2 = sendDate.getTime();
  361. var span = (s2 - s1) / 1000;
  362. var dayspan = parseInt(span / (24 * 60 * 60));
  363. if (dayspan < 0) {
  364. return '<span style="text-decoration:underline;color:#ff0000" >' +
  365. sendDate.Format('yyyy-MM-dd') +
  366. '</span>';
  367. }
  368. if (dayspan > -1 && dayspan < 4) {
  369. return '<span style="text-decoration:underline;color:#dd4b39" >' +
  370. sendDate.Format('yyyy-MM-dd') +
  371. '</span>';
  372. }
  373. return '<span style="text-decoration:underline;" >' + sendDate.Format('yyyy-MM-dd') + '</span>';
  374. }
  375. function QuantityFormatter(v, r) {
  376. var str = '<span style="text-decoration:underline;" >' + v + '</span>';
  377. return str;
  378. }
  379. function TotalPriceFormatter(v, r) {
  380. var str = "0.00";
  381. if (v && v > 0) {
  382. v = (v * 10000) / 10000;
  383. str = _formatAmount(v, 4);
  384. }
  385. str = '<span style="text-decoration:underline;">' + str + '</span>';
  386. return str;
  387. }
  388. function IsPartSendFormatter(v, r) {
  389. var str = "";
  390. if (v === "Y") {
  391. str = '<span class="table-action">是</span>';
  392. } else if (v === "N") {
  393. str = '<span class="table-action">否</span>';;
  394. }
  395. return str;
  396. }
  397. function OrderDateFormatter(v, r) {
  398. var orderDate = new Date(v);
  399. return '<span style="text-decoration:underline;" >' + orderDate.Format('yyyy-MM-dd') + '</span>';
  400. }
  401. function EmergencyLevelFormatter(v, r) {
  402. let result = '';
  403. var name = $('#hid-emergencyLevel option[value="' + v + '"]').text();
  404. if (v === 1) {
  405. result += '<span class="label label-success">' + name + '</span>';
  406. } else {
  407. result += '<span class="label label-danger">' + name + '</span>';
  408. }
  409. return result;
  410. }
  411. </script>
  412. <script>
  413. // 对Date的扩展,将 Date 转化为指定格式的String
  414. // 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
  415. // 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
  416. // 例子:
  417. // (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
  418. // (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
  419. Date.prototype.Format = function (fmt) { //author: meizz
  420. var o = {
  421. "M+": this.getMonth() + 1, //月份
  422. "d+": this.getDate(), //日
  423. "h+": this.getHours(), //小时
  424. "m+": this.getMinutes(), //分
  425. "s+": this.getSeconds(), //秒
  426. "q+": Math.floor((this.getMonth() + 3) / 3), //季度
  427. "S": this.getMilliseconds() //毫秒
  428. };
  429. if (/(y+)/.test(fmt))
  430. fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  431. for (var k in o)
  432. if (new RegExp("(" + k + ")").test(fmt))
  433. fmt = fmt.replace(RegExp.$1,
  434. (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  435. return fmt;
  436. }
  437. //将数字转换成金额显示 n是小数点后位数
  438. function toNumber(num, n) {
  439. var re = String(num);
  440. var dotfront = "";
  441. var dotlast = "";
  442. if (re.indexof('.') > -1) {
  443. var sarr = re.spilt('.');
  444. dotfront = sarr[0];
  445. dotlast = sarr[1];
  446. var dotlastlength = strlen(dotlast);
  447. if (dotlastlength < n) {
  448. for (var j = 0; j < n - dotlastlength; j++) {
  449. dotlast += "0";
  450. }
  451. }
  452. if (dotlastlength > n) {
  453. dotlast = dotlast.substr(0, n);
  454. }
  455. } else {
  456. dotfront = re;
  457. for (var i = 0; i < n; i++) {
  458. dotlast += "0";
  459. }
  460. }
  461. num = dotfront + '.' + dotlast;
  462. return num;
  463. }
  464. function _formatAmount(strData, n) {
  465. var CurrencyAndAmountRegExp =
  466. /^(\d{1,18})|(\d{1,18}\.)|(\d{1,17}\.\d{0,1})|(\d{1,16}\.\d{0,2})|(\.\d{1,2})$/;
  467. var _result = CurrencyAndAmountRegExp.test(strData);
  468. if (_result == false) {
  469. return strData;
  470. } // 一般来说最多就6位吧,当然如果有特殊需求可自行更改(`・∀・´)
  471. n = n > 0 && n <= 6 ? n : 2;
  472. var formatData = parseFloat((strData + '').replace(/[^\d\.-]/g, '')).toFixed(n) + '';
  473. var l = formatData.split('.')[0].split('').reverse();
  474. var r = formatData.split('.')[1];
  475. var t = '';
  476. for (i = 0; i < l.length; i++) {
  477. t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? ',' : '');
  478. }
  479. return t.split('').reverse().join('') + '.' + r;
  480. }
  481. function strlen(str) {
  482. var len = 0;
  483. for (var i = 0; i < str.length; i++) {
  484. var c = str.charCodeAt(i);
  485. //单字节加1
  486. if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) {
  487. len++;
  488. } else {
  489. len += 2;
  490. }
  491. }
  492. return len;
  493. }
  494. </script>
  495. }
  496. <section style="display: none">
  497. <select id="hid-type">
  498. <option value=""></option>
  499. </select>
  500. @Html.DropDownList("hid-emergencyLevel", emergencyLevelList);
  501. @*@Html.DropDownList("hide-StoreHouses", storeHouses)*@
  502. </section>