order.html 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. <!DOCTYPE html>
  2. <html lang="zh-CN" data-bs-theme="light">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>订单-SIMANC TCS</title>
  7. <!-- 在页面加载前应用保存的主题设置,避免闪烁 -->
  8. <script src="../js/themePreSet.js"></script>
  9. <!-- 预渲染导航栏,减少延迟 -->
  10. <script src="../js/headerPreRender.js"></script>
  11. <!-- Tabler Core CSS -->
  12. <link
  13. href="../assets/css/app.css"
  14. rel="stylesheet"
  15. />
  16. </head>
  17. <body>
  18. <div class="page">
  19. <!-- 顶部导航栏容器 -->
  20. <div id="tcs-header-container" class="tcs-header-container"></div>
  21. <header
  22. class="navbar navbar-expand-md tcs-container-space-x tcs-navbar-compact justify-content-between flex-column flex-md-row"
  23. >
  24. <div class="d-flex flex-column flex-md-row w-100 align-items-start align-items-md-center mb-2 mb-md-0">
  25. <div class="d-flex flex-wrap align-items-center me-md-auto">
  26. <div class="d-flex flex-wrap align-items-center">
  27. <div class="tcs-filter-group mb-2 mb-md-0 me-md-2">
  28. <label class="form-label mb-0 me-2 d-inline">开始:</label>
  29. <input
  30. type="date"
  31. class="form-control tcs-form-item"
  32. value="2025-03-16"
  33. id="date-start"
  34. />
  35. </div>
  36. <div class="tcs-filter-group mb-2 mb-md-0 me-md-2">
  37. <label class="form-label mb-0 me-2 d-inline">结束:</label>
  38. <input
  39. type="date"
  40. class="form-control tcs-form-item"
  41. value="2025-03-16"
  42. id="date-end"
  43. />
  44. </div>
  45. <div class="tcs-filter-group mb-2 mb-md-0">
  46. <label class="form-label mb-0 me-2 d-inline">状态:</label>
  47. <div>
  48. <select class="form-select tcs-form-item" id="status-filter">
  49. <option>完成</option>
  50. <option selected>全部</option>
  51. <option>待处理</option>
  52. <option>进行中</option>
  53. <option>已取消</option>
  54. <option>已超时</option>
  55. </select>
  56. </div>
  57. </div>
  58. </div>
  59. </div>
  60. <div class="d-flex align-items-center ms-md-auto mt-2 mt-md-0">
  61. <button class="btn btn-primary tcs-form-item" data-bs-toggle="modal" data-bs-target="#addOrderModal">
  62. <i class="ti ti-plus me-1"></i>添加
  63. </button>
  64. <button class="btn btn-danger ms-2 tcs-form-item" data-bs-toggle="modal" data-bs-target="#cancelAllModal">
  65. <!-- <i class="ti ti-trash me-1"></i> -->取消所有
  66. </button>
  67. </div>
  68. </div>
  69. </header>
  70. <!-- 页面内容 -->
  71. <div
  72. class="page-wrapper"
  73. >
  74. <div class="card tcs-card-full border-0">
  75. <div class="card-body p-0">
  76. <div class="table-responsive">
  77. <table
  78. class="table table-vcenter card-table table-hover tcs-table-compact"
  79. id="data-table"
  80. >
  81. <thead>
  82. <tr>
  83. <th>ID</th>
  84. <th>时间</th>
  85. <th>从</th>
  86. <th>到</th>
  87. <th>货物</th>
  88. <th>期限</th>
  89. <th>开始</th>
  90. <th>结束</th>
  91. <th>状态</th>
  92. <th class="w-1">操作</th>
  93. </tr>
  94. </thead>
  95. <tbody>
  96. <!-- 表格内容将由JavaScript动态生成 -->
  97. </tbody>
  98. </table>
  99. </div>
  100. </div>
  101. <div class="card-footer d-flex align-items-center tcs-card-footer-compact flex-column flex-md-row">
  102. <div class="d-flex flex-column flex-md-row align-items-start align-items-md-center mb-2 mb-md-0 w-100 w-md-auto">
  103. <span id="pagination-info" class="text-secondary mb-2 mb-md-0">
  104. <!-- 分页信息将由JavaScript动态生成 -->
  105. </span>
  106. <div class="ms-0 ms-md-3 d-flex align-items-center">
  107. <span class="me-2 text-secondary">每页显示</span>
  108. <div class="dropdown d-inline-block">
  109. <button
  110. class="btn dropdown-toggle px-2 tcs-form-item-pagiton"
  111. type="button"
  112. data-bs-toggle="dropdown"
  113. >
  114. <span id="current-page-size">10</span>
  115. <span class="ms-1 d-none d-sm-inline">条记录</span>
  116. </button>
  117. <div class="dropdown-menu dropdown-menu-end">
  118. <a
  119. class="dropdown-item page-size-item"
  120. href="#"
  121. data-size="10"
  122. >10</a
  123. >
  124. <a
  125. class="dropdown-item page-size-item"
  126. href="#"
  127. data-size="20"
  128. >20</a
  129. >
  130. <a
  131. class="dropdown-item page-size-item"
  132. href="#"
  133. data-size="50"
  134. >50</a
  135. >
  136. <a
  137. class="dropdown-item page-size-item"
  138. href="#"
  139. data-size="100"
  140. >100</a
  141. >
  142. </div>
  143. </div>
  144. </div>
  145. </div>
  146. <ul class="pagination m-0 ms-md-auto mt-2 mt-md-0" id="pagination-controls">
  147. <!-- 分页控件将由JavaScript动态生成 -->
  148. </ul>
  149. </div>
  150. </div>
  151. </div>
  152. <!-- 添加订单模态框 -->
  153. <div class="modal modal-blur fade" id="addOrderModal" tabindex="-1" role="dialog" aria-hidden="true">
  154. <div class="modal-dialog modal-lg modal-dialog-scrollable" role="document">
  155. <div class="modal-content">
  156. <div class="modal-header">
  157. <h5 class="modal-title">添加新订单</h5>
  158. <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  159. </div>
  160. <div class="modal-body">
  161. <form id="addOrderForm" class="needs-validation" novalidate>
  162. <div class="mb-3 row">
  163. <label class="col-3 col-form-label required text-end">从</label>
  164. <div class="col">
  165. <input type="text" class="form-control" name="from" placeholder="起始地点" required>
  166. <div class="invalid-feedback">请输入起始地点</div>
  167. </div>
  168. </div>
  169. <div class="mb-3 row">
  170. <label class="col-3 col-form-label required text-end">到</label>
  171. <div class="col">
  172. <input type="text" class="form-control" name="to" placeholder="目的地" required>
  173. <div class="invalid-feedback">请输入目的地</div>
  174. </div>
  175. </div>
  176. <div class="mb-3 row">
  177. <label class="col-3 col-form-label required text-end">货物</label>
  178. <div class="col">
  179. <input type="text" class="form-control" name="good" placeholder="货物描述" required>
  180. <div class="invalid-feedback">请输入货物描述</div>
  181. </div>
  182. </div>
  183. <div class="mb-3 row">
  184. <label class="col-3 col-form-label required text-end">期限</label>
  185. <div class="col">
  186. <input type="datetime-local" class="form-control" name="deadline" required>
  187. <div class="invalid-feedback">请选择期限时间</div>
  188. </div>
  189. </div>
  190. <div class="mb-3 row">
  191. <label class="col-3 col-form-label text-end">状态</label>
  192. <div class="col">
  193. <select class="form-select" name="status">
  194. <option value="待处理" selected>待处理</option>
  195. <option value="进行中">进行中</option>
  196. </select>
  197. </div>
  198. </div>
  199. <div class="mb-3 row">
  200. <label class="col-3 col-form-label text-end">备注</label>
  201. <div class="col">
  202. <textarea class="form-control" name="notes" rows="3" placeholder="订单备注信息"></textarea>
  203. </div>
  204. </div>
  205. </form>
  206. </div>
  207. <div class="modal-footer tcs-modal-footer">
  208. <button type="button" class="btn me-auto" data-bs-dismiss="modal">取消</button>
  209. <button type="button" class="btn btn-primary" id="saveOrderBtn">保存</button>
  210. </div>
  211. </div>
  212. </div>
  213. </div>
  214. <!-- 取消所有订单的小型确认模态框 -->
  215. <div class="modal modal-blur fade" id="cancelAllModal" tabindex="-1" role="dialog" aria-hidden="true">
  216. <div class="modal-dialog modal-sm modal-dialog-centered" role="document">
  217. <div class="modal-content">
  218. <div class="modal-body">
  219. <div class="modal-title">确认取消所有</div>
  220. <div>您确定要取消所有待处理和进行中的订单吗?此操作无法撤销。</div>
  221. </div>
  222. <div class="modal-footer tcs-modal-footer">
  223. <button type="button" class="btn btn-link link-secondary me-auto" data-bs-dismiss="modal">取消</button>
  224. <button type="button" class="btn btn-danger" id="confirmCancelAllBtn">确认</button>
  225. </div>
  226. </div>
  227. </div>
  228. </div>
  229. <!-- 取消单个订单的小型确认模态框 -->
  230. <div class="modal modal-blur fade" id="cancelOrderModal" tabindex="-1" role="dialog" aria-hidden="true">
  231. <div class="modal-dialog modal-sm modal-dialog-centered" role="document">
  232. <div class="modal-content">
  233. <div class="modal-body">
  234. <div class="modal-title">确认取消</div>
  235. <div>您确定要取消此订单吗?此操作无法撤销。</div>
  236. </div>
  237. <div class="modal-footer tcs-modal-footer">
  238. <button type="button" class="btn btn-link link-secondary me-auto" data-bs-dismiss="modal">取消</button>
  239. <button type="button" class="btn btn-danger" id="confirmCancelOrderBtn">确认</button>
  240. </div>
  241. </div>
  242. </div>
  243. </div>
  244. <!-- Tabler Core JS -->
  245. <script src="../assets/js/tabler.min.js"></script>
  246. <script src="../assets/js/jquery-3.7.1.min.js"></script>
  247. <script src="../js/themePoc.js"></script>
  248. <!-- 表格组件JS -->
  249. <script src="../js/tcsTable.js"></script>
  250. <!-- 模态框组件JS -->
  251. <script src="../js/tcsModal.js"></script>
  252. <!-- 页面特定的JavaScript -->
  253. <script>
  254. document.addEventListener("DOMContentLoaded", function () {
  255. // 配置表格选项
  256. const tableOptions = {
  257. tableId: "data-table",
  258. paginationInfoId: "pagination-info",
  259. paginationControlsId: "pagination-controls",
  260. pageSizeId: "current-page-size",
  261. pageSizeItemClass: "page-size-item",
  262. defaultPageSize: 10,
  263. columns: [
  264. { field: "id", title: "ID", className: "tcs-table-id-column" },
  265. {
  266. field: "orderTime",
  267. title: "时间",
  268. className: "tcs-table-time-column",
  269. formatter: function(value) {
  270. return formatDateTime(value);
  271. }
  272. },
  273. { field: "from", title: "从", className: "tcs-table-from-column" },
  274. { field: "to", title: "到", className: "tcs-table-to-column" },
  275. { field: "good", title: "货物", className: "tcs-table-goods-column" },
  276. {
  277. field: "deadline",
  278. title: "期限",
  279. className: "tcs-table-time-column",
  280. defaultValue: "-",
  281. formatter: function(value) {
  282. return formatDateTime(value);
  283. }
  284. },
  285. {
  286. field: "startTime",
  287. title: "开始",
  288. className: "tcs-table-time-column",
  289. defaultValue: "-"
  290. },
  291. {
  292. field: "endTime",
  293. title: "结束",
  294. className: "tcs-table-time-column",
  295. defaultValue: "-"
  296. },
  297. {
  298. field: "status",
  299. title: "状态",
  300. className: "tcs-table-status-column",
  301. formatter: function(value) {
  302. let badgeClass = "";
  303. switch (value.text) {
  304. case "进行中": badgeClass = "badge bg-success-lt"; break;
  305. case "待处理": badgeClass = "badge bg-warning-lt"; break;
  306. case "已完成": badgeClass = "badge bg-info-lt"; break;
  307. case "已取消": badgeClass = "badge bg-danger-lt"; break;
  308. case "已超时": badgeClass = "badge bg-secondary-lt"; break;
  309. default: badgeClass = "badge bg-secondary-lt";
  310. }
  311. const badge = `<span class="${badgeClass}" style="width:100%;text-align:center">${value.text}</span>`;
  312. return badge;
  313. }
  314. },
  315. {
  316. field: "action",
  317. title: "操作",
  318. className: "tcs-table-action-column",
  319. formatter: function(value, row) {
  320. if (row.status.text === "待处理" || row.status.text === "进行中") {
  321. return `<button class="btn tcs-table-oper-btn" data-bs-toggle="modal" data-bs-target="#cancelOrderModal" data-id="${row.id}">取消</button>`;
  322. } else {
  323. return `<button class="btn tcs-table-oper-btn" disabled>取消</button>`;
  324. }
  325. }
  326. }
  327. ]
  328. };
  329. // 生成模拟数据
  330. const orderData = TcsTable.generateOrderData(109);
  331. // 初始化表格
  332. const orderTable = new TcsTable(tableOptions, orderData);
  333. // 添加日期时间筛选功能
  334. const dateStart = document.getElementById("date-start");
  335. const dateEnd = document.getElementById("date-end");
  336. const statusFilter = document.getElementById("status-filter");
  337. // 日期变化时触发查询
  338. dateStart.addEventListener("change", applyFilters);
  339. dateEnd.addEventListener("change", applyFilters);
  340. // 状态选择变化时触发查询
  341. statusFilter.addEventListener("change", applyFilters);
  342. // 应用筛选函数
  343. function applyFilters() {
  344. const startDate = dateStart.value ? new Date(dateStart.value) : null;
  345. const endDate = dateEnd.value ? new Date(dateEnd.value) : null;
  346. const statusValue = statusFilter.value;
  347. orderTable.filter(function(order) {
  348. // 检查日期范围
  349. const orderDate = new Date(order.orderTime.replace(" ", "T"));
  350. const dateInRange =
  351. (!startDate || orderDate >= startDate) &&
  352. (!endDate || orderDate <= endDate);
  353. // 检查状态
  354. const statusMatch =
  355. statusValue === "全部" || order.status.text === statusValue;
  356. return dateInRange && statusMatch;
  357. });
  358. }
  359. // 时间格式化函数
  360. function formatDateTime(dateTimeStr) {
  361. if (!dateTimeStr || dateTimeStr === "-") return "-";
  362. const date = new Date(dateTimeStr.replace(" ", "T"));
  363. return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}-${String(date.getDate()).padStart(2, "0")} ${String(date.getHours()).padStart(2, "0")}:${String(date.getMinutes()).padStart(2, "0")}`;
  364. }
  365. // ---------------------初始化模态框组件---------------------
  366. // 添加订单模态框
  367. const addOrderModal = new TcsModal({
  368. modalId: 'addOrderModal',
  369. confirmBtnId: 'saveOrderBtn',
  370. formId: 'addOrderForm',
  371. onConfirm: function(data) {
  372. // 这里添加保存订单的逻辑
  373. console.log('保存新订单', data);
  374. // 显示成功提示
  375. TcsNotify.show('订单已添加成功!', 'success');
  376. }
  377. });
  378. // 取消所有订单模态框
  379. const cancelAllModal = new TcsModal({
  380. modalId: 'cancelAllModal',
  381. confirmBtnId: 'confirmCancelAllBtn',
  382. onConfirm: function() {
  383. // 这里添加取消所有订单的逻辑
  384. console.log('取消所有待处理和进行中的订单');
  385. // 显示成功提示
  386. TcsNotify.show('所有符合条件的订单已取消', 'success');
  387. }
  388. });
  389. // 取消单个订单模态框
  390. let currentOrderId = null;
  391. const cancelOrderModal = new TcsModal({
  392. modalId: 'cancelOrderModal',
  393. confirmBtnId: 'confirmCancelOrderBtn',
  394. onShow: function(relatedTarget) {
  395. // 获取要取消的订单ID
  396. currentOrderId = relatedTarget ? relatedTarget.getAttribute('data-id') : null;
  397. },
  398. onConfirm: function() {
  399. // 这里添加取消单个订单的逻辑
  400. console.log('取消订单ID:', currentOrderId);
  401. // 显示成功提示
  402. TcsNotify.show(`订单 #${currentOrderId} 已取消`, 'success');
  403. // 重置当前订单ID
  404. currentOrderId = null;
  405. }
  406. });
  407. });
  408. </script>
  409. </body>
  410. </html>