index.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. <template>
  2. <div class="list-container">
  3. <vab-query-form>
  4. <vab-query-form-top-panel>
  5. <el-form ref="queryForm" :inline="true" :model="queryForm" @submit.native.prevent>
  6. <el-form-item prop="name">
  7. <el-input v-model="queryForm.name" placeholder="工单名称" @keyup.enter.native="fetchData" />
  8. </el-form-item>
  9. <el-form-item prop="orderTypeName">
  10. <el-input v-model="queryForm.orderTypeName" placeholder="工单类型" @keyup.enter.native="fetchData" />
  11. </el-form-item>
  12. <el-form-item prop="orderStatus">
  13. <el-select
  14. v-model="queryForm.orderStatus"
  15. clearable
  16. placeholder="工单状态"
  17. style="width: 100%"
  18. @keyup.enter.native="fetchData">
  19. <el-option v-for="item in orderStatusOptions" :key="item.key" :label="item.value" :value="item.key" />
  20. </el-select>
  21. </el-form-item>
  22. <el-form-item prop="productLine">
  23. <el-select
  24. v-model="queryForm.productLine"
  25. clearable
  26. placeholder="产品线"
  27. style="width: 100%"
  28. @change="changeProductLine">
  29. <el-option v-for="item in productLineOptions" :key="item.key" :label="item.value" :value="item.key" />
  30. </el-select>
  31. </el-form-item>
  32. <el-form-item prop="assignUserName">
  33. <el-input v-model="queryForm.assignUserName" placeholder="支持人员姓名" @keyup.enter.native="fetchData" />
  34. </el-form-item>
  35. <el-form-item prop="supportTime">
  36. <el-date-picker
  37. v-model="queryForm.supportTime"
  38. end-placeholder="日期结束"
  39. range-separator="至"
  40. start-placeholder="日期开始"
  41. type="daterange"
  42. value-format="yyyy-MM-dd" />
  43. </el-form-item>
  44. <el-form-item>
  45. <el-button icon="el-icon-search" type="primary" @click="fetchData">查询</el-button>
  46. <el-button icon="el-icon-refresh-right" @click="reset">重置</el-button>
  47. </el-form-item>
  48. </el-form>
  49. </vab-query-form-top-panel>
  50. <vab-query-form-left-panel :span="12">
  51. <!-- <el-button icon="el-icon-plus" size="mini" type="primary" @click="handleEdit">新建</el-button>-->
  52. </vab-query-form-left-panel>
  53. <vab-query-form-right-panel :span="12">
  54. <table-tool :columns="columns" :show-columns.sync="showColumns" table-type="workOrderTable" />
  55. </vab-query-form-right-panel>
  56. </vab-query-form>
  57. <el-table ref="table" v-loading="listLoading" border :data="list" :height="$baseTableHeight(2)">
  58. <el-table-column align="center" label="序号" show-overflow-tooltip width="80">
  59. <template #default="{ $index }">
  60. {{ $index + 1 }}
  61. </template>
  62. </el-table-column>
  63. <el-table-column
  64. v-for="(item, index) in showColumns"
  65. :key="index"
  66. align="center"
  67. :label="item.label"
  68. :prop="item.prop"
  69. show-overflow-tooltip
  70. :sortable="item.sortable"
  71. :width="item.width">
  72. <template #default="{ row }">
  73. <el-button v-if="item.prop === 'id'" style="font-size: 14px" type="text" @click="handleDetail(row)">
  74. {{ row.id }}
  75. </el-button>
  76. <span v-else-if="item.prop === 'orderStatus'">
  77. {{ selectDictLabel(orderStatusOptions, row.orderStatus) }}
  78. </span>
  79. <span v-else-if="item.prop === 'productLine'">
  80. {{ row.productLineName ? row.productLineName : selectDictLabel(productLineOptions, row.productLine) }}
  81. </span>
  82. <span v-else-if="item.prop === 'createdTime'">
  83. {{ parseTime(row.createdTime, '{y}-{m}-{d}') }}
  84. </span>
  85. <span v-else-if="item.prop === 'endTime'">
  86. {{ overdue(row.endTime) }}
  87. </span>
  88. <el-button v-else-if="item.prop === 'nboName'" class="link-button" type="text" @click="handleProjDetail(row)">
  89. {{ row[item.prop] }}
  90. </el-button>
  91. <span v-else>{{ row[item.prop] }}</span>
  92. </template>
  93. </el-table-column>
  94. <el-table-column align="center" fixed="right" label="操作" width="60">
  95. <template #default="{ row }">
  96. <el-button v-if="row.orderStatus == 10 || row.orderStatus == 30" type="text" @click="handleClose(row.id)">
  97. 关闭
  98. </el-button>
  99. </template>
  100. </el-table-column>
  101. <template #empty>
  102. <el-image class="vab-data-empty" :src="require('@/assets/empty_images/data_empty.png')" />
  103. </template>
  104. </el-table>
  105. <el-pagination
  106. background
  107. :current-page="queryForm.pageNum"
  108. :layout="layout"
  109. :page-size="queryForm.pageSize"
  110. :total="total"
  111. @current-change="handleCurrentChange"
  112. @size-change="handleSizeChange" />
  113. <!--创建工单-->
  114. <edit ref="edit" @fetch-data="fetchData" />
  115. </div>
  116. </template>
  117. <script>
  118. import to from 'await-to-js'
  119. import api from '@/api/work/index'
  120. import TableTool from '@/components/table/TableTool'
  121. import Edit from './components/Edit'
  122. export default {
  123. name: 'WorkOrder',
  124. components: { TableTool, Edit },
  125. data() {
  126. return {
  127. activeName: 'first',
  128. layout: 'total, sizes, prev, pager, next, jumper',
  129. queryForm: {
  130. name: '',
  131. orderTypeName: '',
  132. orderStatus: '',
  133. assignUserName: '',
  134. supportTime: [],
  135. productLine: '',
  136. pageNum: 1,
  137. pageSize: 10,
  138. },
  139. total: 0,
  140. listLoading: false,
  141. list: [],
  142. selectRows: [],
  143. showColumns: [],
  144. productLineOptions: [],
  145. columns: [
  146. {
  147. label: '工单编号',
  148. width: '80px',
  149. prop: 'id',
  150. disableCheck: true,
  151. },
  152. {
  153. label: '工单标题',
  154. width: '320px',
  155. prop: 'name',
  156. disableCheck: true,
  157. },
  158. {
  159. label: '工单类型',
  160. width: '200px',
  161. prop: 'orderTypeName',
  162. },
  163. {
  164. label: '工单状态',
  165. width: '100px',
  166. prop: 'orderStatus',
  167. },
  168. {
  169. label: '关联客户',
  170. width: '320px',
  171. prop: 'custName',
  172. },
  173. {
  174. label: '关联项目',
  175. width: '320px',
  176. prop: 'nboName',
  177. },
  178. {
  179. label: '产品线',
  180. width: '160px',
  181. prop: 'productLine',
  182. },
  183. {
  184. label: '负责人',
  185. width: '120px',
  186. prop: 'assignUserName',
  187. },
  188. {
  189. label: '是否超期',
  190. width: 'auto',
  191. prop: 'endTime',
  192. },
  193. {
  194. label: '申请人',
  195. width: '120px',
  196. prop: 'createdName',
  197. },
  198. ],
  199. orderStatusOptions: [],
  200. }
  201. },
  202. watch: {
  203. showColumns: function () {
  204. this.$nextTick(() => this.$refs.table.doLayout())
  205. },
  206. },
  207. activated() {
  208. this.fetchData()
  209. },
  210. mounted() {
  211. this.getOptions()
  212. this.fetchData()
  213. },
  214. methods: {
  215. changeProductLine() {},
  216. getOptions() {
  217. Promise.all([this.getDicts('work_order_status'), this.getDicts('sys_product_line')])
  218. .then(([workOrderStatus, productLine]) => {
  219. this.orderStatusOptions = workOrderStatus.data.values || []
  220. this.productLineOptions = productLine.data.values || []
  221. })
  222. .catch((err) => console.log(err))
  223. },
  224. overdue(endTime) {
  225. if (endTime) {
  226. var oDate1 = new Date()
  227. var oDate2 = new Date(endTime)
  228. if (oDate1.getTime() > oDate2.getTime()) {
  229. return '是' //第一个大
  230. } else {
  231. return '否' //第二个大
  232. }
  233. } else {
  234. return '否'
  235. }
  236. },
  237. async fetchData() {
  238. this.listLoading = true
  239. const params = { ...this.queryForm }
  240. const [err, res] = await to(api.getList(params))
  241. if (err) return (this.listLoading = false)
  242. if (res.data.list) {
  243. res.data.list.filter((i) => {
  244. let idata = JSON.parse(i.formData)
  245. idata.filter((field) => {
  246. if (field.name == '产品线') {
  247. i.productLineName = field.value
  248. }
  249. })
  250. })
  251. }
  252. this.list = res.data.list || []
  253. this.total = res.data.total
  254. this.listLoading = false
  255. this.$nextTick(() => this.$refs.table.doLayout())
  256. },
  257. handleEdit(row) {
  258. if (row.id) {
  259. this.$refs['edit'].showEdit(row)
  260. } else {
  261. this.$refs['edit'].showEdit()
  262. }
  263. },
  264. // 关闭工单
  265. handleClose(id) {
  266. this.$confirm('确认关闭?', '提示', {
  267. confirmButtonText: '确定',
  268. cancelButtonText: '取消',
  269. type: 'warning',
  270. })
  271. .then(async () => {
  272. const [err, res] = await to(api.closeWorkOrder({ orderId: id }))
  273. if (err) return
  274. if (res.code == 200) {
  275. this.fetchData()
  276. this.$message({
  277. type: 'success',
  278. message: '关闭成功!',
  279. })
  280. }
  281. })
  282. .catch(() => {})
  283. },
  284. //详情
  285. handleDetail(row) {
  286. this.$router.push({
  287. name: 'WorkOrderDetail',
  288. query: {
  289. id: row.id,
  290. },
  291. })
  292. },
  293. handleProjDetail(row) {
  294. this.$router.push({
  295. path: '/opportunity/detail',
  296. query: {
  297. id: row.nboId,
  298. },
  299. })
  300. },
  301. reset() {
  302. this.queryForm = {
  303. pageNum: 1,
  304. pageSize: 10,
  305. name: '',
  306. orderTypeName: '',
  307. orderStatus: '',
  308. assignUserName: '',
  309. supportTime: [],
  310. productLine: '',
  311. nboName: '',
  312. custName: '',
  313. }
  314. this.fetchData()
  315. },
  316. handleSizeChange(val) {
  317. this.queryForm.pageSize = val
  318. this.fetchData()
  319. },
  320. handleCurrentChange(val) {
  321. this.queryForm.pageNum = val
  322. this.fetchData()
  323. },
  324. setSelectRows(val) {
  325. this.selectRows = val
  326. },
  327. },
  328. }
  329. </script>
  330. <style lang="scss" scoped>
  331. $base: '.list';
  332. </style>