splitAssignDialog.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670
  1. <template>
  2. <!-- 订单分配详情抽屉 -->
  3. <el-drawer v-model="drawer.visible" size="65%" direction="rtl" :close-on-click-modal="true" :before-close="handleDrawerClose">
  4. <template #header>
  5. <div class="drawer-header">
  6. <!-- <el-icon color="#f56c6c" :size="24"><WarningFilled /></el-icon> -->
  7. <span class="order-title">订单分配 {{ orderInfo.orderNo }}</span>
  8. </div>
  9. </template>
  10. <div class="drawer-content">
  11. <div class="detail-header">
  12. <el-row :gutter="20">
  13. <el-col :span="6">
  14. <div class="info-item">
  15. <span class="label">客户</span>
  16. <span class="value">{{ orderInfo.customerName }}</span>
  17. </div>
  18. </el-col>
  19. <el-col :span="6">
  20. <div class="info-item">
  21. <span class="label">负责人</span>
  22. <span class="value">{{ orderInfo.businessStaff }}</span>
  23. </div>
  24. </el-col>
  25. <el-col :span="4">
  26. <div class="info-item">
  27. <span class="label">商品总数</span>
  28. <span class="value">{{ orderInfo.productTotal }}</span>
  29. </div>
  30. </el-col>
  31. <el-col :span="4">
  32. <div class="info-item">
  33. <span class="label">待分配</span>
  34. <span class="value">{{ orderInfo.unassigned }}</span>
  35. </div>
  36. </el-col>
  37. <el-col :span="4">
  38. <div class="info-item">
  39. <span class="label">已分配</span>
  40. <span class="value">{{ orderInfo.assigned }}</span>
  41. </div>
  42. </el-col>
  43. </el-row>
  44. </div>
  45. <el-tabs v-model="activeTab" class="detail-tabs">
  46. <el-tab-pane label="待分配" name="pending" v-if="assignmentStatus != '1'">
  47. <div class="tab-actions">
  48. <el-button type="primary" @click="handleBatchAssign">+ 批量分配</el-button>
  49. </div>
  50. <el-table
  51. ref="pendingTableRef"
  52. :data="pendingProducts"
  53. border
  54. style="width: 100%"
  55. max-height="800"
  56. @selection-change="handlePendingSelectionChange"
  57. >
  58. <el-table-column type="selection" width="55" align="center" />
  59. <el-table-column label="序号" width="80" align="center">
  60. <template #default="scope">{{ scope.$index + 1 }}</template>
  61. </el-table-column>
  62. <el-table-column label="商品图片" width="100" align="center">
  63. <template #default="scope">
  64. <el-image
  65. v-if="scope.row.productImage"
  66. :src="scope.row.productImage"
  67. style="width: 60px; height: 60px"
  68. fit="cover"
  69. :preview-src-list="[scope.row.productImage]"
  70. />
  71. </template>
  72. </el-table-column>
  73. <el-table-column label="商品编号" prop="productNo" align="center" />
  74. <el-table-column label="商品名称" prop="productName" min-width="200" show-overflow-tooltip align="left" />
  75. <el-table-column label="数量" prop="orderQuantity" align="center" />
  76. <el-table-column label="单价" prop="orderPrice" align="center" />
  77. <el-table-column label="小计" align="center">
  78. <template #default="scope">{{ (scope.row.orderPrice * scope.row.orderQuantity).toFixed(2) }}</template>
  79. </el-table-column>
  80. <el-table-column label="状态" width="100" align="center">
  81. <template #default="scope">
  82. <dict-tag :options="order_assignment_status" :value="scope.row.assignmentStatus" />
  83. </template>
  84. </el-table-column>
  85. <el-table-column label="操作" width="120" align="center" fixed="right">
  86. <template #default="scope">
  87. <el-button link type="primary" size="small" @click="handleAssignProduct(scope.row)">分配</el-button>
  88. </template>
  89. </el-table-column>
  90. </el-table>
  91. </el-tab-pane>
  92. <el-tab-pane label="已分配" name="assigned">
  93. <el-table :data="assignedProducts" border style="width: 100%" max-height="800">
  94. <el-table-column label="序号" width="80" align="center">
  95. <template #default="scope">{{ scope.$index + 1 }}</template>
  96. </el-table-column>
  97. <el-table-column label="商品图片" width="100" align="center">
  98. <template #default="scope">
  99. <el-image
  100. v-if="scope.row.productImage"
  101. :src="scope.row.productImage"
  102. style="width: 60px; height: 60px"
  103. fit="cover"
  104. :preview-src-list="[scope.row.productImage]"
  105. />
  106. </template>
  107. </el-table-column>
  108. <el-table-column label="商品编号" prop="productNo" align="center" />
  109. <el-table-column label="商品名称" prop="productName" min-width="200" show-overflow-tooltip align="left" />
  110. <el-table-column label="数量" prop="orderQuantity" align="center" />
  111. <el-table-column label="单价" prop="orderPrice" align="center" />
  112. <el-table-column label="小计" align="center">
  113. <template #default="scope">{{ (scope.row.orderPrice * scope.row.orderQuantity).toFixed(2) }}</template>
  114. </el-table-column>
  115. <el-table-column label="状态" width="100" align="center">
  116. <template #default="scope">
  117. <dict-tag :options="order_assignment_status" :value="scope.row.assignmentStatus" />
  118. </template>
  119. </el-table-column>
  120. <el-table-column label="分配人" prop="assigneeName" min-width="200" align="left" />
  121. </el-table>
  122. </el-tab-pane>
  123. <el-tab-pane label="记录" name="record">
  124. <el-table :data="assignRecords" border style="width: 100%" max-height="400">
  125. <el-table-column label="序号" type="index" width="80" align="center" />
  126. <el-table-column label="分配时间" prop="createTime" align="center" />
  127. <el-table-column label="分配人" prop="createName" align="center" />
  128. <el-table-column label="分配目标" prop="assigneeName" align="center" />
  129. </el-table>
  130. </el-tab-pane>
  131. </el-tabs>
  132. </div>
  133. </el-drawer>
  134. <!-- 分配抽屉 -->
  135. <el-drawer v-model="assignDialog.visible" title="分配" size="50%" direction="rtl" :close-on-click-modal="true">
  136. <div class="assign-drawer-content">
  137. <!-- 分配目标选择 -->
  138. <div class="assign-target-section">
  139. <el-row :gutter="20">
  140. <el-col :span="12">
  141. <div class="target-input-wrapper">
  142. <span class="required-mark">*</span>
  143. <span class="label">分配对象类型:</span>
  144. <el-select v-model="assignForm.targetType" placeholder="请选择分配对象类型" clearable style="flex: 1" @change="handleTargetTypeChange">
  145. <el-option label="自营客户" value="zy" />
  146. <el-option label="供应商" value="srm" />
  147. </el-select>
  148. </div>
  149. </el-col>
  150. <el-col :span="12" v-show="assignForm.targetType === 'zy'">
  151. <div class="target-input-wrapper">
  152. <span class="required-mark">*</span>
  153. <span class="label">自营客户: </span>
  154. <el-select v-model="assignForm.targetId" :placeholder="'请选择自营客户'" clearable filterable style="flex: 1">
  155. <el-option v-for="item in customerList" :key="item.id" :label="item.name" :value="item.id" />
  156. </el-select>
  157. </div>
  158. </el-col>
  159. <el-col :span="12" v-show="assignForm.targetType === 'srm'">
  160. <div class="target-input-wrapper">
  161. <span class="required-mark">*</span>
  162. <span class="label">供应商: </span>
  163. <el-select v-model="assignForm.targetId" :placeholder="'请选择供应商'" clearable filterable style="flex: 1">
  164. <el-option v-for="item in supplierList" :key="item.id" :label="item.name" :value="item.id" />
  165. </el-select>
  166. </div>
  167. </el-col>
  168. </el-row>
  169. </div>
  170. <!-- 商品列表 -->
  171. <div class="product-list-section">
  172. <el-table
  173. ref="assignProductTableRef"
  174. :data="assignForm.productList"
  175. border
  176. style="width: 100%"
  177. max-height="800"
  178. @selection-change="handleAssignProductSelectionChange"
  179. >
  180. <el-table-column type="selection" width="55" align="center" />
  181. <el-table-column label="序号" width="80" align="center">
  182. <template #default="scope">{{ scope.$index + 1 }}</template>
  183. </el-table-column>
  184. <el-table-column label="商品图片" width="100" align="center">
  185. <template #default="scope">
  186. <el-image
  187. v-if="scope.row.productImage"
  188. :src="scope.row.productImage"
  189. style="width: 60px; height: 60px"
  190. fit="cover"
  191. :preview-src-list="[scope.row.productImage]"
  192. />
  193. <span v-else style="color: #999">暂无图片</span>
  194. </template>
  195. </el-table-column>
  196. <el-table-column label="商品编号" prop="productNo" width="140" align="center" />
  197. <el-table-column label="商品名称" prop="productName" min-width="200" show-overflow-tooltip />
  198. <el-table-column label="分配数量" width="150" align="center" prop="orderQuantity">
  199. <!-- <template #default="scope">
  200. <el-input-number v-model="scope.row.assignQuantity" :min="1" :max="scope.row.orderQuantity" :controls="false" style="width: 100%" />
  201. </template> -->
  202. </el-table-column>
  203. <el-table-column label="单价" prop="orderPrice" width="120" align="center" />
  204. <el-table-column label="小计" width="120" align="center">
  205. <template #default="scope">{{ (scope.row.orderPrice * scope.row.orderQuantity).toFixed(2) }}</template>
  206. </el-table-column>
  207. </el-table>
  208. </div>
  209. </div>
  210. <template #footer>
  211. <div class="drawer-footer">
  212. <el-button @click="assignDialog.visible = false">取 消</el-button>
  213. <el-button :loading="buttonLoading" type="primary" @click="submitAssign">确定分配</el-button>
  214. </div>
  215. </template>
  216. </el-drawer>
  217. </template>
  218. <script setup name="SplitAssignDialog" lang="ts">
  219. import { getOrderMain } from '@/api/order/orderMain';
  220. import { listOrderAssignment } from '@/api/order/orderAssignmentLog';
  221. import { listInfo } from '@/api/supplier/info';
  222. import { addOrderSplitAssign, addOrderAssignment } from '@/api/order/orderAssignmentLog';
  223. import { OrderSplitAssignForm, OrderProductAssignRule, OrderAssignmentForm } from '@/api/order/orderAssignmentLog/types';
  224. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  225. const { sys_platform_code, order_assignment_status } = toRefs<any>(proxy?.useDict('sys_platform_code', 'order_assignment_status'));
  226. import { listCustomerInfo } from '@/api/customer/customerFile/customerInfo';
  227. const emit = defineEmits(['success']);
  228. const buttonLoading = ref(false);
  229. const pendingTableRef = ref();
  230. const assignProductTableRef = ref();
  231. const selectedPendingProducts = ref<any[]>([]);
  232. const selectedAssignProducts = ref<any[]>([]); // 分配对话框中选中的商品
  233. // 订单分配详情抽屉
  234. const drawer = reactive<DialogOption>({
  235. visible: false,
  236. title: '订单分配'
  237. });
  238. // 分配对话框
  239. const assignDialog = reactive({
  240. visible: false
  241. });
  242. const orderInfo = ref<any>({
  243. orderNo: '',
  244. id: undefined,
  245. platformCode: '',
  246. customerName: '',
  247. businessStaff: '',
  248. productQuantity: 0,
  249. pendingCount: 0,
  250. assignedCount: 0,
  251. productTotal: 0,
  252. assigned: 0,
  253. unassigned: 0
  254. });
  255. // 分配表单
  256. const assignForm = reactive({
  257. targetType: 'srm', // 分配对象类型:srm-供应商
  258. targetId: '', // 分配目标ID
  259. productList: [] as any[]
  260. });
  261. // 供应商列表
  262. const supplierList = ref<any[]>([]);
  263. // 缓存的供应商列表(打开抽屉时预先加载)
  264. const cachedSupplierList = ref<any[]>([]);
  265. // 自营客户列表
  266. const customerList = ref<any[]>([]);
  267. const cachedCustomerList = ref<any[]>([]);
  268. // 标签页
  269. const activeTab = ref('pending');
  270. // 待分配商品列表
  271. const pendingProducts = ref<any[]>([]);
  272. // 已分配商品列表
  273. const assignedProducts = ref<any[]>([]);
  274. // 分配记录
  275. const assignRecords = ref<any[]>([]);
  276. const assignmentStatus = ref('0');
  277. /** 打开订单分配详情抽屉 */
  278. const open = async (orderId: string | number, status: string) => {
  279. reset();
  280. drawer.visible = true;
  281. assignmentStatus.value = status;
  282. if (status == '1') {
  283. activeTab.value = 'assigned';
  284. }
  285. try {
  286. // 获取订单详情
  287. const res = await getOrderMain(orderId);
  288. orderInfo.value = {
  289. orderNo: res.data.orderNo,
  290. id: res.data.id,
  291. platformCode: res.data.platformCode,
  292. customerName: res.data.customerName || '--',
  293. businessStaff: res.data.businessStaff || '--',
  294. productQuantity: res.data.productQuantity || 0,
  295. productTotal: res.data.productTotal || 0,
  296. assigned: res.data.assigned || 0,
  297. unassigned: res.data.unassigned || 0
  298. };
  299. // 加载订单商品列表
  300. if (res.data.orderProductList && res.data.orderProductList.length > 0) {
  301. const productList = res.data.orderProductList.map((item: any) => ({
  302. ...item,
  303. itemId: item.id,
  304. assignQuantity: item.orderQuantity
  305. }));
  306. // 待分配/已分配商品(按 assignmentStatus 过滤:0-待分配,1-已分配)
  307. pendingProducts.value = productList.filter((item: any) => item.assignmentStatus === '0');
  308. assignedProducts.value = productList.filter((item: any) => item.assignmentStatus === '1');
  309. }
  310. // 加载分配记录
  311. await loadAssignRecords(orderId);
  312. // 预加载供应商数据以加快后续操作响应
  313. loadSupplierData();
  314. } catch (error) {
  315. proxy?.$modal.msgError('获取订单信息失败');
  316. drawer.visible = false;
  317. }
  318. };
  319. /** 分配对象类型变化 */
  320. const handleTargetTypeChange = () => {
  321. // 切换类型时清空已选择的目标
  322. assignForm.targetId = '';
  323. if (assignForm.targetType === 'zy') {
  324. loadCustomerData();
  325. } else if (assignForm.targetType === 'srm') {
  326. supplierList.value = cachedSupplierList.value;
  327. }
  328. };
  329. /** 加载自营客户数据 */
  330. const loadCustomerData = async () => {
  331. if (cachedCustomerList.value.length > 0) {
  332. customerList.value = cachedCustomerList.value;
  333. return;
  334. }
  335. try {
  336. const res: any = await listCustomerInfo({ status: '0', pageNum: 1, pageSize: 1000 });
  337. const list = res.rows || res.data || [];
  338. cachedCustomerList.value = list.map((item: any) => ({
  339. ...item,
  340. id: item.id,
  341. name: item.customerName
  342. }));
  343. customerList.value = cachedCustomerList.value;
  344. } catch (error) {
  345. console.error('获取自营客户列表失败', error);
  346. }
  347. };
  348. /** 预加载供应商数据 */
  349. const loadSupplierData = async () => {
  350. if (cachedSupplierList.value.length > 0) return;
  351. try {
  352. const res: any = await listInfo({ supplyStatus: 1, pageNum: 1, pageSize: 9999 });
  353. const list = res.rows || res.data || [];
  354. cachedSupplierList.value = list.map((item: any) => ({
  355. ...item,
  356. id: item.id,
  357. name: item.enterpriseName || item.supplierName
  358. }));
  359. supplierList.value = cachedSupplierList.value;
  360. } catch (error) {
  361. console.error('获取供应商列表失败', error);
  362. }
  363. };
  364. /** 加载分配记录 */
  365. const loadAssignRecords = async (orderId: string | number) => {
  366. try {
  367. const res = await listOrderAssignment({
  368. orderId: orderId,
  369. pageNum: 1,
  370. pageSize: 100
  371. });
  372. assignRecords.value = res.rows || [];
  373. } catch (error) {
  374. console.error('获取分配记录失败:', error);
  375. assignRecords.value = [];
  376. }
  377. };
  378. /** 表单重置 */
  379. const reset = () => {
  380. assignForm.targetType = 'srm';
  381. assignForm.targetId = '';
  382. assignForm.productList = [];
  383. selectedPendingProducts.value = [];
  384. selectedAssignProducts.value = [];
  385. pendingProducts.value = [];
  386. assignedProducts.value = [];
  387. assignRecords.value = [];
  388. activeTab.value = 'pending';
  389. orderInfo.value = {
  390. orderNo: '',
  391. id: undefined,
  392. platformCode: '',
  393. customerName: '',
  394. businessStaff: '',
  395. productQuantity: 0,
  396. pendingCount: 0,
  397. assignedCount: 0,
  398. productTotal: 0,
  399. assigned: 0,
  400. unassigned: 0
  401. };
  402. };
  403. /** 关闭抽屉前的回调 */
  404. const handleDrawerClose = (done: () => void) => {
  405. if (buttonLoading.value) {
  406. return;
  407. }
  408. done();
  409. reset();
  410. };
  411. /** 待分配商品选择变化 */
  412. const handlePendingSelectionChange = (selection: any[]) => {
  413. selectedPendingProducts.value = selection;
  414. };
  415. /** 分配对话框中商品选择变化 */
  416. const handleAssignProductSelectionChange = (selection: any[]) => {
  417. selectedAssignProducts.value = selection;
  418. };
  419. /** 批量分配 */
  420. const handleBatchAssign = () => {
  421. // 验证是否选择了商品
  422. if (selectedPendingProducts.value.length === 0) {
  423. proxy?.$modal.msgWarning('请至少选择一个商品进行分配');
  424. return;
  425. }
  426. // 打开分配对话框
  427. assignForm.productList = [...selectedPendingProducts.value];
  428. assignDialog.visible = true;
  429. // 等待对话框渲染后,默认全选所有商品
  430. nextTick(() => {
  431. assignForm.productList.forEach((row) => {
  432. assignProductTableRef.value?.toggleRowSelection(row, true);
  433. });
  434. });
  435. };
  436. /** 分配单个商品 */
  437. const handleAssignProduct = (row: any) => {
  438. // 打开分配对话框,只包含当前商品
  439. assignForm.productList = [row];
  440. assignDialog.visible = true;
  441. // 等待对话框渲染后,默认选中该商品
  442. nextTick(() => {
  443. assignProductTableRef.value?.toggleRowSelection(row, true);
  444. });
  445. };
  446. /** 转分配 */
  447. const handleReassign = (row: any) => {
  448. proxy?.$modal.confirm('确认要转分配该商品吗?').then(() => {
  449. // 打开分配对话框
  450. assignForm.productList = [row];
  451. assignDialog.visible = true;
  452. // 等待对话框渲染后,默认选中该商品
  453. nextTick(() => {
  454. assignProductTableRef.value?.toggleRowSelection(row, true);
  455. });
  456. });
  457. };
  458. /** 提交分配 */
  459. const submitAssign = async () => {
  460. // 验证是否选择了商品
  461. if (selectedAssignProducts.value.length === 0) {
  462. proxy?.$modal.msgWarning('请至少勾选一个商品进行分配');
  463. return;
  464. }
  465. // 验证分配对象类型
  466. if (!assignForm.targetType) {
  467. proxy?.$modal.msgWarning('请选择分配对象类型');
  468. return;
  469. }
  470. // 验证分配目标
  471. if (!assignForm.targetId) {
  472. proxy?.$modal.msgWarning(`请选择${assignForm.targetType === 'srm' ? '供应商' : '伙伴商'}`);
  473. return;
  474. }
  475. buttonLoading.value = true;
  476. try {
  477. // 组装提交数据,只提交勾选的商品
  478. const submitData: OrderSplitAssignForm = {
  479. orderId: orderInfo.value.id, // 父订单ID
  480. itemRules: selectedAssignProducts.value.map(
  481. (product): OrderProductAssignRule => ({
  482. itemId: product.itemId, // 商品行ID
  483. assigneeId: assignForm.targetId, // 供应商ID 或 伙伴商ID
  484. assigneeType: assignForm.targetType // "srm" 或 "bp"
  485. })
  486. ),
  487. remark: '' // 分配备注(可选)
  488. };
  489. // 调用拆单分配接口
  490. await addOrderSplitAssign(submitData);
  491. proxy?.$modal.msgSuccess('分配成功');
  492. assignDialog.visible = false;
  493. // 清空选中状态
  494. selectedAssignProducts.value = [];
  495. // 刷新抽屉数据
  496. await open(orderInfo.value.id, '0');
  497. emit('success');
  498. } catch (error) {
  499. console.error('分配失败:', error);
  500. proxy?.$modal.msgError('分配失败');
  501. } finally {
  502. buttonLoading.value = false;
  503. }
  504. };
  505. // /** 分配对象类型变化 */
  506. // const handleTargetTypeChange = () => {
  507. // // 切换类型时清空已选择的目标
  508. // assignForm.targetId = '';
  509. // if (assignForm.targetType === 'srm') {
  510. // supplierList.value = cachedSupplierList.value;
  511. // } else {
  512. // // 处理伙伴商等其他情况(目前留空或使用别的缓存)
  513. // }
  514. // };
  515. defineExpose({
  516. open
  517. });
  518. </script>
  519. <style scoped lang="scss">
  520. .drawer-header {
  521. display: flex;
  522. align-items: center;
  523. gap: 10px;
  524. .order-title {
  525. font-size: 16px;
  526. font-weight: 600;
  527. color: #303133;
  528. }
  529. }
  530. .drawer-content {
  531. padding: 0 20px 20px;
  532. height: calc(100% - 60px);
  533. overflow-y: auto;
  534. }
  535. .assign-drawer-content {
  536. padding: 0 20px 20px;
  537. height: calc(100% - 80px);
  538. overflow-y: auto;
  539. }
  540. .assign-target-section {
  541. margin-bottom: 20px;
  542. .target-input-wrapper {
  543. display: flex;
  544. align-items: center;
  545. gap: 8px;
  546. .required-mark {
  547. color: #f56c6c;
  548. font-size: 14px;
  549. }
  550. .label {
  551. font-size: 14px;
  552. color: #606266;
  553. white-space: nowrap;
  554. }
  555. }
  556. .or-divider {
  557. display: flex;
  558. align-items: center;
  559. justify-content: center;
  560. font-size: 14px;
  561. color: #909399;
  562. }
  563. }
  564. .product-list-section {
  565. margin-top: 20px;
  566. }
  567. .drawer-footer {
  568. display: flex;
  569. justify-content: flex-end;
  570. gap: 10px;
  571. padding: 10px 20px;
  572. border-top: 1px solid #e4e7ed;
  573. }
  574. .detail-header {
  575. padding: 15px 20px;
  576. background-color: #f5f7fa;
  577. border-radius: 4px;
  578. margin-bottom: 20px;
  579. .info-item {
  580. display: flex;
  581. flex-direction: column;
  582. gap: 5px;
  583. .label {
  584. font-size: 12px;
  585. color: #909399;
  586. }
  587. .value {
  588. font-size: 14px;
  589. color: #303133;
  590. font-weight: 500;
  591. }
  592. }
  593. }
  594. .detail-tabs {
  595. .tab-actions {
  596. margin-bottom: 15px;
  597. }
  598. }
  599. :deep(.el-alert__title) {
  600. font-size: 13px;
  601. }
  602. </style>