综合办公系统
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

car.vue 30KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852
  1. <template>
  2. <view class="form-container">
  3. <!-- 表单标题 -->
  4. <view class="form-title">
  5. <text class="title-text">用车申请表</text>
  6. <view class="title-line"></view>
  7. </view>
  8. <uni-forms ref="form" :modelValue="form" :rules="rules" label-position="top" label-width="150" class="custom-form">
  9. <flow-note :taskForm="taskForm"></flow-note>
  10. <!-- 当前节点 -->
  11. <uni-forms-item label="当前节点" class="form-item" v-if="taskName">
  12. <uni-tag :inverted="true" type="primary" :text="taskName"></uni-tag>
  13. </uni-forms-item>
  14. <!-- 流程发起人 -->
  15. <uni-forms-item label="填报人" class="form-item">
  16. <b style="font-size:30rpx;">{{ applierUserName }}</b>
  17. </uni-forms-item>
  18. <!-- 填报日期 -->
  19. <uni-forms-item label="填报日期" class="form-item">
  20. <text>{{ form.applyDate }}</text>
  21. </uni-forms-item>
  22. <!-- 借款类型 -->
  23. <uni-forms-item label="申请用途" required class="form-item" name="carUsage">
  24. <uni-data-checkbox v-model="form.carUsage" :localdata="carUsageOptions" :disabled="taskName != '用车申请'"
  25. @change="hanldeChangeType"></uni-data-checkbox>
  26. </uni-forms-item>
  27. <!-- 选择项目 -->
  28. <uni-forms-item label="选择项目" required class="form-item" v-if="form.carUsage == 0" name="projectId">
  29. <u-button type="primary" @click="openProject = true" v-if="taskName == '用车申请'">+ 选择项目</u-button>
  30. <ProjectPicker :visible.sync="openProject" :selected.sync="selectedProject" @confirm="handleConfirm" />
  31. <ProjectInfo :project="projectObj"></ProjectInfo>
  32. </uni-forms-item>
  33. <!-- 用车事由 -->
  34. <uni-forms-item label="用车事由" required class="form-item" name="applyReason">
  35. <uv-textarea v-model="form.applyReason" placeholder="请输入用车事由" :disabled="taskName != '用车申请'"></uv-textarea>
  36. </uni-forms-item>
  37. <!-- 用车时间 -->
  38. <view class="date-range">
  39. <uni-forms-item label="使用日期" required class="form-item" name="dateRange">
  40. <uni-datetime-picker v-model="form.dateRange" type="daterange" rangeSeparator="至" :clearIcon="false"
  41. v-if="taskName == '用车申请'" @change="handleDateRangeChange" />
  42. <view class="date-display" v-else>
  43. <uni-icons type="calendar" size="16"></uni-icons>
  44. <text class="date-text">{{ form.beginDate }}</text>
  45. <text class="date-separator">至</text>
  46. <text class="date-text">{{ form.endDate }}</text>
  47. </view>
  48. </uni-forms-item>
  49. <uni-forms-item label="共计" class="form-item">
  50. <text>{{ form.days + '天' }}</text>
  51. </uni-forms-item>
  52. </view>
  53. <!-- 乘车人数 -->
  54. <uni-forms-item label="乘车人数" required class="form-item" name="passengers">
  55. <uni-number-box v-model="form.passengers" :min="1" :disabled="taskName != '用车申请'" />
  56. </uni-forms-item>
  57. <view v-if="taskName != '用车申请'">
  58. <!-- 部门审核意见 -->
  59. <uni-forms-item label="部门审核意见" required class="form-item" v-if="showFormItem('部门审核')" name="deptComment">
  60. <uv-textarea v-model="form.deptComment" placeholder="请输入部门审核意见" :disabled="taskName != '部门审核'"></uv-textarea>
  61. <auditor :name="form.deptUser ? form.deptUser.nickName : ''" :time="form.deptTime"></auditor>
  62. </uni-forms-item>
  63. <!-- 分管审核意见 -->
  64. <uni-forms-item label="分管审核意见" required class="form-item" v-if="showFormItem('分管审核')" name="managerComment">
  65. <uv-textarea v-model="form.managerComment" placeholder="请输入分管审核意见"
  66. :disabled="taskName != '分管审核'"></uv-textarea>
  67. <auditor :name="form.managerUser ? form.managerUser.nickName : ''" :time="form.managerTime"></auditor>
  68. </uni-forms-item>
  69. <!-- 党工团审核意见 -->
  70. <uni-forms-item :label="dgtAdvice" required class="form-item" v-if="showFormItem('党工团审核')" name="unionComment">
  71. <uv-textarea v-model="form.unionComment" placeholder="请输入审核意见" :disabled="taskName != '党工团审核'"></uv-textarea>
  72. <auditor :name="form.unionUser ? form.unionUser.nickName : ''" :time="form.unionTime"></auditor>
  73. </uni-forms-item>
  74. <!-- 总经理审核意见 -->
  75. <uni-forms-item label="总经理审核意见" required class="form-item" v-if="showFormItem('总经理审核')" name="gmComment">
  76. <uv-textarea v-model="form.gmComment" placeholder="请输入总经理审核意见" :disabled="taskName != '总经理审核'"></uv-textarea>
  77. <auditor :name="form.gmUser ? form.gmUser.nickName : ''" :time="form.gmTime"></auditor>
  78. </uni-forms-item>
  79. <!-- 董事长审核意见 -->
  80. <uni-forms-item label="董事长审核意见" required class="form-item" v-if="showFormItem('董事长审核')" name="dszComment">
  81. <uv-textarea v-model="form.dszComment" placeholder="请输入董事长审核意见" :disabled="taskName != '董事长审核'"></uv-textarea>
  82. <auditor :name="form.dszUser ? form.dszUser.nickName : ''" :time="form.dszTime"></auditor>
  83. </uni-forms-item>
  84. </view>
  85. <view v-if="taskName == '' || taskName == '安排用车'">
  86. <!-- 安排用车意见 -->
  87. <uni-forms-item label="安排用车意见" required class="form-item" name="dispatchComment">
  88. <uv-textarea v-model="form.dispatchComment" placeholder="请输入安排用车意见"
  89. :disabled="taskName != '安排用车'"></uv-textarea>
  90. <auditor :name="form.dispatchUser ? form.dispatchUser.nickName : ''" :time="form.dispatchTime"></auditor>
  91. </uni-forms-item>
  92. <!-- 车牌号选择 -->
  93. <uni-forms-item label="车牌号" class="form-item" name="cars">
  94. <view class="car-list">
  95. <uv-checkbox-group v-model="form.cars" v-if="taskName == '安排用车'">
  96. <view class="car-row" v-for="(row, index) in Math.ceil(carList.length / 2)" :key="index">
  97. <view class="car-item" v-for="item in carList.slice(index * 2, (index + 1) * 2)" :key="item.carId"
  98. :class="{ 'is-checked': form.cars.includes(item.carId) }">
  99. <uv-checkbox :name="item.carId" :disabled="item.status != 1">
  100. <view class="car-info">
  101. <text class="car-license">{{ item.licensePlate }}</text>
  102. <text class="car-model">{{ item.brand || '' }}{{ item.series || '' }}</text>
  103. </view>
  104. </uv-checkbox>
  105. </view>
  106. </view>
  107. </uv-checkbox-group>
  108. <view class="car-row" v-for="(row, index) in Math.ceil(carList.length / 2)" :key="index" v-else>
  109. <view class="car-item" v-for="item in carList.slice(index * 2, (index + 1) * 2)" :key="item.carId"
  110. :class="{ 'is-checked': form.cars.includes(item.carId) }">
  111. <text class="car-license">{{ item.licensePlate }}</text>
  112. <text class="car-model">{{ item.brand || '' }}{{ item.series || '' }}</text>
  113. </view>
  114. </view>
  115. </view>
  116. </uni-forms-item>
  117. <!-- 驾驶员选择 -->
  118. <uni-forms-item label="驾驶员" class="form-item" name="drivers">
  119. <u-button type="primary" v-if="taskName == '安排用车'" @click="openCar = true">+ 选择人员</u-button>
  120. <view class="driver-list" v-if="chooseDriver.length > 0">
  121. <u-tag v-for="(item, index) in chooseDriver" :plain="true" :key="index" :text="item.nickName"
  122. style="margin: 5px;" />
  123. </view>
  124. </uni-forms-item>
  125. <!-- 返回日期和行驶公里 -->
  126. <uni-forms-item label="返回日期" required class="form-item" name="returnDate">
  127. <uni-datetime-picker v-model="form.returnDate" type="datetime" :disabled="taskName != '安排用车'" />
  128. </uni-forms-item>
  129. <uni-forms-item label="行驶公里" class="form-item" name="kilometers">
  130. <uv-input v-model="form.kilometers" placeholder="请输入行驶公里" :disabled="taskName != '安排用车'"
  131. @input="handleKilometersInput">
  132. <template v-slot:suffix>
  133. <text>公里</text>
  134. </template>
  135. </uv-input>
  136. </uni-forms-item>
  137. </view>
  138. <!-- 提交按钮 -->
  139. <view class="submit-btn" v-if="taskName == '用车申请'">
  140. <u-button type="primary" @click="submit">提交申请</u-button>
  141. </view>
  142. <view v-else>
  143. <u-button style="margin-bottom:5px;" type="warning" @click="saves" v-if="taskName == '安排用车'">保存</u-button>
  144. <u-button type="primary" @click="completeApply"
  145. :disabled="taskName == '安排用车' && !form.returnDate" v-if="taskName">完成审批</u-button>
  146. </view>
  147. </uni-forms>
  148. <!-- 选择人员弹窗 -->
  149. <u-popup :show="openCar" mode="center" round="10" @close="openCar = false">
  150. <view class="popup-content">
  151. <view class="popup-header">
  152. <text class="title">选择驾驶员</text>
  153. <u-icon name="close" @click="openCar = false"></u-icon>
  154. </view>
  155. <choose-people :multiple="true" @chooseUser="getChooseDriver" :deptId="200" @clear="clearChooseDriver" :selected="chooseDriver"></choose-people>
  156. </view>
  157. </u-popup>
  158. </view>
  159. </template>
  160. <script>
  161. import { parseTime } from "@/utils/common.js"
  162. import { complete, rejectTask, returnList, returnTask, getNextFlowNode, delegate, flowTaskForm, } from "@/api/flowable/todo";
  163. import { listCar, getCar } from "@/api/oa/car/car";
  164. import { listCarApproval, getCarApproval, updateCarApproval, addCarApproval, modifyCarApproval } from '@/api/oa/car/carApproval'
  165. import { listProject, getProject } from "@/api/oa/project/project";
  166. import { getUserByRole } from "@/api/system/role";
  167. import { getUsersManageLeader, getUserByPost, getUsersDeptLeader } from '@/api/system/post.js'
  168. import { getUser } from '@/api/system/user';
  169. import FlowNote from '@/pages/components/flowNote.vue';
  170. import ProjectPicker from '@/pages/components/ProjectPicker.vue';
  171. import ProjectInfo from '@/pages/components/ProjectInfo.vue';
  172. import Auditor from "@/pages/components/auditor.vue";
  173. import ChoosePeople from "@/pages/components/ChoosePeople.vue";
  174. export default {
  175. components: {
  176. FlowNote,
  177. ProjectPicker,
  178. ProjectInfo,
  179. Auditor,
  180. ChoosePeople,
  181. },
  182. props: {
  183. taskForm: Object,
  184. taskName: String,
  185. startUserName: String,
  186. },
  187. data() {
  188. return {
  189. form: {
  190. applyDate: '',
  191. projectId: '',
  192. carUsage: '0',
  193. applyReason: '',
  194. beginDate: '',
  195. endDate: '',
  196. days: 0,
  197. passengers: 1,
  198. deptComment: null,
  199. managerComment: null,
  200. unionComment: null,
  201. gmComment: null,
  202. dszComment: null,
  203. dispatchComment: null,
  204. cars: [],
  205. drivers: [],
  206. returnDate: '',
  207. kilometers: '',
  208. user: {
  209. nickName: '',
  210. },
  211. dept: {
  212. deptId: '',
  213. deptName: '',
  214. },
  215. applier: '',
  216. },
  217. rules: {},
  218. openProject: false,
  219. projectObj: {},
  220. selectedProject: {},
  221. carUsageOptions: [{
  222. text: '项目用车',
  223. value: '0',
  224. disable: false
  225. }, {
  226. text: '非项目用车',
  227. value: '1',
  228. disable: false
  229. }, {
  230. text: '工会用车',
  231. value: '2',
  232. disable: false
  233. }, {
  234. text: '党委用车',
  235. value: '3',
  236. disable: false
  237. }, {
  238. text: '团委用车',
  239. value: '4',
  240. disable: false
  241. }],
  242. dept: 0,
  243. deptUser: '',
  244. managerUser: '',
  245. unionUser: '',
  246. gmUser: '',
  247. dszUser: '',
  248. dispatchUser: '',
  249. deptTime: undefined,
  250. managerTime: undefined,
  251. unionTime: undefined,
  252. gmTime: undefined,
  253. dszTime: undefined,
  254. dispatchTime: undefined,
  255. carList: [],
  256. chooseDriver: [],
  257. openCar: false,
  258. dgtAdvice: '审核意见',
  259. }
  260. },
  261. computed: {
  262. formRules() {
  263. return {
  264. carUsage: {
  265. rules: [{
  266. required: this.taskName == '用车申请',
  267. errorMessage: '请选择申请用途'
  268. }]
  269. },
  270. projectId: {
  271. rules: [{
  272. required: this.taskName == '用车申请' && this.form.carUsage == '0',
  273. errorMessage: '请选择项目'
  274. }]
  275. },
  276. applyReason: {
  277. rules: [{
  278. required: this.taskName == '用车申请',
  279. errorMessage: '请输入用车事由'
  280. }]
  281. },
  282. dateRange: {
  283. rules: [{
  284. required: this.taskName == '用车申请',
  285. errorMessage: '请选择用车时间'
  286. }]
  287. },
  288. passengers: {
  289. rules: [{
  290. required: this.taskName == '用车申请',
  291. errorMessage: '请输入乘车人数'
  292. }]
  293. },
  294. deptComment: {
  295. rules: [{
  296. required: this.taskName == '部门审核',
  297. errorMessage: '请输入部门审核意见'
  298. }]
  299. },
  300. managerComment: {
  301. rules: [{
  302. required: this.taskName == '分管审核',
  303. errorMessage: '请输入分管审核意见'
  304. }]
  305. },
  306. unionComment: {
  307. rules: [{
  308. required: this.taskName == '党工团审核',
  309. errorMessage: '请输入审核意见'
  310. }]
  311. },
  312. gmComment: {
  313. rules: [{
  314. required: this.taskName == '总经理审核',
  315. errorMessage: '请输入总经理审核意见'
  316. }]
  317. },
  318. dszComment: {
  319. rules: [{
  320. required: this.taskName == '董事长审核',
  321. errorMessage: '请输入董事长审核意见'
  322. }]
  323. },
  324. dispatchComment: {
  325. rules: [{
  326. required: this.taskName == '安排用车',
  327. errorMessage: '请输入安排用车意见'
  328. }]
  329. },
  330. cars: {
  331. rules: [{
  332. required: this.taskName == '安排用车',
  333. errorMessage: '请选择车牌号'
  334. }]
  335. },
  336. drivers: {
  337. rules: [{
  338. required: this.taskName == '安排用车',
  339. errorMessage: '请选择驾驶员'
  340. }]
  341. },
  342. returnDate: {
  343. rules: [{
  344. required: true,
  345. errorMessage: '请选择归还日期',
  346. validateFunction: (rule, value, data, callback) => {
  347. if (this.taskName === '安排用车' && !value) {
  348. callback('请选择归还日期');
  349. } else {
  350. callback();
  351. }
  352. }
  353. }]
  354. },
  355. kilometers: {
  356. rules: [{
  357. required: this.taskName == '安排用车',
  358. errorMessage: '请输入行驶公里'
  359. }]
  360. }
  361. }
  362. }
  363. },
  364. watch: {
  365. formRules: {
  366. handler(newVal) {
  367. this.rules = newVal;
  368. },
  369. immediate: true
  370. }
  371. },
  372. created() {
  373. this.applierUserName = this.startUserName;
  374. this.initForm();
  375. this.getCarList();
  376. this.getDriverList();
  377. },
  378. methods: {
  379. initForm() {
  380. getCarApproval(this.taskForm.formId).then(res => {
  381. if (res.data) {
  382. let data = res.data;
  383. if (data.carUsage == '2') {
  384. this.dept = 0;
  385. this.dgtAdvice = '工会审核意见'
  386. } else if (data.carUsage == '3') {
  387. this.dept = 0;
  388. this.dgtAdvice = '党委审核意见'
  389. } else if (data.carUsage == '4') {
  390. this.dept = 0;
  391. this.dgtAdvice = '团委审核意见'
  392. }
  393. if (res.data.drivers) {
  394. data.drivers = data.drivers.split(',').map(Number);
  395. this.chooseDriver = [];
  396. for (let d of data.drivers) {
  397. getUser(Number(d)).then(res => {
  398. this.chooseDriver.push(res.data)
  399. })
  400. }
  401. } else {
  402. data.drivers = []
  403. }
  404. if (res.data.cars) {
  405. data.cars = data.cars.split(',').map(Number);
  406. } else {
  407. data.cars = []
  408. }
  409. this.form = data;
  410. if (data.projectId) {
  411. getProject(data.projectId).then(response => {
  412. this.projectObj = response.data;
  413. })
  414. }
  415. this.calculateDay();
  416. this.initAuditor();
  417. } else {
  418. this.form.applyDate = parseTime(new Date(), "{y}-{m}-{d}");
  419. this.form.user.nickName = this.$store.getters.name;
  420. this.form.applier = this.$store.getters.userId;
  421. this.form.useDept = this.$store.getters.deptId;
  422. this.dept = this.$store.getters.deptId;
  423. this.form.dept.deptName = this.$store.getters.deptName;
  424. }
  425. })
  426. },
  427. initAuditor() {
  428. },
  429. handleConfirm(project) {
  430. this.selectedProject = project;
  431. this.projectObj = project;
  432. this.form.projectId = project.projectId;
  433. },
  434. hanldeChangeType(val) {
  435. let value = val.detail.value
  436. if (value == '2' || value == '3' || value == '4') {
  437. this.dept = 0;
  438. this.form.projectId = '';
  439. }
  440. else
  441. this.dept = this.$store.getters.deptId;
  442. },
  443. handleDateRangeChange(e) {
  444. if (Array.isArray(e) && e.length === 2) {
  445. const [start, end] = e;
  446. this.form.beginDate = start;
  447. this.form.endDate = end;
  448. this.form.dateRange = [start, end];
  449. this.calculateDay();
  450. }
  451. },
  452. calculateDay() {
  453. if (this.form.beginDate && this.form.endDate) {
  454. const begin = new Date(this.form.beginDate);
  455. const end = new Date(this.form.endDate);
  456. if (!isNaN(begin.getTime()) && !isNaN(end.getTime())) {
  457. this.form.days = Math.ceil((end - begin) / (1000 * 60 * 60 * 24)) + 1;
  458. }
  459. }
  460. },
  461. getCarList() {
  462. listCar({
  463. pageNum: 1,
  464. pageSize: 99999999,
  465. }).then(response => {
  466. this.carList = response.rows;
  467. })
  468. },
  469. getDriverList() {
  470. getUserByPost({ postName: '驾驶员' }).then(response => {
  471. this.driverList = response.data;
  472. })
  473. },
  474. getChooseDriver(val) {
  475. this.chooseDriver = val;
  476. if (val.length != 0) {
  477. let drivers = []
  478. for (let d of this.chooseDriver) {
  479. drivers.push(d.userId)
  480. }
  481. this.form.drivers = drivers;
  482. }
  483. this.openCar = false;
  484. },
  485. clearChooseDriver() {
  486. this.chooseDriver = [];
  487. this.form.drivers = [];
  488. },
  489. submit() {
  490. this.$refs.form.validate().then(() => {
  491. this.$modal.confirm('是否提交用车申请?').then(() => {
  492. this.form.carApplyId = this.taskForm.formId;
  493. let jsonForm = JSON.stringify(this.form);
  494. this.form.cars = '';
  495. this.form.drivers = '';
  496. addCarApproval(this.form).then((res) => {
  497. if (res.code == 200) {
  498. getNextFlowNode({ taskId: this.taskForm.taskId }).then(res => {
  499. this.getNextFlowNodeApproval().then(() => {
  500. uni.showToast({
  501. title: '提交成功',
  502. icon: 'success'
  503. });
  504. setTimeout(() => {
  505. uni.switchTab({
  506. url: '/pages/message/index'
  507. });
  508. }, 500);
  509. });
  510. })
  511. }
  512. })
  513. })
  514. }).catch(error => {
  515. console.log(error)
  516. })
  517. },
  518. saves() {
  519. if (this.taskName == '安排用车') {
  520. if (!this.form.dispatchComment) {
  521. uni.showToast({
  522. title: '请填写安排用车意见',
  523. icon: 'none'
  524. });
  525. return
  526. }
  527. }
  528. let jsonForm = JSON.stringify(this.form);
  529. modifyCarApproval(jsonForm).then(res => {
  530. uni.showToast({
  531. title: '保存成功',
  532. icon: 'success'
  533. });
  534. });
  535. },
  536. completeApply() {
  537. this.$refs.form.validate().then(() => {
  538. if (this.form.deptComment === '') this.form.deptComment = null;
  539. if (this.form.managerComment === '') this.form.managerComment = null;
  540. if (this.form.unionComment === '') this.form.unionComment = null;
  541. if (this.form.gmComment === '') this.form.gmComment = null;
  542. if (this.form.dszComment === '') this.form.dszComment = null;
  543. if (this.form.dispatchComment === '') this.form.dispatchComment = null;
  544. this.form.formId = this.taskForm.formId;
  545. this.form.carApplyId = this.taskForm.formId;
  546. let jsonForm = JSON.stringify(this.form);
  547. modifyCarApproval(jsonForm).then(res => {
  548. if (res.code == 200) {
  549. uni.showModal({
  550. title: '提示',
  551. content: '是否提交审批?',
  552. success: (res) => {
  553. if (res.confirm) {
  554. getNextFlowNode({ taskId: this.taskForm.taskId }).then(res => {
  555. const data = res.data;
  556. this.getNextFlowNodeApproval().then(() => {
  557. uni.showToast({
  558. title: '提交成功',
  559. icon: 'success'
  560. });
  561. setTimeout(() => {
  562. uni.switchTab({
  563. url: '/pages/message/index'
  564. });
  565. }, 500);
  566. });
  567. })
  568. } else {
  569. reject(new Error('用户取消提交'));
  570. }
  571. }
  572. });
  573. }
  574. })
  575. }).catch(() => {
  576. uni.showToast({
  577. title: '必填项未填写完毕',
  578. icon: 'none'
  579. });
  580. })
  581. },
  582. getNextFlowNodeApproval() {
  583. return new Promise((resolve, reject) => {
  584. const handleComplete = () => {
  585. complete(this.taskForm).then(response => {
  586. uni.showToast({
  587. title: response.msg,
  588. icon: 'success'
  589. });
  590. resolve();
  591. }).catch(error => {
  592. reject(error);
  593. });
  594. };
  595. const setApprovalAndComplete = (approval) => {
  596. this.$set(this.taskForm.variables, "approval", approval);
  597. handleComplete();
  598. };
  599. const setApprovalListAndComplete = (approvalList) => {
  600. this.$set(this.taskForm.variables, "approvalList", approvalList);
  601. handleComplete();
  602. };
  603. if (this.taskName == '用车申请') {
  604. this.$set(this.taskForm.variables, "dept", this.dept);
  605. if (this.dept == 101) {
  606. getUserByPost({ postName: '董事长' }).then(result => {
  607. setApprovalAndComplete(result.data[0].userId);
  608. }).catch(error => {
  609. reject(error);
  610. });
  611. } else if (this.dept == 102) {
  612. getUserByPost({ postName: '总经理' }).then(result => {
  613. setApprovalAndComplete(result.data[0].userId);
  614. }).catch(error => {
  615. reject(error);
  616. });
  617. } else if (this.dept == 0) {
  618. const postName = this.getChooseType();
  619. getUserByPost({ postName }).then(result => {
  620. setApprovalAndComplete(result.data[0].userId);
  621. }).catch(error => {
  622. reject(error);
  623. });
  624. } else {
  625. getUsersDeptLeader({ userId: this.$store.getters.userId }).then(res => {
  626. if (res.data) {
  627. setApprovalAndComplete(res.data.userId);
  628. } else {
  629. reject(new Error('未找到部门领导'));
  630. }
  631. }).catch(error => {
  632. reject(error);
  633. });
  634. }
  635. } else if (this.taskName == '部门审核') {
  636. getUsersManageLeader({ userId: this.$store.getters.userId }).then(res => {
  637. const userId = res.data.map(user => user.userId);
  638. setApprovalListAndComplete(userId);
  639. }).catch(error => {
  640. reject(error);
  641. });
  642. } else if (['分管审核', '党工团审核', '总经理审核', '董事长审核'].includes(this.taskName)) {
  643. getUserByRole({ roleId: 5 }).then(result => {
  644. setApprovalListAndComplete(result.data);
  645. }).catch(error => {
  646. reject(error);
  647. });
  648. } else if (this.taskName == '安排用车') {
  649. uni.showModal({
  650. title: '提示',
  651. content: '最后一个节点,提交将结束流程,是否提交?',
  652. success: (res) => {
  653. if (res.confirm) {
  654. handleComplete();
  655. } else {
  656. reject(new Error('用户取消提交'));
  657. }
  658. }
  659. });
  660. }
  661. });
  662. },
  663. getChooseType() {
  664. if (this.form.carUsage == '2') {
  665. return '党总支书记'
  666. }
  667. else if (this.form.carUsage == '3') {
  668. return '工会主席'
  669. }
  670. else
  671. return '团委书记'
  672. },
  673. showFormItem(name) {
  674. let isShow = false;
  675. if (name == '部门审核')
  676. isShow = (this.dept > 102 && this.taskName == '用车申请') || (this.taskName == '部门审核' || this.taskName == '分管审核') || ((this.taskName == '安排用车' || this.taskName == '') && this.form.deptUserId != null);
  677. else if (name == '分管审核')
  678. isShow = (this.dept > 102 && this.taskName == '用车申请') || (this.taskName == '部门审核' || this.taskName == '分管审核') || ((this.taskName == '安排用车' || this.taskName == '') && this.form.managerUserId != null);
  679. else if (name == '党工团审核')
  680. isShow = (this.dept == 0 && this.taskName == '用车申请') || this.taskName == '党工团审核' || ((this.taskName == '安排用车' || this.taskName == '') && this.form.unionUserId != null);
  681. else if (name == '总经理审核')
  682. isShow = (this.dept == 102 && this.taskName == '用车申请') || this.taskName == '总经理审核' || ((this.taskName == '安排用车' || this.taskName == '') && this.form.gmUserId != null);
  683. else if (name == '董事长审核')
  684. isShow = (this.dept == 101 && this.taskName == '用车申请') || this.taskName == '董事长审核' || ((this.taskName == '安排用车' || this.taskName == '') && this.form.dszUserId != null);
  685. else if (name == '部门审核签名')
  686. isShow = (this.taskName == '部门审核' || this.taskName == '分管审核') || ((this.taskName == '安排用车' || this.taskName == '') && this.form.deptUserId != null);
  687. else if (name == '分管审核签名')
  688. isShow = this.taskName == '分管审核' || ((this.taskName == '安排用车' || this.taskName == '') && this.form.managerUserId != null);
  689. else if (name == '党工团审核签名')
  690. isShow = this.taskName == '党工团审核' || ((this.taskName == '安排用车' || this.taskName == '') && this.form.unionUserId != null);
  691. else if (name == '总经理审核签名')
  692. isShow = this.taskName == '总经理审核' || ((this.taskName == '安排用车' || this.taskName == '') && this.form.gmUserId != null);
  693. else if (name == '董事长审核签名')
  694. isShow = this.taskName == '董事长审核' || ((this.taskName == '安排用车' || this.taskName == '') && this.form.dszUserId != null);
  695. return isShow;
  696. },
  697. handleKilometersInput(val) {
  698. // 只允许输入数字
  699. this.form.kilometers = val.replace(/[^\d]/g, '');
  700. },
  701. },
  702. }
  703. </script>
  704. <style lang="scss" scoped>
  705. .form-container {
  706. padding: 20rpx;
  707. }
  708. .form-title {
  709. text-align: center;
  710. margin-bottom: 30rpx;
  711. .title-text {
  712. font-size: 36rpx;
  713. font-weight: bold;
  714. }
  715. .title-line {
  716. height: 2rpx;
  717. background-color: #eee;
  718. margin-top: 20rpx;
  719. }
  720. }
  721. .custom-form {
  722. .form-item {
  723. // margin-bottom: 30rpx;
  724. }
  725. }
  726. .date-range {
  727. align-items: center;
  728. gap: 20rpx;
  729. }
  730. .date-text {
  731. margin: 0 10px;
  732. font-weight: bold;
  733. }
  734. .car-list {
  735. padding: 20rpx 0;
  736. .car-row {
  737. display: flex;
  738. justify-content: space-between;
  739. margin-bottom: 20rpx;
  740. }
  741. .car-item {
  742. width: calc(50vw - 50rpx);
  743. background-color: #f8f8f8;
  744. border-radius: 12rpx;
  745. padding: 20rpx;
  746. transition: all 0.3s;
  747. margin: 0 3px;
  748. border: 2rpx solid transparent;
  749. &:active {
  750. background-color: #f0f0f0;
  751. }
  752. // 选中状态的样式
  753. &.is-checked {
  754. background-color: #e6f7ff;
  755. border-color: #1890ff;
  756. box-shadow: 0 2rpx 8rpx rgba(24, 144, 255, 0.15);
  757. }
  758. .car-info {
  759. display: flex;
  760. flex-direction: column;
  761. gap: 8rpx;
  762. .car-license {
  763. font-size: 32rpx;
  764. font-weight: bold;
  765. color: #333;
  766. }
  767. .car-model {
  768. font-size: 24rpx;
  769. color: #666;
  770. }
  771. }
  772. }
  773. }
  774. .driver-list {
  775. display: flex;
  776. flex-wrap: wrap;
  777. gap: 20rpx;
  778. margin-top: 20rpx;
  779. }
  780. .auditor-info {
  781. margin-top: 20rpx;
  782. display: flex;
  783. justify-content: space-between;
  784. color: #666;
  785. font-size: 24rpx;
  786. }
  787. .popup-content {
  788. width: 90vw;
  789. max-height: 80vh;
  790. background-color: #fff;
  791. border-radius: 20rpx;
  792. overflow: hidden;
  793. .popup-header {
  794. display: flex;
  795. justify-content: space-between;
  796. align-items: center;
  797. padding: 30rpx;
  798. border-bottom: 2rpx solid #f5f5f5;
  799. .title {
  800. font-size: 32rpx;
  801. font-weight: bold;
  802. color: #333;
  803. }
  804. }
  805. }
  806. </style>