You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

515 lines
15 KiB

2 months ago
  1. <template>
  2. <div class="mod-config">
  3. <el-form :inline="true" label-position="top" :model="searchData">
  4. <el-form-item label="付款条款编码">
  5. <el-input v-model="searchData.paymentTermId" clearable style="width: 120px"></el-input>
  6. </el-form-item>
  7. <el-form-item label="付款条款描述">
  8. <el-input v-model="searchData.paymentTerm" clearable style="width: 200px"></el-input>
  9. </el-form-item>
  10. <el-form-item label="启用">
  11. <el-select v-model="searchData.active" clearable style="width: 120px">
  12. <el-option label="Y" value="Y"></el-option>
  13. <el-option label="N" value="N"></el-option>
  14. </el-select>
  15. </el-form-item>
  16. <el-form-item label=" ">
  17. <el-button v-if="authSearch" type="primary" @click="getDataList()">查询</el-button>
  18. <el-button v-if="authSave" type="primary" @click="addModal()">新增</el-button>
  19. <!-- <el-button @click="exportExcel()" type="primary" style="margin-left: 2px">导出</el-button>-->
  20. </el-form-item>
  21. </el-form>
  22. <el-table
  23. :height="height"
  24. :data="dataList"
  25. border
  26. v-loading="dataListLoading"
  27. style="width: 100%;">
  28. <el-table-column
  29. v-for="(item,index) in columnList" :key="index"
  30. :sortable="item.columnSortable"
  31. :prop="item.columnProp"
  32. :header-align="item.headerAlign"
  33. :show-overflow-tooltip="item.showOverflowTooltip"
  34. :align="item.align"
  35. :fixed="item.fixed == '' ? false : item.fixed"
  36. :min-width="item.columnWidth"
  37. :label="item.columnLabel">
  38. <template slot-scope="scope">
  39. <span v-if="!item.columnHidden">
  40. <span v-if="columnsProp.includes(item.columnProp)">
  41. {{ scope.row[`${item.columnProp}Desc`] }}
  42. </span>
  43. <span v-else>
  44. {{ item.columnProp === 'days' ? Math.floor(scope.row[item.columnProp]) : scope.row[item.columnProp] }}
  45. </span>
  46. </span>
  47. </template>
  48. </el-table-column>
  49. <el-table-column
  50. fixed="right"
  51. header-align="center"
  52. align="center"
  53. width="120"
  54. label="操作">
  55. <template slot-scope="scope">
  56. <el-link style="cursor: pointer" v-if="authUpdate" @click="updateModal(scope.row)">编辑 |</el-link>
  57. <el-link style="cursor: pointer" v-if="authDelete" @click="deletePaymentTerm(scope.row)">删除</el-link>
  58. </template>
  59. </el-table-column>
  60. </el-table>
  61. <!-- 分页栏 -->
  62. <el-pagination
  63. @size-change="sizeChangeHandle"
  64. @current-change="currentChangeHandle"
  65. :current-page="pageIndex"
  66. :page-sizes="[20, 50, 100, 200, 500]"
  67. :page-size="pageSize"
  68. :total="totalPage"
  69. layout="total, sizes, prev, pager, next, jumper">
  70. </el-pagination>
  71. <el-dialog title="付款条款" :close-on-click-modal="false" v-drag :visible.sync="modalFlag" width="560px">
  72. <el-form label-position="top" :model="modalData" :rules="rules" style="margin-left: 7px; margin-right: 7px;" ref="modalForm">
  73. <el-row :gutter="24">
  74. <el-col :span="12">
  75. <el-form-item label="付款条款编码" prop="paymentTermId">
  76. <el-input v-model="modalData.paymentTermId" :disabled="modalDisableFlag"></el-input>
  77. </el-form-item>
  78. </el-col>
  79. <el-col :span="12">
  80. <el-form-item label="启用" prop="active">
  81. <el-select v-model="modalData.active" style="width: 100%">
  82. <el-option label="Y" value="Y"></el-option>
  83. <el-option label="N" value="N"></el-option>
  84. </el-select>
  85. </el-form-item>
  86. </el-col>
  87. </el-row>
  88. <el-row :gutter="24">
  89. <el-col :span="12">
  90. <el-form-item label="天数" prop="days">
  91. <el-input v-model.number="modalData.days"></el-input>
  92. </el-form-item>
  93. </el-col>
  94. <el-col :span="12">
  95. <el-form-item label="类型" prop="type">
  96. <el-input v-model="modalData.type"></el-input>
  97. </el-form-item>
  98. </el-col>
  99. </el-row>
  100. <el-row :gutter="24">
  101. <el-col :span="24">
  102. <el-form-item label="付款条款描述" prop="paymentTerm">
  103. <el-input v-model="modalData.paymentTerm" style="width: 100%"></el-input>
  104. </el-form-item>
  105. </el-col>
  106. </el-row>
  107. </el-form>
  108. <el-footer style="height:40px;margin-top: 20px;text-align:center">
  109. <el-button type="primary" @click="saveData()">保存</el-button>
  110. <el-button type="primary" @click="modalFlag = false">关闭</el-button>
  111. </el-footer>
  112. </el-dialog>
  113. </div>
  114. </template>
  115. <script>
  116. import {
  117. getPaymentTermListPaging,
  118. savePaymentTerm,
  119. updatePaymentTerm,
  120. deletePaymentTerm
  121. } from "@/api/baseInformation/srmPaymentTerm.js"
  122. import excel from "@/utils/excel-util.js";
  123. export default {
  124. data () {
  125. return {
  126. columnsProp:['createdBy','updateBy','status'],
  127. // 导出
  128. exportName: "付款条款" + this.dayjs().format('YYYYMMDDHHmmss'),
  129. searchData: {
  130. site: this.$store.state.user.site,
  131. paymentTermId: '',
  132. paymentTerm: '',
  133. active: '',
  134. days: '',
  135. type: '',
  136. page: 1,
  137. limit: 10,
  138. },
  139. height: 200,
  140. pageIndex: 1,
  141. pageSize: 20,
  142. totalPage: 0,
  143. dataList: [],
  144. dataListLoading: false,
  145. modalFlag: false,
  146. modalDisableFlag: false,
  147. modalData: {
  148. paymentTermId: '',
  149. paymentTerm: '',
  150. site: this.$store.state.user.site,
  151. active: '',
  152. days: '',
  153. type: '',
  154. createBy: this.$store.state.user.name,
  155. updateBy: this.$store.state.user.name
  156. },
  157. // 展示列集
  158. columnList: [
  159. {
  160. userId: this.$store.state.user.name,
  161. functionId: '9003',
  162. serialNumber: '9003TablePaymentTermId',
  163. tableId: '9003Table',
  164. tableName: "付款条款表",
  165. columnProp: 'paymentTermId',
  166. headerAlign: "center",
  167. align: "left", // 修改为左对齐顶格显示
  168. columnLabel: '付款条款编码',
  169. columnHidden: false,
  170. columnImage: false,
  171. columnSortable: false,
  172. sortLv: 0,
  173. status: true,
  174. fixed: '',
  175. columnWidth: 120
  176. },
  177. {
  178. userId: this.$store.state.user.name,
  179. functionId: '9003',
  180. serialNumber: '9003TablePaymentTerm',
  181. tableId: "9003Table",
  182. tableName: "付款条款表",
  183. columnProp: 'paymentTerm',
  184. headerAlign: "center",
  185. align: "left",
  186. columnLabel: '付款条款描述',
  187. columnHidden: false,
  188. columnImage: false,
  189. columnSortable: false,
  190. sortLv: 0,
  191. status: true,
  192. fixed: '',
  193. columnWidth: 200,
  194. },
  195. {
  196. userId: this.$store.state.user.name,
  197. functionId: '9003',
  198. serialNumber: '9003TableDays',
  199. tableId: "9003Table",
  200. tableName: "付款条款表",
  201. columnProp: 'days',
  202. headerAlign: "center",
  203. align: "right",
  204. columnLabel: '天数',
  205. columnHidden: false,
  206. columnImage: false,
  207. columnSortable: false,
  208. sortLv: 0,
  209. status: true,
  210. fixed: '',
  211. columnWidth: 80,
  212. },
  213. {
  214. userId: this.$store.state.user.name,
  215. functionId: '9003',
  216. serialNumber: '9003TableType',
  217. tableId: "9003Table",
  218. tableName: "付款条款表",
  219. columnProp: 'type',
  220. headerAlign: "center",
  221. align: "center",
  222. columnLabel: '类型',
  223. columnHidden: false,
  224. columnImage: false,
  225. columnSortable: false,
  226. sortLv: 0,
  227. status: true,
  228. fixed: '',
  229. columnWidth: 80,
  230. },
  231. {
  232. userId: this.$store.state.user.name,
  233. functionId: '9003',
  234. serialNumber: '9003TableActive',
  235. tableId: "9003Table",
  236. tableName: "付款条款表",
  237. columnProp: 'active',
  238. headerAlign: "center",
  239. align: "center",
  240. columnLabel: '启用',
  241. columnHidden: false,
  242. columnImage: false,
  243. columnSortable: false,
  244. sortLv: 0,
  245. status: true,
  246. fixed: '',
  247. columnWidth: 80,
  248. }
  249. ],
  250. rules: {
  251. paymentTermId: [
  252. {
  253. required: true,
  254. validator: this.validateField,
  255. trigger: 'blur'
  256. }
  257. ],
  258. paymentTerm: [
  259. {
  260. required: true,
  261. validator: this.validateField,
  262. trigger: 'blur'
  263. }
  264. ],
  265. days: [
  266. {
  267. validator: this.validateDays,
  268. trigger: 'blur'
  269. }
  270. ]
  271. },
  272. authSearch: false,
  273. authSave: false,
  274. authUpdate: false,
  275. authDelete: false,
  276. menuId: this.$route.meta.menuId || 'srmPaymentTerm',
  277. }
  278. },
  279. mounted () {
  280. this.$nextTick(() => {
  281. this.height = window.innerHeight - 180
  282. })
  283. },
  284. created () {
  285. // 按钮控制
  286. this.getButtonAuthData()
  287. // 无论是否有查询权限,都获取数据列表
  288. this.getDataList()
  289. },
  290. methods: {
  291. validateField(rule, value, callback) {
  292. if (!value || value.trim() === '') {
  293. callback(new Error(' '));
  294. } else {
  295. callback();
  296. }
  297. },
  298. validateDays(rule, value, callback) {
  299. if (!value || value.trim() === '') {
  300. callback(new Error(' '));
  301. return;
  302. }
  303. const numberPattern = /^\d+$/;
  304. if (!numberPattern.test(value)) {
  305. callback(new Error('请输入正确的天数'));
  306. } else {
  307. callback();
  308. }
  309. },
  310. // 每页数
  311. sizeChangeHandle (val) {
  312. this.pageSize = val
  313. this.pageIndex = 1
  314. this.getDataList()
  315. },
  316. // 当前页
  317. currentChangeHandle (val) {
  318. this.pageIndex = val
  319. this.getDataList()
  320. },
  321. async exportExcel() {
  322. const params = {
  323. ...this.searchData,
  324. limit: -1,
  325. page: 1
  326. };
  327. excel.exportTable({
  328. url: "/srmPaymentTerm/getPaymentTermListPaging",
  329. columnMapping: this.columnList,
  330. mergeSetting: [],
  331. params: params,
  332. fileName: this.exportName + ".xlsx",
  333. // 返回包含rows字段的对象,让excel工具能够正确提取数据
  334. rowFetcher: res => {
  335. if (res && res.data && res.data.code === 0) {
  336. return { rows: res.data.data || [] };
  337. }
  338. return { rows: [] };
  339. },
  340. columnFormatter: [],
  341. dropColumns: [],
  342. });
  343. },
  344. // 获取数据列表
  345. getDataList () {
  346. this.dataListLoading = true;
  347. // 准备请求参数
  348. const params = {
  349. ...this.searchData,
  350. site: this.$store.state.user.site, // 确保使用当前用户的站点
  351. page: this.pageIndex,
  352. limit: this.pageSize
  353. };
  354. getPaymentTermListPaging(params).then(({data}) => {
  355. if (data && data.code === 0) {
  356. const pageData = data.data || data.page;
  357. this.dataList = pageData && pageData.list ? pageData.list : pageData;
  358. if(pageData && pageData.currPage) {
  359. this.pageIndex = pageData.currPage;
  360. this.pageSize = pageData.pageSize;
  361. this.totalPage = pageData.totalCount;
  362. } else {
  363. // 如果返回的数据格式不包含分页信息,根据实际返回数据处理
  364. this.totalPage = this.dataList ? this.dataList.length : 0;
  365. }
  366. } else {
  367. this.$message.error(data.msg || '获取数据失败')
  368. }
  369. }).catch(error => {
  370. console.error('获取付款条款列表失败:', error)
  371. this.$message.error('获取数据失败: ' + (error.message || '网络错误'))
  372. }).finally(() => {
  373. this.dataListLoading = false;
  374. })
  375. },
  376. addModal () {
  377. this.modalData = {
  378. paymentTermId: '',
  379. paymentTerm: '',
  380. site: this.$store.state.user.site, // 使用当前用户默认站点
  381. active: 'Y',
  382. days: '',
  383. type: '',
  384. createBy: this.$store.state.user.name,
  385. updateBy: this.$store.state.user.name,
  386. flag: '1'
  387. }
  388. this.modalDisableFlag = false
  389. this.modalFlag = true
  390. this.$nextTick(() => {
  391. // 清除表单验证
  392. if (this.$refs.modalForm) {
  393. this.$refs.modalForm.clearValidate();
  394. }
  395. });
  396. },
  397. updateModal (row) {
  398. this.modalData = {
  399. paymentTermId: row.paymentTermId,
  400. paymentTerm: row.paymentTerm,
  401. site: row.site,
  402. active: row.active,
  403. days: row.days != null ? parseInt(row.days, 10) : '',
  404. type: row.type,
  405. createBy: row.createBy,
  406. updateBy: this.$store.state.user.name,
  407. flag: '2'
  408. }
  409. this.modalDisableFlag = true
  410. this.modalFlag = true
  411. this.$nextTick(() => {
  412. // 清除表单验证
  413. if (this.$refs.modalForm) {
  414. this.$refs.modalForm.clearValidate();
  415. }
  416. });
  417. },
  418. // 删除
  419. deletePaymentTerm (row) {
  420. this.$confirm(`确定删除此付款条款吗?条款代码:${row.paymentTermId}`, '提示', {
  421. confirmButtonText: '确定',
  422. cancelButtonText: '取消',
  423. type: 'warning'
  424. }).then(() => {
  425. const deleteData = {
  426. paymentTermId: row.paymentTermId,
  427. site: row.site
  428. };
  429. deletePaymentTerm(deleteData).then(({data}) => {
  430. if (data && data.code === 0) {
  431. this.getDataList()
  432. this.$message({
  433. message: '操作成功',
  434. type: 'success',
  435. duration: 1500,
  436. onClose: () => {}
  437. })
  438. } else {
  439. this.$alert(data.msg, '错误', {
  440. confirmButtonText: '确定'
  441. })
  442. }
  443. }).catch(error => {
  444. console.error('删除付款条款失败:', error)
  445. this.$message.error('删除失败: ' + (error.message || '网络错误'))
  446. })
  447. }).catch(() => {
  448. this.$message.info('已取消删除')
  449. })
  450. },
  451. saveData () {
  452. this.$refs.modalForm.validate(valid => {
  453. if (!valid) return
  454. this.modalData.days = parseInt(this.modalData.days, 10)
  455. const api = this.modalData.flag === '1'
  456. ? savePaymentTerm
  457. : updatePaymentTerm
  458. api(this.modalData).then(({ data }) => {
  459. if (data && data.code === 0) {
  460. this.$message.success('操作成功')
  461. this.modalFlag = false
  462. this.getDataList()
  463. } else {
  464. this.$alert(data.msg || '操作失败', '错误')
  465. }
  466. }).catch(err => {
  467. console.error(err)
  468. this.$message.error('请求失败')
  469. })
  470. })
  471. },
  472. //获取按钮的权限数据
  473. getButtonAuthData () {
  474. let searchFlag = this.isAuth(this.menuId+":search")
  475. let saveFlag = this.isAuth(this.menuId+":save")
  476. let updateFlag = this.isAuth(this.menuId+":update")
  477. let deleteFlag = this.isAuth(this.menuId+":delete")
  478. //处理页面的权限数据
  479. this.authSearch = !searchFlag
  480. this.authSave = !saveFlag
  481. this.authUpdate = !updateFlag
  482. this.authDelete = !deleteFlag
  483. },
  484. }
  485. }
  486. </script>
  487. <style scoped lang="scss">
  488. .el-table /deep/ .cell{
  489. height: auto;
  490. line-height: 1.5;
  491. }
  492. </style>