order.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. <?php
  2. require_once 'conn.php';
  3. checkLogin();
  4. // 辅助函数
  5. function textDecode($str) {
  6. return htmlspecialchars_decode($str, ENT_QUOTES);
  7. }
  8. function htmlDecode($str) {
  9. return htmlspecialchars_decode($str, ENT_QUOTES);
  10. }
  11. $act = $_GET['act'] ?? '';
  12. $urlStr = '';
  13. // 处理批量操作
  14. if ($act == "postchk") {
  15. if (isset($_POST['chkbox']) && isset($_POST['chkact'])) {
  16. $chkact = $_POST['chkact'];
  17. $ids = implode(',', array_map('intval', $_POST['chkbox']));
  18. $employee_id = $_SESSION['employee_id'];
  19. switch($chkact) {
  20. case "0":
  21. case "1":
  22. case "2":
  23. case "3":
  24. case "4":
  25. case "5":
  26. $sql = "UPDATE orders SET order_status = $chkact WHERE id IN ($ids) AND employee_id = $employee_id";
  27. break;
  28. case "-1":
  29. // 删除订单记录和订单项记录(依靠外键级联删除)
  30. $sql = "DELETE FROM orders WHERE id IN ($ids) AND employee_id = $employee_id";
  31. break;
  32. }
  33. if (isset($sql)) {
  34. mysqli_query($conn, $sql);
  35. }
  36. $keys = urlencode($_GET['Keys'] ?? '');
  37. $page = $_GET['Page'] ?? '';
  38. header("Location: ?keys=$keys&Page=$page$urlStr");
  39. exit;
  40. }
  41. }
  42. // 处理筛选条件
  43. $fliterStatus = $_GET['fliterStatus'] ?? '';
  44. $fliterPayment = $_GET['fliterPayment'] ?? '';
  45. $fliterCustomer = $_GET['fliterCustomer'] ?? '';
  46. $fliterFromDate = $_GET['fliterFromDate'] ?? '';
  47. $fliterToDate = $_GET['fliterToDate'] ?? '';
  48. $fliterStr = "";
  49. if (!empty($fliterStatus)) {
  50. $fliterStr .= " AND o.order_status = " . intval($fliterStatus);
  51. $urlStr .= "&fliterStatus=" . $fliterStatus;
  52. }
  53. if (!empty($fliterPayment)) {
  54. $fliterStr .= " AND o.payment_status = " . intval($fliterPayment);
  55. $urlStr .= "&fliterPayment=" . $fliterPayment;
  56. }
  57. if (!empty($fliterCustomer)) {
  58. $fliterStr .= " AND o.customer_id = " . intval($fliterCustomer);
  59. $urlStr .= "&fliterCustomer=" . $fliterCustomer;
  60. }
  61. if (!empty($fliterFromDate)) {
  62. $fliterStr .= " AND o.order_date >= '" . mysqli_real_escape_string($conn, $fliterFromDate) . "'";
  63. $urlStr .= "&fliterFromDate=" . urlencode($fliterFromDate);
  64. }
  65. if (!empty($fliterToDate)) {
  66. $fliterStr .= " AND o.order_date <= '" . mysqli_real_escape_string($conn, $fliterToDate) . " 23:59:59'";
  67. $urlStr .= "&fliterToDate=" . urlencode($fliterToDate);
  68. }
  69. // 搜索和排序
  70. $keys = $_GET['Keys'] ?? '';
  71. $keyscode = mysqli_real_escape_string($conn, $keys);
  72. $page = $_GET['Page'] ?? 1;
  73. $ord = $_GET['Ord'] ?? '';
  74. $ordStr = !empty($ord) ? "$ord," : "";
  75. // 构建查询SQL
  76. $employee_id = $_SESSION['employee_id'];
  77. $sqlStr = "SELECT o.*, c.cs_company, cc.contact_name
  78. FROM orders o
  79. LEFT JOIN customer c ON o.customer_id = c.id
  80. LEFT JOIN customer_contact cc ON o.contact_id = cc.id
  81. WHERE o.employee_id = $employee_id";
  82. if (!empty($keyscode)) {
  83. $sqlStr .= " AND (o.order_code LIKE '%$keyscode%'
  84. OR c.cs_company LIKE '%$keyscode%'
  85. OR cc.contact_name LIKE '%$keyscode%')";
  86. }
  87. $sqlStr .= " $fliterStr ORDER BY {$ordStr}o.created_at DESC";
  88. ?>
  89. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  90. <html xmlns="http://www.w3.org/1999/xhtml">
  91. <head>
  92. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  93. <title>订单列表</title>
  94. <link rel="stylesheet" href="css/common.css" type="text/css" />
  95. <link rel="stylesheet" href="css/alert.css" type="text/css" />
  96. <script src="js/jquery-1.7.2.min.js"></script>
  97. <script src="js/js.js"></script>
  98. <style>
  99. body {
  100. margin: 0;
  101. padding: 20px;
  102. background: #fff;
  103. }
  104. #man_zone {
  105. margin-left: 0;
  106. }
  107. .status-badge {
  108. display: inline-block;
  109. padding: 3px 8px;
  110. border-radius: 3px;
  111. font-size: 12px;
  112. color: white;
  113. }
  114. .status-0 { background-color: #999; }
  115. .status-1 { background-color: #5bc0de; }
  116. .status-2 { background-color: #337ab7; }
  117. .status-3 { background-color: #f0ad4e; }
  118. .status-4 { background-color: #5cb85c; }
  119. .status-5 { background-color: #28a745; }
  120. .payment-badge {
  121. display: inline-block;
  122. padding: 3px 8px;
  123. border-radius: 3px;
  124. font-size: 12px;
  125. color: white;
  126. }
  127. .payment-0 { background-color: #d9534f; }
  128. .payment-1 { background-color: #f0ad4e; }
  129. .payment-2 { background-color: #5cb85c; }
  130. /* Date picker styling */
  131. .date-input {
  132. padding: 5px;
  133. border: 1px solid #ccc;
  134. border-radius: 3px;
  135. }
  136. </style>
  137. </head>
  138. <body>
  139. <div id="man_zone">
  140. <div class="fastSelect clear">
  141. <H1>筛选条件</H1>
  142. <div class="selectItem">
  143. <label>订单状态</label>
  144. <select name="fliterStatus" class="filterSearch">
  145. <option value="">全部状态</option>
  146. <option value="0"<?= $fliterStatus == "0" ? ' selected' : '' ?>>已取消</option>
  147. <option value="1"<?= $fliterStatus == "1" ? ' selected' : '' ?>>待确认</option>
  148. <option value="2"<?= $fliterStatus == "2" ? ' selected' : '' ?>>已确认</option>
  149. <option value="3"<?= $fliterStatus == "3" ? ' selected' : '' ?>>生产中</option>
  150. <option value="4"<?= $fliterStatus == "4" ? ' selected' : '' ?>>已发货</option>
  151. <option value="5"<?= $fliterStatus == "5" ? ' selected' : '' ?>>已完成</option>
  152. </select>
  153. </div>
  154. <div class="selectItem">
  155. <label>付款状态</label>
  156. <select name="fliterPayment" class="filterSearch">
  157. <option value="">全部付款状态</option>
  158. <option value="0"<?= $fliterPayment == "0" ? ' selected' : '' ?>>未付款</option>
  159. <option value="1"<?= $fliterPayment == "1" ? ' selected' : '' ?>>部分付款</option>
  160. <option value="2"<?= $fliterPayment == "2" ? ' selected' : '' ?>>已付清</option>
  161. </select>
  162. </div>
  163. <div class="selectItem">
  164. <label>客户筛选</label>
  165. <select name="fliterCustomer" class="filterSearch">
  166. <option value="">全部客户</option>
  167. <?php
  168. $employee_id = $_SESSION['employee_id'];
  169. $customerSql = "SELECT id, cs_company FROM customer WHERE cs_belong = $employee_id ORDER BY cs_company";
  170. $customerResult = mysqli_query($conn, $customerSql);
  171. while ($customerRow = mysqli_fetch_assoc($customerResult)) {
  172. $selected = ($fliterCustomer == $customerRow['id']) ? ' selected' : '';
  173. echo "<option value=\"{$customerRow['id']}\"$selected>" . htmlspecialcharsFix($customerRow['cs_company']) . "</option>";
  174. }
  175. ?>
  176. </select>
  177. </div>
  178. <div class="selectItem">
  179. <label>订单日期 从</label>
  180. <input type="date" name="fliterFromDate" class="date-input filterSearch" value="<?= $fliterFromDate ?>">
  181. <label>到</label>
  182. <input type="date" name="fliterToDate" class="date-input filterSearch" value="<?= $fliterToDate ?>">
  183. </div>
  184. <div class="inputSearch">
  185. <input type="text" id="keys" class="inputTxt"
  186. value="<?= empty($keyscode) ? '请输入搜索关键词' : $keyscode ?>"
  187. onFocus="if(this.value == '<?= empty($keyscode) ? '请输入搜索关键词' : $keyscode ?>'){this.value='';}"
  188. onBlur="if(this.value == ''){this.value='<?= empty($keyscode) ? '请输入搜索关键词' : $keyscode ?>';}"
  189. onKeyDown="if(event.keyCode==13){location.href='?Keys='+escape(document.getElementById('keys').value)}" />
  190. <input type="button" id="searchgo" class="searchgo" value="go"
  191. onClick="location.href='?Keys='+escape(document.getElementById('keys').value)" />
  192. </div>
  193. </div>
  194. <form id="form1" method="post" action="?act=postchk&Keys=<?= $keys ?>&Page=<?= $page ?>" onSubmit="return false">
  195. <div align="right" style="margin-bottom: 10px;">
  196. <input type="button" value="新增订单" class="btn1" onClick="location.href='order_add.php'" />
  197. </div>
  198. <div class="table2 em<?= $_SESSION['employee_id'] ?>">
  199. <div class="theader">
  200. <div class="col1"><input type="checkbox" name="chkall" id="chkall" onClick="chkboxall(this,'chkbox')" /></div>
  201. <div class="col2">序号</div>
  202. <div class="col3">订单编号</div>
  203. <div class="col4">客户</div>
  204. <div class="col5">联系人</div>
  205. <div class="col6">订单日期</div>
  206. <div class="col7">订单状态</div>
  207. <div class="col8">付款状态</div>
  208. <div class="col9">订单金额</div>
  209. <div class="col10">操作</div>
  210. </div>
  211. <?php
  212. // 设置每页显示记录数
  213. $pageSize = 20;
  214. // 获取总记录数
  215. $employee_id = $_SESSION['employee_id'];
  216. $countSql = "SELECT COUNT(*) AS total FROM orders o
  217. WHERE o.employee_id = $employee_id";
  218. if (!empty($keyscode)) {
  219. $countSql .= " AND (o.order_code LIKE '%$keyscode%'
  220. OR o.customer_id IN (SELECT id FROM customer WHERE cs_company LIKE '%$keyscode%'))";
  221. }
  222. $countSql .= $fliterStr;
  223. $countResult = mysqli_query($conn, $countSql);
  224. $countRow = mysqli_fetch_assoc($countResult);
  225. $totalRecords = $countRow['total'];
  226. // 计算总页数
  227. $totalPages = ceil($totalRecords / $pageSize);
  228. if ($totalPages < 1) $totalPages = 1;
  229. // 验证当前页码
  230. $page = (int)$page;
  231. if ($page < 1) $page = 1;
  232. if ($page > $totalPages) $page = $totalPages;
  233. // 计算起始记录
  234. $offset = ($page - 1) * $pageSize;
  235. // 添加分页条件
  236. $sqlStr .= " LIMIT $offset, $pageSize";
  237. $result = mysqli_query($conn, $sqlStr);
  238. if (mysqli_num_rows($result) > 0) {
  239. $tempNum = ($page - 1) * $pageSize;
  240. while ($row = mysqli_fetch_assoc($result)) {
  241. $tempNum++;
  242. ?>
  243. <div class="tline">
  244. <div class="col1" align="center"><input type="checkbox" name="chkbox[]" value="<?= $row['id'] ?>" /></div>
  245. <div class="col2"><?= $tempNum ?></div>
  246. <div class="col3"><?= htmlspecialcharsFix($row['order_code']) ?></div>
  247. <div class="col4"><?= htmlspecialcharsFix($row['cs_company']) ?></div>
  248. <div class="col5"><?= htmlspecialcharsFix($row['contact_name']) ?></div>
  249. <div class="col6"><?= date('Y-m-d', strtotime($row['order_date'])) ?></div>
  250. <div class="col7">
  251. <?php
  252. $statusMap = [
  253. 0 => '已取消',
  254. 1 => '待确认',
  255. 2 => '已确认',
  256. 3 => '生产中',
  257. 4 => '已发货',
  258. 5 => '已完成'
  259. ];
  260. echo '<span class="status-badge status-' . $row['order_status'] . '">' .
  261. $statusMap[$row['order_status']] . '</span>';
  262. ?>
  263. </div>
  264. <div class="col8">
  265. <?php
  266. $paymentMap = [
  267. 0 => '未付款',
  268. 1 => '部分付款',
  269. 2 => '已付清'
  270. ];
  271. echo '<span class="payment-badge payment-' . $row['payment_status'] . '">' .
  272. $paymentMap[$row['payment_status']] . '</span>';
  273. ?>
  274. </div>
  275. <div class="col9"><?= number_format($row['total_amount'], 2) . ' ' . $row['currency'] ?></div>
  276. <div class="col10">
  277. <a href="order_edit.php?id=<?= $row['id'] ?>&keys=<?= $keys ?>&page=<?= $page ?>" class="ico_edit ico">修改</a>
  278. <a href="order_details.php?id=<?= $row['id'] ?>" class="ico_view ico">查看详情</a>
  279. </div>
  280. </div>
  281. <?php
  282. }
  283. } else {
  284. if (empty($keys) && empty($fliterStr)) {
  285. echo '<div class="tline"><div align="center" colspan="10">当前暂无订单记录</div></div>';
  286. } else {
  287. echo '<div class="tline"><div align="center" colspan="10"><a href="?">没有找到匹配的订单记录,点击返回</a></div></div>';
  288. }
  289. }
  290. ?>
  291. <div colspan="10">
  292. <div class="showpagebox">
  293. <?php
  294. if ($totalPages > 1) {
  295. $pageName = "?Keys=$keys$urlStr&";
  296. $pageLen = 3;
  297. if ($page > 1) {
  298. echo "<a href=\"{$pageName}Page=1\">首页</a>";
  299. echo "<a href=\"{$pageName}Page=" . ($page - 1) . "\">上一页</a>";
  300. }
  301. if ($pageLen * 2 + 1 >= $totalPages) {
  302. $startPage = 1;
  303. $endPage = $totalPages;
  304. } else {
  305. if ($page <= $pageLen + 1) {
  306. $startPage = 1;
  307. $endPage = $pageLen * 2 + 1;
  308. } else {
  309. $startPage = $page - $pageLen;
  310. $endPage = $page + $pageLen;
  311. }
  312. if ($page + $pageLen > $totalPages) {
  313. $startPage = $totalPages - $pageLen * 2;
  314. $endPage = $totalPages;
  315. }
  316. }
  317. for ($i = $startPage; $i <= $endPage; $i++) {
  318. if ($i == $page) {
  319. echo "<a class=\"current\">$i</a>";
  320. } else {
  321. echo "<a href=\"{$pageName}Page=$i\">$i</a>";
  322. }
  323. }
  324. if ($page < $totalPages) {
  325. if ($totalPages - $page > $pageLen) {
  326. echo "<a href=\"{$pageName}Page=$totalPages\">...$totalPages</a>";
  327. }
  328. echo "<a href=\"{$pageName}Page=" . ($page + 1) . "\">下一页</a>";
  329. echo "<a href=\"{$pageName}Page=$totalPages\">尾页</a>";
  330. }
  331. }
  332. ?>
  333. </div>
  334. <div class="postchkbox">
  335. <select id="chkact" name="chkact">
  336. <option value="1">待确认</option>
  337. <option value="2">已确认</option>
  338. <option value="3">生产中</option>
  339. <option value="4">已发货</option>
  340. <option value="5">已完成</option>
  341. <option value="0">取消订单</option>
  342. <option value="-1">删除</option>
  343. </select>
  344. <input type="button" value="执行" onClick="postchk(1)" class="btn1" />
  345. </div>
  346. </div>
  347. </div>
  348. </form>
  349. <script>
  350. $(document).ready(function() {
  351. // 处理筛选条件改变
  352. $('.filterSearch').change(function() {
  353. var url = '?';
  354. var keys = $('#keys').val();
  355. if (keys && keys != '请输入搜索关键词') {
  356. url += 'Keys=' + encodeURIComponent(keys) + '&';
  357. }
  358. $('.filterSearch').each(function() {
  359. var name = $(this).attr('name');
  360. var value = $(this).val();
  361. if (value) {
  362. url += name + '=' + encodeURIComponent(value) + '&';
  363. }
  364. });
  365. // 移除末尾的&
  366. if (url.endsWith('&')) {
  367. url = url.substring(0, url.length - 1);
  368. }
  369. location.href = url;
  370. });
  371. });
  372. </script>
  373. </div>
  374. </body>
  375. </html>