index.vue.vm 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. <template>
  2. <div class="@(Model.LowerClassName)-container">
  3. <el-card shadow="hover" :body-style="{ paddingBottom: '0' }">
  4. <el-form :model="queryParams" ref="queryForm" labelWidth="90">
  5. <el-row>
  6. @if(Model.QueryWhetherList.Count > 0) {
  7. if(Model.HasLikeQuery) {
  8. @:<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10">
  9. @:<el-form-item label="关键字">
  10. @:<el-input v-model="queryParams.keyword" clearable placeholder="请输入模糊查询关键字"/>
  11. @:</el-form-item>
  12. @:</el-col>
  13. }
  14. foreach (var column in Model.QueryWhetherList) {
  15. @:<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUI">
  16. if(column.EffectType == "Input" || column.EffectType == "InputTextArea"){
  17. @:<el-form-item label="@column.ColumnComment">
  18. @:<el-input v-model="queryParams.@(column.LowerPropertyName)" clearable placeholder="请输入@(column.ColumnComment)"/>
  19. @:</el-form-item>
  20. }else if(column.EffectType == "InputTextArea"){
  21. @:<el-form-item label="@column.ColumnComment">
  22. @:<el-input-number v-model="queryParams.@(column.LowerPropertyName)" clearable placeholder="请输入@(column.ColumnComment)"/>
  23. @:
  24. @:</el-form-item>
  25. }else if(column.EffectType == "InputNumber"){
  26. @:<el-form-item label="@column.ColumnComment">
  27. @:<el-input-number v-model="queryParams.@(column.LowerPropertyName)" clearable placeholder="请输入@(column.ColumnComment)"/>
  28. @:</el-form-item>
  29. }else if(column.EffectType == "ForeignKey") {
  30. @:<el-form-item label="@column.ColumnComment">
  31. @:<el-select clearable filterable v-model="queryParams.@(column.LowerPropertyName)" placeholder="请选择@(column.ColumnComment)">
  32. @:<el-option v-for="(item,index) in dropdownData.@(column.LowerPropertyName) ?? []" :key="index" :value="item.value" :label="item.label" />
  33. @:</el-select>
  34. @:</el-form-item>
  35. }else if(column.EffectType == "ApiTreeSelector"){
  36. @:<el-form-item label="@column.ColumnComment">
  37. @:<el-cascader
  38. @::options="dropdownData.@(column.LowerPropertyName) ?? []"
  39. @:@:props="{ checkStrictly: true, emitPath: false }"
  40. @:placeholder="请选择@(column.ColumnComment)"
  41. @:clearable
  42. @:filterable
  43. @:class="w100"
  44. @:v-model="queryParams.@(column.LowerPropertyName)"
  45. @:>
  46. @:<template #default="{ node, data }">
  47. @:<span>{{ data.label }}</span>
  48. @:<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
  49. @:</template>
  50. @:</el-cascader>
  51. @:</el-form-item>
  52. }else if(column.EffectType == "DictSelector" || column.EffectType == "EnumSelector"){
  53. @:<el-form-item label="@column.ColumnComment">
  54. @:<el-select clearable filterable v-model="queryParams.@(column.LowerPropertyName)" placeholder="请选择@(column.ColumnComment)">
  55. @:<el-option v-for="(item,index) in getDictDataByCode('@(column.DictTypeCode)')" :key="index" :value="item.code" :label="`[${item.code}]${item.value}`" />
  56. @:</el-select>
  57. @:</el-form-item>
  58. }else if(column.EffectType == "DatePicker"){
  59. @:<el-form-item label="@column.ColumnComment">
  60. if (column.QueryType == "~") {
  61. @:<el-date-picker type="daterange" v-model="queryParams.@(column.LowerPropertyName)Range" value-format="YYYY-MM-DD HH:mm:ss" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" />
  62. } else {
  63. @:<el-date-picker placeholder="请选择@(column.ColumnComment)" value-format="YYYY/MM/DD" v-model="queryParams.@(column.LowerPropertyName)" />
  64. }
  65. @:</el-form-item>
  66. }
  67. @:</el-col>
  68. }
  69. }
  70. <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10">
  71. <el-form-item @(Model.QueryWhetherList.Count > 0?"":"label-width=\"0px\"")>
  72. <el-button-group style="display: flex; align-items: center;">
  73. <el-button type="primary" icon="ele-Search" @@click="handleQuery" v-auth="'@(Model.LowerClassName):page'"> @(Model.QueryWhetherList.Count > 0 ? "查询" : "刷新") </el-button>
  74. @if (Model.QueryWhetherList.Count > 0) {
  75. @:<el-button icon="ele-Refresh" @@click="() => queryParams = {}"> 重置 </el-button>
  76. @if (Model.HasLikeQuery) {
  77. @:<el-button icon="ele-ZoomIn" @@click="changeAdvanceQueryUI" v-if="!showAdvanceQueryUI" style="margin-left:5px;"> 高级查询 </el-button>
  78. @:<el-button icon="ele-ZoomOut" @@click="changeAdvanceQueryUI" v-if="showAdvanceQueryUI" style="margin-left:5px;"> 隐藏 </el-button>
  79. }
  80. }
  81. <el-button type="danger" style="margin-left:5px;" icon="ele-Delete" @@click="batchDel@(Model.ClassName)" :disabled="selectData.length == 0" v-auth="'@(Model.LowerClassName):batchDelete'"> 删除 </el-button>
  82. <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @@click="openAdd@(Model.ClassName)" v-auth="'@(Model.LowerClassName):add'"> 新增 </el-button>
  83. @if (Model.ImportFieldList.Count > 0) {
  84. @:<el-button type="warning" icon="ele-MostlyCloudy" @@click="importDataRef.openDialog()" v-auth="'@(Model.LowerClassName):import'"> 导入 </el-button>
  85. }
  86. </el-button-group>
  87. </el-form-item>
  88. </el-col>
  89. </el-row>
  90. @* 操作区另起一行
  91. @:<el-row>
  92. @:<el-col>
  93. @:<el-button-group style="margin-left:20px;margin-bottom:5px;">
  94. @:<el-button type="primary" icon="ele-Plus" @@click="openAdd@(Model.ClassName)" v-auth="'@(Model.LowerClassName):add'"> 新增 </el-button>
  95. </el-button-group>
  96. @:</el-col>
  97. @:</el-row>
  98. *@
  99. </el-form>
  100. </el-card>
  101. <el-card class="full-table" shadow="hover" style="margin-top: 5px">
  102. <el-table :data="tableData" @@selection-change="(val: any[]) => { selectData = val; }" style="width: 100%" v-loading="loading" tooltip-effect="light" row-key="@Model.PrimaryKeyFieldList.First().LowerPropertyName" @@sort-change="sortChange" border>
  103. <el-table-column type="selection" width="40" align="center" v-auth="'@(Model.LowerClassName):batchDelete'" />
  104. <el-table-column type="index" label="序号" width="55" align="center"/>
  105. @foreach (var column in Model.TableField.Where(u => u.WhetherTable == "Y")){
  106. if(column.EffectType == "Upload" || @column.EffectType == "ForeignKey" || @column.EffectType == "ApiTreeSelector" || @column.EffectType == "Switch" || @column.EffectType == "ConstSelector"){
  107. @:<el-table-column @(Model.GetElTableColumnCustomProperty(column)) show-overflow-tooltip>
  108. @:<template #default="scope">
  109. if(column.EffectType == "Upload"){
  110. @:<el-image
  111. @:v-if="scope.row.@column.LowerPropertyName"
  112. @:style="width: 60px; height: 60px"
  113. @::src="scope.row.@column.LowerPropertyName"
  114. @::lazy="true"
  115. @::hide-on-click-modal="true"
  116. @::preview-src-list="[scope.row.@column.LowerPropertyName]"
  117. @::initial-index="0"
  118. @:fit="scale-down"
  119. @:preview-teleported />
  120. }else if(column.EffectType == "ForeignKey" || column.EffectType == "ApiTreeSelector"){
  121. @:<span>{{scope.row.@(column.LowerExtendedPropertyName)}}</span>
  122. }else if(column.EffectType == "Switch"){
  123. @:<el-tag v-if="scope.row.@(column.LowerPropertyName)"> 是 </el-tag>
  124. @:<el-tag type="danger" v-else> 否 </el-tag>
  125. }else if(column.EffectType == "ConstSelector"){
  126. @:<span>{{codeToName(scope.row.@(column.LowerPropertyName), '@(column.DictTypeCode)')}}</span>
  127. }
  128. @:</template>
  129. @:</el-table-column>
  130. } else if (column.EffectType == "DictSelector" || column.EffectType == "EnumSelector") {
  131. @:<el-table-column @(Model.GetElTableColumnCustomProperty(column)) show-overflow-tooltip>
  132. @:<template #default="scope">
  133. if (Model.IsStatus(column)) {
  134. @:<el-switch v-model="scope.row.@column.LowerPropertyName" :active-value="1" :inactive-value="2" size="small" @@change="change@(Model.ClassName)Status(scope.row)" />
  135. } else {
  136. @:<DictLabel :value="scope.row.@column.LowerPropertyName" code="@column.DictTypeCode" />
  137. }
  138. @:</template>
  139. @:</el-table-column>
  140. } else {
  141. @:<el-table-column @(Model.GetElTableColumnCustomProperty(column)) show-overflow-tooltip />
  142. }
  143. }
  144. <el-table-column label="修改记录" width="100" align="center" show-overflow-tooltip>
  145. <template #default="scope">
  146. <ModifyRecord :data="scope.row" />
  147. </template>
  148. </el-table-column>
  149. <el-table-column label="操作" width="@(Model.PrintType == "custom" ? "200" : "140")" align="center" fixed="right" show-overflow-tooltip v-if="auth('@(Model.LowerClassName):update') || auth('@(Model.LowerClassName):delete')">
  150. <template #default="scope">
  151. @if (Model.PrintType == "custom"){
  152. @:<el-button icon="ele-Printer" size="small" text type="primary" @@click="openPrint@(Model.ClassName)(scope.row)" v-auth="'@(Model.LowerClassName):print'"> 打印 </el-button>
  153. }
  154. <el-button icon="ele-Edit" size="small" text type="primary" @@click="openEdit@(Model.ClassName)(scope.row)" v-auth="'@(Model.LowerClassName):update'"> 编辑 </el-button>
  155. <el-button icon="ele-Delete" size="small" text type="primary" @@click="del@(Model.ClassName)(scope.row)" v-auth="'@(Model.LowerClassName):delete'"> 删除 </el-button>
  156. </template>
  157. </el-table-column>
  158. </el-table>
  159. <el-pagination
  160. v-model:currentPage="tableParams.page"
  161. v-model:page-size="tableParams.pageSize"
  162. :page-sizes="[10, 20, 50, 100, 200, 500]"
  163. :total="tableParams.total"
  164. @@size-change="handleSizeChange"
  165. @@current-change="handleCurrentChange"
  166. layout="total, sizes, prev, pager, next, jumper"
  167. size="small"
  168. background
  169. />
  170. <printDialog
  171. ref="printDialogRef"
  172. :title="print@(Model.ClassName)Title"
  173. @@reloadTable="handleQuery" />
  174. <editDialog
  175. ref="editDialogRef"
  176. :title="edit@(Model.ClassName)Title"
  177. @@reloadTable="handleQuery"
  178. />
  179. </el-card>
  180. </div>
  181. @if (Model.ImportFieldList.Count > 0) {
  182. @:<ImportData
  183. @:ref="importDataRef"
  184. @::import="@(Model.LowerClassName)Api.importData"
  185. @::download="@(Model.LowerClassName)Api.downloadTemplate"
  186. @:v-auth="'@(Model.LowerClassName):import'"
  187. @:@@refresh="handleQuery"
  188. @:/>
  189. }
  190. </template>
  191. <script lang="ts" setup name="@(Model.LowerClassName)">
  192. import { ref, onMounted } from "vue";
  193. import { auth } from '/@@/utils/authFunction';
  194. import { getAPI } from '/@@/utils/axios-utils';
  195. import { ElMessageBox, ElMessage } from "element-plus";
  196. @if(Model.TableField.Any(x => x.EffectType == "DatePicker")) {
  197. @:import { formatDate } from '/@@/utils/formatTime';
  198. }
  199. @if(Model.TableField.Any(x => x.EffectType == "ConstSelector")) {
  200. @:import { codeToName, getConstType } from '/@@/utils/constHelper';
  201. }
  202. @if(Model.PrintType == "custom") {
  203. @:// 推荐设置操作 width 为 200
  204. @:import { hiprint } from 'vue-plugin-hiprint';
  205. @:import { SysPrintApi } from '/@@/api-services/api';
  206. @:import { SysPrint } from '/@@/api-services/models';
  207. }
  208. @if(Model.ImportFieldList.Count > 0) {
  209. @:import ImportData from "/@@/components/table/importData.vue";
  210. }
  211. import editDialog from '/@@/views/@(Model.PagePath)/@(Model.LowerClassName)/component/editDialog.vue'
  212. import printDialog from '/@@/views/system/print/component/hiprint/preview.vue'
  213. import ModifyRecord from '/@@/components/table/modifyRecord.vue';
  214. import { use@(Model.ClassName)Api} from '/@@/api/@(Model.PagePath)/@(Model.LowerClassName)';
  215. @if(Model.HasDictField || Model.HasEnumField) {
  216. @:import { useUserInfo } from "/@@/stores/userInfo";
  217. @:import DictLabel from "/@@/components/table/dictLabel.vue";
  218. @:
  219. @:const getDictDataByCode = useUserInfo().getDictDataByCode;
  220. }
  221. const showAdvanceQueryUI = ref(@(Model.HasLikeQuery ? "false" : "true"));
  222. const @(Model.LowerClassName)Api = use@(Model.ClassName)Api();
  223. const printDialogRef = ref();
  224. const editDialogRef = ref();
  225. @if (Model.ImportFieldList.Count > 0){
  226. @:const importDataRef = ref();
  227. }
  228. @if (Model.DropdownFieldList.Count > 0) {
  229. @:const dropdownData = ref<any>({});
  230. }
  231. const loading = ref(false);
  232. const tableData = ref<any>([]);
  233. const selectData = ref<any>([]);
  234. const queryParams = ref<any>({});
  235. const tableParams = ref({
  236. page: 1,
  237. pageSize: 10,
  238. field: 'createTime', // 默认的排序字段
  239. order: 'descending', // 排序方向
  240. descstr: 'descending', // 降序排序的关键字符
  241. total: 0 as any,
  242. });
  243. const print@(Model.ClassName)Title = ref("");
  244. const edit@(Model.ClassName)Title = ref("");
  245. // 页面加载时
  246. onMounted(async () => {
  247. @if (Model.DropdownFieldList.Count > 0) {
  248. @:const data = await @(Model.LowerClassName)Api.getDropdownData(true).then(res => res.data.result) ?? {};
  249. @foreach (var column in Model.DropdownFieldList) {
  250. @:dropdownData.value.@(column.LowerPropertyName) = data.@(column.LowerPropertyName);
  251. }
  252. }
  253. });
  254. // 改变高级查询的控件显示状态
  255. const changeAdvanceQueryUI = () => {
  256. showAdvanceQueryUI.value = !showAdvanceQueryUI.value;
  257. }
  258. // 查询操作
  259. const handleQuery = async () => {
  260. loading.value = true;
  261. var res = await @(Model.LowerClassName)Api.page(Object.assign(queryParams.value, tableParams.value));
  262. tableData.value = res.data.result?.items ?? [];
  263. tableParams.value.total = res.data.result?.total;
  264. loading.value = false;
  265. };
  266. // 列排序
  267. const sortChange = async (column: any) => {
  268. tableParams.value.field = column.prop;
  269. tableParams.value.order = column.order;
  270. await handleQuery();
  271. };
  272. // 打开新增页面
  273. const openAdd@(Model.ClassName) = () => {
  274. edit@(Model.ClassName)Title.value = '添加@(Model.BusName)';
  275. const data = { @(Model.GetAddDefaultValue()) };
  276. editDialogRef.value.openDialog(data);
  277. };
  278. // 设置状态
  279. const change@(Model.ClassName)Status = async (row: any) => {
  280. await @(Model.LowerClassName)Api.setStatus({ id: row.id, status: row.status })
  281. .then(() => ElMessage.success('状态设置成功'))
  282. .catch(() => { row.status = row.status == 1 ? 2 : 1; });
  283. };
  284. // 打开打印页面
  285. const openPrint@(Model.ClassName) = async (row: any) => {
  286. print@(Model.ClassName)Title.value = '打印@(Model.BusName)';
  287. @if(Model.PrintType == "custom"){
  288. @:var res = await getAPI(SysPrintApi).apiSysPrintPrintNameGet('@Model.PrintName');
  289. @:var printTemplate = res.data.result as SysPrint;
  290. @:var template = JSON.parse(printTemplate.template);
  291. @:row['printDate'] = formatDate(new Date(), 'YYYY-mm-dd HH:MM:SS')
  292. @:printDialogRef.value.showDialog(new hiprint.PrintTemplate({template: template}), row, template.panels[0].width);
  293. }
  294. }
  295. // 打开编辑页面
  296. const openEdit@(Model.ClassName) = (row: any) => {
  297. edit@(Model.ClassName)Title.value = '编辑@(Model.BusName)';
  298. editDialogRef.value.openDialog(row);
  299. };
  300. // 删除
  301. const del@(Model.ClassName) = (row: any) => {
  302. ElMessageBox.confirm(`确定要删除吗?`, "提示", {
  303. confirmButtonText: "确定",
  304. cancelButtonText: "取消",
  305. type: "warning",
  306. }).then(async () => {
  307. await @(Model.LowerClassName)Api.delete(row);
  308. handleQuery();
  309. ElMessage.success("删除成功");
  310. }).catch(() => {});
  311. };
  312. // 批量删除
  313. const batchDel@(Model.ClassName) = () => {
  314. ElMessageBox.confirm(`确定要删除${selectData.value.length}条记录吗?`, "提示", {
  315. confirmButtonText: "确定",
  316. cancelButtonText: "取消",
  317. type: "warning",
  318. }).then(async () => {
  319. const count = await @(Model.LowerClassName)Api.batchDelete(selectData.value.map(u => ({ @(Model.PrimaryKeysFormat(", ", "{0}: u.{0}", true)) }) )).then(res => res.data.result);
  320. handleQuery();
  321. ElMessage.success(`成功批量删除${count}条记录`);
  322. }).catch(() => {});
  323. };
  324. // 改变页面容量
  325. const handleSizeChange = (val: number) => {
  326. tableParams.value.pageSize = val;
  327. handleQuery();
  328. };
  329. // 改变页码序号
  330. const handleCurrentChange = (val: number) => {
  331. tableParams.value.page = val;
  332. handleQuery();
  333. };
  334. handleQuery();
  335. </script>
  336. <style scoped>
  337. :deep(.el-input), :deep(.el-select), :deep(.el-input-number) {
  338. width: 100%;
  339. }
  340. </style>