commodity.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  1. <template>
  2. <el-container>
  3. <el-header
  4. class="gva-search-box"
  5. style="line-height: 60px"
  6. >
  7. <el-row>
  8. <el-col :span="8">
  9. <el-form
  10. inline
  11. style="margin-top: 10px"
  12. >
  13. <el-form-item label="名称">
  14. <el-input
  15. v-model="searchCommodity.name"
  16. placeholder="请输入名称"
  17. />
  18. </el-form-item>
  19. <el-form-item>
  20. <el-button @click="getData">搜索</el-button>
  21. </el-form-item>
  22. </el-form>
  23. </el-col>
  24. <el-col :span="8" />
  25. <el-col :span="8">
  26. <el-button
  27. type="primary"
  28. @click="isOpenCommodityAdd = true"
  29. >商品新增</el-button>
  30. <el-button
  31. type="primary"
  32. @click="isOpenCommodityGenre = true"
  33. >商品类型</el-button>
  34. </el-col>
  35. </el-row>
  36. </el-header>
  37. <el-main class="gva-table-box">
  38. <el-table
  39. :data="commodityListData"
  40. style="height: 600px"
  41. >
  42. <el-table-column
  43. prop="name"
  44. label="商品名称"
  45. align="center"
  46. />
  47. <el-table-column
  48. prop="commodityGenre.name"
  49. label="类型"
  50. align="center"
  51. />
  52. <el-table-column
  53. prop="supplier.name"
  54. label="供应商"
  55. align="center"
  56. />
  57. <el-table-column
  58. prop="unitPrice"
  59. label="单价"
  60. align="center"
  61. />
  62. <el-table-column label="操作">
  63. <template #default="scope">
  64. <el-button
  65. size="small"
  66. type="primary"
  67. @click="openCommodityEdit(scope.row)"
  68. >编辑</el-button>
  69. <el-button
  70. size="small"
  71. type="danger"
  72. @click="commodityDelete(scope.row)"
  73. >删除</el-button>
  74. </template>
  75. </el-table-column>
  76. </el-table>
  77. <!-- 分页-->
  78. <div class="gva-pagination">
  79. <el-pagination
  80. :current-page="searchCommodity.pageInfo.page"
  81. :page-size="searchCommodity.pageInfo.pageSize"
  82. :page-sizes="[10, 30, 50, 100]"
  83. :total="total"
  84. layout="total, sizes, prev, pager, next, jumper"
  85. @current-change="handleCurrentChange"
  86. @size-change="handleSizeChange"
  87. />
  88. </div>
  89. <!-- 修改-->
  90. <el-drawer
  91. v-model="isOpenCommodityEdit"
  92. title="修改供应商信息"
  93. direction="rtl"
  94. size="30%"
  95. >
  96. <div>
  97. <el-form
  98. v-model="commodityEditData"
  99. label-position="left"
  100. label-width="auto"
  101. style="max-width: 400px"
  102. >
  103. <el-form-item label="商品名称">
  104. <el-input v-model="commodityEditData.name" />
  105. </el-form-item>
  106. <el-form-item label="商品类型">
  107. <el-select
  108. v-model="commodityEditData.genre"
  109. style="width: 240px"
  110. >
  111. <el-option
  112. v-for="item in commodityGenreAllData"
  113. :key="item.ID"
  114. :label="item.name"
  115. :value="item.ID"
  116. />
  117. </el-select>
  118. </el-form-item>
  119. <el-form-item label="供应商">
  120. <el-select
  121. v-model="commodityEditData.supplierId"
  122. style="width: 240px"
  123. >
  124. <el-option
  125. v-for="item in supplierAllData"
  126. :key="item.ID"
  127. :label="item.name"
  128. :value="item.ID"
  129. />
  130. </el-select>
  131. </el-form-item>
  132. <el-form-item label="单价">
  133. <el-input
  134. v-model="commodityEditData.unitPrice"
  135. type="number"
  136. />
  137. </el-form-item>
  138. <el-form-item label="单位">
  139. <el-input v-model="commodityEditData.unity" />
  140. </el-form-item>
  141. <el-form-item label="备注">
  142. <el-input v-model="commodityEditData.remark" />
  143. </el-form-item>
  144. <el-form-item>
  145. <el-button
  146. type="primary"
  147. @click="commoditySubmit"
  148. >提交</el-button>
  149. <el-button @click="isOpenCommodityEdit = false">关闭</el-button>
  150. </el-form-item>
  151. </el-form>
  152. </div>
  153. </el-drawer>
  154. <el-drawer
  155. v-model="isOpenCommodityAdd"
  156. title="新增供应商信息"
  157. direction="rtl"
  158. size="30%"
  159. >
  160. <div>
  161. <el-form
  162. v-model="commodityAddData"
  163. label-position="left"
  164. label-width="auto"
  165. style="max-width: 400px"
  166. >
  167. <el-form-item label="商品名称">
  168. <el-input v-model="commodityAddData.name" />
  169. </el-form-item>
  170. <el-form-item label="商品类型">
  171. <el-select
  172. v-model="commodityAddData.genre"
  173. style="width: 240px"
  174. >
  175. <el-option
  176. v-for="item in commodityGenreAllData"
  177. :key="item.ID"
  178. :label="item.name"
  179. :value="item.ID"
  180. />
  181. </el-select>
  182. </el-form-item>
  183. <el-form-item label="供应商">
  184. <el-select
  185. v-model="commodityAddData.supplierId"
  186. style="width: 240px"
  187. >
  188. <el-option
  189. v-for="item in supplierAllData"
  190. :key="item.ID"
  191. :label="item.name"
  192. :value="item.ID"
  193. />
  194. </el-select>
  195. </el-form-item>
  196. <el-form-item label="单价">
  197. <el-input
  198. v-model.number="commodityAddData.unitPrice"
  199. type="number"
  200. />
  201. </el-form-item>
  202. <el-form-item label="单位">
  203. <el-input v-model="commodityAddData.unity" />
  204. </el-form-item>
  205. <el-form-item label="备注">
  206. <el-input v-model="commodityAddData.remark" />
  207. </el-form-item>
  208. <el-form-item>
  209. <el-button
  210. type="primary"
  211. @click="commodityAddSubmit"
  212. >提交</el-button>
  213. <el-button @click="isOpenCommodityAdd = false">关闭</el-button>
  214. </el-form-item>
  215. </el-form>
  216. </div>
  217. </el-drawer>
  218. <!-- 商品类型-->
  219. <el-drawer
  220. v-model="isOpenCommodityGenre"
  221. title="商品类型"
  222. direction="rtl"
  223. size="50%"
  224. >
  225. <el-header>
  226. <el-button
  227. type="primary"
  228. @click="isOpenAddGenre = true"
  229. >新增商品类型</el-button>
  230. </el-header>
  231. <el-main>
  232. <el-table :data="filterTableData">
  233. <el-table-column
  234. label="ID"
  235. prop="ID"
  236. />
  237. <el-table-column
  238. label="名称"
  239. prop="name"
  240. />
  241. <el-table-column
  242. label="备注"
  243. prop="remarks"
  244. />
  245. <el-table-column align="right">
  246. <template #header>
  247. <el-input
  248. v-model="searchCommodityGenre"
  249. placeholder="筛选"
  250. />
  251. </template>
  252. <template #default="scope">
  253. <el-button
  254. type="primary"
  255. @click="openUpdateGenre(scope.row)"
  256. >编辑</el-button>
  257. <el-button
  258. type="danger"
  259. @click="commodityGenreDeleteSubmit(scope.row)"
  260. >删除</el-button>
  261. </template>
  262. </el-table-column>
  263. </el-table>
  264. </el-main>
  265. <!-- 新增-->
  266. <el-dialog
  267. v-model="isOpenAddGenre"
  268. title="新增商品类型"
  269. width="300"
  270. align-center
  271. >
  272. <template #footer>
  273. <el-form>
  274. <el-form-item label="名称">
  275. <el-input
  276. v-model="commodityGenreAddData.name"
  277. style="width: 240px;"
  278. />
  279. </el-form-item>
  280. <el-form-item label="备注">
  281. <el-input
  282. v-model="commodityGenreAddData.remarks"
  283. style="width: 240px;"
  284. />
  285. </el-form-item>
  286. <el-form-item>
  287. <el-button
  288. type="primary"
  289. @click="commodityGenreAddSubmit"
  290. >提交</el-button>
  291. </el-form-item>
  292. </el-form>
  293. </template>
  294. </el-dialog>
  295. <!-- 编辑-->
  296. <el-dialog
  297. v-model="isOpenUpdateGenre"
  298. title="编辑商品类型"
  299. width="300"
  300. align-center
  301. >
  302. <template #footer>
  303. <el-form>
  304. <el-form-item label="名称">
  305. <el-input
  306. v-model="commodityGenreUpdateData.name"
  307. style="width: 240px;"
  308. />
  309. </el-form-item>
  310. <el-form-item label="备注">
  311. <el-input
  312. v-model="commodityGenreUpdateData.remarks"
  313. style="width: 240px;"
  314. />
  315. </el-form-item>
  316. <el-form-item>
  317. <el-button
  318. type="primary"
  319. @click="commodityGenreUpdateSubmit"
  320. >提交</el-button>
  321. </el-form-item>
  322. </el-form>
  323. </template>
  324. </el-dialog>
  325. </el-drawer>
  326. </el-main>
  327. </el-container>
  328. </template>
  329. <script setup>
  330. import { ref, onMounted, computed } from 'vue'
  331. import {
  332. createCommodity,
  333. createCommodityGenre, deleteCommodity,
  334. deleteCommodityGenre,
  335. queryAllCommodityGenre, queryAllSupplier, queryCommodityList, updateCommodity,
  336. updateCommodityGenre
  337. } from '@/api/storehouse'
  338. import { ElMessage, ElMessageBox } from 'element-plus'
  339. // 数据
  340. const commodityGenreAllData = ref()
  341. const commodityListData = ref()
  342. const searchCommodity = ref({
  343. pageInfo: {
  344. page: 1,
  345. pageSize: 10,
  346. },
  347. name: ''
  348. })
  349. const total = ref(0)
  350. // 分页
  351. const handleSizeChange = (val) => {
  352. searchCommodity.value.pageSize = val
  353. getData()
  354. }
  355. const handleCurrentChange = (val) => {
  356. searchCommodity.value.page = val
  357. getData()
  358. }
  359. const supplierAllData = ref()
  360. const getData = async() => {
  361. await queryAllCommodityGenre().then(res => {
  362. commodityGenreAllData.value = res.data
  363. })
  364. await queryCommodityList(searchCommodity.value).then(res => {
  365. commodityListData.value = res.data.list
  366. total.value = res.data.total
  367. })
  368. await queryAllSupplier().then(res => {
  369. console.log(res.data)
  370. supplierAllData.value = res.data
  371. })
  372. }
  373. // 商品类型
  374. const isOpenCommodityGenre = ref(false)
  375. const searchCommodityGenre = ref()
  376. const filterTableData = computed(() =>
  377. commodityGenreAllData.value.filter(
  378. (data) =>
  379. !searchCommodityGenre.value ||
  380. data.name.toLowerCase().includes(searchCommodityGenre.value.toLowerCase())
  381. )
  382. )
  383. const commodityGenreAddData = ref({
  384. name: '',
  385. })
  386. const isOpenAddGenre = ref(false)
  387. const commodityGenreAddSubmit = async() => {
  388. if (!commodityGenreAddData.value.name) {
  389. ElMessage.error('名称不能为空')
  390. return
  391. }
  392. await createCommodityGenre(commodityGenreAddData.value).then(res => {
  393. if (res.code === 0) {
  394. ElMessage.success('新增成功')
  395. } else {
  396. ElMessage.error('新增失败')
  397. }
  398. isOpenAddGenre.value = false
  399. getData()
  400. })
  401. }
  402. const commodityGenreUpdateData = ref()
  403. const isOpenUpdateGenre = ref(false)
  404. const openUpdateGenre = (val) => {
  405. isOpenUpdateGenre.value = true
  406. commodityGenreUpdateData.value = val
  407. }
  408. const commodityGenreUpdateSubmit = async() => {
  409. if (!commodityGenreUpdateData.value.name) {
  410. ElMessage.error('名称不能为空')
  411. return
  412. }
  413. await updateCommodityGenre(commodityGenreUpdateData.value).then(res => {
  414. if (res.code === 0) {
  415. ElMessage.success('编辑成功')
  416. } else {
  417. ElMessage.error('编辑失败')
  418. }
  419. isOpenUpdateGenre.value = false
  420. getData()
  421. })
  422. }
  423. const commodityGenreDeleteSubmit = (val) => {
  424. ElMessageBox.confirm(
  425. '将永久删除该信息。是否继续?',
  426. '删除',
  427. {
  428. confirmButtonText: '确定',
  429. cancelButtonText: '取消',
  430. type: 'warning',
  431. }
  432. )
  433. .then(async() => {
  434. await deleteCommodityGenre(val).then(res => {
  435. if (res.code === 0) {
  436. ElMessage.success('删除成功')
  437. getData()
  438. } else {
  439. ElMessage.error('删除失败')
  440. }
  441. })
  442. })
  443. .catch(() => {
  444. ElMessage({
  445. type: 'info',
  446. message: '删除已取消',
  447. })
  448. })
  449. }
  450. // 商品
  451. const isOpenCommodityEdit = ref(false)
  452. const commodityEditData = ref()
  453. const openCommodityEdit = (val) => {
  454. commodityEditData.value = val
  455. isOpenCommodityEdit.value = true
  456. }
  457. const commoditySubmit = async() => {
  458. await updateCommodity(commodityEditData.value).then(res => {
  459. if (res.code === 0) {
  460. ElMessage.success('编辑成功')
  461. } else {
  462. ElMessage.error('编辑失败')
  463. }
  464. isOpenCommodityEdit.value = false
  465. })
  466. }
  467. const commodityDelete = async(val) => {
  468. ElMessageBox.confirm(
  469. '将永久删除该信息。是否继续?',
  470. '删除',
  471. {
  472. confirmButtonText: '确定',
  473. cancelButtonText: '取消',
  474. type: 'warning',
  475. }
  476. )
  477. .then(async() => {
  478. await deleteCommodity(val).then(res => {
  479. if (res.code === 0) {
  480. ElMessage.success('删除成功')
  481. getData()
  482. } else {
  483. ElMessage.error('删除失败')
  484. }
  485. })
  486. })
  487. .catch(() => {
  488. ElMessage({
  489. type: 'info',
  490. message: '删除已取消',
  491. })
  492. })
  493. }
  494. // 新增
  495. const commodityAddData = ref({
  496. name: '',
  497. genre: '',
  498. supplierId: '',
  499. unitPrice: 0,
  500. unity: '',
  501. remark: '',
  502. })
  503. const isOpenCommodityAdd = ref(false)
  504. const commodityAddSubmit = async() => {
  505. if (!commodityAddData.value.name || !commodityAddData.value.genre || !commodityAddData.value.supplierId || commodityAddData.value.unitPrice === 0) {
  506. ElMessage.error('数据不能为空')
  507. return
  508. }
  509. console.log(commodityAddData.value)
  510. await createCommodity(commodityAddData.value).then(res => {
  511. if (res.code === 0) {
  512. ElMessage.success('新增成功')
  513. } else {
  514. ElMessage.error('新增失败')
  515. }
  516. isOpenCommodityAdd.value = false
  517. getData()
  518. })
  519. }
  520. onMounted(() => {
  521. getData()
  522. })
  523. </script>