ChoosePackageComponent.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px">
  4. <el-form-item label="套餐包名称" prop="packageName">
  5. <el-input
  6. v-model="queryParams.packageName"
  7. placeholder="请输入套餐包名称"
  8. clearable
  9. size="small"
  10. @keyup.enter.native="handleQuery"
  11. />
  12. </el-form-item>
  13. <el-form-item label="套餐包别名" prop="secondName">
  14. <el-input
  15. v-model="queryParams.secondName"
  16. placeholder="套餐包别名"
  17. clearable
  18. size="small"
  19. @keyup.enter.native="handleQuery"
  20. />
  21. </el-form-item>
  22. <el-form-item label="套餐类型" prop="packageType">
  23. <el-select v-model="queryParams.packageType" placeholder="请选择" clearable size="small">
  24. <el-option
  25. v-for="dict in packageTypeOptions"
  26. :key="dict.dictValue"
  27. :label="dict.dictLabel"
  28. :value="dict.dictValue"
  29. />
  30. </el-select>
  31. </el-form-item>
  32. <el-form-item label="子类型" prop="packageSubType">
  33. <el-select v-model="queryParams.packageSubType" placeholder="请选择子类型" clearable size="small">
  34. <el-option
  35. v-for="dict in packageSubTypeOptions"
  36. :key="dict.dictValue"
  37. :label="dict.dictLabel"
  38. :value="dict.dictValue"
  39. />
  40. </el-select>
  41. </el-form-item>
  42. <el-form-item>
  43. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  44. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  45. </el-form-item>
  46. </el-form>
  47. <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange" ref="packageTable" :row-key="'packageId'" :reserve-selection="true">
  48. <el-table-column type="selection" width="55" align="center" />
  49. <el-table-column label="封面图片" width="120" align="center">
  50. <template slot-scope="scope">
  51. <el-popover
  52. placement="right"
  53. title=""
  54. trigger="hover"
  55. >
  56. <img slot="reference" :src="scope.row.packageImg" width="100">
  57. <img :src="scope.row.packageImg" style="max-width: 150px;">
  58. </el-popover>
  59. </template>
  60. </el-table-column>
  61. <el-table-column label="套餐包名称" align="center" prop="packageName"/>
  62. <el-table-column label="套餐包别名" align="center" prop="secondName"/>
  63. <el-table-column label="套餐类型" align="center" prop="packageTypeName"/>
  64. <el-table-column label="子类型" align="center" prop="packageSubTypeName"/>
  65. </el-table>
  66. <pagination
  67. v-show="total>0"
  68. :total="total"
  69. :page.sync="queryParams.pageNum"
  70. :limit.sync="queryParams.pageSize"
  71. @pagination="getList"
  72. />
  73. <div class="footer-button">
  74. <el-button @click="cancel">取消</el-button>
  75. <el-button type="primary" @click="submit">确定</el-button>
  76. </div>
  77. </div>
  78. </template>
  79. <script>
  80. import { getChoosePackageList } from '@/api/his/package'
  81. export default {
  82. name: "ChoosePackageComponent",
  83. props: {
  84. packageIds: {
  85. type: Array,
  86. default: () => []
  87. }
  88. },
  89. activated() {
  90. // keep-alive 激活时恢复选中
  91. this.$nextTick(() => {
  92. this.restoreSelection()
  93. })
  94. },
  95. watch: {
  96. // packageIds 变化时重新恢复选中
  97. packageIds: {
  98. immediate: false,
  99. handler() {
  100. this.$nextTick(() => this.restoreSelection())
  101. }
  102. }
  103. },
  104. data() {
  105. return {
  106. // 遮罩层
  107. loading: true,
  108. // 显示搜索条件
  109. showSearch: true,
  110. // 列表参数
  111. queryParams: {
  112. pageNum: 1,
  113. pageSize: 10,
  114. packageName: null,
  115. secondName: null,
  116. packageType: null,
  117. packageSubType: null,
  118. },
  119. // 套餐类型字典
  120. packageTypeOptions: [],
  121. // 子类型字典
  122. packageSubTypeOptions: [],
  123. // 总条数
  124. total: 0,
  125. // 表格数据
  126. list: [],
  127. selected: [],
  128. }
  129. },
  130. created() {
  131. this.getDicts("sys_package_type").then(response => {
  132. this.packageTypeOptions = response.data;
  133. });
  134. this.getDicts("sys_package_sub_type").then(response => {
  135. this.packageSubTypeOptions = response.data;
  136. });
  137. this.getList();
  138. },
  139. methods: {
  140. handleQuery() {
  141. this.queryParams.pageNum = 1;
  142. this.getList();
  143. },
  144. resetQuery() {
  145. this.queryParams = {
  146. pageNum: 1,
  147. pageSize: 10,
  148. packageName: null,
  149. secondName: null,
  150. packageType: null,
  151. packageSubType: null,
  152. };
  153. this.handleQuery();
  154. },
  155. getList() {
  156. this.loading = true;
  157. getChoosePackageList(this.queryParams).then(response => {
  158. this.list = response.data.list
  159. this.total = response.data.total
  160. this.loading = false
  161. // 列表加载后,根据传入的 packageIds 自动选中
  162. this.$nextTick(() => this.restoreSelection())
  163. })
  164. },
  165. handleSelectionChange(selection) {
  166. this.selected = selection
  167. },
  168. cancel() {
  169. this.$emit('closeChoose')
  170. },
  171. submit() {
  172. this.$emit('selectConfirm', this.selected)
  173. },
  174. // 恢复勾选状态
  175. restoreSelection() {
  176. const tableRef = this.$refs.packageTable
  177. if (!tableRef || !Array.isArray(this.list) || !Array.isArray(this.packageIds)) return
  178. tableRef.clearSelection()
  179. if (this.packageIds.length === 0) return
  180. const idsSet = new Set(this.packageIds)
  181. this.list.forEach(row => {
  182. if (row && idsSet.has(row.packageId)) {
  183. tableRef.toggleRowSelection(row, true)
  184. }
  185. })
  186. }
  187. }
  188. }
  189. </script>
  190. <style scoped>
  191. .footer-button {
  192. display: flex;
  193. justify-content: flex-end;
  194. margin-top: 40px;
  195. }
  196. </style>