add.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  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. <template v-if="hasPlat(['sanitation'])">
  16. <u-cell :border="true" :isLink="true" :clickable="false" class="hidde-cell-title"
  17. @click="$refs.coverageRef.show()"
  18. >
  19. <view slot="value" class="value">
  20. <u-form-item label="所属行政区" prop="form.bindAreaCode" :required="true">
  21. <u--input
  22. :value="model.form.bindAreaName"
  23. placeholder="请选择"
  24. border="none"
  25. inputAlign="right"
  26. :disabled="true"
  27. disabledColor="none"
  28. :customStyle="{
  29. pointerEvents: 'none',
  30. }"
  31. >
  32. </u--input>
  33. </u-form-item>
  34. </view>
  35. </u-cell>
  36. <tq-area-coverage ref="coverageRef"
  37. @confirm="(data) => {
  38. model.form.bindAreaCode = data.code
  39. model.form.bindAreaName = data.areaName
  40. }"
  41. >
  42. </tq-area-coverage>
  43. </template>
  44. <template>
  45. <u-cell :border="true" :isLink="true" :clickable="false" class="hidde-cell-title"
  46. @click="() => {
  47. if(!hasHostPlat(['dingH5'])) $refs.deptChooseRef.show()
  48. }"
  49. >
  50. <view slot="value" class="value">
  51. <u-form-item label="所属单位" prop="form.deptId" :required="true">
  52. <u--input
  53. :value="model.form.deptName"
  54. placeholder="请选择"
  55. border="none"
  56. inputAlign="right"
  57. :disabled="true"
  58. disabledColor="none"
  59. :customStyle="{
  60. pointerEvents: 'none',
  61. }"
  62. >
  63. </u--input>
  64. </u-form-item>
  65. </view>
  66. </u-cell>
  67. <tq-dept ref="deptChooseRef"
  68. @confirm="(data) => {
  69. model.form.deptId = data.deptId
  70. model.form.deptName = data.deptName
  71. }"
  72. >
  73. </tq-dept>
  74. </template>
  75. <template>
  76. <u-cell title="" :border="true" :isLink="false" :clickable="false" class="hidde-cell-title">
  77. <view slot="value" class="value">
  78. <u-form-item label="名称" prop="form.nickName" :required="true">
  79. <u--input
  80. v-model="model.form.nickName"
  81. placeholder="请输入"
  82. border="none"
  83. type="text"
  84. :clearable="true"
  85. inputAlign="right"
  86. maxlength="10"
  87. :disabled="hasHostPlat(['dingH5'])"
  88. >
  89. </u--input>
  90. </u-form-item>
  91. </view>
  92. </u-cell>
  93. </template>
  94. <template>
  95. <u-cell title="" :border="true" :isLink="false" :clickable="false" class="hidde-cell-title">
  96. <view slot="value" class="value">
  97. <u-form-item label="联系方式" prop="form.phonenumber" :required="true">
  98. <u--input
  99. v-model="model.form.phonenumber"
  100. placeholder="请输入"
  101. border="none"
  102. type="number"
  103. :clearable="true"
  104. inputAlign="right"
  105. maxlength="11"
  106. >
  107. </u--input>
  108. </u-form-item>
  109. </view>
  110. </u-cell>
  111. </template>
  112. <template>
  113. <u-cell :border="true" :isLink="true" :clickable="false" class="hidde-cell-title"
  114. @click="$refs.sexRef.show()"
  115. >
  116. <view slot="value" class="value">
  117. <u-form-item label="性别" prop="form.sex" :required="true">
  118. <u--input
  119. :value="model.form.sexName"
  120. placeholder="请选择"
  121. border="none"
  122. inputAlign="right"
  123. :disabled="true"
  124. disabledColor="none"
  125. :customStyle="{
  126. pointerEvents: 'none',
  127. }"
  128. >
  129. </u--input>
  130. </u-form-item>
  131. </view>
  132. </u-cell>
  133. <tq-dict-select ref="sexRef"
  134. dictType="sys_user_sex"
  135. @confirm="(data) => {
  136. model.form.sex = data.dictValue
  137. model.form.sexName = data.dictLabel
  138. }"
  139. >
  140. </tq-dict-select>
  141. </template>
  142. <template>
  143. <u-cell :border="true" :isLink="true" :clickable="false" class="hidde-cell-title"
  144. @click="$refs.roleRef.show()"
  145. >
  146. <view slot="value" class="value">
  147. <u-form-item label="选择角色" prop="form.bindRoleIds" :required="true">
  148. <u--input
  149. :value="model.form.bindRoleName"
  150. placeholder="请选择"
  151. border="none"
  152. inputAlign="right"
  153. :disabled="true"
  154. disabledColor="none"
  155. :customStyle="{
  156. pointerEvents: 'none',
  157. }"
  158. >
  159. </u--input>
  160. </u-form-item>
  161. </view>
  162. </u-cell>
  163. <tq-search-select ref="roleRef"
  164. :dataList="roleOptions"
  165. :multiple="true"
  166. :objMap="{
  167. label: 'roleName',
  168. value: 'roleId',
  169. }"
  170. @confirm="(data) => {
  171. model.form.bindRoleIds = data.map(e => e.roleId).join(',')
  172. model.form.bindRoleName = data.map(e => e.roleName).join(',')
  173. }"
  174. >
  175. </tq-search-select>
  176. </template>
  177. <template v-if="!hasHostPlat(['dingH5'])">
  178. <u-cell title="" :border="true" :isLink="false" :clickable="false" class="hidde-cell-title">
  179. <view slot="value" class="value">
  180. <u-form-item label="账号" prop="form.userName" :required="true">
  181. <u--input
  182. v-model="model.form.userName"
  183. placeholder="请输入"
  184. border="none"
  185. type="text"
  186. :clearable="true"
  187. inputAlign="right"
  188. maxlength="20"
  189. >
  190. </u--input>
  191. </u-form-item>
  192. </view>
  193. </u-cell>
  194. </template>
  195. <template v-if="isNull(model.form.userId)">
  196. <u-cell title="" :border="true" :isLink="false" :clickable="false" class="hidde-cell-title">
  197. <view slot="value" class="value">
  198. <u-form-item label="登录密码" prop="form.password" :required="false">
  199. <u--input
  200. v-model="model.form.password"
  201. placeholder="请输入"
  202. border="none"
  203. type="text"
  204. :clearable="true"
  205. inputAlign="right"
  206. maxlength="20"
  207. >
  208. </u--input>
  209. </u-form-item>
  210. </view>
  211. </u-cell>
  212. </template>
  213. <template>
  214. <u-cell title="" :border="true" :isLink="false" :clickable="false" class="hidde-cell-title">
  215. <view slot="value" class="value">
  216. <u-form-item label="驾驶证号" prop="form.licenseNo" :required="false">
  217. <u--input
  218. v-model="model.form.licenseNo"
  219. placeholder="请输入"
  220. border="none"
  221. type="text"
  222. :clearable="true"
  223. inputAlign="right"
  224. maxlength="20"
  225. >
  226. </u--input>
  227. </u-form-item>
  228. </view>
  229. </u-cell>
  230. </template>
  231. <template>
  232. <u-cell title="" :border="true" :isLink="true" class="hidde-cell-title"
  233. @click="$refs.limitDateRef.show()"
  234. >
  235. <view slot="value" class="value">
  236. <u-form-item label="驾驶证到期" prop="form.limitDate" :required="false">
  237. <u--input
  238. :value="model.form.limitDate"
  239. placeholder="请选择"
  240. border="none"
  241. inputAlign="right"
  242. :disabled="true"
  243. disabledColor="none"
  244. :customStyle="{
  245. pointerEvents: 'none',
  246. }"
  247. >
  248. </u--input>
  249. </u-form-item>
  250. </view>
  251. </u-cell>
  252. <tq-date-time ref="limitDateRef"
  253. mode="date"
  254. format="YYYY-MM-DD"
  255. @confirm="(data) => {
  256. model.form.limitDate = data
  257. }"
  258. >
  259. </tq-date-time>
  260. </template>
  261. <template>
  262. <u-cell title="绑定车辆" :border="true" :isLink="true" :clickable="false"
  263. @click="$refs.plateRef.show()"
  264. >
  265. <view slot="value">
  266. <u-form-item label="">
  267. <u--input
  268. :value="model.form.plate"
  269. placeholder="请选择"
  270. border="none"
  271. inputAlign="right"
  272. :disabled="true"
  273. disabledColor="none"
  274. :customStyle="{
  275. pointerEvents: 'none',
  276. }"
  277. >
  278. </u--input>
  279. </u-form-item>
  280. </view>
  281. </u-cell>
  282. <tq-car-user ref="plateRef"
  283. :isGetIcon="false"
  284. :queryType="2"
  285. @confirm="(data) => {
  286. model.form.vehicleId = data.id
  287. model.form.plate = data.label
  288. }"
  289. >
  290. </tq-car-user>
  291. </template>
  292. <template>
  293. <u-cell :border="true" :isLink="true" :clickable="true" class="hidde-cell-title"
  294. @click="$refs.workStatusRef.show()"
  295. >
  296. <view slot="value" class="value">
  297. <u-form-item label="在职状态" prop="form.workStatus" :required="true">
  298. <u--input
  299. :value="model.form.workStatusName"
  300. placeholder="请选择"
  301. border="none"
  302. inputAlign="right"
  303. :disabled="true"
  304. disabledColor="none"
  305. :customStyle="{
  306. pointerEvents: 'none',
  307. }"
  308. >
  309. </u--input>
  310. </u-form-item>
  311. </view>
  312. </u-cell>
  313. <tq-dict-select ref="workStatusRef"
  314. dictType="sys_onjob_status"
  315. @confirm="(data) => {
  316. model.form.workStatus = data.dictValue
  317. model.form.workStatusName = data.dictLabel
  318. $refs.uForm.validateField('form.workStatus')
  319. }"
  320. >
  321. </tq-dict-select>
  322. </template>
  323. <u-cell :border="false" :isLink="false" :clickable="false" class="hidde-cell-title">
  324. <view slot="value" class="value">
  325. <u-form-item label="备注" labelPosition="top" prop="form.remark" :required="false">
  326. <u--textarea
  327. v-model="model.form.remark"
  328. placeholder="请输入备注"
  329. border="none"
  330. :count="true"
  331. maxlength="200"
  332. >
  333. </u--textarea>
  334. </u-form-item>
  335. </view>
  336. </u-cell>
  337. <u-cell title="" :border="false" :isLink="false" :clickable="false" class="hidde-cell-title">
  338. <view slot="value" class="value">
  339. <u-form-item label="" labelPosition="top" prop="form.licensePhoto" :required="true">
  340. <view slot="label" class="item-label">
  341. <view class="item-label-left">
  342. <!-- <text>*</text> -->
  343. 驾驶证照片
  344. </view>
  345. <view class="item-label-right">{{model.form.licensePhoto?model.form.licensePhoto.split(',').length:0}}/1</view>
  346. </view>
  347. <view style="margin-top: 30rpx;">
  348. <tq-upload-img
  349. v-model="model.form.licensePhoto"
  350. :maxCount="1"
  351. width="80"
  352. height="80"
  353. uploadText=""
  354. >
  355. </tq-upload-img>
  356. </view>
  357. </u-form-item>
  358. </view>
  359. </u-cell>
  360. <u-cell title="" :border="false" :isLink="false" :clickable="false" class="hidde-cell-title">
  361. <view slot="value" class="value">
  362. <u-form-item label="" labelPosition="top" prop="form.photo" :required="true">
  363. <view slot="label" class="item-label">
  364. <view class="item-label-left">
  365. 用户照片
  366. </view>
  367. <view class="item-label-right">{{model.form.photo?model.form.photo.split(',').length:0}}/1</view>
  368. </view>
  369. <view style="margin-top: 30rpx;">
  370. <tq-upload-img
  371. v-model="model.form.photo"
  372. :maxCount="1"
  373. width="80"
  374. height="80"
  375. uploadText=""
  376. >
  377. </tq-upload-img>
  378. </view>
  379. </u-form-item>
  380. </view>
  381. </u-cell>
  382. </view>
  383. </u-cell-group>
  384. </u--form>
  385. </view>
  386. <view class="page-footer">
  387. <u-row style="margin-top: 40rpx;">
  388. <u-col :span="6">
  389. <u-button type="info" shape="" :hairline="false" :custom-style="{
  390. width: '100%',
  391. borderRadius: '0',
  392. background: '#FFF',
  393. height: '100rpx',
  394. fontSize: '32rpx',
  395. fontWeight: '500',
  396. }" @click="handleClear">返回
  397. </u-button>
  398. </u-col>
  399. <u-col :span="6">
  400. <u-button type="primary" shape="" :hairline="false"
  401. :custom-style="{
  402. width: '100%',
  403. borderRadius: '0',
  404. height: '100rpx',
  405. fontSize: '32rpx',
  406. fontWeight: '500',
  407. background:'linear-gradient(to right, #41B5FF, #4573FC)'
  408. }" @click="handleSubmit">提交
  409. </u-button>
  410. </u-col>
  411. </u-row>
  412. </view>
  413. </view>
  414. </template>
  415. <script>
  416. import {userProfile} from '@/api/common/user.js'
  417. import {addDriverManage,updateDriverManage,detailDriverManage,getUser,deptTreeSelect} from '@/api/system/driverManage.js'
  418. import {clearProps,copyProps} from '@/utils/gdtq.js'
  419. import {isEmpty} from 'lodash'
  420. import { encrypt, decrypt } from "@/utils/jsencrypt";
  421. export default {
  422. components: {
  423. },
  424. data() {
  425. return {
  426. model: {
  427. form: {
  428. userId: "",
  429. bindAreaCode: "",
  430. bindAreaName: "",
  431. deptId: "",
  432. deptName: "",
  433. nickName: '',
  434. phonenumber: '',
  435. sex: '',
  436. sexName: '',
  437. bindRoleIds: '',
  438. bindRoleName: '',
  439. userName: '',
  440. password: '',
  441. licenseNo: '',
  442. limitDate: '',
  443. vehicleId: '',
  444. plate: '',
  445. workStatus: '',
  446. workStatusName: '',
  447. remark: '',
  448. licensePhoto: '',
  449. photo: '',
  450. }
  451. },
  452. rules: {
  453. 'form.bindAreaCode': [
  454. {
  455. type: 'string',
  456. required: true,
  457. message: '请选择所属行政区',
  458. trigger: ['blur', 'change']
  459. },
  460. ],
  461. 'form.deptId': [
  462. {
  463. type: 'string',
  464. required: true,
  465. message: '请选择所属单位',
  466. trigger: ['blur', 'change']
  467. },
  468. ],
  469. 'form.nickName': [
  470. {
  471. type: 'string',
  472. required: true,
  473. message: '请输入名称',
  474. trigger: ['blur', 'change']
  475. },
  476. ],
  477. 'form.sex': [
  478. {
  479. type: 'string',
  480. required: true,
  481. message: '请选择性别',
  482. trigger: ['blur', 'change']
  483. },
  484. ],
  485. 'form.bindRoleIds': [
  486. {
  487. type: 'string',
  488. required: true,
  489. message: '请选择角色',
  490. trigger: ['blur', 'change']
  491. },
  492. ],
  493. 'form.userName': [
  494. {
  495. type: 'string',
  496. required: true,
  497. message: '请输入账号',
  498. trigger: ['blur', 'change']
  499. },
  500. ],
  501. 'form.phonenumber': [
  502. {
  503. type: 'string',
  504. required: true,
  505. message: '请输入联系方式',
  506. trigger: ['blur', 'change']
  507. },
  508. {
  509. pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
  510. // 正则检验前先将值转为字符串
  511. transform(value) {
  512. return value?String(value):0;
  513. },
  514. message: '请输入正确的手机号码',
  515. // 触发器可以同时用blur和change
  516. trigger: ['change','blur'],
  517. }
  518. ],
  519. 'form.workStatus': [
  520. {
  521. type: 'string',
  522. required: true,
  523. message: '请选择',
  524. trigger: ['blur', 'change']
  525. },
  526. ],
  527. 'form.loadWeight': [
  528. {
  529. pattern: /^\d+(\.\d{1,2})?$/,
  530. // 正则检验前先将值转为字符串
  531. transform(value) {
  532. return value?String(value):0;
  533. },
  534. message: '车辆载重需为正数且最多两位小数',
  535. // 触发器可以同时用blur和change
  536. trigger: ['change','blur'],
  537. }
  538. ],
  539. },
  540. userInfo: null,
  541. roleOptions: [],
  542. }
  543. },
  544. onLoad({id}) {
  545. // console.log(id,'id')
  546. if(id) {
  547. this.getUserList(id)
  548. this.getInfo(id)
  549. } else {
  550. this.getUserList()
  551. // this.getUserInfo()
  552. }
  553. },
  554. onShow() {
  555. },
  556. onHide() {
  557. },
  558. onReady() {
  559. this.resetRules()
  560. },
  561. methods: {
  562. resetRules() {
  563. this.$refs.uForm.setRules(this.rules)
  564. },
  565. getUserList(userId) {
  566. getUser(userId).then(res => {
  567. this.roleOptions = res.roles;
  568. });
  569. },
  570. async getInfo(userId) {
  571. let {code,data} = await detailDriverManage({userId})
  572. if(code == 0) {
  573. for (let key in this.model.form) {
  574. /* if (key === 'bindRoleIds') {
  575. this.model.form[key] = data[key] ? data[key].split(',') : []
  576. } else {
  577. this.model.form[key] = this.isNull(data[key]) ? undefined : data[key]
  578. } */
  579. this.model.form[key] = this.isNull(data[key]) ? undefined : data[key]
  580. }
  581. // copyProps(this.model.form,data)
  582. }
  583. },
  584. getUserInfo() {
  585. userProfile().then((res) => {
  586. this.userInfo = res.data
  587. this.roleOptions = res.data.roles
  588. // this.model.form.deptId = res.data.deptId
  589. // this.model.form.deptName = res.data.deptName
  590. })
  591. },
  592. // 提交
  593. async handleSubmit() {
  594. this.$refs.uForm.validate().then(async res => {
  595. let ajaxData = {
  596. ...this.model.form,
  597. password: this.model.form.password ? encrypt(this.model.form.password) : undefined,
  598. }
  599. let { data, code,msg } =ajaxData.userId? await updateDriverManage(ajaxData) : await addDriverManage(ajaxData)
  600. if (code == 0) {
  601. uni.showModal({
  602. title: '提示',
  603. content: `提交成功~`,
  604. showCancel:false,
  605. confirmText: '好的',
  606. success: function(res) {
  607. if (res.confirm) {
  608. uni.navigateTo({url: `/pagesBase/driverManage/index`})
  609. }
  610. }
  611. })
  612. }
  613. }).catch(errors => {
  614. console.log('校验失败',errors)
  615. })
  616. },
  617. handleClear() {
  618. uni.navigateBack()
  619. // clearProps(this.model.form,['outflowUserId','outflowUser','deptId','deptName'])
  620. },
  621. }
  622. }
  623. </script>
  624. <style lang="scss" scoped>
  625. .disflex-center {
  626. display: flex;
  627. justify-content: center;
  628. align-items: center;
  629. }
  630. .disflex-right {
  631. display: flex;
  632. justify-content: right;
  633. align-items: center;
  634. }
  635. .page-container {
  636. font-size: 28rpx;
  637. min-height: 100%;
  638. position: relative;
  639. // padding-bottom: 60rpx;
  640. .box {
  641. margin: 20rpx;
  642. border-radius: 10rpx;
  643. background: #fff;
  644. .item-label {
  645. display: flex;
  646. justify-content: space-between;
  647. align-items: center;
  648. &-left {
  649. font-family: PingFangSC, PingFang SC;
  650. font-weight: 400;
  651. font-size: 28rpx;
  652. color: #333333;
  653. position: relative;
  654. text {
  655. color: #f56c6c;
  656. font-size: 40rpx;
  657. position: absolute;
  658. left: -18rpx;
  659. }
  660. }
  661. &-right {
  662. font-family: PingFangSC, PingFang SC;
  663. font-weight: 400;
  664. font-size: 20rpx;
  665. color: #999999;
  666. }
  667. }
  668. }
  669. .page-body {
  670. padding-bottom: 120rpx;
  671. }
  672. .page-footer {
  673. padding: 0rpx 0;
  674. position: fixed;
  675. width: 100%;
  676. left: 0;
  677. bottom: 0;
  678. }
  679. }
  680. ::v-deep {
  681. .u-cell-group {
  682. .u-cell__title-text {
  683. font-family: PingFangSC, PingFang SC;
  684. font-weight: 400;
  685. font-size: 28rpx;
  686. color: #333333;
  687. }
  688. .u-form-item__body__right__content__slot {
  689. font-family: PingFangSC, PingFang SC;
  690. font-weight: 400;
  691. font-size: 28rpx;
  692. color: #333333;
  693. .u-input__content__field-wrapper__field {
  694. font-family: PingFangSC, PingFang SC !important;
  695. font-weight: 400 !important;
  696. font-size: 28rpx !important;
  697. color: #333333 !important;
  698. }
  699. }
  700. }
  701. .u-form-item__body {
  702. padding: 0;
  703. }
  704. .hidde-cell-title {
  705. .u-cell__body__content {
  706. width: auto;
  707. flex: none;
  708. }
  709. .u-cell__body {
  710. .value {
  711. flex: 1;
  712. }
  713. }
  714. }
  715. }
  716. </style>