good.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760
  1. <template>
  2. <div class="p20">
  3. <!-- 功能区 -->
  4. <el-card class="box-card">
  5. <el-row>
  6. <el-col :span="12">
  7. <el-text class="mx-1">关键词:</el-text>
  8. <el-input class="width200" placeholder="请输入物品名称" v-model="data.params.keyword"
  9. @keyup.enter.native="getList"> </el-input>
  10. <el-button type="primary" class="ml10" @click="getList">
  11. <el-icon>
  12. <ele-Search />
  13. </el-icon>
  14. 查询
  15. </el-button>
  16. </el-col>
  17. <el-col :span="12" class="tr">
  18. <el-button type="primary" @click="addPage">添加</el-button>
  19. <el-button type="danger" @click="deleteMult">批量删除</el-button>
  20. <el-button type="default" @click="checkAll">查看全部</el-button>
  21. <el-button type="default" @click="importExcel()">导入</el-button>
  22. <el-button type="default" @click="exportExcel()">导出</el-button>
  23. <el-button type="default" @click="enable">启用</el-button>
  24. <el-button type="default" @click="forbidden">禁用</el-button>
  25. </el-col>
  26. </el-row>
  27. </el-card>
  28. <!-- 主体区 -->
  29. <el-row :gutter="20">
  30. <el-col :span="16">
  31. <el-card class="box-card mt20" v-loading="data.loading">
  32. <!-- 列表 -->
  33. <el-table :data="data.tableData" @selection-change="handleTableDataSelectionChange">
  34. <!-- props绑定数据表的字段,lable填写中文 -->
  35. <el-table-column type="selection" width="55" />
  36. <el-table-column fixed prop="no" label="物品编码" width="150"
  37. :default-sort="{ prop: 'date', order: 'descending' }" />
  38. <el-table-column prop="name" label="物品名称" width="150" />
  39. <el-table-column prop="desc" label="物品介绍" width="" />
  40. <el-table-column prop="goodClass.name" label="物品类别" width="" />
  41. <el-table-column prop="unit" label="单位" width="" />
  42. <el-table-column prop="spec" label="规格" width="" />
  43. <el-table-column prop="valid" label="是否有效" width="">
  44. <template #default="scope">
  45. <el-tag v-if="scope.row.valid == 1">启用</el-tag>
  46. <el-tag type="danger" v-if="scope.row.valid == 0">禁用</el-tag>
  47. </template>
  48. </el-table-column>
  49. <el-table-column fixed="right" label="操作" width="200">
  50. <template #default="scope">
  51. <el-button link type="primary" @click="openDetail(scope.row)">详情</el-button>
  52. <el-button link type="primary" @click="print(scope.row)">打印</el-button>
  53. <el-button link type="primary" @click="edit(scope.$index, scope.row)">编辑</el-button>
  54. <el-button link type="danger" @click="deleteOne(scope.row)">删除</el-button>
  55. </template>
  56. </el-table-column>
  57. </el-table>
  58. <!-- 分页 -->
  59. <div class="yc_pagebox">
  60. <el-pagination v-model:current-page="data.pagination.currentPage"
  61. v-model:page-size="data.pagination.pageSize" :page-sizes="getThemeConfig.pageSizeArray"
  62. layout="total, sizes, prev, pager, next, jumper" :total="data.pagination.total"
  63. @size-change="handleSizeChange" @current-change="handleCurrentChange" />
  64. </div>
  65. </el-card>
  66. </el-col>
  67. <el-col :span="8">
  68. <el-card class="box-card mt20" v-loading="data.classLoading">
  69. <div class="class">
  70. <div class="classFont">物品分类</div>
  71. <el-button type="primary" @click="addClassPage">新增类别</el-button>
  72. </div>
  73. <div class="mt20">
  74. <el-input class="" placeholder="请输入物品分类名称" v-model="data.classParams.keyword"
  75. @keyup.enter.native="getClass"> </el-input>
  76. </div>
  77. <!-- 列表 -->
  78. <el-table :data="data.tableClassData" style="width: 100%" @row-click="checkproduct">
  79. <!-- props绑定数据表的字段,lable填写中文 -->
  80. <el-table-column prop="name" label="分类名称" width="" />
  81. <el-table-column prop="desc" label="分类说明" width="" />
  82. <el-table-column fixed="right" label="操作" width="200">
  83. <template #default="scope">
  84. <el-button link type="primary"
  85. @click.stop="classEdit(scope.$index, scope.row)">编辑</el-button>
  86. <el-button link type="danger" @click.stop="deleteClassOne(scope.row)">删除</el-button>
  87. </template>
  88. </el-table-column>
  89. </el-table>
  90. </el-card>
  91. </el-col>
  92. </el-row>
  93. <!-- 物品弹出容器 ,新增和修改的-->
  94. <vuecmf-dialog width="1000px" :model_value="data.dialog.show" :title="data.dialog.title" @close="closePage">
  95. <template #content>
  96. <el-form :model="newForm" label-width="120px" ref="formRef" v-loading="data.dialog.isLoading">
  97. <!-- 每个form-item就是一个表单的标签,label是名称,prop和v-model绑定字段名 -->
  98. <!-- <el-form-item label="物品图片" prop="img">
  99. <el-avatar shape="square" :size="100" fit="fill" :src="newForm.img" />
  100. <el-text class="mx-1" type="info"
  101. style="margin-top: -80px; margin-left: 20px;">尺寸316*316,小于100k</el-text>
  102. </el-form-item> -->
  103. <el-row>
  104. <el-col :span="12">
  105. <el-form-item label="物品编码" prop="no"
  106. :rules="[{ required: true, message: '请选择状态', trigger: 'blur' }]">
  107. <el-input v-model="newForm.no" placeholder="填写物品代码" />
  108. </el-form-item></el-col>
  109. <el-col :span="12">
  110. <el-form-item label="物品名称" prop="name"
  111. :rules="[{ required: true, message: '请选择状态', trigger: 'blur' }]">
  112. <el-input v-model="newForm.name" placeholder="填写物品名称" />
  113. </el-form-item></el-col>
  114. </el-row>
  115. <el-row class="mt20">
  116. <el-col :span="12">
  117. <el-form-item label="物品单位" prop="unit">
  118. <el-input v-model="newForm.unit" placeholder="填写物品单位" />
  119. </el-form-item>
  120. </el-col>
  121. <el-col :span="12">
  122. <el-form-item label="物品介绍" prop="desc">
  123. <el-input v-model="newForm.desc" placeholder="填写物品介绍" />
  124. </el-form-item>
  125. </el-col>
  126. </el-row>
  127. <el-row class="mt20">
  128. <el-col :span="12">
  129. <el-form-item label="物品规格" prop="spec">
  130. <el-input v-model="newForm.spec" placeholder="填写物品规格" />
  131. </el-form-item>
  132. </el-col>
  133. <el-col :span="12">
  134. <el-form-item label="物品分类" prop="good_class_id">
  135. <el-select v-model="newForm.good_class_id" value-key="id" placeholder="选择物品分类">
  136. <el-option v-for="item in data.region" :key="item.id" :label="item.name"
  137. :value="item.id" />
  138. </el-select>
  139. </el-form-item>
  140. </el-col>
  141. </el-row>
  142. <el-form-item class="mt20" label="状态" prop="valid"
  143. :rules="[{ required: true, message: '请选择状态', trigger: 'blur' }]">
  144. <el-radio-group v-model="newForm.valid">
  145. <el-radio :label="1">启用</el-radio>
  146. <el-radio :label="0">禁用</el-radio>
  147. </el-radio-group>
  148. </el-form-item>
  149. </el-form>
  150. <div class="height20"></div>
  151. </template>
  152. <template #footer>
  153. <el-button type="default" @click="closePage">取消</el-button>
  154. <el-button type="primary" @click="submitForm(formRef)">确定</el-button>
  155. </template>
  156. </vuecmf-dialog>
  157. <!-- 详情弹出容器-->
  158. <vuecmf-dialog width="1000px" :model_value="data.dialogDetail.showDetail" :title="data.dialogDetail.titleDetail"
  159. @close="closePage">
  160. <template #content>
  161. <el-form :model="newForm" label-width="120px" ref="formRef" v-loading="data.dialogDetail.isLoadingDetail">
  162. <!-- 每个form-item就是一个表单的标签,label是名称,prop和v-model绑定字段名 -->
  163. <!-- <el-form-item label="物品图片" prop="img">
  164. <el-avatar shape="square" :size="100" fit="fill" :src="newForm.img" />
  165. <el-text class="mx-1" type="info"
  166. style="margin-top: -80px; margin-left: 20px;">尺寸316*316,小于100k</el-text>
  167. </el-form-item> -->
  168. <el-row>
  169. <el-col :span="12">
  170. <el-form-item label="物品编码:" prop="no">
  171. <el-text class="mx-1">{{ newForm.no }}</el-text>
  172. </el-form-item></el-col>
  173. <el-col :span="12">
  174. <el-form-item label="物品名称:" prop="name">
  175. <el-text class="mx-1">{{ newForm.name }}</el-text>
  176. </el-form-item></el-col>
  177. </el-row>
  178. <el-row class="mt20">
  179. <el-col :span="12">
  180. <el-form-item label="物品单位:" prop="unit">
  181. <el-text class="mx-1">{{ newForm.unit }}</el-text>
  182. </el-form-item>
  183. </el-col>
  184. <el-col :span="12">
  185. <el-form-item label="物品介绍:" prop="desc">
  186. <el-text class="mx-1">{{ newForm.desc }}</el-text>
  187. </el-form-item>
  188. </el-col>
  189. </el-row>
  190. <el-row class="mt20">
  191. <el-col :span="12">
  192. <el-form-item label="物品规格:" prop="spec">
  193. <el-text class="mx-1">{{ newForm.spec }}</el-text>
  194. </el-form-item>
  195. </el-col>
  196. <el-col :span="12">
  197. <el-form-item label="物品分类:" prop="good_class_id">
  198. <el-text class="mx-1">{{ newForm.good_class_id }}</el-text>
  199. </el-form-item>
  200. </el-col>
  201. </el-row>
  202. <el-form-item class="mt20" label="状态:" prop="valid">
  203. <el-text class="mx-1">{{ newForm.valid == 1 ? "启用" : "禁用" }}</el-text>
  204. </el-form-item>
  205. </el-form>
  206. <div class="height20"></div>
  207. </template>
  208. </vuecmf-dialog>
  209. <!-- 物品分类弹出容器 ,新增和修改的-->
  210. <vuecmf-dialog width="1000px" :model_value="data.classDialog.classShow" :title="data.classDialog.classTitle"
  211. @close="closePage">
  212. <template #content>
  213. <el-form :model="data.form" label-width="120px" ref="formRef" v-loading="data.classDialog.classIsLoading">
  214. <!-- 每个form-item就是一个表单的标签,label是名称,prop和v-model绑定字段名 -->
  215. <el-form-item label="分类名称" prop="name"> <el-input v-model="data.form.name" placeholder="填写分类名称" />
  216. </el-form-item>
  217. <el-form-item label="分类说明" prop="desc"> <el-input v-model="data.form.desc" placeholder="填写分类说明" />
  218. </el-form-item>
  219. </el-form>
  220. <div class="height20"></div>
  221. </template>
  222. <template #footer>
  223. <el-button type="default" @click="closePage">取消</el-button>
  224. <el-button type="primary" @click="submitClassForm(formRef)">确定</el-button>
  225. </template>
  226. </vuecmf-dialog>
  227. <ImportExcelDialog ref="importExcelDialogRef" @refresh="getTableData()" />
  228. <ExportExcelDialog ref="exportExcelDialogRef" @refresh="getTableData()" />
  229. </div>
  230. </template>
  231. <script lang="ts" setup>
  232. import { defineAsyncComponent, onMounted, reactive, computed, ref, watch } from 'vue';
  233. import { storeToRefs } from 'pinia';
  234. import { useThemeConfig } from '/@/stores/themeConfig';
  235. import Good from '/@/api/model/Good'; //gzs:引入模型
  236. import GoodClass from '/@/api/model/GoodClass';//gzs:引入模型
  237. import { ElMessage, ElMessageBox } from 'element-plus';
  238. import type { FormInstance, FormRules } from 'element-plus';
  239. import router from '/@/router';
  240. // 定义变量内容
  241. const storesThemeConfig = useThemeConfig();
  242. const { themeConfig } = storeToRefs(storesThemeConfig);
  243. // 获取布局配置信息
  244. const getThemeConfig = computed(() => {
  245. return themeConfig.value;
  246. });
  247. const formRef = ref<FormInstance>();
  248. const multipleSelection = ref([]);
  249. //双向绑定的变量,推荐只定义1个
  250. //注意:所有变量初始化后再使用
  251. const data = reactive({
  252. //请求查询的参数
  253. params: {
  254. pageSize: getThemeConfig.value.pageSize, //分页大小
  255. page: 1, //当前页面
  256. keyword: '', //关键字
  257. good_class_id: null,
  258. },
  259. classParams: {
  260. pageSize: getThemeConfig.value.pageSize, //分页大小
  261. page: 1, //当前页面
  262. keyword: '', //关键字
  263. },
  264. //分页组件的变量
  265. pagination: {
  266. currentPage: 1,
  267. pageSize: getThemeConfig.value.pageSize,
  268. total: 100,
  269. },
  270. loading: false, //是否加载中
  271. classPagination: {
  272. currentPage: 1,
  273. pageSize: getThemeConfig.value.pageSize,
  274. total: 100,
  275. },
  276. classLoading: false, //是否加载中
  277. tableData: [], // 表格数据
  278. tableClassData: [], //分类表格数据
  279. //物品弹出框
  280. dialog: {
  281. show: false, // 是否显示弹出框,用于最大化、最小化及还原
  282. title: '添加', // 弹出框标题
  283. isLoading: false, //是否加载中
  284. type: "edit" as "submit" | "edit" // 表单类型 edit|submit
  285. },
  286. //详情弹出框
  287. dialogDetail: {
  288. showDetail: false, // 是否显示弹出框,用于最大化、最小化及还原
  289. titleDetail: '添加', // 弹出框标题
  290. isLoadingDetail: false, //是否加载中
  291. },
  292. //分类弹出框
  293. classDialog: {
  294. classShow: false, // 是否显示弹出框,用于最大化、最小化及还原
  295. classTitle: '添加', // 弹出框标题
  296. classIsLoading: false, //是否加载中
  297. },
  298. form: {} as any, //分类新增和修改表单数据
  299. //扫码枪
  300. value: '',
  301. //物品分类选择
  302. region: [] as any,
  303. //导出
  304. impparam: {
  305. date: "",
  306. keyword: "",
  307. product_id: "",
  308. classes_id: "",
  309. page: 1,
  310. list_rows: 10,
  311. is_sort: 0
  312. },
  313. });
  314. /**
  315. * 监听页数
  316. */
  317. watch(() => [data.params.good_class_id, data.params.keyword], (count, prevCount) => {
  318. data.params.page = 1
  319. getList();
  320. }
  321. )
  322. // 初始化表格数据
  323. const getTableData = () => {
  324. getList();
  325. getClass();
  326. };
  327. /**
  328. * 导入、导出
  329. */
  330. const ImportExcelDialog = defineAsyncComponent(() => import("/@/views/payrollModule/import.vue"));
  331. const importExcelDialogRef = ref();
  332. const importExcel = () => {
  333. importExcelDialogRef.value.openDialog();
  334. };
  335. const ExportExcelDialog = defineAsyncComponent(() => import("/@/views/payrollModule/export.vue"));
  336. const exportExcelDialogRef = ref();
  337. const exportExcel = () => {
  338. // return ElMessage.warning("功能正在完善中");
  339. exportExcelDialogRef.value.openDialog(data.impparam);
  340. };
  341. /**
  342. * 实例化1个表单对象
  343. */
  344. const newForm = reactive({
  345. no: '',
  346. name: '',
  347. desc: '',
  348. unit: '',
  349. img: '',
  350. spec: '',
  351. index: 0,
  352. good_class_id: '' as number | string,
  353. valid: 1,
  354. });
  355. /**
  356. * 实例化1个分类表单对象
  357. */
  358. const newClassForm = () => {
  359. let form = {
  360. id: 0,
  361. name: '',
  362. desc: '',
  363. valid: 1,
  364. };
  365. return form;
  366. };
  367. /**
  368. * 启用、禁用
  369. */
  370. const enable = async () => {
  371. const items = multipleSelection.value.map((item: any) => { item.valid = 1; return item });
  372. let res = await Good.edit(items);
  373. if (res.code != 0) {
  374. ElMessage.error(res.msg);
  375. return;
  376. }
  377. ElMessage.success(res.msg);
  378. getList()
  379. };
  380. const forbidden = async () => {
  381. const items = multipleSelection.value.map((item: any) => { item.valid = 0; return item });
  382. let res = await Good.edit(items);
  383. if (res.code != 0) {
  384. ElMessage.error(res.msg);
  385. return;
  386. }
  387. ElMessage.success(res.msg);
  388. getList()
  389. };
  390. /**
  391. * 切换页面大小
  392. * @param val
  393. */
  394. const handleSizeChange = (val: number) => {
  395. data.params.pageSize = val;
  396. data.classParams.pageSize = val;
  397. getList();
  398. getClass()
  399. };
  400. /**
  401. * 翻页
  402. */
  403. const handleCurrentChange = (val: number) => {
  404. data.params.page = val;
  405. getList();
  406. };
  407. const search = async () => {
  408. data.params.page = 1;
  409. await getList();
  410. };
  411. /**
  412. * 页面初始化方法,有就写逻辑,没有可以留空
  413. */
  414. const init = async () => { };
  415. /**
  416. * 获取所有分类数据
  417. */
  418. const getAll = async () => {
  419. data.loading = true;
  420. const res = await GoodClass.all();
  421. data.loading = false;
  422. if (res.code != 0) {
  423. ElMessage.error(res.msg);
  424. return;
  425. }
  426. console.log("getAllres", res);
  427. data.region = res.data
  428. console.log("data.region", data.region);
  429. };
  430. /**
  431. * 获取分类列表数据
  432. */
  433. const getClass = async () => {
  434. data.classLoading = true;
  435. const res = await GoodClass.list({
  436. pageParams: {
  437. page: data.classParams.page,
  438. size: data.classParams.pageSize,
  439. },
  440. keyword: data.classParams.keyword
  441. });
  442. data.classLoading = false;
  443. if (res.code != 0) {
  444. ElMessage.error(res.msg);
  445. return;
  446. }
  447. console.log("getClass", res);
  448. data.tableClassData = res.data.data;
  449. //分页数据赋值
  450. // data.classPagination.total = res.data.total;
  451. // data.classPagination.currentPage = res.data.current_page;
  452. // data.classPagination.pageSize = res.data.per_page;
  453. };
  454. /**
  455. * 点击查看全部
  456. */
  457. const checkAll = async () => {
  458. data.params.good_class_id = null
  459. getList();
  460. };
  461. /**
  462. * 点击分类选项查看物品分类
  463. */
  464. const checkproduct = async (row: any) => {
  465. console.log("check", row.id);
  466. data.params.good_class_id = row.id;
  467. };
  468. /**
  469. * 获取分页数据
  470. */
  471. const getList = async () => {
  472. data.loading = true;
  473. const res = await Good.list({
  474. pageParams: {
  475. page: data.params.page,
  476. size: data.params.pageSize,
  477. },
  478. keyword: data.params.keyword,
  479. good_class_id: data.params.good_class_id
  480. }); //异步请求获取 分页数据,接口返回,0为成功,非0失败
  481. data.loading = false;
  482. if (res.code != 0) {
  483. ElMessage.error(res.msg);
  484. return;
  485. }
  486. data.tableData = res.data.data;
  487. //分页数据赋值
  488. data.pagination.total = res.data.total;
  489. data.pagination.currentPage = res.data.current_page;
  490. data.pagination.pageSize = res.data.per_page;
  491. };
  492. // 翻页
  493. const handleTableDataSelectionChange = (val: any) => {
  494. multipleSelection.value = val;
  495. console.log('lzj500🚀 ~ file: index.vue:203 ~ handleTableDataSelectionChange ~ val:', val);
  496. };
  497. //=========添加 和 编辑 删除
  498. /**
  499. * 关闭弹出框
  500. */
  501. const closePage = () => {
  502. data.dialog.show = false;
  503. data.dialogDetail.showDetail = false;
  504. data.classDialog.classShow = false;
  505. };
  506. /**
  507. * 弹出新增分类页面
  508. */
  509. const addClassPage = () => {
  510. data.classDialog.classShow = true;
  511. data.classDialog.classTitle = '添加分类'; //gzs:标题
  512. data.form = newClassForm();
  513. console.log('lzj500🚀 ~ file: index.vue:160 ~ addPage ~ dialog:', data.classDialog);
  514. };
  515. /**
  516. * 弹出新增页面
  517. */
  518. const addPage = async () => {
  519. await getAll();
  520. data.dialog.show = true;
  521. data.dialog.title = '添加物品'; //gzs:标题
  522. data.dialog.type = "submit";
  523. newForm.no = '';
  524. newForm.desc = '';
  525. newForm.good_class_id = '';
  526. newForm.img = '';
  527. newForm.unit = '';
  528. newForm.valid = 1;
  529. newForm.spec = '';
  530. newForm.name = '';
  531. console.log('lzj500🚀 ~ file: index.vue:160 ~ addPage ~ dialog:', data.dialog);
  532. };
  533. /**
  534. * 弹出 分类编辑页面
  535. */
  536. const classEdit = async (index: number, item: any) => {
  537. data.classDialog.classShow = true;
  538. data.classDialog.classTitle = '编辑分类';
  539. data.form = item;
  540. };
  541. /**
  542. * 弹出 编辑页面
  543. */
  544. const edit = async (index: number, item: any) => {
  545. data.dialog.show = true;
  546. data.dialog.title = '编辑物品';
  547. data.dialog.type = "edit";
  548. newForm.no = item.no;
  549. newForm.desc = item.desc;
  550. newForm.good_class_id = item.good_class_id;
  551. newForm.img = item.img;
  552. newForm.unit = item.unit;
  553. newForm.valid = item.valid;
  554. newForm.spec = item.spec;
  555. newForm.name = item.name;
  556. newForm.index = item.id;
  557. // await detail(item.id);
  558. };
  559. /**
  560. * 弹出详情页面
  561. */
  562. const openDetail = async (item: any) => {
  563. console.log("itemitem", item);
  564. data.dialogDetail.showDetail = true;
  565. data.dialogDetail.titleDetail = '仓库详情';
  566. newForm.no = item.no;
  567. newForm.desc = item.desc;
  568. newForm.good_class_id = item.goodClass.name;
  569. newForm.img = item.img;
  570. newForm.unit = item.unit;
  571. newForm.valid = item.valid;
  572. newForm.spec = item.spec;
  573. newForm.name = item.name;
  574. newForm.index = item.id;
  575. };
  576. /**
  577. * 打印机打印
  578. */
  579. const print = (item: any) => {
  580. // let url = window.location.href.split('/data/good')[0];
  581. // setTimeout(() => {
  582. // window.open(url + `/data/print?no=${item.no}&name=${item.name}`);
  583. // }, 500)
  584. router.push({ name: 'printGood', query: { no: item.no, name: item.name } });
  585. };
  586. /**
  587. * 分类的提交 表单,新增和修改都在这里
  588. */
  589. const submitClassForm = (formEl: FormInstance | undefined) => {
  590. if (!formEl) return;
  591. formEl.validate(async (valid) => {
  592. if (!valid) {
  593. console.log('error submit!');
  594. return false;
  595. }
  596. // console.log('submit!');
  597. let res = null;
  598. data.classDialog.classIsLoading = true;
  599. if (data.form?.id) {
  600. //如果是编辑
  601. res = await GoodClass.edit(data.form);
  602. } else {
  603. res = await GoodClass.add(data.form);
  604. }
  605. data.classDialog.classIsLoading = false;
  606. if (res.code != 0) {
  607. ElMessage.error(res.msg);
  608. return;
  609. }
  610. ElMessage.success(res.msg);
  611. await getClass();
  612. search();
  613. closePage();
  614. });
  615. };
  616. /**
  617. * 提交 表单,新增和修改都在这里
  618. */
  619. const submitForm = (formEl: FormInstance | undefined) => {
  620. if (!formEl) return;
  621. formEl.validate(async (valid) => {
  622. if (!valid) {
  623. console.log('error submit!');
  624. return false;
  625. }
  626. let res = null;
  627. data.dialog.isLoading = true;
  628. console.log("🚀 ~ file: good.vue:638 ~ formEl.validate ~ newForm:", newForm)
  629. if (data.dialog.type == "edit") {
  630. //如果是编辑
  631. res = await Good.edit([{
  632. id: newForm.index,
  633. no: newForm.no,
  634. name: newForm.name,
  635. img: newForm.img,
  636. spec: newForm.spec,
  637. valid: newForm.valid,
  638. unit: newForm.unit,
  639. desc: newForm.desc,
  640. good_class_id: newForm.good_class_id,
  641. }])
  642. } else {
  643. res = await Good.add(newForm);
  644. }
  645. data.dialog.isLoading = false;
  646. if (res.code != 0) {
  647. ElMessage.error(res.msg);
  648. return;
  649. }
  650. ElMessage.success(res.msg);
  651. search();
  652. closePage();
  653. });
  654. };
  655. //删除分类1条数据
  656. const deleteClassOne = (item: any) => {
  657. ElMessageBox.confirm('删除后不可恢复,确定要删除该记录吗?', '警告', {
  658. confirmButtonText: '确定',
  659. cancelButtonText: '取消',
  660. type: 'warning',
  661. })
  662. .then(() => {
  663. doClassDelete(item.id);
  664. })
  665. .catch(() => { });
  666. };
  667. //删除1条数据
  668. const deleteOne = (item: any) => {
  669. ElMessageBox.confirm('删除后不可恢复,确定要删除该记录吗?', '警告', {
  670. confirmButtonText: '确定',
  671. cancelButtonText: '取消',
  672. type: 'warning',
  673. })
  674. .then(() => {
  675. doDelete([item.id]);
  676. })
  677. .catch(() => { });
  678. };
  679. //删除多条数据
  680. const deleteMult = (item: any) => {
  681. if (multipleSelection.value.length == 0) {
  682. ElMessage.error('请选择要删除的记录');
  683. return;
  684. }
  685. let ids = multipleSelection.value.map((item: any) => item.id);
  686. ElMessageBox.confirm('删除后不可恢复,确定要删除选中记录吗?', '警告', {
  687. confirmButtonText: '确定',
  688. cancelButtonText: '取消',
  689. type: 'warning',
  690. })
  691. .then(() => {
  692. doDelete(ids);
  693. })
  694. .catch(() => { });
  695. };
  696. //执行分类删除请求
  697. const doClassDelete = async (id: any) => {
  698. data.loading = true;
  699. let res = await GoodClass.delete({ id });
  700. data.loading = false;
  701. if (res.code != 0) {
  702. ElMessage.error(res.msg);
  703. return;
  704. }
  705. await getClass();
  706. };
  707. //执行删除请求
  708. const doDelete = async (id: any) => {
  709. data.loading = true;
  710. let res = await Good.delete({ id });
  711. data.loading = false;
  712. if (res.code != 0) {
  713. ElMessage.error(res.msg);
  714. return;
  715. }
  716. await getList();
  717. };
  718. //=========页面事件
  719. /**
  720. * 页面加载时事件
  721. */
  722. onMounted(async () => {
  723. getList();
  724. getClass();
  725. getAll();
  726. init();
  727. });
  728. </script>
  729. <style>
  730. .class {
  731. display: flex;
  732. align-items: center;
  733. justify-content: space-between;
  734. }
  735. .classFont {
  736. color: #31373D;
  737. font-size: 14px;
  738. font-weight: bold;
  739. }
  740. .active {
  741. color: blue;
  742. }
  743. </style>