index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. <template>
  2. <div class="p-2">
  3. <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
  4. <div v-show="showSearch" class="mb-[10px]">
  5. <el-card shadow="hover">
  6. <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="100px">
  7. <el-form-item label="供应商编号" prop="supplierNo">
  8. <el-input v-model="queryParams.supplierNo" placeholder="供应商编号" clearable @keyup.enter="handleQuery" />
  9. </el-form-item>
  10. <el-form-item label="供应商名称" prop="enterpriseName">
  11. <el-input v-model="queryParams.enterpriseName" placeholder="供应商名称" clearable @keyup.enter="handleQuery" />
  12. </el-form-item>
  13. <el-form-item label="供应商类型" prop="supplierType">
  14. <el-select v-model="queryParams.supplierType" placeholder="请选择供应商类型" clearable>
  15. <el-option v-for="item in supplierTypeList" :key="item.typeId" :label="item.typeName" :value="item.typeId" />
  16. </el-select>
  17. </el-form-item>
  18. <el-form-item label="供应品牌" prop="operatingBrand">
  19. <el-input v-model="queryParams.operatingBrand" placeholder="供应品牌" clearable @keyup.enter="handleQuery" />
  20. </el-form-item>
  21. <el-form-item label="供应类别" prop="operatingCategory">
  22. <el-select v-model="queryParams.operatingCategory" placeholder="请选择供应类别" clearable>
  23. <el-option v-for="item in productCategoryList" :key="item.id" :label="item.categoryName" :value="item.id" />
  24. </el-select>
  25. </el-form-item>
  26. <el-form-item label="供应区域" prop="province">
  27. <el-input v-model="queryParams.province" placeholder="供应区域(省)" clearable @keyup.enter="handleQuery" />
  28. </el-form-item>
  29. <el-form-item label="供应区域" prop="city">
  30. <el-input v-model="queryParams.city" placeholder="供应区域(市)" clearable @keyup.enter="handleQuery" />
  31. </el-form-item>
  32. <el-form-item label="产品经理" prop="productManager">
  33. <el-select v-model="queryParams.productManager" placeholder="请选择产品经理" clearable>
  34. <el-option v-for="item in comStaffList" :key="item.staffId" :label="item.staffName" :value="item.staffId" />
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item label="采购人员" prop="buyer">
  38. <el-select v-model="queryParams.buyer" placeholder="请选择采购人员" clearable>
  39. <el-option v-for="item in comStaffList" :key="item.staffId" :label="item.staffName" :value="item.staffId" />
  40. </el-select>
  41. </el-form-item>
  42. <el-form-item>
  43. <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
  44. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  45. </el-form-item>
  46. </el-form>
  47. </el-card>
  48. </div>
  49. </transition>
  50. <el-card shadow="never">
  51. <template #header>
  52. <el-row :gutter="10" class="mb8">
  53. <el-col :span="1.5" >
  54. 供应商信息列表
  55. </el-col>
  56. </el-row>
  57. </template>
  58. <el-table v-loading="loading" border :data="infoList" class="no-resize-table" @selection-change="handleSelectionChange">
  59. <el-table-column label="供应商编号" align="center" prop="supplierNo" width="150" fixed="left" />
  60. <el-table-column label="供应商名称" align="left" prop="enterpriseName" width="250" fixed="left" />
  61. <el-table-column label="供应商类型" align="center" prop="supplierTypeName" width="200">
  62. </el-table-column>
  63. <el-table-column label="产品经理" align="center" prop="productManager" width="150" />
  64. <el-table-column label="采购人员" align="center" prop="buyer" width="150" />
  65. <el-table-column label="上架产品数" align="center" prop="listedNum" width="150" />
  66. <el-table-column label="供应品牌" align="center" prop="brandName" width="200" />
  67. <el-table-column label="供应区域(省)" align="left" prop="province" width="250" />
  68. <el-table-column label="供应区域(市)" align="left" prop="city" width="300" />
  69. <el-table-column label="审核状态" align="center" prop="supplyStatus" width="150">
  70. <template #default="scope">
  71. <span>{{ getStatusDisplayName(scope.row.supplyStatus) }}</span>
  72. </template>
  73. </el-table-column>
  74. <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="250" fixed="right">
  75. <template #default="scope">
  76. <el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['customer:info:edit']">编辑</el-button>
  77. <el-button link type="primary" @click="handleStopCooperation(scope.row)" v-hasPermi="['customer:info:edit']">恢复合作</el-button>
  78. </template>
  79. </el-table-column>
  80. </el-table>
  81. <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
  82. </el-card>
  83. </div>
  84. </template>
  85. <script setup name="None" lang="ts">
  86. import { getInfoList, getInfo, delInfo, addInfo, updateInfo, getComSupTyList, getProductCategoryList, getComStaffList } from '@/api/customer/info';
  87. import { InfoVO, InfoQuery, InfoForm } from '@/api/customer/info/types';
  88. import { getSupplierStatusOptions, getSupplierStatusDisplayName } from '@/enums/supplierStatus';
  89. import { getSupplierCooperationStatusDisplayName } from '@/enums/supplierCooperationStatus';
  90. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  91. const infoList = ref<InfoVO[]>([]);
  92. const buttonLoading = ref(false);
  93. const loading = ref(true);
  94. const showSearch = ref(true);
  95. const ids = ref<Array<string | number>>([]);
  96. const single = ref(true);
  97. const multiple = ref(true);
  98. const total = ref(0);
  99. const supplierTypeList = ref<{ typeId: string; typeName: string }[]>([]);
  100. const productCategoryList = ref<{ categoryNo: string; categoryName: string; id?: number }[]>([]);
  101. const comStaffList = ref<{ staffId: string; staffName: string }[]>([]);
  102. const queryFormRef = ref<ElFormInstance>();
  103. const data = reactive<{ queryParams: InfoQuery }>({
  104. queryParams: {
  105. pageNum: 1,
  106. pageSize: 10,
  107. supplierNo: undefined,
  108. enterpriseName: undefined,
  109. supplierType: undefined,
  110. operatingBrand: undefined,
  111. operatingCategory: undefined,
  112. province: undefined,
  113. city: undefined,
  114. productManager: undefined,
  115. buyer: undefined,
  116. supplyStatus: '2', // 固定为2
  117. params: {}
  118. }
  119. });
  120. const { queryParams } = toRefs(data);
  121. /** 查询供应商信息列表 */
  122. const getList = async () => {
  123. loading.value = true;
  124. // 确保 supplyStatus 始终为 2
  125. queryParams.value.supplyStatus = '2';
  126. const res = await getInfoList(queryParams.value);
  127. infoList.value = res.rows;
  128. total.value = res.total;
  129. loading.value = false;
  130. }
  131. /** 搜索按钮操作 */
  132. const handleQuery = () => {
  133. queryParams.value.pageNum = 1;
  134. getList();
  135. }
  136. /** 重置按钮操作 */
  137. const resetQuery = () => {
  138. queryFormRef.value?.resetFields();
  139. // 重置后仍然保持 supplyStatus = 2
  140. queryParams.value.supplyStatus = '2';
  141. handleQuery();
  142. }
  143. /** 多选框选中数据 */
  144. const handleSelectionChange = (selection: InfoVO[]) => {
  145. ids.value = selection.map(item => item.id);
  146. single.value = selection.length != 1;
  147. multiple.value = !selection.length;
  148. }
  149. /** 新增按钮操作 */
  150. const handleAdd = () => {
  151. // 新增逻辑
  152. }
  153. /** 修改按钮操作 */
  154. const handleUpdate = async (row?: InfoVO) => {
  155. const router = proxy?.$router;
  156. const _id = row?.id || ids.value[0];
  157. router?.push({
  158. path: '/customer/info/detail',
  159. query: {
  160. id: _id,
  161. mode: 'edit'
  162. }
  163. });
  164. }
  165. /** 删除按钮操作 */
  166. const handleDelete = async (row?: InfoVO) => {
  167. const _ids = row?.id || ids.value;
  168. await proxy?.$modal.confirm('是否确认删除供应商信息编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
  169. await delInfo(_ids);
  170. proxy?.$modal.msgSuccess("删除成功");
  171. await getList();
  172. }
  173. /** 查看按钮操作 */
  174. const handleView = (row: InfoVO) => {
  175. const router = proxy?.$router;
  176. router?.push({
  177. path: '/customer/info/detail',
  178. query: {
  179. id: row.id
  180. }
  181. });
  182. }
  183. /** 恢复合作按钮操作 */
  184. const handleStopCooperation = async (row: InfoVO) => {
  185. await proxy?.$modal.confirm('是否确认恢复与供应商"' + row.enterpriseName + '"的合作?');
  186. try {
  187. // 只传id和supplyStatus
  188. await updateInfo({
  189. id: row.id,
  190. supplyStatus: '1'
  191. });
  192. proxy?.$modal.msgSuccess("恢复合作成功");
  193. await getList();
  194. } catch (e) {
  195. console.error('恢复合作失败:', e);
  196. }
  197. }
  198. /** 获取供应商类型列表 */
  199. const getSupplierTypeList = async () => {
  200. try {
  201. const res = await getComSupTyList();
  202. supplierTypeList.value = res.data || res;
  203. } catch (e) {
  204. console.error('获取供应商类型失败', e);
  205. }
  206. }
  207. /** 获取产品分类列表 */
  208. const getProductCategoryData = async () => {
  209. try {
  210. const res = await getProductCategoryList();
  211. productCategoryList.value = res.data;
  212. } catch (e) {
  213. console.error('获取产品分类失败', e);
  214. }
  215. }
  216. /** 根据typeId获取typeName */
  217. const getSupplierTypeName = (typeId: string) => {
  218. const item = supplierTypeList.value.find(t => t.typeId === typeId);
  219. return item ? item.typeName : typeId;
  220. }
  221. /** 根据状态码获取状态显示名称 */
  222. const getStatusDisplayName = (statusCode: number) => {
  223. return getSupplierStatusDisplayName(statusCode);
  224. }
  225. /** 根据合作状态码获取合作状态显示名称 */
  226. const getCooperationStatusDisplayName = (statusCode: number) => {
  227. return getSupplierCooperationStatusDisplayName(statusCode);
  228. }
  229. onMounted(async () => {
  230. getSupplierTypeList();
  231. getProductCategoryData();
  232. try {
  233. const staffRes = await getComStaffList({ pageNum: 1, pageSize: 100000 });
  234. comStaffList.value = staffRes.rows || [];
  235. } catch (e) {
  236. console.error('人员接口调用失败:', e);
  237. }
  238. getList();
  239. // 禁用表格列宽调整
  240. nextTick(() => {
  241. const table = document.querySelector('.no-resize-table');
  242. if (table) {
  243. table.addEventListener('mousedown', (e: any) => {
  244. const target = e.target as HTMLElement;
  245. // 阻止在表头边界处的鼠标按下事件
  246. if (target.classList.contains('el-table__column-resize-proxy') ||
  247. target.closest('.el-table__column-resize-proxy')) {
  248. e.preventDefault();
  249. e.stopPropagation();
  250. return false;
  251. }
  252. }, true);
  253. }
  254. });
  255. });
  256. </script>
  257. <style scoped>
  258. :deep(.el-form-item__label) {
  259. text-align: left !important;
  260. }
  261. :deep(.el-form-item) {
  262. margin-right: 30px;
  263. margin-bottom: 20px;
  264. }
  265. /* 禁用表格列宽拖动 */
  266. .no-resize-table :deep(th.el-table__cell) {
  267. user-select: none !important;
  268. resize: none !important;
  269. cursor: default !important;
  270. }
  271. .no-resize-table :deep(.el-table__header-wrapper th) {
  272. cursor: default !important;
  273. }
  274. .no-resize-table :deep(.el-table__header-wrapper .el-table__cell:hover) {
  275. cursor: default !important;
  276. }
  277. .no-resize-table :deep(.el-table__header-wrapper) {
  278. cursor: default !important;
  279. }
  280. /* 隐藏列宽调整的分隔线悬停效果 */
  281. .no-resize-table :deep(th.el-table__cell:hover) {
  282. cursor: default !important;
  283. }
  284. .no-resize-table :deep(.el-table__header th.el-table__cell) {
  285. border-right: 1px solid #EBEEF5;
  286. }
  287. /* 禁用拖动事件 */
  288. .no-resize-table :deep(.el-table__header-wrapper) {
  289. pointer-events: auto;
  290. }
  291. .no-resize-table :deep(.el-table__header th) {
  292. pointer-events: auto;
  293. }
  294. .no-resize-table :deep(.el-table__header .cell) {
  295. pointer-events: auto;
  296. }
  297. </style>