index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <template>
  2. <div class="p-3">
  3. <div class="bg-fff flex1 ov-hd d-flex flex-cln">
  4. <div class="pd-16 border-bottom">
  5. <div class="f-s-20 c-333 f-w-7 mb-12">订单管理</div>
  6. <searchTabs v-model="queryParams.status" @change="handleQuery" :list="tabs"></searchTabs>
  7. </div>
  8. <div class="flex1 ov-hd pd-16 d-flex flex-cln">
  9. <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="auto">
  10. <el-form-item label="订单号:" prop="orderNo">
  11. <el-input v-model="queryParams.orderNo" placeholder="搜订单号" clearable style="width: 180px" @keyup.enter="handleQuery" />
  12. </el-form-item>
  13. <el-form-item label="下单时间段" prop="dateRange">
  14. <div class="d-flex" style="width: 180px">
  15. <DateRange v-model="queryParams.dateRange" v-model:start-date="queryParams.startDate" v-model:end-date="queryParams.endDate" @change="handleQuery"></DateRange>
  16. </div>
  17. </el-form-item>
  18. <el-form-item label="套餐名称:" prop="packageName">
  19. <el-input v-model="queryParams.packageName" placeholder="请输入套餐名称关键字" clearable style="width: 160px" @keyup.enter="handleQuery" />
  20. </el-form-item>
  21. <el-form-item label="会员等级" prop="vipLevel">
  22. <el-select style="width: 160px" v-model="queryParams.vipLevel" clearable placeholder="请选择会员等级" @change="handleQuery">
  23. <el-option v-for="item in vip_level" :key="item.value" :label="item.label" :value="item.value"></el-option>
  24. </el-select>
  25. </el-form-item>
  26. <el-form-item label="买家名称:" prop="cpyName">
  27. <el-input v-model="queryParams.cpyName" placeholder="搜买家名称及关键字" clearable style="width: 160px" @keyup.enter="handleQuery" />
  28. </el-form-item>
  29. <el-form-item>
  30. <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
  31. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  32. </el-form-item>
  33. </el-form>
  34. <div class="flex1 ov-hd">
  35. <vxe-table :loading="loading" border :data="list" min-height="0" max-height="100%">
  36. <!-- 序号 -->
  37. <vxe-column type="seq" width="60" title="序号" fixed="left" align="center" />
  38. <vxe-column title="订单号" field="orderNo" fixed="left" min-width="100" :formatter="colNoData" />
  39. <vxe-column title="套餐名称" min-width="100">
  40. <template #default="{ row }">{{ row?.testOrderDetailList[0]?.packageName }}</template>
  41. </vxe-column>
  42. <vxe-column title="买家" field="cpyName" min-width="100" :formatter="colNoData" />
  43. <vxe-column title="会员等级" field="vipLevelName" min-width="100" :formatter="colNoData" />
  44. <vxe-column title="检测项目" min-width="200">
  45. <template #default="{ row }">
  46. <div>
  47. {{ row?.testOrderDetailList[0]?.itemNames }}等{{ row?.testOrderDetailList[0]?.itemCount }}项
  48. <el-button @click="queryRowItems(row?.testOrderDetailList[0])" type="primary" text>点击查看详情{{ '>' }}</el-button>
  49. </div>
  50. </template>
  51. </vxe-column>
  52. <vxe-column title="检测周期" width="90">
  53. <template #default="{ row }">{{ row?.testOrderDetailList[0]?.period }}个工作日</template>
  54. </vxe-column>
  55. <vxe-column title="实付款" width="90">
  56. <template #default="{ row }">{{ row?.totalAmount }}元</template>
  57. </vxe-column>
  58. <vxe-column title="下单人" field="createName" width="90" :formatter="colNoData" />
  59. <vxe-column title="下单时间" field="createTime" width="130" :formatter="colNoData" />
  60. <vxe-column title="订单状态" width="100" fixed="right">
  61. <template #default="{ row }">
  62. <div class="c-primary">{{ selectDictLabel(test_order_status_bg, row?.status) }}</div>
  63. </template>
  64. </vxe-column>
  65. <vxe-column title="订单备注" field="remark" min-width="100" fixed="right" :formatter="colNoData" />
  66. <vxe-column title="操作" width="260" fixed="right">
  67. <template #default="{ row }">
  68. <el-button @click="EidtRemark(row)" text class="small-btn-font" type="primary" size="small">添加备注</el-button>
  69. <template v-if="row?.status === '0' && row?.payType === '2'">
  70. <span></span>
  71. <el-button @click="confirmPay(row)" text class="small-btn-font" type="primary" size="small">确认付款</el-button>
  72. </template>
  73. <template v-if="row?.status === '4'">
  74. <span></span>
  75. <el-button @click="clickRowReport(row)" text class="small-btn-font" type="primary" size="small">上传报告</el-button>
  76. </template>
  77. <template v-if="row?.status === '5'">
  78. <span></span>
  79. <el-button @click="clickRownvoice(row)" text class="small-btn-font" type="primary" size="small">上传发票</el-button>
  80. </template>
  81. <span></span>
  82. <el-button @click="router.push({ path: 'orders-detail', query: { orderId: row?.id} })" style="color: #0079fe;" text class="small-btn-font" type="primary" size="small">查看详情</el-button>
  83. </template>
  84. </vxe-column>
  85. </vxe-table>
  86. </div>
  87. </div>
  88. <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
  89. <div class="pd-5"></div>
  90. </div>
  91. </div>
  92. <rowItems v-if="showRowItems" v-model:show="showRowItems" :packageId="rowId"></rowItems>
  93. <EditOrderRemark v-if="showRemark" v-model:show="showRemark" :info="rowInfo" @success="getList();getTabsCount()"></EditOrderRemark>
  94. <uploadReportForm v-if="showReport" v-model:show="showReport" :info="rowInfo" @success="getList();getTabsCount()"></uploadReportForm>
  95. <uploadInvoiceForm v-if="showInvoice" v-model:show="showInvoice" :info="rowInfo" @success="getList();getTabsCount()"></uploadInvoiceForm>
  96. </template>
  97. <script setup name="orders" lang="ts">
  98. import { testOrderConfirmPay, testOrderList, testOrderListCount } from '@/api/cdt/orders';
  99. import { colNoData } from '@/utils/noData';
  100. import { DateRange, searchTabs } from '@/views/models';
  101. import NP from 'number-precision';
  102. import { EditOrderRemark, rowItems, uploadReportForm, uploadInvoiceForm } from '../models';
  103. import { debounce } from 'lodash';
  104. import { selectDictLabel } from '@/utils/ruoyi';
  105. const router = useRouter();
  106. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  107. const { dm_package_type, dm_permit_type, vip_level, test_order_status_bg } = toRefs<any>(proxy?.useDict('dm_package_type', 'dm_permit_type', 'vip_level', 'test_order_status_bg'));
  108. const queryParams = ref<any>({
  109. pageNum: 1,
  110. pageSize: 10,
  111. status: '2',
  112. dateRange: []
  113. });
  114. const queryFormRef = ref<any>();
  115. const showRowItems = ref(false);
  116. const showReport = ref(false);
  117. const showInvoice = ref(false);
  118. const loading = ref(false);
  119. const total = ref(0);
  120. const list = ref<any>([]);
  121. const getList = debounce(async () => {
  122. loading.value = true;
  123. const res = await testOrderList(queryParams.value);
  124. if (!res || res.code !== 200) return;
  125. list.value = res.rows;
  126. total.value = res.total;
  127. loading.value = false;
  128. }, 500);
  129. const handleQuery = () => {
  130. queryParams.value.pageNum = 1;
  131. getList();
  132. };
  133. const resetQuery = () => {
  134. queryFormRef.value?.resetFields();
  135. handleQuery();
  136. };
  137. const rowId = ref('');
  138. const queryRowItems = (row: any) => {
  139. rowId.value = row?.packageId;
  140. showRowItems.value = true;
  141. };
  142. // 获取tabs统计数据
  143. const tabs = ref<any[]>([]);
  144. const getTabsCount = debounce(async () => {
  145. const res = await testOrderListCount();
  146. if (!res || res.code !== 200) return;
  147. // this.tabsList = res.rows;
  148. tabs.value = res.data.map(({ status, statusCount }: any) => ({ label: selectDictLabel(test_order_status_bg.value, status), value: status, count: statusCount }));
  149. }, 500);
  150. // 添加备注
  151. const rowInfo = ref<any>({});
  152. const showRemark = ref(false);
  153. const EidtRemark = (row: any) => {
  154. rowInfo.value = row;
  155. showRemark.value = true;
  156. };
  157. // 上传报告
  158. const clickRowReport = (row: any) => {
  159. rowInfo.value = row;
  160. showReport.value = true;
  161. };
  162. // 上传发票
  163. const clickRownvoice = (row: any) => {
  164. rowInfo.value = row;
  165. showInvoice.value = true;
  166. };
  167. // 确认付款方法
  168. const confirmPay = async (row: any) => {
  169. // 确认付款弹框
  170. ElMessageBox({
  171. title: '支付提示',
  172. cancelButtonText: '取消',
  173. confirmButtonText: '确认付款',
  174. showCancelButton: true,
  175. confirmButtonClass: 'el-button--danger',
  176. message: h('p', null, [h('div', null, `是否确认付款订单号:${row.orderNo}设置为已支付状态吗?`), h('div', null, [h('span', null, '注意:'), h('span', { style: 'color: #F56C6C' }, '确认付款后,代表该订单对公转账为已支付,请仔细核对!')])]),
  177. callback: async (action: string) => {
  178. if (action === 'confirm') {
  179. const res = await testOrderConfirmPay(row.id);
  180. if (res) {
  181. ElMessage.success('操作成功');
  182. getList();
  183. getTabsCount();
  184. }
  185. }
  186. }
  187. });
  188. };
  189. onMounted(() => {
  190. getList();
  191. getTabsCount()
  192. });
  193. </script>