detail.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. <template>
  2. <div>
  3. <basicDetails
  4. ref="details"
  5. :titleText="mainData.billno"
  6. :oldFormPath="{edit:'HDrpManagement/serveWorkBill/components'}"
  7. :editData="mainData"
  8. :mainAreaData="mainAreaData"
  9. turnPageId="20221031141102"
  10. idname="sa_workorderid"
  11. ownertable="sa_workorder"
  12. tags=""
  13. :tabs="['工序详情','确认单','服务团队','工单物料','详细信息']"
  14. @pageChange="pageChange"
  15. @onEditSuccess="queryMainData($route.query.id)">
  16. <div slot="tags">
  17. </div>
  18. <div slot="customOperation" >
  19. <!-- <customBtn
  20. btnName="接单"
  21. message="确认接单当前服务工单吗?"
  22. idName="20230210101103"
  23. keyName="sa_workorderid"
  24. :id="$route.query.id"
  25. @onSuccess="queryMainData"
  26. class="inline-16"
  27. v-if="mainData.status == '新建' && tool.checkAuth($route.name,'join')"
  28. />
  29. <customBtn
  30. btnName="开始"
  31. message="确认开始当前服务工单吗?"
  32. idName="20230209144503"
  33. keyName="sa_workorderid"
  34. :id="$route.query.id"
  35. @onSuccess="queryMainData"
  36. class="inline-16"
  37. v-if="mainData.status == '待开始' && tool.checkAuth($route.name,'start')"
  38. /> -->
  39. <customBtn
  40. btnName="暂停"
  41. message="确认暂停当前服务工单吗?"
  42. idName="20230209144603"
  43. keyName="sa_workorderid"
  44. :id="$route.query.id"
  45. @onSuccess="queryMainData"
  46. class="inline-16"
  47. v-if="mainData.status == '进行中' && tool.checkAuth($route.name,'stop')"
  48. />
  49. <customBtn
  50. btnName="启用"
  51. message="确认启用当前服务工单吗?"
  52. idName="20230209144703"
  53. keyName="sa_workorderid"
  54. :id="$route.query.id"
  55. @onSuccess="queryMainData"
  56. class="inline-16"
  57. v-if="mainData.status == '暂停' && tool.checkAuth($route.name,'used')"
  58. />
  59. <!-- <customBtn
  60. btnName="完结"
  61. message="确认完结当前服务工单吗?"
  62. idName="20230209144903"
  63. keyName="sa_workorderid"
  64. :id="$route.query.id"
  65. @onSuccess="queryMainData"
  66. class="inline-16"
  67. v-if="mainData.status != '新建' && tool.checkAuth($route.name,'complete')"
  68. /> -->
  69. <customBtn
  70. btnName="作废"
  71. message="确认作废当前服务工单吗?"
  72. idName="20230209144803"
  73. keyName="sa_workorderid"
  74. :id="$route.query.id"
  75. @onSuccess="queryMainData"
  76. class="inline-16"
  77. v-if="mainData.status != '完结' && tool.checkAuth($route.name,'delete')"
  78. />
  79. </div>
  80. <div slot="slot0" >
  81. <taskDetail :data="nodes">
  82. <template v-slot:detail="scope">
  83. <taskListDetail class="inline-16" :data="scope.data"></taskListDetail>
  84. </template>
  85. <!-- <template v-slot:edit="scope">
  86. <taskListEdit class="inline-16" :data="scope.data"/>
  87. </template> -->
  88. </taskDetail>
  89. </div>
  90. <div slot="slot1" >
  91. <checkBill>
  92. <template v-slot:download="scope">
  93. <el-button v-if="tool.checkAuth($route.name,'checkBillDetail')" type="text" size="mini" @click="downLoadBill(scope.data)">单 据 下 载</el-button>
  94. </template>
  95. </checkBill>
  96. </div>
  97. <div slot="slot2">
  98. <teamList v-if="tool.checkAuth($route.name,'teamList')" ref="teamList" :data="mainData.team">
  99. <selectTeam ref="team" @teamChange="teamChange" slot="add">
  100. <el-button v-if="tool.checkAuth($route.name,'teamHandle')" class="button-new-tag" size="small" type="primary" @click="$refs.team.dialogFormVisible=true">添 加</el-button>
  101. </selectTeam>
  102. </teamList>
  103. </div>
  104. <div slot="slot3">
  105. <Items :data="mainData.titems"></Items>
  106. </div>
  107. <div slot="slot4" >
  108. <detailInfo :more="true" :data="detailInfo"></detailInfo>
  109. </div>
  110. </basicDetails>
  111. </div>
  112. </template>
  113. <script>
  114. import detailInfo from '@/components/detailInfo/index'
  115. import taskDetail from './taskDetail/index'
  116. import taskListDetail from './taskDetail/taskListDetail'
  117. import taskListEdit from './taskDetail/taskListEdit'
  118. import checkBill from './checkBill/index'
  119. import teamList from './teamList/index'
  120. import Items from './items/index'
  121. import selectTeam from '../components/teamSelect'
  122. import { log } from '@antv/g2plot/lib/utils'
  123. export default {
  124. name: "detail",
  125. data() {
  126. return {
  127. mainData:'',
  128. mainAreaData:{},
  129. detailInfo:'',
  130. nodes:[]
  131. }
  132. },
  133. components:{
  134. detailInfo,
  135. taskDetail,
  136. taskListDetail,
  137. taskListEdit,
  138. checkBill,
  139. teamList,
  140. Items,
  141. selectTeam
  142. },
  143. methods:{
  144. async queryMainData(id) {
  145. const res = await this.$api.requested({
  146. "id":20230208140103,
  147. "content": {
  148. "sa_workorderid": this.$route.query.id
  149. }
  150. })
  151. this.mainData = res.data
  152. this.changeDataStructure()
  153. console.log(res.data);
  154. this.nodes = this.createTreeData(res.data.nodes)
  155. console.log(this.nodes);
  156. },
  157. downLoadBill (data) {
  158. if(data.attinfos.length == 0) return this.$message({
  159. type:'warning',
  160. message:'暂无单据信息'
  161. })
  162. window.open(data.attinfos[0].url,'_self')
  163. },
  164. async teamChange (data) {
  165. let result = data.map(item => {
  166. return item.userid
  167. })
  168. const res = await this.$api.requested({
  169. "id": 20220930103603,
  170. "content": {
  171. "ownertable":'sa_workorder',
  172. "ownerid":this.$route.query.id,
  173. "justuserids":false,
  174. "userids": result
  175. }
  176. })
  177. this.tool.showMessage(res,() => {
  178. this.$refs.team.dialogFormVisible = false
  179. this.$refs.teamList.listData()
  180. })
  181. },
  182. changeDataStructure() {
  183. let that = this
  184. this.mainAreaData = [
  185. {
  186. label:'单号',
  187. value:this.mainData.billno
  188. },
  189. {
  190. label:'服务申请单号',
  191. value:this.mainData.servicebillno
  192. },
  193. {
  194. label:'工单类型',
  195. value:this.mainData.type
  196. },
  197. {
  198. label:'负责人',
  199. value:this.mainData.projectleader
  200. },
  201. {
  202. label:'状态',
  203. value:this.mainData.status,
  204. style:function () {
  205. let style = {}
  206. switch (that.mainData.status) {
  207. case '进行中':
  208. style = {color:'#52c41a'}
  209. break;
  210. case '待开始':
  211. style = {color:'#3874f6'}
  212. break;
  213. case '暂停':
  214. style = {color:'#333333'}
  215. break;
  216. /* case '提交':
  217. style = {color:'#3874f6'}
  218. break; */
  219. case '待接单':
  220. style = {color:'#fa8c16'}
  221. break;
  222. case '已完成':
  223. style = {color:'#fa8c16'}
  224. break;
  225. default:
  226. break;
  227. }
  228. return style
  229. }
  230. },
  231. {
  232. label:'经销商编号',
  233. value:this.mainData.agentnum
  234. },
  235. {
  236. label:'经销商',
  237. value:this.mainData.enterprisename
  238. },
  239. {
  240. label:'省市县',
  241. value:this.mainData.province + this.mainData.city + this.mainData.county
  242. },
  243. {
  244. label:'业务员',
  245. value:this.mainData.saler_name
  246. },
  247. {
  248. label:'业务员电话',
  249. value:this.mainData.salerphonenumber
  250. },
  251. {
  252. label:'地址',
  253. value:this.mainData.address
  254. },
  255. {
  256. label:'创建时间',
  257. value:this.mainData.createdate
  258. },
  259. {
  260. label:'结束时间',
  261. value:this.mainData.enddate
  262. }
  263. ]
  264. this.detailInfo = [
  265. {
  266. title:'基本信息',
  267. info: [
  268. {label:'单号',value:this.mainData.billno},
  269. {label:'申请单号',value:this.mainData.servicebillno},
  270. {
  271. label:'状态',
  272. value:this.mainData.status,
  273. style:function () {
  274. let style = {}
  275. switch (that.mainData.status) {
  276. case '进行中':
  277. style = {color:'#52c41a'}
  278. break;
  279. case '待开始':
  280. style = {color:'#3874f6'}
  281. break;
  282. case '暂停':
  283. style = {color:'#333333'}
  284. break;
  285. /* case '提交':
  286. style = {color:'#3874f6'}
  287. break; */
  288. case '待接单':
  289. style = {color:'#fa8c16'}
  290. break;
  291. case '已完成':
  292. style = {color:'#fa8c16'}
  293. break;
  294. default:
  295. break;
  296. }
  297. return style
  298. }
  299. },
  300. {label:'经销商编号',value:this.mainData.agentnum},
  301. {label:'经销商',value:this.mainData.enterprise},
  302. {label:'现场联系人',value:this.mainData.scenecontact},
  303. {label:'联系人电话',value:this.mainData.scenecontactphonenumber},
  304. {label:'工单负责人',value:this.mainData.projectleader},
  305. {label:'工单类型',value:this.mainData.type},
  306. {label:'工单模板',value:this.mainData.name},
  307. {label:'省市县',value:`${this.mainData.province}-${this.mainData.city}-${this.mainData.county}`},
  308. {label:'地址',value:this.mainData.address},
  309. {label:'创建人',value:this.mainData.createby},
  310. {label:'创建时间',value:this.mainData.createdate},
  311. ]
  312. },
  313. ]
  314. },
  315. createTreeData (array) {
  316. var that = this
  317. let arr = []
  318. function convertToElementTree(node) {
  319. // 新节点
  320. var elNode = {
  321. amount:node['amount'],
  322. attinfos:node['attinfos'],
  323. changeby: node["changeby"],
  324. changedate:node['changedate'],
  325. changeuserid:node['changeuserid'],
  326. confirm_value:node['confirm_value'],
  327. finishby:node['finishby'],
  328. parentid:node['parentid'],
  329. remarks:node['remarks'],
  330. sa_workorder_nodeid:node['sa_workorder_nodeid'],
  331. sa_workorderid:node['sa_workorderid'],
  332. sequence:node['sequence'],
  333. status:node['status'],
  334. textcontent:node['textcontent'],
  335. workname:node['workpresetjson'].workname,
  336. additem:node['workpresetjson'].additem,
  337. addperson:node['workpresetjson'].amountpay,
  338. confirm_options:node['workpresetjson'].confirm_options,
  339. confirm:node['workpresetjson'].confirm,
  340. contractupload:node['workpresetjson'].contractupload,
  341. fileupload:node['workpresetjson'].fileupload,
  342. itemtype:node['workpresetjson'].itemtype,
  343. remarks:node['workpresetjson'].remarks,
  344. required:node['workpresetjson'].required,
  345. textedit:node['workpresetjson'].textedit,
  346. children: [],
  347. }
  348. if (node.child && node.child.length > 0) {
  349. // 如果存在子节点
  350. for (var index = 0; index < node.child.length; index++) {
  351. // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
  352. elNode.children.push(convertToElementTree(node.child[index]));
  353. }
  354. }
  355. return elNode;
  356. }
  357. array.forEach((element) => {
  358. arr.push(convertToElementTree(element))
  359. });
  360. return arr
  361. },
  362. // 监听切换数据,上一页,下一页
  363. pageChange (id,rowindex,tabIndex) {
  364. this.flag = false
  365. tabIndex = this.$route.query.tabIndex
  366. this.$router.replace({path:'/workorderDetail',query:{id:id,rowindex:rowindex,tabIndex:tabIndex}})
  367. this.queryMainData(id)
  368. },
  369. onSuccess(){
  370. this.visible = false
  371. this.queryMainData(this.$route.query.id)
  372. this.$emit('onSuccess')
  373. }
  374. },
  375. mounted () {
  376. this.queryMainData(this.$route.query.id)
  377. },
  378. created() {
  379. }
  380. }
  381. </script>
  382. <style scoped>
  383. </style>