NotCompleteOrderItem.cshtml 21 KB

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