index.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674
  1. <template>
  2. <view class="page">
  3. <view class="flex-col item" style="overflow: auto; height: 100%">
  4. <view class="item-process-id">
  5. {{ $t('message.processId') + data.processInstance?.id }}
  6. </view>
  7. <uni-row class="flex-row flex-wrap item-content">
  8. <uni-col :span="7">{{ $t('message.startUser') }}</uni-col>
  9. <uni-col :span="17">{{ data.processInstance?.startUser?.nickname }}</uni-col>
  10. <uni-col :span="7" class="mt-15">{{ $t('message.deviceName') }}</uni-col>
  11. <uni-col :span="17" class="mt-15">{{ faultInfo?.deviceName }}</uni-col>
  12. <template v-if="processId.startsWith('GZ')">
  13. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.name') }}</uni-col>
  14. <uni-col :span="17" class="mt-15">{{ faultInfo?.failureName }}</uni-col>
  15. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.system') }}</uni-col>
  16. <uni-col :span="17" class="mt-15">{{ faultInfo?.failureSystem }}</uni-col>
  17. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.ifDeal') }}</uni-col>
  18. <uni-col :span="17" class="mt-15">{{ getYesOrNo(faultInfo?.ifDeal) }}</uni-col>
  19. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.status') }}</uni-col>
  20. <uni-col :span="17" class="mt-15">{{ getFaultStatusName(faultInfo?.status) }}</uni-col>
  21. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.ifStop') }}</uni-col>
  22. <uni-col :span="17" class="mt-15">{{ getYesOrNo(faultInfo?.ifStop) }}</uni-col>
  23. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.failureTime') }}</uni-col>
  24. <uni-col :span="17" class="mt-15">{{ formatDate(faultInfo?.failureTime) }}</uni-col>
  25. <uni-col v-if="faultInfo?.ifDeal" :span="7" class="mt-15">{{ $t('approval.fault.dealTime') }}</uni-col>
  26. <uni-col v-if="faultInfo?.ifDeal" :span="17" class="mt-15">{{ formatDate(faultInfo?.dealTime) }}</uni-col>
  27. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.needHelp') }}</uni-col>
  28. <uni-col :span="17" class="mt-15">{{ getYesOrNo(faultInfo?.needHelp) }}</uni-col>
  29. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.failureInfluence') }}</uni-col>
  30. <uni-col :span="17" class="mt-15">{{ faultInfo?.failureInfluence }}</uni-col>
  31. <uni-col v-if="faultInfo?.ifDeal" :span="7" class="mt-15">{{ $t('approval.fault.solution') }}</uni-col>
  32. <uni-col v-if="faultInfo?.ifDeal" :span="17" class="mt-15">{{ faultInfo?.solution }}</uni-col>
  33. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.description') }}</uni-col>
  34. <uni-col :span="17" class="mt-15">{{ faultInfo?.description }}</uni-col>
  35. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.remark') }}</uni-col>
  36. <uni-col :span="17" class="mt-15">{{ faultInfo?.remark }}</uni-col>
  37. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.pic') }}</uni-col>
  38. <uni-col :span="17" class="mt-15">
  39. <image :src="faultInfo?.pic" style="width: 50px; height: 50px" @click="previewImage(faultInfo?.pic)" />
  40. </uni-col>
  41. </template>
  42. <template v-else>
  43. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.status') }}</uni-col>
  44. <uni-col :span="17" class="mt-15">{{ getFaultStatusName(faultInfo?.status) }}</uni-col>
  45. <uni-col :span="7" class="mt-15">{{ $t('approval.maintain.type') }}</uni-col>
  46. <uni-col :span="17" class="mt-15">{{ getRepairTypeName(faultInfo?.type) }}</uni-col>
  47. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.ifStop') }}</uni-col>
  48. <uni-col :span="17" class="mt-15">{{ getYesOrNo(faultInfo?.ifStop) }}</uni-col>
  49. <uni-col :span="7" class="mt-15">{{ $t('approval.maintain.startTime') }}</uni-col>
  50. <uni-col :span="17" class="mt-15">{{ formatDate(faultInfo?.maintainStartTime) }}</uni-col>
  51. <uni-col :span="7" class="mt-15">{{ $t('approval.maintain.endTime') }}</uni-col>
  52. <uni-col :span="17" class="mt-15">{{ formatDate(faultInfo?.maintainEndTime) }}</uni-col>
  53. <uni-col :span="7" class="mt-15">{{ $t('approval.maintain.person') }}</uni-col>
  54. <uni-col :span="17" class="mt-15">{{ faultInfo?.nickname }}</uni-col>
  55. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.failureTime') }}</uni-col>
  56. <uni-col :span="17" class="mt-15">{{ formatDate(faultInfo?.failureTime) }}</uni-col>
  57. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.failureInfluence') }}</uni-col>
  58. <uni-col :span="17" class="mt-15">{{ faultInfo?.failureInfluence }}</uni-col>
  59. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.system') }}</uni-col>
  60. <uni-col :span="17" class="mt-15">{{ faultInfo?.failureSystem }}</uni-col>
  61. <uni-col :span="7" class="mt-15">{{ $t('approval.maintain.maintainFee') }}</uni-col>
  62. <uni-col :span="17" class="mt-15">{{ faultInfo?.maintainFee }}</uni-col>
  63. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.description') }}</uni-col>
  64. <uni-col :span="17" class="mt-15">{{ faultInfo?.description }}</uni-col>
  65. <uni-col :span="7" class="mt-15">{{ $t('approval.maintain.desc') }}</uni-col>
  66. <uni-col :span="17" class="mt-15">{{ faultInfo?.maintainDescription }}</uni-col>
  67. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.solution') }}</uni-col>
  68. <uni-col :span="17" class="mt-15">{{ faultInfo?.solution }}</uni-col>
  69. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.remark') }}</uni-col>
  70. <uni-col :span="17" class="mt-15">{{ faultInfo?.remark }}</uni-col>
  71. <uni-col :span="7" class="mt-15">{{ $t('approval.fault.pic') }}</uni-col>
  72. <uni-col :span="17" class="mt-15">
  73. <image :src="faultInfo?.pic" style="width: 50px; height: 50px" @click="previewImage(faultInfo?.pic)" />
  74. </uni-col>
  75. </template>
  76. <uni-col :span="24" class="mt-15 flex-row flex-wrap justify-end">
  77. <view v-for="(button, index) of buttonList">
  78. <button v-if="button.enable" class="fill-button" style="margin-left: 10px; margin-top: 10px" @click="onButtonClick(index, button.displayName)">
  79. {{ button.displayName }}
  80. </button>
  81. </view>
  82. <!-- <view v-if="buttonList && buttonList.length === 0">-->
  83. <!-- <button-->
  84. <!-- class="fill-button"-->
  85. <!-- style="margin-left: 10px; margin-top: 10px"-->
  86. <!-- @click="onButtonClick('7', $t('operation.cancel'))"-->
  87. <!-- >-->
  88. <!-- {{ $t('operation.cancel') }}-->
  89. <!-- </button>-->
  90. <!-- </view>-->
  91. </uni-col>
  92. </uni-row>
  93. </view>
  94. <uni-popup ref="dispatchUserPopup" type="bottom" background-color="white" border-radius="6px 6px 0 0">
  95. <view class="popup">
  96. <uni-forms ref="formRef" :model="form" :rules="rules" label-width="100px">
  97. <uni-forms-item v-if="['1', '3', '4'].includes(clickedButtonIndex)" :label="userFormItemLabel" name="assigneeUserId" required>
  98. <next-data-select v-model="form.assigneeUserId" :options="userList" filterable themeColor="#004098" />
  99. </uni-forms-item>
  100. <uni-forms-item v-if="clickedButtonIndex === '5'" :label="userFormItemLabel" name="userIds" required>
  101. <next-data-select v-model="form.userIds" :options="userList" :collapseTagsNum="2" multiple filterable themeColor="#004098" />
  102. </uni-forms-item>
  103. <uni-forms-item v-if="clickedButtonIndex === '1'" :label="$t('message.repairType')" name="type" required>
  104. <next-data-select v-model="form.type" :options="repairTypeList" format="{label}" field="value as value, label as text, label as label" />
  105. </uni-forms-item>
  106. <uni-forms-item v-if="clickedButtonIndex !== '7'" :label="$t('message.reason')" name="reason" :required="['3', '4', '5'].includes(clickedButtonIndex)">
  107. <uni-easyinput v-model="form.reason" type="textarea" />
  108. </uni-forms-item>
  109. <uni-forms-item v-if="clickedButtonIndex === '7'" :label="$t('message.reason1')" name="reason" required>
  110. <uni-easyinput v-model="form.reason" :placeholder="$t('message.cancelHint')" type="textarea" />
  111. </uni-forms-item>
  112. </uni-forms>
  113. <uni-row class="flex-row justify-center">
  114. <button v-if="clickedButtonIndex !== '5'" class="fill-button" style="margin-right: 10px" @click="handleClick">
  115. {{ clickedButtonIndex !== '7' ? clickedButtonText : $t('operation.confirm1') }}
  116. </button>
  117. <button v-if="clickedButtonIndex === '5'" class="fill-button" style="margin-right: 10px" @click="handleClick('before')">
  118. {{ $t('message.form.beforeSign') }}
  119. </button>
  120. <button v-if="clickedButtonIndex === '5'" class="fill-button" style="margin-right: 10px" @click="handleClick('after')">
  121. {{ $t('message.form.afterSign') }}
  122. </button>
  123. <button class="outline-button" plain="true" @click="cancel">
  124. {{ $t('operation.cancel') }}
  125. </button>
  126. </uni-row>
  127. </view>
  128. </uni-popup>
  129. <!-- 瑞恒队长选择维修人员 -->
  130. <uni-popup ref="dispatchRepairmanPopup" type="bottom" background-color="white" border-radius="6px 6px 0 0">
  131. <view class="popup">
  132. <uni-forms ref="repairmanformRef" :model="repairmanForm" :rules="rules2" label-width="100px">
  133. <uni-forms-item label="维修人员" name="userIds" required>
  134. <next-data-select
  135. v-model="repairmanForm.userIds"
  136. :options="userList2"
  137. :collapseTagsNum="2"
  138. optionsLabelKey="nickname"
  139. optionsValueKey="id"
  140. multiple
  141. filterable
  142. themeColor="#004098"
  143. />
  144. </uni-forms-item>
  145. <uni-forms-item label="审批意见" name="reason" required>
  146. <uni-easyinput v-model="repairmanForm.reason" placeholder="请输入审批意见" type="textarea" />
  147. </uni-forms-item>
  148. </uni-forms>
  149. <uni-row class="flex-row justify-center">
  150. <button class="fill-button" style="margin-right: 10px" @click="handleRepairmanClick">确认</button>
  151. <button class="outline-button" plain="true" @click="cancelRepairman">
  152. {{ $t('operation.cancel') }}
  153. </button>
  154. </uni-row>
  155. </view>
  156. </uni-popup>
  157. <!-- 瑞恒维修人员审批 -->
  158. <uni-popup ref="receiveTaskPopup" type="bottom" background-color="white" border-radius="6px 6px 0 0">
  159. <view class="popup">
  160. <uni-forms ref="receiveTaskRef" :model="receiveTaskForm" label-width="100px">
  161. <uni-forms-item label="审批意见" name="reason">
  162. <uni-easyinput v-model="receiveTaskForm.reason" placeholder="请输入审批意见" type="textarea" />
  163. </uni-forms-item>
  164. </uni-forms>
  165. <uni-row class="flex-row justify-center">
  166. <button class="fill-button" style="margin-right: 10px" @click="handleReceiveClick">确认</button>
  167. <button class="outline-button" plain="true" @click="cancelReceive">
  168. {{ $t('operation.cancel') }}
  169. </button>
  170. </uni-row>
  171. </view>
  172. </uni-popup>
  173. <!-- 瑞恒相关人员拒绝审批 -->
  174. <uni-popup ref="rejectTaskPopup" type="bottom" background-color="white" border-radius="6px 6px 0 0">
  175. <view class="popup">
  176. <uni-forms ref="rejectTaskRef" :model="rejectTaskForm" label-width="100px">
  177. <uni-forms-item label="审批意见" name="reason">
  178. <uni-easyinput v-model="rejectTaskForm.reason" placeholder="请输入审批意见" type="textarea" />
  179. </uni-forms-item>
  180. </uni-forms>
  181. <uni-row class="flex-row justify-center">
  182. <button class="fill-button" style="margin-right: 10px" @click="handleRejectClick">确认</button>
  183. <button class="outline-button" plain="true" @click="cancelReject">
  184. {{ $t('operation.cancel') }}
  185. </button>
  186. </uni-row>
  187. </view>
  188. </uni-popup>
  189. </view>
  190. </template>
  191. <script setup>
  192. import { computed, getCurrentInstance, reactive, ref } from 'vue';
  193. import { onLoad } from '@dcloudio/uni-app';
  194. import { approvalTask, cancelTask, createSignTask, delegateTask, getApprovalDetail, rejectTask, returnTask, transferTask, rhApproveTask } from '@/api/task';
  195. import { getFaultDetail, updateFaultProcess, updateIotMaintainProcess } from '@/api/fault';
  196. import dayjs from 'dayjs';
  197. import { useDataDictStore } from '@/store/modules/dataDict';
  198. import { getUserList } from '@/api';
  199. import { reloginByUserId } from '@/utils/auth';
  200. import { getRepairDetail } from '@/api/repair';
  201. import { getLoginUserInfo } from '@/api/login';
  202. import { getDeptName } from '@/api/recordFilling';
  203. import { companyLevelChildrenDepts, companyDeptsEmployee } from '@/api/ruihen';
  204. const data = ref({}); // 详情数据
  205. const faultInfo = ref({}); // 故障信息
  206. const statusList = ref([]); // 审批状态列表
  207. const repairTypeList = ref([]); // 维修状态列表
  208. const userList = ref([]); // 用户列表
  209. const userList2 = ref([]); // 瑞恒维修人员用户列表
  210. const yesOrNo = ref([]); // 是或否
  211. const faultStatusList = ref([]); // 故障状态列表
  212. // 通过状态码获取状态名称
  213. const getFaultStatusName = (status) => {
  214. if (!status) return '';
  215. for (const item of faultStatusList.value) {
  216. if (item.value === status) {
  217. return item.label;
  218. }
  219. }
  220. };
  221. // const getStatusName = (status) => {
  222. // if (!status) return ''
  223. // for (const item of statusList.value) {
  224. // if ((item.value + '') === status) {
  225. // return item.label
  226. // }
  227. // }
  228. // }
  229. // 通过布尔类型获取是或否
  230. const getYesOrNo = (value) => {
  231. if (value === undefined) return '';
  232. for (const item of yesOrNo.value) {
  233. if (value && item.value === 'true') {
  234. return item.label;
  235. } else if (!value && item.value === 'false') {
  236. return item.label;
  237. }
  238. }
  239. };
  240. // 通过维修类型获取名称
  241. const getRepairTypeName = (type) => {
  242. if (!type) return '';
  243. for (const item of repairTypeList.value) {
  244. if (item.value === type) {
  245. return item.label;
  246. }
  247. }
  248. };
  249. // 格式化日期
  250. const formatDate = (date) => {
  251. if (!date) return '';
  252. return dayjs(date).format('YYYY-MM-DD');
  253. };
  254. const getUserName = (userId) => {
  255. if (!userId) return;
  256. for (const item of userList.value) {
  257. if (item.value === userId) {
  258. faultInfo.value.nickname = item.label;
  259. return item.label;
  260. }
  261. }
  262. };
  263. // 预览图片
  264. const previewImage = (url) => {
  265. if (!url) return;
  266. uni.previewImage({ urls: [url] });
  267. };
  268. const buttonList = ref();
  269. const setButtonList = (data) => {
  270. if (data && data.todoTask) {
  271. buttonList.value = data.todoTask.buttonsSetting || [];
  272. } else {
  273. buttonList.value = [];
  274. }
  275. };
  276. const userFormItemLabel = computed(() => {
  277. const index = clickedButtonIndex.value;
  278. if (index === '1') {
  279. return t('message.dispatchUser'); // 负责人
  280. } else if (index === '3') {
  281. return t('message.form.user3'); // 新审批人
  282. } else if (index === '4') {
  283. return t('message.form.user4'); // 接收人
  284. } else if (index === '5') {
  285. return t('message.form.user5'); // 加签处理人
  286. } else {
  287. return '';
  288. }
  289. });
  290. const clickedButtonIndex = ref(0);
  291. const clickedButtonText = ref('');
  292. let dispatchRepairmanPopup = ref('');
  293. let receiveTaskPopup = ref('');
  294. let rejectTaskPopup = ref('');
  295. const onButtonClick = async (index, text) => {
  296. if (companyInfo.value.data === 'rh') {
  297. if (text === '维修人员') {
  298. dispatchRepairmanPopup.value.open('bottom');
  299. }
  300. if (text === '接收工单') {
  301. receiveTaskPopup.value.open('bottom');
  302. }
  303. if (text === '拒绝') {
  304. rejectTaskPopup.value.open('bottom');
  305. }
  306. } else {
  307. clickedButtonIndex.value = index;
  308. clickedButtonText.value = text;
  309. if (index === '1') {
  310. // 分配责任人
  311. rules.assigneeUserId.rules = [{ required: true, errorMessage: t('message.form.errorHint1') }];
  312. rules.reason.rules[0].required = false;
  313. } else if (index === '2') {
  314. // 拒绝
  315. rules.assigneeUserId.rules[0].required = false;
  316. rules.reason.rules[0].required = false;
  317. } else if (index === '3') {
  318. // 转办
  319. rules.assigneeUserId.rules = [{ required: true, errorMessage: t('message.form.errorHint3') }];
  320. rules.reason.rules[0].required = true;
  321. } else if (index === '4') {
  322. // 委派
  323. rules.assigneeUserId.rules = [{ required: true, errorMessage: t('message.form.errorHint5') }];
  324. rules.reason.rules[0].required = true;
  325. } else if (index === '5') {
  326. // 加签
  327. rules.assigneeUserId.rules[0].required = false;
  328. rules.userIds.rules[0].required = true;
  329. rules.reason.rules[0].required = true;
  330. } else if (index === '6') {
  331. // 退回
  332. const code = (await returnTask(taskId.value)).code;
  333. if (code === 0) {
  334. uni.showToast({ title: t('operation.success'), icon: 'none' });
  335. uni.navigateBack();
  336. uni.$emit('update');
  337. }
  338. return;
  339. } else if (index === '7') {
  340. rules.reason.rules[0].errorMessage = t('message.form.errorHint7');
  341. }
  342. showDispatchUserPopup();
  343. }
  344. };
  345. // 分配责任人弹窗
  346. const dispatchUserPopup = ref();
  347. const showDispatchUserPopup = () => {
  348. dispatchUserPopup.value.open('bottom');
  349. };
  350. const form = reactive({
  351. assigneeUserId: undefined,
  352. delegateUserId: undefined,
  353. userIds: undefined,
  354. type: undefined,
  355. reason: undefined,
  356. id: undefined
  357. });
  358. const formRef = ref();
  359. const repairmanForm = reactive({
  360. reason: '',
  361. signPicUrl: '',
  362. nextAssignees: {},
  363. type: undefined,
  364. assigneeUserId: undefined,
  365. ifTrans: undefined,
  366. userIds: []
  367. });
  368. const receiveTaskForm = reactive({
  369. reason: '',
  370. type: undefined,
  371. assigneeUserId: undefined,
  372. ifTrans: undefined,
  373. nextAssignees: {}
  374. });
  375. const rejectTaskForm = reactive({
  376. reason: '',
  377. id: ''
  378. });
  379. const repairmanformRef = ref();
  380. const receiveTaskRef = ref();
  381. const { appContext } = getCurrentInstance();
  382. const t = appContext.config.globalProperties.$t;
  383. const rules = reactive({
  384. assigneeUserId: {
  385. rules: [{ required: true, errorMessage: t('message.form.errorHint1') }]
  386. },
  387. userIds: {
  388. rules: [{ required: true, errorMessage: t('message.form.errorHint6') }]
  389. }, // 加签处理人
  390. type: {
  391. rules: [{ required: true, errorMessage: t('message.form.errorHint2') }]
  392. },
  393. reason: {
  394. rules: [{ required: true, errorMessage: t('message.form.errorHint4') }]
  395. }
  396. });
  397. // 瑞恒选择维修人
  398. const rules2 = reactive({
  399. userIds: {
  400. rules: [{ required: true, errorMessage: '请选择维修人' }]
  401. }
  402. });
  403. const cancel = () => dispatchUserPopup.value.close('bottom');
  404. const cancelRepairman = () => dispatchRepairmanPopup.value.close('bottom');
  405. const cancelReceive = () => receiveTaskPopup.value.close('bottom');
  406. const cancelReject = () => rejectTaskPopup.value.close('bottom');
  407. const handleClick = async (sign) => {
  408. try {
  409. const valid = await formRef.value.validate();
  410. if (!valid) return;
  411. if (!form.reason) {
  412. form.reason = form.reason || '';
  413. }
  414. let code = -1;
  415. if (clickedButtonIndex.value === '1') {
  416. // 分配责任人
  417. code = (await updateFaultProcess(faultId.value, form.type, form.assigneeUserId)).code;
  418. code = (await approvalTask(taskId.value, form.reason)).code;
  419. } else if (clickedButtonIndex.value === '2') {
  420. // 拒绝
  421. code = (await rejectTask(taskId.value, form.reason)).code;
  422. } else if (clickedButtonIndex.value === '3') {
  423. // 转办
  424. code = (await transferTask(taskId.value, form.assigneeUserId, form.reason)).code;
  425. } else if (clickedButtonIndex.value === '4') {
  426. // 委派
  427. code = (await delegateTask(taskId.value, form.assigneeUserId, form.reason)).code;
  428. } else if (clickedButtonIndex.value === '5') {
  429. // 加签
  430. code = (await createSignTask(taskId.value, form.userIds, sign, form.reason)).code;
  431. } else if (clickedButtonIndex.value === '7') {
  432. // 退回
  433. code = (await cancelTask(processId.value, form.reason)).code;
  434. }
  435. if (code === 0) {
  436. // 成功时返回
  437. uni.showToast({ title: t('operation.success'), icon: 'none' });
  438. uni.$emit('update');
  439. uni.navigateBack();
  440. }
  441. } catch (e) {
  442. console.log(e);
  443. }
  444. };
  445. // 瑞恒审批相关开始 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  446. const handleRepairmanClick = async () => {
  447. try {
  448. const valid = await repairmanformRef.value.validate();
  449. if (!valid) return;
  450. if (!repairmanForm.reason) {
  451. repairmanForm.reason = repairmanForm.reason || '';
  452. }
  453. repairmanForm.assigneeUserId = userInfo.value.id;
  454. await updateIotMaintainProcess(processId.value, faultId.value, repairmanForm.type, repairmanForm.assigneeUserId, repairmanForm.ifTrans);
  455. const data = {
  456. id: taskId.value,
  457. reason: repairmanForm.reason,
  458. variables: {}, // 审批通过, 把修改的字段值赋于流程实例变量
  459. nextAssignees: {
  460. [activeNode.value.id]: repairmanForm.userIds
  461. } // 下个自选节点选择的审批人信息
  462. };
  463. const res = await rhApproveTask(data);
  464. if (res.data) {
  465. // 成功时返回
  466. uni.showToast({ title: t('operation.success'), icon: 'none' });
  467. uni.$emit('update');
  468. uni.navigateBack();
  469. }
  470. uni.reL;
  471. } catch (e) {
  472. console.log(e);
  473. }
  474. };
  475. //瑞恒维修人员接受工单
  476. const handleReceiveClick = async () => {
  477. try {
  478. if (!receiveTaskForm.reason) {
  479. receiveTaskForm.reason = receiveTaskForm.reason || '';
  480. }
  481. receiveTaskForm.assigneeUserId = userInfo.value.id;
  482. await updateIotMaintainProcess(processId.value, faultId.value, receiveTaskForm.type, receiveTaskForm.assigneeUserId, receiveTaskForm.ifTrans);
  483. const data = {
  484. id: taskId.value,
  485. reason: receiveTaskForm.reason,
  486. variables: {}, // 审批通过, 把修改的字段值赋于流程实例变量
  487. nextAssignees: {} // 下个自选节点选择的审批人信息
  488. };
  489. const res = await rhApproveTask(data);
  490. if (res.data) {
  491. // 成功时返回
  492. uni.showToast({ title: t('operation.success'), icon: 'none' });
  493. uni.$emit('update');
  494. uni.navigateBack();
  495. }
  496. } catch (e) {
  497. console.log(e);
  498. }
  499. };
  500. //瑞恒相关人员拒绝
  501. const handleRejectClick = async () => {
  502. try {
  503. await rejectTask(taskId.value, rejectTaskForm.reason);
  504. uni.showToast({ title: t('operation.success'), icon: 'none' });
  505. uni.$emit('update');
  506. uni.navigateBack();
  507. } catch (e) {}
  508. };
  509. // 瑞恒审批相关结束 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  510. const processId = ref('');
  511. const taskId = ref('');
  512. const faultId = ref('');
  513. const { loadDataDictList, getDataDictList } = useDataDictStore();
  514. let activeNode = ref('');
  515. const userInfo = ref({});
  516. const companyInfo = ref({});
  517. onLoad(async (options) => {
  518. await reloginByUserId(options.reloginUserId);
  519. console.log('options', options);
  520. taskId.value = options.id;
  521. processId.value = options.processInstanceId;
  522. statusList.value = getDataDictList('crm_audit_status'); // 审批状态列表
  523. repairTypeList.value = getDataDictList('pms_main_type'); // 维修类型列表
  524. faultStatusList.value = getDataDictList('pms_failure_status'); // 故障状态列表
  525. yesOrNo.value = getDataDictList('infra_boolean_string'); // 是或否
  526. if (repairTypeList.value.length === 0) {
  527. await loadDataDictList();
  528. statusList.value = getDataDictList('crm_audit_status'); // 审批状态列表
  529. repairTypeList.value = getDataDictList('pms_main_type'); // 维修类型列表
  530. faultStatusList.value = getDataDictList('pms_failure_status'); // 故障状态列表
  531. yesOrNo.value = getDataDictList('infra_boolean_string'); // 是或否
  532. }
  533. data.value = (await getApprovalDetail(options)).data;
  534. activeNode.value = data.value.activityNodes[3];
  535. faultId.value = data.value.processInstance.businessKey;
  536. console.log('ssssssssssssssssssssssssssss', processId.value);
  537. if (processId.value.startsWith('GZ')) {
  538. faultInfo.value = (await getFaultDetail({ id: faultId.value })).data;
  539. } else {
  540. faultInfo.value = (await getRepairDetail({ id: faultId.value })).data;
  541. }
  542. setButtonList(data.value);
  543. let userId;
  544. if (data.value.todoTask) {
  545. userId = data.value.todoTask.assigneeUser.id;
  546. if (!taskId.value) {
  547. taskId.value = data.value.todoTask.id;
  548. }
  549. } else {
  550. userId = data.value.processInstance.startUser.id;
  551. }
  552. userList.value = (await getUserList(userId)).data.map((item) => ({
  553. value: item.id,
  554. text: item.nickname,
  555. label: item.nickname
  556. }));
  557. getUserName(faultInfo.value?.maintainPerson);
  558. userInfo.value = (await getLoginUserInfo()).data;
  559. console.log('jjjjjjjjjjjjjjjjjjjjjj', userInfo.value);
  560. companyInfo.value = await getDeptName(userInfo.value.dept.id);
  561. const deptData = await companyLevelChildrenDepts();
  562. const ids = deptData.data.map((item) => item.id);
  563. const params = {
  564. deptIds: ids
  565. };
  566. const list = await companyDeptsEmployee(params);
  567. userList2.value = list.data;
  568. });
  569. </script>
  570. <style scoped lang="scss">
  571. .item {
  572. margin: 10px 0;
  573. background-color: white;
  574. border-radius: 0 0 6px 6px;
  575. }
  576. .item-process-id {
  577. padding: 10px;
  578. background: linear-gradient(270deg, #ffffff 0%, #8ebeff 100%);
  579. border-radius: 6px 6px 0 0;
  580. }
  581. .item-content {
  582. padding: 15px 20px 12px 10px;
  583. font-size: 14px;
  584. color: #333333;
  585. }
  586. .mt-15 {
  587. margin-top: 15px;
  588. }
  589. .mt-27 {
  590. margin-top: 27px;
  591. }
  592. .outline-button {
  593. border: 1px #004098 solid;
  594. border-radius: 3px;
  595. color: #004098;
  596. font-size: 14px;
  597. min-width: 90px;
  598. height: 32px;
  599. line-height: 32px;
  600. margin: 0;
  601. }
  602. .fill-button {
  603. background-color: #004098;
  604. color: white;
  605. font-size: 14px;
  606. min-width: 90px;
  607. height: 32px;
  608. line-height: 32px;
  609. margin: 0;
  610. padding: 0;
  611. }
  612. .popup {
  613. padding: 10px;
  614. }
  615. </style>