综合办公系统
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 32KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903
  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 { listUser, getUser } from "@/api/system/user";
  169. import { sendQyMessage } from "@/api/qywx/index";
  170. import FlowNote from '@/pages/components/flowNote.vue';
  171. import ProjectPicker from '@/pages/components/ProjectPicker.vue';
  172. import ProjectInfo from '@/pages/components/ProjectInfo.vue';
  173. import Auditor from "@/pages/components/auditor.vue";
  174. import ChoosePeople from "@/pages/components/ChoosePeople.vue";
  175. export default {
  176. components: {
  177. FlowNote,
  178. ProjectPicker,
  179. ProjectInfo,
  180. Auditor,
  181. ChoosePeople,
  182. },
  183. props: {
  184. taskForm: Object,
  185. taskName: String,
  186. startUserName: String,
  187. },
  188. data() {
  189. return {
  190. form: {
  191. applyDate: '',
  192. projectId: '',
  193. carUsage: '0',
  194. applyReason: '',
  195. beginDate: '',
  196. endDate: '',
  197. days: 0,
  198. passengers: 1,
  199. deptComment: null,
  200. managerComment: null,
  201. unionComment: null,
  202. gmComment: null,
  203. dszComment: null,
  204. dispatchComment: null,
  205. cars: [],
  206. drivers: [],
  207. returnDate: '',
  208. kilometers: '',
  209. user: {
  210. nickName: '',
  211. },
  212. dept: {
  213. deptId: '',
  214. deptName: '',
  215. },
  216. applier: '',
  217. },
  218. rules: {},
  219. openProject: false,
  220. projectObj: {},
  221. selectedProject: {},
  222. carUsageOptions: [{
  223. text: '项目用车',
  224. value: '0',
  225. disable: false
  226. }, {
  227. text: '非项目用车',
  228. value: '1',
  229. disable: false
  230. }, {
  231. text: '工会用车',
  232. value: '2',
  233. disable: false
  234. }, {
  235. text: '党委用车',
  236. value: '3',
  237. disable: false
  238. }, {
  239. text: '团委用车',
  240. value: '4',
  241. disable: false
  242. }],
  243. userList: [],
  244. dept: 0,
  245. deptUser: '',
  246. managerUser: '',
  247. unionUser: '',
  248. gmUser: '',
  249. dszUser: '',
  250. dispatchUser: '',
  251. deptTime: undefined,
  252. managerTime: undefined,
  253. unionTime: undefined,
  254. gmTime: undefined,
  255. dszTime: undefined,
  256. dispatchTime: undefined,
  257. carList: [],
  258. chooseDriver: [],
  259. openCar: false,
  260. dgtAdvice: '审核意见',
  261. }
  262. },
  263. computed: {
  264. formRules() {
  265. return {
  266. carUsage: {
  267. rules: [{
  268. required: this.taskName == '用车申请',
  269. errorMessage: '请选择申请用途'
  270. }]
  271. },
  272. projectId: {
  273. rules: [{
  274. required: this.taskName == '用车申请' && this.form.carUsage == '0',
  275. errorMessage: '请选择项目'
  276. }]
  277. },
  278. applyReason: {
  279. rules: [{
  280. required: this.taskName == '用车申请',
  281. errorMessage: '请输入用车事由'
  282. }]
  283. },
  284. dateRange: {
  285. rules: [{
  286. required: this.taskName == '用车申请',
  287. errorMessage: '请选择用车时间'
  288. }]
  289. },
  290. passengers: {
  291. rules: [{
  292. required: this.taskName == '用车申请',
  293. errorMessage: '请输入乘车人数'
  294. }]
  295. },
  296. deptComment: {
  297. rules: [{
  298. required: this.taskName == '部门审核',
  299. errorMessage: '请输入部门审核意见'
  300. }]
  301. },
  302. managerComment: {
  303. rules: [{
  304. required: this.taskName == '分管审核',
  305. errorMessage: '请输入分管审核意见'
  306. }]
  307. },
  308. unionComment: {
  309. rules: [{
  310. required: this.taskName == '党工团审核',
  311. errorMessage: '请输入审核意见'
  312. }]
  313. },
  314. gmComment: {
  315. rules: [{
  316. required: this.taskName == '总经理审核',
  317. errorMessage: '请输入总经理审核意见'
  318. }]
  319. },
  320. dszComment: {
  321. rules: [{
  322. required: this.taskName == '董事长审核',
  323. errorMessage: '请输入董事长审核意见'
  324. }]
  325. },
  326. dispatchComment: {
  327. rules: [{
  328. required: this.taskName == '安排用车',
  329. errorMessage: '请输入安排用车意见'
  330. }]
  331. },
  332. cars: {
  333. rules: [{
  334. required: this.taskName == '安排用车',
  335. errorMessage: '请选择车牌号'
  336. }]
  337. },
  338. drivers: {
  339. rules: [{
  340. required: this.taskName == '安排用车',
  341. errorMessage: '请选择驾驶员'
  342. }]
  343. },
  344. returnDate: {
  345. rules: [{
  346. required: true,
  347. errorMessage: '请选择归还日期',
  348. validateFunction: (rule, value, data, callback) => {
  349. if (this.taskName === '安排用车' && !value) {
  350. callback('请选择归还日期');
  351. } else {
  352. callback();
  353. }
  354. }
  355. }]
  356. },
  357. kilometers: {
  358. rules: [{
  359. required: this.taskName == '安排用车',
  360. errorMessage: '请输入行驶公里'
  361. }]
  362. }
  363. }
  364. }
  365. },
  366. watch: {
  367. formRules: {
  368. handler(newVal) {
  369. this.rules = newVal;
  370. },
  371. immediate: true
  372. }
  373. },
  374. created() {
  375. this.applierUserName = this.startUserName;
  376. this.getUserList();
  377. this.initForm();
  378. this.getCarList();
  379. this.getDriverList();
  380. },
  381. methods: {
  382. initForm() {
  383. getCarApproval(this.taskForm.formId).then(res => {
  384. if (res.data) {
  385. let data = res.data;
  386. if (data.carUsage == '2') {
  387. this.dept = 0;
  388. this.dgtAdvice = '工会审核意见'
  389. } else if (data.carUsage == '3') {
  390. this.dept = 0;
  391. this.dgtAdvice = '党委审核意见'
  392. } else if (data.carUsage == '4') {
  393. this.dept = 0;
  394. this.dgtAdvice = '团委审核意见'
  395. }
  396. if (res.data.drivers) {
  397. data.drivers = data.drivers.split(',').map(Number);
  398. this.chooseDriver = [];
  399. for (let d of data.drivers) {
  400. getUser(Number(d)).then(res => {
  401. this.chooseDriver.push(res.data)
  402. })
  403. }
  404. } else {
  405. data.drivers = []
  406. }
  407. if (res.data.cars) {
  408. data.cars = data.cars.split(',').map(Number);
  409. } else {
  410. data.cars = []
  411. }
  412. this.form = data;
  413. if (data.projectId) {
  414. getProject(data.projectId).then(response => {
  415. this.projectObj = response.data;
  416. })
  417. }
  418. this.calculateDay();
  419. this.initAuditor();
  420. } else {
  421. this.form.applyDate = parseTime(new Date(), "{y}-{m}-{d}");
  422. this.form.user.nickName = this.$store.getters.name;
  423. this.form.applier = this.$store.getters.userId;
  424. this.form.useDept = this.$store.getters.deptId;
  425. this.dept = this.$store.getters.deptId;
  426. this.form.dept.deptName = this.$store.getters.deptName;
  427. }
  428. })
  429. },
  430. // 获取用户列表
  431. getUserList() {
  432. listUser({
  433. pageNum: 1,
  434. pageSize: 9999
  435. }).then(res => {
  436. if (res.code == 200) {
  437. this.userList = res.rows
  438. }
  439. })
  440. },
  441. initAuditor() {
  442. },
  443. handleConfirm(project) {
  444. this.selectedProject = project;
  445. this.projectObj = project;
  446. this.form.projectId = project.projectId;
  447. },
  448. hanldeChangeType(val) {
  449. let value = val.detail.value
  450. if (value == '2' || value == '3' || value == '4') {
  451. this.dept = 0;
  452. this.form.projectId = '';
  453. }
  454. else
  455. this.dept = this.$store.getters.deptId;
  456. },
  457. handleDateRangeChange(e) {
  458. if (Array.isArray(e) && e.length === 2) {
  459. const [start, end] = e;
  460. this.form.beginDate = start;
  461. this.form.endDate = end;
  462. this.form.dateRange = [start, end];
  463. this.calculateDay();
  464. }
  465. },
  466. calculateDay() {
  467. if (this.form.beginDate && this.form.endDate) {
  468. const begin = new Date(this.form.beginDate);
  469. const end = new Date(this.form.endDate);
  470. if (!isNaN(begin.getTime()) && !isNaN(end.getTime())) {
  471. this.form.days = Math.ceil((end - begin) / (1000 * 60 * 60 * 24)) + 1;
  472. }
  473. }
  474. },
  475. getCarList() {
  476. listCar({
  477. pageNum: 1,
  478. pageSize: 99999999,
  479. }).then(response => {
  480. this.carList = response.rows;
  481. })
  482. },
  483. getDriverList() {
  484. getUserByPost({ postName: '驾驶员' }).then(response => {
  485. this.driverList = response.data;
  486. })
  487. },
  488. getChooseDriver(val) {
  489. this.chooseDriver = val;
  490. if (val.length != 0) {
  491. let drivers = []
  492. for (let d of this.chooseDriver) {
  493. drivers.push(d.userId)
  494. }
  495. this.form.drivers = drivers;
  496. }
  497. this.openCar = false;
  498. },
  499. clearChooseDriver() {
  500. this.chooseDriver = [];
  501. this.form.drivers = [];
  502. },
  503. submit() {
  504. this.$refs.form.validate().then(() => {
  505. this.$modal.confirm('是否提交用车申请?').then(() => {
  506. this.form.carApplyId = this.taskForm.formId;
  507. let jsonForm = JSON.stringify(this.form);
  508. this.form.cars = '';
  509. this.form.drivers = '';
  510. addCarApproval(this.form).then((res) => {
  511. if (res.code == 200) {
  512. getNextFlowNode({ taskId: this.taskForm.taskId }).then(res => {
  513. this.getNextFlowNodeApproval().then(() => {
  514. uni.showToast({
  515. title: '提交成功',
  516. icon: 'success'
  517. });
  518. setTimeout(() => {
  519. uni.switchTab({
  520. url: '/pages/message/index'
  521. });
  522. }, 500);
  523. });
  524. })
  525. }
  526. })
  527. })
  528. }).catch(error => {
  529. console.log(error)
  530. })
  531. },
  532. saves() {
  533. if (this.taskName == '安排用车') {
  534. if (!this.form.dispatchComment) {
  535. uni.showToast({
  536. title: '请填写安排用车意见',
  537. icon: 'none'
  538. });
  539. return
  540. }
  541. }
  542. let jsonForm = JSON.stringify(this.form);
  543. modifyCarApproval(jsonForm).then(res => {
  544. uni.showToast({
  545. title: '保存成功',
  546. icon: 'success'
  547. });
  548. });
  549. },
  550. completeApply() {
  551. this.$refs.form.validate().then(() => {
  552. if (this.form.deptComment === '') this.form.deptComment = null;
  553. if (this.form.managerComment === '') this.form.managerComment = null;
  554. if (this.form.unionComment === '') this.form.unionComment = null;
  555. if (this.form.gmComment === '') this.form.gmComment = null;
  556. if (this.form.dszComment === '') this.form.dszComment = null;
  557. if (this.form.dispatchComment === '') this.form.dispatchComment = null;
  558. this.form.formId = this.taskForm.formId;
  559. this.form.carApplyId = this.taskForm.formId;
  560. let jsonForm = JSON.stringify(this.form);
  561. modifyCarApproval(jsonForm).then(res => {
  562. if (res.code == 200) {
  563. uni.showModal({
  564. title: '提示',
  565. content: '是否提交审批?',
  566. success: (res) => {
  567. if (res.confirm) {
  568. getNextFlowNode({ taskId: this.taskForm.taskId }).then(res => {
  569. const data = res.data;
  570. this.getNextFlowNodeApproval().then(() => {
  571. uni.showToast({
  572. title: '提交成功',
  573. icon: 'success'
  574. });
  575. setTimeout(() => {
  576. uni.switchTab({
  577. url: '/pages/message/index'
  578. });
  579. }, 500);
  580. });
  581. })
  582. } else {
  583. reject(new Error('用户取消提交'));
  584. }
  585. }
  586. });
  587. }
  588. })
  589. }).catch(() => {
  590. uni.showToast({
  591. title: '必填项未填写完毕',
  592. icon: 'none'
  593. });
  594. })
  595. },
  596. getNextFlowNodeApproval() {
  597. return new Promise((resolve, reject) => {
  598. const handleComplete = () => {
  599. complete(this.taskForm).then(response => {
  600. uni.showToast({
  601. title: response.msg,
  602. icon: 'success'
  603. });
  604. resolve();
  605. }).catch(error => {
  606. reject(error);
  607. });
  608. };
  609. const setApprovalAndComplete = async (approval) => {
  610. this.$set(this.taskForm.variables, "approval", approval);
  611. handleComplete();
  612. await this.sendQyMessage([approval]);
  613. };
  614. const setApprovalListAndComplete = async (approvalList) => {
  615. let userIds = [];
  616. if (Array.isArray(approvalList)) {
  617. userIds = approvalList.map(item => typeof item === 'object' ? item.userId : item);
  618. }
  619. this.$set(this.taskForm.variables, "approvalList", approvalList);
  620. handleComplete();
  621. await this.sendQyMessage(userIds);
  622. };
  623. if (this.taskName == '用车申请') {
  624. this.$set(this.taskForm.variables, "dept", this.dept);
  625. if (this.dept == 101) {
  626. getUserByPost({ postName: '董事长' }).then(async result => {
  627. await setApprovalAndComplete(result.data[0].userId);
  628. }).catch(error => {
  629. reject(error);
  630. });
  631. } else if (this.dept == 102) {
  632. getUserByPost({ postName: '总经理' }).then(async result => {
  633. await setApprovalAndComplete(result.data[0].userId);
  634. }).catch(error => {
  635. reject(error);
  636. });
  637. } else if (this.dept == 0) {
  638. const postName = this.getChooseType();
  639. getUserByPost({ postName }).then(async result => {
  640. await setApprovalAndComplete(result.data[0].userId);
  641. }).catch(error => {
  642. reject(error);
  643. });
  644. } else {
  645. getUsersDeptLeader({ userId: this.$store.getters.userId }).then(async res => {
  646. if (res.data) {
  647. await setApprovalAndComplete(res.data.userId);
  648. } else {
  649. reject(new Error('未找到部门领导'));
  650. }
  651. }).catch(error => {
  652. reject(error);
  653. });
  654. }
  655. } else if (this.taskName == '部门审核') {
  656. getUsersManageLeader({ userId: this.$store.getters.userId }).then(async res => {
  657. const userIds = res.data.map(user => user.userId);
  658. await setApprovalListAndComplete(userIds);
  659. }).catch(error => {
  660. reject(error);
  661. });
  662. } else if (['分管审核', '党工团审核', '总经理审核', '董事长审核'].includes(this.taskName)) {
  663. getUserByRole({ roleId: 5 }).then(async result => {
  664. await setApprovalListAndComplete(result.data);
  665. }).catch(error => {
  666. reject(error);
  667. });
  668. } else if (this.taskName == '安排用车') {
  669. uni.showModal({
  670. title: '提示',
  671. content: '最后一个节点,提交将结束流程,是否提交?',
  672. success: (res) => {
  673. if (res.confirm) {
  674. handleComplete();
  675. } else {
  676. reject(new Error('用户取消提交'));
  677. }
  678. }
  679. });
  680. }
  681. });
  682. },
  683. getChooseType() {
  684. if (this.form.carUsage == '2') {
  685. return '党总支书记'
  686. }
  687. else if (this.form.carUsage == '3') {
  688. return '工会主席'
  689. }
  690. else
  691. return '团支部书记'
  692. },
  693. showFormItem(name) {
  694. let isShow = false;
  695. if (name == '部门审核')
  696. isShow = (this.dept > 102 && this.taskName == '用车申请') || (this.taskName == '部门审核' || this.taskName == '分管审核') || ((this.taskName == '安排用车' || this.taskName == '') && this.form.deptUserId != null);
  697. else if (name == '分管审核')
  698. isShow = (this.dept > 102 && this.taskName == '用车申请') || (this.taskName == '部门审核' || this.taskName == '分管审核') || ((this.taskName == '安排用车' || this.taskName == '') && this.form.managerUserId != null);
  699. else if (name == '党工团审核')
  700. isShow = (this.dept == 0 && this.taskName == '用车申请') || this.taskName == '党工团审核' || ((this.taskName == '安排用车' || this.taskName == '') && this.form.unionUserId != null);
  701. else if (name == '总经理审核')
  702. isShow = (this.dept == 102 && this.taskName == '用车申请') || this.taskName == '总经理审核' || ((this.taskName == '安排用车' || this.taskName == '') && this.form.gmUserId != null);
  703. else if (name == '董事长审核')
  704. isShow = (this.dept == 101 && this.taskName == '用车申请') || this.taskName == '董事长审核' || ((this.taskName == '安排用车' || this.taskName == '') && this.form.dszUserId != null);
  705. else if (name == '部门审核签名')
  706. isShow = (this.taskName == '部门审核' || this.taskName == '分管审核') || ((this.taskName == '安排用车' || this.taskName == '') && this.form.deptUserId != null);
  707. else if (name == '分管审核签名')
  708. isShow = this.taskName == '分管审核' || ((this.taskName == '安排用车' || this.taskName == '') && this.form.managerUserId != null);
  709. else if (name == '党工团审核签名')
  710. isShow = this.taskName == '党工团审核' || ((this.taskName == '安排用车' || this.taskName == '') && this.form.unionUserId != null);
  711. else if (name == '总经理审核签名')
  712. isShow = this.taskName == '总经理审核' || ((this.taskName == '安排用车' || this.taskName == '') && this.form.gmUserId != null);
  713. else if (name == '董事长审核签名')
  714. isShow = this.taskName == '董事长审核' || ((this.taskName == '安排用车' || this.taskName == '') && this.form.dszUserId != null);
  715. return isShow;
  716. },
  717. handleKilometersInput(val) {
  718. // 只允许输入数字
  719. this.form.kilometers = val.replace(/[^\d]/g, '');
  720. },
  721. // 发送企业微信消息
  722. async sendQyMessage(userIds) {
  723. if (userIds && userIds.length > 0) {
  724. let formData = new FormData();
  725. let message = "您有一条新的用车申请: \n>" +
  726. "申请人:<font color='info'>" + this.getUserName(this.form.applier) + "</font> \n>" +
  727. "用车事由:" + this.form.applyReason + " \n>" +
  728. "开始日期:" + this.form.beginDate + " \n>" +
  729. "结束日期:" + this.form.endDate + " \n>" +
  730. "乘车人数:" + this.form.passengers + "人 \n>" +
  731. "\n>" +
  732. "已办流程:<font color='comment'>" + this.taskName + "</font> \n>";
  733. formData.append('message', message);
  734. let userString = [];
  735. for (let u of userIds) {
  736. let { data } = await getUser(u);
  737. if (data && data.pinyin) {
  738. userString.push(data.pinyin);
  739. }
  740. }
  741. formData.append('userString', userString.join('|') + '|YuSiHan|WangRongHua')
  742. await sendQyMessage(formData);
  743. }
  744. },
  745. // 获取用户名称
  746. getUserName(userId) {
  747. if (!userId || !this.userList) return '';
  748. let user = this.userList.find(u => u.userId == userId);
  749. return user ? user.nickName : '';
  750. },
  751. },
  752. }
  753. </script>
  754. <style lang="scss" scoped>
  755. .form-container {
  756. padding: 20rpx;
  757. }
  758. .form-title {
  759. text-align: center;
  760. margin-bottom: 30rpx;
  761. .title-text {
  762. font-size: 36rpx;
  763. font-weight: bold;
  764. }
  765. .title-line {
  766. height: 2rpx;
  767. background-color: #eee;
  768. margin-top: 20rpx;
  769. }
  770. }
  771. .custom-form {
  772. .form-item {
  773. // margin-bottom: 30rpx;
  774. }
  775. }
  776. .date-range {
  777. align-items: center;
  778. gap: 20rpx;
  779. }
  780. .date-text {
  781. margin: 0 10px;
  782. font-weight: bold;
  783. }
  784. .car-list {
  785. padding: 20rpx 0;
  786. .car-row {
  787. display: flex;
  788. justify-content: space-between;
  789. margin-bottom: 20rpx;
  790. }
  791. .car-item {
  792. width: calc(50vw - 50rpx);
  793. background-color: #f8f8f8;
  794. border-radius: 12rpx;
  795. padding: 20rpx;
  796. transition: all 0.3s;
  797. margin: 0 3px;
  798. border: 2rpx solid transparent;
  799. &:active {
  800. background-color: #f0f0f0;
  801. }
  802. // 选中状态的样式
  803. &.is-checked {
  804. background-color: #e6f7ff;
  805. border-color: #1890ff;
  806. box-shadow: 0 2rpx 8rpx rgba(24, 144, 255, 0.15);
  807. }
  808. .car-info {
  809. display: flex;
  810. flex-direction: column;
  811. gap: 8rpx;
  812. .car-license {
  813. font-size: 32rpx;
  814. font-weight: bold;
  815. color: #333;
  816. }
  817. .car-model {
  818. font-size: 24rpx;
  819. color: #666;
  820. }
  821. }
  822. }
  823. }
  824. .driver-list {
  825. display: flex;
  826. flex-wrap: wrap;
  827. gap: 20rpx;
  828. margin-top: 20rpx;
  829. }
  830. .auditor-info {
  831. margin-top: 20rpx;
  832. display: flex;
  833. justify-content: space-between;
  834. color: #666;
  835. font-size: 24rpx;
  836. }
  837. .popup-content {
  838. width: 90vw;
  839. max-height: 80vh;
  840. background-color: #fff;
  841. border-radius: 20rpx;
  842. overflow: hidden;
  843. .popup-header {
  844. display: flex;
  845. justify-content: space-between;
  846. align-items: center;
  847. padding: 30rpx;
  848. border-bottom: 2rpx solid #f5f5f5;
  849. .title {
  850. font-size: 32rpx;
  851. font-weight: bold;
  852. color: #333;
  853. }
  854. }
  855. }
  856. </style>