ProductionList.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. <script setup lang="ts">
  2. import {
  3. Storehouse_ProductClass_List,
  4. Storehouse_Product_List,
  5. Storehouse_Product_Add,
  6. Storehouse_Product_Edit,
  7. Storehouse_Product_Del,
  8. Storehouse_Product_Spec_List
  9. } from '@/api/storehouse/index'
  10. import { GlobalStore } from '@/stores/index'
  11. import { ref, reactive, nextTick, onMounted } from 'vue'
  12. import Upload from '@/components/Upload/index.vue'
  13. import Drawer from '@/components/Drawer/index.vue'
  14. import TableBase from '@/components/TableBase/index.vue'
  15. import { ElMessageBox, ElMessage } from 'element-plus'
  16. import type { FormInstance, FormRules } from 'element-plus'
  17. import { Edit, Delete, Plus } from '@element-plus/icons-vue'
  18. import type { ColumnProps } from '@/components/TableBase/interface/index'
  19. import ImageCom from '@/components/Image/index.vue'
  20. const isNew = ref(true)
  21. const globalStore = GlobalStore()
  22. const formLabelWidth = ref('100px')
  23. const ruleFormRef = ref<FormInstance>()
  24. const drawerRef = ref<InstanceType<typeof Drawer> | null>(null)
  25. const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
  26. const uploadRef = ref<InstanceType<typeof Upload> | null>(null)
  27. const columns: ColumnProps[] = [
  28. { type: 'index', label: '序号', width: 80 },
  29. { prop: 'T_img', label: '产品图片', name: 'T_img' },
  30. { prop: 'T_name', label: '产品名称' },
  31. { prop: 'T_class_name', label: '产品分类' },
  32. { prop: 'T_model', label: '产品型号', ellipsis: true },
  33. { prop: 'T_spec', label: '产品规格' },
  34. { prop: 'T_relation_sn', label: '关联SN', name: 'T_relation_sn' },
  35. { prop: 'T_remark', label: '备注', name: 'T_remark' },
  36. { prop: 'operation', label: '操作', width: 150, fixed: 'right' }
  37. ]
  38. const rules = reactive<FormRules>({
  39. T_name: [{ required: true, message: '请输入产品名称', trigger: 'blur' }],
  40. T_class: [{ required: true, message: '请选择产品分类', trigger: 'blur' }],
  41. T_model: [{ required: true, message: '请输入产品型号', trigger: 'blur' }],
  42. T_spec: [{ required: true, message: '请选择产品规格', trigger: 'blur' }],
  43. T_relation_sn: [{ required: true, message: '请选择关联SN', trigger: 'blur' }]
  44. })
  45. const form = reactive({
  46. T_id: '',
  47. T_name: '',
  48. T_class: '',
  49. T_model: '',
  50. T_spec: '',
  51. T_relation_sn: '',
  52. T_img: '',
  53. T_remark: ''
  54. })
  55. const openDrawer = (type: string, row?: any) => {
  56. isNew.value = type === 'new' ? true : false
  57. !specList.value.length && getSpecList()
  58. nextTick(() => {
  59. if (!isNew.value) {
  60. form.T_id = row.Id
  61. form.T_img = row.T_img
  62. form.T_name = row.T_name
  63. form.T_spec = row.T_spec
  64. form.T_model = row.T_model
  65. form.T_class = row.T_class
  66. form.T_remark = row.T_remark
  67. form.T_relation_sn = row.T_relation_sn
  68. }
  69. })
  70. drawerRef.value?.openDrawer()
  71. }
  72. const AddProduction = (formEl: FormInstance | undefined) => {
  73. if (!formEl) return
  74. formEl.validate(async valid => {
  75. if (valid) {
  76. let res: any = {}
  77. if (isNew.value) {
  78. res = await Storehouse_Product_Add({ User_tokey: globalStore.GET_User_tokey, ...form })
  79. } else {
  80. res = await Storehouse_Product_Edit({ User_tokey: globalStore.GET_User_tokey, ...form })
  81. }
  82. if (res.Code === 200) {
  83. ElMessage.success(`产品${isNew.value ? '添加' : '修改'}成功!!`)
  84. nextTick(() => {
  85. drawerRef.value?.closeDrawer()
  86. TableRef.value?.getTableList()
  87. resetForm(ruleFormRef.value)
  88. isNew.value = true
  89. })
  90. }
  91. } else {
  92. return false
  93. }
  94. })
  95. }
  96. const ProductDelete = (row: any) => {
  97. ElMessageBox.confirm('您确定要删除该产品吗?', '警告', {
  98. confirmButtonText: '确定',
  99. cancelButtonText: '取消',
  100. type: 'warning'
  101. })
  102. .then(async () => {
  103. const res: any = await Storehouse_Product_Del({
  104. User_tokey: globalStore.GET_User_tokey,
  105. T_id: row.Id
  106. })
  107. if (res.Code === 200) {
  108. ElMessage.success('删除成功!')
  109. nextTick(() => {
  110. TableRef.value?.getTableList()
  111. })
  112. }
  113. })
  114. .catch(() => {
  115. ElMessage.warning('取消成功!')
  116. })
  117. }
  118. const callbackDrawer = (done: () => void) => {
  119. resetForm(ruleFormRef.value)
  120. done()
  121. }
  122. const resetForm = (formEl: FormInstance | undefined) => {
  123. if (!formEl) return
  124. uploadRef.value?.clearfileList()
  125. formEl.resetFields()
  126. }
  127. // 搜索
  128. const initParam = reactive({
  129. User_tokey: globalStore.GET_User_tokey,
  130. T_name: '',
  131. T_class: ''
  132. })
  133. const searchHandle = () => TableRef.value?.searchTable()
  134. // 获取产品分类
  135. const options = ref<any[]>([])
  136. const getProductClassList = async () => {
  137. const res: any = await Storehouse_ProductClass_List({ page: 1, page_z: 999 })
  138. options.value = res.Data.Data
  139. }
  140. // 获取产品规格
  141. const specList = ref<any[]>([])
  142. const getSpecList = async () => {
  143. const res: any = await Storehouse_Product_Spec_List({ User_tokey: globalStore.GET_User_tokey })
  144. specList.value = res.Data
  145. }
  146. onMounted(() => {
  147. getProductClassList()
  148. })
  149. </script>
  150. <template>
  151. <div class="production-list">
  152. <TableBase ref="TableRef" :columns="columns" :requestApi="Storehouse_Product_List" :initParam="initParam">
  153. <template #table-header>
  154. <div class="input-suffix">
  155. <el-row :gutter="20" style="margin-bottom: 0">
  156. <el-col :xl="6" :lg="8" :md="10">
  157. <span class="inline-flex items-center">产品分类:</span>
  158. <el-select v-model="initParam.T_class" class="w-50 m-2" clearable placeholder="请选择分类~">
  159. <el-option v-for="item in options" :key="item.Id" :label="item.T_name" :value="item.Id" />
  160. </el-select>
  161. </el-col>
  162. <el-col :xl="10" :md="12">
  163. <span class="inline-flex items-center">产品名称:</span>
  164. <el-input
  165. v-model="initParam.T_name"
  166. type="text"
  167. class="w-50 m-2"
  168. placeholder="按产品名称、产品型号搜索"
  169. @change="searchHandle"
  170. />
  171. <el-button type="primary" @click="searchHandle">搜索</el-button>
  172. </el-col>
  173. <el-col :xl="6" :md="2" class="btn"
  174. ><el-button type="primary" @click="openDrawer('new')">添加</el-button></el-col
  175. >
  176. </el-row>
  177. </div>
  178. </template>
  179. <template #T_img="{ row }">
  180. <ImageCom :src="row.T_img" />
  181. </template>
  182. <template #T_remark="{ row }">
  183. <el-tooltip effect="customized" placement="left">
  184. <template #content>
  185. <div class="tooltip-content">{{ row.T_remark }}</div>
  186. </template>
  187. {{ row.T_remark }}
  188. </el-tooltip>
  189. </template>
  190. <template #T_relation_sn="{ row }">
  191. <el-tag v-if="row.T_relation_sn === 1" effect="dark">是</el-tag>
  192. <el-tag v-else type="success" effect="dark">否</el-tag>
  193. </template>
  194. <template #right="{ row }">
  195. <el-button link type="primary" size="small" :icon="Edit" @click="openDrawer('edit', row)">编辑</el-button>
  196. <el-button link type="danger" size="small" :icon="Delete" @click="ProductDelete(row)">删除</el-button>
  197. </template>
  198. </TableBase>
  199. <Drawer ref="drawerRef" :handleClose="callbackDrawer">
  200. <template #header="{ params }">
  201. <h4 :id="params.titleId" :class="params.titleClass">{{ isNew ? '添加' : '编辑' }} - 产品</h4>
  202. </template>
  203. <el-form ref="ruleFormRef" :model="form" :rules="rules">
  204. <el-form-item label="产品名称:" class="m-b-6" :label-width="formLabelWidth" prop="T_name">
  205. <el-input v-model="form.T_name" type="text" autocomplete="off" placeholder="请输入产品名称" />
  206. </el-form-item>
  207. <el-form-item label="产品分类:" class="m-b-6" :label-width="formLabelWidth" prop="T_class">
  208. <el-select v-model="form.T_class" placeholder="请选择产品分类~">
  209. <el-option v-for="item in options" :key="item.Id" :label="item.T_name" :value="item.Id" />
  210. </el-select>
  211. </el-form-item>
  212. <el-form-item label="产品型号:" class="m-b-6" :label-width="formLabelWidth" prop="T_model">
  213. <el-input v-model="form.T_model" type="text" autocomplete="off" placeholder="请输入产品型号" />
  214. </el-form-item>
  215. <el-form-item label="产品规格:" class="m-b-6" :label-width="formLabelWidth" prop="T_spec">
  216. <el-input v-model="form.T_spec" type="text" autocomplete="off" placeholder="请选择产品规格" />
  217. </el-form-item>
  218. <el-form-item label="关联SN:" class="m-b-6" :label-width="formLabelWidth" prop="T_relation_sn">
  219. <el-radio-group v-model="form.T_relation_sn" class="ml-4">
  220. <el-radio :label="1">是</el-radio>
  221. <el-radio :label="0">否</el-radio>
  222. </el-radio-group>
  223. </el-form-item>
  224. <el-form-item label="产品图片:" class="m-b-6" :label-width="formLabelWidth" prop="T_img">
  225. <!-- <Upload ref="uploadRef" v-if="isNew || form.T_img" :isImg="true" :limit="1" v-model="form.T_img"></Upload> -->
  226. <Upload ref="uploadRef" :isImg="true" :limit="1" v-model="form.T_img" accept="image/*">
  227. <el-icon><Plus /></el-icon>
  228. </Upload>
  229. </el-form-item>
  230. <el-form-item label="备注:" class="m-b-6" :label-width="formLabelWidth" prop="T_remark">
  231. <el-input
  232. v-model="form.T_remark"
  233. :autosize="{ minRows: 4, maxRows: 6 }"
  234. type="textarea"
  235. placeholder="请输入备注信息"
  236. />
  237. </el-form-item>
  238. <el-form-item :label-width="formLabelWidth">
  239. <el-button v-if="isNew" color="#626aef" @click="AddProduction(ruleFormRef)">提交</el-button>
  240. <el-button v-else color="#626aef" @click="AddProduction(ruleFormRef)">修改</el-button>
  241. </el-form-item>
  242. </el-form>
  243. </Drawer>
  244. </div>
  245. </template>
  246. <style scoped lang="scss">
  247. @import '@/styles/var.scss';
  248. .tooltip-content {
  249. max-width: 500px;
  250. overflow-y: auto;
  251. }
  252. .production-list {
  253. @include f-direction;
  254. .input-suffix {
  255. width: 100%;
  256. .inline-flex {
  257. white-space: nowrap;
  258. }
  259. .btn {
  260. display: flex;
  261. justify-content: end;
  262. }
  263. .w-50 {
  264. width: 12.5rem;
  265. }
  266. }
  267. }
  268. </style>