index.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <template>
  3. <div class="installation-order">
  4. <!-- 筛选条件 -->
  5. <el-card class="filter-container">
  6. <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="100px">
  7. <el-form-item label="安装人员">
  8. <el-input v-model="queryParams.installer" placeholder="请输入安装人员" clearable size="small"/>
  9. </el-form-item>
  10. <el-form-item label="客户名称">
  11. <el-input v-model="queryParams.customerName" placeholder="请输入客户名称" clearable size="small"/>
  12. </el-form-item>
  13. <el-form-item label="处理状态">
  14. <el-select v-model="queryParams.status" placeholder="请选择处理状态" clearable size="small">
  15. <el-option
  16. v-for="dict in statusOptions"
  17. :key="dict.value"
  18. :label="dict.label"
  19. :value="dict.value"
  20. />
  21. </el-select>
  22. </el-form-item>
  23. <el-form-item label="项目名称">
  24. <el-select v-model="queryParams.projectName" placeholder="请选择项目名称" clearable size="small">
  25. <el-option
  26. v-for="dict in projectOptions"
  27. :key="dict.value"
  28. :label="dict.label"
  29. :value="dict.value"
  30. />
  31. </el-select>
  32. </el-form-item>
  33. <el-form-item label="下单时间">
  34. <el-date-picker
  35. v-model="queryParams.orderTimeRange"
  36. type="daterange"
  37. range-separator="至"
  38. start-placeholder="开始日期"
  39. end-placeholder="结束日期"
  40. size="small"
  41. />
  42. </el-form-item>
  43. <el-form-item label="完成时间">
  44. <el-date-picker
  45. v-model="queryParams.completeTimeRange"
  46. type="daterange"
  47. range-separator="至"
  48. start-placeholder="开始日期"
  49. end-placeholder="结束日期"
  50. size="small"
  51. />
  52. </el-form-item>
  53. <el-form-item>
  54. <el-button type="primary" icon="el-icon-search" size="small" @click="handleQuery">搜索</el-button>
  55. <el-button type="success" icon="el-icon-download" size="small" @click="handleExport">导出</el-button>
  56. </el-form-item>
  57. </el-form>
  58. </el-card>
  59. <!-- 操作按钮 -->
  60. <el-card class="operation-container">
  61. <el-button type="primary" icon="el-icon-plus" size="small" @click="handleAdd">新增计划</el-button>
  62. <el-radio-group v-model="queryParams.viewType" size="small" @change="handleViewTypeChange">
  63. <el-radio-button label="all">全部</el-radio-button>
  64. <el-radio-button label="pending">待处理</el-radio-button>
  65. <el-radio-button label="processed">已处理</el-radio-button>
  66. </el-radio-group>
  67. </el-card>
  68. <!-- 表格 -->
  69. <el-card>
  70. <el-table v-loading="loading" :data="tableData" border>
  71. <el-table-column type="index" label="序号" width="50" align="center"/>
  72. <el-table-column prop="orderNo" label="安装单号" align="center"/>
  73. <el-table-column prop="projectName" label="项目名称" align="center"/>
  74. <el-table-column prop="customerName" label="客户名称" align="center"/>
  75. <el-table-column prop="product" label="货品" align="center"/>
  76. <el-table-column prop="totalQuantity" label="安装总数量" align="center"/>
  77. <el-table-column prop="installedQuantity" label="已安装数量" align="center"/>
  78. <el-table-column prop="uninstalledQuantity" label="未安装数量" align="center"/>
  79. <el-table-column prop="progress" label="安装进度" align="center">
  80. <template slot-scope="scope">
  81. <el-progress :percentage="scope.row.progress"/>
  82. </template>
  83. </el-table-column>
  84. <el-table-column prop="dispatcher" label="派单人" align="center"/>
  85. <el-table-column prop="serviceStaff" label="服务人员" align="center"/>
  86. <el-table-column prop="orderTime" label="下单时间" align="center"/>
  87. <el-table-column prop="acceptTime" label="接单时间" align="center"/>
  88. <el-table-column prop="estimatedCompleteTime" label="预估完成时间" align="center"/>
  89. <el-table-column prop="remainingTime" label="距预估完成时间还剩" align="center"/>
  90. <el-table-column prop="actualCompleteTime" label="实际完成时间" align="center"/>
  91. <el-table-column prop="status" label="处理状态" align="center">
  92. <template slot-scope="scope">
  93. <el-tag :type="getStatusType(scope.row.status)">{{ scope.row.statusText }}</el-tag>
  94. </template>
  95. </el-table-column>
  96. <el-table-column prop="remark" label="备注" align="center"/>
  97. <el-table-column label="操作" width="400" align="center">
  98. <template slot-scope="scope">
  99. <el-button size="mini" type="text" @click="handleView(scope.row)">查看</el-button>
  100. <el-button size="mini" type="text" @click="handleEdit(scope.row)">编辑</el-button>
  101. <el-button size="mini" type="text" @click="handleDelete(scope.row)">删除</el-button>
  102. <el-button size="mini" type="text" @click="handleDispatch(scope.row)">派单</el-button>
  103. <el-button size="mini" type="text" @click="handleReject(scope.row)">接单驳回</el-button>
  104. <el-button size="mini" type="text" @click="handleDailyWrite(scope.row)">每日填写</el-button>
  105. <el-button size="mini" type="text" @click="handleComplete(scope.row)">完成</el-button>
  106. <el-button size="mini" type="text" @click="handleAccept(scope.row)">接单</el-button>
  107. <el-button size="mini" type="text" @click="handleCheck(scope.row)">验收</el-button>
  108. </template>
  109. </el-table-column>
  110. </el-table>
  111. <!-- 分页 -->
  112. <pagination
  113. v-show="total > 0"
  114. :total="total"
  115. :page.sync="queryParams.pageNum"
  116. :limit.sync="queryParams.pageSize"
  117. @pagination="getList"
  118. />
  119. </el-card>
  120. </div>
  121. </template>
  122. <script>
  123. export default {
  124. name: 'InstallationOrder',
  125. data() {
  126. return {
  127. // 遮罩层
  128. loading: false,
  129. // 总条数
  130. total: 0,
  131. // 表格数据
  132. tableData: [],
  133. // 查询参数
  134. queryParams: {
  135. pageNum: 1,
  136. pageSize: 10,
  137. installer: undefined,
  138. customerName: undefined,
  139. status: undefined,
  140. projectName: undefined,
  141. orderTimeRange: [],
  142. completeTimeRange: [],
  143. viewType: 'all'
  144. },
  145. // 状态选项
  146. statusOptions: [
  147. { label: '待处理', value: 'pending' },
  148. { label: '处理中', value: 'processing' },
  149. { label: '已完成', value: 'completed' },
  150. { label: '已驳回', value: 'rejected' }
  151. ],
  152. // 项目选项
  153. projectOptions: [
  154. { label: '项目A', value: 'A' },
  155. { label: '项目B', value: 'B' }
  156. ]
  157. }
  158. },
  159. created() {
  160. this.getList()
  161. },
  162. methods: {
  163. getList() {
  164. this.loading = true
  165. // TODO: 调用接口获取数据
  166. setTimeout(() => {
  167. this.loading = false
  168. }, 1000)
  169. },
  170. handleQuery() {
  171. this.queryParams.pageNum = 1
  172. this.getList()
  173. },
  174. handleExport() {
  175. // TODO: 实现导出功能
  176. },
  177. handleAdd() {
  178. // TODO: 实现新增功能
  179. },
  180. handleViewTypeChange(value) {
  181. this.getList()
  182. },
  183. getStatusType(status) {
  184. const statusMap = {
  185. pending: 'info',
  186. processing: 'warning',
  187. completed: 'success',
  188. rejected: 'danger'
  189. }
  190. return statusMap[status]
  191. },
  192. handleView(row) {
  193. // TODO: 实现查看功能
  194. },
  195. handleEdit(row) {
  196. // TODO: 实现编辑功能
  197. },
  198. handleDelete(row) {
  199. // TODO: 实现删除功能
  200. },
  201. handleDispatch(row) {
  202. // TODO: 实现派单功能
  203. },
  204. handleReject(row) {
  205. // TODO: 实现接单驳回功能
  206. },
  207. handleDailyWrite(row) {
  208. // TODO: 实现每日填写功能
  209. },
  210. handleComplete(row) {
  211. // TODO: 实现完成功能
  212. },
  213. handleAccept(row) {
  214. // TODO: 实现接单功能
  215. },
  216. handleCheck(row) {
  217. // TODO: 实现验收功能
  218. }
  219. }
  220. }
  221. </script>
  222. <style lang="scss" scoped>
  223. .installation-order {
  224. padding: 20px;
  225. .filter-container {
  226. margin-bottom: 20px;
  227. }
  228. .operation-container {
  229. margin-bottom: 20px;
  230. display: flex;
  231. justify-content: space-between;
  232. align-items: center;
  233. }
  234. .el-card {
  235. margin-bottom: 20px;
  236. }
  237. :deep(.el-table) {
  238. margin-top: 10px;
  239. .el-button {
  240. padding: 2px 0;
  241. margin: 0 5px;
  242. }
  243. }
  244. }
  245. </style>