order_save.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. <?php
  2. require_once 'conn.php';
  3. checkLogin();
  4. $isedit = false;
  5. $id = $_POST['id'] ?? '';
  6. if (!empty($id) && is_numeric($id)) {
  7. $isedit = true;
  8. // 检查是否为管理员,非管理员只能编辑自己的订单
  9. $isAdmin = checkIfAdmin();
  10. if (!$isAdmin) {
  11. // 验证订单所有权
  12. $checkOwnershipQuery = "SELECT id FROM orders WHERE id = $id AND employee_id = " . $_SESSION['employee_id'];
  13. $ownershipResult = mysqli_query($conn, $checkOwnershipQuery);
  14. if (mysqli_num_rows($ownershipResult) === 0) {
  15. echo "<script>alert('您没有权限编辑此订单!');history.back();</script>";
  16. exit;
  17. }
  18. // 检查订单创建时间,非管理员不能编辑超过30天的订单
  19. $orderDateQuery = "SELECT DATEDIFF(NOW(), created_at) as days_diff FROM orders WHERE id = $id";
  20. $orderDateResult = mysqli_query($conn, $orderDateQuery);
  21. $orderDateData = mysqli_fetch_assoc($orderDateResult);
  22. if ($orderDateData['days_diff'] > 30) {
  23. echo "<script>alert('超过30天的订单只有管理员可以编辑!');history.back();</script>";
  24. exit;
  25. }
  26. }
  27. }
  28. // 获取表单数据 - 订单基本信息
  29. $order_code = mysqli_real_escape_string($conn, htmlspecialchars($_POST['order_code'], ENT_QUOTES, 'UTF-8'));
  30. $customer_id = (int)$_POST['customer_id'];
  31. $contact_id = !empty($_POST['contact_id']) ? (int)$_POST['contact_id'] : "NULL";
  32. $employee_id = $_SESSION['employee_id'];
  33. $order_date = mysqli_real_escape_string($conn, $_POST['order_date']);
  34. $shipping_date = mysqli_real_escape_string($conn, $_POST['shipping_date']);
  35. $order_type = (int)$_POST['order_type'];
  36. // 设置已删除字段的默认值
  37. $delivery_date = "NULL";
  38. $actual_delivery_date = "NULL";
  39. $order_status = 1; // 默认为"待确认"
  40. $payment_status = 0; // 默认为"未付款"
  41. $currency = "CNY"; // 默认为人民币
  42. $notes = mysqli_real_escape_string($conn, htmlspecialchars($_POST['notes'], ENT_QUOTES, 'UTF-8'));
  43. $internal_notes = ""; // 默认为空
  44. $no_cashback = isset($_POST['no_cashback']) ? (int)$_POST['no_cashback'] : 0; // 获取是否不参与返点
  45. // 获取订单项信息
  46. $items = $_POST['items'] ?? [];
  47. // 计算订单总额
  48. $subtotal = 0;
  49. $discount_amount = !empty($_POST['discount_amount']) ? (float)$_POST['discount_amount'] : 0;
  50. foreach ($items as $item) {
  51. $quantity = (int)$item['quantity'];
  52. $total_price = (float)$item['total_price']; // 直接使用用户输入的总价
  53. $subtotal += $total_price;
  54. }
  55. $total_amount = $subtotal - $discount_amount;
  56. // 验证必填字段
  57. if (empty($order_code)) {
  58. echo "<script>alert('销售开单号不能为空');history.back();</script>";
  59. exit;
  60. }
  61. // 检查订单号是否已存在,不管是不是删除的订单
  62. $check_order_code_sql = "SELECT id FROM orders WHERE order_code = '$order_code' ";
  63. if ($isedit) {
  64. $check_order_code_sql .= " AND id != $id";
  65. }
  66. $check_result = mysqli_query($conn, $check_order_code_sql);
  67. if (mysqli_num_rows($check_result) > 0) {
  68. echo "<script>alert('销售开单号已存在,请使用其他开单号');history.back();</script>";
  69. exit;
  70. }
  71. if (!in_array($order_type, [1, 2])) {
  72. echo "<script>alert('请选择有效的订单类型');history.back();</script>";
  73. exit;
  74. }
  75. if ($customer_id <= 0) {
  76. echo "<script>alert('请选择客户');history.back();</script>";
  77. exit;
  78. }
  79. if (empty($items)) {
  80. echo "<script>alert('订单必须包含至少一个产品');history.back();</script>";
  81. exit;
  82. }
  83. $customer_country=0;
  84. // 检查客户国家和产品销售限制
  85. $customer_query = "SELECT cs_country FROM customer WHERE id = $customer_id LIMIT 1";
  86. $customer_result = mysqli_query($conn, $customer_query);
  87. if ($customer_result && mysqli_num_rows($customer_result) > 0) {
  88. $customer_data = mysqli_fetch_assoc($customer_result);
  89. $customer_country = $customer_data['cs_country'];
  90. if (!empty($customer_country)) {
  91. $restricted_products = [];
  92. foreach ($items as $item) {
  93. if (empty($item['product_id'])) continue;
  94. $product_id = (int)$item['product_id'];
  95. if($product_id <= 0) continue; // 跳过无效的产品ID
  96. $product_query = "SELECT ProductName, nosale FROM products WHERE id = $product_id LIMIT 1";
  97. $product_result = mysqli_query($conn, $product_query);
  98. if ($product_result && mysqli_num_rows($product_result) > 0) {
  99. $product_data = mysqli_fetch_assoc($product_result);
  100. $nosale_countries = $product_data['nosale'];
  101. // 检查客户所在国家是否在销售限制列表中
  102. if (!empty($nosale_countries)) {
  103. $restricted_countries = explode(',', $nosale_countries);
  104. if (in_array($customer_country, $restricted_countries)) {
  105. $restricted_products[] = $product_data['ProductName'];
  106. }
  107. }
  108. }
  109. }
  110. // 如果有限制销售的产品,显示错误并返回
  111. if (!empty($restricted_products)) {
  112. $restricted_product_names = implode('、', $restricted_products);
  113. echo "<script>alert('以下产品不能销售给所选客户所在的国家/地区: {$restricted_product_names}');history.back();</script>";
  114. exit;
  115. }
  116. }
  117. }
  118. // 处理保存
  119. if ($isedit) {
  120. // 更新订单基本信息
  121. $sql = "UPDATE orders SET
  122. order_code = '$order_code',
  123. order_type = $order_type,
  124. customer_id = $customer_id,
  125. contact_id = $contact_id,
  126. employee_id = $employee_id,
  127. order_date = '$order_date',
  128. shipping_date = '$shipping_date',
  129. delivery_date = $delivery_date,
  130. actual_delivery_date = $actual_delivery_date,
  131. order_status = $order_status,
  132. payment_status = $payment_status,
  133. currency = '$currency',
  134. subtotal = $subtotal,
  135. discount_amount = $discount_amount,
  136. total_amount = $total_amount,
  137. notes = '$notes',
  138. internal_notes = '$internal_notes',
  139. no_cashback = $no_cashback,
  140. updated_at = NOW()
  141. WHERE id = $id";
  142. mysqli_query($conn, $sql);
  143. // 编辑保存时不需要保存旧的订单项,删除旧的订单项
  144. $sql = "DELETE FROM order_items WHERE order_id = $id";
  145. mysqli_query($conn, $sql);
  146. // 添加新的订单项
  147. foreach ($items as $item) {
  148. if (empty($item['product_id'])) continue; // 跳过没有选择产品的行
  149. $product_id = (int)$item['product_id'];
  150. if($product_id <= 0) continue; // 跳过无效的产品ID
  151. $quantity = (int)$item['quantity'];
  152. $unit = mysqli_real_escape_string($conn, htmlspecialchars($item['unit'], ENT_QUOTES, 'UTF-8'));
  153. $total_price = (float)$item['total_price'];
  154. // 如果数量大于0,计算单价,否则单价为0
  155. $unit_price = ($quantity > 0) ? ($total_price / $quantity) : 0;
  156. $item_notes = mysqli_real_escape_string($conn, htmlspecialchars($item['notes'] ?? '', ENT_QUOTES, 'UTF-8'));
  157. $sql = "INSERT INTO order_items (
  158. order_id, product_id, specification_id, quantity, unit, unit_price,
  159. total_price, notes, is_deleted,
  160. created_at, updated_at
  161. ) VALUES (
  162. $id, $product_id, 0, $quantity, '$unit', $unit_price,
  163. $total_price, '$item_notes', 0,
  164. NOW(), NOW()
  165. )";
  166. mysqli_query($conn, $sql);
  167. }
  168. $message = "订单更新成功!";
  169. } else {
  170. // 创建新订单
  171. $sql = "INSERT INTO orders (
  172. order_code, order_type, customer_id, contact_id, employee_id,
  173. order_date,shipping_date, delivery_date, actual_delivery_date,
  174. order_status, payment_status, currency,
  175. subtotal, discount_amount, total_amount,
  176. notes, internal_notes, no_cashback, created_at, updated_at
  177. ) VALUES (
  178. '$order_code', $order_type, $customer_id, $contact_id, $employee_id,
  179. '$order_date','$shipping_date', $delivery_date, $actual_delivery_date,
  180. $order_status, $payment_status, '$currency',
  181. $subtotal, $discount_amount, $total_amount,
  182. '$notes', '$internal_notes', $no_cashback, NOW(), NOW()
  183. )";
  184. mysqli_query($conn, $sql);
  185. $order_id = mysqli_insert_id($conn);
  186. // 添加订单项
  187. foreach ($items as $item) {
  188. if (empty($item['product_id'])) continue; // 跳过没有选择产品的行
  189. $product_id = (int)$item['product_id'];
  190. if($product_id <= 0) continue; // 跳过无效的产品ID
  191. $quantity = (int)$item['quantity'];
  192. $unit = mysqli_real_escape_string($conn, htmlspecialchars($item['unit'], ENT_QUOTES, 'UTF-8'));
  193. $total_price = (float)$item['total_price'];
  194. // 如果数量大于0,计算单价,否则单价为0
  195. $unit_price = ($quantity > 0) ? ($total_price / $quantity) : 0;
  196. $item_notes = mysqli_real_escape_string($conn, htmlspecialchars($item['notes'] ?? '', ENT_QUOTES, 'UTF-8'));
  197. $sql = "INSERT INTO order_items (
  198. order_id, product_id, specification_id, quantity, unit, unit_price,
  199. total_price, notes, is_deleted,
  200. created_at, updated_at
  201. ) VALUES (
  202. $order_id, $product_id, 0, $quantity, '$unit', $unit_price,
  203. $total_price, '$item_notes', 0,
  204. NOW(), NOW()
  205. )";
  206. mysqli_query($conn, $sql);
  207. }
  208. $message = "订单创建成功!";
  209. }
  210. // 重定向回订单列表页面
  211. $page = $_GET['Page'] ?? '';
  212. $keys = urlencode($_GET['Keys'] ?? '');
  213. echo "<script>alert('$message');location.href='order.php?keys=$keys&Page=$page';</script>";
  214. exit;
  215. ?>