rollingOne.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774
  1. <template>
  2. <div class="rolling-three-dashboard flex flex-col">
  3. <div class="search-wrapper">
  4. <BasicForm class="search-form" @register="registerForm" @submit="handleSubmit" @reset="handleReSubmit">
  5. <template #shiftObj>
  6. <div class="shift-performance-tags flex-1">
  7. <a-tag :color="shiftColor[index]" @click="() => (currentShift = index)" v-for="(item, index) in shiftPerformanceColumns">
  8. {{ item.createTime ? item.createTime.substring(5, 16) : '' }} ~
  9. {{ item.changeShiftTime ? item.changeShiftTime.substring(5, 16) : '' }}
  10. 【{{ getTeamShift(item.shift, item.shiftGroup) }}】
  11. <span class="current-shift" :style="{ background: shiftColor[index] }" v-if="index === currentShift"></span>
  12. </a-tag>
  13. </div>
  14. </template>
  15. <template #advanceBefore>
  16. <a-button type="primary" preIcon="ant-design:export-outlined" style="margin-right: 10px" @click="onExportXls"> 导出</a-button>
  17. </template>
  18. </BasicForm>
  19. </div>
  20. <a-spin :spinning="loading">
  21. <div class="common-table">
  22. <a-descriptions bordered style="min-height: 72px" size="small" :column="5" :label-style="{ fontWeight: 'bold', width: '70px' }">
  23. <template v-for="item in dtlList" :key="item.title">
  24. <a-descriptions-item :label-style="!item.title ? { display: 'none' } : {}" :label="item.title">
  25. <div :class="'wrapper-' + item.zjNo">
  26. <div class="nb-left">
  27. <div class="flex">
  28. <div class="flex nick">
  29. <span class="total">总数:{{ item.nums }} 支</span>
  30. </div>
  31. <div class="flex nick">
  32. <span>重量:{{ item.blankOutput ? Number(item.blankOutput).toFixed(4) : 0 }} t</span>
  33. </div>
  34. </div>
  35. <div class="flex dtl-wrapper" v-if="item.statisticsDetailsList.length > 0">
  36. <div>明细:</div>
  37. <div class="dtl flex-1 flex flex-wrap">
  38. <div class="flex-dlt-item flex" v-for="ele in item.statisticsDetailsList">
  39. <div class="flex dtl-item bt-line font-weight" :style="{ color: sizeColor[ele.size] }">
  40. <span class="nums">{{ ele.size }}:&nbsp;&nbsp;&nbsp;{{ ele.nums }} 支</span>
  41. </div>
  42. <div class="flex dtl-item">
  43. <span class="nums bt-line">重量:{{ ele.blankOutput ? Number(ele.blankOutput).toFixed(4) : 0 }} t</span>
  44. </div>
  45. </div>
  46. </div>
  47. </div>
  48. </div>
  49. <!-- <div class="flex nb-right">
  50. <div class="flex nick">
  51. <span>重量:{{ item.blankOutput }}</span>
  52. </div>
  53. <div class="flex dtl-wrapper" v-if="item.statisticsDetailsList.length > 0">
  54. <div class="dtl">
  55. <div class="flex dtl-item" v-for="ele in item.statisticsDetailsList">
  56. <span>重量:{{ ele.blankOutput }}</span>
  57. </div>
  58. </div>
  59. </div>
  60. </div> -->
  61. </div>
  62. </a-descriptions-item>
  63. </template>
  64. </a-descriptions>
  65. </div>
  66. <template v-if="threeList.length">
  67. <a-row :gutter="[16, 8]">
  68. <a-col class="gutter-row" v-for="(item, index) in threeList" :key="index">
  69. <div class="ticket next-ticket" :class="{ disabled: !!item.confirmTime }">
  70. <div class="ticket-op-w" v-if="!isAuth">
  71. <a-button type="primary" :disabled="!!item.confirmTime" size="small" @click="confirmCard(item)">确认热送单</a-button>
  72. </div>
  73. <div class="flex" style="line-height: 24px">
  74. <div class="flex-1">序号:{{ item.heatNo }}</div>
  75. <div class="flex-1" style="text-align: center; font-size: 13px">日期:{{ dayjs(item.createTime).format('MM. DD') }}</div>
  76. <div class="flex-1" style="text-align: right; font-size: 12px">
  77. 班次:<component :is="renderDictTag(item.shift, 'lg_bb')" /> / <component :is="renderDictTag(item.shiftGroup, 'lg_bz')" />
  78. </div>
  79. </div>
  80. <a-descriptions class="ticket-info" layout="vertical" bordered :column="8" size="small">
  81. <a-descriptions-item class="ticket-info-item" label="起止时间">
  82. <div style="min-height: 80px; display: flex; align-items: center; justify-content: center">{{ item.createTime }}</div>
  83. </a-descriptions-item>
  84. <a-descriptions-item class="ticket-info-item" label="炉号">
  85. {{ item.heatNo }}
  86. </a-descriptions-item>
  87. <a-descriptions-item class="ticket-info-item" label="钢种">
  88. {{ item.brandNum }}
  89. </a-descriptions-item>
  90. <a-descriptions-item class="ticket-info-item" label="规格尺寸">
  91. <!-- <a-select v-model:value="sizeValue" :options="sizeOptions" @change="getStartEnd" style="width: 100%" :bordered="false"></a-select> -->
  92. <div
  93. class="line font-weight"
  94. :class="[item.sizeValue !== ele.value ? 'noprint' : 'selected']"
  95. :style="{ cursor: 'pointer', color: sizeColor[ele.size] }"
  96. v-for="ele in item.sizeObj"
  97. @click="
  98. () => {
  99. // sizeValue = ele.size;
  100. // getStartEnd();
  101. }
  102. "
  103. >
  104. {{ ele.size }}
  105. </div>
  106. </a-descriptions-item>
  107. <a-descriptions-item class="ticket-info-item" label="合格支数">
  108. <!-- {{ sizeValue && rollOneInfo.size[sizeValue] ? rollOneInfo.size[sizeValue] : '' }} -->
  109. <div
  110. class="line font-weight"
  111. :class="[item.sizeValue !== ele.value ? 'noprint' : 'selected']"
  112. :style="{ cursor: 'pointer', color: sizeColor[ele.size] }"
  113. v-for="ele in item.sizeObj"
  114. @click="
  115. () => {
  116. // sizeValue = ele.size;
  117. // getStartEnd();
  118. }
  119. "
  120. >
  121. {{ ele.sizeAmount }}
  122. </div>
  123. </a-descriptions-item>
  124. <a-descriptions-item class="ticket-info-item" label="本炉起始根">
  125. <div
  126. class="line"
  127. :class="[item.sizeValue !== ele.value ? 'noprint' : 'selected']"
  128. style="cursor: pointer"
  129. v-for="ele in item.sizeObj"
  130. @click="
  131. () => {
  132. // sizeValue = ele.size;
  133. // getStartEnd();
  134. }
  135. "
  136. >
  137. {{ ele.startAmount }}
  138. </div>
  139. </a-descriptions-item>
  140. <a-descriptions-item class="ticket-info-item" label="本炉终止根">
  141. <div
  142. class="line"
  143. :class="[item.sizeValue !== ele.value ? 'noprint' : 'selected']"
  144. style="cursor: pointer"
  145. v-for="ele in item.sizeObj"
  146. @click="
  147. () => {
  148. // sizeValue = ele.size;
  149. // getStartEnd();
  150. }
  151. "
  152. >
  153. {{ ele.endAmount }}
  154. </div>
  155. </a-descriptions-item>
  156. </a-descriptions>
  157. </div>
  158. </a-col>
  159. </a-row>
  160. <a-pagination
  161. class="pagination"
  162. :defaultPageSize="pageLimit"
  163. v-model:current="currentPage"
  164. show-quick-jumper
  165. :total="totalPage"
  166. @change="onPageChange"
  167. />
  168. </template>
  169. <a-empty v-else :image="Empty.PRESENTED_IMAGE_SIMPLE" />
  170. </a-spin>
  171. </div>
  172. <!-- 确认 -->
  173. <a-modal v-model:open="open" title="确认信息" ok-text="确认" cancel-text="取消" @ok="confirmSubmit">
  174. <div style="margin: 20px">
  175. <a-textarea v-model:value="remark" placeholder="备注" :auto-size="{ minRows: 2, maxRows: 5 }" />
  176. </div>
  177. </a-modal>
  178. </template>
  179. <script setup lang="ts">
  180. import { onMounted, ref } from 'vue';
  181. import {
  182. getRollClubOneList,
  183. confirmRollClubOne,
  184. getrollClubStatistics,
  185. exportOneExcel,
  186. getRollHeightList,
  187. exportHeightExcel,
  188. } from './dashboard.api';
  189. import dayjs, { Dayjs } from 'dayjs';
  190. import { useForm, BasicForm, FormSchema } from '/@/components/Form';
  191. import { Empty } from 'ant-design-vue';
  192. import { render } from '/@/utils/common/renderUtils';
  193. import { getMachineNum } from '../hotDelivery/common.data';
  194. import { Pagination as APagination } from 'ant-design-vue';
  195. import { useUserStore } from '/@/store/modules/user';
  196. import { list } from '../ShiftPerformance/ShiftPerformance.api';
  197. import { getTeamShift } from './dashboard.api';
  198. import { useMethods } from '/@/hooks/system/useMethods';
  199. import { Colors } from './dashboard.data';
  200. // 导入导出方法
  201. const { handleExportXlsx } = useMethods();
  202. const userStore = useUserStore();
  203. const isAuth = userStore.userInfo && userStore.userInfo.username === '5';
  204. const threeList = ref<any[]>([]);
  205. const machineNum = getMachineNum(true) || '3';
  206. // 明细展示
  207. const dtlList = ref<any[]>([
  208. {
  209. // title: '总计',
  210. title: '',
  211. zjNo: 0,
  212. blankOutput: 0,
  213. nums: 0,
  214. statisticsDetailsList: [],
  215. },
  216. {
  217. title: '5#机',
  218. zjNo: 5,
  219. blankOutput: 0,
  220. nums: 0,
  221. statisticsDetailsList: [],
  222. },
  223. ]);
  224. // 渲染字典标签
  225. const renderDictTag = (value: string, dictCode: string) => {
  226. return render.renderDict(value, dictCode);
  227. };
  228. const shiftPerformanceColumns = ref<any>([]);
  229. const shiftColor = ['#f50', '#2db7f5', '#87d068'];
  230. const currentShift = ref(-1);
  231. //自定义表单字段
  232. const formSchemas: FormSchema[] = [
  233. {
  234. label: '炉号',
  235. field: 'heatNo',
  236. component: 'Input',
  237. },
  238. {
  239. label: '定尺',
  240. field: 'size',
  241. component: 'Input',
  242. },
  243. {
  244. label: '日期',
  245. field: 'arrivalTime',
  246. component: 'RangePicker',
  247. componentProps: {
  248. showTime: true,
  249. valueFormat: 'YYYY-MM-DD HH:mm:ss',
  250. },
  251. },
  252. {
  253. label: '牌号',
  254. field: 'brandNum',
  255. component: 'JDictSelectTag',
  256. componentProps: {
  257. dictCode: 'billet_spec',
  258. },
  259. colProps: { span: 6 },
  260. },
  261. // {
  262. // label: '',
  263. // field: 'yuzhanyuan',
  264. // component: 'Input',
  265. // slot: 'yuzhanyuan',
  266. // colProps: { span: 6 },
  267. // },
  268. {
  269. label: '班次日期',
  270. field: 'queryDate',
  271. component: 'DatePicker',
  272. componentProps: {
  273. valueFormat: 'YYYY-MM-DD',
  274. onChange: (v) => {
  275. currentShift.value = -1;
  276. getShiftInfo(3, dayjs(v));
  277. },
  278. },
  279. },
  280. {
  281. label: '',
  282. field: 'shiftObj',
  283. component: 'Input',
  284. slot: 'shiftObj',
  285. colProps: { span: 12 },
  286. },
  287. // {
  288. // label: '班组',
  289. // field: 'shiftGroup',
  290. // component: 'JDictSelectTag',
  291. // componentProps: {
  292. // dictCode: 'lg_bz',
  293. // },
  294. // },
  295. // {
  296. // label: '班别',
  297. // field: 'shift',
  298. // component: 'JDictSelectTag',
  299. // componentProps: {
  300. // dictCode: 'lg_bb',
  301. // },
  302. // },
  303. ];
  304. /**
  305. * BasicForm绑定注册;
  306. */
  307. const [registerForm, { getFieldsValue }] = useForm({
  308. //注册表单列
  309. schemas: formSchemas,
  310. //是否显示展开收起按钮,默认false
  311. showAdvancedButton: false,
  312. //超过指定行数折叠,默认3行
  313. autoAdvancedCol: 3,
  314. //折叠时默认显示行数,默认1行
  315. alwaysShowLines: 3,
  316. //将表单内时间区域的值映射成 2个字段, 'YYYY-MM-DD'日期格式化
  317. fieldMapToTime: [
  318. ['arrivalTime', ['startTime', 'endTime'], 'YYYY-MM-DD HH:mm:ss'],
  319. // ['storageTime', ['storageTime_begin', 'storageTime_end'], 'YYYY-MM-DD HH:mm:ss'],
  320. ],
  321. //每列占比,默认一行为24
  322. baseColProps: { span: 6 },
  323. });
  324. /**
  325. * 点击提交按钮的value值
  326. * @param values
  327. */
  328. function handleSubmit() {
  329. currentPage.value = 1;
  330. getList();
  331. getStatistics();
  332. }
  333. function handleReSubmit() {
  334. currentShift.value = -1;
  335. currentPage.value = 1;
  336. shiftPerformanceColumns.value = [];
  337. getList();
  338. getStatistics();
  339. }
  340. const currentPage = ref(1);
  341. const totalPage = ref(0);
  342. const pageLimit = ref(20);
  343. const onPageChange = (n) => {
  344. currentPage.value = n;
  345. getList();
  346. };
  347. // 获取列表
  348. const loading = ref(false);
  349. const destinationTxt = {
  350. '1': '棒一',
  351. '5': '高线',
  352. };
  353. const getList = async () => {
  354. try {
  355. const values = getFieldsValue();
  356. let params: any = Object.assign({}, values, { destination: destinationTxt[machineNum] });
  357. values.ccmNo = machineNum == '1' ? '5' : '6';
  358. loading.value = true;
  359. if (!values.arrivalTime) {
  360. params = Object.assign({}, values, {
  361. // arrivalTime: dateObj.value.format('YYYY-MM-DD 00:00:00'),
  362. destination: destinationTxt[machineNum],
  363. });
  364. }
  365. // 班次
  366. let changeShiftId = undefined;
  367. if (currentShift.value !== -1) {
  368. changeShiftId = shiftPerformanceColumns.value[currentShift.value].id;
  369. }
  370. loading.value = true;
  371. const fetchFn = machineNum == '1' ? getRollClubOneList : getRollHeightList;
  372. const res = await fetchFn({ pageNo: currentPage.value, pageSize: pageLimit.value, ...params, changeShiftId });
  373. totalPage.value = res.total;
  374. currentPage.value = res.current;
  375. threeList.value = (res.records || []).map((item) => {
  376. const {
  377. heatNoDetails,
  378. storageCenterHeatNoInvoicing: { rollClubOneDetails, rollHeightDetails },
  379. } = item;
  380. const { sizeDetails, confirmTime, id, brandNum } = rollClubOneDetails ? rollClubOneDetails : rollHeightDetails;
  381. const sizeObj = {};
  382. sizeDetails.forEach((item) => {
  383. sizeObj[item.size] = item;
  384. });
  385. return {
  386. ...heatNoDetails[0],
  387. sizeObj,
  388. sizeValue: sizeDetails && sizeDetails.length ? sizeDetails[0].size : '',
  389. confirmTime,
  390. id,
  391. brandNum,
  392. };
  393. });
  394. } catch (error) {
  395. console.log(error);
  396. } finally {
  397. loading.value = false;
  398. }
  399. };
  400. // 确定
  401. const open = ref(false);
  402. const confirmInfo = ref({});
  403. const remark = ref('确认热送单炉支数传递单无误!');
  404. const confirmCard = (record) => {
  405. open.value = true;
  406. confirmInfo.value = record;
  407. remark.value = '确认热送单炉支数传递单无误!';
  408. };
  409. const confirmSubmit = () => {
  410. const info: any = confirmInfo.value;
  411. confirmRollClubOne({
  412. id: info.id,
  413. confirmTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  414. remark: remark.value,
  415. }).then(() => {
  416. open.value = false;
  417. getList();
  418. });
  419. };
  420. const sizeColor = ref({});
  421. // 获取统计信息
  422. /**
  423. * ccmNo、changeShiftId、queryDate、queryType(1、2、3、4)代表棒一、棒二、棒三、上若, 就这四个参数,ccmNo、queryType 必输,changeShiftId、queryDate(2025-06-24)非必输,
  424. **/
  425. const getStatistics = async () => {
  426. try {
  427. const values = getFieldsValue();
  428. let params: any = Object.assign({}, values, { queryType: '1', ccmNo: machineNum == '1' ? '5' : '6' });
  429. // 班次
  430. let changeShiftId = undefined;
  431. if (currentShift.value !== -1) {
  432. changeShiftId = shiftPerformanceColumns.value[currentShift.value].id;
  433. }
  434. const staticsRres = await getrollClubStatistics({ ...params, changeShiftId });
  435. const res = staticsRres[0];
  436. dtlList.value[0].blankOutput = res.totalWeight || 0;
  437. dtlList.value[0].nums = res.counts || 0;
  438. let totalObj = {
  439. 5: { blankOutput: 0, nums: 0 },
  440. };
  441. let statisticsDetailsList5: any[] = [];
  442. res.billetStatisticList.forEach((element, index) => {
  443. sizeColor.value[element.size] = Colors[index] ? Colors[index] : '#f50';
  444. statisticsDetailsList5.push({ ...element, nums: element.amountTotal, blankOutput: element.blankOutput.toFixed(4) });
  445. totalObj[5].blankOutput += element.blankOutput;
  446. totalObj[5].nums += element.amountTotal;
  447. });
  448. dtlList.value[1].statisticsDetailsList = statisticsDetailsList5;
  449. dtlList.value[1].blankOutput = totalObj[5].blankOutput ? totalObj[5].blankOutput.toFixed(4) : 0;
  450. dtlList.value[1].nums = totalObj[5].nums;
  451. } catch (error) {
  452. dtlList.value = [
  453. {
  454. // title: '总计',
  455. title: '',
  456. zjNo: 0,
  457. blankOutput: 0,
  458. nums: 0,
  459. statisticsDetailsList: [],
  460. },
  461. {
  462. title: '5#机',
  463. zjNo: 5,
  464. blankOutput: 0,
  465. nums: 0,
  466. statisticsDetailsList: [],
  467. },
  468. ];
  469. }
  470. };
  471. // 获取班次信息
  472. const getShiftInfo = async (pageSize: number = 3, date?: Dayjs) => {
  473. try {
  474. if (date && !date.isValid()) {
  475. shiftPerformanceColumns.value = [];
  476. currentShift.value = -1;
  477. return false;
  478. }
  479. loading.value = true;
  480. const createTime_begin = date ? date.subtract(1, 'day').format('YYYY-MM-DD 23:55:00') : undefined;
  481. const createTime_end = date ? date.add(1, 'day').format('YYYY-MM-DD 00:05:00') : undefined;
  482. const res = await list({
  483. ccmNo: machineNum == '1' ? '5' : '6',
  484. pageNo: 1,
  485. pageSize: pageSize,
  486. column: 'createTime',
  487. order: 'asc',
  488. ...(date ? { createTime_begin, createTime_end } : {}),
  489. });
  490. const { records } = res;
  491. const arr = records || [];
  492. shiftPerformanceColumns.value = arr
  493. .filter((item) => item.createTime && item.changeShiftTime) // 过滤掉 createTime 为空的数据
  494. .sort((a, b) => {
  495. const dateA = new Date(a.createTime).getTime(); // 转换为时间戳
  496. const dateB = new Date(b.createTime).getTime(); // 转换为时间戳
  497. if (isNaN(dateA) || isNaN(dateB)) {
  498. console.warn('Invalid date detected:', a.createTime, b.createTime);
  499. return 0; // 如果日期无效,视为相等
  500. }
  501. return dateA - dateB; // 按时间戳排序
  502. });
  503. // currentShift.value = shiftPerformanceColumns.value.length > 0 ? shiftPerformanceColumns.value.length - 1 : 0;
  504. } catch (error) {
  505. console.error(error);
  506. } finally {
  507. loading.value = false;
  508. }
  509. };
  510. // 导出
  511. const onExportXls = () => {
  512. const values = getFieldsValue();
  513. let params = Object.assign({}, values, { ccmNo: machineNum == '1' ? '5' : '6' });
  514. if (currentShift.value >= 0) {
  515. params = {
  516. changeShiftId: shiftPerformanceColumns.value[currentShift.value].id,
  517. queryDate: values.queryDate,
  518. ccmNo: machineNum == '1' ? '5' : '6',
  519. };
  520. }
  521. let queryParams = Object.keys(params)
  522. .filter((v) => params[v])
  523. .map((key) => {
  524. return `${key}=${params[key]}`;
  525. });
  526. const exportExlUrl = machineNum == '1' ? exportOneExcel() : exportHeightExcel();
  527. const exportExlTitle = machineNum == '1' ? '棒一数据' : '高线数据';
  528. return handleExportXlsx(exportExlTitle, exportExlUrl + (queryParams.length > 0 ? '?' + queryParams.join('&') : ''));
  529. };
  530. onMounted(() => {
  531. getList();
  532. // getShiftInfo(3, dayjs());
  533. getStatistics();
  534. });
  535. </script>
  536. <style scoped lang="less">
  537. .rolling-three-dashboard {
  538. width: 100%;
  539. height: 100%;
  540. padding: 20px;
  541. overflow: hidden;
  542. background: var(--bg-s-color);
  543. .search-wrapper {
  544. margin-bottom: 10px;
  545. background-color: #005baf;
  546. padding: 20px 20px 0;
  547. border-radius: 4px;
  548. .search-form {
  549. :deep(.btnArea) {
  550. .ant-form-item-row {
  551. width: 100%;
  552. justify-content: flex-end;
  553. }
  554. }
  555. }
  556. :deep(.ant-form) {
  557. .ant-form-item .ant-form-item-label > label {
  558. color: #fff;
  559. }
  560. }
  561. }
  562. :deep(.ant-spin-nested-loading) {
  563. flex: 1;
  564. overflow: hidden;
  565. }
  566. .ant-empty {
  567. margin-top: 60px;
  568. color: #cbcbcb;
  569. }
  570. .gutter-row {
  571. max-width: 660px;
  572. position: relative;
  573. .ticket {
  574. padding: 10px 10px 0;
  575. border: 1px solid #c5c5c5;
  576. background: beige;
  577. &.disabled {
  578. background: #e9e9e9;
  579. }
  580. .ticket-op-w {
  581. margin-bottom: 10px;
  582. text-align: right;
  583. .ant-btn {
  584. margin-left: 20px;
  585. }
  586. }
  587. .ant-select {
  588. :deep(.ant-select-selector) {
  589. font-size: 14px;
  590. padding: 0;
  591. .ant-select-selection-item,
  592. .ant-select-selection-placeholder {
  593. padding-inline-end: 0;
  594. }
  595. }
  596. :deep(.ant-select-arrow) {
  597. display: none;
  598. }
  599. }
  600. .ticket-info {
  601. margin-top: 6px;
  602. margin-bottom: 4px;
  603. :deep(.ant-descriptions-view) {
  604. .ticket-info-item {
  605. border: 1px solid #bfbfbf;
  606. font-size: 14px;
  607. padding: 4px !important;
  608. text-align: center;
  609. height: 36px;
  610. position: relative;
  611. color: #333;
  612. .line {
  613. border-bottom: 1px solid #bfbfbf;
  614. &:last-child {
  615. border-bottom: none;
  616. }
  617. }
  618. }
  619. }
  620. .heatNo-item {
  621. min-width: 120px;
  622. }
  623. }
  624. }
  625. }
  626. .pagination {
  627. margin-top: 20px;
  628. text-align: right;
  629. padding-right: 30px;
  630. :deep(.ant-pagination-item) {
  631. a {
  632. color: rgba(51, 51, 51, 0.88);
  633. }
  634. &.ant-pagination-item-active {
  635. background-color: var(--vxe-primary-color);
  636. border-color: var(--vxe-primary-color);
  637. a {
  638. color: #fff;
  639. }
  640. }
  641. }
  642. }
  643. .common-table {
  644. margin-bottom: 20px;
  645. color: #fff;
  646. .wrapper-0 {
  647. min-width: 300px;
  648. }
  649. .nb-left,
  650. .nb-right {
  651. flex-direction: column;
  652. }
  653. .nick {
  654. padding: 0;
  655. font-weight: 700;
  656. // color: rgba(0, 0, 0, 0.8);
  657. .total {
  658. display: inline-block;
  659. min-width: 130px;
  660. margin-right: 30px;
  661. }
  662. }
  663. .dtl-wrapper {
  664. margin-top: 10px;
  665. }
  666. .dtl {
  667. display: flex;
  668. // color: rgba(0, 0, 0, 0.6);
  669. gap: 8px 16px;
  670. .nums {
  671. display: inline-block;
  672. min-width: 130px;
  673. margin-right: 30px;
  674. }
  675. .bt-line {
  676. border-bottom: 1px solid #eee;
  677. }
  678. }
  679. }
  680. .shift-performance-tags {
  681. margin-left: 10px;
  682. .ant-tag {
  683. padding: 6px 6px;
  684. position: relative;
  685. cursor: pointer;
  686. margin-bottom: 20px;
  687. }
  688. .current-shift {
  689. position: absolute;
  690. display: inline-block;
  691. width: 60px;
  692. height: 4px;
  693. border-radius: 4px;
  694. bottom: -8px;
  695. left: 50%;
  696. transform: translateX(-30px);
  697. }
  698. }
  699. .font-weight {
  700. font-weight: 700;
  701. }
  702. }
  703. </style>