detail.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938
  1. <template>
  2. <view :class="{ popupShow: popupShow }">
  3. <uni-nav-bar fixed="true" statusBar="true" left-icon="back" title="维修工单详情" @clickLeft="back"></uni-nav-bar>
  4. <view class="tab-title">
  5. <view>
  6. <text v-for="(item, index) in tabList" :key="index" class="tab-item" v-text="item.label"
  7. :class="index === pickTabIndex ? 'active' : ''" @click="changeChartsTab(index)">
  8. </text>
  9. </view>
  10. </view>
  11. <!-- <uni-list direction="row" >
  12. <uni-list-item v-for="(item, index) in tabList" :key="index" :title="item.label" ></uni-list-item>
  13. </uni-list> -->
  14. <view class="main">
  15. <!-- 工单信息 -->
  16. <view class="kd-baseInfo" v-if="pickTabIndex == 0">
  17. <view class="kd-cell">
  18. <text class="kd-label">工单编号</text>
  19. {{ worksheetInfo.code }}
  20. </view>
  21. <view class="kd-cell">
  22. <text class="kd-label">执行部门</text>
  23. {{ worksheetInfo.executeGroupName }}
  24. </view>
  25. <view class="kd-cell">
  26. <text class="kd-label">执行人</text>
  27. {{ worksheetInfo.executeUserName }}
  28. </view>
  29. <view class="kd-cell">
  30. <text class="kd-label">计划单号</text>
  31. {{ worksheetInfo.planCode }}
  32. </view>
  33. <view class="kd-cell">
  34. <text class="kd-label">计划名称</text>
  35. {{ worksheetInfo.planName }}
  36. </view>
  37. <view class="kd-cell" v-if="workOrderType.code != 10">
  38. <text class="kd-label">计划完成时间</text>
  39. {{ worksheetInfo.planFinishTime }}
  40. </view>
  41. <view class="kd-cell" v-if="workOrderType.code == 10">
  42. <text class="kd-label">计划开始时间</text>
  43. {{ worksheetInfo.planStartTime }}
  44. </view>
  45. <view class="kd-cell" v-if="workOrderType.code == 10">
  46. <text class="kd-label">计划完成时间</text>
  47. {{ worksheetInfo.planEndTime }}
  48. </view>
  49. <view class="kd-cell">
  50. <text class="kd-label">开工时间:</text>
  51. {{ worksheetInfo.acceptTime }}
  52. </view>
  53. <view class="kd-cell">
  54. <text class="kd-label">完工时间:</text>
  55. {{ worksheetInfo.finishTime }}
  56. </view>
  57. <view class="kd-cell">
  58. <text class="kd-label">实际工时:</text>
  59. {{ timeInterval(worksheetInfo.acceptTime, worksheetInfo.finishTime) }}
  60. </view>
  61. <!-- *** 新增 照片列表 -->
  62. <view class="kd-cell">
  63. <text class="kd-label">照片列表:</text>
  64. <PreviewPhoto type="view" :imageList="worksheetInfo.workOrderImg" />
  65. </view>
  66. <view class="zxpg-wrap" v-if="orderType == 1 && repairInfo.repairUserId == userId && ParentIndex !=4">
  67. <template v-if="repairInfo.orderStatus == 0">
  68. <!-- <view class="zx-btn btns" @click="handleExecute">开始执行</view> -->
  69. <view class="zp-btn btns" @click="handlbpbj">申请备品备件</view>
  70. <view class="zx-btn btns" @click="handleNotice">开始执行</view>
  71. <view class="zp-btn btns" @click="handlZp">转派</view>
  72. </template>
  73. <template v-else-if="repairInfo.orderStatus == 2">
  74. <view class="zp-btn btns" @click="handlbpbj">申请备品备件</view>
  75. <view class="zx-btn btns" @click="handlbg">报工</view>
  76. <view class="zx-btn btns" style="margin-top: 20rpx;" @click="handlNobg">非完成报工</view>
  77. <!-- <view class="zp-btn btns" @click="handlbpbj" v-if="!worksheetInfo.applyOrder">
  78. 申请备品备件
  79. </view>
  80. <view class="zp-btn btns" v-if="worksheetInfo.applyOrder" @click="handCkbpbj">
  81. 查看备品备件
  82. </view> -->
  83. </template>
  84. <template v-if="repairInfo.orderStatus == 3 && repairInfo.repairUserId == userId">
  85. <view class="zx-btn btns disabled">待验收</view>
  86. </template>
  87. <template v-if="repairInfo.orderStatus == 3 && repairInfo.requestUserId == userId">
  88. <view class="zx-btn btns" @click="searchShow = true">验收</view>
  89. </template>
  90. <!-- <div class="apply-box">
  91. <view class="zp-btn btns" @click="handlbpbj" v-if="worksheetInfo.status.code != 5 && worksheetInfo.status.code != 3 && worksheetInfo.status.code != 7">申请备品备件</view>
  92. <view class="zp-btn btns" @click="handlZp" v-if="worksheetInfo.status.code === 8">转派</view>
  93. </div> -->
  94. </view>
  95. <view class="zxpg-wrap"
  96. v-if="orderType == 1 && repairInfo.orderStatus == 3 && repairInfo.requestUserId == userId && ParentIndex !=4">
  97. <view class="zx-btn btns" @click="searchShow = true">验收</view>
  98. </view>
  99. <Assign ref="Assign" @success="handleAssign"></Assign>
  100. <SearchPopup mode="center" v-if="searchShow">
  101. <template v-slot:list>
  102. <maintain_course :repairInfoLogList="repairInfoLogs" :workOrderCode="workOrderCode">
  103. </maintain_course>
  104. </template>
  105. <template v-slot:operate>
  106. <view class="operate_box">
  107. <u--textarea v-model="remark" confirm-type="send" count placeholder="请输入内容"></u--textarea>
  108. </view>
  109. <!-- <u-input v-model="remark" type="textarea" border="true" placeholder="请输入内容" /> -->
  110. <!-- <u--textarea v-model="remark" placeholder="请输入内容"></u--textarea> -->
  111. <view class="operate_box">
  112. <u-button :loading="btnLoading" type="success" size="small" class="u-reset-button"
  113. @click="surereject(4)">验收</u-button>
  114. <u-button :loading="btnLoading" size="small" class="u-reset-button"
  115. @click="surereject(5)">驳回</u-button>
  116. <u-button size="small" class="u-reset-button" @click="searchShow = false">取消</u-button>
  117. </view>
  118. </template>
  119. </SearchPopup>
  120. </view>
  121. <!-- 报修信息 -->
  122. <view class="bg" v-if="pickTabIndex == 1">
  123. <view class="kd-baseInfo" v-if="workOrderType.code != 10">
  124. <view class="kd-cell">
  125. <text class="kd-label">报修记录编号</text>
  126. {{ repairInfo.code }}
  127. </view>
  128. <view class="kd-cell">
  129. <text class="kd-label">报修时间</text>
  130. {{ repairInfo.createTime }}
  131. </view>
  132. <view class="kd-cell">
  133. <text class="kd-label">来源编码</text>
  134. {{ repairInfo.sourceType }}
  135. </view>
  136. <view class="kd-cell">
  137. <text class="kd-label">固资编码</text>
  138. {{ equipmentInfo.fixCode }}
  139. </view>
  140. <view class="kd-cell">
  141. <text class="kd-label">内部编码</text>
  142. {{ equipmentInfo.codeNumber }}
  143. </view>
  144. <view class="kd-cell">
  145. <text class="kd-label">报修部门</text>
  146. {{ repairInfo.requestDeptName }}
  147. </view>
  148. <view class="kd-cell">
  149. <text class="kd-label">报修人</text>
  150. {{ repairInfo.requestUserName }}
  151. </view>
  152. <view class="kd-cell">
  153. <text class="kd-label">报修人电话</text>
  154. {{ repairInfo.requestUserPhone }}
  155. </view>
  156. <view class="kd-cell">
  157. <text class="kd-label">期望完成时间</text>
  158. {{ repairInfo.expectedTime }}
  159. </view>
  160. <!-- <view class="kd-cell">
  161. <text class="kd-label2">委托单位交底负责人</text>
  162. {{ repairInfo.code }}
  163. </view>
  164. <view class="kd-cell">
  165. <text class="kd-label2">交底时间</text>
  166. {{ repairInfo.code }}
  167. </view>
  168. <view class="kd-cell">
  169. <text class="kd-label2">接受交底负责人</text>
  170. {{ repairInfo.code }}
  171. </view> -->
  172. <view class="kd-cell">
  173. <text class="kd-label">故障描述</text>
  174. {{ repairInfo.remark }}
  175. </view>
  176. <!-- <view class="img-wrap" v-if="workOrderType.code != 10 && worksheetInfo.repairInfo.repairsImg">
  177. <image
  178. class="img"
  179. @click="clickImg(worksheetInfo.repairInfo.repairsImg.split(','), item_s)"
  180. :src="apiUrl + item_s"
  181. v-for="(item_s, index_s) in worksheetInfo.repairInfo.repairsImg.split(',')"
  182. :key="index_s"></image>
  183. </view> -->
  184. </view>
  185. <view class="kd-baseInfo" v-if="workOrderType.code == 10">
  186. <view class="kd-cell">
  187. <text class="kd-label">报修时间</text>
  188. {{ planRepair.createTime }}
  189. </view>
  190. <view class="kd-cell">
  191. <text class="kd-label">维修部门</text>
  192. {{ planRepair.executorDeptName }}
  193. </view>
  194. <view class="kd-cell">
  195. <text class="kd-label">维修人员</text>
  196. {{ planRepair.executorName }}
  197. </view>
  198. </view>
  199. </view>
  200. <!-- 设备信息 -->
  201. <view class="kd-baseInfo" v-if="pickTabIndex == 2">
  202. <view class="kd-cell">
  203. <text class="kd-label">设备编码</text>
  204. {{ equipmentInfo.code }}
  205. </view>
  206. <view class="kd-cell">
  207. <text class="kd-label">设备名称</text>
  208. {{ equipmentInfo.name }}
  209. </view>
  210. <view class="kd-cell">
  211. <text class="kd-label">设备分类</text>
  212. {{ equipmentInfo.category ? equipmentInfo.category.category.categoryLevelPath : '' }}
  213. </view>
  214. <view class="kd-cell">
  215. <text class="kd-label">固资编码</text>
  216. {{ equipmentInfo.fixCode }}
  217. </view>
  218. <view class="kd-cell">
  219. <text class="kd-label">内部编码</text>
  220. {{ equipmentInfo.codeNumber }}
  221. </view>
  222. <view class="kd-cell">
  223. <text class="kd-label">规格型号</text>
  224. {{ equipmentInfo.category && equipmentInfo.category.category.specification }}|{{ equipmentInfo.category && equipmentInfo.category.category.modelType }}
  225. </view>
  226. <view class="kd-cell" v-if="workOrderType.code != 10">
  227. <text class="kd-label">权属部门</text>
  228. {{ equipmentInfo.ownershipGroupName }}
  229. </view>
  230. <view class="kd-cell" v-if="workOrderType.code != 10">
  231. <text class="kd-label">权属人</text>
  232. {{ equipmentInfo.ownershipUserName }}
  233. </view>
  234. <view class="kd-cell" v-if="workOrderType.code != 10">
  235. <text class="kd-label">权属部门电话</text>
  236. {{ equipmentInfo.ownershipUserMobile }}
  237. </view>
  238. <view class="kd-cell" v-if="workOrderType.code != 10">
  239. <text class="kd-label">设备位置</text>
  240. {{ equipmentInfo.deviceLocationName + '-' + equipmentInfo.deviceDetailAddress }}
  241. </view>
  242. </view>
  243. <!-- 维修历程 -->
  244. <view class="" v-if="pickTabIndex == 3">
  245. <!-- 步骤条 -->
  246. <maintain_course :repairInfoLogList="repairInfoLogs" :workOrderCode="workOrderCode"></maintain_course>
  247. </view>
  248. <!-- 维修记录 -->
  249. <view class="wx-main" v-if="pickTabIndex == 4">
  250. <view class="wx-wrap">
  251. <view class="item" v-for="(item, index) in repairHistoryList" :key="index">
  252. <view class="bh-wrap">
  253. <view class="s1">
  254. <view class="title-md">工单编号:</view>
  255. <view class="b1">
  256. {{ item.workOrderCode }}
  257. </view>
  258. </view>
  259. <view class="s2">{{ item.createTime }}</view>
  260. </view>
  261. <fold :hide="false">
  262. <view class="title-wrap">
  263. <view class="s1 title-md">执行人</view>
  264. <view class="s2">
  265. {{ item.executeUserName }}
  266. </view>
  267. </view>
  268. <view class="bg-wrap-item">
  269. <view class="label title-md">故障描述</view>
  270. <view class="value-wrap">
  271. <view class="text">
  272. {{ item.remark }}
  273. </view>
  274. <view class="img-wrap" v-if="item.repairsImg">
  275. <image class="img" @click="clickImg(item.repairsImg.split(','), item_s)"
  276. :src="apiUrl + item_s"
  277. v-for="(item_s, index_s) in item.repairsImg.split(',')" :key="index_s">
  278. </image>
  279. </view>
  280. </view>
  281. </view>
  282. <view class="bg-wrap-item">
  283. <view class="label title-md">处理说明</view>
  284. <view class="value-wrap">
  285. <view class="text">
  286. {{ item.repairReportExplain }}
  287. </view>
  288. <view class="img-wrap" v-if="item.workOrderImg">
  289. <image class="img" @click="clickImg(item.workOrderImg.split(','), item_s)"
  290. :src="apiUrl + item_s"
  291. v-for="(item_s, index_s) in item.workOrderImg.split(',')" :key="index_s">
  292. </image>
  293. </view>
  294. </view>
  295. </view>
  296. <!-- <view class="bjsymx" @click="handlbjsymx(item.repairLogVOS, true)">备件使用明细</view> -->
  297. <view class="bjsymx" @click="handDetail(item.repairLogVOS)">详情流程</view>
  298. </fold>
  299. </view>
  300. </view>
  301. </view>
  302. <!-- 备品备件 sparePartsApply-->
  303. <view class="wx-main" v-if="pickTabIndex == 5">
  304. <pickCard :list="sparePartsApply" />
  305. </view>
  306. </view>
  307. <PopSparePart ref="PopSparePart" :workOrderCode="sparePartWorkOrderCode" :noRequest="true"></PopSparePart>
  308. <!-- <Approval v-if="isApproval && worksheetInfo.status && worksheetInfo.status.code == 5" :devOpsType="1" :planType="3" :myHandleId="myHandleId" :id="worksheetInfo.workOrderId" /> -->
  309. <HistoryRepairDetail ref="HistoryRepairDetail" @close="close"></HistoryRepairDetail>
  310. <Notice v-if="noticeShow" :id="worksheetInfo.id" :repairInfo="repairInfo" @agree="agree"></Notice>
  311. <unfinishedApplication ref="unfinishedA"></unfinishedApplication>
  312. </view>
  313. </template>
  314. <script>
  315. import PreviewPhoto from '@/pages/maintenance/check/components/PreviewPhoto.vue'
  316. import {
  317. startExecuting
  318. } from '@/api/myTicket/index.js'
  319. import Step from '@/components/Step/Step.vue'
  320. import StepItem from '@/components/Step/StepItem.vue'
  321. import Assign from '@/components/Assign.vue'
  322. import fold from '../components/fold.vue'
  323. import unfinishedApplication from '../components/unfinishedApplication.vue'
  324. import HistoryRepairDetail from '../components/historyRepairDetail.vue'
  325. import PopSparePart from '../components/PopSparePart.vue'
  326. import pickCard from '../components/pickCard.vue'
  327. // import Approval from '@/components/Approval.vue' // 审批组件
  328. import maintain_course from '../components/maintain_course.vue'
  329. import Notice from '../components/notice.vue'
  330. import {
  331. get,
  332. postJ,
  333. post
  334. } from '@/utils/api.js'
  335. import {
  336. getWorkOrderDetail,
  337. getAssetInfo,
  338. historyRepairList,
  339. acceptance,
  340. getSparePartsApply
  341. } from '@/api/repair'
  342. import SearchPopup from '@/pages/pda/components/searchPopup.vue'
  343. export default {
  344. components: {
  345. PreviewPhoto,
  346. Step,
  347. StepItem,
  348. Assign,
  349. fold,
  350. PopSparePart,
  351. // Approval,
  352. maintain_course,
  353. Notice,
  354. HistoryRepairDetail,
  355. SearchPopup,
  356. pickCard,
  357. unfinishedApplication
  358. },
  359. computed: {
  360. // 是否为自己的工单
  361. // isMygd() {
  362. // let userInfo = uni.getStorageSync('userInfo')
  363. // // 当前登录人id
  364. // let userId = userInfo.id
  365. // // 执行人id
  366. // let executeUserId = this.worksheetInfo.executeUserId
  367. // if (executeUserId == userId) {
  368. // return true
  369. // } else {
  370. // return false
  371. // }
  372. // }
  373. },
  374. data() {
  375. return {
  376. btnLoading: false,
  377. orderType: 1,
  378. remark: '',
  379. userId: '',
  380. searchShow: false,
  381. popupShow: false,
  382. repairHistoryList: [],
  383. repairInfoLogs: [],
  384. sparePartsApply: [],
  385. id: '',
  386. type: 1,
  387. sparePartWorkOrderCode: '',
  388. tabList: [{
  389. label: '工单信息',
  390. value: '0'
  391. },
  392. {
  393. label: '报修信息',
  394. value: '1'
  395. },
  396. {
  397. label: '设备信息',
  398. value: '2'
  399. },
  400. {
  401. label: '维修历程',
  402. value: '3'
  403. },
  404. {
  405. label: '维修记录',
  406. value: '4'
  407. },
  408. {
  409. label: '备品备件申请单',
  410. value: '5'
  411. }
  412. ],
  413. pickTabIndex: 0,
  414. workOrderCode: '',
  415. worksheetInfo: {},
  416. equipmentInfo: {},
  417. repairInfo: {},
  418. dict: {
  419. // 报修来源 1:手动创建;2:工单反工;3:告警通知;4:保养工单;5:巡点检工单)
  420. source: {
  421. 1: '手动创建',
  422. 2: '工单反工',
  423. 3: '告警通知',
  424. 4: '保养工单',
  425. 5: '巡点检工单'
  426. }
  427. },
  428. // 设备信息
  429. device: {},
  430. isApproval: false,
  431. myHandleId: '',
  432. equiCode: '',
  433. noticeShow: false,
  434. workOrderType: {},
  435. planRepair: {},
  436. ParentIndex: 0,
  437. }
  438. },
  439. onLoad(options) {
  440. this.id = options.id
  441. this.workOrderCode = options.code
  442. this.planId = options.planId
  443. this.orderType = options.orderType
  444. this.ParentIndex = options.ParentIndex
  445. let userInfo = uni.getStorageSync('userInfo')
  446. // 当前登录人id
  447. this.userId = userInfo.userId
  448. // this.isApproval = options.type === 'approval'
  449. // this.myHandleId = options.myHandleId
  450. },
  451. onShow() {
  452. if (this.workOrderCode) {
  453. this.getInfo()
  454. }
  455. },
  456. methods: {
  457. surereject(orderStatus) {
  458. this.btnLoading = true
  459. let params = {
  460. orderStatus,
  461. remark: this.remark,
  462. workOrderId: this.id
  463. }
  464. acceptance(params).then(res => {
  465. uni.showToast({
  466. icon: 'success',
  467. title: orderStatus == 4 ? '审核通过!' : '驳回成功!',
  468. duration: 2000
  469. })
  470. this.searchShow = false
  471. this.btnLoading = false
  472. this.getInfo()
  473. })
  474. },
  475. back() {
  476. uni.navigateBack({
  477. delta: 1
  478. })
  479. },
  480. close() {
  481. this.popupShow = false
  482. },
  483. handleAssign() {
  484. this.back()
  485. },
  486. // 获取历史维修记录
  487. getHistoryRepairList(deviceId) {
  488. historyRepairList({
  489. id: deviceId,
  490. pageNum: 1,
  491. size: 999
  492. }).then(data => {
  493. this.repairHistoryList = data.list
  494. })
  495. },
  496. // 获取设备信息
  497. getDeviceInfo(deviceId) {
  498. getAssetInfo(deviceId).then(res => {
  499. if (res) {
  500. this.equipmentInfo = res
  501. this.$set(this.equipmentInfo, 'position', res.positionList?.length > 0 && res.positionList[
  502. 0].pathName ? res.positionList[0].pathName : '')
  503. }
  504. })
  505. },
  506. //获取备品备件
  507. async getSparePartsApply(id) {
  508. const list = await getSparePartsApply(id)
  509. this.sparePartsApply = list
  510. },
  511. getInfo() {
  512. getWorkOrderDetail(this.workOrderCode).then(data => {
  513. // *** 新增 照片数据接收
  514. if(data.ticketsInfoResponse.workOrderImg){
  515. data.ticketsInfoResponse.workOrderImg = JSON.parse(data.ticketsInfoResponse.workOrderImg);
  516. }
  517. console.log(data, '看看数据')
  518. this.worksheetInfo = data.ticketsInfoResponse
  519. this.repairInfo = data.repairRequestResponse
  520. this.getDeviceInfo(this.worksheetInfo.deviceId)
  521. this.getHistoryRepairList(this.worksheetInfo.deviceId)
  522. this.getSparePartsApply(this.worksheetInfo.id)
  523. let repairInfoLogs =
  524. data.ticketsInfoResponse.repairLogVOS?.length > 0 ?
  525. data.ticketsInfoResponse.repairLogVOS.map(item => {
  526. return {
  527. ...item,
  528. requestUserName: data.repairRequestResponse.requestUserName,
  529. remark: data.repairRequestResponse.remark
  530. }
  531. }) : []
  532. this.repairInfoLogs = repairInfoLogs.reverse()
  533. })
  534. // get(this.apiUrl + '/repair/info/getWorkOrderDetail/' + this.workOrderCode).then(res => {
  535. // if (res.success) {
  536. // res.data.repairInfoLogList = res.data.repairInfoLogList.reverse()
  537. // res.data.repairInfoLogList = res.data.repairInfoLogList.map(n => {
  538. // if (n.content) {
  539. // n.content = JSON.parse(n.content)
  540. // }
  541. // return n
  542. // })
  543. // this.worksheetInfo = res.data
  544. // this.workOrderType = res.data?.workOrderType
  545. // this.equiCode = res.data?.repairInfo?.equiCode
  546. // if (this.workOrderType.code == 10) {
  547. // this.planRepair = res.data?.planRepair
  548. // this.device = res.data.planRepairEqui
  549. // let districtManName = res.data?.planRepair.districtManName.split(',')
  550. // this.worksheetInfo.repairInfo = {
  551. // repairsPerson: districtManName[0]
  552. // }
  553. // } else {
  554. // this.getDevice()
  555. // }
  556. // }
  557. // })
  558. },
  559. changeChartsTab(index) {
  560. this.pickTabIndex = index
  561. },
  562. // 跳转备品备件
  563. handlbpbj() {
  564. this.equipmentInfo['category']['modelType'] = this.equipmentInfo.category && this.equipmentInfo.category
  565. .category.modelType
  566. let data = JSON.parse(JSON.stringify(this.worksheetInfo));
  567. data['deviceList'] = [this.equipmentInfo];
  568. data['pageType'] = 'add'
  569. uni.navigateTo({
  570. url: `/pages/maintenanceWorkorder/sparepart/sparepart?data=${JSON.stringify(data)}`
  571. })
  572. },
  573. // 查看备品备件 详情
  574. handCkbpbj() {
  575. uni.navigateTo({
  576. url: `/pages/maintain_service/sparepart/sparepartDetail?applyOrder=${this.worksheetInfo.applyOrder}`
  577. })
  578. },
  579. // 跳转报工
  580. handlbg() {
  581. uni.navigateTo({
  582. url: `/pages/maintenanceWorkorder/submitted_ministry/submitted_ministry?workOrderCode=${this.repairInfo.code}&code=${this.workOrderCode}&id=${this.id}&deviceName=${this.repairInfo.deviceName}`
  583. })
  584. },
  585. // 跳转非完成报工
  586. handlNobg() {
  587. this.$refs.unfinishedA.open(this.worksheetInfo.id)
  588. },
  589. // 保修须知
  590. handleNotice() {
  591. this.noticeShow = true
  592. },
  593. agree() {
  594. this.noticeShow = false
  595. this.handleExecute()
  596. },
  597. // 执行工单
  598. handleExecute() {
  599. startExecuting({
  600. id: this.id
  601. }).then(() => {
  602. uni.showToast({
  603. icon: 'success',
  604. title: '操作成功!',
  605. duration: 2000
  606. })
  607. this.getInfo()
  608. })
  609. },
  610. // 转派
  611. handlZp() {
  612. let id = this.worksheetInfo.id
  613. this.$refs.Assign.open(id, 'Transfer')
  614. },
  615. // 详情
  616. handDetail(data) {
  617. this.popupShow = true
  618. this.$refs.HistoryRepairDetail.open('历史维修详情', data)
  619. },
  620. // 备件使用明细
  621. handlbjsymx(data) {
  622. this.$refs.PopSparePart.open('备件使用明细', data)
  623. },
  624. // 获取设备信息
  625. getDevice() {
  626. try {
  627. let par = {
  628. code: this.worksheetInfo.repairInfo.equiCode
  629. }
  630. get(this.apiUrl + '/asset/detail', par).then(res => {
  631. if (res.success) {
  632. this.device = res.data
  633. }
  634. })
  635. } catch (e) {
  636. //TODO handle the exception
  637. }
  638. },
  639. // 查看图片
  640. clickImg(urls, indexUrl) {
  641. urls = urls.map(n => {
  642. return this.apiUrl + n
  643. })
  644. wx.previewImage({
  645. urls: urls, //需要预览的图片http链接列表,多张的时候,url直接写在后面就行了
  646. current: this.apiUrl + indexUrl, // 当前显示图片的http链接,默认是第一个
  647. success: function(res) {},
  648. fail: function(res) {},
  649. complete: function(res) {}
  650. })
  651. },
  652. // 计算实际工时
  653. timeInterval(dt1, dt2) {
  654. if (!dt1 || !dt2) {
  655. return ''
  656. }
  657. if (typeof dt1 == 'string') {
  658. dt1 = new Date(dt1.replace(/-/, '/'))
  659. dt2 = new Date(dt2.replace(/-/, '/'))
  660. }
  661. var res = dt2 - dt1
  662. if (isNaN(res)) throw Error('invalid dates arguments')
  663. let re = res / (1000 * 60 * 60)
  664. var h = parseInt(re)
  665. var m = parseInt((re - h) * 60)
  666. let result = ''
  667. if (h) {
  668. result += `${h} 小时`
  669. }
  670. if (m) {
  671. result += `${m} 分钟`
  672. }
  673. return result
  674. }
  675. }
  676. }
  677. </script>
  678. <style lang="scss" scoped>
  679. .operate_box {
  680. margin: 20rpx;
  681. display: flex;
  682. .u-reset-button {
  683. flex: 1;
  684. margin-right: 10rpx;
  685. }
  686. .u-textarea {
  687. border: 1px solid #ddd;
  688. }
  689. }
  690. .popupShow {
  691. overflow: hidden;
  692. position: fixed;
  693. width: 100%;
  694. }
  695. .img-wrap {
  696. flex: 1;
  697. display: flex;
  698. flex-wrap: wrap;
  699. .img {
  700. width: 80px;
  701. height: 60px;
  702. margin: 5px;
  703. }
  704. }
  705. .tab-title {
  706. position: fixed;
  707. width: 100%;
  708. // display: flex;
  709. // justify-content: space-between;
  710. overflow-x: auto;
  711. height: 82rpx;
  712. line-height: 82rpx;
  713. background-color: #ffffff;
  714. border-bottom: 1px solid #f2f2f2;
  715. z-index: 99;
  716. box-sizing: border-box;
  717. >view {
  718. width: 1050rpx;
  719. }
  720. .tab-item {
  721. // width: 50%;
  722. min-width: 65rpx;
  723. text-align: center;
  724. font-size: 32rpx;
  725. color: $uni-text-color-grey;
  726. margin-left: 15px;
  727. display: inline-block;
  728. }
  729. .tab-item.active {
  730. color: $j-primary-border-green;
  731. border-bottom: 1px solid $j-primary-border-green;
  732. }
  733. }
  734. .fixed {
  735. position: fixed;
  736. width: 100%;
  737. left: 0;
  738. }
  739. .add {
  740. bottom: 0;
  741. }
  742. .main {
  743. border-top: 10px solid #f0f0f0;
  744. margin-top: 42px;
  745. }
  746. .img-bar {
  747. padding: 10px 0;
  748. display: flex;
  749. .label {
  750. color: #999;
  751. text-align: right;
  752. max-width: 104px;
  753. font-size: 32rpx;
  754. padding: 0 15px;
  755. flex: 1;
  756. }
  757. .img-wrap {
  758. flex: 1;
  759. display: flex;
  760. flex-wrap: wrap;
  761. .img {
  762. width: 80px;
  763. height: 60px;
  764. margin: 5px;
  765. }
  766. }
  767. }
  768. .kd-baseInfo {
  769. padding: 0 32rpx;
  770. font-size: 28rpx;
  771. .kd-cell {
  772. line-height: 90rpx;
  773. border-bottom: 1px dashed #dadada;
  774. word-break: break-all;
  775. .kd-label {
  776. display: inline-block;
  777. width: 8em;
  778. font-weight: bold;
  779. }
  780. .kd-label2 {
  781. display: inline-block;
  782. width: 11em;
  783. font-weight: bold;
  784. }
  785. }
  786. }
  787. .wx-wrap {
  788. .item {
  789. padding: 20rpx;
  790. font-size: 28rpx;
  791. .bh-wrap {
  792. display: flex;
  793. margin-bottom: 10rpx;
  794. justify-content: space-between;
  795. .s1 {
  796. display: flex;
  797. align-items: center;
  798. .b1 {
  799. font-size: 28rpx;
  800. }
  801. }
  802. .s2 {
  803. font-size: 28rpx;
  804. }
  805. }
  806. .title-wrap {
  807. display: flex;
  808. justify-content: space-between;
  809. border-bottom: 1px dashed #dadada;
  810. padding-bottom: 10rpx;
  811. }
  812. .bg-wrap-item {
  813. margin-top: 20rpx;
  814. .value-wrap {
  815. .text {
  816. color: #7f7f7f;
  817. }
  818. .img-wrap {
  819. margin-top: 20rpx;
  820. display: flex;
  821. .img {
  822. width: 140rpx;
  823. height: 140rpx;
  824. &+.img {
  825. margin-left: 10rpx;
  826. }
  827. }
  828. }
  829. }
  830. }
  831. }
  832. }
  833. .title-md {
  834. font-weight: bold;
  835. }
  836. .zxpg-wrap {
  837. display: flex;
  838. flex-direction: column;
  839. align-items: center;
  840. margin-top: 100rpx;
  841. .btns {
  842. font-size: 32rpx;
  843. width: 420rpx;
  844. height: 80rpx;
  845. line-height: 80rpx;
  846. text-align: center;
  847. }
  848. .zx-btn {
  849. background-color: rgba(21, 122, 44, 1);
  850. color: #ffffff;
  851. }
  852. .zp-btn {
  853. color: #169bd5;
  854. }
  855. .disabled {
  856. background-color: rgba(127, 127, 127, 1);
  857. }
  858. }
  859. .bjsymx {
  860. color: #4f7f00;
  861. padding: 20rpx 0;
  862. }
  863. .apply-box {
  864. width: 70%;
  865. margin: 10rpx auto;
  866. display: flex;
  867. align-items: center;
  868. justify-content: space-around;
  869. }
  870. </style>