| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022 |
- <template>
- <view class="form-container">
- <!-- 表单标题 -->
- <view class="form-title">
- <text class="title-text">设备申请表</text>
- <view class="title-line"></view>
- </view>
- <!-- 表单内容 -->
- <uni-forms ref="form" :modelValue="form" :rules="rules" label-position="top" label-width="150" class="custom-form">
- <flow-note :taskForm="taskForm"></flow-note>
- <!-- 当前节点 -->
- <uni-forms-item label="当前节点" class="form-item" v-if="taskName">
- <uni-tag :inverted="true" type="primary" :text="taskName"></uni-tag>
- </uni-forms-item>
-
- <!-- 流程发起人 -->
- <uni-forms-item label="填报人" class="form-item">
- <b style="font-size:30rpx;">{{ applierUserName }}</b>
- </uni-forms-item>
-
- <!-- 填报日期 -->
- <uni-forms-item label="填报日期" class="form-item">
- <text>{{ form.applyDate }}</text>
- </uni-forms-item>
-
- <!-- 选择项目 -->
- <uni-forms-item label="选择项目" class="form-item" name="projectId">
- <view v-if="taskName == '设备申请'" style="display: flex; align-items: center; margin-bottom: 10px;">
- <uni-icons type="info" size="16" color="#666"></uni-icons>
- <text style="font-size: 24rpx; color: #666;">项目非必选,非项目设备申请时,可不选项目</text>
- </view>
- <uv-button type="primary" @click="openProject = true" v-if="taskName == '设备申请'">+ 选择项目</uv-button>
- <ProjectPicker :visible.sync="openProject" :selected.sync="selectedProject" @confirm="handleConfirm" />
- <ProjectInfo :project="projectObj" v-if="form.projectId != '0'"></ProjectInfo>
- <view v-if="form.projectId == '0' && taskName != '设备申请'">
- <uni-tag type="primary" text="非项目设备申请"></uni-tag>
- </view>
- </uni-forms-item>
- <!-- 设备选择器 -->
- <device-picker :visible.sync="openDevice" :selected.sync="selectDevice" :multiple="!isReplaceMode"
- @confirm="handleDeviceConfirm"></device-picker>
-
- <!-- 设备选择 -->
- <uni-forms-item label="申请设备" required class="form-item" name="devices"
- v-if="taskName != '安排设备' && taskName != '归还确认'">
- <uv-button type="primary" @click="openDevice = true" v-if="taskName == '设备申请'">+ 选择设备</uv-button>
- <view class="device-cards" v-if="deviceList.length > 0">
- <view class="device-card" v-for="(item, index) in deviceList" :key="index">
- <view class="card-header">
- <text class="card-title">{{ index + 1 }}. 出厂编号:{{ item.code }}</text>
- </view>
- <view class="card-content">
- <view class="card-row">
- <view class="card-item">
- <text class="label">设备名称:</text>
- <text class="value">{{ item.name }}</text>
- </view>
- </view>
- <view class="card-row">
- <view class="card-item">
- <text class="label">设备品牌:</text>
- <text class="value">{{ item.brand }}</text>
- </view>
- <view class="card-item">
- <text class="label">存放地址:</text>
- <text class="value">{{ item.place }}</text>
- </view>
- </view>
- <view class="card-row">
- <view class="card-item">
- <text class="label">规格型号:</text>
- <text class="value">{{ item.series }}</text>
- </view>
- </view>
- </view>
- </view>
- </view>
- </uni-forms-item>
-
- <!-- 申领事由 -->
- <uni-forms-item label="申领事由" required class="form-item" name="applyReason">
- <uv-textarea v-model="form.applyReason" placeholder="请输入申领事由" :disabled="taskName != '设备申请'"></uv-textarea>
- </uni-forms-item>
-
- <!-- 日期选择 -->
- <view class="date-range">
- <uni-forms-item label="使用日期" required class="form-item" name="dateRange">
- <uni-datetime-picker v-model="form.dateRange" type="daterange" rangeSeparator="至" :clearIcon="false"
- v-if="taskName == '设备申请'" @change="handleDateRangeChange" />
- <view class="date-display" v-else>
- <uni-icons type="calendar" size="16"></uni-icons>
- <text class="date-text">{{ form.beginDate }}</text>
- <text class="date-separator">至</text>
- <text class="date-text">{{ form.endDate }}</text>
- </view>
- </uni-forms-item>
- <uni-forms-item label="共计" class="form-item">
- <text>{{ form.days + '天' }}</text>
- </uni-forms-item>
- </view>
-
- <!-- 安排设备意见 -->
- <uni-forms-item label="拟发放设备" required class="form-item" v-if="taskName != '设备申请' && taskName != '归还确认'">
- <view class="device-cards" v-if="modifyDeviceList.length > 0">
- <view class="device-card" v-for="(item, index) in modifyDeviceList" :key="index">
- <view class="card-header">
- <text class="card-title">{{ index + 1 }}. 出厂编号:{{ item.code }}</text>
- </view>
- <view class="card-content">
- <view class="card-row">
- <view class="card-item">
- <text class="label">设备名称:</text>
- <text class="value">{{ item.name }}</text>
- </view>
- </view>
- <view class="card-row">
- <view class="card-item">
- <text class="label">设备品牌:</text>
- <text class="value">{{ item.brand }}</text>
- </view>
- <view class="card-item">
- <text class="label">存放地址:</text>
- <text class="value">{{ item.place }}</text>
- </view>
- </view>
- <view class="card-row">
- <view class="card-item">
- <text class="label">规格型号:</text>
- <text class="value">{{ item.series }}</text>
- </view>
- </view>
- </view>
- <view class="card-actions" v-if="taskName == '安排设备'">
- <uv-button type="primary" size="mini" @click="replaceRowData(item, index)">重新选择</uv-button>
- <uv-button type="error" size="mini" @click="deleteRowData(item, index)">删除</uv-button>
- </view>
- </view>
- </view>
- <uv-button type="primary" @click="addRowdata()" v-if="taskName == '安排设备'">新增设备</uv-button>
- </uni-forms-item>
-
- <!-- 安排设备意见 -->
- <uni-forms-item label="安排设备意见" required class="form-item" name="dispatchComment" v-if="taskName != '设备申请'">
- <uv-textarea v-model="form.dispatchComment" placeholder="请输入安排设备意见"
- :disabled="taskName != '安排设备'"></uv-textarea>
- <auditor :name="form.dispatcher ? form.dispatchUser.nickName : ''" :time="form.dispatchTime"></auditor>
- </uni-forms-item>
-
- <!-- 分管审核意见 -->
- <uni-forms-item label="分管审核意见" required name="managerComment" class="form-item"
- v-if="taskName != '设备申请' && taskName != '安排设备'">
- <uv-textarea v-model="form.managerComment" placeholder="请输入分管审核意见" :disabled="taskName != '分管审核'"></uv-textarea>
- <auditor :name="form.managerUser ? form.managerUser.nickName : ''" :time="form.managerTime"></auditor>
- </uni-forms-item>
-
- <!-- 归还确认 -->
- <uni-forms-item label="已归还设备" required class="form-item" v-if="taskName == '' || taskName == '归还确认'">
- <text style="color: #3c9cff;" v-if="taskName == '归还确认'">Tips:请点击卡片,切换归还状态</text>
- <view class="device-cards" v-if="returnDevicesList.length > 0">
- <view class="device-card" v-for="(item, index) in returnDevicesList" :key="index"
- :class="{ 'selected': isDeviceSelected(item.deviceId) }" @click="toggleDeviceSelection(item)">
- <view class="card-header">
- <text class="card-title">{{ index + 1 }}. 出厂编号:{{ item.code }}</text>
- <view class="return-tag" v-if="isDeviceSelected(item.deviceId)">
- <uni-tag type="success" text="已归还" size="small"></uni-tag>
- </view>
- </view>
- <view class="card-content">
- <view class="card-row">
- <view class="card-item">
- <text class="label">设备名称:</text>
- <text class="value">{{ item.name }}</text>
- </view>
- </view>
- <view class="card-row">
- <view class="card-item">
- <text class="label">设备品牌:</text>
- <text class="value">{{ item.brand }}</text>
- </view>
- <view class="card-item">
- <text class="label">存放地址:</text>
- <text class="value">{{ item.place }}</text>
- </view>
- </view>
- <view class="card-row">
- <view class="card-item">
- <text class="label">规格型号:</text>
- <text class="value">{{ item.series }}</text>
- </view>
- </view>
- </view>
- </view>
- </view>
- </uni-forms-item>
-
- <!-- 需维修设备 -->
- <uni-forms-item label="需维修设备" class="form-item" v-if="taskName == '' || taskName == '归还确认'">
- <uv-button type="primary" @click="openRepairDevice = true" v-if="taskName == '归还确认'">+ 选择需维修设备</uv-button>
- <repair-device-picker :visible.sync="openRepairDevice" :deviceList="modifyDeviceList"
- :selectedDevices.sync="form.repairDevices"></repair-device-picker>
- <view class="device-cards" v-if="repairDevicesList.length > 0">
- <view class="device-card repair-card" v-for="(item, index) in repairDevicesList" :key="index">
- <view class="card-header">
- <text class="card-title">{{ index + 1 }}. 出厂编号:{{ item.code }}</text>
- <view class="repair-tag">
- <uni-tag type="error" text="需维修" size="small"></uni-tag>
- </view>
- </view>
- <view class="card-content">
- <view class="card-row">
- <view class="card-item">
- <text class="label">设备名称:</text>
- <text class="value">{{ item.name }}</text>
- </view>
- </view>
- <view class="card-row">
- <view class="card-item">
- <text class="label">设备品牌:</text>
- <text class="value">{{ item.brand }}</text>
- </view>
- <view class="card-item">
- <text class="label">存放地址:</text>
- <text class="value">{{ item.place }}</text>
- </view>
- </view>
- <view class="card-row">
- <view class="card-item">
- <text class="label">规格型号:</text>
- <text class="value">{{ item.series }}</text>
- </view>
- </view>
- </view>
- </view>
- </view>
- <view v-if="repairDevicesList.length == 0 && taskName != '归还确认'" style="margin-top: 10rpx;">
- <uni-tag type="success" text="没有需维修的设备" size="small"></uni-tag>
- </view>
- </uni-forms-item>
-
- <!-- 备注 -->
- <uni-forms-item label="备注" class="form-item" v-if="taskName == '' || taskName == '归还确认'">
- <uv-textarea v-model="form.remark" placeholder="请输入备注" :disabled="taskName != '归还确认'"></uv-textarea>
- </uni-forms-item>
-
- <!-- 归还日期 -->
- <uni-forms-item label="归还日期" required name="returnDate" class="form-item"
- v-if="taskName == '' || taskName == '归还确认'">
- <uni-datetime-picker v-model="form.returnDate" type="date" :disabled="taskName != '归还确认'" />
- </uni-forms-item>
-
- <!-- 操作按钮 -->
- <view class="form-actions" v-if="taskName">
- <uv-button type="primary" @click="submit" v-if="taskName == '设备申请'">提交申请</uv-button>
- <template v-else>
- <uv-button style="margin-bottom: 5px;" type="warning" @click="saves">保存</uv-button>
- <uv-button type="primary" @click="completeApply">完成审批</uv-button>
- </template>
- </view>
- </uni-forms>
- </view>
- </template>
-
- <script>
- import { parseTime } from "@/utils/common.js"
- import { getDeviceApproval, submitDeviceApproval, modifyDeviceApproval } from '@/api/oa/device/deviceApproval'
- import { complete, getNextFlowNode } from "@/api/flowable/todo";
- import { getProject } from "@/api/oa/project/project";
- import { getDevice } from "@/api/oa/device/device";
- import { getUserByRole } from "@/api/system/role";
- import { getUsersManageLeader } from '@/api/system/post.js'
- import { sendQyMessage } from "@/api/qywx/index";
- import { listUser, getUser } from "@/api/system/user";
- import FlowNote from '@/pages/components/flowNote.vue';
- import ProjectPicker from '@/pages/components/ProjectPicker.vue';
- import ProjectInfo from '@/pages/components/ProjectInfo.vue';
- import DevicePicker from "@/pages/components/DevicePicker.vue";
- import Auditor from "@/pages/components/auditor.vue";
- import RepairDevicePicker from "@/pages/components/RepairDevicePicker.vue";
-
- export default {
- components: {
- FlowNote,
- ProjectPicker,
- ProjectInfo,
- DevicePicker,
- Auditor,
- RepairDevicePicker
- },
- props: {
- taskForm: Object,
- taskName: String,
- startUserName: String,
- },
- created() {
- this.applierUserName = this.startUserName;
- this.initForm();
- this.getUserList();
- },
- data() {
- return {
- form: {
- userList: [],
- user: {
- nickName: ''
- },
- dept: {
- deptName: ''
- },
- projectId: '',
- applyDate: '',
- applyReason: '',
- beginDate: '',
- endDate: '',
- dateRange: [],
- days: 0,
- dispatchComment: '',
- managerComment: '',
- devices: [],
- modifyDevices: [],
- returnDevices: [],
- repairDevices: [],
- remark: '',
- returnDate: ''
- },
- rules: {
- // projectId: {
- // rules: [{ required: true, errorMessage: '请选择项目' }]
- // },
- devices: {
- rules: [{ required: true, errorMessage: '请选择设备' }]
- },
- applyReason: {
- rules: [{ required: true, errorMessage: '请输入申领事由' }]
- },
- dateRange: {
- rules: [{
- required: this.taskName === '设备申请',
- errorMessage: '请选择使用日期',
- validateFunction: (rule, value, data, callback) => {
- if (!value || value.length !== 2 || !value[0] || !value[1]) {
- callback('请选择使用日期');
- } else {
- callback();
- }
- }
- }]
- },
- dispatchComment: {
- rules: [{
- required: true,
- errorMessage: '请输入安排设备意见',
- validateFunction: (rule, value, data, callback) => {
- if (this.taskName === '安排设备' && !value) {
- callback('请输入安排设备意见');
- } else {
- callback();
- }
- }
- }]
- },
- managerComment: {
- rules: [{
- required: true,
- errorMessage: '请输入分管审核意见',
- validateFunction: (rule, value, data, callback) => {
- if (this.taskName === '分管审核' && !value) {
- callback('请输入分管审核意见');
- } else {
- callback();
- }
- }
- }]
- },
- returnDate: {
- rules: [{
- required: true,
- errorMessage: '请选择归还日期',
- validateFunction: (rule, value, data, callback) => {
- if (this.taskName === '归还确认' && !value) {
- callback('请选择归还日期');
- } else {
- callback();
- }
- }
- }]
- }
- },
- applierUserName: '',
- openProject: false,
- selectedProject: null,
- projectObj: {},
- openDevice: false,
- selectDevice: [],
- deviceList: [],
- modifyDeviceList: [],
- returnDevicesList: [],
- formTotal: 0,
- currentIndex: -1,
- isReplaceMode: false,
- openRepairDevice: false,
- repairDevicesList: []
- };
- },
- watch: {
- 'form.repairDevices': {
- handler(newVal) {
- this.updateRepairDevicesList();
- },
- immediate: true
- }
- },
- methods: {
- async initForm() {
- try {
- const res = await getDeviceApproval(this.taskForm.formId);
- if (res.data) {
- this.formTotal = 1;
- this.form = res.data;
- this.applierUserName = res.data.applierUser.nickName;
- if (res.data.projectId != '0') {
- const project = await getProject(res.data.projectId);
- this.projectObj = project.data;
- }
- // 初始化申请设备
- if (res.data.devices) {
- const deviceIds = res.data.devices.split(',').map(id => parseInt(id));
- this.form.devices = res.data.devices.split(',').map(id => parseInt(id));
- this.deviceList = [];
- this.selectDevice = [];
-
- for (const id of deviceIds) {
- const response = await getDevice(id);
- if (response.data) {
- this.deviceList.push(response.data);
- this.selectDevice.push(response.data);
- }
- }
- } else {
- this.deviceList = [];
- }
-
- // 初始化拟发放设备列表
- if (res.data.modifyDevices) {
- const modifyDeviceIds = typeof res.data.modifyDevices === 'string'
- ? res.data.modifyDevices.split(',').map(id => parseInt(id))
- : Array.isArray(res.data.modifyDevices)
- ? res.data.modifyDevices.map(id => parseInt(id))
- : [];
- this.form.modifyDevices = res.data.modifyDevices.split(',').map(id => parseInt(id));
- this.modifyDeviceList = [];
-
- for (const id of modifyDeviceIds) {
- const response = await getDevice(id);
- if (response.data) {
- this.modifyDeviceList.push(response.data);
- }
- }
- } else if (this.taskName === '安排设备') {
- this.modifyDeviceList = [...this.deviceList];
- } else {
- this.modifyDeviceList = [];
- }
-
- // 初始化归还设备列表
- if (res.data.returnDevices) {
- const returnDeviceIds = typeof res.data.returnDevices === 'string'
- ? res.data.returnDevices.split(',').map(id => parseInt(id))
- : Array.isArray(res.data.returnDevices)
- ? res.data.returnDevices.map(id => parseInt(id))
- : [];
- this.form.returnDevices = returnDeviceIds;
-
- // 获取所有拟发放的设备
- const modifyDeviceIds = typeof res.data.modifyDevices === 'string'
- ? res.data.modifyDevices.split(',').map(id => parseInt(id))
- : Array.isArray(res.data.modifyDevices)
- ? res.data.modifyDevices.map(id => parseInt(id))
- : [];
-
- this.returnDevicesList = [];
- for (const id of modifyDeviceIds) {
- const response = await getDevice(id);
- if (response.data) {
- this.returnDevicesList.push(response.data);
- }
- }
- } else if (this.taskName === '归还确认') {
- // 在归还确认节点,使用拟发放的设备列表
- this.returnDevicesList = [...this.modifyDeviceList];
- this.form.returnDevices = []; // 初始化空数组
- } else {
- this.returnDevicesList = [];
- this.form.returnDevices = []; // 初始化空数组
- }
-
- // 初始化维修设备列表
- if (res.data.repairDevices) {
- const repairDeviceIds = typeof res.data.repairDevices === 'string'
- ? res.data.repairDevices.split(',').map(id => parseInt(id))
- : Array.isArray(res.data.repairDevices)
- ? res.data.repairDevices.map(id => parseInt(id))
- : [];
- this.form.repairDevices = repairDeviceIds;
- this.updateRepairDevicesList();
- } else if (this.taskName === '归还确认') {
- this.form.repairDevices = [];
- this.repairDevicesList = [];
- }
-
- if (this.form.beginDate && this.form.endDate) {
- let dateRange = [this.form.beginDate, this.form.endDate];
- this.$set(this.form, 'dateRange', dateRange);
- }
-
- } else {
- this.form.applier = this.$store.getters.userId;
- this.form.applyDate = parseTime(new Date(), "{y}-{m}-{d}");
- let name = this.applierUserName.split('-');
- this.form.user.nickName = name[0];
- this.form.dept.deptName = name[1];
- this.formTotal = 0;
- this.form.returnDevices = []; // 初始化空数组
- this.form.repairDevices = []; // 初始化空数组
- }
- } catch (error) {
- console.error('初始化表单失败:', error);
- uni.showToast({
- title: '初始化表单失败',
- icon: 'error'
- });
- }
- },
- // 获取用户列表
- getUserList() {
- listUser({
- pageNum: 1,
- pageSize: 9999
- }).then(res => {
- if (res.code == 200) {
- this.userList = res.rows
- }
- })
- },
- handleConfirm(project) {
- this.selectedProject = project;
- this.projectObj = project;
- this.form.projectId = project.projectId;
- },
- handleDeviceConfirm(devices) {
- if (this.taskName === '安排设备') {
- if (this.currentIndex >= 0) {
- // 替换指定位置的设备,确保只使用第一个选中的设备
- const selectedDevice = Array.isArray(devices) ? devices[0] : devices;
- this.modifyDeviceList.splice(this.currentIndex, 1, selectedDevice);
- } else {
- // 新增设备
- this.modifyDeviceList.push(...devices);
- }
- this.isReplaceMode = false;
- } else {
- this.deviceList = Array.isArray(devices) ? devices : [devices];
- this.form.devices = this.deviceList.map(item => Number(item.deviceId));
- }
- },
- handleDateRangeChange(e) {
- if (Array.isArray(e) && e.length === 2) {
- const [start, end] = e;
- this.form.beginDate = start;
- this.form.endDate = end;
- this.form.dateRange = [start, end];
- this.calculateDay();
- }
- },
- calculateDay() {
- if (this.form.beginDate && this.form.endDate) {
- const begin = new Date(this.form.beginDate);
- const end = new Date(this.form.endDate);
- if (!isNaN(begin.getTime()) && !isNaN(end.getTime())) {
- this.form.days = Math.ceil((end - begin) / (1000 * 60 * 60 * 24)) + 1;
- }
- }
- },
- replaceRowData(row, index) {
- this.openDevice = true;
- this.currentIndex = index;
- this.isReplaceMode = true;
- // 在安排设备节点时,设置当前选中的设备
- if (this.taskName === '安排设备') {
- this.selectDevice = [row];
- }
- },
- deleteRowData(row, index) {
- uni.showModal({
- title: '确认删除',
- content: '确定要删除该设备吗?',
- success: (res) => {
- if (res.confirm) {
- this.modifyDeviceList.splice(index, 1);
- }
- }
- });
- },
- addRowdata() {
- this.openDevice = true;
- this.currentIndex = -1;
- this.isReplaceMode = false;
- // 在安排设备节点时,清空已选设备
- if (this.taskName === '安排设备') {
- this.selectDevice = [];
- }
- },
- async submit() {
- this.$refs.form.validate().then(async () => {
- this.$modal.confirm('是否提交设备申请?').then(async () => {
- let submitData = {
- ...this.form,
- ...(this.form.formId ? {} : { formId: this.taskForm.formId }),
- ...(this.form.deviceApplyId ? {} : { deviceApplyId: this.taskForm.formId })
- };
- let jsonForm = JSON.stringify(submitData);
- if (!this.form.deviceApplyId) {
- submitDeviceApproval(jsonForm).then(async res => {
- // 获取下一个流程节点
- await this.getNextFlowNodeApproval();
- // 发送企业微信消息
- await this.sendQyMessage();
- uni.showToast({
- title: '提交成功',
- icon: 'success'
- });
- setTimeout(() => {
- uni.switchTab({
- url: '/pages/message/index'
- })
- }, 500);
- });
- } else {
- modifyDeviceApproval(jsonForm).then(async res => {
- // 获取下一个流程节点
- await this.getNextFlowNodeApproval();
- // 发送企业微信消息
- await this.sendQyMessage();
- uni.showToast({
- title: '提交成功',
- icon: 'success'
- });
- setTimeout(() => {
- uni.switchTab({
- url: '/pages/message/index'
- })
- }, 500);
- })
- }
- })
- });
- },
- saves() {
- try {
- this.$refs.form.validate().then(() => {
- let submitData = {
- ...this.form,
- ...(this.form.formId ? {} : { formId: this.taskForm.formId }),
- ...(this.form.deviceApplyId ? {} : { deviceApplyId: this.taskForm.formId })
- };
- // 在安排设备节点时,添加拟发放设备列表
- if (this.taskName === '安排设备') {
- submitData.modifyDevices = this.modifyDeviceList.map(item => item.deviceId);
- }
- let jsonForm = JSON.stringify(submitData);
- modifyDeviceApproval(jsonForm).then(res => {
- if (res.code === 200) {
- uni.showToast({
- title: '保存成功',
- icon: 'success'
- });
- } else {
- uni.showToast({
- title: res.msg || '保存失败',
- icon: 'error'
- });
- }
- })
- })
- } catch (error) {
- console.error('保存方法错误:', error);
- uni.showToast({
- title: error.message || '保存失败',
- icon: 'error'
- });
- }
- },
- async completeApply() {
- this.$refs.form.validate().then(async () => {
- // 在归还确认节点时,检查所有设备是否都已归还
- if (this.taskName === '归还确认') {
- const allDevices = this.modifyDeviceList.map(item => item.deviceId);
- const returnedDevices = this.form.returnDevices || [];
- const unreturnedDevices = allDevices.filter(id => !returnedDevices.includes(id));
-
- if (unreturnedDevices.length > 0) {
- uni.showToast({
- title: '请确认所有设备都已归还',
- icon: 'none'
- });
- return;
- }
- }
-
- uni.showModal({
- title: '提示',
- content: '确定提交审批吗?',
- success: async (res) => {
- if (res.confirm) {
- let submitData = {
- ...this.form,
- ...(this.form.formId ? {} : { formId: this.taskForm.formId }),
- ...(this.form.deviceApplyId ? {} : { deviceApplyId: this.taskForm.formId })
- };
- // 在安排设备节点时,添加拟发放设备列表
- if (this.taskName === '安排设备') {
- submitData.modifyDevices = this.modifyDeviceList.map(item => item.deviceId);
- }
- let jsonForm = JSON.stringify(submitData);
- modifyDeviceApproval(jsonForm).then(async res => {
- // 获取下一个流程节点
- await getNextFlowNode({ taskId: this.taskForm.taskId });
- await this.getNextFlowNodeApproval();
- uni.showToast({
- title: '提交成功',
- icon: 'success'
- });
- setTimeout(() => {
- uni.switchTab({
- url: '/pages/message/index'
- });
- }, 500);
- });
- }
- }
- });
- });
- },
- // 获取下一个审批人
- getNextFlowNodeApproval() {
- return new Promise((resolve, reject) => {
- const handleComplete = (response) => {
- this.$modal.msgSuccess(response.msg);
- resolve();
- };
-
- const setApprovalAndComplete = (result) => {
- this.$set(this.taskForm.variables, "approval", result.data[0]);
- complete(this.taskForm).then(handleComplete).catch(reject);
- };
-
- switch (this.taskName) {
- case '设备申请':
- case '分管审核':
- getUserByRole({ roleId: 4 }).then(setApprovalAndComplete).catch(reject);
- break;
-
- case '安排设备':
- getUsersManageLeader({ userId: this.form.applier }).then(res => {
- const userIds = res.data.map(user => user.userId);
- this.$set(this.taskForm.variables, "approvalList", userIds);
- complete(this.taskForm).then(handleComplete).catch(reject);
- }).catch(reject);
- break;
-
- case '归还确认':
- this.$modal.confirm('最后一个节点,提交将结束流程,是否提交?')
- .then(() => complete(this.taskForm).then(handleComplete).catch(reject))
- .catch(reject);
- break;
- }
- });
- },
- isDeviceSelected(deviceId) {
- return this.form.returnDevices && this.form.returnDevices.includes(deviceId);
- },
- toggleDeviceSelection(device) {
- if (this.taskName !== '归还确认') return;
- // 确保 returnDevices 是数组
- if (!Array.isArray(this.form.returnDevices)) {
- this.form.returnDevices = [];
- }
- const index = this.form.returnDevices.indexOf(device.deviceId);
- if (index === -1) {
- // 添加设备到已归还列表
- this.form.returnDevices.push(device.deviceId);
- } else {
- // 从已归还列表中移除设备
- this.form.returnDevices.splice(index, 1);
- }
- },
- updateRepairDevicesList() {
- // 如果 repairDevices 是字符串,转换为数组
- if (typeof this.form.repairDevices === 'string') {
- this.form.repairDevices = this.form.repairDevices.split(',').map(id => parseInt(id));
- } else if (!Array.isArray(this.form.repairDevices)) {
- this.form.repairDevices = [];
- }
-
- this.repairDevicesList = this.modifyDeviceList.filter(device =>
- this.form.repairDevices.includes(device.deviceId)
- );
- },
- // 发送企业微信消息
- async sendQyMessage() {
- try {
- let userIds = [];
- let userString = [];
- let message = '';
- let formData = new FormData();
-
- // 获取下一个审批人
- if (this.taskName == '设备申请') {
- let result = await getUserByRole({ roleId: 4 });
- if (result.data && result.data.length > 0) {
- userIds.push(result.data[0]);
- }
- } else if (this.taskName == '安排设备') {
- let res = await getUsersManageLeader({ userId: this.form.applier });
- if (res.data) {
- res.data.forEach(user => {
- userIds.push(user.userId);
- });
- }
- }
-
- for (let u of userIds) {
- let { data } = await getUser(u);
- if (data) {
- userString.push(data.pinyin);
- }
- }
-
- message = "您有一条新的设备申请: \n>" +
- "申请人:<font color='info'>" + this.getUserName(this.form.applier) + "</font> \n>" +
- "开始日期:" + this.form.beginDate + " \n>" +
- "结束日期:" + this.form.endDate + " \n>" +
- "申请事由:" + this.form.applyReason + " \n>" +
- "\n>" +
- "已办流程:<font color='comment'>" + this.taskName + "</font> \n>";
-
- formData.append('message', message);
- formData.append('userString', userString.join('|') + '|YuSiHan|WangRongHua')
-
- if (userIds.length > 0) {
- await sendQyMessage(formData);
- }
- } catch (error) {
- console.error('发送企业微信消息失败:', error);
- }
- },
- // 获取用户名称
- getUserName(userId) {
- if (!userId || !this.userList) return '';
- let user = this.userList.find(u => u.userId == userId);
- return user ? user.nickName : '';
- },
- }
- }
- </script>
-
- <style lang="scss" scoped>
- .form-container {
- padding: 32rpx;
- }
-
- .form-title {
- text-align: center;
- margin-bottom: 32rpx;
-
- .title-text {
- font-size: 36rpx;
- font-weight: bold;
- }
-
- .title-line {
- height: 2rpx;
- background: #eee;
- margin-top: 16rpx;
- }
- }
-
- .date-range {
- // display: flex;
- flex-wrap: wrap;
- gap: 32rpx;
- }
-
- .date-text {
- margin: 0 10px;
- font-weight: bold;
- }
-
- .form-actions {
- justify-content: center;
- gap: 32rpx;
- margin-top: 32rpx;
- }
-
- ::v-deep .uni-forms-item__label {
- font-weight: bold;
- }
-
- .device-cards {
- margin-top: 20rpx;
- }
-
- .device-card {
- background: #fff;
- border-radius: 12rpx;
- margin-bottom: 20rpx;
- box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.1);
- overflow: hidden;
- transition: all 0.3s ease;
- cursor: pointer;
-
- &.selected {
- border: 2rpx solid #67c23a;
- background-color: rgba(103, 194, 58, 0.05);
- }
- }
-
- .card-header {
- padding: 16rpx 20rpx;
- background: #f5f7fa;
- border-bottom: 1rpx solid #eee;
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
-
- .return-tag {
- margin-left: 10rpx;
- }
-
- .card-title {
- font-size: 28rpx;
- font-weight: bold;
- color: #333;
- display: block;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-
- .card-content {
- padding: 16rpx 20rpx;
- }
-
- .card-row {
- display: flex;
- margin-bottom: 12rpx;
-
- &:last-child {
- margin-bottom: 0;
- }
- }
-
- .card-item {
- flex: 1;
- display: flex;
- align-items: center;
- font-size: 26rpx;
- line-height: 1.4;
- padding: 0 10rpx;
- min-width: 0; // 防止内容溢出
-
- .label {
- color: #666;
- flex-shrink: 0;
- margin-right: 8rpx;
- }
-
- .value {
- color: #333;
- flex: 1;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
- }
-
- .card-actions {
- padding: 16rpx 20rpx;
- display: flex;
- justify-content: flex-end;
- gap: 20rpx;
- border-top: 1rpx solid #eee;
- }
-
- .device-card {
- background: #fff;
- border-radius: 12rpx;
- margin-bottom: 20rpx;
- box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.1);
- overflow: hidden;
- transition: all 0.3s ease;
- cursor: pointer;
-
- &.repair-card {
- border: 2rpx solid #f56c6c;
- background-color: rgba(245, 108, 108, 0.05);
- }
- }
-
- .card-header {
- padding: 16rpx 20rpx;
- background: #f5f7fa;
- border-bottom: 1rpx solid #eee;
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
-
- .repair-tag {
- margin-left: 10rpx;
- }
- </style>
|