accidentDialog.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  1. <template>
  2. <u-popup :show="visible" mode="bottom" :round="10" :closeOnClickOverlay="false" @close="cancel"
  3. class="accident-popup">
  4. <view class="popup-content">
  5. <view class="popup-header"><text class="popup-title">{{ dialogTitle }}</text>
  6. <view class="close-btn" @click="cancel">×</view>
  7. </view>
  8. <scroll-view class="popup-body" scroll-y>
  9. <view class="card-a">
  10. <!-- 事故事件信息 -->
  11. <view class="card-section">
  12. <view class="section-title">📋 事故事件信息</view>
  13. <u--form labelPosition="left" labelWidth="190rpx" :model="form" :rules="rules" ref="formRef">
  14. <u-form-item label="事故事件名称" prop="acdntName" borderBottom required>
  15. <u--input v-model="form.acdntName" placeholder="请输入" :disabled="isView" border="none"
  16. inputAlign="right" />
  17. </u-form-item>
  18. <u-form-item label="发生时间" prop="occurrenceTime" borderBottom required>
  19. <view class="picker-value" @click="!isView && showDateTimePicker('occurrenceTime')">
  20. {{ form.occurrenceTime || "请选择" }}
  21. </view>
  22. <u-icon slot="right" name="arrow-right" />
  23. </u-form-item>
  24. <u-form-item label="事故发生地点" prop="acdntPlace" borderBottom required>
  25. <u--input v-model="form.acdntPlace" placeholder="请输入" :disabled="isView" border="none"
  26. inputAlign="right" />
  27. </u-form-item>
  28. <u-form-item label="来源类型" borderBottom>
  29. <view class="picker-value" @click="!isView && showSourceTypePicker()">
  30. {{ getSourceTypeLabel(form.sourceType) || "请选择" }}
  31. </view>
  32. <u-icon slot="right" name="arrow-right" />
  33. </u-form-item>
  34. <u-form-item label="来源单据名称" borderBottom>
  35. <u--input v-model="form.sourceName" placeholder="请选择" readonly :disabled="isView"
  36. border="none" inputAlign="right" @click="addSource" />
  37. </u-form-item>
  38. <u-form-item label="事故事件经过" prop="acdntPass" borderBottom required>
  39. <u--textarea v-model="form.acdntPass" placeholder="请输入" :disabled="isView"
  40. height="120rpx" />
  41. </u-form-item>
  42. <!-- 修复:上报人使用 userOpen('report') -->
  43. <u-form-item label="上报人" prop="reportPersonName" borderBottom @click="userOpen('report')">
  44. <u--input v-model="form.reportPersonName" placeholder="请选择" :disabled="isView"
  45. border="none" inputAlign="right" />
  46. </u-form-item>
  47. <u-form-item label="上报部门" borderBottom>
  48. <u--input v-model="form.reportDeptName" disabled border="none" inputAlign="right" />
  49. </u-form-item>
  50. <u-form-item label="上报时间" prop="reportTime" borderBottom required>
  51. <view class="picker-value" @click="!isView && showDateTimePicker('reportTime')">
  52. {{ form.reportTime || "请选择" }}
  53. </view>
  54. <u-icon slot="right" name="arrow-right" />
  55. </u-form-item>
  56. </u--form>
  57. </view>
  58. <!-- 调查处理信息 -->
  59. <view class="card-section" v-if="!isView || form.acdntLevelId">
  60. <view class="section-title">🔍 调查处理信息</view>
  61. <u--form labelPosition="left" labelWidth="180rpx" :model="form" ref="form2Ref">
  62. <u-form-item label="事故级别" prop="acdntLevelId" borderBottom required>
  63. <DictSelection dictName="事故级别" clearable :disabled="isView"
  64. v-model="form.acdntLevelId" />
  65. </u-form-item>
  66. <u-form-item label="事故事件类型" prop="acdntTypeId" borderBottom required labelWidth="190rpx">
  67. <DictSelection dictName="事故事件类型" clearable :disabled="isView"
  68. v-model="form.acdntTypeId" />
  69. </u-form-item>
  70. <u-form-item label="事故原因" prop="acdntCauselText" borderBottom>
  71. <u--textarea v-model="form.acdntCauselText" placeholder="请输入" :disabled="isView"
  72. height="120rpx" />
  73. </u-form-item>
  74. <!-- 事故责任人 -->
  75. <u-form-item label="事故责任人" prop="dutyPersonName" borderBottom @click="userOpen('duty')">
  76. <u--input v-model="form.dutyPersonName" placeholder="请选择" :disabled="isView"
  77. border="none" inputAlign="right" />
  78. </u-form-item>
  79. <u-form-item label="责任单位" borderBottom>
  80. <u--input v-model="form.dutyUnitName" disabled border="none" inputAlign="right" />
  81. </u-form-item>
  82. <u-form-item label="间接经济损失(万元)" borderBottom>
  83. <u--input v-model="form.indirectEconomicLoss" type="number" placeholder="请输入"
  84. :disabled="isView" border="none" inputAlign="right" />
  85. </u-form-item>
  86. <u-form-item label="直接经济损失(万元)" borderBottom>
  87. <u--input v-model="form.directEconomicLoss" type="number" placeholder="请输入"
  88. :disabled="isView" border="none" inputAlign="right" />
  89. </u-form-item>
  90. </u--form>
  91. </view>
  92. <!-- ===== 伤亡人员列表(修改部分) ===== -->
  93. <view class="card-section">
  94. <view class="section-title">👥 伤亡人员列表
  95. <text class="add-btn" v-if="!isView" @click="userOpen('casualty')">+ 添加</text>
  96. </view>
  97. <view v-for="(p, idx) in form.ehsAccidentCasualtiesVOList" :key="idx" class="person-card">
  98. <!-- 第一行:姓名 + 部门 + 删除按钮 -->
  99. <view class="person-header">
  100. <view class="person-info">
  101. <text class="name">{{ p.userName || '-' }}</text>
  102. <text class="dept">{{ p.userDeptName || '-' }}</text>
  103. </view>
  104. <text class="delete-btn" v-if="!isView" @click="removeCasualty(idx)">✕</text>
  105. </view>
  106. <!-- 第二行:受伤程度(独占一行) -->
  107. <view class="field-row" @click="!isView && showInjuryPickerFn(idx)">
  108. <text class="field-label">受伤程度</text>
  109. <view class="field-value-wrapper">
  110. <text class="field-value" :class="{ placeholder: !getInjuryLabel(p.injuryDegree) }">
  111. {{ getInjuryLabel(p.injuryDegree) || '请选择' }}
  112. </text>
  113. <u-icon v-if="!isView" name="arrow-right" size="28" color="#999" />
  114. </view>
  115. </view>
  116. <!-- 第三行:损失工作日(独占一行) -->
  117. <view class="field-row">
  118. <text class="field-label">损失工作日</text>
  119. <view class="field-value-wrapper">
  120. <input class="days-input" v-model="p.lostWorkDays" type="number"
  121. placeholder="请输入" :disabled="isView" />
  122. </view>
  123. </view>
  124. </view>
  125. <view v-if="form.ehsAccidentCasualtiesVOList.length === 0" class="empty-tip">暂无伤亡人员</view>
  126. </view>
  127. </view>
  128. </scroll-view>
  129. <view class="popup-footer">
  130. <u-button type="default" @click="cancel">取消</u-button>
  131. <u-button v-if="!isView" type="primary" @click="save" :loading="loading">保存</u-button>
  132. </view>
  133. </view>
  134. <!-- 字典选择器 -->
  135. <u-action-sheet :show="showDictPopup" :actions="dictActions" @close="showDictPopup = false"
  136. @select="onDictSelect" />
  137. <!-- 受伤程度选择器(新增) -->
  138. <u-action-sheet :show="showInjuryPicker" :actions="injuryActions" title="请选择受伤程度"
  139. @close="showInjuryPicker = false" @select="onInjurySelect" />
  140. <!-- 日期时间选择器 -->
  141. <u-datetime-picker :show="showDateTimePopup" v-model="datetimeValue" mode="datetime"
  142. @confirm="onDateTimeConfirm" @cancel="showDateTimePopup = false" />
  143. <!-- 人员选择 -->
  144. <selectUserDialog ref="userSelectRef" @confirm="changePersonel" />
  145. <!-- 演练工单选择 -->
  146. <drillOrderSelect ref="drillOrderSelectRef" @confirm="onDrillOrderConfirm" />
  147. <u-toast ref="uToast" />
  148. </u-popup>
  149. </template>
  150. <script>
  151. import drillOrderSelect from "./drillOrderSelect.vue";
  152. import selectUserDialog from "@/components/selectUserDialog.vue";
  153. import {
  154. save,
  155. getById
  156. } from "@/api/accidentReport/index.js";
  157. import dictMixins from "@/mixins/dictMixins";
  158. import DictSelection from "@/components/Dict/DictSelection.vue";
  159. const defForm = {
  160. acdntName: "",
  161. occurrenceTime: "",
  162. acdntPlace: "",
  163. acdntPass: "",
  164. sourceType: "",
  165. sourceName: "",
  166. sourceId: "",
  167. reportPersonName: "",
  168. reportPersonUserId: "",
  169. reportDeptName: "",
  170. reportDeptId: "",
  171. reportTime: "",
  172. acdntLevelId: "",
  173. acdntTypeId: "",
  174. acdntCauselText: "",
  175. dutyUnitId: "",
  176. dutyUnitName: "",
  177. dutyPersonName: "",
  178. dutyPersonId: "",
  179. indirectEconomicLoss: undefined,
  180. directEconomicLoss: undefined,
  181. ehsAccidentCasualtiesVOList: [],
  182. };
  183. export default {
  184. components: {
  185. selectUserDialog,
  186. drillOrderSelect,
  187. DictSelection
  188. },
  189. mixins: [dictMixins],
  190. data() {
  191. return {
  192. visible: false,
  193. loading: false,
  194. dialogType: "add",
  195. userKey: "",
  196. form: JSON.parse(JSON.stringify(defForm)),
  197. // 受伤程度选项
  198. injuryDegreeOptions: [{
  199. value: "1",
  200. label: "轻微伤"
  201. },
  202. {
  203. value: "2",
  204. label: "轻伤二级"
  205. },
  206. {
  207. value: "3",
  208. label: "轻微一级"
  209. },
  210. {
  211. value: "4",
  212. label: "重伤二级"
  213. },
  214. {
  215. value: "5",
  216. label: "重伤一级"
  217. },
  218. ],
  219. // 受伤程度选择器
  220. showInjuryPicker: false,
  221. injuryActions: [],
  222. currentInjuryIndex: -1,
  223. // 字典选择器
  224. showDictPopup: false,
  225. dictActions: [],
  226. dictField: "",
  227. // 日期时间选择器
  228. showDateTimePopup: false,
  229. datetimeValue: 0,
  230. dateField: "",
  231. // 表单校验规则
  232. rules: {
  233. acdntName: {
  234. required: true,
  235. message: "请输入事故事件名称"
  236. },
  237. occurrenceTime: {
  238. required: true,
  239. message: "请选择发生时间"
  240. },
  241. acdntPlace: {
  242. required: true,
  243. message: "请输入事故发生地点"
  244. },
  245. acdntPass: {
  246. required: true,
  247. message: "请输入事故事件经过"
  248. },
  249. reportTime: {
  250. required: true,
  251. message: "请选择上报时间"
  252. },
  253. acdntLevelId: {
  254. required: true,
  255. message: "请选择事故级别"
  256. },
  257. acdntTypeId: {
  258. required: true,
  259. message: "请选择事故事件类型"
  260. },
  261. },
  262. };
  263. },
  264. computed: {
  265. dialogTitle() {
  266. const map = {
  267. add: "新增事故上报",
  268. edit: "编辑事故上报",
  269. view: "查看事故上报"
  270. };
  271. return map[this.dialogType] || "事故上报";
  272. },
  273. isView() {
  274. return this.dialogType === "view";
  275. },
  276. },
  277. methods: {
  278. // ===== 打开弹窗 =====
  279. async open(row, type = "add") {
  280. this.visible = true;
  281. this.dialogType = type;
  282. if (row && row.id) {
  283. const data = await getById(row.id);
  284. this.form = {
  285. ...JSON.parse(JSON.stringify(defForm)),
  286. ...data
  287. };
  288. if (!this.form.ehsAccidentCasualtiesVOList)
  289. this.form.ehsAccidentCasualtiesVOList = [];
  290. } else {
  291. this.form = JSON.parse(JSON.stringify(defForm));
  292. const userInfo = uni.getStorageSync("userInfo") || {};
  293. this.form.reportPersonName = userInfo.name || "";
  294. this.form.reportPersonUserId = userInfo.userId || "";
  295. this.form.reportDeptName = userInfo.groupName || "";
  296. this.form.reportDeptId = userInfo.groupId || "";
  297. }
  298. this.$nextTick(() => {
  299. if (this.$refs.formRef) this.$refs.formRef.setRules(this.rules);
  300. });
  301. },
  302. // ===== 关闭弹窗 =====
  303. cancel() {
  304. this.visible = false;
  305. this.form = JSON.parse(JSON.stringify(defForm));
  306. this.showInjuryPicker = false;
  307. this.showDictPopup = false;
  308. this.showDateTimePopup = false;
  309. },
  310. // ===== 日期时间选择器 =====
  311. showDateTimePicker(field) {
  312. if (this.isView) return;
  313. this.dateField = field;
  314. this.datetimeValue = this.form[field] ?
  315. new Date(this.form[field]).getTime() :
  316. Date.now();
  317. this.showDateTimePopup = true;
  318. },
  319. onDateTimeConfirm(e) {
  320. this.showDateTimePopup = false;
  321. this.form[this.dateField] = this.$u.timeFormat(
  322. e.value,
  323. "yyyy-mm-dd hh:MM:ss",
  324. );
  325. },
  326. // ===== 字典选择器 =====
  327. onDictSelect(e) {
  328. this.showDictPopup = false;
  329. this.form[this.dictField] = e.value;
  330. if (this.$refs.formRef) this.$refs.formRef.validateField(this.dictField);
  331. },
  332. // ===== 来源类型 =====
  333. getSourceTypeLabel(val) {
  334. const map = {
  335. 1: "应急演练工单"
  336. };
  337. return map[val] || "";
  338. },
  339. showSourceTypePicker() {
  340. if (this.isView) return;
  341. this.dictField = "sourceType";
  342. this.dictActions = [{
  343. name: "应急演练工单",
  344. value: "1"
  345. }];
  346. this.showDictPopup = true;
  347. },
  348. // ===== 来源单据 =====
  349. addSource() {
  350. if (this.isView) return;
  351. if (!this.form.sourceType) {
  352. this.$refs.uToast.show({
  353. type: "warning",
  354. message: "请先选择来源类型",
  355. });
  356. return;
  357. }
  358. if (this.form.sourceType == "1") this.$refs.drillOrderSelectRef.open();
  359. },
  360. onDrillOrderConfirm(data) {
  361. this.form.sourceName = data.name || "";
  362. this.form.sourceId = data.id || "";
  363. this.form.acdntPlace = data.planLocation || "";
  364. },
  365. // ===== 人员选择 =====
  366. userOpen(key) {
  367. if (this.isView || this.loading) return;
  368. this.userKey = key;
  369. if (key === "report" || key === "duty") {
  370. this.$refs.userSelectRef.open(2); // 单选
  371. }
  372. if (key === "casualty") {
  373. this.$refs.userSelectRef.open(1); // 多选
  374. }
  375. },
  376. changePersonel(data) {
  377. if (!data || data.length === 0) return;
  378. if (this.userKey === "report") {
  379. const person = data[0];
  380. this.form.reportPersonName = person.name || "";
  381. this.form.reportPersonUserId = person.id || "";
  382. this.form.reportDeptName = person.groupName || "";
  383. this.form.reportDeptId = person.groupId || "";
  384. } else if (this.userKey === "duty") {
  385. const person = data[0];
  386. this.form.dutyPersonName = person.name || "";
  387. this.form.dutyPersonId = person.id || "";
  388. this.form.dutyUnitName = person.groupName || "";
  389. this.form.dutyUnitId = person.groupId || "";
  390. } else if (this.userKey === "casualty") {
  391. data.forEach((person) => {
  392. this.form.ehsAccidentCasualtiesVOList.push({
  393. userId: person.id || "",
  394. userName: person.name || "",
  395. userDeptId: person.groupId || "",
  396. userDeptName: person.groupName || "",
  397. injuryDegree: "",
  398. lostWorkDays: undefined,
  399. accidentId: this.form.id || "",
  400. });
  401. });
  402. }
  403. },
  404. // ===== 伤亡人员 - 受伤程度(u-action-sheet) =====
  405. showInjuryPickerFn(index) {
  406. if (this.isView) return;
  407. this.currentInjuryIndex = index;
  408. this.injuryActions = this.injuryDegreeOptions.map((item) => ({
  409. name: item.label,
  410. value: item.value,
  411. }));
  412. this.showInjuryPicker = true;
  413. },
  414. onInjurySelect(e) {
  415. this.showInjuryPicker = false;
  416. if (this.currentInjuryIndex >= 0) {
  417. this.$set(
  418. this.form.ehsAccidentCasualtiesVOList[this.currentInjuryIndex],
  419. "injuryDegree",
  420. e.value,
  421. );
  422. }
  423. this.currentInjuryIndex = -1;
  424. },
  425. // ===== 伤亡人员 - 辅助方法 =====
  426. getInjuryLabel(val) {
  427. const item = this.injuryDegreeOptions.find((i) => i.value == val);
  428. return item ? item.label : "";
  429. },
  430. // ===== 伤亡人员 - 删除 =====
  431. removeCasualty(idx) {
  432. this.form.ehsAccidentCasualtiesVOList.splice(idx, 1);
  433. },
  434. // ===== 保存 =====
  435. async save() {
  436. try {
  437. await this.$refs.formRef.validate();
  438. // 填充分类名称
  439. this.form.acdntLevelName = this.getDictValue(
  440. "事故级别",
  441. this.form.acdntLevelId,
  442. );
  443. this.form.acdntTypeName = this.getDictValue(
  444. "事故事件类型",
  445. this.form.acdntTypeId,
  446. );
  447. this.loading = true;
  448. await save(this.form);
  449. this.$refs.uToast.show({
  450. type: "success",
  451. message: "保存成功"
  452. });
  453. this.cancel();
  454. this.$emit("reload");
  455. } catch (e) {
  456. if (e && e.message)
  457. this.$refs.uToast.show({
  458. type: "error",
  459. message: e.message
  460. });
  461. } finally {
  462. this.loading = false;
  463. }
  464. },
  465. },
  466. };
  467. </script>
  468. <style lang="scss" scoped>
  469. .accident-popup {
  470. /deep/ .u-popup__content {
  471. border-radius: 32rpx 32rpx 0 0;
  472. overflow: hidden;
  473. }
  474. }
  475. .popup-content {
  476. height: calc(100vh - 100px);
  477. display: flex;
  478. flex-direction: column;
  479. background: #eff2f7;
  480. }
  481. .popup-header {
  482. display: flex;
  483. justify-content: space-between;
  484. align-items: center;
  485. padding: 30rpx 32rpx;
  486. background: #fff;
  487. border-bottom: 2rpx solid #eef2f6;
  488. flex-shrink: 0;
  489. .popup-title {
  490. font-size: 36rpx;
  491. font-weight: bold;
  492. color: #1f2b3c;
  493. }
  494. .close-btn {
  495. width: 60rpx;
  496. height: 60rpx;
  497. display: flex;
  498. align-items: center;
  499. justify-content: center;
  500. font-size: 52rpx;
  501. color: #8e9aae;
  502. }
  503. }
  504. .popup-body {
  505. flex: 1;
  506. overflow-y: auto;
  507. padding: 24rpx;
  508. }
  509. .card-a {
  510. background: #fff;
  511. border-radius: 48rpx;
  512. box-shadow: 0 12rpx 40rpx rgba(0, 0, 0, 0.05);
  513. overflow: hidden;
  514. }
  515. .card-section {
  516. padding: 30rpx 32rpx;
  517. &:not(:last-child) {
  518. border-bottom: 2rpx solid #f0f2f5;
  519. }
  520. }
  521. .section-title {
  522. font-size: 30rpx;
  523. font-weight: 700;
  524. color: #1f2a44;
  525. margin-bottom: 24rpx;
  526. padding-left: 16rpx;
  527. border-left: 6rpx solid #4caf50;
  528. display: flex;
  529. justify-content: space-between;
  530. align-items: center;
  531. .add-btn {
  532. font-size: 26rpx;
  533. color: #2979ff;
  534. font-weight: normal;
  535. padding: 4rpx 16rpx;
  536. background: #e8f0fe;
  537. border-radius: 30rpx;
  538. }
  539. }
  540. // ===== u--form 样式 =====
  541. /deep/ .u-form-item {
  542. padding: 12rpx 0;
  543. .u-form-item__body__left__label {
  544. font-size: 26rpx !important;
  545. color: #6c7a91 !important;
  546. }
  547. .u-input__content__field-wrapper__field {
  548. font-size: 26rpx !important;
  549. text-align: right;
  550. }
  551. }
  552. .picker-value {
  553. font-size: 26rpx;
  554. color: #1e2a3a;
  555. text-align: right;
  556. flex: 1;
  557. min-height: 44rpx;
  558. padding: 4rpx 0;
  559. }
  560. // ===== 伤亡人员卡片(新增样式) =====
  561. .person-card {
  562. background: #f5f7fb;
  563. border-radius: 16rpx;
  564. padding: 16rpx 20rpx;
  565. margin-bottom: 16rpx;
  566. &:last-child {
  567. margin-bottom: 0;
  568. }
  569. // 第一行:姓名 + 部门 + 删除
  570. .person-header {
  571. display: flex;
  572. justify-content: space-between;
  573. align-items: center;
  574. margin-bottom: 16rpx;
  575. .person-info {
  576. display: flex;
  577. align-items: center;
  578. gap: 20rpx;
  579. flex: 1;
  580. min-width: 0;
  581. .name {
  582. font-size: 28rpx;
  583. font-weight: 600;
  584. color: #1f2b3c;
  585. }
  586. .dept {
  587. font-size: 24rpx;
  588. color: #8e9aae;
  589. }
  590. }
  591. .delete-btn {
  592. color: #f56c6c;
  593. font-size: 32rpx;
  594. padding: 0 8rpx;
  595. flex-shrink: 0;
  596. }
  597. }
  598. // 字段行:受伤程度 / 损失工作日(各独占一行)
  599. .field-row {
  600. display: flex;
  601. align-items: center;
  602. justify-content: space-between;
  603. padding: 8rpx 0;
  604. .field-label {
  605. font-size: 26rpx;
  606. color: #6c7a91;
  607. flex-shrink: 0;
  608. width: 140rpx;
  609. }
  610. .field-value-wrapper {
  611. flex: 1;
  612. display: flex;
  613. align-items: center;
  614. justify-content: flex-end;
  615. gap: 8rpx;
  616. min-width: 0;
  617. .field-value {
  618. font-size: 26rpx;
  619. color: #1e2a3a;
  620. &.placeholder {
  621. color: #bbb;
  622. }
  623. }
  624. .days-input {
  625. width: 100%;
  626. background: #fff;
  627. border-radius: 30rpx;
  628. padding: 0 16rpx;
  629. height: 50rpx;
  630. font-size: 24rpx;
  631. border: 2rpx solid #e9edf2;
  632. text-align: right;
  633. &:disabled {
  634. background: #f5f5f5;
  635. color: #999;
  636. }
  637. }
  638. }
  639. }
  640. }
  641. .empty-tip {
  642. text-align: center;
  643. font-size: 26rpx;
  644. color: #aaa;
  645. padding: 30rpx 0;
  646. }
  647. .popup-footer {
  648. display: flex;
  649. padding: 16rpx 24rpx;
  650. background: #fff;
  651. border-top: 2rpx solid #eef2f6;
  652. gap: 16rpx;
  653. flex-shrink: 0;
  654. /deep/ .u-button {
  655. flex: 1;
  656. border-radius: 48rpx;
  657. height: 72rpx;
  658. }
  659. }
  660. </style>