detail.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. <template>
  2. <div class="p-2">
  3. <el-card shadow="never">
  4. <el-tabs v-model="activeTab" type="border-card">
  5. <el-tab-pane label="会员信息" name="meberInfo">
  6. <el-form ref="memberFormRef" :model="form" :rules="rules">
  7. <el-row :gutter="20">
  8. <el-col :span="8">
  9. <el-form-item label="企业名称" prop="cpyName">
  10. <el-input v-model="form.cpyName" placeholder="请输入企业名称" />
  11. </el-form-item>
  12. </el-col>
  13. <el-col :span="8">
  14. <el-form-item label="法人姓名" prop="legalPersonName">
  15. <el-input v-model="form.legalPersonName" placeholder="请输入法人姓名" />
  16. </el-form-item>
  17. </el-col>
  18. <el-col :span="8">
  19. <el-form-item label="法人电话" prop="legalPersonPhone">
  20. <el-input v-model="form.legalPersonPhone" placeholder="请输入法人电话" />
  21. </el-form-item>
  22. </el-col>
  23. </el-row>
  24. <el-row :gutter="20">
  25. <el-col :span="8">
  26. <el-form-item label="法人职务" prop="legalPersonPosition">
  27. <el-input v-model="form.legalPersonPosition" placeholder="请输入法人职务" />
  28. </el-form-item>
  29. </el-col>
  30. <el-col :span="8">
  31. <el-form-item label="法人身份证正面图片" prop="legalPersonIdFront">
  32. <image-upload v-model="form.legalPersonIdFront" :limit="1" :isString="true" />
  33. </el-form-item>
  34. </el-col>
  35. <el-col :span="8">
  36. <el-form-item label="法人身份证背面图片" prop="legalPersonIdBack">
  37. <image-upload v-model="form.legalPersonIdBack" :limit="1" :isString="true" />
  38. </el-form-item>
  39. </el-col>
  40. </el-row>
  41. <el-row :gutter="20">
  42. <el-col :span="8">
  43. <el-form-item label="申请会员等级" prop="applyLevel">
  44. <el-input v-model="form.applyLevel" placeholder="请输入申请会员等级" />
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="8">
  48. <el-form-item label="邮箱" prop="email">
  49. <el-input v-model="form.email" placeholder="请输入邮箱" />
  50. </el-form-item>
  51. </el-col>
  52. <el-col :span="8">
  53. <el-form-item label="主管部门" prop="department">
  54. <el-input v-model="form.department" placeholder="请输入主管部门" />
  55. </el-form-item>
  56. </el-col>
  57. </el-row>
  58. <el-row :gutter="20">
  59. <el-col :span="8">
  60. <el-form-item label="总资产" prop="totalAssets">
  61. <el-input v-model="form.totalAssets" placeholder="请输入总资产" />
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="8">
  65. <el-form-item label="单位简介" prop="introduction">
  66. <el-input v-model="form.introduction" type="textarea" placeholder="请输入内容" :rows="5" />
  67. </el-form-item>
  68. </el-col>
  69. <el-col :span="8">
  70. <el-form-item label="入会目的" prop="membershipPurpose">
  71. <el-input v-model="form.membershipPurpose" type="textarea" placeholder="请输入内容" :rows="5" />
  72. </el-form-item>
  73. </el-col>
  74. </el-row>
  75. <el-row :gutter="20">
  76. <el-col :span="8">
  77. <el-form-item label="会员等级" prop="vipLevel">
  78. <el-select v-model="form.vipLevel" placeholder="请选择" clearable>
  79. <el-option v-for="dict in vip_level" :key="dict.value" :label="dict.label" :value="dict.value" />
  80. </el-select>
  81. </el-form-item>
  82. </el-col>
  83. <el-col :span="8">
  84. <el-form-item label="开始时间" prop="startDate">
  85. <el-date-picker clearable v-model="form.startDate" type="date" value-format="YYYY-MM-DD"
  86. placeholder="请选择开始时间" style="width: 100%;">
  87. </el-date-picker>
  88. </el-form-item>
  89. </el-col>
  90. <el-col :span="8">
  91. <el-form-item label="结束时间" prop="endDate">
  92. <el-date-picker clearable v-model="form.endDate" type="date" value-format="YYYY-MM-DD"
  93. placeholder="请选择结束时间" style="width: 100%;">
  94. </el-date-picker>
  95. </el-form-item>
  96. </el-col>
  97. </el-row>
  98. <el-row :gutter="20">
  99. <el-col :span="8">
  100. <el-form-item label="审核信息" prop="reviewMsg">
  101. <el-input v-model="form.reviewMsg" placeholder="请输入审核信息" />
  102. </el-form-item>
  103. </el-col>
  104. <el-col :span="8">
  105. <el-form-item label="审核人" prop="reviewBy">
  106. <el-input v-model="form.reviewBy" placeholder="请输入审核人" />
  107. </el-form-item>
  108. </el-col>
  109. <el-col :span="8">
  110. <el-form-item label="审核时间" prop="reviewTime">
  111. <el-date-picker clearable v-model="form.reviewTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss"
  112. placeholder="请选择审核时间">
  113. </el-date-picker>
  114. </el-form-item>
  115. </el-col>
  116. </el-row>
  117. <el-table v-loading="loading" :data="form.plantingInfo">
  118. <el-table-column label="品种名称" align="center" prop="variety" width="220" />
  119. <el-table-column label="种植面积" align="center" prop="plantingArea" />
  120. <el-table-column label="种植地点" align="center" prop="plantingPlace" width="150" />
  121. </el-table>
  122. <el-row :gutter="20">
  123. <el-col>
  124. <el-form-item label="荣誉证书" prop="companyCertificate">
  125. <image-upload v-model="form.companyCertificate" :limit="10" :isString="true" />
  126. </el-form-item>
  127. </el-col>
  128. </el-row>
  129. </el-form>
  130. <div class="dialog-footer" style="text-align: center;">
  131. <el-button :loading="buttonLoading" type="primary" @click="submitForm">提 交</el-button>
  132. <el-button @click="cancel">取 消</el-button>
  133. </div>
  134. </el-tab-pane>
  135. <el-tab-pane label="缴费记录" name="payMentFormRef">
  136. <div class="search">
  137. <el-form :model="vipPaymentQueryParams" ref="vipPaymentFormRef" :inline="true" label-width="68px">
  138. <el-form-item label="续费类型" prop="paymentType">
  139. <el-select v-model="vipPaymentQueryParams.paymentType" placeholder="请选择" clearable style="width: 240px">
  140. <el-option v-for="dict in payment_type" :key="dict.value" :label="dict.label" :value="dict.value"
  141. @keyup.enter="handleQueryVipPayment" />
  142. </el-select>
  143. </el-form-item>
  144. <el-form-item label="开票状态" prop="invoiceStatus">
  145. <el-select v-model="vipPaymentQueryParams.invoiceStatus" placeholder="请选择" clearable style="width: 240px">
  146. <el-option v-for="dict in invoice_status" :key="dict.value" :label="dict.label" :value="dict.value"
  147. @keyup.enter="handleQueryVipPayment" />
  148. </el-select>
  149. </el-form-item>
  150. <el-form-item>
  151. <el-button type="primary" icon="Search" @click="handleQueryVipPayment">搜索</el-button>
  152. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  153. </el-form-item>
  154. </el-form>
  155. </div>
  156. <el-card shadow="never">
  157. <el-table v-loading="loading" :data="vipPaymentList">
  158. <el-table-column label="缴费金额" align="center" prop="paymentAmount" />
  159. <el-table-column label="缴费时间" align="center" prop="paymentTime" width="180">
  160. <template #default="scope">
  161. <span>{{ parseTime(scope.row.paymentTime, '{y}-{m}-{d}') }}</span>
  162. </template>
  163. </el-table-column>
  164. <el-table-column label="缴费方式" align="center" prop="paymentType">
  165. <template #default="scope">
  166. <dict-tag :value="scope.row.paymentType" :options="payment_type" />
  167. </template>
  168. </el-table-column>
  169. <el-table-column label="缴费状态" align="center" prop="paymentStatus">
  170. <template #default="scope">
  171. <dict-tag :value="scope.row.paymentStatus" :options="payment_status" />
  172. </template>
  173. </el-table-column>
  174. <el-table-column label="缴费备注" align="center" prop="paymentRemark" />
  175. <el-table-column label="开票状态" align="center" prop="invoiceStatus">
  176. <template #default="scope">
  177. <dict-tag :value="scope.row.invoiceStatus" :options="invoice_status" />
  178. </template>
  179. </el-table-column>
  180. <el-table-column label="发票" align="center" prop="invoiceUrl">
  181. <template #default="scope">
  182. <el-link :underline="false" type="primary" :href="scope.row.invoiceUrlAddr" target="_blank"
  183. v-if="scope.row.invoiceStatus != 0">查看发票</el-link>
  184. <el-button link type="primary" @click="showUploadInvoice(scope.row)"
  185. v-hasPermi="['dgtmedicine:vipPayment:edit']" v-if="scope.row.invoiceStatus == 0">
  186. 上传发票
  187. </el-button>
  188. </template>
  189. </el-table-column>
  190. <el-table-column label="创建人" align="center" prop="createByName" />
  191. <el-table-column label="创建时间" align="center" prop="createTime" width="180">
  192. <template #default="scope">
  193. <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
  194. </template>
  195. </el-table-column>
  196. <!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  197. <template #default="scope">
  198. <el-tooltip content="删除" placement="top">
  199. <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
  200. v-hasPermi="['dgtmedicine:vipPayment:remove']"></el-button>
  201. </el-tooltip>
  202. </template>
  203. </el-table-column> -->
  204. </el-table>
  205. <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
  206. v-model:limit="queryParams.pageSize" @pagination="getList" />
  207. </el-card>
  208. <el-dialog :close-on-click-modal="false" :title="dialogUpload.title" v-model="dialogUpload.visible"
  209. width="500px" append-to-body>
  210. <el-form ref="payMentFormRef" :model="paymentFrom" :rules="rules">
  211. <el-row :gutter="20">
  212. <file-upload v-model="paymentFrom.invoiceUrl" :limit="1" :isString="true" />
  213. </el-row>
  214. </el-form>
  215. <template #footer>
  216. <div class="dialog-footer">
  217. <el-button :loading="buttonLoading" type="primary" @click="confirmUpload">确 定</el-button>
  218. <el-button @click="cancelUpload">取 消</el-button>
  219. </div>
  220. </template>
  221. </el-dialog>
  222. </el-tab-pane>
  223. </el-tabs>
  224. </el-card>
  225. </div>
  226. </template>
  227. <script setup name="Member" lang="ts">
  228. import { listMember, getMember, addMember, updateMember } from '@/api/dgtmedicine/member';
  229. import { MemberVO, MemberQuery, MemberForm } from '@/api/dgtmedicine/member/types';
  230. import { listVipPayment, getVipPayment, delVipPayment, uploadInvoice, updateVipPayment } from '@/api/dgtmedicine/vipPayment';
  231. import { VipPaymentVO, VipPaymentQuery, VipPaymentForm } from '@/api/dgtmedicine/vipPayment/types';
  232. import { useRouter } from 'vue-router';
  233. const { query } = useRoute();
  234. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  235. const { vip_level, invoice_status, payment_status, payment_type } =
  236. toRefs<any>(proxy?.useDict("vip_level", "invoice_status", "payment_status", "payment_type"));
  237. const router = useRouter();
  238. const vipPaymentList = ref<VipPaymentVO[]>([]);
  239. const memberList = ref<MemberVO[]>([]);
  240. const buttonLoading = ref(false);
  241. const loading = ref(true);
  242. const refuseShow = ref(false);
  243. const ids = ref<Array<string | number>>([]);
  244. const memberId = ref('');
  245. const single = ref(true);
  246. const multiple = ref(true);
  247. const total = ref(0);
  248. const approvalLogFormRef = ref<ElFormInstance>();
  249. const activeTab = ref('meberInfo')
  250. const vipPaymentFormRef = ref<ElFormInstance>();
  251. const memberFormRef = ref<ElFormInstance>();
  252. const payMentFormRef = ref<ElFormInstance>();
  253. const dialog = reactive<DialogOption>({
  254. visible: false,
  255. title: ''
  256. });
  257. const dialogUpload = reactive<DialogOption>({
  258. visible: false,
  259. title: ''
  260. });
  261. const initFormData: MemberForm = {
  262. id: undefined,
  263. cpyName: undefined,
  264. legalPersonName: undefined,
  265. legalPersonPhone: undefined,
  266. legalPersonPosition: undefined,
  267. legalPersonIdFront: undefined,
  268. legalPersonIdBack: undefined,
  269. companyCertificate: undefined,
  270. email: undefined,
  271. department: undefined,
  272. totalAssets: undefined,
  273. introduction: undefined,
  274. regType: undefined,
  275. membershipPurpose: undefined,
  276. plantingInfo: [
  277. { variety: undefined, plantingArea: undefined, plantingPlace: 0, paymentDesc: undefined }
  278. ],
  279. vipLevel: undefined,
  280. startDate: undefined,
  281. endDate: undefined,
  282. reviewStatus: undefined,
  283. reviewMsg: undefined,
  284. reviewBy: undefined,
  285. reviewTime: undefined,
  286. partnerId: undefined,
  287. cpyBusType: undefined,
  288. applyLevel: undefined
  289. }
  290. const initPayFormData: VipPaymentForm = {
  291. id: undefined,
  292. invoiceUrl: undefined,
  293. }
  294. const data = reactive<PageData<MemberForm, MemberQuery>>({
  295. form: { ...initFormData },
  296. queryParams: {
  297. pageNum: 1,
  298. pageSize: 10,
  299. cpyName: undefined,
  300. legalPersonName: undefined,
  301. legalPersonPhone: undefined,
  302. legalPersonPosition: undefined,
  303. legalPersonIdFront: undefined,
  304. legalPersonIdBack: undefined,
  305. companyCertificate: undefined,
  306. email: undefined,
  307. department: undefined,
  308. totalAssets: undefined,
  309. introduction: undefined,
  310. regType: undefined,
  311. membershipPurpose: undefined,
  312. plantingInfo: undefined,
  313. vipLevel: undefined,
  314. startDate: undefined,
  315. endDate: undefined,
  316. reviewStatus: undefined,
  317. reviewMsg: undefined,
  318. reviewBy: undefined,
  319. reviewTime: undefined,
  320. partnerId: undefined,
  321. cpyBusType: undefined,
  322. applyLevel: undefined,
  323. params: {
  324. }
  325. },
  326. rules: {
  327. }
  328. });
  329. const vipPaymentData = reactive<PageData<VipPaymentForm, VipPaymentQuery>>({
  330. form: { ...initPayFormData },
  331. queryParams: {
  332. pageNum: 1,
  333. pageSize: 10,
  334. memberId: undefined,
  335. paymentAmount: undefined,
  336. paymentTime: undefined,
  337. paymentType: undefined,
  338. paymentStatus: undefined,
  339. paymentRemark: undefined,
  340. invoiceStatus: undefined,
  341. invoiceUrl: undefined,
  342. params: {
  343. }
  344. },
  345. rules: {
  346. id: [
  347. { required: true, message: "ID不能为空", trigger: "blur" }
  348. ],
  349. invoiceUrl: [
  350. { required: true, message: "发票地址不能为空", trigger: "blur" }
  351. ]
  352. }
  353. });
  354. const { queryParams, form, rules } = toRefs(data);
  355. const { queryParams: vipPaymentQueryParams, form: paymentFrom } = toRefs(vipPaymentData);
  356. /** 查询会员信息列表 */
  357. const getList = async () => {
  358. loading.value = true;
  359. const res = await listMember(queryParams.value);
  360. memberList.value = res.rows;
  361. total.value = res.total;
  362. loading.value = false;
  363. }
  364. /** 搜索按钮操作 */
  365. const handleQueryVipPayment = () => {
  366. vipPaymentQueryParams.value.pageNum = 1;
  367. getVipPaymentList();
  368. }
  369. /** 重置按钮操作 */
  370. const resetQuery = () => {
  371. vipPaymentFormRef.value?.resetFields();
  372. getVipPaymentList();
  373. }
  374. /** 表单重置 */
  375. const reset = () => {
  376. form.value = { ...initFormData };
  377. memberFormRef.value?.resetFields();
  378. }
  379. /** 查询会员缴费记录列表 */
  380. const getVipPaymentList = async () => {
  381. loading.value = true;
  382. vipPaymentQueryParams.value.memberId = memberId.value;
  383. const res = await listVipPayment(vipPaymentQueryParams.value);
  384. vipPaymentList.value = res.rows;
  385. total.value = res.total;
  386. loading.value = false;
  387. }
  388. /** 修改按钮操作 */
  389. const getMemberInfo = async () => {
  390. reset();
  391. const res = await getMember(memberId.value);
  392. Object.assign(form.value, res.data);
  393. }
  394. /** 上传发票 */
  395. const showUploadInvoice = async (row?: VipPaymentVO) => {
  396. dialogUpload.title = '上传发票';
  397. dialogUpload.visible = true;
  398. paymentFrom.value = { ...initPayFormData, id: row?.id };
  399. }
  400. /**取消审批弹框 */
  401. const cancelUpload = () => {
  402. dialogUpload.visible = false
  403. }
  404. /**审批弹框 */
  405. const confirmUpload = () => {
  406. payMentFormRef.value?.validate(async (valid: boolean) => {
  407. if (valid) {
  408. buttonLoading.value = true;
  409. await uploadInvoice({ id: paymentFrom.value.id, invoiceUrl: paymentFrom.value.invoiceUrl }).finally(() => buttonLoading.value = false);
  410. proxy?.$modal.msgSuccess("操作成功");
  411. dialogUpload.visible = false
  412. getVipPaymentList();
  413. }
  414. });
  415. }
  416. /** 删除按钮操作 */
  417. const handleDelete = async (row?: VipPaymentVO) => {
  418. const _ids = row?.id || ids.value;
  419. await proxy?.$modal.confirm('是否确认删除会员缴费记录编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
  420. await delVipPayment(_ids);
  421. proxy?.$modal.msgSuccess("删除成功");
  422. await getList();
  423. }
  424. /** 提交按钮 */
  425. const submitForm = () => {
  426. memberFormRef.value?.validate(async (valid: boolean) => {
  427. if (valid) {
  428. buttonLoading.value = true;
  429. if (!Array.isArray(form.value.companyCertificate)) {
  430. var companyCertificateList = form.value.companyCertificate.split(',');
  431. form.value.companyCertificate = companyCertificateList;
  432. }
  433. if (form.value.id) {
  434. await updateMember(form.value).finally(() => buttonLoading.value = false);
  435. } else {
  436. await addMember(form.value).finally(() => buttonLoading.value = false);
  437. }
  438. proxy?.$modal.msgSuccess("修改成功");
  439. dialog.visible = false;
  440. await getMemberInfo();
  441. }
  442. });
  443. }
  444. /** 取消按钮 */
  445. const cancel = () => {
  446. // reset();
  447. }
  448. onMounted(() => {
  449. memberId.value = (query.memberId as string)
  450. getMemberInfo();
  451. getVipPaymentList();
  452. });
  453. </script>