index.vue 10 KB

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