index.vue 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  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="contractCode">
  7. <el-input v-model="queryForm.contractCode" placeholder="合同编号" @keyup.enter.native="restFetchData" />
  8. </el-form-item>
  9. <el-form-item prop="custName">
  10. <el-input v-model="queryForm.custName" placeholder="客户名称" @keyup.enter.native="restFetchData" />
  11. </el-form-item>
  12. <el-form-item prop="orderType">
  13. <el-select
  14. v-model="queryForm.orderType"
  15. clearable
  16. placeholder="交付类型"
  17. style="width: 100%"
  18. @keyup.enter.native="restFetchData">
  19. <el-option label="软件" value="10" />
  20. <el-option label="硬件" value="20" />
  21. </el-select>
  22. </el-form-item>
  23. <el-form-item prop="projectManName">
  24. <el-input v-model="queryForm.projectManName" placeholder="项目经理" @keyup.enter.native="restFetchData" />
  25. </el-form-item>
  26. <el-form-item>
  27. <el-button icon="el-icon-search" type="primary" @click="restFetchData">查询</el-button>
  28. <el-button icon="el-icon-refresh-right" @click="reset">重置</el-button>
  29. </el-form-item>
  30. </el-form>
  31. </vab-query-form-top-panel>
  32. <vab-query-form-left-panel :span="12" />
  33. <vab-query-form-right-panel :span="12">
  34. <table-tool :columns="columns" :show-columns.sync="showColumns" table-type="deliverWorkOrderTable" />
  35. </vab-query-form-right-panel>
  36. </vab-query-form>
  37. <el-table ref="table" v-loading="listLoading" border :data="list" :height="$baseTableHeight(2)">
  38. <el-table-column align="center" label="序号" show-overflow-tooltip width="80">
  39. <template #default="{ $index }">
  40. {{ $index + 1 }}
  41. </template>
  42. </el-table-column>
  43. <el-table-column
  44. v-for="(item, index) in showColumns"
  45. :key="index"
  46. align="center"
  47. :label="item.label"
  48. :prop="item.prop"
  49. show-overflow-tooltip
  50. :sortable="item.sortable"
  51. :width="item.width">
  52. <template #default="{ row }">
  53. <el-button v-if="item.prop === 'orderCode'" style="font-size: 14px" type="text" @click="handleDetail(row)">
  54. {{ row.orderCode }}
  55. </el-button>
  56. <span v-else-if="item.prop === 'orderType'">
  57. {{ row.orderType == '10' ? '软件' : '硬件' }}
  58. </span>
  59. <span v-else-if="item.prop === 'product'">
  60. {{ selectDictLabel(productLineOptions, row.product) }}
  61. </span>
  62. <span v-else-if="item.prop === 'orderStatus'">
  63. {{ selectDictLabel(deliveryStatusOptions, row.orderStatus) }}
  64. </span>
  65. <span v-else-if="item.prop === 'createdTime'">
  66. {{ parseTime(row.createdTime, '{y}-{m}-{d}') }}
  67. </span>
  68. <span v-else>{{ row[item.prop] }}</span>
  69. </template>
  70. </el-table-column>
  71. <el-table-column align="center" label="操作" width="90">
  72. <template #default="{ row }">
  73. <el-button type="text" @click="handleUpdateUser(row)">成员</el-button>
  74. <el-button v-if="row.orderStatus != 20" type="text" @click="handleFinish(row)">完成</el-button>
  75. </template>
  76. </el-table-column>
  77. <template #empty>
  78. <el-image class="vab-data-empty" :src="require('@/assets/empty_images/data_empty.png')" />
  79. </template>
  80. </el-table>
  81. <el-pagination
  82. background
  83. :current-page="queryForm.pageNum"
  84. :layout="layout"
  85. :page-size="queryForm.pageSize"
  86. :total="total"
  87. @current-change="handleCurrentChange"
  88. @size-change="handleSizeChange" />
  89. <!--创建工单-->
  90. <!-- <edit ref="edit" @fetch-data="fetchData" /> -->
  91. <!--反馈-->
  92. <finish ref="finish" @fetch-data="restFetchData" />
  93. <!-- 更新项目经理交付经理 -->
  94. <update-user ref="updateUser" @fetch-data="restFetchData" />
  95. </div>
  96. </template>
  97. <script>
  98. import to from 'await-to-js'
  99. import deliverApi from '@/api/work/deliver'
  100. import TableTool from '@/components/table/TableTool'
  101. import Finish from './components/finish'
  102. import UpdateUser from './components/updateUser'
  103. export default {
  104. name: 'WorkOrder',
  105. components: { TableTool, Finish, UpdateUser },
  106. data() {
  107. return {
  108. activeName: 'first',
  109. layout: 'total, sizes, prev, pager, next, jumper',
  110. queryForm: {
  111. contractCode: '',
  112. custName: '',
  113. orderType: '',
  114. projectManName: '',
  115. pageNum: 1,
  116. pageSize: 10,
  117. },
  118. total: 0,
  119. listLoading: false,
  120. list: [],
  121. selectRows: [],
  122. showColumns: [],
  123. columns: [
  124. {
  125. label: '交付工单号',
  126. width: '160px',
  127. prop: 'orderCode',
  128. },
  129. {
  130. label: '关联合同',
  131. width: 'auto',
  132. prop: 'contractCode',
  133. },
  134. {
  135. label: '交付状态',
  136. width: '160px',
  137. prop: 'orderStatus',
  138. disableCheck: true,
  139. },
  140. {
  141. label: '交付类型',
  142. width: '160px',
  143. prop: 'orderType',
  144. },
  145. {
  146. label: '关联客户',
  147. width: 'auto',
  148. prop: 'custName',
  149. },
  150. {
  151. label: '关联项目',
  152. width: 'auto',
  153. prop: 'projectName',
  154. },
  155. {
  156. label: '项目经理',
  157. width: '160px',
  158. prop: 'projectManName',
  159. },
  160. {
  161. label: '交付经理',
  162. width: '160px',
  163. prop: 'deliverManName',
  164. },
  165. {
  166. label: '产品线',
  167. width: 'auto',
  168. prop: 'product',
  169. },
  170. {
  171. label: '完成信息',
  172. width: '160px',
  173. prop: 'finishRemark',
  174. },
  175. {
  176. label: '创建时间',
  177. width: 'auto',
  178. prop: 'createdTime',
  179. },
  180. ],
  181. deliveryStatusOptions: [],
  182. productLineOptions: [],
  183. }
  184. },
  185. watch: {
  186. showColumns: function () {
  187. this.$nextTick(() => this.$refs.table.doLayout())
  188. },
  189. },
  190. activated() {
  191. this.fetchData()
  192. },
  193. mounted() {
  194. this.getOptions()
  195. this.fetchData()
  196. // deliverApi.addDeliverOrder({ contractId: 47 })
  197. },
  198. methods: {
  199. getOptions() {
  200. Promise.all([this.getDicts('delivery_status'), this.getDicts('sys_product_line')])
  201. .then(([deliveryStatus, productLine]) => {
  202. this.deliveryStatusOptions = deliveryStatus.data.values || []
  203. this.productLineOptions = productLine.data.values || []
  204. })
  205. .catch((err) => console.log(err))
  206. },
  207. restFetchData() {
  208. this.queryForm.pageNum = 1
  209. this.fetchData()
  210. },
  211. async fetchData() {
  212. this.listLoading = true
  213. const params = { ...this.queryForm }
  214. const [err, res] = await to(deliverApi.getDeliverOrderList({ ...params }))
  215. this.listLoading = false
  216. if (err) return (this.listLoading = false)
  217. if (res.code == 200 && res.data) {
  218. this.list = res.data.list || []
  219. this.total = res.data.total
  220. }
  221. this.$nextTick(() => this.$refs.table.doLayout())
  222. },
  223. handleFinish(row) {
  224. this.$refs['finish'].showEdit(row)
  225. },
  226. handleUpdateUser(row) {
  227. this.$refs['updateUser'].open(row)
  228. },
  229. //详情
  230. handleDetail(row) {
  231. this.$router.push({
  232. name: 'DeliveryPlan',
  233. query: {
  234. id: row.id,
  235. },
  236. })
  237. },
  238. reset() {
  239. this.queryForm = {
  240. pageNum: 1,
  241. pageSize: 10,
  242. name: '',
  243. orderTypeName: '',
  244. orderStatus: '',
  245. assignUserName: '',
  246. }
  247. this.fetchData()
  248. },
  249. handleSizeChange(val) {
  250. this.queryForm.pageSize = val
  251. this.fetchData()
  252. },
  253. handleCurrentChange(val) {
  254. this.queryForm.pageNum = val
  255. this.fetchData()
  256. },
  257. setSelectRows(val) {
  258. this.selectRows = val
  259. },
  260. },
  261. }
  262. </script>
  263. <style lang="scss" scoped>
  264. $base: '.list';
  265. </style>