index.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. <template>
  2. <view class="page-container">
  3. <view class="page-body">
  4. <u--form label-width="auto" labelAlign="left"
  5. ref="uForm"
  6. :model="model"
  7. :rules="rules"
  8. :labelStyle="{
  9. fontSize: '28rpx',
  10. fontWeight: '500',
  11. }"
  12. >
  13. <u-cell-group :border="false">
  14. <view class="box">
  15. <u-cell title="驾驶员" :border="true" :isLink="false" :clickable="false">
  16. <view slot="value" class="value">
  17. <u-form-item label="">
  18. {{renderItem(model.form,'driverName','--')}}
  19. </u-form-item>
  20. </view>
  21. </u-cell>
  22. <u-cell title="所属部门" :border="true" :isLink="false" :clickable="false">
  23. <view slot="value" class="value">
  24. <u-form-item label="">
  25. {{renderItem(model.form,'deptName','--')}}
  26. </u-form-item>
  27. </view>
  28. </u-cell>
  29. <template>
  30. <u-cell :border="true" :isLink="true" :clickable="true" class="hidde-cell-title"
  31. @click="$refs.carChooseRef.show()"
  32. >
  33. <view slot="value" class="value">
  34. <u-form-item label="车辆" prop="form.vehicleId" :required="true">
  35. <u--input
  36. :value="model.form.plate"
  37. placeholder="请选择"
  38. border="none"
  39. inputAlign="right"
  40. :disabled="true"
  41. disabledColor="none"
  42. :customStyle="{
  43. pointerEvents: 'none',
  44. }"
  45. >
  46. </u--input>
  47. </u-form-item>
  48. </view>
  49. </u-cell>
  50. <tq-car-user ref="carChooseRef"
  51. @confirm="(data) => {
  52. model.form.vehicleId = data.id
  53. model.form.plate = data.label
  54. $refs.uForm.validateField('form.vehicleId')
  55. }"
  56. >
  57. </tq-car-user>
  58. </template>
  59. <template>
  60. <u-cell title="" :border="true" :isLink="true" :clickable="true" class="hidde-cell-title"
  61. @click="$refs.oilCityRef.show()"
  62. >
  63. <view slot="value" class="value">
  64. <u-form-item label="所在城市" prop="form.oilCity" :required="true">
  65. <u--input
  66. :value="model.form.oilCityName"
  67. placeholder="请选择"
  68. border="none"
  69. inputAlign="right"
  70. :disabled="true"
  71. disabledColor="none"
  72. :customStyle="{
  73. pointerEvents: 'none',
  74. }"
  75. >
  76. </u--input>
  77. </u-form-item>
  78. </view>
  79. </u-cell>
  80. <tq-dict-select
  81. ref="oilCityRef"
  82. dictType="ry_city"
  83. @confirm="(data) => {
  84. model.form.oilCity = data.dictValue
  85. model.form.oilCityName = data.dictLabel
  86. $refs.uForm.validateField('form.oilCity')
  87. }"
  88. >
  89. </tq-dict-select>
  90. </template>
  91. <template>
  92. <u-cell title="" :border="true" :isLink="true" class="hidde-cell-title"
  93. @click="$refs.oilTimeRef.show()"
  94. >
  95. <view slot="value" class="value">
  96. <u-form-item label="加油时间" prop="form.oilTime" :required="true">
  97. <u--input
  98. :value="model.form.oilTime"
  99. placeholder="请选择"
  100. border="none"
  101. inputAlign="right"
  102. :disabled="true"
  103. disabledColor="none"
  104. :customStyle="{
  105. pointerEvents: 'none',
  106. }"
  107. >
  108. </u--input>
  109. </u-form-item>
  110. </view>
  111. </u-cell>
  112. <tq-date-time ref="oilTimeRef"
  113. mode="date"
  114. format="YYYY-MM-DD"
  115. @confirm="(data) => {
  116. model.form.oilTime = data
  117. $refs.uForm.validateField('form.oilTime')
  118. }"
  119. >
  120. </tq-date-time>
  121. </template>
  122. </view>
  123. <view class="box">
  124. <u-cell title="" :border="true" :isLink="false" :clickable="false" class="hidde-cell-title">
  125. <view slot="value" class="value">
  126. <u-form-item label="车辆里程表读数" prop="form.bordMile" :required="true">
  127. <u--input v-model="model.form.bordMile" placeholder="请输入" border="none" type="number"
  128. :clearable="true"
  129. inputAlign="right" maxlength="20">
  130. </u--input>
  131. </u-form-item>
  132. </view>
  133. </u-cell>
  134. <template>
  135. <u-cell title="" :border="true" :isLink="true" :clickable="true" class="hidde-cell-title"
  136. @click="$refs.oliTypeRef.show()"
  137. >
  138. <view slot="value" class="value">
  139. <u-form-item label="油品/油号" prop="form.oliType" :required="true">
  140. <u--input
  141. :value="model.form.oliTypeName"
  142. placeholder="请选择"
  143. border="none"
  144. inputAlign="right"
  145. :disabled="true"
  146. disabledColor="none"
  147. :customStyle="{
  148. pointerEvents: 'none',
  149. }"
  150. >
  151. </u--input>
  152. </u-form-item>
  153. </view>
  154. </u-cell>
  155. <tq-dict-select
  156. ref="oliTypeRef"
  157. dictType="oil_type"
  158. @confirm="(data) => {
  159. model.form.oliType = data.dictValue
  160. model.form.oliTypeName = data.dictLabel
  161. $refs.uForm.validateField('form.oliType')
  162. }"
  163. >
  164. </tq-dict-select>
  165. </template>
  166. <u-cell title="" :border="true" :isLink="false" :clickable="false" class="hidde-cell-title">
  167. <view slot="value" class="value">
  168. <u-form-item label="油单价(元/升)" prop="form.oliPrise" :required="true">
  169. <u--input v-model="model.form.oliPrise" placeholder="请输入" border="none" type="number"
  170. :clearable="true"
  171. inputAlign="right" maxlength="20">
  172. </u--input>
  173. </u-form-item>
  174. </view>
  175. </u-cell>
  176. <u-cell title="" :border="true" :isLink="false" :clickable="false" class="hidde-cell-title">
  177. <view slot="value" class="value">
  178. <u-form-item label="加油升数(升)" prop="form.oilVal" :required="true">
  179. <u--input v-model="model.form.oilVal" placeholder="请输入" border="none" type="number"
  180. :clearable="true"
  181. inputAlign="right" maxlength="20">
  182. </u--input>
  183. </u-form-item>
  184. </view>
  185. </u-cell>
  186. <u-cell title="" :border="true" :isLink="false" :clickable="false" class="hidde-cell-title">
  187. <view slot="value" class="value">
  188. <u-form-item label="加油金额(元)" prop="form.oilCost" :required="true">
  189. <u--input v-model="model.form.oilCost" placeholder="请输入" border="none" type="number"
  190. :clearable="true"
  191. inputAlign="right" maxlength="20">
  192. </u--input>
  193. </u-form-item>
  194. </view>
  195. </u-cell>
  196. </view>
  197. <view class="box">
  198. <u-cell title="" :border="false" :isLink="false" :clickable="false" class="hidde-cell-title">
  199. <view slot="value" class="value">
  200. <u-form-item label="" labelPosition="top" prop="form.bordMilePic" :required="true">
  201. <view slot="label" class="item-label">
  202. <view class="item-label-left">
  203. <text>*</text>
  204. 上传车辆里程表与加油票据( {{ model.form.bordMilePic ? model.form.bordMilePic.split(',').length : 0 }}/6)
  205. </view>
  206. <!-- <view class="item-label-right">
  207. </view> -->
  208. </view>
  209. <view style="margin-top: 30rpx;">
  210. <tq-upload-img v-model="model.form.bordMilePic" :maxCount="6" width="80" height="80"
  211. uploadText="">
  212. </tq-upload-img>
  213. </view>
  214. </u-form-item>
  215. </view>
  216. </u-cell>
  217. <!-- <u-cell title="" :border="false" :isLink="false" :clickable="false" class="hidde-cell-title">
  218. <view slot="value" class="value">
  219. <u-form-item label="" labelPosition="top" prop="form.receipt" :required="true">
  220. <view slot="label" class="item-label">
  221. <view class="item-label-left">
  222. <text>*</text>
  223. 上传加油票据( {{ model.form.receipt ? model.form.receipt.split(',').length : 0 }}/6)
  224. </view>
  225. </view>
  226. <view style="margin-top: 30rpx;">
  227. <tq-upload-img v-model="model.form.receipt" :maxCount="6" width="80" height="80"
  228. uploadText="">
  229. </tq-upload-img>
  230. </view>
  231. </u-form-item>
  232. </view>
  233. </u-cell> -->
  234. <u-cell title="" :border="false" :isLink="false" :clickable="false" class="hidde-cell-title">
  235. <view slot="value" class="value">
  236. <u-form-item label="备注" labelPosition="top" prop="form.remark" :required="false">
  237. <u--textarea
  238. v-model="model.form.remark"
  239. placeholder="请输入备注"
  240. border="none"
  241. :count="true"
  242. maxlength="200"
  243. >
  244. </u--textarea>
  245. </u-form-item>
  246. </view>
  247. </u-cell>
  248. </view>
  249. </u-cell-group>
  250. </u--form>
  251. </view>
  252. <view class="page-footer">
  253. <u-row style="margin-top: 40rpx;">
  254. <u-col :span="6">
  255. <u-button type="info" shape="" :hairline="false" :custom-style="{
  256. width: '100%',
  257. borderRadius: '0',
  258. background: '#FFF',
  259. height: '100rpx',
  260. fontSize: '32rpx',
  261. fontWeight: '500',
  262. }" @click="handleClear">取消
  263. </u-button>
  264. </u-col>
  265. <u-col :span="6">
  266. <u-button type="primary" shape="" :hairline="false"
  267. :custom-style="{
  268. width: '100%',
  269. borderRadius: '0',
  270. height: '100rpx',
  271. fontSize: '32rpx',
  272. fontWeight: '500',
  273. background:'linear-gradient(to right, #41B5FF, #4573FC)'
  274. }" @click="handleSubmit">提交
  275. </u-button>
  276. </u-col>
  277. </u-row>
  278. </view>
  279. </view>
  280. </template>
  281. <script>
  282. import {userProfile} from '@/api/common/user.js'
  283. import {addItem,detail,updateItem} from '@/api/vehDispatch/oilApply.js'
  284. import {clearProps,copyProps,minuteToTime} from '@/utils/gdtq.js'
  285. export default {
  286. components: {
  287. },
  288. data() {
  289. return {
  290. model: {
  291. form: {
  292. id: '',
  293. driverId: '',
  294. driverName: '',
  295. deptId: '',
  296. deptName: "",
  297. vehicleId: "",
  298. plate: "",
  299. oilCity: "",
  300. oilCityName: "",
  301. oilTime: "",
  302. bordMile: "",
  303. oliType: "",
  304. oliTypeName: "",
  305. oliPrise: "",
  306. oilVal: "",
  307. oilCost: "",
  308. bordMilePic: "",
  309. receipt: "",
  310. remark: '',
  311. }
  312. },
  313. rules: {
  314. 'form.bordMile': [
  315. {
  316. type: 'string' ,
  317. required: true,
  318. message: '请输入',
  319. trigger: ['blur', 'change']
  320. },
  321. {
  322. pattern: /^\d+(\.\d{1,2})?$/,
  323. // 正则检验前先将值转为字符串
  324. transform(value) {
  325. return value?String(value):0;
  326. },
  327. message: '需为正数且最多两位小数',
  328. // 触发器可以同时用blur和change
  329. trigger: ['change','blur'],
  330. }
  331. /* {
  332. pattern: /^[0-9]\d*$/g,
  333. // 正则检验前先将值转为字符串
  334. transform(value) {
  335. return String(value);
  336. },
  337. message: '请输入正整数',
  338. // 触发器可以同时用blur和change
  339. trigger: ['change','blur'],
  340. } */
  341. ],
  342. 'form.oliPrise': [
  343. {
  344. type: 'string' ,
  345. required: true,
  346. message: '请输入',
  347. trigger: ['blur', 'change']
  348. },
  349. {
  350. pattern: /^\d+(\.\d{1,2})?$/,
  351. // 正则检验前先将值转为字符串
  352. transform(value) {
  353. return value?String(value):0;
  354. },
  355. message: '需为正数且最多两位小数',
  356. // 触发器可以同时用blur和change
  357. trigger: ['change','blur'],
  358. }
  359. ],
  360. 'form.oilVal': [
  361. {
  362. type: 'string' ,
  363. required: true,
  364. message: '请输入',
  365. trigger: ['blur', 'change']
  366. },
  367. {
  368. pattern: /^\d+(\.\d{1,2})?$/,
  369. // 正则检验前先将值转为字符串
  370. transform(value) {
  371. return value?String(value):0;
  372. },
  373. message: '需为正数且最多两位小数',
  374. // 触发器可以同时用blur和change
  375. trigger: ['change','blur'],
  376. }
  377. ],
  378. 'form.oilCost': [
  379. {
  380. type: 'string' ,
  381. required: true,
  382. message: '请输入',
  383. trigger: ['blur', 'change']
  384. },
  385. {
  386. pattern: /^\d+(\.\d{1,2})?$/,
  387. // 正则检验前先将值转为字符串
  388. transform(value) {
  389. return value?String(value):0;
  390. },
  391. message: '需为正数且最多两位小数',
  392. // 触发器可以同时用blur和change
  393. trigger: ['change','blur'],
  394. }
  395. ],
  396. 'form.oliType': [
  397. {
  398. type: 'string',
  399. required: true,
  400. message: '请选择',
  401. trigger: ['blur', 'change']
  402. },
  403. ],
  404. 'form.oilTime': [
  405. {
  406. type: 'string',
  407. required: true,
  408. message: '请选择',
  409. trigger: ['blur', 'change']
  410. },
  411. ],
  412. 'form.vehicleId': [
  413. {
  414. type: 'number',
  415. required: true,
  416. message: '请选择',
  417. trigger: ['blur', 'change']
  418. },
  419. ],
  420. 'form.oilCity': [
  421. {
  422. type: 'number',
  423. required: true,
  424. message: '请选择',
  425. trigger: ['blur', 'change']
  426. },
  427. ],
  428. 'form.bordMilePic': [
  429. {
  430. type: 'string',
  431. required: true,
  432. message: '请选择',
  433. trigger: ['blur', 'change']
  434. },
  435. ],
  436. 'form.receipt': [
  437. {
  438. type: 'string',
  439. required: true,
  440. message: '请选择',
  441. trigger: ['blur', 'change']
  442. },
  443. ],
  444. },
  445. userInfo: null,
  446. editType: 'add', //add-新增 update-编辑
  447. }
  448. },
  449. onLoad({id,type}) {
  450. if(type) this.editType = type
  451. if(id) {
  452. this.model.form.id = id
  453. this.getInfo(id)
  454. } else {
  455. this.getUserInfo()
  456. }
  457. },
  458. onShow() {
  459. },
  460. onHide() {
  461. },
  462. onReady() {
  463. this.$refs.uForm.setRules(this.rules)
  464. },
  465. methods: {
  466. async getInfo(id) {
  467. let {code,data} = await detail({id})
  468. if(code == 0) {
  469. copyProps(this.model.form,data)
  470. }
  471. },
  472. getUserInfo() {
  473. userProfile().then((res) => {
  474. this.userInfo = res.data
  475. this.model.form.driverId = res.data.userId
  476. this.model.form.driverName = res.data.nickName
  477. this.model.form.deptId = res.data.deptId
  478. this.model.form.deptName = res.data.deptName
  479. })
  480. },
  481. // 提交
  482. async handleSubmit() {
  483. this.$refs.uForm.validate().then(async res => {
  484. let ajaxData = {
  485. ...this.model.form,
  486. }
  487. let api = {
  488. 'add': addItem,
  489. 'update': updateItem,
  490. }
  491. uni.showModal({
  492. title: '提示',
  493. content: `加油登记提交后不可再次修改,请确认是否提交?`,
  494. showCancel:true,
  495. confirmText: '确认',
  496. success: async (res) => {
  497. if (res.confirm) {
  498. let { data, code,msg } = await api[this.editType](ajaxData)
  499. if (code == 0) {
  500. uni.switchTab({url: '/pages/index/index'})
  501. }
  502. }
  503. }
  504. })
  505. }).catch(errors => {
  506. console.log('校验失败',errors)
  507. })
  508. },
  509. handleClear() {
  510. // clearProps(this.model.form,[])
  511. uni.navigateBack()
  512. },
  513. }
  514. }
  515. </script>
  516. <style lang="scss" scoped>
  517. .page-container {
  518. font-size: 28rpx;
  519. min-height: 100%;
  520. position: relative;
  521. // padding-bottom: 60rpx;
  522. .box {
  523. margin: 20rpx;
  524. border-radius: 10rpx;
  525. background: #fff;
  526. }
  527. .page-body {
  528. padding-bottom: 120rpx;
  529. .box {
  530. margin: 24rpx 24rpx 0;
  531. padding: 20rpx;
  532. border-radius: 20rpx;
  533. background: #fff;
  534. border: 1rpx solid #EBEDF0;
  535. .item-label {
  536. display: flex;
  537. justify-content: space-between;
  538. align-items: center;
  539. &-left {
  540. font-family: PingFangSC, PingFang SC;
  541. font-weight: 400;
  542. font-size: 28rpx;
  543. color: #333333;
  544. position: relative;
  545. text {
  546. color: #f56c6c;
  547. font-size: 40rpx;
  548. position: absolute;
  549. left: -18rpx;
  550. }
  551. }
  552. &-right {
  553. font-family: PingFangSC, PingFang SC;
  554. font-weight: 400;
  555. font-size: 28rpx;
  556. color: #333333;
  557. text-align: right;
  558. width: 100%;
  559. }
  560. }
  561. }
  562. }
  563. .page-footer {
  564. padding: 0rpx 0;
  565. position: fixed;
  566. width: 100%;
  567. left: 0;
  568. bottom: 0;
  569. }
  570. }
  571. ::v-deep {
  572. .u-cell-group {
  573. .u-cell__title-text {
  574. font-family: PingFangSC, PingFang SC;
  575. font-weight: 400;
  576. font-size: 28rpx;
  577. color: #333333;
  578. }
  579. .u-form-item__body__right__content__slot {
  580. font-family: PingFangSC, PingFang SC;
  581. font-weight: 400;
  582. font-size: 28rpx;
  583. color: #333333;
  584. .u-input__content__field-wrapper__field {
  585. font-family: PingFangSC, PingFang SC !important;
  586. font-weight: 400 !important;
  587. font-size: 28rpx !important;
  588. color: #333333 !important;
  589. }
  590. }
  591. }
  592. .u-form-item__body {
  593. padding: 0;
  594. }
  595. .hidde-cell-title {
  596. .u-cell__body__content {
  597. width: auto;
  598. flex: none;
  599. }
  600. .u-cell__body {
  601. .value {
  602. flex: 1;
  603. }
  604. }
  605. }
  606. }
  607. </style>