upgradeDowngradeRecord.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. <!-- 模板区域 -->
  2. <template>
  3. <div>
  4. <PageMain class="vh100 flex-1 overflow-hidden flex flex-col">
  5. <el-tabs v-model="formInline.auditStatus" @tab-click="handleClick">
  6. <el-tab-pane :label="`待审核 (${pendingReview})`" name="0"></el-tab-pane>
  7. <el-tab-pane :label="`审核通过(${isApproved})`" name="1"></el-tab-pane>
  8. <el-tab-pane :label="`审核不通过(${isNotApproved})`" name="2"></el-tab-pane>
  9. </el-tabs>
  10. <SearchForm :fields="fields" :formInline="formInline" :onSearch="findpage" :onReset="resetForm" />
  11. <div class="flex-1 overflow-auto">
  12. <ComplexTable :tableData="tableData" :columns="columns" :showIndex="false" :columnwidth="250"
  13. :showOperation="formInline.auditStatus == '0' ? true : false" :showSelect="false" :pageInfo="pageInfo"
  14. @getList="getList">
  15. <!-- 自定义操作插槽 -->
  16. <template v-slot:operation="scope">
  17. <el-button v-if="scope.operationData.type == '0'" type="primary" link
  18. @click="isOperationPassed(scope.operationData)">通过</el-button>
  19. <el-button v-if="scope.operationData.type == '0'" type="primary" link
  20. @click="denyOperation(scope.operationData)">拒绝</el-button>
  21. <el-button v-if="scope.operationData.type == '1'" type="primary" link
  22. @click="unlockLevel(scope.operationData)">解锁等级</el-button>
  23. </template>
  24. <!-- 自定义插槽 -->
  25. <template #customSlot="{ bodyCell: { scope, column } }">
  26. <template v-if="column.prop == 'conditions'">
  27. <el-popover placement="bottom" :width="250" trigger="click">
  28. <template #default>
  29. <div v-html="scope.row.conditions"></div>
  30. </template>
  31. <template #reference>
  32. <el-button link type="primary">查看规则</el-button>
  33. </template>
  34. </el-popover>
  35. </template>
  36. <template v-if="column.prop == 'rules'">
  37. <el-popover placement="bottom" :width="250" trigger="click">
  38. <template #default>
  39. <div v-html="scope.row.rules"></div>
  40. </template>
  41. <template #reference>
  42. <el-button link type="primary">查看规则</el-button>
  43. </template>
  44. </el-popover>
  45. </template>
  46. </template>
  47. <!-- 自定义表头插槽 -->
  48. <template v-slot:search="scope">
  49. {{ scope.slotData.label }}
  50. </template>
  51. </ComplexTable>
  52. </div>
  53. </PageMain>
  54. <el-dialog v-model="upgradeReviewVisible" title="升级审核" width="400">
  55. <el-form :model="upgradeReviewInfo" label-width="180px" label-position="top">
  56. <el-form-item label="升级前">
  57. <el-input disabled v-model="upgradeReviewInfo.originalLevel" />
  58. </el-form-item>
  59. <el-form-item label="升级后">
  60. <el-input disabled v-model="upgradeReviewInfo.afterChange" />
  61. </el-form-item>
  62. <el-form-item :label="`升级后${upgradeReviewInfo.originalLevel}佣金比例`" v-if="auditCommissionshow">
  63. <el-input v-model="upgradeReviewInfo.auditCommission">
  64. <template #append>%</template>
  65. </el-input>
  66. </el-form-item>
  67. </el-form>
  68. <template #footer>
  69. <div class="dialog-footer">
  70. <el-button @click="upgradeReviewVisible = false">取消</el-button>
  71. <el-button type="primary" @click="upgradeReviewsubmit">
  72. 审核通过
  73. </el-button>
  74. </div>
  75. </template>
  76. </el-dialog>
  77. <el-dialog v-model="OperationVisible" title="驳回原因" width="400">
  78. <el-input type="textarea" :rows="3" placeholder="请输入内容" v-model="rejectReason" maxlength="200" show-word-limit>
  79. </el-input>
  80. <template #footer>
  81. <div class="dialog-footer">
  82. <el-button @click="OperationVisible = false">取消</el-button>
  83. <el-button type="primary" @click="OperationVisiblesubmit">
  84. 确定
  85. </el-button>
  86. </div>
  87. </template>
  88. </el-dialog>
  89. <el-dialog v-model="unlockLevelVisible" title="解锁等级" width="500">
  90. <el-form :model="unlockLevelInfo" label-width="180px" label-position="top">
  91. <el-form-item label="支付金额">
  92. <el-input v-model="unlockLevelInfo.paymentAmount">
  93. <template #append>%</template>
  94. </el-input>
  95. </el-form-item>
  96. <el-form-item label="收款凭证">
  97. <el-upload v-model:file-list="fileList" :limit="1" :auto-upload="false" @change="handleChange"
  98. list-type="picture-card">
  99. <el-icon>
  100. <Plus />
  101. </el-icon>
  102. </el-upload>
  103. </el-form-item>
  104. </el-form>
  105. <template #footer>
  106. <div class="dialog-footer">
  107. <el-button @click="unlockLevelVisible = false">取消</el-button>
  108. <el-button type="primary" @click="confirmUnlock">
  109. 确定解锁
  110. </el-button>
  111. </div>
  112. </template>
  113. </el-dialog>
  114. </div>
  115. </template>
  116. <!-- 行为区域 -->
  117. <script lang='ts' setup>
  118. import { ref, reactive, onBeforeMount } from 'vue'
  119. import { ElMessage, ElMessageBox } from 'element-plus'
  120. import type { UploadUserFile } from 'element-plus'
  121. import api from '@/api'
  122. // 页面加载时获取机构列表
  123. onBeforeMount(() => {
  124. getGradeOptions();
  125. findpage();
  126. });
  127. interface PageInfo {
  128. pageNum: number;
  129. pageSize: number;
  130. sizes: number[];
  131. total: number;
  132. }
  133. // 机构树相关变量
  134. const id = ref("");//选中的id
  135. const pendingReview = ref(0);//待审核条数
  136. const isApproved = ref(0);//已审核条数
  137. const isNotApproved = ref(0);//审核不通过条数
  138. const upgradeReviewVisible = ref(false);//升级审核弹窗是否显示
  139. const OperationVisible = ref(false);//拒绝操作弹窗是否显示
  140. const auditCommissionshow = ref(true);//是否显示佣金比例
  141. const unlockLevelVisible = ref(false);//解锁等级弹窗是否显示
  142. const upgradeType = ref("");//升级类型
  143. const rejectReason = ref("");//拒绝原因
  144. const fileList = ref<UploadUserFile[]>([
  145. ])
  146. const upgradeReviewInfo = reactive({
  147. originalLevel: "",//原等级
  148. afterChange: "",//变更后等级
  149. auditCommission: "",//比例
  150. });//升级审核表单
  151. const unlockLevelInfo = reactive({
  152. paymentAmount: 0,//支付金额
  153. fileId: '',//图片id
  154. recordId: "",//数据id
  155. });
  156. const tableData = ref([
  157. ]);//表格数据
  158. const formInline = reactive({
  159. name: "",//姓名
  160. mobile: "",//手机号
  161. userId: "",//工号
  162. type: "",//类型
  163. applyTimes: [],//申请时间
  164. auditStatus: '0',
  165. })
  166. const pageInfo = ref({
  167. pageNum: 1,
  168. pageSize: 20,
  169. sizes: [10, 20, 30, 40, 50],
  170. total: 0,
  171. });
  172. const typeOptions = ref([
  173. {
  174. label: '全部',
  175. value: ' '
  176. },
  177. {
  178. label: '升级',
  179. value: '0'
  180. }, {
  181. label: '降级',
  182. value: '1'
  183. },
  184. ])
  185. //表格字段数据
  186. const fields = ref([
  187. { label: "姓名", model: "name", type: "input", placeholder: "请输入姓名" },
  188. {
  189. label: "手机号", model: "mobile", type: "input", placeholder: "请输入手机号"
  190. },
  191. {
  192. label: "工号", model: "userId", type: "input", placeholder: "请输入工号"
  193. },
  194. {
  195. label: "类型", model: "type", type: "select", placeholder: "选择类型", options: typeOptions.value
  196. },
  197. {
  198. label: "申请时间", model: "applyTimes", type: "date", dateType: "daterange", startplaceholder: "开始时间", endplaceholder: "结束时间",
  199. format: "YYYY-MM-DD", valueFormat: "YYYY-MM-DD",
  200. },
  201. ]);
  202. const columns = [
  203. { prop: "name", label: "姓名", },
  204. { prop: "mobile", label: "手机号", width: '200' },
  205. { prop: "userId", label: "工号", width: '200' },
  206. { prop: "deptName", label: "所属机构", width: '200' },
  207. {
  208. prop: "type", label: "类型", width: '200',
  209. formatter: (row: any) => {
  210. if (row.type === '0') {
  211. return '升级';
  212. } else if (row.type === '1') {
  213. return '降级';
  214. } else {
  215. return '未知类型';
  216. }
  217. }
  218. },
  219. {
  220. prop: "originalLevel", label: "原等级", width: '200',
  221. formatter: (row: any) => {
  222. return userGradeList.value?.find((item: any) => item.grade == row.originalLevel)?.gradeName || '未知等级';
  223. }
  224. },
  225. {
  226. prop: "afterChange", label: "变更后等级", width: '200',
  227. formatter: (row: any) => {
  228. return userGradeList.value?.find((item: any) => item.grade == row.afterChange)?.gradeName || '未知等级';
  229. }
  230. },
  231. {
  232. prop: "conditions", label: "升级条件", width: '200', component: "customSlot",
  233. },
  234. { prop: "rules", label: "考核规则", width: '200', component: "customSlot", },
  235. { prop: "rejectReason", label: "驳回原因", width: '200' },
  236. { prop: "createTime", label: "申请时间", width: '200' },
  237. ];
  238. // 通过
  239. const isOperationPassed = (item: any) => {
  240. console.log(item)
  241. if (item.afterChange == item.originalLevel) {
  242. auditCommissionshow.value = false;
  243. }
  244. id.value = item.id;
  245. upgradeType.value = item.upgradeType;
  246. upgradeReviewVisible.value = true;
  247. upgradeReviewInfo.originalLevel = userGradeList.value.find(val => val.grade == item.originalLevel).gradeName;
  248. upgradeReviewInfo.afterChange = userGradeList.value.find(val => val.grade == item.afterChange).gradeName;
  249. }
  250. // 拒绝操作
  251. const denyOperation = (item: any) => {
  252. OperationVisible.value = true;
  253. id.value = item.id;
  254. }
  255. // 解锁等级
  256. const unlockLevel = (item: any) => {
  257. api.partnerApi.unlockLevels(item.originalLevel).then((res: any) => {
  258. if (res.code == '200') {
  259. unlockLevelInfo.recordId = item.id;
  260. // 使用JavaScript原生方法计算
  261. if (item.frozenAmount) {
  262. // 先将数值转换为字符串处理,避免浮点精度问题
  263. const frozenAmount = Number(item.frozenAmount);
  264. const rate = Number(res.data);
  265. // 计算并保留适当的小数位数
  266. unlockLevelInfo.paymentAmount = Number((frozenAmount * rate / 100).toFixed(2));
  267. } else {
  268. unlockLevelInfo.paymentAmount = 0;
  269. }
  270. unlockLevelVisible.value = true;
  271. } else {
  272. ElMessage.error(res.msg)
  273. }
  274. });
  275. }
  276. // 升级审核提交
  277. const upgradeReviewsubmit = () => {
  278. api.partnerApi[upgradeType.value == '1' ? 'liftingRecorddowngradeAudit' : 'liftingRecordaudit']({
  279. id: id.value,
  280. auditStatus: "1",
  281. auditCommission: upgradeReviewInfo.auditCommission,
  282. }).then((res: any) => {
  283. if (res.code == '200') {
  284. ElMessage.success(res.msg)
  285. upgradeReviewVisible.value = false;
  286. findpage();
  287. } else {
  288. ElMessage.error(res.msg)
  289. }
  290. });
  291. }
  292. const OperationVisiblesubmit = () => {
  293. api.partnerApi[upgradeType.value == '1' ? 'liftingRecorddowngradeAudit' : 'liftingRecordaudit']({
  294. id: id.value,
  295. auditStatus: "2",
  296. rejectReason: rejectReason.value,
  297. }).then((res: any) => {
  298. if (res.code == '200') {
  299. ElMessage.success(res.msg)
  300. OperationVisible.value = false;
  301. findpage();
  302. } else {
  303. ElMessage.error(res.msg)
  304. }
  305. });
  306. }
  307. // 解锁等级
  308. const confirmUnlock = () => {
  309. api.partnerApi.confirmUnlocking(unlockLevelInfo).then((res: any) => {
  310. if (res.code == '200') {
  311. ElMessage({
  312. type: 'success',
  313. message: res.msg,
  314. });
  315. unlockLevelVisible.value = false;
  316. findpage();
  317. } else {
  318. ElMessage({
  319. type: 'error',
  320. message: res.msg,
  321. });
  322. }
  323. });
  324. }
  325. // 处理文件上传
  326. const handleChange = (file: any, FileList: any) => {
  327. let files = file.raw
  328. const params = new FormData(); // 声明formData数据类型
  329. params.append("file", files);
  330. api.commonApi.fileUpload(params).then((res: any) => {
  331. if (res.code == '200') {
  332. unlockLevelInfo.fileId = res.data.id;
  333. } else {
  334. ElMessage.error(res.msg)
  335. }
  336. });
  337. };
  338. // 处理点击事件
  339. const handleClick = (tab: any) => {
  340. formInline.auditStatus = tab.props.name;
  341. console.log(formInline.auditStatus);
  342. findpage();
  343. };
  344. //分页事件
  345. function getList(item: PageInfo) {
  346. pageInfo.value.pageNum = item.pageNum;
  347. pageInfo.value.pageSize = item.pageSize;
  348. findpage();
  349. };
  350. const resetForm = () => {
  351. findpage();
  352. }
  353. //数据查询
  354. function findpage() {
  355. api.partnerApi.liftingRecordQueryPage({ pages: pageInfo.value.pageNum, size: pageInfo.value.pageSize, ...formInline }).then((res: any) => {
  356. if (res.code == '200') {
  357. tableData.value = res.data.records;
  358. pageInfo.value.pageNum = res.data.current;
  359. pageInfo.value.pageSize = res.data.size;
  360. pageInfo.value.total = res.data.total;
  361. } else {
  362. }
  363. });
  364. }
  365. // 获取人员等级列表
  366. const userGradeList = ref()
  367. const getGradeOptions = () => {
  368. api.partnerApi.queryGradeName().then((res: any) => {
  369. if (res.code === 200) {
  370. userGradeList.value = res.data;
  371. }
  372. })
  373. }
  374. </script>
  375. <!-- 样式区域 -->
  376. <style lang='scss' scoped>
  377. .custom-tree-node {
  378. flex: 1;
  379. display: flex;
  380. align-items: center;
  381. justify-content: space-between;
  382. font-size: 14px;
  383. padding-right: 8px;
  384. }
  385. :deep(.el-dropdown-link) {
  386. cursor: pointer;
  387. color: var(--el-color-primary);
  388. display: flex;
  389. align-items: center;
  390. margin-left: 15px;
  391. }
  392. </style>