reportDetail.vue 22 KB

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