index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. <template>
  2. <div class="quality-template-container layout-padding">
  3. <div class="layout-padding-auto layout-padding-view pd20">
  4. <el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent>
  5. <el-form-item label="模版名称" prop="Name">
  6. <el-input v-model="state.queryParams.Name" placeholder="请填写模版名称" clearable @keyup.enter="handleQuery" class="keyword-input" />
  7. </el-form-item>
  8. <el-form-item label="质检分类" prop="Grouping">
  9. <el-select v-model="state.queryParams.Grouping" placeholder="请选择质检分类" @change="handleQuery">
  10. <el-option v-for="item in templateGrouping" :value="item.key" :key="item.key" :label="item.value" />
  11. </el-select>
  12. </el-form-item>
  13. <el-form-item>
  14. <el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
  15. <el-button @click="drawer = true" class="default-button"> <SvgIcon name="ele-Search" class="mr5" />更多查询</el-button>
  16. </el-form-item>
  17. </el-form>
  18. <vxe-toolbar
  19. ref="toolbarRef"
  20. :loading="state.loading"
  21. custom
  22. :refresh="{
  23. queryMethod: handleQuery,
  24. }"
  25. >
  26. <template #buttons>
  27. <el-button type="primary" @click="onTemplateAdd" v-auth="'quality:template:add'">
  28. <SvgIcon name="ele-Plus" class="mr5" />新增质检模板</el-button
  29. >
  30. <el-button type="danger" @click="onTemplateDelete" v-auth="'quality:template:delete'" :disabled="isChecked">
  31. <SvgIcon name="ele-Delete" class="mr5" />删除
  32. </el-button>
  33. </template>
  34. </vxe-toolbar>
  35. <div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
  36. <vxe-table
  37. border
  38. :loading="state.loading"
  39. :data="state.tableData"
  40. :column-config="{ resizable: true }"
  41. :row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
  42. ref="tableRef"
  43. height="auto"
  44. auto-resize
  45. show-overflow
  46. :scrollY="{ enabled: true, gt: 100 }"
  47. id="qualityTemplate"
  48. :custom-config="{ storage: true }"
  49. showHeaderOverflow
  50. @checkbox-all="selectAllChangeEvent"
  51. @checkbox-change="selectChangeEvent"
  52. >
  53. <vxe-column type="checkbox" width="50" align="center"></vxe-column>
  54. <vxe-column field="name" title="质检项名称" min-width="150"></vxe-column>
  55. <vxe-column field="groupingText" title="质检分类" width="150"></vxe-column>
  56. <vxe-column field="isEnable" title="是否启用" width="100">
  57. <template #default="{ row }">
  58. <template v-if="auth('quality:template:edit')">
  59. <el-switch
  60. v-model="row.isEnable"
  61. active-text="启用"
  62. inactive-text="禁用"
  63. :active-value="1"
  64. :inactive-value="0"
  65. @change="changeIsEnable(row)"
  66. inline-prompt
  67. size="small"
  68. />
  69. </template>
  70. <span v-else>{{ row.isEnable ? '已启用' : '已禁用' }}</span>
  71. </template>
  72. </vxe-column>
  73. <vxe-column field="creatorName" title="创建人" width="120"></vxe-column>
  74. <vxe-column field="creationTime" title="创建时间" width="160">
  75. <template #default="{ row }">
  76. {{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
  77. </template>
  78. </vxe-column>
  79. <vxe-column field="lastModificationName" title="更新人" width="120"></vxe-column>
  80. <vxe-column field="lastModificationTime" title="更新时间" width="160">
  81. <template #default="{ row }">
  82. {{ formatDate(row.lastModificationTime, 'YYYY-mm-dd HH:MM:SS') }}
  83. </template>
  84. </vxe-column>
  85. <vxe-column title="操作" fixed="right" width="90" align="center">
  86. <template #default="{ row }">
  87. <el-button link type="primary" @click="onTemplateEdit(row)" v-auth="'quality:template:edit'" title="编辑模板"> 编辑 </el-button>
  88. </template>
  89. </vxe-column>
  90. </vxe-table>
  91. </div>
  92. <pagination
  93. @pagination="queryList"
  94. :total="state.total"
  95. v-model:current-page="state.queryParams.PageIndex"
  96. v-model:page-size="state.queryParams.PageSize"
  97. :disabled="state.loading"
  98. />
  99. </div>
  100. <!-- 模板新增 -->
  101. <quality-template-add ref="templateAdd" @updateList="queryList" :templateGrouping="templateGrouping" />
  102. <!-- 模板编辑 -->
  103. <quality-template-edit ref="templateEditRef" @updateList="queryList" :templateGrouping="templateGrouping" />
  104. <!-- 更多查询 -->
  105. <el-drawer v-model="drawer" title="更多查询" size="500px">
  106. <el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="100px" :disabled="state.loading">
  107. <el-form-item label="是否启用" prop="IsEnable">
  108. <el-select v-model="state.queryParams.IsEnable" placeholder="请选择是否启用" @change="handleQuery" clearable>
  109. <el-option label="启用" :value="true" />
  110. <el-option label="禁用" :value="false" />
  111. </el-select>
  112. </el-form-item>
  113. <el-form-item label="创建时间" prop="crTime">
  114. <el-date-picker
  115. v-model="state.queryParams.crTime"
  116. type="datetimerange"
  117. unlink-panels
  118. range-separator="至"
  119. start-placeholder="开始时间"
  120. end-placeholder="结束时间"
  121. :shortcuts="shortcuts"
  122. @change="handleQuery"
  123. value-format="YYYY-MM-DD[T]HH:mm:ss"
  124. :default-time="defaultTimeStartEnd"
  125. />
  126. </el-form-item>
  127. <el-form-item label="创建人" prop="CreatorName">
  128. <el-input v-model.trim="state.queryParams.CreatorName" placeholder="创建人" clearable @keyup.enter="handleQuery" />
  129. </el-form-item>
  130. <el-form-item label="更新人" prop="LastModificationName">
  131. <el-input v-model.trim="state.queryParams.LastModificationName" placeholder="更新人" clearable @keyup.enter="handleQuery" />
  132. </el-form-item>
  133. <el-form-item label="更新时间" prop="gxTime">
  134. <el-date-picker
  135. v-model="state.queryParams.gxTime"
  136. type="datetimerange"
  137. unlink-panels
  138. range-separator="至"
  139. start-placeholder="开始时间"
  140. end-placeholder="结束时间"
  141. :shortcuts="shortcuts"
  142. @change="handleQuery"
  143. value-format="YYYY-MM-DD[T]HH:mm:ss"
  144. :default-time="defaultTimeStartEnd"
  145. />
  146. </el-form-item>
  147. </el-form>
  148. <template #footer>
  149. <el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
  150. <el-button @click="resetQuery(drawerRuleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
  151. </template>
  152. </el-drawer>
  153. </div>
  154. </template>
  155. <script lang="tsx" setup name="qualityTemplate">
  156. import { computed, defineAsyncComponent, onMounted, reactive, ref } from 'vue';
  157. import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
  158. import { formatDate } from '@/utils/formatTime';
  159. import { auth } from '@/utils/authFunction';
  160. import { templateBaseData, templateDelete, templateList, templateUpdate } from '@/api/quality/template';
  161. import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
  162. import Other from '@/utils/other';
  163. // 引入组件
  164. const QualityTemplateAdd = defineAsyncComponent(() => import('@/views/quality/template/components/Template-add.vue')); // 模板新增
  165. const QualityTemplateEdit = defineAsyncComponent(() => import('@/views/quality/template/components/Template-edit.vue')); // 模板编辑
  166. const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
  167. // 定义变量内容
  168. const state = reactive({
  169. loading: false, // 加载状态
  170. queryParams: {
  171. // 查询参数
  172. PageIndex: 1,
  173. PageSize: 20,
  174. Grouping: null,
  175. Name: null,
  176. CreatorName:null, // 创建人
  177. crTime: [], // 创建时间
  178. CreationTimeStart: null, // 创建时间开始
  179. CreationTimeEnd: null, // 创建时间结束
  180. gxTime: [], // 更新时间
  181. LastModificationTimeStart: null, // 更新时间开始
  182. LastModificationTimeEnd: null, // 更新时间结束
  183. },
  184. total: 0, // 总条数
  185. tableData: [], // 表格数据
  186. });
  187. const templateGrouping = ref<EmptyArrayType>([]); // 质检分组
  188. const getBaseData = async () => {
  189. try {
  190. const res = await templateBaseData();
  191. templateGrouping.value = res.result?.templateGrouping ?? [];
  192. } catch (error) {
  193. console.log(error);
  194. }
  195. };
  196. // 手动查询,将页码设置为1
  197. const handleQuery = () => {
  198. state.queryParams.PageIndex = 1;
  199. queryList();
  200. };
  201. // 获取参数列表
  202. const requestParams = ref<EmptyObjectType>({});
  203. const queryList = () => {
  204. state.loading = true;
  205. requestParams.value = Other.deepClone(state.queryParams);
  206. requestParams.value.CreationTimeStart = state.queryParams.crTime === null ? null : state.queryParams.crTime[0]; // 创建时间
  207. requestParams.value.CreationTimeEnd = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
  208. Reflect.deleteProperty(requestParams.value, 'crTime'); // 删除无用的参数
  209. requestParams.value.LastModificationTimeStart = state.queryParams.gxTime === null ? null : state.queryParams.gxTime[0]; // 更新时间
  210. requestParams.value.LastModificationTimeEnd = state.queryParams.gxTime === null ? null : state.queryParams.gxTime[1];
  211. Reflect.deleteProperty(requestParams.value, 'gxTime'); // 删除无用的参数
  212. templateList(requestParams.value)
  213. .then((res) => {
  214. state.loading = false;
  215. state.tableData = res.result.items ?? [];
  216. state.total = res.result.total ?? 0;
  217. tableRef.value.clearCheckboxRow();
  218. checkTable.value = [];
  219. })
  220. .finally(() => {
  221. state.loading = false;
  222. tableRef.value.clearCheckboxRow();
  223. checkTable.value = [];
  224. });
  225. };
  226. // 重置表单
  227. const drawerRuleFormRef = ref();
  228. const ruleFormRef = ref<RefType>(); // 表单ref
  229. const drawer = ref(false);
  230. const resetQuery = (formEl: FormInstance | undefined) => {
  231. if (!formEl) return;
  232. formEl.resetFields();
  233. ruleFormRef.value?.resetFields();
  234. queryList();
  235. };
  236. // 新增意见
  237. const templateAdd = ref<RefType>(); // 意见新增
  238. const onTemplateAdd = () => {
  239. templateAdd.value.openDialog();
  240. };
  241. // 修改意见
  242. const templateEditRef = ref<RefType>(); // 修改意见
  243. const onTemplateEdit = (row: any) => {
  244. templateEditRef.value.openDialog(row);
  245. };
  246. // 修改是否启用
  247. const changeIsEnable = (row: any) => {
  248. row.isEnable = row.isEnable === 1 ? 0 : 1; //保持switch点击前的状态
  249. ElMessageBox.confirm(`您确定要${row.isEnable === 1 ? '禁用' : '启用'}:【${row.name}】模板,是否继续?`, '提示', {
  250. confirmButtonText: '确认',
  251. cancelButtonText: '取消',
  252. type: 'warning',
  253. draggable: true,
  254. cancelButtonClass: 'default-button',
  255. autofocus: false,
  256. })
  257. .then(() => {
  258. const isEnable = row.isEnable === 1 ? 0 : 1;
  259. const request = {
  260. ...row,
  261. isEnable: isEnable,
  262. };
  263. templateUpdate(request)
  264. .then(() => {
  265. ElMessage.success('操作成功');
  266. queryList();
  267. })
  268. .catch(() => {
  269. queryList();
  270. });
  271. })
  272. .catch(() => {
  273. queryList();
  274. });
  275. };
  276. // 删除参数
  277. const onTemplateDelete = () => {
  278. const ids = checkTable.value.map((item: any) => item.id);
  279. ElMessageBox.confirm(`您确定要删除选中的质检模板,是否继续?`, '提示', {
  280. confirmButtonText: '确认',
  281. cancelButtonText: '取消',
  282. type: 'warning',
  283. draggable: true,
  284. cancelButtonClass: 'default-button',
  285. autofocus: false,
  286. })
  287. .then(() => {
  288. templateDelete({ ids }).then(() => {
  289. ElMessage.success('删除成功');
  290. queryList();
  291. });
  292. })
  293. .catch(() => {});
  294. };
  295. const tableRef = ref<RefType>();
  296. const checkTable = ref<EmptyArrayType>([]);
  297. const selectAllChangeEvent = ({ checked }) => {
  298. if (tableRef.value) {
  299. const records = tableRef.value.getCheckboxRecords();
  300. checkTable.value = records;
  301. console.log(checked ? '所有勾选事件' : '所有取消事件', records);
  302. }
  303. };
  304. const selectChangeEvent = ({ checked }) => {
  305. if (tableRef.value) {
  306. const records = tableRef.value.getCheckboxRecords();
  307. checkTable.value = records;
  308. console.log(checked ? '勾选事件' : '取消事件', records);
  309. }
  310. };
  311. const isChecked = computed(() => {
  312. return !Boolean(checkTable.value.length);
  313. });
  314. const toolbarRef = ref<RefType>();
  315. // 页面加载时
  316. onMounted(() => {
  317. queryList();
  318. if (tableRef.value && toolbarRef.value) {
  319. tableRef.value.connect(toolbarRef.value);
  320. }
  321. getBaseData();
  322. });
  323. </script>