index.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. <template>
  2. <div class="p-2">
  3. <div class="search" v-show="showSearch">
  4. <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
  5. <el-form-item label="企业名称" prop="cpyName">
  6. <el-input v-model="queryParams.cpyName" placeholder="请输入企业名称" clearable style="width: 240px"
  7. @keyup.enter="handleQuery" />
  8. </el-form-item>
  9. <el-form-item label="日期范围" prop="dateRange">
  10. <el-date-picker clearable v-model="queryParams.dateRange" type="daterange" range-separator="至"
  11. start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYY-MM-DD" @change="handleDateRangeChange" />
  12. </el-form-item>
  13. <el-form-item label="审核状态" prop="reviewStatus">
  14. <el-select v-model="queryParams.reviewStatus" placeholder="请选择" clearable style="width: 240px">
  15. <el-option v-for="dict in cpy_res_status" :key="dict.value" :label="dict.label" :value="dict.value"
  16. @keyup.enter="handleQuery" />
  17. </el-select>
  18. </el-form-item>
  19. <el-form-item>
  20. <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
  21. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  22. </el-form-item>
  23. </el-form>
  24. </div>
  25. <el-card shadow="never">
  26. <template #header>
  27. <el-row :gutter="20" class="mb8">
  28. <el-col :span="2" v-for="level in memberLevelCountList" :key="level.type">
  29. <el-button type="text" @click="handleQuery(level)"
  30. :style="{ fontWeight: queryParams.vipLevel === level.type ? 'bold' : 'normal', color: queryParams.vipLevel === level.type ? 'black' : 'inherit' }">{{
  31. level.name }}({{ level.num }})</el-button>
  32. </el-col>
  33. <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
  34. </el-row>
  35. </template>
  36. <vxe-table :loading="loading" border :data="memberList">
  37. <vxe-column title="企业名称" align="center" field="cpyName" width="220" />
  38. <vxe-column title="法人姓名" align="center" field="legalPersonName" />
  39. <vxe-column title="法人电话" align="center" field="legalPersonPhone" width="150" />
  40. <vxe-column title="当前等级" align="center" field="vipLevel">
  41. <template #default="scope">
  42. <dict-tag :value="scope.row.vipLevel" :options="vip_level" />
  43. </template>
  44. </vxe-column>
  45. <vxe-column title="申请等级" align="center" field="applyLevel">
  46. <template #default="scope">
  47. <dict-tag :value="scope.row.applyLevel" :options="vip_level" />
  48. </template>
  49. </vxe-column>
  50. <vxe-column title="开始时间" align="center" field="startDate" width="100">
  51. <template #default="scope">
  52. <span>{{ parseTime(scope.row.startDate, '{y}-{m}-{d}') }}</span>
  53. </template>
  54. </vxe-column>
  55. <vxe-column title="结束时间" align="center" field="endDate" width="100">
  56. <template #default="scope">
  57. <span>{{ parseTime(scope.row.endDate, '{y}-{m}-{d}') }}</span>
  58. </template>
  59. </vxe-column>
  60. <!-- <vxe-column label="业务类型" align="center" prop="cpyBusType" /> -->
  61. <vxe-column title="审核状态" align="center" field="reviewStatus">
  62. <template #default="scope">
  63. <dict-tag :value="scope.row.reviewStatus" :options="cpy_res_status" />
  64. </template>
  65. </vxe-column>
  66. <vxe-column title="审核信息" align="center" field="reviewMsg" />
  67. <vxe-column title="审核时间" align="center" field="reviewTime" width="180">
  68. <template #default="scope">
  69. <span>{{ parseTime(scope.row.reviewTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
  70. </template>
  71. </vxe-column>
  72. <vxe-column title="创建时间" align="center" field="createTime" width="180">
  73. <template #default="scope">
  74. <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
  75. </template>
  76. </vxe-column>
  77. <!-- <vxe-column label="更新时间" align="center" prop="updateTime" width="180">
  78. <template #default="scope">
  79. <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
  80. </template>
  81. </vxe-column> -->
  82. <vxe-column title="操作" align="center" class-name="small-padding fixed-width">
  83. <template #default="scope">
  84. <el-button link type="primary" @click="showApp(scope.row)"
  85. v-if="scope.row.reviewStatus == '0'">审批</el-button>
  86. <el-button link type="primary" @click="memberDetail(scope.row)"
  87. v-if="scope.row.reviewStatus != '0'">详情</el-button>
  88. </template>
  89. </vxe-column>
  90. </vxe-table>
  91. <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
  92. v-model:limit="queryParams.pageSize" @pagination="getList" />
  93. </el-card>
  94. <!--审核弹窗-->
  95. <el-dialog :close-on-click-modal="false" :title="dialogApproval.title" v-model="dialogApproval.visible"
  96. width="1200px" append-to-body>
  97. <el-form ref="memberFormRef" :model="form" :rules="rules">
  98. <el-row :gutter="20">
  99. <el-col :span="8">
  100. <el-form-item label="企业名称" prop="cpyName">
  101. <el-text v-model="form.cpyName">{{ form.cpyName }}</el-text>
  102. </el-form-item>
  103. </el-col>
  104. <el-col :span="8">
  105. <el-form-item label="法人姓名" prop="legalPersonName">
  106. <el-text>{{ form.legalPersonName }}</el-text>
  107. </el-form-item>
  108. </el-col>
  109. <el-col :span="8">
  110. <el-form-item label="法人电话" prop="legalPersonPhone">
  111. <el-text>{{ form.legalPersonPhone }}</el-text>
  112. </el-form-item>
  113. </el-col>
  114. </el-row>
  115. <el-row :gutter="20">
  116. <el-col :span="8">
  117. <el-form-item label="法人职务" prop="legalPersonPosition">
  118. <el-text>{{ form.legalPersonPosition }}</el-text>
  119. </el-form-item>
  120. </el-col>
  121. <el-col :span="8">
  122. <el-form-item label="法人身份证正面图片" prop="legalPersonIdFront">
  123. <el-image :src="form.legalPersonIdFront" style="width: 100px; height: 100px" show-progress
  124. :preview-src-list="[form.legalPersonIdFront]" />
  125. </el-form-item>
  126. </el-col>
  127. <el-col :span="8">
  128. <el-form-item label="法人身份证背面图片" prop="legalPersonIdBack">
  129. <el-image :src="form.legalPersonIdBack" style="width: 100px; height: 100px" show-progress
  130. :preview-src-list="[form.legalPersonIdBack]" />
  131. </el-form-item>
  132. </el-col>
  133. </el-row>
  134. <el-row :gutter="20">
  135. <el-col :span="8">
  136. <el-form-item label="申请会员等级" prop="applyLevel">
  137. <dict-tag :value="form.applyLevel" :options="vip_level" />
  138. </el-form-item>
  139. </el-col>
  140. <el-col :span="8">
  141. <el-form-item label="邮箱" prop="email">
  142. <el-text>{{ form.email }}</el-text>
  143. </el-form-item>
  144. </el-col>
  145. <el-col :span="8">
  146. <el-form-item label="主管部门" prop="department">
  147. <el-text>{{ form.department }}</el-text>
  148. </el-form-item>
  149. </el-col>
  150. </el-row>
  151. <el-row :gutter="20">
  152. <el-col :span="8">
  153. <el-form-item label="总资产" prop="totalAssets">
  154. <el-text>{{ form.totalAssets }}</el-text>
  155. </el-form-item>
  156. </el-col>
  157. <el-col :span="8">
  158. <el-form-item label="单位简介" prop="introduction">
  159. <el-text>{{ form.introduction }}</el-text>
  160. </el-form-item>
  161. </el-col>
  162. <el-col :span="8">
  163. <el-form-item label="入会目的" prop="membershipPurpose">
  164. <el-text>{{ form.membershipPurpose }}</el-text>
  165. </el-form-item>
  166. </el-col>
  167. </el-row>
  168. <el-row :gutter="20">
  169. <el-col :span="8">
  170. <el-form-item label="当前会员等级" prop="vipLevel">
  171. <dict-tag :value="form.vipLevel" :options="vip_level" />
  172. </el-form-item>
  173. </el-col>
  174. <el-col :span="8">
  175. <el-form-item label="开始时间" prop="startDate">
  176. <el-text>{{ form.startDate }}</el-text>
  177. </el-form-item>
  178. </el-col>
  179. <el-col :span="8">
  180. <el-form-item label="结束时间" prop="endDate">
  181. <el-text>{{ form.endDate }}</el-text>
  182. </el-form-item>
  183. </el-col>
  184. </el-row>
  185. <el-table v-loading="loading" :data="form.plantingInfo">
  186. <vxe-column label="品种名称" align="center" prop="variety" />
  187. <vxe-column label="种植面积" align="center" prop="plantingArea" />
  188. <vxe-column label="种植地点" align="center" prop="plantingPlace" />
  189. </el-table>
  190. <el-row :gutter="20">
  191. <el-col>
  192. <el-form-item label="荣誉证书" prop="companyCertificate">
  193. <el-image :src="form.companyCertificate" style="width: 100px; height: 100px" show-progress
  194. :preview-src-list="form.companyCertificate" />
  195. </el-form-item>
  196. </el-col>
  197. </el-row>
  198. </el-form>
  199. <el-form ref="approvalLogFormRef" :model="approvalForm" :rules="approvalRules" label-width="80px">
  200. <el-form-item label="审批类型" prop="reviewStatus">
  201. <el-select v-model="approvalForm.reviewStatus" placeholder="请选择" clearable style="width: 100%"
  202. @change="showRefuse">
  203. <template v-for="dict in cpy_res_status">
  204. <el-option v-if="dict.value != '0'" :key="dict.value" :label="dict.label" :value="dict.value" />
  205. </template>
  206. </el-select>
  207. </el-form-item>
  208. <el-form-item label="审批理由" prop="msg" v-if="refuseShow">
  209. <el-input type="textarea" v-model="approvalForm.reviewMsg" placeholder="请输入拒绝理由" />
  210. </el-form-item>
  211. </el-form>
  212. <template #footer>
  213. <div class="dialog-footer">
  214. <el-button :loading="buttonLoading" type="primary" @click="confirmApp">确 定</el-button>
  215. <el-button @click="cancelApp">取 消</el-button>
  216. </div>
  217. </template>
  218. </el-dialog>
  219. </div>
  220. </template>
  221. <script setup name="Member" lang="ts">
  222. import { listMember, getMember, delMember, addMember, updateMember, countLevelMember } from '@/api/dgtmedicine/member';
  223. import { approvalMember } from '@/api/dgtmedicine/approvalLog';
  224. import { MemberVO, MemberQuery, MemberForm, MemberLevelCountVO } from '@/api/dgtmedicine/member/types';
  225. import { ApprovalLogQuery, ApprovalLogForm } from '@/api/dgtmedicine/approvalLog/types';
  226. import { useRouter } from 'vue-router';
  227. const router = useRouter();
  228. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  229. const { cpy_res_status, vip_level } = toRefs<any>(proxy?.useDict("cpy_res_status", "vip_level"));
  230. const memberList = ref<MemberVO[]>([]);
  231. const memberLevelCountList = ref<MemberLevelCountVO[]>([]);
  232. const buttonLoading = ref(false);
  233. const loading = ref(true);
  234. const showSearch = ref(true);
  235. const refuseShow = ref(false);
  236. const ids = ref<Array<string | number>>([]);
  237. const single = ref(true);
  238. const multiple = ref(true);
  239. const total = ref(0);
  240. const approvalLogFormRef = ref<ElFormInstance>();
  241. const queryFormRef = ref<ElFormInstance>();
  242. const memberFormRef = ref<ElFormInstance>();
  243. const dialog = reactive<DialogOption>({
  244. visible: false,
  245. title: ''
  246. });
  247. const initFormApprovalData: ApprovalLogForm = {
  248. id: undefined,
  249. targetType: undefined,
  250. reviewStatus: '1',
  251. reviewMsg: undefined
  252. }
  253. const dialogApproval = reactive<DialogOption>({
  254. visible: false,
  255. title: ''
  256. });
  257. const approvalData = reactive<PageData<ApprovalLogForm, ApprovalLogQuery>>({
  258. form: { ...initFormApprovalData },
  259. queryParams: {
  260. pageNum: 1,
  261. pageSize: 10,
  262. targetType: undefined,
  263. targetId: undefined,
  264. res: undefined,
  265. msg: undefined,
  266. params: {
  267. }
  268. },
  269. rules: {
  270. }
  271. });
  272. const initFormData: MemberForm = {
  273. id: undefined,
  274. cpyName: '',
  275. legalPersonName: '',
  276. legalPersonPhone: '',
  277. legalPersonPosition: '',
  278. legalPersonIdFront: '',
  279. legalPersonIdBack: '',
  280. companyCertificate: '',
  281. email: '',
  282. department: '',
  283. totalAssets: '',
  284. introduction: '',
  285. regType: '',
  286. membershipPurpose: '',
  287. plantingInfo: [],
  288. vipLevel: '',
  289. startDate: '',
  290. endDate: '',
  291. reviewStatus: '',
  292. reviewMsg: '',
  293. reviewBy: '',
  294. reviewTime: '',
  295. partnerId: '',
  296. cpyBusType: '',
  297. applyLevel: ''
  298. }
  299. const data = reactive<PageData<MemberForm, MemberQuery>>({
  300. form: { ...initFormData },
  301. queryParams: {
  302. pageNum: 1,
  303. pageSize: 10,
  304. cpyName: '',
  305. legalPersonName: '',
  306. legalPersonPhone: '',
  307. legalPersonPosition: '',
  308. legalPersonIdFront: '',
  309. legalPersonIdBack: '',
  310. companyCertificate: '',
  311. email: '',
  312. department: '',
  313. totalAssets: '',
  314. introduction: '',
  315. regType: '',
  316. membershipPurpose: '',
  317. plantingInfo: '',
  318. vipLevel: '',
  319. startDate: '',
  320. endDate: '',
  321. reviewStatus: '',
  322. reviewMsg: '',
  323. reviewBy: '',
  324. reviewTime: '',
  325. partnerId: '',
  326. cpyBusType: '',
  327. applyLevel: '',
  328. params: {
  329. }
  330. },
  331. rules: {
  332. }
  333. });
  334. const { queryParams, form, rules } = toRefs(data);
  335. const { form: approvalForm, rules: approvalRules } = toRefs(approvalData);
  336. /**动态显示审批理由 */
  337. const showRefuse = (res: any) => {
  338. if (res == "2") {
  339. refuseShow.value = true
  340. return
  341. }
  342. refuseShow.value = false
  343. }
  344. /** 查询会员信息列表 */
  345. const getList = async () => {
  346. loading.value = true;
  347. const res = await listMember(queryParams.value);
  348. memberList.value = res.rows;
  349. total.value = res.total;
  350. loading.value = false;
  351. }
  352. /** 查询会员信息列表 */
  353. const getMemberLevelList = async () => {
  354. loading.value = true;
  355. const res = await countLevelMember(queryParams.value);
  356. memberLevelCountList.value = res.data;
  357. loading.value = false;
  358. }
  359. /** 取消按钮 */
  360. const cancel = () => {
  361. reset();
  362. dialog.visible = false;
  363. }
  364. /** 表单重置 */
  365. const reset = () => {
  366. form.value = { ...initFormData };
  367. memberFormRef.value?.resetFields();
  368. }
  369. /** 搜索按钮操作 */
  370. const handleQuery = (level?: any) => {
  371. queryParams.value.pageNum = 1;
  372. if (level !== undefined && level !== null && level.type !== 'click') {
  373. queryParams.value.vipLevel = level.type;
  374. }
  375. getList();
  376. }
  377. /** 重置按钮操作 */
  378. const resetQuery = () => {
  379. queryFormRef.value?.resetFields();
  380. handleQuery();
  381. }
  382. /**审批弹框 */
  383. const showApp = (row: any) => {
  384. approvalReset()
  385. dialogApproval.visible = true
  386. approvalForm.value.id = row.id
  387. getMemberInfo(row.id)
  388. }
  389. /** 修改按钮操作 */
  390. const getMemberInfo = async (memberId: string) => {
  391. reset();
  392. const res = await getMember(memberId);
  393. Object.assign(form.value, res.data);
  394. }
  395. const memberDetail = (row: any) => {
  396. router.push({ path: `/szyy/member-detail`, query: { memberId: row.id } });
  397. }
  398. /** 处理日期范围变化 */
  399. const handleDateRangeChange = (value: [string, string]) => {
  400. if (value && value.length === 2) {
  401. queryParams.value.startDate = value[0];
  402. queryParams.value.endDate = value[1];
  403. } else {
  404. queryParams.value.startDate = undefined;
  405. queryParams.value.endDate = undefined;
  406. }
  407. handleQuery();
  408. }
  409. /** 审批表单重置 */
  410. const approvalReset = () => {
  411. refuseShow.value = false
  412. approvalForm.value = { ...initFormApprovalData };
  413. approvalLogFormRef.value?.resetFields();
  414. }
  415. /** 多选框选中数据 */
  416. const handleSelectionChange = (selection: MemberVO[]) => {
  417. ids.value = selection.map(item => item.id);
  418. single.value = selection.length != 1;
  419. multiple.value = !selection.length;
  420. }
  421. /** 新增按钮操作 */
  422. const handleAdd = () => {
  423. reset();
  424. dialog.visible = true;
  425. dialog.title = "添加会员信息";
  426. }
  427. /** 修改按钮操作 */
  428. const handleUpdate = async (row?: MemberVO) => {
  429. reset();
  430. const _id = row?.id || ids.value[0]
  431. const res = await getMember(_id);
  432. Object.assign(form.value, res.data);
  433. dialog.visible = true;
  434. dialog.title = "修改会员信息";
  435. }
  436. /** 提交按钮 */
  437. const submitForm = () => {
  438. memberFormRef.value?.validate(async (valid: boolean) => {
  439. if (valid) {
  440. buttonLoading.value = true;
  441. if (form.value.id) {
  442. await updateMember(form.value).finally(() => buttonLoading.value = false);
  443. } else {
  444. await addMember(form.value).finally(() => buttonLoading.value = false);
  445. }
  446. proxy?.$modal.msgSuccess("修改成功");
  447. dialog.visible = false;
  448. await getList();
  449. }
  450. });
  451. }
  452. /**取消审批弹框 */
  453. const cancelApp = () => {
  454. approvalReset()
  455. dialogApproval.visible = false
  456. }
  457. /**审批弹框 */
  458. const confirmApp = () => {
  459. approvalLogFormRef.value?.validate(async (valid: boolean) => {
  460. if (valid) {
  461. buttonLoading.value = true;
  462. await approvalMember(approvalForm.value).finally(() => buttonLoading.value = false);
  463. proxy?.$modal.msgSuccess("操作成功");
  464. dialogApproval.visible = false
  465. getList();
  466. }
  467. });
  468. }
  469. /** 删除按钮操作 */
  470. const handleDelete = async (row?: MemberVO) => {
  471. const _ids = row?.id || ids.value;
  472. await proxy?.$modal.confirm('是否确认删除会员信息编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
  473. await delMember(_ids);
  474. proxy?.$modal.msgSuccess("删除成功");
  475. await getList();
  476. }
  477. /** 导出按钮操作 */
  478. const handleExport = () => {
  479. proxy?.download('dgtmedicine/member/export', {
  480. ...queryParams.value
  481. }, `member_${new Date().getTime()}.xlsx`)
  482. }
  483. onMounted(() => {
  484. getList();
  485. getMemberLevelList();
  486. });
  487. </script>