人民医院前端

workOrderDetail.vue 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. <template>
  2. <view class="wrapper">
  3. <view class="detailContent">
  4. <view class="contentTable">
  5. <text class="contentTitle">工单编号:</text>
  6. <text class="contentText">{{ detailContentData.F_WorkOrderCode }}</text>
  7. <text class="textState" v-show="detailContentData.StateName ">{{ detailContentData.StateName }}</text>
  8. <text class="textState fx" v-show="backState == 1">返修</text>
  9. </view>
  10. <view class="contentTable">
  11. <text class="contentTitle">上报科室:</text>
  12. <text
  13. class="contentText">{{ $mHelper.findParents(departList,detailContentData.F_ApplicationDept)}}</text>
  14. </view>
  15. <view class="contentTable">
  16. <text class="contentTitle">上报时间:</text>
  17. <text class="contentText">{{ detailContentData.F_CreateTime }}</text>
  18. </view>
  19. <view class="contentTable">
  20. <text class="contentTitle">上报地点:</text>
  21. <text class="contentText">{{ detailContentData.F_PlaceOfRepair }}</text>
  22. </view>
  23. <view class="contentTable">
  24. <text class="contentTitle">报修人员:</text>
  25. <text class="contentText">{{ detailContentData.applicantname }}</text>
  26. </view>
  27. <view class="contentTable">
  28. <view class="contentTitle" style="float: left;width: 70px;">报修内容:</view>
  29. <view class="contentText" style="margin-left: 80px;">{{ detailContentData.F_Content }}</view>
  30. </view>
  31. <view class="contentTable">
  32. <text class="contentTitle">维修科室:</text>
  33. <text
  34. class="contentText">{{ $mHelper.findParents(departList,detailContentData.F_MaintenanceDept) }}</text>
  35. </view>
  36. <view class="contentTable">
  37. <text class="contentTitle">维修人员:</text>
  38. <text
  39. class="contentText">{{ $mHelper.findUserName(userCodeList,detailContentData.F_Maintenancer) }}</text>
  40. </view>
  41. <view class="contentTable">
  42. <text class="contentTitle">联系电话:</text>
  43. <text class="contentText">{{ detailContentData.F_Phone }}</text>
  44. </view>
  45. <view class="contentTable" v-show="backState == 1">
  46. <text class="contentTitle">返修内容:</text>
  47. <text class="contentText">{{ backCon }}</text>
  48. </view>
  49. <view class="contentTable">
  50. <text class="contentTitle">图&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;片:</text>
  51. <view class="contentText" style="margin-top: 10px;">
  52. <uni-file-picker readonly :value="getFileData(detailContentData.FileUrl)" :imageStyles="imageStyles"
  53. file-mediatype="image" />
  54. </view>
  55. </view>
  56. </view>
  57. <yiLine>
  58. <view></view>
  59. </yiLine>
  60. <view class="operationButton" v-show="orderButtonData.length != 0">
  61. <!-- <view class="operationButton"> -->
  62. <view>
  63. <text class="operationButtonTitle">操作</text>
  64. <buttonsComponents class="buttons" :order-button-data="orderButtonData" :wid="workorderid"
  65. :orderType="detailContentData.F_WorkOrderCategory" :departid="departid"
  66. :maintenancer="$mHelper.findUserName(userCodeList,detailContentData.F_Maintenancer) " />
  67. </view>
  68. </view>
  69. <yiLine>
  70. <view></view>
  71. </yiLine>
  72. <view style="background-color: #fff;padding: 17px;">
  73. <view class="segmentedControlWrapper">
  74. <uni-segmented-control :current="segmenter.current" :values="segmenter.items"
  75. @clickItem="onClickSegmentedControl" styleType="text" activeColor="#007aff" />
  76. </view>
  77. <view class="handleProcess">
  78. <view v-show="current == 0">
  79. <view class="detailContent showType" v-for="item in handleProcessListData" :key=item.F_Id>
  80. <view class="contentTable">
  81. <text class="contentTitle">处理部门:</text>
  82. <text class="contentText">{{ $mHelper.findParents(departList,item.F_MaintenanceDept) }}</text>
  83. </view>
  84. <view class="contentTable">
  85. <text class="contentTitle">处理人员:</text>
  86. <text
  87. class="contentText">{{ $mHelper.findUserName(userCodeList,detailContentData.F_Maintenancer) }}</text>
  88. </view>
  89. <view class="contentTable">
  90. <text class="contentTitle">维修时间:</text>
  91. <text class="contentText">{{ item.F_ProcessingTime }}</text>
  92. </view>
  93. <view class="contentTable">
  94. <text class="contentTitle">处理结果:</text>
  95. <text class="contentText">{{ item.F_Result }}</text>
  96. </view>
  97. <view class="contentTable">
  98. <text class="contentTitle">完成状态:</text>
  99. <text class="contentText">{{ item.dealtype }}</text>
  100. </view>
  101. <view class="contentTable">
  102. <text class="contentTitle">附&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;件:</text>
  103. <uni-file-picker readonly :value="getFileData(item.FileUrl)" :imageStyles="imageStyles"
  104. file-mediatype="image" />
  105. </view>
  106. </view>
  107. <view class="contentTable noCon" v-show="handleProcessListData.length == 0">
  108. 暂时无相关记录
  109. </view>
  110. </view>
  111. <view v-show="current == 1">
  112. <view class="detailContent showType" v-for="item in cooperationDate" :key=item.F_Id >
  113. <view class="contentTable">
  114. <text class="contentTitle">工单编号:</text>
  115. <text class="contentText">{{ item.F_WorkOrderCode }}</text>
  116. </view>
  117. <view class="contentTable">
  118. <text class="contentTitle">协作方式:</text>
  119. <text class="contentText">{{ item.Mode }}</text>
  120. </view>
  121. <view class="contentTable">
  122. <text class="contentTitle">接单部门:</text>
  123. <text class="contentText">{{ $mHelper.findParents(departList,item.F_MaintenanceDept)}}</text>
  124. </view>
  125. <view class="contentTable">
  126. <text class="contentTitle">状&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;态:</text>
  127. <text class="contentText">{{ item.StateName }}</text>
  128. </view>
  129. <view class="contentTable">
  130. <text class="contentTitle">内&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;容:</text>
  131. <text class="contentText">{{ item.F_Content }}</text>
  132. </view>
  133. <view class="contentTable">
  134. <text class="contentTitle">创建时间:</text>
  135. <text class="contentText">{{ item.F_CreateTime }}</text>
  136. </view>
  137. </view>
  138. <view class="contentTable noCon" v-show="cooperationDate.length == 0">
  139. 暂时无相关记录
  140. </view>
  141. </view>
  142. <view v-show="current == 2">
  143. <uni-steps :options="orderProcessDate" :steteName='"gdlc"' v-show="orderProcessDate.length > 0" />
  144. <view class="contentTable noCon" v-show="orderProcessDate.length == 0">
  145. 暂时无相关记录
  146. </view>
  147. </view>
  148. <view v-show="current == 3">
  149. <uni-steps :options="maintenanceRecords" :steteName='"wxjl"' v-show="maintenanceRecords.length > 0" />
  150. <view class="contentTable noCon" v-show="maintenanceRecords.length == 0">
  151. 暂时无相关记录
  152. </view>
  153. </view>
  154. <view v-show="current == 4">
  155. <view class="detailContent showType" v-for="item in evaluateDate" :key=item.F_Id>
  156. <view class="contentTable">
  157. <text class="contentTitle">服务态度:</text>
  158. <htz-rate v-model="item.F_Attitude" :readonly='true' :size="30" :type="2"></htz-rate>
  159. <text class="contentTitle">{{ item.F_Attitude | getEvaluateFilters }}</text>
  160. </view>
  161. <view class="contentTable">
  162. <text class="contentTitle">维修质量:</text>
  163. <htz-rate v-model="item.F_Quality" :size="30" :type="2"></htz-rate>
  164. <text class="contentTitle">{{ item.F_Quality | getEvaluateFilters }}</text>
  165. </view>
  166. <view class="contentTable">
  167. <text class="contentTitle">完工时效:</text>
  168. <htz-rate v-model="item.F_Efficiency" :size="30" :type="2"></htz-rate>
  169. <text class="contentTitle">{{ item.F_Efficiency | getEvaluateFilters }}</text>
  170. </view>
  171. <view class="contentTable">
  172. <text class="contentTitle">文字评价:</text>
  173. <text class="contentText">{{ item.F_EvaluateContent }}</text>
  174. </view>
  175. </view>
  176. <view class="contentTable noCon" v-show="evaluateDate.length == 0">
  177. 暂时无相关记录
  178. </view>
  179. </view>
  180. </view>
  181. </view>
  182. </view>
  183. </template>
  184. <script>
  185. import yiLine from "@/components/yi-line/yi-line.vue"
  186. import buttonsComponents from "pages/myTask/workOrderDetail/button/button"
  187. import pageData from "@/pages/myTask/repairList/addRepair/pageData.js"
  188. import uniSteps from "@/pages/components/steps/index.vue"
  189. import htzRate from '@/pages/components/htz-rate/htz-rate.vue'
  190. const segmenterData = {
  191. 0: ["处理结果", "协作工单","工单流程", "维修记录", "评价"],
  192. 1: ["处理结果", "工单流程", "维修记录", "评价"]
  193. }
  194. export default {
  195. components: {
  196. yiLine,
  197. buttonsComponents,
  198. uniSteps,
  199. htzRate
  200. },
  201. filters: {
  202. getEvaluateFilters(state) {
  203. const data = {
  204. 1: '差',
  205. 2: '差',
  206. 3: '良',
  207. 4: '优',
  208. 4: '优',
  209. }
  210. return data[state]
  211. }
  212. },
  213. data() {
  214. return {
  215. active: 1,
  216. current: 0,
  217. workorderid: "", // 工单id
  218. tap: '', //工单切换
  219. roleCode: "", //角色
  220. departList: [], //部门数据
  221. userCodeList: [], //用户信息
  222. detailContentData: {}, // 详情内容
  223. orderButtonData: [],
  224. departid: '',
  225. handleProcessListData: [], // 办理过程
  226. cooperationDate: [], // 协作工单
  227. orderProcessDate: [], // 工单流程
  228. maintenanceRecords: [], // 维修记录
  229. evaluateDate: [], // 评价工单
  230. workOrderButton: [], // 工单按钮权限
  231. backState: 0, // 返修的状态,是返修1,不是为0
  232. backCon: '', // 返修的内容
  233. segmenter: {
  234. current: 0,
  235. items: ["0", "1", "2", "3", "4"],
  236. type: "",
  237. },
  238. imageStyles: {
  239. width: 64,
  240. height: 64,
  241. border: {
  242. radius: '20%'
  243. }
  244. },
  245. isDisplay: {
  246. displaySegmentedControl: false, // 分段器
  247. },
  248. }
  249. },
  250. onLoad(optioin) {
  251. this.workorderid = optioin.wid
  252. this.getDetail(0)
  253. this.getDetail(3)
  254. this.getDetail(1)
  255. JSON.parse(optioin.buttons).forEach(v => {
  256. let btn = this.$mButtonConfig[v.key];
  257. if (btn != undefined) {
  258. this.orderButtonData.push(btn);
  259. }
  260. })
  261. pageData.getDet((res, data) => {
  262. this.departList = data
  263. })
  264. pageData.getApplicant('', (res) => {
  265. this.userCodeList = res
  266. })
  267. if (optioin.segmenter == undefined || optioin.segmenter == null || optioin.segmenter == "") {
  268. this.isDisplay.displaySegmentedControl = false
  269. } else {
  270. this.isDisplay.displaySegmentedControl = true
  271. this.segmenter.type = optioin.segmenter
  272. this.segmenter.items = segmenterData[optioin.segmenter]
  273. this.getDetail(2)
  274. }
  275. this.roleCode = uni.getStorageSync("roleCode")
  276. },
  277. methods: {
  278. getFileData(fileData) {
  279. let newFile = []
  280. if (fileData && fileData.length > 0) {
  281. fileData.forEach((element, index) => {
  282. const obj = {}
  283. obj.url = element.F_FileUrl
  284. obj.extname = element.F_FileType.split('.')[1]
  285. obj.name = element.F_FileName
  286. newFile.push(obj);
  287. });
  288. }
  289. return newFile
  290. },
  291. getDetail(type) {
  292. const params = {
  293. WorkOrderCode: this.workorderid,
  294. type: type
  295. }
  296. this.$http.get("FaultRepair/GetWorkOrder", params).then((response) => {
  297. if (response.state.toLowerCase() === "success") {
  298. if (type == 0) {
  299. this.detailContentData = response.data[0]
  300. this.departid = this.detailContentData.F_MaintenanceDept.trim()
  301. } else if (type == 1) {
  302. this.handleProcessListData = response.data
  303. } else if (type == 2) {
  304. if(response.data.data.length == 0) {
  305. this.segmenter.items = segmenterData[1]
  306. this.segmenter.type = '1'
  307. }
  308. this.cooperationDate = response.data.data
  309. } else if (type == 3) {
  310. this.orderProcessDate = response.data
  311. } else if (type == 4) {
  312. this.maintenanceRecords = response.data
  313. } else if (type == 5) {
  314. this.evaluateDate = response.data
  315. } else if (type == 6) {
  316. if (response.message == '不是返修') {
  317. this.backState = 0
  318. } else if (response.message == '是返修') {
  319. this.backState = 1
  320. this.backCon = response.data
  321. }
  322. }
  323. }
  324. }).catch((e) => {
  325. console.log(e);
  326. })
  327. },
  328. onClickSegmentedControl(e) {
  329. this.current = e.currentIndex
  330. if(this.segmenter.type == '0') {
  331. switch (String(e.currentIndex)) {
  332. case "0":
  333. this.tap = 1
  334. break
  335. case "1":
  336. this.tap = 2
  337. break
  338. case "2":
  339. this.tap = 3
  340. break
  341. case "3":
  342. this.tap = 4
  343. break
  344. case "4":
  345. this.tap = 5
  346. break
  347. }
  348. }else{
  349. switch (String(e.currentIndex)) {
  350. case "0":
  351. this.tap = 1
  352. this.current = e.currentIndex
  353. break
  354. case "1":
  355. this.tap = 3
  356. this.current = e.currentIndex + 1
  357. break
  358. case "2":
  359. this.tap = 4
  360. this.current = e.currentIndex + 1
  361. break
  362. case "3":
  363. this.tap = 5
  364. this.current = e.currentIndex + 1
  365. break
  366. }
  367. }
  368. this.getDetail(this.tap)
  369. },
  370. },
  371. }
  372. </script>
  373. <style lang="scss">
  374. .noCon{
  375. height: 200px;
  376. text-align: center;
  377. font-size: 14px;
  378. color: #525252;
  379. }
  380. .wrapper {
  381. // background-color: #fff;
  382. // height: 100vh;
  383. // padding: 10px 20px 0 20px;
  384. .showType{
  385. background-color: #fff;
  386. padding: 10px 13px;
  387. border-radius: 10px;
  388. box-shadow: 0px 4px 16px 0px rgba(69, 91, 99, 0.13);
  389. margin-bottom: 25px;
  390. }
  391. .detailContent {
  392. // margin: 0 0 15px 0;
  393. padding: 17px;
  394. background-color: #fff;
  395. .contentTable {
  396. margin: 0 0 10px 0;
  397. .contentTitle {
  398. // font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑';
  399. font-weight: 700;
  400. font-style: normal;
  401. font-size: 14px;
  402. color: #555555;
  403. width: 70px;
  404. display: inline-block;
  405. text-align: right;
  406. }
  407. .contentText {
  408. color: #525252;
  409. font-size: 14px;
  410. margin-left: 10px;
  411. }
  412. .textState {
  413. position: absolute;
  414. right: 15px;
  415. font-size: 12px;
  416. border: 1px solid #52C41A;
  417. padding: 2px 5px;
  418. color: #52C41A;
  419. background-color: rgba(195, 239, 161, 0.2);
  420. border-radius: 5px
  421. }
  422. .fx {
  423. right: 70px;
  424. border: 1px solid #ff6e54;
  425. color: #ff6e54;
  426. background-color: rgba(255, 110, 84, 0.2);
  427. }
  428. }
  429. }
  430. .operationButton {
  431. margin: 5px 0;
  432. padding: 17px;
  433. background-color: #fff;
  434. .operationButtonTitle {
  435. font-weight: 700;
  436. }
  437. .buttons {
  438. margin: 15px 0 0 0;
  439. }
  440. }
  441. .handleProcess {
  442. margin: 15px 0;
  443. .handleProcessTitle {
  444. font-weight: 700;
  445. }
  446. .handleProcessContent {
  447. margin: 8px 0 0 0;
  448. .handleProcessContentTime text {
  449. font-size: 14px;
  450. color: #73d13d;
  451. }
  452. .handleProcessContentText text {
  453. font-size: 14px;
  454. color: #525252;
  455. }
  456. }
  457. }
  458. }
  459. </style>