reportDetail.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924
  1. <template>
  2. <view class="maintenance-container">
  3. <uni-nav-bar fixed="true" statusBar="true" left-icon="back" title="报工信息" @clickLeft="back"></uni-nav-bar>
  4. <view class="maintenance-wrapper">
  5. <view class="maintenance-content">
  6. <scroll-view :scroll-y='true' class="kd-baseInfo">
  7. <view class="kd-cell">
  8. <text class="kd-label">开始里程</text>
  9. <uni-easyinput v-model="formData.startMileage" type="number" :clearable="false" :inputBorder="false" @blur="validateStartMileage">
  10. <template #right>
  11. <view>KM</view>
  12. </template>
  13. </uni-easyinput>
  14. </view>
  15. <view class="kd-cell">
  16. <text class="kd-label">结束里程</text>
  17. <uni-easyinput v-model="formData.endMileage" type="number" :clearable="false" :inputBorder="false" @blur="validateEndMileage">
  18. <template #right>
  19. <view>KM</view>
  20. </template>
  21. </uni-easyinput>
  22. </view>
  23. <view class="kd-cell">
  24. <text class="kd-label">总里程</text>
  25. <uni-easyinput v-model="formData.mileage" type="number" :clearable="false" :inputBorder="false" :disabled="true">
  26. <template #right>
  27. <view>KM</view>
  28. </template>
  29. </uni-easyinput>
  30. </view>
  31. <view class="kd-cell" style="display: block;">
  32. <text class="kd-label">开始里程图片</text>
  33. <view class="image-list">
  34. <view class="image-item" v-for="(img, index) in (formData.startMileageImages || [])" :key="index">
  35. <image :src="getImageUrl(img)" mode="aspectFill" @click="previewImage(formData.startMileageImages, index)"></image>
  36. <view class="delete-btn" v-if="formData.status == 1" @click="deleteImage('start', index)">×</view>
  37. </view>
  38. <view class="image-add" v-if="formData.status == 1 && (!formData.startMileageImages || formData.startMileageImages.length < 9)" @click="chooseImage('start')">
  39. <text>+</text>
  40. </view>
  41. </view>
  42. </view>
  43. <view class="kd-cell" style="display: block;">
  44. <text class="kd-label">结束里程图片</text>
  45. <view class="image-list">
  46. <view class="image-item" v-for="(img, index) in (formData.endMileageImages || [])" :key="index">
  47. <image :src="getImageUrl(img)" mode="aspectFill" @click="previewImage(formData.endMileageImages, index)"></image>
  48. <view class="delete-btn" v-if="formData.status == 1" @click="deleteImage('end', index)">×</view>
  49. </view>
  50. <view class="image-add" v-if="formData.status == 1 && (!formData.endMileageImages || formData.endMileageImages.length < 9)" @click="chooseImage('end')">
  51. <text>+</text>
  52. </view>
  53. </view>
  54. </view>
  55. <template v-if="formData.costList && formData.costList.length > 0">
  56. <view class="kd-cell-divider"></view>
  57. <view class="kd-cell">
  58. <text class="kd-label">费用信息</text>
  59. <text class="kd-content"></text>
  60. </view>
  61. <view v-for="(item, index) in formData.costList" :key="index">
  62. <view class="kd-cell">
  63. <text class="kd-label">费用类型</text>
  64. <text class="kd-content">{{ getDict('logistic_list_cost_type', item.costType) }}</text>
  65. </view>
  66. <view class="kd-cell">
  67. <text class="kd-label">金额</text>
  68. <text class="kd-content">{{ item.cost }}</text>
  69. </view>
  70. <view class="kd-cell">
  71. <text class="kd-label">备注</text>
  72. <text class="kd-content">{{ item.remark }}</text>
  73. </view>
  74. <view v-if="formData.status == 1" style="float: right;">
  75. <button class="btn-reassignment del" type="primary" @click="handleDelFee(index)">删除</button>
  76. </view>
  77. </view>
  78. </template>
  79. <template v-else>
  80. <view class="kd-cell">
  81. <text class="kd-label">费用信息</text>
  82. <text class="kd-content" style="color: #999;">暂无费用信息</text>
  83. </view>
  84. </template>
  85. </scroll-view>
  86. <template v-if="formData.status == 1">
  87. <button class="btn-execute" type="primary" @click="handleExecute(2)">保存</button>
  88. <button class="btn-reassignment" type="primary" @click="handleAddFee">新增费用</button>
  89. </template>
  90. <template v-else>
  91. <button class="btn-execute" type="primary" @click="back(1)">返回</button>
  92. </template>
  93. </view>
  94. </view>
  95. <u-popup :show="popShow" @close="close">
  96. <view class="select-container">
  97. <view class="title">
  98. <text class="btn cancel" @tap="close">取消</text>
  99. 新增费用
  100. <text class="btn confirm" @tap="submit">确定</text>
  101. </view>
  102. <view class="select-wrapper">
  103. <view class="col deptInp">
  104. <text class="label">费用类型:</text>
  105. <zxz-uni-data-select :localdata="costTypeList" v-model="form.costType" filterable></zxz-uni-data-select>
  106. </view>
  107. <view class="col userInp">
  108. <text class="label">金额:</text>
  109. <uni-easyinput v-model="form.cost" type='number'></uni-easyinput>
  110. </view>
  111. <view class="col userInp">
  112. <text class="label">备注:</text>
  113. <uni-easyinput v-model="form.remark" type='textarea'></uni-easyinput>
  114. </view>
  115. </view>
  116. </view>
  117. </u-popup>
  118. </view>
  119. </template>
  120. <script>
  121. import {
  122. logistictraklistnoteUpdateAPI
  123. } from '@/api/pda/dispatchManage/index.js'
  124. export default {
  125. components: {},
  126. data() {
  127. return {
  128. costTypeList: [],
  129. form: {},
  130. popShow: false,
  131. value: '',
  132. info: {},
  133. formData: {
  134. costList: []
  135. },
  136. isSubmitting: false // 防重复提交标志
  137. }
  138. },
  139. onLoad(options) {
  140. console.log('options~~~', options)
  141. let initData = JSON.parse(options.item)
  142. const apiInfo = uni.getStorageSync('apiInfo')
  143. const orgin =
  144. apiInfo.hostname &&
  145. `${apiInfo.protocal || ''}${apiInfo.hostname || ''}:${apiInfo.port || ''}`
  146. // 处理开始里程图片(使用路径生成URL,同步ID)
  147. initData.startMileageImages = initData.startMileageImagesPaths
  148. ? initData.startMileageImagesPaths.split(',').map((path, index) => ({
  149. id: initData.startMileageImagesFileIds.split(',')[index] || '', // 对应ID
  150. url: `${orgin}/api/main/file/getFile?objectName=${path}`, // 使用路径作为参数
  151. status: 'done'
  152. }))
  153. : [];
  154. // 处理结束里程图片(同上)
  155. initData.endMileageImages = initData.endMileageImagesPaths
  156. ? initData.endMileageImagesPaths.split(',').map((path, index) => ({
  157. id: initData.endMileageImagesFileIds.split(',')[index] || '',
  158. url: `${orgin}/api/main/file/getFile?objectName=${path}`,
  159. status: 'done'
  160. }))
  161. : [];
  162. this.formData = initData
  163. console.log('initData~~~', initData)
  164. this.costTypeList = this.formData.dictList['logistic_list_cost_type'].map(item => {
  165. let values = Object.keys(item)
  166. return {
  167. text: item[values[0]],
  168. value: values[0],
  169. }
  170. })
  171. },
  172. computed: {
  173. getDict() {
  174. return (dictName, val) => {
  175. let find = this.formData.dictList[dictName].find(item => item[val]) || {}
  176. return find[val] ? find[val] : ''
  177. }
  178. },
  179. // 获取图片URL
  180. getImageUrl() {
  181. return (img) => {
  182. if (typeof img === 'string') {
  183. return img
  184. }
  185. return img.url
  186. }
  187. }
  188. },
  189. methods: {
  190. back(num = 1) {
  191. uni.navigateBack({
  192. delta: num
  193. })
  194. },
  195. // 验证开始里程
  196. validateStartMileage() {
  197. const start = parseFloat(this.formData.startMileage)
  198. const end = parseFloat(this.formData.endMileage)
  199. if (start !== 0 && !start) {
  200. uni.showToast({
  201. icon: 'none',
  202. title: '请输入开始里程'
  203. })
  204. return
  205. }
  206. if (start && end && start >= end) {
  207. uni.showToast({
  208. icon: 'none',
  209. title: '开始里程必须小于结束里程'
  210. })
  211. this.formData.startMileage = ''
  212. this.formData.mileage = ''
  213. } else if (start !== '' && end !== '') {
  214. this.calcTotalMileage()
  215. }
  216. },
  217. // 验证结束里程
  218. validateEndMileage() {
  219. const start = parseFloat(this.formData.startMileage)
  220. const end = parseFloat(this.formData.endMileage)
  221. if (!end) {
  222. uni.showToast({
  223. icon: 'none',
  224. title: '请输入结束里程'
  225. })
  226. return
  227. }
  228. if (start && end && end <= start) {
  229. uni.showToast({
  230. icon: 'none',
  231. title: '结束里程必须大于开始里程'
  232. })
  233. this.formData.endMileage = ''
  234. this.formData.mileage = ''
  235. } else if (start !== '' && end !== '') {
  236. this.calcTotalMileage()
  237. }
  238. },
  239. // 计算总里程
  240. calcTotalMileage() {
  241. const start = parseFloat(this.formData.startMileage) || 0
  242. const end = parseFloat(this.formData.endMileage) || 0
  243. this.formData.mileage = (end - start).toFixed(2)
  244. },
  245. // 选择图片
  246. chooseImage(type) {
  247. const maxCount = 9
  248. const currentImages = type === 'start' ? (this.formData.startMileageImages || []) : (this.formData.endMileageImages || [])
  249. const remainingCount = maxCount - currentImages.length
  250. if (remainingCount <= 0) {
  251. uni.showToast({
  252. icon: 'none',
  253. title: '最多上传9张图片'
  254. })
  255. return
  256. }
  257. uni.chooseImage({
  258. count: remainingCount,
  259. sizeType: ['compressed'],
  260. sourceType: ['camera', 'album'],
  261. success: (res) => {
  262. const tempFilePaths = res.tempFilePaths
  263. this.uploadImages(tempFilePaths, type)
  264. }
  265. })
  266. },
  267. // 上传多张图片
  268. async uploadImages(filePaths, type) {
  269. uni.showLoading({
  270. title: '上传中...'
  271. })
  272. const uploadPromises = filePaths.map(filePath => {
  273. return new Promise((resolve, reject) => {
  274. uni.uploadFile({
  275. url: this.apiUrl + '/main/file/upload',
  276. filePath: filePath,
  277. name: 'multiPartFile',
  278. header: {
  279. authorization: uni.getStorageSync("token")
  280. },
  281. success: (res) => {
  282. const data = JSON.parse(res.data)
  283. console.log('data~~~', data)
  284. if (data.code == 0) {
  285. // 构建完整的图片URL
  286. // const fileNames = data.data.storePath.split('/')
  287. // const url = this.apiUrl +
  288. // '/main/file/getFile?objectName=' + data.data.storePath +
  289. // '&fullfilename=' + fileNames[fileNames.length - 1]
  290. resolve(data.data)
  291. } else {
  292. reject(data.message || '上传失败')
  293. }
  294. },
  295. fail: () => {
  296. reject('上传失败')
  297. }
  298. })
  299. })
  300. })
  301. try {
  302. const results = await Promise.all(uploadPromises)
  303. console.log('results~~~', results)
  304. if (type === 'start') {
  305. if (!this.formData.startMileageImages) {
  306. this.formData.startMileageImages = []
  307. }
  308. this.formData.startMileageImages.push(...results)
  309. } else {
  310. if (!this.formData.endMileageImages) {
  311. this.formData.endMileageImages = []
  312. }
  313. this.formData.endMileageImages.push(...results)
  314. }
  315. console.log('startMileageImages~~~', this.formData.startMileageImages)
  316. // 强制更新视图
  317. this.$forceUpdate()
  318. uni.hideLoading()
  319. uni.showToast({
  320. title: '上传成功',
  321. icon: 'success'
  322. })
  323. } catch (error) {
  324. uni.hideLoading()
  325. uni.showToast({
  326. title: error || '上传失败',
  327. icon: 'none'
  328. })
  329. }
  330. },
  331. // 删除图片
  332. deleteImage(type, index) {
  333. uni.showModal({
  334. title: '确认删除',
  335. content: '确定要删除这张图片吗?',
  336. confirmColor: '#157A2C',
  337. success: res => {
  338. if (res.confirm) {
  339. console.log('index~~~', index)
  340. if (type === 'start') {
  341. this.formData.startMileageImages.splice(index, 1)
  342. } else {
  343. this.formData.endMileageImages.splice(index, 1)
  344. }
  345. this.$forceUpdate();
  346. console.log('startMileageImages~~~', this.formData.startMileageImages)
  347. console.log('endMileageImages~~~', this.formData.endMileageImages)
  348. }
  349. }
  350. })
  351. },
  352. // 预览图片
  353. previewImage(images, index) {
  354. // 处理图片数据,确保是字符串数组
  355. const urls = images.map(img => {
  356. if (typeof img === 'string') {
  357. return img
  358. } else if (img && img.url) {
  359. return img.url
  360. }
  361. return ''
  362. }).filter(url => url) // 过滤掉空字符串
  363. uni.previewImage({
  364. urls: urls,
  365. current: index
  366. })
  367. },
  368. async handleExecute(status) {
  369. // 防重复提交检查
  370. if (this.isSubmitting) {
  371. return
  372. }
  373. this.isSubmitting = true
  374. try {
  375. // 验证开始里程(允许0,但不允许负数、空值或NaN)
  376. if (this.formData.startMileage === '' || this.formData.startMileage === null || this.formData.startMileage === undefined || isNaN(this.formData.startMileage) || parseFloat(this.formData.startMileage) < 0) {
  377. uni.showToast({
  378. icon: 'none',
  379. title: '请输入有效的开始里程'
  380. })
  381. return
  382. }
  383. // 验证结束里程(不允许为0、负数、空值或NaN)
  384. if (!this.formData.endMileage || isNaN(this.formData.endMileage) || parseFloat(this.formData.endMileage) <= 0) {
  385. uni.showToast({
  386. icon: 'none',
  387. title: '请输入有效的结束里程'
  388. })
  389. return
  390. }
  391. // 验证里程关系:结束里程必须大于开始里程
  392. if (parseFloat(this.formData.endMileage) <= parseFloat(this.formData.startMileage)) {
  393. uni.showToast({
  394. icon: 'none',
  395. title: '结束里程必须大于开始里程'
  396. })
  397. return
  398. }
  399. // 验证开始里程图片
  400. if (!this.formData.startMileageImages || this.formData.startMileageImages.length === 0) {
  401. uni.showToast({
  402. icon: 'none',
  403. title: '请上传开始里程图片'
  404. })
  405. return
  406. }
  407. // 验证结束里程图片
  408. if (!this.formData.endMileageImages || this.formData.endMileageImages.length === 0) {
  409. uni.showToast({
  410. icon: 'none',
  411. title: '请上传结束里程图片'
  412. })
  413. return
  414. }
  415. // 验证费用信息
  416. if (!this.formData.costList || this.formData.costList.length === 0) {
  417. uni.showToast({
  418. icon: 'none',
  419. title: '请添加费用信息'
  420. })
  421. return
  422. }
  423. // 显示加载状态
  424. uni.showLoading({
  425. title: '提交中...',
  426. mask: true
  427. })
  428. const data = JSON.parse(JSON.stringify(this.formData))
  429. data.endMileageImagesFileIds = data.endMileageImages.map(img => img.id).join(',')
  430. data.startMileageImagesFileIds = data.startMileageImages.map(img => img.id).join(',')
  431. console.log('data~~~', data)
  432. // 调用API
  433. await logistictraklistnoteUpdateAPI({...data, status})
  434. uni.hideLoading()
  435. uni.showModal({
  436. title: '此工单报工成功',
  437. content: '',
  438. confirmText: '确认',
  439. showCancel: false,
  440. success: res => {
  441. if (res.confirm) {
  442. this.back(2)
  443. }
  444. }
  445. })
  446. } catch (error) {
  447. uni.hideLoading()
  448. uni.showToast({
  449. icon: 'none',
  450. title: error.message || '提交失败,请重试',
  451. duration: 3000
  452. })
  453. console.error('提交失败:', error)
  454. } finally {
  455. this.isSubmitting = false
  456. }
  457. },
  458. handleAddFee() {
  459. this.form = {}
  460. this.popShow = true
  461. },
  462. handleDelFee(index) {
  463. uni.showModal({
  464. title: '确认删除',
  465. content: '确定要删除这条费用信息吗?',
  466. confirmColor: '#157A2C',
  467. success: res => {
  468. if (res.confirm) {
  469. this.formData.costList.splice(index, 1)
  470. }
  471. }
  472. })
  473. },
  474. submit() {
  475. if (!this.form.costType) {
  476. uni.showToast({
  477. icon: 'error',
  478. title: '请选择费用类型'
  479. })
  480. return
  481. }
  482. if (!this.form.cost) {
  483. uni.showToast({
  484. icon: 'error',
  485. title: '请输入金额'
  486. })
  487. return
  488. }
  489. this.form.listId = this.formData.id
  490. this.formData.costList.push({
  491. ...this.form
  492. })
  493. this.form = {}
  494. this.close()
  495. },
  496. close() {
  497. this.popShow = false
  498. },
  499. }
  500. }
  501. </script>
  502. <style lang="scss" scoped>
  503. @import '@/components/submitted.scss';
  504. .list-cell {
  505. display: flex;
  506. align-items: center;
  507. justify-content: space-between;
  508. color: $uni-text-color-grey;
  509. padding: 5rpx 20rpx;
  510. }
  511. .font-sm {
  512. font-size: $uni-font-size-sm;
  513. }
  514. .font-text {
  515. color: $uni-text-color;
  516. }
  517. .btn-execute {
  518. background-color: $j-primary-border-green;
  519. width: 450rpx;
  520. margin-top: 10vh;
  521. }
  522. .btn-sparepart {
  523. width: 450rpx;
  524. margin-top: 20rpx;
  525. }
  526. .btn-reassignment {
  527. color: $uni-color-primary;
  528. background-color: transparent;
  529. border: none;
  530. box-shadow: none;
  531. &::after {
  532. display: none;
  533. }
  534. }
  535. .del {
  536. color: red;
  537. font-size: 1.5rex;
  538. }
  539. .maintenance-container {
  540. position: fixed;
  541. top: 0;
  542. bottom: 0;
  543. width: 100vw;
  544. display: flex;
  545. flex-direction: column;
  546. /deep/.u-popup {
  547. flex: none !important;
  548. }
  549. }
  550. .maintenance-wrapper {
  551. position: relative;
  552. flex: 1;
  553. }
  554. .maintenance-content {
  555. padding-top: 40rpx;
  556. box-sizing: border-box;
  557. position: absolute;
  558. top: 0;
  559. bottom: 0;
  560. left: 0;
  561. right: 0;
  562. display: flex;
  563. flex-direction: column;
  564. }
  565. .kd-cell {
  566. line-height: 90rpx;
  567. border-bottom: 1px dashed #dadada;
  568. display: flex;
  569. justify-content: space-between;
  570. .kd-label {
  571. display: inline-block;
  572. width: 7em;
  573. font-weight: bold;
  574. }
  575. .kd-content {
  576. flex: 1;
  577. text-align: left;
  578. word-break: break-all;
  579. }
  580. &.block {
  581. display: block;
  582. }
  583. }
  584. .kd-cell-divider {
  585. border-bottom: 2px solid #dadada;
  586. margin: 10px 0;
  587. }
  588. .upload-btn {
  589. flex: 1;
  590. text-align: center;
  591. color: $theme-color;
  592. }
  593. .image-list {
  594. display: flex;
  595. flex-wrap: wrap;
  596. padding: 10rpx 0;
  597. margin-left: 7em;
  598. .image-item {
  599. position: relative;
  600. width: 150rpx;
  601. height: 150rpx;
  602. margin: 0 10rpx 10rpx 0;
  603. box-sizing: border-box;
  604. image {
  605. width: 100%;
  606. height: 100%;
  607. border-radius: 8rpx;
  608. }
  609. .delete-btn {
  610. position: absolute;
  611. top: -10rpx;
  612. right: -10rpx;
  613. width: 40rpx;
  614. height: 40rpx;
  615. line-height: 40rpx;
  616. text-align: center;
  617. background-color: #ff4d4f;
  618. color: #fff;
  619. border-radius: 50%;
  620. font-size: 32rpx;
  621. cursor: pointer;
  622. z-index: 10;
  623. }
  624. }
  625. .image-add {
  626. width: 150rpx;
  627. height: 150rpx;
  628. border: 2rpx dashed #d9d9d9;
  629. border-radius: 8rpx;
  630. display: flex;
  631. align-items: center;
  632. justify-content: center;
  633. font-size: 60rpx;
  634. color: #999;
  635. margin: 0 10rpx 10rpx 0;
  636. cursor: pointer;
  637. box-sizing: border-box;
  638. &:active {
  639. background-color: #f5f5f5;
  640. }
  641. }
  642. }
  643. .kd-baseInfo {
  644. padding: 0 32rpx;
  645. font-size: 28rpx;
  646. height: 75%;
  647. }
  648. .kd-equipment {
  649. flex: 1;
  650. display: flex;
  651. flex-direction: column;
  652. overflow: hidden;
  653. .kd-type-box {
  654. text-align: center;
  655. padding: 26rpx 0;
  656. view {
  657. position: relative;
  658. display: inline-block;
  659. width: 120rpx;
  660. padding: 4rpx 0;
  661. color: #747474;
  662. margin: 0 20rpx;
  663. background-color: rgba(215, 215, 215, 0.5);
  664. &.type—active {
  665. background-color: #1e7f35;
  666. color: #fff;
  667. }
  668. .count {
  669. position: absolute;
  670. top: -9px;
  671. right: -9px;
  672. width: 18px;
  673. height: 18px;
  674. border-radius: 50%;
  675. font-size: 12px;
  676. background-color: red;
  677. color: #fff;
  678. }
  679. }
  680. }
  681. .kd-list-container {
  682. flex: 1;
  683. display: flex;
  684. flex-direction: column;
  685. overflow: hidden;
  686. padding: 12rpx 18rpx;
  687. background-color: $page-bg;
  688. .u-list {
  689. flex: 1;
  690. height: 100% !important;
  691. }
  692. }
  693. }
  694. .spare-parts {
  695. flex: 1;
  696. overflow: hidden;
  697. }
  698. .kd-card {
  699. background-color: #fff;
  700. margin-bottom: 20rpx;
  701. padding: 8rpx 0;
  702. font-size: 28rpx;
  703. word-break: break-all;
  704. .kd-card-wrapper {
  705. padding: 0 30rpx;
  706. border-bottom: 1px solid #dadada;
  707. }
  708. .kd-cell {
  709. line-height: 60rpx;
  710. }
  711. .kd-cell:last-of-type {
  712. border-bottom: none;
  713. }
  714. .status-box {
  715. margin-right: 16rpx;
  716. }
  717. .card-footer {
  718. display: flex;
  719. justify-content: flex-end;
  720. align-items: center;
  721. padding: 8rpx 0 20rpx;
  722. button {
  723. width: 180rpx;
  724. height: 56rpx;
  725. line-height: 56rpx;
  726. font-size: 28rpx;
  727. margin: 0 8rpx;
  728. }
  729. .primary-btn {
  730. background-color: $j-primary-border-green;
  731. }
  732. }
  733. }
  734. .apply-box {
  735. width: 70%;
  736. margin: 0 auto;
  737. display: flex;
  738. align-items: center;
  739. justify-content: space-around;
  740. }
  741. .select-container {
  742. min-height: 60vh;
  743. .title {
  744. display: flex;
  745. justify-content: space-between;
  746. align-items: center;
  747. height: 100rpx;
  748. line-height: 100rpx;
  749. text-align: center;
  750. background-color: $j-primary-border-green;
  751. font-weight: bold;
  752. position: relative;
  753. font-size: 32rpx;
  754. color: #fff;
  755. padding: 0 30rpx;
  756. box-sizing: border-box;
  757. .btn {
  758. display: flex;
  759. align-items: center;
  760. justify-content: center;
  761. width: 120rpx;
  762. height: 56rpx;
  763. font-size: 28rpx;
  764. border: 1px solid #fff;
  765. text-align: center;
  766. line-height: 56rpx;
  767. border-radius: 8rpx;
  768. transition: opacity 0.3s;
  769. cursor: pointer;
  770. &:active {
  771. opacity: 0.7;
  772. }
  773. &.cancel {
  774. background-color: transparent;
  775. color: #fff;
  776. }
  777. &.confirm {
  778. background-color: rgba(255, 255, 255, 0.2);
  779. color: #fff;
  780. }
  781. }
  782. }
  783. .select-wrapper {
  784. .col {
  785. display: flex;
  786. // min-height: 0rpx;
  787. margin-top: 22rpx;
  788. align-items: center;
  789. padding-right: 14rpx;
  790. .label {
  791. display: inline-block;
  792. width: 200rpx;
  793. text-align: right;
  794. }
  795. .input_text {
  796. flex: 1;
  797. height: 66rpx;
  798. line-height: 66rpx;
  799. padding: 0rpx 16rpx;
  800. box-sizing: border-box;
  801. font-size: 28rpx;
  802. border: 1px solid #eceeec;
  803. border-radius: 8rpx;
  804. }
  805. input {
  806. flex: 1;
  807. border: 1rpx solid #e5e5e5;
  808. height: 66rpx;
  809. border-radius: 8rpx;
  810. font-size: 28rpx;
  811. padding: 0rpx 16rpx;
  812. color: #6a6a6a;
  813. }
  814. textarea {
  815. border: 1rpx solid #e5e5e5;
  816. flex: 1;
  817. height: 100rpx;
  818. }
  819. .tab_box {
  820. display: flex;
  821. flex-direction: row;
  822. flex-wrap: wrap;
  823. width: 520rpx;
  824. .tab {
  825. display: flex;
  826. flex-direction: row;
  827. border: 2rpx solid #d9ecff;
  828. background-color: #f4f4f5;
  829. border-color: #e9e9eb;
  830. color: #909399;
  831. margin-left: 8rpx;
  832. margin-bottom: 8rpx;
  833. padding: 2rpx 8rpx;
  834. font-size: 28rpx;
  835. }
  836. .icon {
  837. margin-left: 6rpx;
  838. }
  839. }
  840. }
  841. }
  842. }
  843. </style>