index.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <template>
  2. <div class="p-2">
  3. <el-card shadow="never" class="order-set-card">
  4. <template #header>
  5. <div class="card-header">
  6. <span class="title">订单设置</span>
  7. </div>
  8. </template>
  9. <div class="order-set-container">
  10. <!-- 表单 -->
  11. <el-form ref="orderSetFormRef" :model="form" :rules="rules" label-width="140px" class="order-form">
  12. <div class="form-item-row">
  13. <el-form-item label="秒杀订单超过:" prop="seckillTimeout" class="form-item-input">
  14. <el-input v-model="form.seckillTimeout" placeholder="请输入" />
  15. </el-form-item>
  16. <div class="form-item-desc">未付款,订单自动关闭</div>
  17. </div>
  18. <div class="form-item-row">
  19. <el-form-item label="普通订单超过:" prop="normalTimeout" class="form-item-input">
  20. <el-input v-model="form.normalTimeout" placeholder="请输入" />
  21. </el-form-item>
  22. <div class="form-item-desc">未付款,订单自动关闭</div>
  23. </div>
  24. <div class="form-item-row">
  25. <el-form-item label="发货超过:" prop="shippingTimeout" class="form-item-input">
  26. <el-input v-model="form.shippingTimeout" placeholder="请输入" />
  27. </el-form-item>
  28. <div class="form-item-desc">未收货,订单自动完成</div>
  29. </div>
  30. <div class="form-item-row">
  31. <el-form-item label="订单完成超过:" prop="completeTimeout" class="form-item-input">
  32. <el-input v-model="form.completeTimeout" placeholder="请输入" />
  33. </el-form-item>
  34. <div class="form-item-desc">自动结束交易,不能申请售后</div>
  35. </div>
  36. <div class="form-item-row">
  37. <el-form-item label="订单评价超时:" prop="evaluationTimeout" class="form-item-input">
  38. <el-input v-model="form.evaluationTimeout" placeholder="请输入" />
  39. </el-form-item>
  40. <div class="form-item-desc">自动五星好评</div>
  41. </div>
  42. </el-form>
  43. <el-button type="primary" @click="submitForm" class="submit-btn">保存</el-button>
  44. </div>
  45. </el-card>
  46. </div>
  47. </template>
  48. <script setup name="OrderSet" lang="ts">
  49. import { listOrderSet, getOrderSet, delOrderSet, addOrderSet, updateOrderSet, getOrderSetData } from '@/api/order/orderSet';
  50. import { OrderSetVO, OrderSetQuery, OrderSetForm } from '@/api/order/orderSet/types';
  51. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  52. const orderSetList = ref<OrderSetVO[]>([]);
  53. const buttonLoading = ref(false);
  54. const loading = ref(true);
  55. const showSearch = ref(true);
  56. const ids = ref<Array<string | number>>([]);
  57. const single = ref(true);
  58. const multiple = ref(true);
  59. const total = ref(0);
  60. const queryFormRef = ref<ElFormInstance>();
  61. const orderSetFormRef = ref<ElFormInstance>();
  62. const dialog = reactive<DialogOption>({
  63. visible: false,
  64. title: ''
  65. });
  66. const initFormData: OrderSetForm = {
  67. id: undefined,
  68. seckillTimeout: undefined,
  69. normalTimeout: undefined,
  70. shippingTimeout: undefined,
  71. completeTimeout: undefined,
  72. evaluationTimeout: undefined,
  73. status: undefined,
  74. remark: undefined
  75. };
  76. const data = reactive<PageData<OrderSetForm, OrderSetQuery>>({
  77. form: { ...initFormData },
  78. queryParams: {
  79. pageNum: 1,
  80. pageSize: 10,
  81. seckillTimeout: undefined,
  82. normalTimeout: undefined,
  83. shippingTimeout: undefined,
  84. completeTimeout: undefined,
  85. evaluationTimeout: undefined,
  86. status: undefined,
  87. platformCode: undefined,
  88. params: {}
  89. },
  90. rules: {}
  91. });
  92. const { queryParams, form, rules } = toRefs(data);
  93. /** 查询订单超时设置列表 */
  94. const getList = async () => {
  95. loading.value = true;
  96. const res = await listOrderSet(queryParams.value);
  97. orderSetList.value = res.rows;
  98. total.value = res.total;
  99. loading.value = false;
  100. };
  101. /** 取消按钮 */
  102. const cancel = () => {
  103. reset();
  104. dialog.visible = false;
  105. };
  106. /** 表单重置 */
  107. const reset = () => {
  108. form.value = { ...initFormData };
  109. orderSetFormRef.value?.resetFields();
  110. };
  111. /** 搜索按钮操作 */
  112. const handleQuery = () => {
  113. queryParams.value.pageNum = 1;
  114. getList();
  115. };
  116. /** 重置按钮操作 */
  117. const resetQuery = () => {
  118. queryFormRef.value?.resetFields();
  119. handleQuery();
  120. };
  121. /** 多选框选中数据 */
  122. const handleSelectionChange = (selection: OrderSetVO[]) => {
  123. ids.value = selection.map((item) => item.id);
  124. single.value = selection.length != 1;
  125. multiple.value = !selection.length;
  126. };
  127. /** 新增按钮操作 */
  128. const handleAdd = () => {
  129. reset();
  130. dialog.visible = true;
  131. dialog.title = '添加订单超时设置';
  132. };
  133. /** 修改按钮操作 */
  134. const handleUpdate = async (row?: OrderSetVO) => {
  135. reset();
  136. const _id = row?.id || ids.value[0];
  137. const res = await getOrderSet(_id);
  138. Object.assign(form.value, res.data);
  139. dialog.visible = true;
  140. dialog.title = '修改订单超时设置';
  141. };
  142. /** 提交按钮 */
  143. const submitForm = () => {
  144. orderSetFormRef.value?.validate(async (valid: boolean) => {
  145. if (valid) {
  146. buttonLoading.value = true;
  147. if (form.value.id) {
  148. await updateOrderSet(form.value).finally(() => (buttonLoading.value = false));
  149. } else {
  150. await addOrderSet(form.value).finally(() => (buttonLoading.value = false));
  151. }
  152. proxy?.$modal.msgSuccess('操作成功');
  153. dialog.visible = false;
  154. await getList();
  155. }
  156. });
  157. };
  158. /** 删除按钮操作 */
  159. const handleDelete = async (row?: OrderSetVO) => {
  160. const _ids = row?.id || ids.value;
  161. await proxy?.$modal.confirm('是否确认删除订单超时设置编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
  162. await delOrderSet(_ids);
  163. proxy?.$modal.msgSuccess('删除成功');
  164. await getList();
  165. };
  166. /** 导出按钮操作 */
  167. const handleExport = () => {
  168. proxy?.download(
  169. 'system/orderSet/export',
  170. {
  171. ...queryParams.value
  172. },
  173. `orderSet_${new Date().getTime()}.xlsx`
  174. );
  175. };
  176. onMounted(async () => {
  177. const res = await getOrderSetData();
  178. if (res && res.data) {
  179. Object.assign(form.value, res.data);
  180. }
  181. });
  182. </script>
  183. <style scoped lang="scss">
  184. .order-set-card {
  185. :deep(.el-card__header) {
  186. padding: 20px;
  187. border-bottom: 1px solid #ebeef5;
  188. }
  189. }
  190. .order-set-container {
  191. display: flex;
  192. flex-direction: column;
  193. gap: 0;
  194. padding: 10px 0;
  195. .order-form {
  196. :deep(.el-form-item) {
  197. margin-bottom: 0;
  198. }
  199. :deep(.el-form-item__label) {
  200. font-weight: 500;
  201. color: #333;
  202. }
  203. :deep(.el-input__wrapper) {
  204. background-color: #fafafa;
  205. border: 1px solid #dcdfe6;
  206. border-radius: 4px;
  207. &:hover {
  208. border-color: #b1b3b9;
  209. }
  210. }
  211. :deep(.el-input.is-focus .el-input__wrapper),
  212. :deep(.el-input__wrapper.is-focus) {
  213. border-color: #409eff;
  214. background-color: #fff;
  215. }
  216. }
  217. .form-item-row {
  218. display: flex;
  219. align-items: center;
  220. gap: 40px;
  221. margin-bottom: 20px;
  222. .form-item-input {
  223. flex: 0 0 auto;
  224. width: 400px;
  225. :deep(.el-form-item__content) {
  226. line-height: 32px;
  227. }
  228. }
  229. .form-item-desc {
  230. flex: 1;
  231. color: #666;
  232. font-size: 14px;
  233. line-height: 32px;
  234. }
  235. }
  236. .submit-btn {
  237. margin-top: 10px;
  238. padding: 8px 24px;
  239. font-size: 14px;
  240. width: fit-content;
  241. margin-left: 140px;
  242. }
  243. }
  244. .card-header {
  245. display: flex;
  246. justify-content: space-between;
  247. align-items: center;
  248. .title {
  249. font-size: 16px;
  250. font-weight: 600;
  251. color: #333;
  252. }
  253. }
  254. </style>