car.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  1. <template>
  2. <a-spin :spinning="isSpinning" wrapperClassName="car-info-spin">
  3. <div type="card">
  4. <div :key="item" style="margin-bottom: 20px" v-for="item in carPosition[ccmNo]">
  5. <div class="car-wei" :class="`car-wei-${item}`">
  6. <span class="num">{{ '车位' + item }}</span>
  7. <a-button size="large" type="primary" style="font-size: 18px; margin-left: 6px" @click="createChargeBill(item)">创建装运单</a-button>
  8. </div>
  9. <div class="car-info-wrapper">
  10. <div class="licensePlate"
  11. >装运车辆:{{ vehicleInfo['info' + item] && vehicleInfo['info' + item].licensePlate ? vehicleInfo['info' + item].licensePlate : '' }}</div
  12. >
  13. <print-car-info
  14. :ref="printCarInfoRefs[`infoRef${item}`]"
  15. :carPositon="item"
  16. :ccm-no="ccmNo"
  17. :info="vehicleInfo['info' + item]"
  18. @change="handleChange"
  19. @refresh="refreshCarList"
  20. />
  21. <div class="print">
  22. <a-button
  23. type="primary"
  24. v-if="vehicleInfo['info' + item] && vehicleInfo['info' + item].id"
  25. @click="
  26. () =>
  27. openPrintModal(true, {
  28. record: vehicleInfo['info' + item],
  29. typeConfigId: !vehicleInfo['info' + item].typeConfigId ? '1024' : vehicleInfo['info' + item].typeConfigId,
  30. type: 'offline',
  31. })
  32. "
  33. >打印</a-button
  34. >
  35. </div>
  36. <div class="change-type flex items-center" v-if="vehicleInfo['info' + item] && Object.keys(vehicleInfo['info' + item]).includes('btype')">
  37. <span>{{ vehicleInfo['info' + item].ccmNo_dictText }}</span>
  38. <span>/</span>
  39. <a-switch
  40. v-model:checked="vehicleInfo['info' + item].btype"
  41. checked-value="0"
  42. @change="(checked) => handleBtypeChange(checked, vehicleInfo['info' + item])"
  43. checked-children="热坯"
  44. un-checked-value="1"
  45. un-checked-children="冷坯"
  46. />
  47. </div>
  48. </div>
  49. </div>
  50. <!-- <a-tab-pane key="2" tab="车位2" force-render>Content of Tab Pane 2</a-tab-pane> -->
  51. </div>
  52. <div class="flex justify-between refresh-wrapper" :style="{ left: carPosition[ccmNo].length * 70 + 70 + 'px' }">
  53. <a-button size="large" type="primary" style="font-size: 18px" @click="refresh(1)"> 刷新 </a-button>
  54. <RouterLink :to="'/shippingBill/' + ccmNo" target="_blank">
  55. <a-button size="large" type="primary" style="font-size: 18px"> 装运列表 </a-button>
  56. </RouterLink>
  57. </div>
  58. <a-tabs
  59. v-model:activeKey="stackActiveKey"
  60. @change="
  61. (v) => {
  62. const index = stackList.findIndex((item) => item.id == v);
  63. stackInfo = stackList[index];
  64. getStackInfoList(v);
  65. }
  66. "
  67. >
  68. <a-tab-pane :key="item.id" :tab="item.typeName" v-for="item in stackList">
  69. <div
  70. v-if="stackingObj[stackActiveKey] && stackingObj[stackActiveKey].length"
  71. class="stacking-wrapper selected-divider flex flex-wrap"
  72. id="operatorCC-stacking-wrapper"
  73. >
  74. <div
  75. class="selected-divider-row flex flex-col"
  76. :id="`stackLayer${pitem.heatNo}`"
  77. v-for="pitem in stackingObj[stackActiveKey]"
  78. :key="pitem.heatNo"
  79. >
  80. <div class="p-layer flex justify-between">
  81. <span class="lu">炉号</span><span class="hao">{{ pitem.heatNo }}</span>
  82. </div>
  83. <div class="dtl-list">
  84. <div class="dtl-item flex justify-between" v-for="m in pitem.details">
  85. <span class="size">{{ m.stackingLength }}</span>
  86. <span>
  87. <span class="zhi">{{ m.stackingCount }}</span> 支</span
  88. >
  89. </div>
  90. </div>
  91. </div>
  92. </div>
  93. <a-empty v-else />
  94. </a-tab-pane>
  95. <template #rightExtra>
  96. <!-- <div>
  97. <a-button
  98. type="primary"
  99. v-if="vehicleInfo['info' + activeKey] && vehicleInfo['info' + activeKey].id && !vehicleInfo['info' + activeKey].outTime"
  100. danger
  101. @click="stackToCar"
  102. >
  103. 堆垛装车
  104. </a-button>
  105. <a-button style="background-color: #f5f5f5; color: #838383" v-else disabled>堆垛装车</a-button>
  106. </div> -->
  107. <a-button size="large" type="primary" style="font-size: 18px" @click="refresh(2)"> 刷新 </a-button>
  108. </template>
  109. </a-tabs>
  110. </a-spin>
  111. <!-- 打印 -->
  112. <printModal @register="registerPrintModal" />
  113. <!-- 快速创建装运单 -->
  114. <a-modal
  115. v-model:open="openCreateChargeBill"
  116. title="创建装运单"
  117. centered
  118. width="400px"
  119. ok-text="确认"
  120. :okButtonProps="{ loading: okLoading }"
  121. cancel-text="取消"
  122. @ok="confirmCreateChargeBill"
  123. @cancel="
  124. () => {
  125. openCreateChargeBill = false;
  126. }
  127. "
  128. >
  129. <div class="flex justify-center items-center" v-if="createChargeBillPositionNum == 2" style="margin: 20px 0">
  130. <div>选择铸机:</div>
  131. <JSearchSelect type="list" style="width: 277px" v-model:value="createChargeBillCcmNo" dict="lg_zj" placeholder="请选择" allowClear />
  132. </div>
  133. <div class="flex justify-center items-center" style="margin: 20px 0">
  134. <div>选择车辆:</div>
  135. <JSearchSelect type="list" style="width: 277px" v-model:value="createChargeBillCar" dict="lg_car" placeholder="请选择" allowClear />
  136. </div>
  137. </a-modal>
  138. </template>
  139. <script setup lang="ts">
  140. import { ref, onMounted, onUnmounted, h } from 'vue';
  141. import printCarInfo from './printCarInfo.vue';
  142. import { useTimeoutFn } from '/@/hooks/core/useTimeout';
  143. import { list, edit } from '../../shippingBill/shippingBill.api';
  144. import { stackLoadSave, stackLocationChange } from '../../hotDelivery/hotDelivery.api';
  145. import { getMachineConfig, MachineConfigType, destinationOptions } from '../../hotDelivery/common.data';
  146. import { useMessage } from '/@/hooks/web/useMessage';
  147. import printModal from '../../shippingBill/components/printModal.vue';
  148. import { useModal } from '/@/components/Modal';
  149. import { render } from '/@/utils/common/renderUtils';
  150. import { getStackInfoByCcmNo, quickCreateStorageBill } from '../operator.api';
  151. import JSearchSelect from '/@/components/Form/src/jeecg/components/JSearchSelect.vue';
  152. // 注册打印modal
  153. const [registerPrintModal, { openModal: openPrintModal }] = useModal();
  154. const { createConfirm, createMessage } = useMessage();
  155. const props = defineProps({
  156. ccmNo: {
  157. type: [String, Number],
  158. default: '5',
  159. },
  160. });
  161. const isSpinning = ref(false);
  162. const activeKey = ref(1);
  163. const carPosition = {
  164. '5': [1, 2],
  165. '6': [2, 3, 4],
  166. };
  167. // 车辆信息
  168. const infoRef1 = ref();
  169. const infoRef2 = ref();
  170. const infoRef3 = ref();
  171. const infoRef4 = ref();
  172. const printCarInfoRefs = { infoRef1, infoRef2, infoRef3, infoRef4 };
  173. // 5号机堆垛
  174. const stackingObj = ref<any>({});
  175. const stackInfo = ref<any>({});
  176. const stackActiveKey = ref('10');
  177. const stackList = ref<any[]>([]);
  178. // 车位1车辆信息
  179. // id: '',
  180. // licensePlate: '',
  181. // destination: '',
  182. // typeConfigId: undefined,
  183. // ccmNo: '',
  184. // ccmNo_dictText: '',
  185. // amountTotal: 0,
  186. // steel: '',
  187. // size: '',
  188. // positionNum: '',
  189. const vehicleInfo = ref<any>({
  190. info1: {},
  191. info2: {},
  192. info3: {},
  193. info4: {},
  194. });
  195. // 获取堆垛信息
  196. const getStackInfo = async () => {
  197. const machineConfig = await getMachineConfig(props.ccmNo)[MachineConfigType.STACKING];
  198. stackInfo.value = machineConfig[0];
  199. stackActiveKey.value = machineConfig[0].id;
  200. stackList.value = machineConfig;
  201. };
  202. const getInfo = async (type?: number | undefined) => {
  203. // 获取车位1车辆信息
  204. try {
  205. isSpinning.value = true;
  206. if (type === 1 || type === undefined) {
  207. const fetchArr: any = [];
  208. carPosition[props.ccmNo].forEach((item) => {
  209. fetchArr.push(
  210. list({
  211. column: 'createTime',
  212. order: 'desc',
  213. pageNo: 1,
  214. pageSize: 1,
  215. positionNum: item,
  216. ...(item == 2 ? {} : { ccmNo: props.ccmNo }),
  217. })
  218. );
  219. });
  220. await Promise.all(fetchArr).then((res) => {
  221. if (Array.isArray(res)) {
  222. res.forEach((item) => {
  223. if (item.records[0]) {
  224. vehicleInfo.value[`info${item.records[0].positionNum}`] = {
  225. ...item.records[0],
  226. oldLicensePlate: item.records[0].licensePlate,
  227. oldTypeConfigId: item.records[0].typeConfigId === '1024' ? undefined : item.records[0].typeConfigId,
  228. typeConfigId: item.records[0].typeConfigId === '1024' ? undefined : item.records[0].typeConfigId,
  229. oldBrandNum: item.records[0].brandNum,
  230. oldSize: item.records[0].size,
  231. };
  232. }
  233. });
  234. // setTimeout(() => {
  235. // printCarInfoRefs[`infoRef${activeKey.value}`] &&
  236. // printCarInfoRefs[`infoRef${activeKey.value}`].value &&
  237. // printCarInfoRefs[`infoRef${activeKey.value}`].value[0].getTableList();
  238. // }, 50);
  239. }
  240. });
  241. }
  242. if (type === 2 || type === undefined) {
  243. await getStackInfoList(stackActiveKey.value);
  244. }
  245. } catch (error) {
  246. console.log(error);
  247. } finally {
  248. isSpinning.value = false;
  249. start();
  250. }
  251. };
  252. const { start, stop } = useTimeoutFn(getInfo, 10000);
  253. // 获取堆垛机堆垛信息
  254. // 获取当前堆垛信息
  255. const getStackInfoList = async (typeConfigId) => {
  256. const stackingInfo = await getStackInfoByCcmNo({ ccmNo: props.ccmNo, typeConfigId });
  257. // stackingList.value = stackingInfo || [];
  258. stackingObj.value[typeConfigId] = stackingInfo || [];
  259. };
  260. // 修改类型
  261. function handleBtypeChange(v, record) {
  262. stop();
  263. createConfirm({
  264. iconType: 'warning',
  265. title: '确认修改',
  266. width: '460px',
  267. content: () => {
  268. return h('div', { style: { fontSize: '16px' } }, [
  269. h('span', null, `是否将车牌为`),
  270. h('span', { style: { fontSize: '18px', color: '#d48806' } }, `${record.licensePlate}`),
  271. h('span', null, `的`),
  272. h('span', { style: { fontSize: '18px', color: v === '1' ? '#cd201f' : '#3b5999' } }, `${v === '1' ? ' 热坯 ' : ' 冷坯 '}`),
  273. h('span', null, `改为`),
  274. h('span', { style: { fontSize: '18px', color: v === '1' ? '#3b5999' : '#cd201f' } }, `${v === '1' ? ' 冷坯 ' : ' 热坯 '}`),
  275. h('span', null, `?`),
  276. ]);
  277. },
  278. okText: '确认',
  279. cancelText: '取消',
  280. onOk: () => {
  281. return edit({ id: record.id, btype: v }).then(() => {
  282. getInfo();
  283. });
  284. },
  285. onCancel: () => {
  286. start();
  287. record.btype = v === '1' ? '0' : '1';
  288. },
  289. });
  290. }
  291. // 修改牌号,车号,目的地
  292. const handleChange = (options) => {
  293. const { type, value, carPositon } = options;
  294. console.log(options, value, value === undefined);
  295. if (value === undefined) return;
  296. stop();
  297. createConfirm({
  298. iconType: 'warning',
  299. title: '确认修改',
  300. width: '460px',
  301. content: () => {
  302. let title = '',
  303. content: any = '';
  304. if (type === 'licensePlate') {
  305. title = '是否修改车牌号为:';
  306. content = value;
  307. } else if (type === 'destination') {
  308. title = '是否修改目的地为:';
  309. const curDestination = destinationOptions[props.ccmNo].find((item) => item.value === value);
  310. content = curDestination ? curDestination.label : '';
  311. } else if (type === 'brandNum') {
  312. title = '是否修改牌号为:';
  313. content = render.renderDict(value, 'billet_spec');
  314. } else if (type === 'size') {
  315. title = '是否修改定尺为:';
  316. content = value;
  317. }
  318. return h('div', { style: { fontSize: '16px' } }, [
  319. h('span', null, title),
  320. h('span', { style: { fontSize: '18px', color: '#d48806' } }, content),
  321. ]);
  322. },
  323. onOk: () => {
  324. let params = { ...vehicleInfo.value[`info${carPositon}`] };
  325. if (type === 'destination') {
  326. const curDestination = destinationOptions[props.ccmNo].find((item) => item.value === value);
  327. params.destination = curDestination.label;
  328. }
  329. return edit(params).then(() => {
  330. getInfo();
  331. });
  332. },
  333. onCancel: () => {
  334. start();
  335. if (type === 'licensePlate') {
  336. vehicleInfo.value[`info${carPositon}`].licensePlate = vehicleInfo.value[`info${carPositon}`].oldLicensePlate;
  337. } else if (type === 'destination') {
  338. vehicleInfo.value[`info${carPositon}`].typeConfigId = vehicleInfo.value[`info${carPositon}`].oldTypeConfigId;
  339. } else if (type === 'brandNum') {
  340. vehicleInfo.value[`info${carPositon}`].brandNum = vehicleInfo.value[`info${carPositon}`].oldBrandNum;
  341. } else if (type === 'size') {
  342. vehicleInfo.value[`info${carPositon}`].size = vehicleInfo.value[`info${carPositon}`].oldSize;
  343. }
  344. },
  345. });
  346. };
  347. // 选择堆垛位置装车
  348. const selectedAddressId = ref<any[]>([]);
  349. const selectedAddress = ref<any[]>([]);
  350. const getSelectedStack = () => {
  351. return selectedAddress.value || [];
  352. };
  353. // 右键换位置
  354. const menuClick = (e, info) => {
  355. if (e.key === '1') {
  356. const selectedStackList = selectedAddress.value.filter((item) => !item.billetNos);
  357. if (!selectedStackList.length) {
  358. createMessage.error('请选择要移动的位置,且位置上没有钢坯!');
  359. return;
  360. }
  361. if (selectedStackList.length > 1) {
  362. createMessage.error('钢坯移动的空位置只能选择一个!');
  363. return;
  364. }
  365. createConfirm({
  366. iconType: 'warning',
  367. title: '确认更换位置',
  368. width: '460px',
  369. content: () => {
  370. return h('div', { style: { fontSize: '16px' } }, [
  371. h('span', null, `是否将`),
  372. h('span', { style: { fontSize: '18px', color: '#d48806' } }, `${info.layer}层${info.address}`),
  373. h('span', null, `更换到`),
  374. h('span', { style: { fontSize: '18px', color: '#cd201f' } }, `${selectedStackList[0].layer}层${selectedStackList[0].address}`),
  375. h('span', null, `?`),
  376. ]);
  377. },
  378. okText: '更换',
  379. cancelText: '取消',
  380. onOk: () => {
  381. const params = {
  382. stackId: info.id,
  383. locationChangeId: selectedStackList[0].id,
  384. };
  385. return stackLocationChange(params).then(() => {
  386. selectedAddressId.value = [];
  387. selectedAddress.value = [];
  388. refresh(2);
  389. });
  390. },
  391. });
  392. }
  393. };
  394. const tabChange = (key) => {
  395. printCarInfoRefs[`infoRef${key}`] && printCarInfoRefs[`infoRef${key}`].value && printCarInfoRefs[`infoRef${key}`].value[0].getTableList();
  396. };
  397. const handleStackClick = (v) => {
  398. const index = selectedAddressId.value.indexOf(v.id);
  399. if (index > -1) {
  400. selectedAddressId.value.splice(index, 1);
  401. selectedAddress.value.splice(index, 1);
  402. } else {
  403. selectedAddressId.value.push(v.id);
  404. selectedAddress.value.push(v);
  405. }
  406. };
  407. const stackToCar = async () => {
  408. try {
  409. const valiDesRes = validateCarDestination();
  410. if (!valiDesRes) {
  411. return;
  412. }
  413. const selectedStackList = selectedAddress.value.filter((item) => item.billetNos);
  414. if (!selectedStackList.length) {
  415. createMessage.error('请选择有钢坯的堆垛位置装车!');
  416. return;
  417. }
  418. const curDestination =
  419. destinationOptions[props.ccmNo].find((item) => item.value === vehicleInfo.value[`info${activeKey.value}`].typeConfigId) || {};
  420. const params = {
  421. storageBill: vehicleInfo.value[`info${activeKey.value}`] || {},
  422. belongTable: stackInfo.value?.belongTable,
  423. billetHotsendTypeConfigId: stackInfo.value.id,
  424. stackingAndLoadingVehiclesList: selectedStackList,
  425. destination: vehicleInfo.value[`info${activeKey.value}`].destination,
  426. destinationId: vehicleInfo.value[`info${activeKey.value}`].typeConfigId,
  427. destinationTable: curDestination.belongTable,
  428. billetHotsend: {
  429. ccmNo: props.ccmNo,
  430. isUpd: false,
  431. },
  432. };
  433. stop();
  434. isSpinning.value = true;
  435. await stackLoadSave(params);
  436. getInfo();
  437. } catch (error) {
  438. isSpinning.value = false;
  439. } finally {
  440. selectedAddressId.value = [];
  441. selectedAddress.value = [];
  442. }
  443. };
  444. // 验证是否有目的地
  445. const validateCarDestination = () => {
  446. const curVehicleInfo = vehicleInfo.value[`info${activeKey.value}`];
  447. if (!curVehicleInfo.typeConfigId || !curVehicleInfo.destination || curVehicleInfo.typeConfigId == 1024) {
  448. createMessage.error('请先选择装运单库名!');
  449. printCarInfoRefs[`infoRef${activeKey.value}`].value && printCarInfoRefs[`infoRef${activeKey.value}`].value[0].focusDestination();
  450. return false;
  451. }
  452. return true;
  453. };
  454. // 创建装车单
  455. const openCreateChargeBill = ref(false);
  456. const createChargeBillCcmNo = ref(props.ccmNo);
  457. const createChargeBillPositionNum = ref(1);
  458. const createChargeBillCar = ref(undefined);
  459. const okLoading = ref(false);
  460. const createChargeBill = async (pn) => {
  461. openCreateChargeBill.value = true;
  462. createChargeBillPositionNum.value = pn;
  463. createChargeBillCcmNo.value = props.ccmNo;
  464. createChargeBillCar.value = undefined;
  465. };
  466. const confirmCreateChargeBill = async () => {
  467. try {
  468. if (createChargeBillPositionNum.value == 2 && !createChargeBillCcmNo.value) {
  469. createMessage.error('请选择铸机号!');
  470. return;
  471. }
  472. if (!createChargeBillCar.value) {
  473. createMessage.error('请选择车辆!');
  474. return;
  475. }
  476. okLoading.value = true;
  477. await quickCreateStorageBill({
  478. ccmNo: createChargeBillCcmNo.value,
  479. licensePlate: createChargeBillCar.value,
  480. positionNum: createChargeBillPositionNum.value,
  481. });
  482. refresh(1);
  483. openCreateChargeBill.value = false;
  484. okLoading.value = false;
  485. } catch (error) {
  486. okLoading.value = false;
  487. }
  488. };
  489. // 刷新
  490. const refresh = (type?: number) => {
  491. stop();
  492. getInfo(type);
  493. };
  494. onMounted(() => {
  495. getStackInfo();
  496. getInfo();
  497. });
  498. onUnmounted(() => {
  499. stop();
  500. });
  501. const refreshCarList = () => {
  502. selectedAddressId.value = [];
  503. selectedAddress.value = [];
  504. stop();
  505. getInfo();
  506. };
  507. defineExpose({
  508. getSelectedStack,
  509. getStackInfo: () => stackInfo.value,
  510. getCurrentCar: () => vehicleInfo.value[`info${activeKey.value}`],
  511. refreshCarList: refreshCarList,
  512. valirDest: validateCarDestination,
  513. });
  514. </script>
  515. <style lang="less" scoped>
  516. @import '../../hotDelivery/components/metal.less';
  517. .car-info-spin {
  518. position: relative;
  519. height: 100%;
  520. overflow: auto;
  521. :deep(.ant-spin-container) {
  522. display: flex;
  523. flex-direction: column;
  524. height: 100%;
  525. overflow: auto;
  526. }
  527. .refresh-wrapper {
  528. position: absolute;
  529. left: 100px;
  530. right: 170px;
  531. }
  532. .ant-tabs {
  533. color: #dadada;
  534. :deep(.ant-tabs-tab) {
  535. font-size: 16px;
  536. background: #01396c;
  537. margin-left: 6px;
  538. padding: 8px 12px;
  539. border-radius: 6px 6px 0 0;
  540. &.ant-tabs-tab-active {
  541. background: #0085ff;
  542. .ant-tabs-tab-btn {
  543. color: #fff;
  544. }
  545. }
  546. }
  547. }
  548. .car-wei {
  549. height: 58px;
  550. font-size: 20px;
  551. color: #fff;
  552. .num {
  553. display: inline-block;
  554. background: #01396c;
  555. border-radius: 4px 4px 0 0;
  556. padding: 6px 10px;
  557. }
  558. }
  559. .car-wei-1 {
  560. margin-top: 0;
  561. }
  562. }
  563. .car-info-wrapper {
  564. position: relative;
  565. padding: 30px 10px 10px;
  566. border: 1px solid var(--op-border-color);
  567. border-radius: 6px;
  568. .licensePlate {
  569. width: 190px;
  570. background-color: #010c3a;
  571. position: absolute;
  572. top: -15px;
  573. left: 30px;
  574. font-size: 16px;
  575. color: var(--op-text-color-fff);
  576. text-align: center;
  577. }
  578. .print {
  579. position: absolute;
  580. right: 22px;
  581. top: 40px;
  582. }
  583. .change-type {
  584. position: absolute;
  585. right: 22px;
  586. top: -50px;
  587. gap: 10px;
  588. color: var(--op-text-color-fff);
  589. font-size: 20px;
  590. .ant-switch {
  591. background-color: #3b5999;
  592. :deep(.ant-switch-inner) {
  593. .ant-switch-inner-checked,
  594. .ant-switch-inner-unchecked {
  595. font-size: 17px;
  596. }
  597. }
  598. }
  599. .ant-switch.ant-switch-checked {
  600. background-color: #cd201f;
  601. }
  602. }
  603. }
  604. .stack-divider {
  605. font-size: 16px;
  606. margin-top: 10px;
  607. color: var(--op-text-color-fff);
  608. }
  609. .stacking-wrapper {
  610. flex: unset;
  611. overflow: unset;
  612. padding: 0;
  613. margin-top: 6px;
  614. padding-bottom: 20px;
  615. gap: 10px 12px;
  616. .selected-divider-row {
  617. width: 158px;
  618. min-height: 120px;
  619. background: #08184d;
  620. border-radius: 2px;
  621. border: 1px solid #001966;
  622. padding: 6px;
  623. margin-top: 0;
  624. margin-bottom: 10px;
  625. }
  626. &.selected-divider .selected-divider-row .stacking-list-row {
  627. cursor: pointer;
  628. height: 24px;
  629. line-height: 20px;
  630. border: 1px solid var(--op-border-color);
  631. border-radius: 4px;
  632. font-size: 20px;
  633. }
  634. .stacking-list-divider {
  635. margin: 0;
  636. color: var(--vxe-danger-color, #f56c6c);
  637. }
  638. .stack-col {
  639. overflow: hidden;
  640. }
  641. .p-stack-col {
  642. padding-right: 0 !important;
  643. max-width: 11%;
  644. }
  645. .p-layer {
  646. font-family: 'Kingsoft_Cloud_Font';
  647. line-height: 32px;
  648. font-weight: 500;
  649. font-size: 20px;
  650. color: #cccccc;
  651. border-bottom: 1px solid #0b2066;
  652. .hao {
  653. color: #99b1ff;
  654. }
  655. }
  656. .dtl-item {
  657. font-weight: 400;
  658. font-size: 18px;
  659. color: #808080;
  660. margin-top: 6px;
  661. .zhi {
  662. color: #fff;
  663. }
  664. }
  665. }
  666. </style>